packet_builder/
arp.rs

1
2
3#[macro_export]
4macro_rules! arp {
5   ({$($func:ident => $value:expr), *}, $buf:expr) => {{
6      const ARP_HEADER_LEN: usize = 28;
7      let total_len = ARP_HEADER_LEN;
8      let buf_len = $buf.len();
9      let mut pkt = pnet::packet::arp::MutableArpPacket::new(&mut $buf[buf_len - total_len..]).unwrap();
10      pkt.set_hw_addr_len(6);
11      pkt.set_proto_addr_len(4);
12      pkt.set_sender_proto_addr("127.0.0.1".parse().unwrap());
13      pkt.set_target_proto_addr("192.168.1.1".parse().unwrap());
14      pkt.set_operation(pnet::packet::arp::ArpOperations::Request);
15      pkt.set_hardware_type(pnet::packet::arp::ArpHardwareTypes::Ethernet);  
16      pkt.set_protocol_type(pnet::packet::ethernet::EtherTypes::Ipv4); 
17      pkt.set_sender_hw_addr(pnet::util::MacAddr(1,2,3,4,5,6)); 
18      $(
19        pkt.$func($value);
20      )*
21      (pkt, pnet::packet::ethernet::EtherTypes::Arp)
22   }};
23}
24
25#[cfg(test)]
26mod tests {
27   use pnet::packet::Packet;
28   use ::ipv4addr;
29
30   #[test]
31   fn macro_arp_basic() {
32      let mut buf = [0; 28];
33      let (pkt, proto) = arp!({set_target_proto_addr => ipv4addr!("192.168.1.1"), set_sender_proto_addr => ipv4addr!("192.168.1.245")}, buf); 
34      assert_eq!(proto, pnet::packet::ethernet::EtherTypes::Arp );
35
36      let buf_expected = vec![0; 28];
37      let mut pkt_expected = pnet::packet::arp::MutableArpPacket::owned(buf_expected).unwrap();
38      pkt_expected.set_hw_addr_len(6);
39      pkt_expected.set_proto_addr_len(4);
40      pkt_expected.set_sender_proto_addr("192.168.1.245".parse().unwrap());
41      pkt_expected.set_target_proto_addr("192.168.1.1".parse().unwrap());
42      pkt_expected.set_operation(pnet::packet::arp::ArpOperations::Request);
43      pkt_expected.set_hardware_type(pnet::packet::arp::ArpHardwareTypes::Ethernet);  
44      pkt_expected.set_protocol_type(pnet::packet::ethernet::EtherTypes::Ipv4); 
45      pkt_expected.set_sender_hw_addr(pnet::util::MacAddr(1,2,3,4,5,6));
46      assert_eq!(pkt_expected.packet(), pkt.packet());
47   }
48}
49