smoltcpdump.rs 821 B

123456789101112131415161718192021222324252627282930313233
  1. extern crate smoltcp;
  2. use std::env;
  3. use smoltcp::phy::{Device, RawSocket};
  4. use smoltcp::wire::{EthernetFrame, EthernetProtocolType, ArpPacket};
  5. fn print_frame(buffer: &[u8]) -> Result<(), ()> {
  6. let frame = try!(EthernetFrame::new(&buffer[..]));
  7. println!("{}", frame);
  8. match frame.ethertype() {
  9. EthernetProtocolType::Arp => {
  10. let packet = try!(ArpPacket::new(frame.payload()));
  11. println!("| {}", packet);
  12. },
  13. _ => ()
  14. }
  15. Ok(())
  16. }
  17. fn main() {
  18. let ifname = env::args().nth(1).unwrap();
  19. let mut socket = RawSocket::new(ifname.as_ref()).unwrap();
  20. loop {
  21. socket.recv(|buffer| {
  22. match print_frame(buffer) {
  23. Ok(()) => (),
  24. Err(()) => println!("buffer too small")
  25. }
  26. })
  27. }
  28. }