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_report --\n\nBuild and decode a documentation-safe IPv4/IGMPv3 report offline.",
    ) {
        return Ok(());
    }

    let group = Ipv4Addr::new(233, 252, 0, 74);
    let record = IgmpGroupRecord::allow_new_sources(group).with_source_addresses(vec![
        Ipv4Addr::new(192, 0, 2, 74),
        Ipv4Addr::new(198, 51, 100, 74),
    ]);
    let report = IgmpReport::from_group_records(vec![record]);

    let packet = Ipv4::new()
        .src(local_ipv4())
        .dst(Ipv4Addr::new(224, 0, 0, 22))
        .ttl(1)
        .ipv4_protocol(Ipv4Protocol::Igmp)
        .ipv4_option(Ipv4Option::router_alert(0))?
        / Igmp::v3_membership_report()
        / report;
    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(())
}