raw.rs 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243
  1. use managed::Managed;
  2. use Error;
  3. use phy::DeviceLimits;
  4. use wire::{IpVersion, IpProtocol, Ipv4Repr, Ipv4Packet};
  5. use socket::{IpRepr, IpPayload, Socket};
  6. use storage::{Resettable, RingBuffer};
  7. /// A buffered raw IP packet.
  8. #[derive(Debug)]
  9. pub struct PacketBuffer<'a> {
  10. size: usize,
  11. payload: Managed<'a, [u8]>,
  12. }
  13. impl<'a> PacketBuffer<'a> {
  14. /// Create a buffered packet.
  15. pub fn new<T>(payload: T) -> PacketBuffer<'a>
  16. where T: Into<Managed<'a, [u8]>> {
  17. PacketBuffer {
  18. size: 0,
  19. payload: payload.into(),
  20. }
  21. }
  22. fn as_ref<'b>(&'b self) -> &'b [u8] {
  23. &self.payload[..self.size]
  24. }
  25. fn as_mut<'b>(&'b mut self) -> &'b mut [u8] {
  26. &mut self.payload[..self.size]
  27. }
  28. }
  29. impl<'a> Resettable for PacketBuffer<'a> {
  30. fn reset(&mut self) {
  31. self.size = 0;
  32. }
  33. }
  34. /// A raw IP packet ring buffer.
  35. pub type SocketBuffer<'a, 'b: 'a> = RingBuffer<'a, PacketBuffer<'b>>;
  36. /// A raw IP socket.
  37. ///
  38. /// A raw socket is bound to a specific IP protocol, and owns
  39. /// transmit and receive packet buffers.
  40. #[derive(Debug)]
  41. pub struct RawSocket<'a, 'b: 'a> {
  42. ip_version: IpVersion,
  43. ip_protocol: IpProtocol,
  44. rx_buffer: SocketBuffer<'a, 'b>,
  45. tx_buffer: SocketBuffer<'a, 'b>,
  46. debug_id: usize,
  47. }
  48. impl<'a, 'b> RawSocket<'a, 'b> {
  49. /// Create a raw IP socket bound to the given IP version and datagram protocol,
  50. /// with the given buffers.
  51. pub fn new(ip_version: IpVersion, ip_protocol: IpProtocol,
  52. rx_buffer: SocketBuffer<'a, 'b>,
  53. tx_buffer: SocketBuffer<'a, 'b>) -> Socket<'a, 'b> {
  54. Socket::Raw(RawSocket {
  55. ip_version,
  56. ip_protocol,
  57. rx_buffer,
  58. tx_buffer,
  59. debug_id: 0,
  60. })
  61. }
  62. /// Return the debug identifier.
  63. pub fn debug_id(&self) -> usize {
  64. self.debug_id
  65. }
  66. /// Set the debug identifier.
  67. ///
  68. /// The debug identifier is a number printed in socket trace messages.
  69. /// It could as well be used by the user code.
  70. pub fn set_debug_id(&mut self, id: usize) {
  71. self.debug_id = id;
  72. }
  73. /// Return the IP version the socket is bound to.
  74. pub fn ip_version(&self) -> IpVersion {
  75. self.ip_version
  76. }
  77. /// Return the IP protocol the socket is bound to.
  78. pub fn ip_protocol(&self) -> IpProtocol {
  79. self.ip_protocol
  80. }
  81. /// Check whether the transmit buffer is full.
  82. pub fn can_send(&self) -> bool {
  83. !self.tx_buffer.full()
  84. }
  85. /// Check whether the receive buffer is not empty.
  86. pub fn can_recv(&self) -> bool {
  87. !self.rx_buffer.empty()
  88. }
  89. /// Enqueue a packet to send, and return a pointer to its payload.
  90. ///
  91. /// This function returns `Err(())` if the size is greater than what
  92. /// the transmit buffer can accomodate.
  93. pub fn send(&mut self, size: usize) -> Result<&mut [u8], ()> {
  94. let packet_buf = self.tx_buffer.enqueue()?;
  95. packet_buf.size = size;
  96. net_trace!("[{}]:{}:{}: buffer to send {} octets",
  97. self.debug_id, self.ip_version, self.ip_protocol,
  98. packet_buf.size);
  99. Ok(&mut packet_buf.as_mut()[..size])
  100. }
  101. /// Enqueue a packet to send, and fill it from a slice.
  102. ///
  103. /// See also [send](#method.send).
  104. pub fn send_slice(&mut self, data: &[u8]) -> Result<usize, ()> {
  105. let buffer = self.send(data.len())?;
  106. let data = &data[..buffer.len()];
  107. buffer.copy_from_slice(data);
  108. Ok(data.len())
  109. }
  110. /// Dequeue a packet, and return a pointer to the payload.
  111. ///
  112. /// This function returns `Err(())` if the receive buffer is empty.
  113. pub fn recv(&mut self) -> Result<&[u8], ()> {
  114. let packet_buf = self.rx_buffer.dequeue()?;
  115. net_trace!("[{}]:{}:{}: receive {} buffered octets",
  116. self.debug_id, self.ip_version, self.ip_protocol,
  117. packet_buf.size);
  118. Ok(&packet_buf.as_ref()[..packet_buf.size])
  119. }
  120. /// Dequeue a packet, and copy the payload into the given slice.
  121. ///
  122. /// See also [recv](#method.recv).
  123. pub fn recv_slice(&mut self, data: &mut [u8]) -> Result<usize, ()> {
  124. let buffer = self.recv()?;
  125. data[..buffer.len()].copy_from_slice(buffer);
  126. Ok(buffer.len())
  127. }
  128. pub(crate) fn process(&mut self, _timestamp: u64, ip_repr: &IpRepr,
  129. payload: &[u8]) -> Result<(), Error> {
  130. match self.ip_version {
  131. IpVersion::Ipv4 => {
  132. if ip_repr.protocol() != self.ip_protocol {
  133. return Err(Error::Rejected);
  134. }
  135. let header_len = ip_repr.buffer_len();
  136. let packet_buf = self.rx_buffer.enqueue().map_err(|()| Error::Exhausted)?;
  137. packet_buf.size = header_len + payload.len();
  138. ip_repr.emit(&mut packet_buf.as_mut()[..header_len]);
  139. packet_buf.as_mut()[header_len..header_len + payload.len()]
  140. .copy_from_slice(payload);
  141. net_trace!("[{}]:{}:{}: receiving {} octets",
  142. self.debug_id, self.ip_version, self.ip_protocol,
  143. packet_buf.size);
  144. Ok(())
  145. }
  146. IpVersion::__Nonexhaustive => unreachable!()
  147. }
  148. }
  149. /// See [Socket::dispatch](enum.Socket.html#method.dispatch).
  150. pub(crate) fn dispatch<F, R>(&mut self, _timestamp: u64, _limits: &DeviceLimits,
  151. emit: &mut F) -> Result<R, Error>
  152. where F: FnMut(&IpRepr, &IpPayload) -> Result<R, Error> {
  153. let mut packet_buf = self.tx_buffer.dequeue_mut().map_err(|()| Error::Exhausted)?;
  154. net_trace!("[{}]:{}:{}: sending {} octets",
  155. self.debug_id, self.ip_version, self.ip_protocol,
  156. packet_buf.size);
  157. match self.ip_version {
  158. IpVersion::Ipv4 => {
  159. let mut ipv4_packet = Ipv4Packet::new_checked(packet_buf.as_mut())?;
  160. ipv4_packet.fill_checksum();
  161. let ipv4_packet = Ipv4Packet::new(&*ipv4_packet.into_inner());
  162. let raw_repr = RawRepr(ipv4_packet.payload());
  163. let ipv4_repr = Ipv4Repr::parse(&ipv4_packet)?;
  164. emit(&IpRepr::Ipv4(ipv4_repr), &raw_repr)
  165. }
  166. IpVersion::__Nonexhaustive => unreachable!()
  167. }
  168. }
  169. }
  170. struct RawRepr<'a>(&'a [u8]);
  171. impl<'a> IpPayload for RawRepr<'a> {
  172. fn buffer_len(&self) -> usize {
  173. self.0.len()
  174. }
  175. fn emit(&self, _repr: &IpRepr, payload: &mut [u8]) {
  176. payload.copy_from_slice(self.0);
  177. }
  178. }
  179. #[cfg(test)]
  180. mod test {
  181. use super::*;
  182. #[test]
  183. pub fn test_buffer() {
  184. let mut storage = vec![];
  185. for _ in 0..5 {
  186. storage.push(PacketBuffer::new(vec![0]))
  187. }
  188. let mut buffer = SocketBuffer::new(&mut storage[..]);
  189. assert_eq!(buffer.empty(), true);
  190. assert_eq!(buffer.full(), false);
  191. buffer.enqueue().unwrap().size = 1;
  192. assert_eq!(buffer.empty(), false);
  193. assert_eq!(buffer.full(), false);
  194. buffer.enqueue().unwrap().size = 2;
  195. buffer.enqueue().unwrap().size = 3;
  196. assert_eq!(buffer.dequeue().unwrap().size, 1);
  197. assert_eq!(buffer.dequeue().unwrap().size, 2);
  198. buffer.enqueue().unwrap().size = 4;
  199. buffer.enqueue().unwrap().size = 5;
  200. buffer.enqueue().unwrap().size = 6;
  201. buffer.enqueue().unwrap().size = 7;
  202. assert_eq!(buffer.enqueue().unwrap_err(), ());
  203. assert_eq!(buffer.empty(), false);
  204. assert_eq!(buffer.full(), true);
  205. assert_eq!(buffer.dequeue().unwrap().size, 3);
  206. assert_eq!(buffer.dequeue().unwrap().size, 4);
  207. assert_eq!(buffer.dequeue().unwrap().size, 5);
  208. assert_eq!(buffer.dequeue().unwrap().size, 6);
  209. assert_eq!(buffer.dequeue().unwrap().size, 7);
  210. assert_eq!(buffer.dequeue().unwrap_err(), ());
  211. assert_eq!(buffer.empty(), true);
  212. assert_eq!(buffer.full(), false);
  213. }
  214. }