crafter 0.3.2

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

use std::net::Ipv4Addr;

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

fn main() -> ExampleResult<()> {
    if print_help_if_requested(
        "usage: cargo run --example igmp_query --\n\nBuild and decode a documentation-safe IPv4/IGMPv3 query offline.",
    ) {
        return Ok(());
    }

    let group = Ipv4Addr::new(233, 252, 0, 61);
    let query = IgmpQuery::group_and_source_specific(vec![
        Ipv4Addr::new(198, 51, 100, 10),
        Ipv4Addr::new(203, 0, 113, 20),
    ])
    .with_suppress_router_side_processing(true)
    .with_querier_robustness_variable(2)
    .with_qqic(125);

    let packet = Ipv4::new()
        .src(local_ipv4())
        .dst(group)
        .ttl(1)
        .ipv4_protocol(Ipv4Protocol::Igmp)
        .ipv4_option(Ipv4Option::router_alert(0))?
        / Igmp::v3_membership_query(125, group, query);
    let compiled = packet.compile()?;
    let decoded = Packet::decode_from_l3(NetworkLayer::Ipv4, compiled.as_bytes())?;

    println!("constructed summary: {}", packet.summary());
    println!("decoded summary: {}", decoded.summary());
    println!("hexdump:\n{}", compiled.hexdump());

    Ok(())
}