2023-03-30 17:05:29 +02:00
|
|
|
#![allow(dead_code)]
|
2022-08-09 00:53:32 +02:00
|
|
|
#![allow(non_camel_case_types)]
|
2022-07-11 05:19:31 +02:00
|
|
|
|
2023-04-02 20:19:47 +02:00
|
|
|
use core::cell::RefCell;
|
2022-07-11 05:19:31 +02:00
|
|
|
|
2023-03-30 17:09:12 +02:00
|
|
|
use embassy_sync::blocking_mutex::raw::NoopRawMutex;
|
2023-03-30 17:05:29 +02:00
|
|
|
use embassy_sync::pubsub::{PubSubChannel, Subscriber};
|
|
|
|
|
|
|
|
use crate::structs::BssInfo;
|
2023-03-01 19:03:46 +01:00
|
|
|
|
2023-03-27 03:33:06 +02:00
|
|
|
#[derive(Debug, Clone, Copy, PartialEq, Eq, num_enum::FromPrimitive)]
|
2022-07-11 05:19:31 +02:00
|
|
|
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
|
|
|
#[repr(u8)]
|
|
|
|
pub enum Event {
|
|
|
|
#[num_enum(default)]
|
|
|
|
Unknown = 0xFF,
|
|
|
|
/// indicates status of set SSID
|
|
|
|
SET_SSID = 0,
|
|
|
|
/// differentiates join IBSS from found (START) IBSS
|
|
|
|
JOIN = 1,
|
|
|
|
/// STA founded an IBSS or AP started a BSS
|
|
|
|
START = 2,
|
|
|
|
/// 802.11 AUTH request
|
|
|
|
AUTH = 3,
|
|
|
|
/// 802.11 AUTH indication
|
|
|
|
AUTH_IND = 4,
|
|
|
|
/// 802.11 DEAUTH request
|
|
|
|
DEAUTH = 5,
|
|
|
|
/// 802.11 DEAUTH indication
|
|
|
|
DEAUTH_IND = 6,
|
|
|
|
/// 802.11 ASSOC request
|
|
|
|
ASSOC = 7,
|
|
|
|
/// 802.11 ASSOC indication
|
|
|
|
ASSOC_IND = 8,
|
|
|
|
/// 802.11 REASSOC request
|
|
|
|
REASSOC = 9,
|
|
|
|
/// 802.11 REASSOC indication
|
|
|
|
REASSOC_IND = 10,
|
|
|
|
/// 802.11 DISASSOC request
|
|
|
|
DISASSOC = 11,
|
|
|
|
/// 802.11 DISASSOC indication
|
|
|
|
DISASSOC_IND = 12,
|
|
|
|
/// 802.11h Quiet period started
|
|
|
|
QUIET_START = 13,
|
|
|
|
/// 802.11h Quiet period ended
|
|
|
|
QUIET_END = 14,
|
|
|
|
/// BEACONS received/lost indication
|
|
|
|
BEACON_RX = 15,
|
|
|
|
/// generic link indication
|
|
|
|
LINK = 16,
|
|
|
|
/// TKIP MIC error occurred
|
|
|
|
MIC_ERROR = 17,
|
|
|
|
/// NDIS style link indication
|
|
|
|
NDIS_LINK = 18,
|
|
|
|
/// roam attempt occurred: indicate status & reason
|
|
|
|
ROAM = 19,
|
|
|
|
/// change in dot11FailedCount (txfail)
|
|
|
|
TXFAIL = 20,
|
|
|
|
/// WPA2 pmkid cache indication
|
|
|
|
PMKID_CACHE = 21,
|
|
|
|
/// current AP's TSF value went backward
|
|
|
|
RETROGRADE_TSF = 22,
|
|
|
|
/// AP was pruned from join list for reason
|
|
|
|
PRUNE = 23,
|
|
|
|
/// report AutoAuth table entry match for join attempt
|
|
|
|
AUTOAUTH = 24,
|
|
|
|
/// Event encapsulating an EAPOL message
|
|
|
|
EAPOL_MSG = 25,
|
|
|
|
/// Scan results are ready or scan was aborted
|
|
|
|
SCAN_COMPLETE = 26,
|
|
|
|
/// indicate to host addts fail/success
|
|
|
|
ADDTS_IND = 27,
|
|
|
|
/// indicate to host delts fail/success
|
|
|
|
DELTS_IND = 28,
|
|
|
|
/// indicate to host of beacon transmit
|
|
|
|
BCNSENT_IND = 29,
|
|
|
|
/// Send the received beacon up to the host
|
|
|
|
BCNRX_MSG = 30,
|
|
|
|
/// indicate to host loss of beacon
|
|
|
|
BCNLOST_MSG = 31,
|
|
|
|
/// before attempting to roam
|
|
|
|
ROAM_PREP = 32,
|
|
|
|
/// PFN network found event
|
|
|
|
PFN_NET_FOUND = 33,
|
|
|
|
/// PFN network lost event
|
|
|
|
PFN_NET_LOST = 34,
|
|
|
|
RESET_COMPLETE = 35,
|
|
|
|
JOIN_START = 36,
|
|
|
|
ROAM_START = 37,
|
|
|
|
ASSOC_START = 38,
|
|
|
|
IBSS_ASSOC = 39,
|
|
|
|
RADIO = 40,
|
|
|
|
/// PSM microcode watchdog fired
|
|
|
|
PSM_WATCHDOG = 41,
|
|
|
|
/// CCX association start
|
|
|
|
CCX_ASSOC_START = 42,
|
|
|
|
/// CCX association abort
|
|
|
|
CCX_ASSOC_ABORT = 43,
|
|
|
|
/// probe request received
|
|
|
|
PROBREQ_MSG = 44,
|
|
|
|
SCAN_CONFIRM_IND = 45,
|
|
|
|
/// WPA Handshake
|
|
|
|
PSK_SUP = 46,
|
|
|
|
COUNTRY_CODE_CHANGED = 47,
|
|
|
|
/// WMMAC excedded medium time
|
|
|
|
EXCEEDED_MEDIUM_TIME = 48,
|
|
|
|
/// WEP ICV error occurred
|
|
|
|
ICV_ERROR = 49,
|
|
|
|
/// Unsupported unicast encrypted frame
|
|
|
|
UNICAST_DECODE_ERROR = 50,
|
|
|
|
/// Unsupported multicast encrypted frame
|
|
|
|
MULTICAST_DECODE_ERROR = 51,
|
|
|
|
TRACE = 52,
|
|
|
|
/// BT-AMP HCI event
|
|
|
|
BTA_HCI_EVENT = 53,
|
|
|
|
/// I/F change (for wlan host notification)
|
|
|
|
IF = 54,
|
|
|
|
/// P2P Discovery listen state expires
|
|
|
|
P2P_DISC_LISTEN_COMPLETE = 55,
|
|
|
|
/// indicate RSSI change based on configured levels
|
|
|
|
RSSI = 56,
|
|
|
|
/// PFN best network batching event
|
|
|
|
PFN_BEST_BATCHING = 57,
|
|
|
|
EXTLOG_MSG = 58,
|
|
|
|
/// Action frame reception
|
|
|
|
ACTION_FRAME = 59,
|
|
|
|
/// Action frame Tx complete
|
|
|
|
ACTION_FRAME_COMPLETE = 60,
|
|
|
|
/// assoc request received
|
|
|
|
PRE_ASSOC_IND = 61,
|
|
|
|
/// re-assoc request received
|
|
|
|
PRE_REASSOC_IND = 62,
|
|
|
|
/// channel adopted (xxx: obsoleted)
|
|
|
|
CHANNEL_ADOPTED = 63,
|
|
|
|
/// AP started
|
|
|
|
AP_STARTED = 64,
|
|
|
|
/// AP stopped due to DFS
|
|
|
|
DFS_AP_STOP = 65,
|
|
|
|
/// AP resumed due to DFS
|
|
|
|
DFS_AP_RESUME = 66,
|
|
|
|
/// WAI stations event
|
|
|
|
WAI_STA_EVENT = 67,
|
|
|
|
/// event encapsulating an WAI message
|
|
|
|
WAI_MSG = 68,
|
|
|
|
/// escan result event
|
|
|
|
ESCAN_RESULT = 69,
|
|
|
|
/// action frame off channel complete
|
|
|
|
ACTION_FRAME_OFF_CHAN_COMPLETE = 70,
|
|
|
|
/// probe response received
|
|
|
|
PROBRESP_MSG = 71,
|
|
|
|
/// P2P Probe request received
|
|
|
|
P2P_PROBREQ_MSG = 72,
|
|
|
|
DCS_REQUEST = 73,
|
|
|
|
/// credits for D11 FIFOs. [AC0,AC1,AC2,AC3,BC_MC,ATIM]
|
|
|
|
FIFO_CREDIT_MAP = 74,
|
|
|
|
/// Received action frame event WITH wl_event_rx_frame_data_t header
|
|
|
|
ACTION_FRAME_RX = 75,
|
|
|
|
/// Wake Event timer fired, used for wake WLAN test mode
|
|
|
|
WAKE_EVENT = 76,
|
|
|
|
/// Radio measurement complete
|
|
|
|
RM_COMPLETE = 77,
|
|
|
|
/// Synchronize TSF with the host
|
|
|
|
HTSFSYNC = 78,
|
|
|
|
/// request an overlay IOCTL/iovar from the host
|
|
|
|
OVERLAY_REQ = 79,
|
|
|
|
CSA_COMPLETE_IND = 80,
|
|
|
|
/// excess PM Wake Event to inform host
|
|
|
|
EXCESS_PM_WAKE_EVENT = 81,
|
|
|
|
/// no PFN networks around
|
|
|
|
PFN_SCAN_NONE = 82,
|
|
|
|
/// last found PFN network gets lost
|
|
|
|
PFN_SCAN_ALLGONE = 83,
|
|
|
|
GTK_PLUMBED = 84,
|
|
|
|
/// 802.11 ASSOC indication for NDIS only
|
|
|
|
ASSOC_IND_NDIS = 85,
|
|
|
|
/// 802.11 REASSOC indication for NDIS only
|
|
|
|
REASSOC_IND_NDIS = 86,
|
|
|
|
ASSOC_REQ_IE = 87,
|
|
|
|
ASSOC_RESP_IE = 88,
|
|
|
|
/// association recreated on resume
|
|
|
|
ASSOC_RECREATED = 89,
|
|
|
|
/// rx action frame event for NDIS only
|
|
|
|
ACTION_FRAME_RX_NDIS = 90,
|
|
|
|
/// authentication request received
|
|
|
|
AUTH_REQ = 91,
|
|
|
|
/// fast assoc recreation failed
|
|
|
|
SPEEDY_RECREATE_FAIL = 93,
|
|
|
|
/// port-specific event and payload (e.g. NDIS)
|
|
|
|
NATIVE = 94,
|
|
|
|
/// event for tx pkt delay suddently jump
|
|
|
|
PKTDELAY_IND = 95,
|
|
|
|
/// AWDL AW period starts
|
|
|
|
AWDL_AW = 96,
|
|
|
|
/// AWDL Master/Slave/NE master role event
|
|
|
|
AWDL_ROLE = 97,
|
|
|
|
/// Generic AWDL event
|
|
|
|
AWDL_EVENT = 98,
|
|
|
|
/// NIC AF txstatus
|
|
|
|
NIC_AF_TXS = 99,
|
|
|
|
/// NAN event
|
|
|
|
NAN = 100,
|
|
|
|
BEACON_FRAME_RX = 101,
|
|
|
|
/// desired service found
|
|
|
|
SERVICE_FOUND = 102,
|
|
|
|
/// GAS fragment received
|
|
|
|
GAS_FRAGMENT_RX = 103,
|
|
|
|
/// GAS sessions all complete
|
|
|
|
GAS_COMPLETE = 104,
|
|
|
|
/// New device found by p2p offload
|
|
|
|
P2PO_ADD_DEVICE = 105,
|
|
|
|
/// device has been removed by p2p offload
|
|
|
|
P2PO_DEL_DEVICE = 106,
|
|
|
|
/// WNM event to notify STA enter sleep mode
|
|
|
|
WNM_STA_SLEEP = 107,
|
|
|
|
/// Indication of MAC tx failures (exhaustion of 802.11 retries) exceeding threshold(s)
|
|
|
|
TXFAIL_THRESH = 108,
|
|
|
|
/// Proximity Detection event
|
|
|
|
PROXD = 109,
|
|
|
|
/// AWDL RX Probe response
|
|
|
|
AWDL_RX_PRB_RESP = 111,
|
|
|
|
/// AWDL RX Action Frames
|
|
|
|
AWDL_RX_ACT_FRAME = 112,
|
|
|
|
/// AWDL Wowl nulls
|
|
|
|
AWDL_WOWL_NULLPKT = 113,
|
|
|
|
/// AWDL Phycal status
|
|
|
|
AWDL_PHYCAL_STATUS = 114,
|
|
|
|
/// AWDL OOB AF status
|
|
|
|
AWDL_OOB_AF_STATUS = 115,
|
|
|
|
/// Interleaved Scan status
|
|
|
|
AWDL_SCAN_STATUS = 116,
|
|
|
|
/// AWDL AW Start
|
|
|
|
AWDL_AW_START = 117,
|
|
|
|
/// AWDL AW End
|
|
|
|
AWDL_AW_END = 118,
|
|
|
|
/// AWDL AW Extensions
|
|
|
|
AWDL_AW_EXT = 119,
|
|
|
|
AWDL_PEER_CACHE_CONTROL = 120,
|
|
|
|
CSA_START_IND = 121,
|
|
|
|
CSA_DONE_IND = 122,
|
|
|
|
CSA_FAILURE_IND = 123,
|
|
|
|
/// CCA based channel quality report
|
|
|
|
CCA_CHAN_QUAL = 124,
|
|
|
|
/// to report change in BSSID while roaming
|
|
|
|
BSSID = 125,
|
|
|
|
/// tx error indication
|
|
|
|
TX_STAT_ERROR = 126,
|
|
|
|
/// credit check for BCMC supported
|
|
|
|
BCMC_CREDIT_SUPPORT = 127,
|
|
|
|
/// psta primary interface indication
|
|
|
|
PSTA_PRIMARY_INTF_IND = 128,
|
|
|
|
/// Handover Request Initiated
|
|
|
|
BT_WIFI_HANDOVER_REQ = 130,
|
|
|
|
/// Southpaw TxInhibit notification
|
|
|
|
SPW_TXINHIBIT = 131,
|
|
|
|
/// FBT Authentication Request Indication
|
|
|
|
FBT_AUTH_REQ_IND = 132,
|
|
|
|
/// Enhancement addition for RSSI
|
|
|
|
RSSI_LQM = 133,
|
|
|
|
/// Full probe/beacon (IEs etc) results
|
|
|
|
PFN_GSCAN_FULL_RESULT = 134,
|
|
|
|
/// Significant change in rssi of bssids being tracked
|
|
|
|
PFN_SWC = 135,
|
|
|
|
/// a STA been authroized for traffic
|
|
|
|
AUTHORIZED = 136,
|
|
|
|
/// probe req with wl_event_rx_frame_data_t header
|
|
|
|
PROBREQ_MSG_RX = 137,
|
|
|
|
/// PFN completed scan of network list
|
|
|
|
PFN_SCAN_COMPLETE = 138,
|
|
|
|
/// RMC Event
|
|
|
|
RMC_EVENT = 139,
|
|
|
|
/// DPSTA interface indication
|
|
|
|
DPSTA_INTF_IND = 140,
|
|
|
|
/// RRM Event
|
|
|
|
RRM = 141,
|
|
|
|
/// ULP entry event
|
|
|
|
ULP = 146,
|
|
|
|
/// TCP Keep Alive Offload Event
|
|
|
|
TKO = 151,
|
|
|
|
/// authentication request received
|
|
|
|
EXT_AUTH_REQ = 187,
|
|
|
|
/// authentication request received
|
|
|
|
EXT_AUTH_FRAME_RX = 188,
|
|
|
|
/// mgmt frame Tx complete
|
|
|
|
MGMT_FRAME_TXSTATUS = 189,
|
|
|
|
/// highest val + 1 for range checking
|
|
|
|
LAST = 190,
|
|
|
|
}
|
2023-03-01 19:03:46 +01:00
|
|
|
|
2023-04-02 20:19:47 +02:00
|
|
|
// TODO this PubSub can probably be replaced with shared memory to make it a bit more efficient.
|
|
|
|
pub type EventQueue = PubSubChannel<NoopRawMutex, Message, 2, 1, 1>;
|
|
|
|
pub type EventSubscriber<'a> = Subscriber<'a, NoopRawMutex, Message, 2, 1, 1>;
|
|
|
|
|
|
|
|
pub struct Events {
|
|
|
|
pub queue: EventQueue,
|
|
|
|
pub mask: SharedEventMask,
|
|
|
|
}
|
|
|
|
|
|
|
|
impl Events {
|
|
|
|
pub fn new() -> Self {
|
|
|
|
Self {
|
|
|
|
queue: EventQueue::new(),
|
|
|
|
mask: SharedEventMask::default(),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2023-03-01 19:03:46 +01:00
|
|
|
|
|
|
|
#[derive(Clone, Copy)]
|
|
|
|
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
2023-04-02 20:19:47 +02:00
|
|
|
pub struct Status {
|
2023-03-01 19:03:46 +01:00
|
|
|
pub event_type: Event,
|
|
|
|
pub status: u32,
|
|
|
|
}
|
2023-04-02 20:19:47 +02:00
|
|
|
|
|
|
|
#[derive(Clone, Copy)]
|
|
|
|
pub enum Payload {
|
|
|
|
None,
|
2023-03-30 17:05:29 +02:00
|
|
|
BssInfo(BssInfo),
|
2023-04-02 20:19:47 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
#[derive(Clone, Copy)]
|
|
|
|
|
|
|
|
pub struct Message {
|
|
|
|
pub header: Status,
|
|
|
|
pub payload: Payload,
|
|
|
|
}
|
|
|
|
|
|
|
|
impl Message {
|
|
|
|
pub fn new(status: Status, payload: Payload) -> Self {
|
|
|
|
Self {
|
|
|
|
header: status,
|
|
|
|
payload,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#[derive(Default)]
|
|
|
|
struct EventMask {
|
2023-04-25 18:38:17 +02:00
|
|
|
mask: [u32; Self::WORD_COUNT],
|
2023-04-02 20:19:47 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
impl EventMask {
|
2023-04-25 18:38:17 +02:00
|
|
|
const WORD_COUNT: usize = ((Event::LAST as u32 + (u32::BITS - 1)) / u32::BITS) as usize;
|
|
|
|
|
2023-04-02 20:19:47 +02:00
|
|
|
fn enable(&mut self, event: Event) {
|
|
|
|
let n = event as u32;
|
2023-04-25 18:38:17 +02:00
|
|
|
let word = n / u32::BITS;
|
|
|
|
let bit = n % u32::BITS;
|
2023-04-02 20:19:47 +02:00
|
|
|
|
2023-03-30 17:05:29 +02:00
|
|
|
self.mask[word as usize] |= 1 << bit;
|
2023-04-02 20:19:47 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
fn disable(&mut self, event: Event) {
|
|
|
|
let n = event as u32;
|
2023-04-25 18:38:17 +02:00
|
|
|
let word = n / u32::BITS;
|
|
|
|
let bit = n % u32::BITS;
|
2023-04-02 20:19:47 +02:00
|
|
|
|
|
|
|
self.mask[word as usize] &= !(1 << bit);
|
|
|
|
}
|
|
|
|
|
|
|
|
fn is_enabled(&self, event: Event) -> bool {
|
|
|
|
let n = event as u32;
|
2023-04-25 18:38:17 +02:00
|
|
|
let word = n / u32::BITS;
|
|
|
|
let bit = n % u32::BITS;
|
2023-04-02 20:19:47 +02:00
|
|
|
|
|
|
|
self.mask[word as usize] & (1 << bit) > 0
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#[derive(Default)]
|
|
|
|
|
|
|
|
pub struct SharedEventMask {
|
|
|
|
mask: RefCell<EventMask>,
|
|
|
|
}
|
|
|
|
|
|
|
|
impl SharedEventMask {
|
|
|
|
pub fn enable(&self, events: &[Event]) {
|
|
|
|
let mut mask = self.mask.borrow_mut();
|
|
|
|
for event in events {
|
|
|
|
mask.enable(*event);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-03-30 17:05:29 +02:00
|
|
|
#[allow(dead_code)]
|
2023-04-02 20:19:47 +02:00
|
|
|
pub fn disable(&self, events: &[Event]) {
|
|
|
|
let mut mask = self.mask.borrow_mut();
|
|
|
|
for event in events {
|
|
|
|
mask.disable(*event);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
pub fn disable_all(&self) {
|
|
|
|
let mut mask = self.mask.borrow_mut();
|
|
|
|
mask.mask = Default::default();
|
|
|
|
}
|
|
|
|
|
|
|
|
pub fn is_enabled(&self, event: Event) -> bool {
|
|
|
|
let mask = self.mask.borrow();
|
|
|
|
mask.is_enabled(event)
|
|
|
|
}
|
|
|
|
}
|