cross_platform_send/
cross_platform_send.rs1use 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 let icmp = IcmpPacketBuilder::echo_request()
26 .identifier(0x0001)
27 .sequence_number(1)
28 .payload(b"wireforge!")
29 .build();
30
31 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 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}