ethernet.rs 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406
  1. use managed::{Managed, ManagedSlice};
  2. use Error;
  3. use phy::Device;
  4. use wire::{EthernetAddress, EthernetProtocol, EthernetFrame};
  5. use wire::{ArpPacket, ArpRepr, ArpOperation};
  6. use wire::{Ipv4Packet, Ipv4Repr};
  7. use wire::{Icmpv4Packet, Icmpv4Repr, Icmpv4DstUnreachable};
  8. use wire::{IpAddress, IpProtocol, IpRepr};
  9. use wire::{TcpPacket, TcpRepr, TcpControl};
  10. use socket::Socket;
  11. use super::{ArpCache};
  12. /// An Ethernet network interface.
  13. ///
  14. /// The network interface logically owns a number of other data structures; to avoid
  15. /// a dependency on heap allocation, it instead owns a `BorrowMut<[T]>`, which can be
  16. /// a `&mut [T]`, or `Vec<T>` if a heap is available.
  17. pub struct Interface<'a, 'b, 'c, 'd, 'e: 'd, 'f: 'e + 'd, DeviceT: Device + 'a> {
  18. device: Managed<'a, DeviceT>,
  19. hardware_addr: EthernetAddress,
  20. protocol_addrs: ManagedSlice<'b, IpAddress>,
  21. arp_cache: Managed<'c, ArpCache>,
  22. sockets: ManagedSlice<'d, Socket<'e, 'f>>
  23. }
  24. impl<'a, 'b, 'c, 'd, 'e: 'd, 'f: 'e + 'd, DeviceT: Device + 'a>
  25. Interface<'a, 'b, 'c, 'd, 'e, 'f, DeviceT> {
  26. /// Create a network interface using the provided network device.
  27. ///
  28. /// # Panics
  29. /// See the restrictions on [set_hardware_addr](#method.set_hardware_addr)
  30. /// and [set_protocol_addrs](#method.set_protocol_addrs) functions.
  31. pub fn new<DeviceMT, ProtocolAddrsMT, ArpCacheMT, SocketsMT>
  32. (device: DeviceMT,
  33. hardware_addr: EthernetAddress, protocol_addrs: ProtocolAddrsMT,
  34. arp_cache: ArpCacheMT, sockets: SocketsMT) ->
  35. Interface<'a, 'b, 'c, 'd, 'e, 'f, DeviceT>
  36. where DeviceMT: Into<Managed<'a, DeviceT>>,
  37. ProtocolAddrsMT: Into<ManagedSlice<'b, IpAddress>>,
  38. ArpCacheMT: Into<Managed<'c, ArpCache>>,
  39. SocketsMT: Into<ManagedSlice<'d, Socket<'e, 'f>>> {
  40. let device = device.into();
  41. let protocol_addrs = protocol_addrs.into();
  42. let arp_cache = arp_cache.into();
  43. let sockets = sockets.into();
  44. Self::check_hardware_addr(&hardware_addr);
  45. Self::check_protocol_addrs(&protocol_addrs);
  46. Interface {
  47. device: device,
  48. arp_cache: arp_cache,
  49. hardware_addr: hardware_addr,
  50. protocol_addrs: protocol_addrs,
  51. sockets: sockets
  52. }
  53. }
  54. fn check_hardware_addr(addr: &EthernetAddress) {
  55. if addr.is_multicast() {
  56. panic!("hardware address {} is not unicast", addr)
  57. }
  58. }
  59. /// Get the hardware address of the interface.
  60. pub fn hardware_addr(&self) -> EthernetAddress {
  61. self.hardware_addr
  62. }
  63. /// Set the hardware address of the interface.
  64. ///
  65. /// # Panics
  66. /// This function panics if the address is not unicast.
  67. pub fn set_hardware_addr(&mut self, addr: EthernetAddress) {
  68. self.hardware_addr = addr;
  69. Self::check_hardware_addr(&self.hardware_addr);
  70. }
  71. fn check_protocol_addrs(addrs: &[IpAddress]) {
  72. for addr in addrs {
  73. if !addr.is_unicast() {
  74. panic!("protocol address {} is not unicast", addr)
  75. }
  76. }
  77. }
  78. /// Get the protocol addresses of the interface.
  79. pub fn protocol_addrs(&self) -> &[IpAddress] {
  80. self.protocol_addrs.as_ref()
  81. }
  82. /// Update the protocol addresses of the interface.
  83. ///
  84. /// # Panics
  85. /// This function panics if any of the addresses is not unicast.
  86. pub fn update_protocol_addrs<F: FnOnce(&mut ManagedSlice<'b, IpAddress>)>(&mut self, f: F) {
  87. f(&mut self.protocol_addrs);
  88. Self::check_protocol_addrs(&self.protocol_addrs)
  89. }
  90. /// Check whether the interface has the given protocol address assigned.
  91. pub fn has_protocol_addr<T: Into<IpAddress>>(&self, addr: T) -> bool {
  92. let addr = addr.into();
  93. self.protocol_addrs.iter().any(|&probe| probe == addr)
  94. }
  95. /// Get the set of sockets owned by the interface.
  96. pub fn sockets(&mut self) -> &mut ManagedSlice<'d, Socket<'e, 'f>> {
  97. &mut self.sockets
  98. }
  99. /// Receive and process a packet, if available, and then transmit a packet, if necessary.
  100. ///
  101. /// The timestamp is a monotonically increasing number of milliseconds.
  102. pub fn poll(&mut self, timestamp: u64) -> Result<(), Error> {
  103. enum Response<'a> {
  104. Nop,
  105. Arp(ArpRepr),
  106. Icmpv4(Ipv4Repr, Icmpv4Repr<'a>),
  107. Tcpv4(Ipv4Repr, TcpRepr<'a>)
  108. }
  109. // First, transmit any outgoing packets.
  110. loop {
  111. if try!(self.emit(timestamp)) { break }
  112. }
  113. // Now, receive any incoming packets.
  114. let rx_buffer = try!(self.device.receive());
  115. let eth_frame = try!(EthernetFrame::new(&rx_buffer));
  116. let mut response = Response::Nop;
  117. match eth_frame.ethertype() {
  118. // Snoop all ARP traffic, and respond to ARP packets directed at us.
  119. EthernetProtocol::Arp => {
  120. let arp_packet = try!(ArpPacket::new(eth_frame.payload()));
  121. match try!(ArpRepr::parse(&arp_packet)) {
  122. // Respond to ARP requests aimed at us, and fill the ARP cache
  123. // from all ARP requests, including gratuitous.
  124. ArpRepr::EthernetIpv4 {
  125. operation: ArpOperation::Request,
  126. source_hardware_addr, source_protocol_addr,
  127. target_protocol_addr, ..
  128. } => {
  129. self.arp_cache.fill(&source_protocol_addr.into(), &source_hardware_addr);
  130. if self.has_protocol_addr(target_protocol_addr) {
  131. response = Response::Arp(ArpRepr::EthernetIpv4 {
  132. operation: ArpOperation::Reply,
  133. source_hardware_addr: self.hardware_addr,
  134. source_protocol_addr: target_protocol_addr,
  135. target_hardware_addr: source_hardware_addr,
  136. target_protocol_addr: source_protocol_addr
  137. })
  138. }
  139. },
  140. // Fill the ARP cache from gratuitous ARP replies.
  141. ArpRepr::EthernetIpv4 {
  142. operation: ArpOperation::Reply,
  143. source_hardware_addr, source_protocol_addr, ..
  144. } => {
  145. self.arp_cache.fill(&source_protocol_addr.into(), &source_hardware_addr)
  146. },
  147. _ => return Err(Error::Unrecognized)
  148. }
  149. },
  150. // Handle IP packets directed at us.
  151. EthernetProtocol::Ipv4 => {
  152. let ipv4_packet = try!(Ipv4Packet::new(eth_frame.payload()));
  153. let ipv4_repr = try!(Ipv4Repr::parse(&ipv4_packet));
  154. // Fill the ARP cache from IP header.
  155. self.arp_cache.fill(&IpAddress::Ipv4(ipv4_repr.src_addr), &eth_frame.src_addr());
  156. match ipv4_repr {
  157. // Ignore IP packets not directed at us.
  158. Ipv4Repr { dst_addr, .. } if !self.has_protocol_addr(dst_addr) => (),
  159. // Respond to ICMP packets.
  160. Ipv4Repr { protocol: IpProtocol::Icmp, src_addr, dst_addr } => {
  161. let icmp_packet = try!(Icmpv4Packet::new(ipv4_packet.payload()));
  162. let icmp_repr = try!(Icmpv4Repr::parse(&icmp_packet));
  163. match icmp_repr {
  164. // Respond to echo requests.
  165. Icmpv4Repr::EchoRequest {
  166. ident, seq_no, data
  167. } => {
  168. let ipv4_reply_repr = Ipv4Repr {
  169. src_addr: dst_addr,
  170. dst_addr: src_addr,
  171. protocol: IpProtocol::Icmp
  172. };
  173. let icmp_reply_repr = Icmpv4Repr::EchoReply {
  174. ident: ident,
  175. seq_no: seq_no,
  176. data: data
  177. };
  178. response = Response::Icmpv4(ipv4_reply_repr, icmp_reply_repr)
  179. }
  180. // Ignore any echo replies.
  181. Icmpv4Repr::EchoReply { .. } => (),
  182. // FIXME: do something correct here?
  183. _ => return Err(Error::Unrecognized)
  184. }
  185. },
  186. // Try dispatching a packet to a socket.
  187. Ipv4Repr { src_addr, dst_addr, protocol } => {
  188. let mut handled = false;
  189. for socket in self.sockets.iter_mut() {
  190. let ip_repr = IpRepr::Ipv4(ipv4_repr);
  191. match socket.process(timestamp, &ip_repr, ipv4_packet.payload()) {
  192. Ok(()) => {
  193. // The packet was valid and handled by socket.
  194. handled = true;
  195. break
  196. }
  197. Err(Error::Rejected) => {
  198. // The packet wasn't addressed to the socket.
  199. // For TCP, send RST only if no other socket accepts
  200. // the packet.
  201. continue
  202. }
  203. Err(Error::Malformed) => {
  204. // The packet was addressed to the socket but is malformed.
  205. // For TCP, send RST immediately.
  206. break
  207. }
  208. Err(e) => return Err(e)
  209. }
  210. }
  211. if !handled && protocol == IpProtocol::Tcp {
  212. let tcp_packet = try!(TcpPacket::new(ipv4_packet.payload()));
  213. let ipv4_reply_repr = Ipv4Repr {
  214. src_addr: dst_addr,
  215. dst_addr: src_addr,
  216. protocol: IpProtocol::Tcp
  217. };
  218. let tcp_reply_repr = TcpRepr {
  219. src_port: tcp_packet.dst_port(),
  220. dst_port: tcp_packet.src_port(),
  221. control: TcpControl::Rst,
  222. seq_number: tcp_packet.ack_number(),
  223. ack_number: Some(tcp_packet.seq_number() +
  224. tcp_packet.segment_len()),
  225. window_len: 0,
  226. payload: &[]
  227. };
  228. response = Response::Tcpv4(ipv4_reply_repr, tcp_reply_repr);
  229. } else if !handled {
  230. let reason;
  231. if protocol == IpProtocol::Udp {
  232. reason = Icmpv4DstUnreachable::PortUnreachable
  233. } else {
  234. reason = Icmpv4DstUnreachable::ProtoUnreachable
  235. }
  236. let mut data = [0; 8];
  237. data.copy_from_slice(&ipv4_packet.payload()[0..8]);
  238. let ipv4_reply_repr = Ipv4Repr {
  239. src_addr: dst_addr,
  240. dst_addr: src_addr,
  241. protocol: IpProtocol::Icmp
  242. };
  243. let icmp_reply_repr = Icmpv4Repr::DstUnreachable {
  244. reason: reason,
  245. header: ipv4_repr,
  246. length: ipv4_packet.payload().len(),
  247. data: data
  248. };
  249. response = Response::Icmpv4(ipv4_reply_repr, icmp_reply_repr)
  250. }
  251. },
  252. }
  253. }
  254. // Drop all other traffic.
  255. _ => return Err(Error::Unrecognized)
  256. }
  257. macro_rules! ip_response {
  258. ($tx_buffer:ident, $frame:ident, $ip_repr:ident, $length:expr) => ({
  259. let dst_hardware_addr =
  260. match self.arp_cache.lookup(&$ip_repr.dst_addr.into()) {
  261. None => return Err(Error::Unaddressable),
  262. Some(hardware_addr) => hardware_addr
  263. };
  264. let payload_len = $length;
  265. let frame_len = EthernetFrame::<&[u8]>::buffer_len($ip_repr.buffer_len() +
  266. payload_len);
  267. $tx_buffer = try!(self.device.transmit(frame_len));
  268. $frame = try!(EthernetFrame::new(&mut $tx_buffer));
  269. $frame.set_src_addr(self.hardware_addr);
  270. $frame.set_dst_addr(dst_hardware_addr);
  271. $frame.set_ethertype(EthernetProtocol::Ipv4);
  272. let mut ip_packet = try!(Ipv4Packet::new($frame.payload_mut()));
  273. $ip_repr.emit(&mut ip_packet, payload_len);
  274. ip_packet
  275. })
  276. }
  277. match response {
  278. Response::Arp(repr) => {
  279. let tx_len = EthernetFrame::<&[u8]>::buffer_len(repr.buffer_len());
  280. let mut tx_buffer = try!(self.device.transmit(tx_len));
  281. let mut frame = try!(EthernetFrame::new(&mut tx_buffer));
  282. frame.set_src_addr(self.hardware_addr);
  283. frame.set_dst_addr(match repr {
  284. ArpRepr::EthernetIpv4 { target_hardware_addr, .. } => target_hardware_addr,
  285. _ => unreachable!()
  286. });
  287. frame.set_ethertype(EthernetProtocol::Arp);
  288. let mut packet = try!(ArpPacket::new(frame.payload_mut()));
  289. repr.emit(&mut packet);
  290. Ok(())
  291. },
  292. Response::Icmpv4(ip_repr, icmp_repr) => {
  293. let mut tx_buffer;
  294. let mut frame;
  295. let mut ip_packet = ip_response!(tx_buffer, frame, ip_repr,
  296. icmp_repr.buffer_len());
  297. let mut icmp_packet = try!(Icmpv4Packet::new(ip_packet.payload_mut()));
  298. icmp_repr.emit(&mut icmp_packet);
  299. Ok(())
  300. }
  301. Response::Tcpv4(ip_repr, tcp_repr) => {
  302. let mut tx_buffer;
  303. let mut frame;
  304. let mut ip_packet = ip_response!(tx_buffer, frame, ip_repr,
  305. tcp_repr.buffer_len());
  306. let mut tcp_packet = try!(TcpPacket::new(ip_packet.payload_mut()));
  307. tcp_repr.emit(&mut tcp_packet,
  308. &IpAddress::Ipv4(ip_repr.src_addr),
  309. &IpAddress::Ipv4(ip_repr.dst_addr));
  310. Ok(())
  311. }
  312. Response::Nop => {
  313. Ok(())
  314. }
  315. }
  316. }
  317. fn emit(&mut self, timestamp: u64) -> Result<bool, Error> {
  318. // Borrow checker is being overly careful around closures, so we have
  319. // to hack around that.
  320. let src_hardware_addr = self.hardware_addr;
  321. let src_protocol_addrs = self.protocol_addrs.as_ref();
  322. let arp_cache = &mut self.arp_cache;
  323. let device = &mut self.device;
  324. let mut nothing_to_transmit = true;
  325. for socket in self.sockets.iter_mut() {
  326. let result = socket.dispatch(timestamp, &mut |repr, payload| {
  327. let repr = try!(repr.lower(src_protocol_addrs));
  328. let dst_hardware_addr =
  329. match arp_cache.lookup(&repr.dst_addr()) {
  330. None => return Err(Error::Unaddressable),
  331. Some(hardware_addr) => hardware_addr
  332. };
  333. let tx_len = EthernetFrame::<&[u8]>::buffer_len(repr.buffer_len() +
  334. payload.buffer_len());
  335. let mut tx_buffer = try!(device.transmit(tx_len));
  336. let mut frame = try!(EthernetFrame::new(&mut tx_buffer));
  337. frame.set_src_addr(src_hardware_addr);
  338. frame.set_dst_addr(dst_hardware_addr);
  339. frame.set_ethertype(EthernetProtocol::Ipv4);
  340. repr.emit(frame.payload_mut(), payload.buffer_len());
  341. let mut ip_packet = try!(Ipv4Packet::new(frame.payload_mut()));
  342. payload.emit(&repr, ip_packet.payload_mut());
  343. Ok(())
  344. });
  345. match result {
  346. Ok(()) => {
  347. nothing_to_transmit = false;
  348. break
  349. }
  350. Err(Error::Exhausted) => continue,
  351. Err(e) => return Err(e)
  352. }
  353. }
  354. Ok(nothing_to_transmit)
  355. }
  356. }