ferranet 0.2.0

A modern, async-first, zero-copy datalink-layer (L2) networking library
Documentation
//! Inject a single raw Ethernet frame onto an interface (blocking API).
//!
//! ```sh
//! cargo build --example send
//! sudo setcap cap_net_raw+ep target/debug/examples/send
//! ./target/debug/examples/send eth0
//! ```

use ferranet::{Channel, MacAddr};

fn main() -> ferranet::Result<()> {
    let iface = std::env::args().nth(1).unwrap_or_else(|| {
        eprintln!("usage: send <interface>");
        std::process::exit(2);
    });

    let (mut tx, _rx) = Channel::builder(&iface).build_sync()?;

    // dst (broadcast) + src + an experimental EtherType + payload.
    let src = MacAddr([0x02, 0x00, 0x00, 0x00, 0x00, 0x01]);
    let mut frame = Vec::new();
    frame.extend_from_slice(&MacAddr::BROADCAST.octets());
    frame.extend_from_slice(&src.octets());
    frame.extend_from_slice(&[0x88, 0xb5]); // IEEE local experimental EtherType
    frame.extend_from_slice(b"hello from ferranet");

    tx.send(&frame)?;
    println!("sent {} bytes on {iface}", frame.len());
    Ok(())
}