smoltcpserver.rs 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. #![feature(associated_consts)]
  2. extern crate smoltcp;
  3. use std::env;
  4. use smoltcp::phy::{Device, TapInterface};
  5. use smoltcp::wire::{PrettyPrinter, EthernetFrame, EthernetAddress};
  6. use smoltcp::iface::{ProtocolAddress, SliceArpCache, EthernetInterface};
  7. struct TracingDevice<T: Device>(T);
  8. impl<T: Device> Device for TracingDevice<T> {
  9. fn mtu(&self) -> usize {
  10. self.0.mtu()
  11. }
  12. fn recv<R, F: FnOnce(&[u8]) -> R>(&self, handler: F) -> R {
  13. self.0.recv(|buffer| {
  14. print!("{}", PrettyPrinter::<EthernetFrame<_>>::new("<- ", &buffer));
  15. handler(buffer)
  16. })
  17. }
  18. fn send<R, F: FnOnce(&mut [u8]) -> R>(&self, len: usize, handler: F) -> R {
  19. self.0.send(len, |buffer| {
  20. let result = handler(buffer);
  21. print!("{}", PrettyPrinter::<EthernetFrame<_>>::new("-> ", &buffer));
  22. result
  23. })
  24. }
  25. }
  26. fn main() {
  27. let ifname = env::args().nth(1).unwrap();
  28. let hardware_addr = EthernetAddress([0x02, 0x00, 0x00, 0x00, 0x00, 0x01]);
  29. let protocol_addrs = [ProtocolAddress::ipv4([192, 168, 69, 1])];
  30. let device = TapInterface::new(ifname.as_ref()).unwrap();
  31. let device = TracingDevice(device);
  32. let mut arp_cache_data = [Default::default(); 8];
  33. let arp_cache = SliceArpCache::new(&mut arp_cache_data);
  34. let mut iface = EthernetInterface::new(device, arp_cache);
  35. iface.set_hardware_addr(hardware_addr);
  36. iface.set_protocol_addrs(&protocol_addrs);
  37. loop {
  38. match iface.poll() {
  39. Ok(()) => (),
  40. Err(e) => println!("{}", e)
  41. }
  42. }
  43. }