2016-12-11 00:25:43 +08:00
|
|
|
extern crate smoltcp;
|
|
|
|
|
2016-12-11 03:27:07 +08:00
|
|
|
use std::env;
|
|
|
|
use smoltcp::phy::{Device, RawSocket};
|
2016-12-11 00:25:43 +08:00
|
|
|
use smoltcp::wire::{EthernetFrame, EthernetProtocolType, ArpPacket};
|
|
|
|
|
2016-12-11 03:27:07 +08:00
|
|
|
fn print_frame(buffer: &[u8]) -> Result<(), ()> {
|
|
|
|
let frame = try!(EthernetFrame::new(&buffer[..]));
|
2016-12-11 00:25:43 +08:00
|
|
|
println!("{}", frame);
|
|
|
|
|
|
|
|
match frame.ethertype() {
|
|
|
|
EthernetProtocolType::Arp => {
|
2016-12-11 03:27:07 +08:00
|
|
|
let packet = try!(ArpPacket::new(frame.payload()));
|
2016-12-11 00:25:43 +08:00
|
|
|
println!("| {}", packet);
|
|
|
|
},
|
|
|
|
_ => ()
|
|
|
|
}
|
|
|
|
|
|
|
|
Ok(())
|
|
|
|
}
|
|
|
|
|
|
|
|
fn main() {
|
|
|
|
let ifname = env::args().nth(1).unwrap();
|
|
|
|
let mut socket = RawSocket::new(ifname.as_ref()).unwrap();
|
|
|
|
loop {
|
2016-12-11 03:27:07 +08:00
|
|
|
socket.recv(|buffer| {
|
|
|
|
match print_frame(buffer) {
|
|
|
|
Ok(()) => (),
|
|
|
|
Err(()) => println!("buffer too small")
|
|
|
|
}
|
|
|
|
})
|
2016-12-11 00:25:43 +08:00
|
|
|
}
|
|
|
|
}
|