xenet_packet_builder/
arp.rs

1use std::net::Ipv4Addr;
2use xenet_core::mac::MacAddr;
3use xenet_packet::arp::ArpHardwareType;
4use xenet_packet::arp::ArpOperation;
5use xenet_packet::arp::MutableArpPacket;
6use xenet_packet::arp::ARP_HEADER_LEN;
7use xenet_packet::ethernet::EtherType;
8use xenet_packet::Packet;
9
10/// Build ARP packet.
11pub(crate) fn build_arp_packet(
12    arp_packet: &mut MutableArpPacket,
13    src_mac: MacAddr,
14    dst_mac: MacAddr,
15    src_ip: Ipv4Addr,
16    dst_ip: Ipv4Addr,
17) {
18    arp_packet.set_hardware_type(ArpHardwareType::Ethernet);
19    arp_packet.set_protocol_type(EtherType::Ipv4);
20    arp_packet.set_hw_addr_len(6);
21    arp_packet.set_proto_addr_len(4);
22    arp_packet.set_operation(ArpOperation::Request);
23    arp_packet.set_sender_hw_addr(src_mac);
24    arp_packet.set_sender_proto_addr(src_ip);
25    arp_packet.set_target_hw_addr(dst_mac);
26    arp_packet.set_target_proto_addr(dst_ip);
27}
28
29/// ARP Packet Builder.
30#[derive(Clone, Debug)]
31pub struct ArpPacketBuilder {
32    /// Source MAC address.
33    pub src_mac: MacAddr,
34    /// Destination MAC address.
35    pub dst_mac: MacAddr,
36    /// Source IPv4 address.
37    pub src_ip: Ipv4Addr,
38    /// Destination IPv4 address.
39    pub dst_ip: Ipv4Addr,
40}
41
42impl ArpPacketBuilder {
43    /// Constructs a new ArpPacketBuilder.
44    pub fn new() -> ArpPacketBuilder {
45        ArpPacketBuilder {
46            src_mac: MacAddr::zero(),
47            dst_mac: MacAddr::broadcast(),
48            src_ip: Ipv4Addr::UNSPECIFIED,
49            dst_ip: Ipv4Addr::UNSPECIFIED,
50        }
51    }
52    /// Builds ARP packet and return bytes.
53    pub fn build(&self) -> Vec<u8> {
54        let mut buffer = [0u8; ARP_HEADER_LEN];
55        let mut arp_packet = MutableArpPacket::new(&mut buffer).unwrap();
56        arp_packet.set_hardware_type(ArpHardwareType::Ethernet);
57        arp_packet.set_protocol_type(EtherType::Ipv4);
58        arp_packet.set_hw_addr_len(6);
59        arp_packet.set_proto_addr_len(4);
60        arp_packet.set_operation(ArpOperation::Request);
61        arp_packet.set_sender_hw_addr(self.src_mac);
62        arp_packet.set_sender_proto_addr(self.src_ip);
63        arp_packet.set_target_hw_addr(self.dst_mac);
64        arp_packet.set_target_proto_addr(self.dst_ip);
65        arp_packet.packet().to_vec()
66    }
67}