crafter 0.3.2

Packet-level network interaction for Rust tools and agents.
Documentation
mod common;

use common::{local_ipv4, print_help_if_requested, remote_ipv4, ExampleResult, EXAMPLE_IFACE};
use crafter::prelude::*;

fn main() -> ExampleResult<()> {
    if print_help_if_requested(
        "usage: cargo run --example send_plan --\n\nBuild an IPv4 ICMP packet and inspect a network-layer dry-run send plan.",
    ) {
        return Ok(());
    }

    let packet = Ipv4::new()
        .src(local_ipv4())
        .dst(remote_ipv4())
        .id(0x1234)
        .dont_fragment(true)
        / Icmpv4::echo_request().id(0x4242).seq(1)
        / Raw::from("send-plan");
    let plan = packet.send_dry_run(SendOptions::new().iface(EXAMPLE_IFACE).network_layer())?;

    println!("example: send_plan");
    println!("mode: dry-run");
    println!("interface: {}", plan.interface());
    println!("target: {:?}", plan.target());
    println!("compiled bytes: {}", plan.len());
    println!(
        "derived reply filter: {}",
        reply_filter(&packet).unwrap_or_default()
    );
    println!("summary: {}", packet.summary());
    println!("hexdump:\n{}", plan.compiled_packet().hexdump());

    Ok(())
}