arp_request/
arp_request.rs

1extern 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_mac_addr(); // Is ignored in a request anyway
63    packet.set_target_ip_addr(target_ip);
64}