Skip to main content

cross_platform_send/
cross_platform_send.rs

1//! Cross-platform packet sender — constructs and sends an Ethernet frame.
2//!
3//! # Platform Support
4//! - Linux: AF_PACKET (requires root)
5//! - macOS: BPF (requires root)
6//! - Windows: L2 send not supported (UnsupportedPlatform)
7//!
8//! # Usage
9//! ```sh
10//! sudo cargo run --example cross_platform_send -- eth0
11//! ```
12
13use std::net::Ipv4Addr;
14use wireforge_core::ether::EthernetPacketBuilder;
15use wireforge_core::icmp::IcmpPacketBuilder;
16use wireforge_core::ipv4::Ipv4PacketBuilder;
17use wireforge_core::types::{EtherType, IpProtocol};
18use wireforge_io::{DefaultL2Writer, traits::L2Writer};
19
20fn main() -> Result<(), Box<dyn std::error::Error>> {
21    let ifname = std::env::args().nth(1).unwrap_or_else(|| "eth0".into());
22    println!("Sending on {} ...", ifname);
23
24    // Build ICMP Echo Request
25    let icmp = IcmpPacketBuilder::echo_request()
26        .identifier(0x0001)
27        .sequence_number(1)
28        .payload(b"wireforge!")
29        .build();
30
31    // Build IPv4 packet
32    let ipv4 = Ipv4PacketBuilder::new()
33        .source(Ipv4Addr::new(192, 168, 1, 100))
34        .destination(Ipv4Addr::new(192, 168, 1, 1))
35        .protocol(IpProtocol::Icmp)
36        .ttl(64)
37        .payload(&icmp)
38        .unwrap()
39        .build();
40
41    // Build Ethernet frame (broadcast)
42    let frame = EthernetPacketBuilder::new()
43        .dst_mac([0xFF; 6])
44        .src_mac([0x00, 0x11, 0x22, 0x33, 0x44, 0x55])
45        .ethertype(EtherType::Ipv4)
46        .payload(&ipv4)
47        .build();
48
49    let tx = DefaultL2Writer::new(&ifname)?;
50    let n = tx.send(&frame)?;
51    println!("Sent {} bytes", n);
52    Ok(())
53}