ethernet.rs 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571
  1. // Heads up! Before working on this file you should read the parts
  2. // of RFC 1122 that discuss Ethernet, ARP and IP.
  3. use managed::{Managed, ManagedSlice};
  4. use {Error, Result};
  5. use phy::Device;
  6. use wire::{EthernetAddress, EthernetProtocol, EthernetFrame};
  7. use wire::{ArpPacket, ArpRepr, ArpOperation};
  8. use wire::{Ipv4Packet, Ipv4Repr};
  9. use wire::{Icmpv4Packet, Icmpv4Repr, Icmpv4DstUnreachable};
  10. use wire::{IpAddress, IpProtocol, IpRepr};
  11. use wire::{UdpPacket, UdpRepr, TcpPacket, TcpRepr, TcpControl};
  12. use socket::{Socket, SocketSet, RawSocket, TcpSocket, UdpSocket, AsSocket};
  13. use super::ArpCache;
  14. /// An Ethernet network interface.
  15. ///
  16. /// The network interface logically owns a number of other data structures; to avoid
  17. /// a dependency on heap allocation, it instead owns a `BorrowMut<[T]>`, which can be
  18. /// a `&mut [T]`, or `Vec<T>` if a heap is available.
  19. pub struct Interface<'a, 'b, 'c, DeviceT: Device + 'a> {
  20. device: Managed<'a, DeviceT>,
  21. arp_cache: Managed<'b, ArpCache>,
  22. hardware_addr: EthernetAddress,
  23. protocol_addrs: ManagedSlice<'c, IpAddress>,
  24. }
  25. enum Packet<'a> {
  26. None,
  27. Arp(ArpRepr),
  28. Icmpv4(Ipv4Repr, Icmpv4Repr<'a>),
  29. Raw((IpRepr, &'a [u8])),
  30. Udp((IpRepr, UdpRepr<'a>)),
  31. Tcp((IpRepr, TcpRepr<'a>))
  32. }
  33. impl<'a, 'b, 'c, DeviceT: Device + 'a> Interface<'a, 'b, 'c, DeviceT> {
  34. /// Create a network interface using the provided network device.
  35. ///
  36. /// # Panics
  37. /// See the restrictions on [set_hardware_addr](#method.set_hardware_addr)
  38. /// and [set_protocol_addrs](#method.set_protocol_addrs) functions.
  39. pub fn new<DeviceMT, ArpCacheMT, ProtocolAddrsMT>
  40. (device: DeviceMT, arp_cache: ArpCacheMT,
  41. hardware_addr: EthernetAddress, protocol_addrs: ProtocolAddrsMT) ->
  42. Interface<'a, 'b, 'c, DeviceT>
  43. where DeviceMT: Into<Managed<'a, DeviceT>>,
  44. ArpCacheMT: Into<Managed<'b, ArpCache>>,
  45. ProtocolAddrsMT: Into<ManagedSlice<'c, IpAddress>>, {
  46. let device = device.into();
  47. let arp_cache = arp_cache.into();
  48. let protocol_addrs = protocol_addrs.into();
  49. Self::check_hardware_addr(&hardware_addr);
  50. Self::check_protocol_addrs(&protocol_addrs);
  51. Interface {
  52. device: device,
  53. arp_cache: arp_cache,
  54. hardware_addr: hardware_addr,
  55. protocol_addrs: protocol_addrs,
  56. }
  57. }
  58. fn check_hardware_addr(addr: &EthernetAddress) {
  59. if addr.is_multicast() {
  60. panic!("hardware address {} is not unicast", addr)
  61. }
  62. }
  63. /// Get the hardware address of the interface.
  64. pub fn hardware_addr(&self) -> EthernetAddress {
  65. self.hardware_addr
  66. }
  67. /// Set the hardware address of the interface.
  68. ///
  69. /// # Panics
  70. /// This function panics if the address is not unicast.
  71. pub fn set_hardware_addr(&mut self, addr: EthernetAddress) {
  72. self.hardware_addr = addr;
  73. Self::check_hardware_addr(&self.hardware_addr);
  74. }
  75. fn check_protocol_addrs(addrs: &[IpAddress]) {
  76. for addr in addrs {
  77. if !addr.is_unicast() {
  78. panic!("protocol address {} is not unicast", addr)
  79. }
  80. }
  81. }
  82. /// Get the protocol addresses of the interface.
  83. pub fn protocol_addrs(&self) -> &[IpAddress] {
  84. self.protocol_addrs.as_ref()
  85. }
  86. /// Update the protocol addresses of the interface.
  87. ///
  88. /// # Panics
  89. /// This function panics if any of the addresses is not unicast.
  90. pub fn update_protocol_addrs<F: FnOnce(&mut ManagedSlice<'c, IpAddress>)>(&mut self, f: F) {
  91. f(&mut self.protocol_addrs);
  92. Self::check_protocol_addrs(&self.protocol_addrs)
  93. }
  94. /// Check whether the interface has the given protocol address assigned.
  95. pub fn has_protocol_addr<T: Into<IpAddress>>(&self, addr: T) -> bool {
  96. let addr = addr.into();
  97. self.protocol_addrs.iter().any(|&probe| probe == addr)
  98. }
  99. /// Transmit packets queued in the given sockets, and receive packets queued
  100. /// in the device.
  101. ///
  102. /// The timestamp must be a number of milliseconds, monotonically increasing
  103. /// since an arbitrary moment in time, such as system startup.
  104. ///
  105. /// This function returns a _soft deadline_ for calling it the next time.
  106. /// That is, if `iface.poll(&mut sockets, 1000)` returns `Ok(Some(2000))`,
  107. /// it harmless (but wastes energy) to call it 500 ms later, and potentially
  108. /// harmful (impacting quality of service) to call it 1500 ms later.
  109. pub fn poll(&mut self, sockets: &mut SocketSet, timestamp: u64) -> Result<Option<u64>> {
  110. self.socket_egress(sockets, timestamp)?;
  111. if self.socket_ingress(sockets, timestamp)? {
  112. Ok(Some(0))
  113. } else {
  114. Ok(sockets.iter().filter_map(|socket| socket.poll_at()).min())
  115. }
  116. }
  117. fn socket_ingress(&mut self, sockets: &mut SocketSet, timestamp: u64) -> Result<bool> {
  118. let mut processed_any = false;
  119. loop {
  120. let frame =
  121. match self.device.receive(timestamp) {
  122. Ok(frame) => frame,
  123. Err(Error::Exhausted) => break, // nothing to receive
  124. Err(err) => return Err(err)
  125. };
  126. let response =
  127. match self.process_ethernet(sockets, timestamp, &frame) {
  128. Ok(response) => response,
  129. Err(err) => {
  130. net_debug!("cannot process ingress packet: {}", err);
  131. return Err(err)
  132. }
  133. };
  134. processed_any = true;
  135. match self.dispatch(timestamp, response) {
  136. Ok(()) => (),
  137. Err(err) => {
  138. net_debug!("cannot dispatch response packet: {}", err);
  139. return Err(err)
  140. }
  141. }
  142. }
  143. Ok(processed_any)
  144. }
  145. fn socket_egress(&mut self, sockets: &mut SocketSet, timestamp: u64) -> Result<()> {
  146. let mut limits = self.device.limits();
  147. limits.max_transmission_unit -= EthernetFrame::<&[u8]>::header_len();
  148. 'iface: for socket in sockets.iter_mut() {
  149. 'socket: loop {
  150. let mut device_result = Ok(());
  151. let socket_result =
  152. match socket {
  153. &mut Socket::Raw(ref mut socket) =>
  154. socket.dispatch(|response| {
  155. device_result = self.dispatch(timestamp, Packet::Raw(response));
  156. device_result
  157. }),
  158. &mut Socket::Udp(ref mut socket) =>
  159. socket.dispatch(|response| {
  160. device_result = self.dispatch(timestamp, Packet::Udp(response));
  161. device_result
  162. }),
  163. &mut Socket::Tcp(ref mut socket) =>
  164. socket.dispatch(timestamp, &limits, |response| {
  165. device_result = self.dispatch(timestamp, Packet::Tcp(response));
  166. device_result
  167. }),
  168. &mut Socket::__Nonexhaustive => unreachable!()
  169. };
  170. match (device_result, socket_result) {
  171. (Err(Error::Exhausted), _) => break 'iface, // nowhere to transmit
  172. (Err(Error::Unaddressable), _) => break 'socket, // no one to transmit to
  173. (Ok(()), Err(Error::Exhausted)) => break 'socket, // nothing to transmit
  174. (_, Err(err)) => {
  175. net_debug!("cannot dispatch egress packet: {}", err);
  176. return Err(err)
  177. }
  178. (_, Ok(())) => ()
  179. }
  180. }
  181. }
  182. Ok(())
  183. }
  184. fn process_ethernet<'frame, T: AsRef<[u8]>>
  185. (&mut self, sockets: &mut SocketSet, timestamp: u64,
  186. frame: &'frame T) ->
  187. Result<Packet<'frame>> {
  188. let eth_frame = EthernetFrame::new_checked(frame)?;
  189. // Ignore any packets not directed to our hardware address.
  190. if !eth_frame.dst_addr().is_broadcast() &&
  191. eth_frame.dst_addr() != self.hardware_addr {
  192. return Ok(Packet::None)
  193. }
  194. match eth_frame.ethertype() {
  195. EthernetProtocol::Arp =>
  196. self.process_arp(&eth_frame),
  197. EthernetProtocol::Ipv4 =>
  198. self.process_ipv4(sockets, timestamp, &eth_frame),
  199. // Drop all other traffic.
  200. _ => Err(Error::Unrecognized),
  201. }
  202. }
  203. fn process_arp<'frame, T: AsRef<[u8]>>
  204. (&mut self, eth_frame: &EthernetFrame<&'frame T>) ->
  205. Result<Packet<'frame>> {
  206. let arp_packet = ArpPacket::new_checked(eth_frame.payload())?;
  207. let arp_repr = ArpRepr::parse(&arp_packet)?;
  208. match arp_repr {
  209. // Respond to ARP requests aimed at us, and fill the ARP cache from all ARP
  210. // requests and replies, to minimize the chance that we have to perform
  211. // an explicit ARP request.
  212. ArpRepr::EthernetIpv4 {
  213. operation, source_hardware_addr, source_protocol_addr, target_protocol_addr, ..
  214. } => {
  215. if source_protocol_addr.is_unicast() && source_hardware_addr.is_unicast() {
  216. self.arp_cache.fill(&source_protocol_addr.into(),
  217. &source_hardware_addr);
  218. } else {
  219. // Discard packets with non-unicast source addresses.
  220. net_debug!("non-unicast source in {}", arp_repr);
  221. return Err(Error::Malformed)
  222. }
  223. if operation == ArpOperation::Request &&
  224. self.has_protocol_addr(target_protocol_addr) {
  225. Ok(Packet::Arp(ArpRepr::EthernetIpv4 {
  226. operation: ArpOperation::Reply,
  227. source_hardware_addr: self.hardware_addr,
  228. source_protocol_addr: target_protocol_addr,
  229. target_hardware_addr: source_hardware_addr,
  230. target_protocol_addr: source_protocol_addr
  231. }))
  232. } else {
  233. Ok(Packet::None)
  234. }
  235. }
  236. _ => Err(Error::Unrecognized)
  237. }
  238. }
  239. fn process_ipv4<'frame, T: AsRef<[u8]>>
  240. (&mut self, sockets: &mut SocketSet, timestamp: u64,
  241. eth_frame: &EthernetFrame<&'frame T>) ->
  242. Result<Packet<'frame>> {
  243. let ipv4_packet = Ipv4Packet::new_checked(eth_frame.payload())?;
  244. let ipv4_repr = Ipv4Repr::parse(&ipv4_packet)?;
  245. if !ipv4_repr.src_addr.is_unicast() {
  246. // Discard packets with non-unicast source addresses.
  247. net_debug!("non-unicast source in {}", ipv4_repr);
  248. return Err(Error::Malformed)
  249. }
  250. if eth_frame.src_addr().is_unicast() {
  251. // Fill the ARP cache from IP header of unicast frames.
  252. self.arp_cache.fill(&IpAddress::Ipv4(ipv4_repr.src_addr),
  253. &eth_frame.src_addr());
  254. }
  255. let ip_repr = IpRepr::Ipv4(ipv4_repr);
  256. let ip_payload = ipv4_packet.payload();
  257. // Pass every IP packet to all raw sockets we have registered.
  258. let mut handled_by_raw_socket = false;
  259. for raw_socket in sockets.iter_mut().filter_map(
  260. <Socket as AsSocket<RawSocket>>::try_as_socket) {
  261. if !raw_socket.accepts(&ip_repr) { continue }
  262. match raw_socket.process(&ip_repr, ip_payload) {
  263. // The packet is valid and handled by socket.
  264. Ok(()) => handled_by_raw_socket = true,
  265. // The socket buffer is full.
  266. Err(Error::Exhausted) => (),
  267. // Raw sockets don't validate the packets in any way.
  268. Err(_) => unreachable!(),
  269. }
  270. }
  271. if !self.has_protocol_addr(ipv4_repr.dst_addr) {
  272. // Ignore IP packets not directed at us.
  273. return Ok(Packet::None)
  274. }
  275. match ipv4_repr.protocol {
  276. IpProtocol::Icmp =>
  277. Self::process_icmpv4(ipv4_repr, ip_payload),
  278. IpProtocol::Udp =>
  279. Self::process_udp(sockets, ip_repr, ip_payload),
  280. IpProtocol::Tcp =>
  281. Self::process_tcp(sockets, timestamp, ip_repr, ip_payload),
  282. _ if handled_by_raw_socket =>
  283. Ok(Packet::None),
  284. _ => {
  285. let icmp_reply_repr = Icmpv4Repr::DstUnreachable {
  286. reason: Icmpv4DstUnreachable::ProtoUnreachable,
  287. header: ipv4_repr,
  288. data: &ip_payload[0..8]
  289. };
  290. let ipv4_reply_repr = Ipv4Repr {
  291. src_addr: ipv4_repr.dst_addr,
  292. dst_addr: ipv4_repr.src_addr,
  293. protocol: IpProtocol::Icmp,
  294. payload_len: icmp_reply_repr.buffer_len()
  295. };
  296. Ok(Packet::Icmpv4(ipv4_reply_repr, icmp_reply_repr))
  297. }
  298. }
  299. }
  300. fn process_icmpv4<'frame>(ipv4_repr: Ipv4Repr, ip_payload: &'frame [u8]) ->
  301. Result<Packet<'frame>> {
  302. let icmp_packet = Icmpv4Packet::new_checked(ip_payload)?;
  303. let icmp_repr = Icmpv4Repr::parse(&icmp_packet)?;
  304. match icmp_repr {
  305. // Respond to echo requests.
  306. Icmpv4Repr::EchoRequest { ident, seq_no, data } => {
  307. let icmp_reply_repr = Icmpv4Repr::EchoReply {
  308. ident: ident,
  309. seq_no: seq_no,
  310. data: data
  311. };
  312. let ipv4_reply_repr = Ipv4Repr {
  313. src_addr: ipv4_repr.dst_addr,
  314. dst_addr: ipv4_repr.src_addr,
  315. protocol: IpProtocol::Icmp,
  316. payload_len: icmp_reply_repr.buffer_len()
  317. };
  318. Ok(Packet::Icmpv4(ipv4_reply_repr, icmp_reply_repr))
  319. }
  320. // Ignore any echo replies.
  321. Icmpv4Repr::EchoReply { .. } => Ok(Packet::None),
  322. // FIXME: do something correct here?
  323. _ => Err(Error::Unrecognized),
  324. }
  325. }
  326. fn process_udp<'frame>(sockets: &mut SocketSet,
  327. ip_repr: IpRepr, ip_payload: &'frame [u8]) ->
  328. Result<Packet<'frame>> {
  329. let (src_addr, dst_addr) = (ip_repr.src_addr(), ip_repr.dst_addr());
  330. let udp_packet = UdpPacket::new_checked(ip_payload)?;
  331. let udp_repr = UdpRepr::parse(&udp_packet, &src_addr, &dst_addr)?;
  332. for udp_socket in sockets.iter_mut().filter_map(
  333. <Socket as AsSocket<UdpSocket>>::try_as_socket) {
  334. if !udp_socket.accepts(&ip_repr, &udp_repr) { continue }
  335. match udp_socket.process(&ip_repr, &udp_repr) {
  336. // The packet is valid and handled by socket.
  337. Ok(()) => return Ok(Packet::None),
  338. // The packet is malformed, or the socket buffer is full.
  339. Err(e) => return Err(e)
  340. }
  341. }
  342. // The packet wasn't handled by a socket, send an ICMP port unreachable packet.
  343. match ip_repr {
  344. IpRepr::Ipv4(ipv4_repr) => {
  345. let icmpv4_reply_repr = Icmpv4Repr::DstUnreachable {
  346. reason: Icmpv4DstUnreachable::PortUnreachable,
  347. header: ipv4_repr,
  348. data: &ip_payload[0..8]
  349. };
  350. let ipv4_reply_repr = Ipv4Repr {
  351. src_addr: ipv4_repr.dst_addr,
  352. dst_addr: ipv4_repr.src_addr,
  353. protocol: IpProtocol::Icmp,
  354. payload_len: icmpv4_reply_repr.buffer_len()
  355. };
  356. Ok(Packet::Icmpv4(ipv4_reply_repr, icmpv4_reply_repr))
  357. },
  358. IpRepr::Unspecified { .. } |
  359. IpRepr::__Nonexhaustive =>
  360. unreachable!()
  361. }
  362. }
  363. fn process_tcp<'frame>(sockets: &mut SocketSet, timestamp: u64,
  364. ip_repr: IpRepr, ip_payload: &'frame [u8]) ->
  365. Result<Packet<'frame>> {
  366. let (src_addr, dst_addr) = (ip_repr.src_addr(), ip_repr.dst_addr());
  367. let tcp_packet = TcpPacket::new_checked(ip_payload)?;
  368. let tcp_repr = TcpRepr::parse(&tcp_packet, &src_addr, &dst_addr)?;
  369. for tcp_socket in sockets.iter_mut().filter_map(
  370. <Socket as AsSocket<TcpSocket>>::try_as_socket) {
  371. if !tcp_socket.accepts(&ip_repr, &tcp_repr) { continue }
  372. match tcp_socket.process(timestamp, &ip_repr, &tcp_repr) {
  373. // The packet is valid and handled by socket.
  374. Ok(reply) => return Ok(reply.map_or(Packet::None, Packet::Tcp)),
  375. // The packet is malformed, or doesn't match the socket state,
  376. // or the socket buffer is full.
  377. Err(e) => return Err(e)
  378. }
  379. }
  380. if tcp_repr.control == TcpControl::Rst {
  381. // Never reply to a TCP RST packet with another TCP RST packet.
  382. Ok(Packet::None)
  383. } else {
  384. // The packet wasn't handled by a socket, send a TCP RST packet.
  385. Ok(Packet::Tcp(TcpSocket::rst_reply(&ip_repr, &tcp_repr)))
  386. }
  387. }
  388. fn dispatch(&mut self, timestamp: u64, packet: Packet) -> Result<()> {
  389. match packet {
  390. Packet::Arp(arp_repr) => {
  391. let dst_hardware_addr =
  392. match arp_repr {
  393. ArpRepr::EthernetIpv4 { target_hardware_addr, .. } => target_hardware_addr,
  394. _ => unreachable!()
  395. };
  396. self.dispatch_ethernet(timestamp, arp_repr.buffer_len(), |mut frame| {
  397. frame.set_dst_addr(dst_hardware_addr);
  398. frame.set_ethertype(EthernetProtocol::Arp);
  399. let mut packet = ArpPacket::new(frame.payload_mut());
  400. arp_repr.emit(&mut packet);
  401. })
  402. },
  403. Packet::Icmpv4(ipv4_repr, icmpv4_repr) => {
  404. self.dispatch_ip(timestamp, IpRepr::Ipv4(ipv4_repr), |_ip_repr, payload| {
  405. icmpv4_repr.emit(&mut Icmpv4Packet::new(payload));
  406. })
  407. }
  408. Packet::Raw((ip_repr, raw_packet)) => {
  409. self.dispatch_ip(timestamp, ip_repr, |_ip_repr, payload| {
  410. payload.copy_from_slice(raw_packet);
  411. })
  412. }
  413. Packet::Udp((ip_repr, udp_repr)) => {
  414. self.dispatch_ip(timestamp, ip_repr, |ip_repr, payload| {
  415. udp_repr.emit(&mut UdpPacket::new(payload),
  416. &ip_repr.src_addr(), &ip_repr.dst_addr());
  417. })
  418. }
  419. Packet::Tcp((ip_repr, mut tcp_repr)) => {
  420. let limits = self.device.limits();
  421. self.dispatch_ip(timestamp, ip_repr, |ip_repr, payload| {
  422. // This is a terrible hack to make TCP performance more acceptable on systems
  423. // where the TCP buffers are significantly larger than network buffers,
  424. // e.g. a 64 kB TCP receive buffer (and so, when empty, a 64k window)
  425. // together with four 1500 B Ethernet receive buffers. If left untreated,
  426. // this would result in our peer pushing our window and sever packet loss.
  427. //
  428. // I'm really not happy about this "solution" but I don't know what else to do.
  429. if let Some(max_burst_size) = limits.max_burst_size {
  430. let mut max_segment_size = limits.max_transmission_unit;
  431. max_segment_size -= EthernetFrame::<&[u8]>::header_len();
  432. max_segment_size -= ip_repr.buffer_len();
  433. max_segment_size -= tcp_repr.header_len();
  434. let max_window_size = max_burst_size * max_segment_size;
  435. if tcp_repr.window_len as usize > max_window_size {
  436. tcp_repr.window_len = max_window_size as u16;
  437. }
  438. }
  439. tcp_repr.emit(&mut TcpPacket::new(payload),
  440. &ip_repr.src_addr(), &ip_repr.dst_addr());
  441. })
  442. }
  443. Packet::None => Ok(())
  444. }
  445. }
  446. fn dispatch_ethernet<F>(&mut self, timestamp: u64, buffer_len: usize, f: F) -> Result<()>
  447. where F: FnOnce(EthernetFrame<&mut [u8]>) {
  448. let tx_len = EthernetFrame::<&[u8]>::buffer_len(buffer_len);
  449. let mut tx_buffer = self.device.transmit(timestamp, tx_len)?;
  450. debug_assert!(tx_buffer.as_ref().len() == tx_len);
  451. let mut frame = EthernetFrame::new(tx_buffer.as_mut());
  452. frame.set_src_addr(self.hardware_addr);
  453. f(frame);
  454. Ok(())
  455. }
  456. fn lookup_hardware_addr(&mut self, timestamp: u64,
  457. src_addr: &IpAddress, dst_addr: &IpAddress) ->
  458. Result<EthernetAddress> {
  459. if let Some(hardware_addr) = self.arp_cache.lookup(dst_addr) {
  460. return Ok(hardware_addr)
  461. }
  462. if dst_addr.is_broadcast() {
  463. return Ok(EthernetAddress([0xff; 6]))
  464. }
  465. match (src_addr, dst_addr) {
  466. (&IpAddress::Ipv4(src_addr), &IpAddress::Ipv4(dst_addr)) => {
  467. net_debug!("address {} not in ARP cache, sending request",
  468. dst_addr);
  469. let arp_repr = ArpRepr::EthernetIpv4 {
  470. operation: ArpOperation::Request,
  471. source_hardware_addr: self.hardware_addr,
  472. source_protocol_addr: src_addr,
  473. target_hardware_addr: EthernetAddress([0xff; 6]),
  474. target_protocol_addr: dst_addr,
  475. };
  476. self.dispatch_ethernet(timestamp, arp_repr.buffer_len(), |mut frame| {
  477. frame.set_dst_addr(EthernetAddress([0xff; 6]));
  478. frame.set_ethertype(EthernetProtocol::Arp);
  479. arp_repr.emit(&mut ArpPacket::new(frame.payload_mut()))
  480. })?;
  481. Err(Error::Unaddressable)
  482. }
  483. _ => unreachable!()
  484. }
  485. }
  486. fn dispatch_ip<F>(&mut self, timestamp: u64, ip_repr: IpRepr, f: F) -> Result<()>
  487. where F: FnOnce(IpRepr, &mut [u8]) {
  488. let ip_repr = ip_repr.lower(&self.protocol_addrs)?;
  489. let dst_hardware_addr =
  490. self.lookup_hardware_addr(timestamp, &ip_repr.src_addr(), &ip_repr.dst_addr())?;
  491. self.dispatch_ethernet(timestamp, ip_repr.total_len(), |mut frame| {
  492. frame.set_dst_addr(dst_hardware_addr);
  493. match ip_repr {
  494. IpRepr::Ipv4(_) => frame.set_ethertype(EthernetProtocol::Ipv4),
  495. _ => unreachable!()
  496. }
  497. ip_repr.emit(frame.payload_mut());
  498. let payload = &mut frame.payload_mut()[ip_repr.buffer_len()..];
  499. f(ip_repr, payload)
  500. })
  501. }
  502. }