xenet_packet_builder/
arp.rs1use 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
10pub(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#[derive(Clone, Debug)]
31pub struct ArpPacketBuilder {
32 pub src_mac: MacAddr,
34 pub dst_mac: MacAddr,
36 pub src_ip: Ipv4Addr,
38 pub dst_ip: Ipv4Addr,
40}
41
42impl ArpPacketBuilder {
43 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 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}