tcp.rs 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. //! Simple echo server over TCP.
  2. //!
  3. //! Ref: <https://github.com/smoltcp-rs/smoltcp/blob/master/examples/server.rs>
  4. use alloc::{borrow::ToOwned, rc::Rc, vec, vec::Vec};
  5. use core::{cell::RefCell, str::FromStr};
  6. use smoltcp::iface::{Config, Interface, SocketSet};
  7. use smoltcp::phy::{Device, DeviceCapabilities, Medium, RxToken, TxToken};
  8. use smoltcp::wire::{EthernetAddress, IpAddress, IpCidr, Ipv4Address};
  9. use smoltcp::{socket::tcp, time::Instant};
  10. use virtio_drivers::device::net::{RxBuffer, VirtIONet};
  11. use virtio_drivers::{transport::Transport, Error};
  12. use super::{HalImpl, NET_QUEUE_SIZE};
  13. type DeviceImpl<T> = VirtIONet<HalImpl, T, NET_QUEUE_SIZE>;
  14. const IP: &str = "10.0.2.15"; // QEMU user networking default IP
  15. const GATEWAY: &str = "10.0.2.2"; // QEMU user networking gateway
  16. const PORT: u16 = 5555;
  17. struct DeviceWrapper<T: Transport> {
  18. inner: Rc<RefCell<DeviceImpl<T>>>,
  19. }
  20. impl<T: Transport> DeviceWrapper<T> {
  21. fn new(dev: DeviceImpl<T>) -> Self {
  22. DeviceWrapper {
  23. inner: Rc::new(RefCell::new(dev)),
  24. }
  25. }
  26. fn mac_address(&self) -> EthernetAddress {
  27. EthernetAddress(self.inner.borrow().mac_address())
  28. }
  29. }
  30. impl<T: Transport> Device for DeviceWrapper<T> {
  31. type RxToken<'a> = VirtioRxToken<T> where Self: 'a;
  32. type TxToken<'a> = VirtioTxToken<T> where Self: 'a;
  33. fn receive(&mut self, _timestamp: Instant) -> Option<(Self::RxToken<'_>, Self::TxToken<'_>)> {
  34. match self.inner.borrow_mut().receive() {
  35. Ok(buf) => Some((
  36. VirtioRxToken(self.inner.clone(), buf),
  37. VirtioTxToken(self.inner.clone()),
  38. )),
  39. Err(Error::NotReady) => None,
  40. Err(err) => panic!("receive failed: {}", err),
  41. }
  42. }
  43. fn transmit(&mut self, _timestamp: Instant) -> Option<Self::TxToken<'_>> {
  44. Some(VirtioTxToken(self.inner.clone()))
  45. }
  46. fn capabilities(&self) -> DeviceCapabilities {
  47. let mut caps = DeviceCapabilities::default();
  48. caps.max_transmission_unit = 1536;
  49. caps.max_burst_size = Some(1);
  50. caps.medium = Medium::Ethernet;
  51. caps
  52. }
  53. }
  54. struct VirtioRxToken<T: Transport>(Rc<RefCell<DeviceImpl<T>>>, RxBuffer);
  55. struct VirtioTxToken<T: Transport>(Rc<RefCell<DeviceImpl<T>>>);
  56. impl<T: Transport> RxToken for VirtioRxToken<T> {
  57. fn consume<R, F>(self, f: F) -> R
  58. where
  59. F: FnOnce(&mut [u8]) -> R,
  60. {
  61. let mut rx_buf = self.1;
  62. trace!(
  63. "RECV {} bytes: {:02X?}",
  64. rx_buf.packet_len(),
  65. rx_buf.packet()
  66. );
  67. let result = f(rx_buf.packet_mut());
  68. self.0.borrow_mut().recycle_rx_buffer(rx_buf).unwrap();
  69. result
  70. }
  71. }
  72. impl<T: Transport> TxToken for VirtioTxToken<T> {
  73. fn consume<R, F>(self, len: usize, f: F) -> R
  74. where
  75. F: FnOnce(&mut [u8]) -> R,
  76. {
  77. let mut dev = self.0.borrow_mut();
  78. let mut tx_buf = dev.new_tx_buffer(len);
  79. let result = f(tx_buf.packet_mut());
  80. trace!("SEND {} bytes: {:02X?}", len, tx_buf.packet());
  81. dev.transmit(tx_buf).unwrap();
  82. result
  83. }
  84. }
  85. pub fn test_echo_server<T: Transport>(dev: DeviceImpl<T>) {
  86. let mut device = DeviceWrapper::new(dev);
  87. // Create interface
  88. let mut config = Config::new();
  89. config.random_seed = 0x2333;
  90. if device.capabilities().medium == Medium::Ethernet {
  91. config.hardware_addr = Some(device.mac_address().into());
  92. }
  93. let mut iface = Interface::new(config, &mut device);
  94. iface.update_ip_addrs(|ip_addrs| {
  95. ip_addrs
  96. .push(IpCidr::new(IpAddress::from_str(IP).unwrap(), 24))
  97. .unwrap();
  98. });
  99. iface
  100. .routes_mut()
  101. .add_default_ipv4_route(Ipv4Address::from_str(GATEWAY).unwrap())
  102. .unwrap();
  103. // Create sockets
  104. let tcp_rx_buffer = tcp::SocketBuffer::new(vec![0; 1024]);
  105. let tcp_tx_buffer = tcp::SocketBuffer::new(vec![0; 1024]);
  106. let tcp_socket = tcp::Socket::new(tcp_rx_buffer, tcp_tx_buffer);
  107. let mut sockets = SocketSet::new(vec![]);
  108. let tcp_handle = sockets.add(tcp_socket);
  109. info!("start a reverse echo server...");
  110. let mut tcp_active = false;
  111. loop {
  112. let timestamp =
  113. unsafe { Instant::from_micros_const(core::arch::x86_64::_rdtsc() as i64 / 2_500) };
  114. iface.poll(timestamp, &mut device, &mut sockets);
  115. // tcp:PORT: echo with reverse
  116. let socket = sockets.get_mut::<tcp::Socket>(tcp_handle);
  117. if !socket.is_open() {
  118. info!("listening on port {}...", PORT);
  119. socket.listen(PORT).unwrap();
  120. }
  121. if socket.is_active() && !tcp_active {
  122. info!("tcp:{} connected", PORT);
  123. } else if !socket.is_active() && tcp_active {
  124. info!("tcp:{} disconnected", PORT);
  125. }
  126. tcp_active = socket.is_active();
  127. if socket.may_recv() {
  128. let data = socket
  129. .recv(|buffer| {
  130. let recvd_len = buffer.len();
  131. if !buffer.is_empty() {
  132. debug!("tcp:{} recv {} bytes: {:?}", PORT, recvd_len, buffer);
  133. let mut lines = buffer
  134. .split(|&b| b == b'\n')
  135. .map(ToOwned::to_owned)
  136. .collect::<Vec<_>>();
  137. for line in lines.iter_mut() {
  138. line.reverse();
  139. }
  140. let data = lines.join(&b'\n');
  141. (recvd_len, data)
  142. } else {
  143. (0, vec![])
  144. }
  145. })
  146. .unwrap();
  147. if socket.can_send() && !data.is_empty() {
  148. debug!("tcp:{} send data: {:?}", PORT, data);
  149. socket.send_slice(&data[..]).unwrap();
  150. }
  151. } else if socket.may_send() {
  152. info!("tcp:{} close", PORT);
  153. socket.close();
  154. }
  155. }
  156. }