ethernet.rs 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. use super::*;
  2. impl InterfaceInner {
  3. pub(super) fn process_ethernet<'frame>(
  4. &mut self,
  5. sockets: &mut SocketSet,
  6. meta: crate::phy::PacketMeta,
  7. frame: &'frame [u8],
  8. fragments: &'frame mut FragmentsBuffer,
  9. ) -> Option<EthernetPacket<'frame>> {
  10. let eth_frame = check!(EthernetFrame::new_checked(frame));
  11. // Ignore any packets not directed to our hardware address or any of the multicast groups.
  12. if !eth_frame.dst_addr().is_broadcast()
  13. && !eth_frame.dst_addr().is_multicast()
  14. && HardwareAddress::Ethernet(eth_frame.dst_addr()) != self.hardware_addr
  15. {
  16. return None;
  17. }
  18. match eth_frame.ethertype() {
  19. #[cfg(feature = "proto-ipv4")]
  20. EthernetProtocol::Arp => self.process_arp(self.now, &eth_frame),
  21. #[cfg(feature = "proto-ipv4")]
  22. EthernetProtocol::Ipv4 => {
  23. let ipv4_packet = check!(Ipv4Packet::new_checked(eth_frame.payload()));
  24. self.process_ipv4(
  25. sockets,
  26. meta,
  27. eth_frame.src_addr().into(),
  28. &ipv4_packet,
  29. fragments,
  30. )
  31. .map(EthernetPacket::Ip)
  32. }
  33. #[cfg(feature = "proto-ipv6")]
  34. EthernetProtocol::Ipv6 => {
  35. let ipv6_packet = check!(Ipv6Packet::new_checked(eth_frame.payload()));
  36. self.process_ipv6(sockets, meta, eth_frame.src_addr().into(), &ipv6_packet)
  37. .map(EthernetPacket::Ip)
  38. }
  39. // Drop all other traffic.
  40. _ => None,
  41. }
  42. }
  43. pub(super) fn dispatch_ethernet<Tx, F>(
  44. &mut self,
  45. tx_token: Tx,
  46. buffer_len: usize,
  47. f: F,
  48. ) -> Result<(), DispatchError>
  49. where
  50. Tx: TxToken,
  51. F: FnOnce(EthernetFrame<&mut [u8]>),
  52. {
  53. let tx_len = EthernetFrame::<&[u8]>::buffer_len(buffer_len);
  54. tx_token.consume(tx_len, |tx_buffer| {
  55. debug_assert!(tx_buffer.as_ref().len() == tx_len);
  56. let mut frame = EthernetFrame::new_unchecked(tx_buffer);
  57. let src_addr = self.hardware_addr.ethernet_or_panic();
  58. frame.set_src_addr(src_addr);
  59. f(frame);
  60. Ok(())
  61. })
  62. }
  63. }