kawaiifi 0.2.1

Wi-Fi scanning library for Linux, macOS, and Windows.
Documentation
use deku::prelude::*;
use serde::{Deserialize, Serialize};

use crate::ies::{BitRange, Field, IeId};

#[derive(Debug, Clone, PartialEq, Eq, Hash, DekuRead, DekuWrite, Serialize, Deserialize)]
#[deku(bit_order = "lsb")]
pub struct RmEnabledCapabilities {
    #[deku(bits = 1)]
    pub link_measurement_capability_enabled: bool,
    #[deku(bits = 1)]
    pub neighbor_report_capability_enabled: bool,
    #[deku(bits = 1)]
    pub parallel_measurements_capability_enabled: bool,
    #[deku(bits = 1)]
    pub repeated_measurements_capability_enabled: bool,
    #[deku(bits = 1)]
    pub beacon_passive_measurement_capability_enabled: bool,
    #[deku(bits = 1)]
    pub beacon_active_measurement_capability_enabled: bool,
    #[deku(bits = 1)]
    pub beacon_table_measurement_capability_enabled: bool,
    #[deku(bits = 1)]
    pub beacon_measurement_reporting_conditions_capability_enabled: bool,
    #[deku(bits = 1)]
    pub frame_measurement_capability_enabled: bool,
    #[deku(bits = 1)]
    pub channel_load_measurement_capability_enabled: bool,
    #[deku(bits = 1)]
    pub noise_histogram_measurement_capability_enabled: bool,
    #[deku(bits = 1)]
    pub statistics_measurement_capability_enabled: bool,
    #[deku(bits = 1)]
    pub lci_measurement_capability_enabled: bool,
    #[deku(bits = 1)]
    pub lci_azimuth_capability_enabled: bool,
    #[deku(bits = 1)]
    pub transmit_stream_category_measurement_capability_enabled: bool,
    #[deku(bits = 1)]
    pub triggered_transmit_stream_category_measurement_capability_enabled: bool,
    #[deku(bits = 1)]
    pub ap_channel_report_capability_enabled: bool,
    #[deku(bits = 1)]
    pub rm_mib_capability_enabled: bool,
    #[deku(bits = 3)]
    pub operating_channel_max_measurement_duration: u8,
    #[deku(bits = 3)]
    pub nonoperating_channel_max_measurement_duration: u8,
    #[deku(bits = 3)]
    pub measurement_pilot_capability: u8,
    #[deku(bits = 1)]
    pub measurement_pilot_transmission_information_capability_enabled: bool,
    #[deku(bits = 1)]
    pub neighbor_report_tsf_offset_capability_enabled: bool,
    #[deku(bits = 1)]
    pub rcpi_measurement_capability_enabled: bool,
    #[deku(bits = 1)]
    pub rsni_measurement_capability_enabled: bool,
    #[deku(bits = 1)]
    pub bss_average_access_delay_capability_enabled: bool,
    #[deku(bits = 1)]
    pub bss_available_admission_capacity_capability_enabled: bool,
    #[deku(bits = 1)]
    pub antenna_capability_enabled: bool,
    #[deku(bits = 1)]
    pub ftm_range_report_capability_enabled: bool,
    #[deku(bits = 1)]
    pub civic_location_measurement_capability_enabled: bool,
    #[deku(bits = 4)]
    reserved: u8,
}

impl RmEnabledCapabilities {
    pub const NAME: &'static str = "RM Enabled Capabilities";
    pub const ID: u8 = 70;
    pub const ID_EXT: Option<u8> = None;
    pub(crate) const IE_ID: IeId = IeId::new(Self::ID, Self::ID_EXT);
    pub const MIN_LENGTH: usize = 5;

    pub fn summary(&self) -> String {
        let mut summary = Vec::new();
        if self.link_measurement_capability_enabled {
            summary.push("Link Measurement");
        }

        if self.neighbor_report_capability_enabled {
            summary.push("Neighbor Report");
        }

        if self.parallel_measurements_capability_enabled {
            summary.push("Parallel Measurements");
        }

        if self.repeated_measurements_capability_enabled {
            summary.push("Repeated Measurements");
        }

        if self.beacon_passive_measurement_capability_enabled {
            summary.push("Beacon Passive Measurement");
        }

        if self.beacon_active_measurement_capability_enabled {
            summary.push("Beacon Active Measurement");
        }

        if self.beacon_table_measurement_capability_enabled {
            summary.push("Beacon Table Measurement");
        }

        summary.join(", ")
    }

    pub fn fields(&self) -> Vec<Field> {
        let bytes = self.to_bytes().unwrap_or_default();

        vec![
            Field::builder()
                .title("Link Measurement")
                .value(self.link_measurement_capability_enabled)
                .bits(BitRange::new(&bytes, 0, 1))
                .build(),
            Field::builder()
                .title("Neighbor Report")
                .value(self.neighbor_report_capability_enabled)
                .bits(BitRange::new(&bytes, 1, 1))
                .build(),
            Field::builder()
                .title("Parallel Measurements")
                .value(self.parallel_measurements_capability_enabled)
                .bits(BitRange::new(&bytes, 2, 1))
                .build(),
            Field::builder()
                .title("Repeated Measurements")
                .value(self.repeated_measurements_capability_enabled)
                .bits(BitRange::new(&bytes, 3, 1))
                .build(),
            Field::builder()
                .title("Beacon Passive Measurement")
                .value(self.beacon_passive_measurement_capability_enabled)
                .bits(BitRange::new(&bytes, 4, 1))
                .build(),
            Field::builder()
                .title("Beacon Active Measurement")
                .value(self.beacon_active_measurement_capability_enabled)
                .bits(BitRange::new(&bytes, 5, 1))
                .build(),
            Field::builder()
                .title("Beacon Table Measurement")
                .value(self.beacon_table_measurement_capability_enabled)
                .bits(BitRange::new(&bytes, 6, 1))
                .build(),
            Field::builder()
                .title("Beacon Measurement Reporting Conditions")
                .value(self.beacon_measurement_reporting_conditions_capability_enabled)
                .bits(BitRange::new(&bytes, 7, 1))
                .build(),
            Field::builder()
                .title("Frame Measurement")
                .value(self.frame_measurement_capability_enabled)
                .bits(BitRange::new(&bytes, 8, 1))
                .build(),
            Field::builder()
                .title("Channel Load Measurement")
                .value(self.channel_load_measurement_capability_enabled)
                .bits(BitRange::new(&bytes, 9, 1))
                .build(),
            Field::builder()
                .title("Noise Histogram Measurement")
                .value(self.noise_histogram_measurement_capability_enabled)
                .bits(BitRange::new(&bytes, 10, 1))
                .build(),
            Field::builder()
                .title("Statistics Measurement")
                .value(self.statistics_measurement_capability_enabled)
                .bits(BitRange::new(&bytes, 11, 1))
                .build(),
            Field::builder()
                .title("LCI Measurement")
                .value(self.lci_measurement_capability_enabled)
                .bits(BitRange::new(&bytes, 12, 1))
                .build(),
            Field::builder()
                .title("LCI Azimuth")
                .value(self.lci_azimuth_capability_enabled)
                .bits(BitRange::new(&bytes, 13, 1))
                .build(),
            Field::builder()
                .title("Transmit Stream/Category Measurement")
                .value(self.transmit_stream_category_measurement_capability_enabled)
                .bits(BitRange::new(&bytes, 14, 1))
                .build(),
            Field::builder()
                .title("Triggered Transmit Stream/Category Measurement")
                .value(self.triggered_transmit_stream_category_measurement_capability_enabled)
                .bits(BitRange::new(&bytes, 15, 1))
                .build(),
            Field::builder()
                .title("AP Channel Report")
                .value(self.ap_channel_report_capability_enabled)
                .bits(BitRange::new(&bytes, 16, 1))
                .build(),
            Field::builder()
                .title("RM MIB")
                .value(self.rm_mib_capability_enabled)
                .bits(BitRange::new(&bytes, 17, 1))
                .build(),
            Field::builder()
                .title("Operating Channel Max Measurement Duration")
                .value(self.operating_channel_max_measurement_duration)
                .bits(BitRange::new(&bytes, 18, 3))
                .build(),
            Field::builder()
                .title("Nonoperating Channel Max Measurement Duration")
                .value(self.nonoperating_channel_max_measurement_duration)
                .bits(BitRange::new(&bytes, 21, 3))
                .build(),
            Field::builder()
                .title("Measurement Pilot Capability")
                .value(self.measurement_pilot_capability)
                .bits(BitRange::new(&bytes, 24, 3))
                .build(),
            Field::builder()
                .title("Measurement Pilot Transmission Information")
                .value(self.measurement_pilot_transmission_information_capability_enabled)
                .bits(BitRange::new(&bytes, 27, 1))
                .build(),
            Field::builder()
                .title("Neighbor Report TSF Offset")
                .value(self.neighbor_report_tsf_offset_capability_enabled)
                .bits(BitRange::new(&bytes, 28, 1))
                .build(),
            Field::builder()
                .title("RCPI Measurement")
                .value(self.rcpi_measurement_capability_enabled)
                .bits(BitRange::new(&bytes, 29, 1))
                .build(),
            Field::builder()
                .title("RSNI Measurement")
                .value(self.rsni_measurement_capability_enabled)
                .bits(BitRange::new(&bytes, 30, 1))
                .build(),
            Field::builder()
                .title("BSS Average Access Delay")
                .value(self.bss_average_access_delay_capability_enabled)
                .bits(BitRange::new(&bytes, 31, 1))
                .build(),
            Field::builder()
                .title("BSS Available Admission Capacity")
                .value(self.bss_available_admission_capacity_capability_enabled)
                .bits(BitRange::new(&bytes, 32, 1))
                .build(),
            Field::builder()
                .title("Antenna")
                .value(self.antenna_capability_enabled)
                .bits(BitRange::new(&bytes, 33, 1))
                .build(),
            Field::builder()
                .title("FTM Range Report")
                .value(self.ftm_range_report_capability_enabled)
                .bits(BitRange::new(&bytes, 34, 1))
                .build(),
            Field::builder()
                .title("Civic Location Measurement")
                .value(self.civic_location_measurement_capability_enabled)
                .bits(BitRange::new(&bytes, 35, 1))
                .build(),
            Field::reserved(BitRange::new(&bytes, 36, 4)),
        ]
    }
}