arp_request/
arp_request.rs1extern crate rips_packets;
2
3use rips_packets::arp::{MutArpPacket, Operation};
4use rips_packets::ethernet::{MacAddr, MutEthernetPacket, EtherType};
5
6use std::net::Ipv4Addr;
7
8fn main() {
9 let src_mac = MacAddr([0x13, 0x37, 0xde, 0xad, 0xbe, 0xef]);
10 let src_ip = Ipv4Addr::new(192, 168, 0, 150);
11 let target_ip = Ipv4Addr::new(192, 168, 0, 1);
12
13 let mut buffer = [0; 14 + 28];
14 format_arp_request_frame(&mut buffer[..], src_mac, src_ip, target_ip)
15 .expect("Unable to format frame");
16
17 println!(
18 "This is what an arp request for: IPv4 {}\nfrom: IPv4 {} and MAC {} looks like:\n{}",
19 target_ip,
20 src_ip,
21 src_mac,
22 buffer
23 .iter()
24 .map(|b| format!("{:02x}", b))
25 .collect::<Vec<String>>()
26 .join(" "),
27 );
28}
29
30fn format_arp_request_frame(
31 buffer: &mut [u8],
32 src_mac: MacAddr,
33 src_ip: Ipv4Addr,
34 target_ip: Ipv4Addr,
35) -> Result<(), &'static str> {
36 static ERR_MSG: &str = "Too short buffer";
37
38 let mut ethernet_packet = MutEthernetPacket::new(buffer).ok_or(ERR_MSG)?;
39 format_broadcast_ethernet_arp(&mut ethernet_packet, src_mac);
40
41 let mut arp_packet = MutArpPacket::new(ethernet_packet.payload()).ok_or(ERR_MSG)?;
42 format_arp_request(&mut arp_packet, src_mac, src_ip, target_ip);
43 Ok(())
44}
45
46fn format_broadcast_ethernet_arp<'a>(packet: &mut MutEthernetPacket<'a>, src_mac: MacAddr) {
47 packet.set_destination(MacAddr::BROADCAST);
48 packet.set_source(src_mac);
49 packet.set_ether_type(EtherType::ARP);
50}
51
52fn format_arp_request<'a>(
53 packet: &mut MutArpPacket<'a>,
54 src_mac: MacAddr,
55 src_ip: Ipv4Addr,
56 target_ip: Ipv4Addr,
57) {
58 packet.set_ipv4_over_ethernet_values();
59 packet.set_operation(Operation::REQUEST);
60 packet.set_sender_mac_addr(src_mac);
61 packet.set_sender_ip_addr(src_ip);
62 packet.set_target_ip_addr(target_ip);
64}