mutnet 0.7.0

Unsafe-free and allocation-free, no-std network protocol parsing and in-place manipulation library.
Documentation
use crate::ethernet::Eth;
use core::net::Ipv4Addr;

use super::*;

const SLICE_LENGTH: usize = 100;
const HEADROOM: usize = SLICE_LENGTH + 10;

#[kani::proof]
fn get_arp_proof() {
    let mut any_array: [u8; SLICE_LENGTH] = kani::any();
    let any_slice_length = kani::any_where(|i| *i <= SLICE_LENGTH);
    let any_slice = &mut any_array[..any_slice_length];

    let any_headroom = kani::any_where(|i| *i <= HEADROOM);

    if let Ok(to_test) = DataBuffer::<_, Eth>::parse_ethernet_layer(any_slice, any_headroom) {
        if let Ok(to_test) = DataBuffer::<_, Arp<Eth>>::parse_arp_layer(to_test) {
            let _ = to_test.arp_hardware_type();
            let _ = to_test.arp_protocol_type();
            let _ = to_test.arp_typed_protocol_type();
            let _ = to_test.arp_operation_code();
            let _ = to_test.arp_typed_operation_code();
            let _ = to_test.arp_hardware_address_length();
            let _ = to_test.arp_protocol_address_length();
            let _ = to_test.arp_sender_hardware_address();
            let _ = to_test.arp_sender_protocol_address();
            let _ = to_test.arp_target_hardware_address();
            let _ = to_test.arp_target_protocol_address();
        }
    }
}

#[kani::proof]
fn arp_set_operation_code_proof() {
    let mut any_array: [u8; SLICE_LENGTH] = kani::any();
    let any_slice_length = kani::any_where(|i| *i <= SLICE_LENGTH);
    let any_slice = &mut any_array[..any_slice_length];

    let any_headroom = kani::any_where(|i| *i <= HEADROOM);

    if let Ok(to_test) = DataBuffer::<_, Eth>::parse_ethernet_layer(any_slice, any_headroom) {
        if let Ok(mut to_test) = DataBuffer::<_, Arp<Eth>>::parse_arp_layer(to_test) {
            to_test.set_arp_operation_code(kani::any());
            let _ = DataBuffer::<_, Arp<Eth>>::parse_arp_layer(
                DataBuffer::<_, Eth>::parse_ethernet_layer(
                    to_test.buffer_into_inner(),
                    any_headroom,
                )
                .unwrap(),
            )
            .unwrap();
        }
    }
}

#[kani::proof]
fn arp_set_sender_hardware_address_proof() {
    let mut any_array: [u8; SLICE_LENGTH] = kani::any();
    let any_slice_length = kani::any_where(|i| *i <= SLICE_LENGTH);
    let any_slice = &mut any_array[..any_slice_length];

    let any_headroom = kani::any_where(|i| *i <= HEADROOM);

    if let Ok(to_test) = DataBuffer::<_, Eth>::parse_ethernet_layer(any_slice, any_headroom) {
        if let Ok(mut to_test) = DataBuffer::<_, Arp<Eth>>::parse_arp_layer(to_test) {
            to_test.set_arp_sender_hardware_address(&kani::any());
            let _ = DataBuffer::<_, Arp<Eth>>::parse_arp_layer(
                DataBuffer::<_, Eth>::parse_ethernet_layer(
                    to_test.buffer_into_inner(),
                    any_headroom,
                )
                .unwrap(),
            )
            .unwrap();
        }
    }
}

#[kani::proof]
fn arp_set_sender_protocol_address_proof() {
    let mut any_array: [u8; SLICE_LENGTH] = kani::any();
    let any_slice_length = kani::any_where(|i| *i <= SLICE_LENGTH);
    let any_slice = &mut any_array[..any_slice_length];

    let any_headroom = kani::any_where(|i| *i <= HEADROOM);

    if let Ok(to_test) = DataBuffer::<_, Eth>::parse_ethernet_layer(any_slice, any_headroom) {
        if let Ok(mut to_test) = DataBuffer::<_, Arp<Eth>>::parse_arp_layer(to_test) {
            to_test.set_arp_sender_protocol_address(&Ipv4Addr::from(kani::any::<[u8; 4]>()));
            let _ = DataBuffer::<_, Arp<Eth>>::parse_arp_layer(
                DataBuffer::<_, Eth>::parse_ethernet_layer(
                    to_test.buffer_into_inner(),
                    any_headroom,
                )
                .unwrap(),
            )
            .unwrap();
        }
    }
}

#[kani::proof]
fn arp_set_target_hardware_address_proof() {
    let mut any_array: [u8; SLICE_LENGTH] = kani::any();
    let any_slice_length = kani::any_where(|i| *i <= SLICE_LENGTH);
    let any_slice = &mut any_array[..any_slice_length];

    let any_headroom = kani::any_where(|i| *i <= HEADROOM);

    if let Ok(to_test) = DataBuffer::<_, Eth>::parse_ethernet_layer(any_slice, any_headroom) {
        if let Ok(mut to_test) = DataBuffer::<_, Arp<Eth>>::parse_arp_layer(to_test) {
            to_test.set_arp_target_hardware_address(&kani::any());
            let _ = DataBuffer::<_, Arp<Eth>>::parse_arp_layer(
                DataBuffer::<_, Eth>::parse_ethernet_layer(
                    to_test.buffer_into_inner(),
                    any_headroom,
                )
                .unwrap(),
            )
            .unwrap();
        }
    }
}

#[kani::proof]
fn arp_set_target_protocol_address_proof() {
    let mut any_array: [u8; SLICE_LENGTH] = kani::any();
    let any_slice_length = kani::any_where(|i| *i <= SLICE_LENGTH);
    let any_slice = &mut any_array[..any_slice_length];

    let any_headroom = kani::any_where(|i| *i <= HEADROOM);

    if let Ok(to_test) = DataBuffer::<_, Eth>::parse_ethernet_layer(any_slice, any_headroom) {
        if let Ok(mut to_test) = DataBuffer::<_, Arp<Eth>>::parse_arp_layer(to_test) {
            to_test.set_arp_target_protocol_address(&Ipv4Addr::from(kani::any::<[u8; 4]>()));
            let _ = DataBuffer::<_, Arp<Eth>>::parse_arp_layer(
                DataBuffer::<_, Eth>::parse_ethernet_layer(
                    to_test.buffer_into_inner(),
                    any_headroom,
                )
                .unwrap(),
            )
            .unwrap();
        }
    }
}