smoltcpdump.rs 1.0 KB

123456789101112131415161718192021222324252627282930313233343536373839
  1. extern crate smoltcp;
  2. use std::{env, io};
  3. use smoltcp::wire::{EthernetFrame, EthernetProtocolType, ArpPacket};
  4. use smoltcp::interface::RawSocket;
  5. fn get<T>(result: Result<T, ()>) -> io::Result<T> {
  6. result.map_err(|()| io::Error::new(io::ErrorKind::InvalidData,
  7. "buffer too small"))
  8. .into()
  9. }
  10. fn print_frame(socket: &mut RawSocket) -> io::Result<()> {
  11. let buffer = try!(socket.capture());
  12. let frame = try!(get(EthernetFrame::new(&buffer[..])));
  13. println!("{}", frame);
  14. match frame.ethertype() {
  15. EthernetProtocolType::Arp => {
  16. let packet = try!(get(ArpPacket::new(frame.payload())));
  17. println!("| {}", packet);
  18. },
  19. _ => ()
  20. }
  21. Ok(())
  22. }
  23. fn main() {
  24. let ifname = env::args().nth(1).unwrap();
  25. let mut socket = RawSocket::new(ifname.as_ref()).unwrap();
  26. loop {
  27. match print_frame(&mut socket) {
  28. Ok(()) => (),
  29. Err(e) => println!("Cannot print frame: {}", e)
  30. }
  31. }
  32. }