pn-dcp 0.3.0

Aim to quickly parsing and splicing pn-dcp packet
Documentation
mod comm;

use anyhow::Result;
use comm::*;
use pn_dcp::block::{BlockIp, BlockResp};
use pn_dcp::options::IpBlockInfo;
use pn_dcp::options::{BlockError, InnerIpAddr, OptionAndSub};
use pn_dcp::packet::get_req::PacketGetReq;
use pn_dcp::packet::get_resp::PacketGetResp;
use std::net::Ipv4Addr;

#[test]
fn test_get() -> Result<()> {
    let data = get_get_req();
    let get = PacketGetReq::try_from(data.as_slice())?;
    let src = get_src_array(data.as_slice()).unwrap();
    let dest = get_destination_array(data.as_slice()).unwrap();

    let mut get_req = PacketGetReq::new(init_mac_by_array(src), init_mac_by_array(dest));
    get_req.set_xid(get_xid(data.as_slice()).unwrap());

    get_req.append_block(OptionAndSub::IpAddr);
    get_req.append_block(OptionAndSub::DHCP(0x3d));

    assert_eq!(
        get_req.options(),
        vec![OptionAndSub::IpAddr, OptionAndSub::DHCP(0x3d)]
    );

    assert_eq!(get, get_req);
    assert_eq!(data, get_req.to_vec());
    Ok(())
}

#[test]
fn test_get_resp() -> Result<()> {
    let data = get_get_resp();
    let get = PacketGetResp::try_from(data.as_slice())?;
    let src = get_src_array(data.as_slice()).unwrap();
    let dest = get_destination_array(data.as_slice()).unwrap();

    let mut get_req = PacketGetResp::new(init_mac_by_array(src), init_mac_by_array(dest));
    get_req.set_xid(get_xid(data.as_slice()).unwrap());

    let ip = InnerIpAddr::new_by_ipv4(
        Ipv4Addr::from(0xc0a8c7f5),
        Ipv4Addr::from(0xffffff00),
        Ipv4Addr::from(0xc0a8c7fe),
    );
    get_req.append_block_ip(ip.clone(), IpBlockInfo::IpSet);
    get_req.append_block_resp(
        OptionAndSub::DHCP(0x3d),
        BlockError::SuboptionUnsuppOrNoDataSetAvail,
    );

    assert_eq!(get_req.block_ip()?, BlockIp::new(ip, IpBlockInfo::IpSet));
    assert_eq!(
        get_req.block_resps(),
        vec![BlockResp(
            OptionAndSub::DHCP(0x3d),
            BlockError::SuboptionUnsuppOrNoDataSetAvail
        ),]
    );

    assert_eq!(data, get_req.to_vec());
    assert_eq!(get, get_req);
    Ok(())
}

#[test]
fn test_ext() -> Result<()> {
    let req = PacketGetReq::try_from(get_get_req().as_slice())?;
    let req_ext = PacketGetReq::try_from(get_get_req_ext().as_slice())?;
    assert_eq!(req, req_ext);

    let resp = PacketGetResp::try_from(get_get_resp().as_slice())?;
    let resp_ext = PacketGetResp::try_from(get_get_resp_ext().as_slice())?;
    assert_eq!(resp, resp_ext);

    Ok(())
}