| // Copyright 2019 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be found |
| // in the LICENSE file. |
| |
| library ddk.protocol.wlanif; |
| |
| using ddk.hw.wlan.ieee80211; |
| using ddk.hw.wlan.wlaninfo; |
| using ddk.protocol.ethernet; |
| using ddk.protocol.wlan.info; |
| using zx; |
| |
| enum WlanScanType : uint8 { |
| ACTIVE = 1; |
| PASSIVE = 2; |
| }; |
| |
| /// IEEE Std 802.11-2016, 9.4.2.2 |
| const uint32 WLAN_SCAN_MAX_SSIDS = 32; |
| |
| struct WlanifSsid { |
| uint8 len; |
| array<uint8>:WLAN_MAX_SSID_LEN data; |
| }; |
| |
| const usize WLAN_ETH_ALEN = 6; |
| |
| struct WlanifScanReq { |
| uint64 txn_id; |
| ddk.protocol.wlan.info.WlanBssType bss_type; |
| array<uint8>:WLAN_ETH_ALEN bssid; |
| WlanifSsid ssid; |
| WlanScanType scan_type; |
| uint32 probe_delay; |
| usize num_channels; |
| array<uint8>:WLAN_INFO_CHANNEL_LIST_MAX_CHANNELS channel_list; |
| uint32 min_channel_time; |
| uint32 max_channel_time; |
| usize num_ssids; |
| array<WlanifSsid>:WLAN_SCAN_MAX_SSIDS ssid_list; |
| }; |
| |
| /// IEEE Std 802.11-2016, 9.4.2.25.1 |
| const uint32 WLAN_RSNE_MAX_LEN = 255; |
| const uint32 WLAN_VIE_MAX_LEN = 255; |
| |
| struct WlanifBssDescription { |
| array<uint8>:WLAN_ETH_ALEN bssid; |
| WlanifSsid ssid; |
| ddk.protocol.wlan.info.WlanBssType bss_type; |
| uint32 beacon_period; |
| uint32 dtim_period; |
| uint64 timestamp; |
| uint64 local_time; |
| uint16 cap; |
| /// Concatenation of SuppRates and ExtSuppRates - MSB indicates basic rate |
| /// IEEE Std 802.11-2016, 9.4.2.3 & 9.4.2.13 |
| array<uint8>:WLAN_MAC_MAX_RATES rates; |
| uint16 num_rates; |
| |
| usize rsne_len; |
| array<uint8>:WLAN_RSNE_MAX_LEN rsne; |
| usize vendor_ie_len; |
| array<uint8>:WLAN_VIE_MAX_LEN vendor_ie; |
| |
| ddk.protocol.wlan.info.WlanChannel chan; |
| int8 rssi_dbm; |
| int8 snr_db; |
| int16 rcpi_dbmh; |
| int16 rsni_dbh; |
| }; |
| |
| const uint32 WLAN_MAX_OP_RATES = 12; |
| |
| struct WlanifJoinReq { |
| WlanifBssDescription selected_bss; |
| uint32 join_failure_timeout; |
| uint32 nav_sync_delay; |
| usize num_op_rates; |
| array<uint8>:WLAN_MAX_OP_RATES op_rates; |
| }; |
| |
| enum WlanAuthType : uint8 { |
| OPEN_SYSTEM = 1; |
| SHARED_KEY = 2; |
| FAST_BSS_TRANSITION = 3; |
| SAE = 4; |
| }; |
| |
| struct WlanifAuthReq { |
| array<uint8>:WLAN_ETH_ALEN peer_sta_address; |
| WlanAuthType auth_type; |
| uint32 auth_failure_timeout; |
| }; |
| |
| struct WlanifAuthInd { |
| array<uint8>:WLAN_ETH_ALEN peer_sta_address; |
| WlanAuthType auth_type; |
| }; |
| |
| /// Deauthentication reasons: IEEE Std 802.11-2016, 9.4.1.7 (Table 9-45) |
| enum WlanDeauthReason : uint16 { |
| /// 0 Reserved |
| UNSPECIFIED = 1; |
| INVALID_AUTHENTICATION = 2; |
| LEAVING_NETWORK_DEAUTH = 3; |
| INACTIVITY = 4; |
| NO_MORE_STAS = 5; |
| INVALID_CLASS2_FRAME = 6; |
| INVALID_CLASS3_FRAME = 7; |
| LEAVING_NETWORK_DISASSOC = 8; |
| NOT_AUTHENTICATED = 9; |
| UNACCEPTABLE_POWER_CA = 10; |
| UNACCEPTABLE_SUPPORTED_CHANNELS = 11; |
| BSS_TRANSITION_DISASSOC = 12; |
| INVALID_ELEMENT = 13; |
| MIC_FAILURE = 14; |
| FOURWAY_HANDSHAKE_TIMEOUT = 15; |
| GK_HANDSHAKE_TIMEOUT = 16; |
| HANDSHAKE_ELEMENT_MISMATCH = 17; |
| INVALID_GROUP_CIPHER = 18; |
| INVALID_PAIRWISE_CIPHER = 19; |
| INVALID_AKMP = 20; |
| UNSUPPORTED_RSNE_VERSION = 21; |
| INVALID_RSNE_CAPABILITIES = 22; |
| IEEE802_1_X_AUTH_FAILED = 23; |
| CIPHER_OUT_OF_POLICY = 24; |
| TDLS_PEER_UNREACHABLE = 25; |
| TDLS_UNSPECIFIED = 26; |
| SSP_REQUESTED_DISASSOC = 27; |
| NO_SSP_ROAMING_AGREEMENT = 28; |
| BAD_CIPHER_OR_AKM = 29; |
| NOT_AUTHORIZED_THIS_LOCATION = 30; |
| SERVICE_CHANGE_PRECLUDES_TS = 31; |
| UNSPECIFIED_QOS = 32; |
| NOT_ENOUGH_BANDWIDTH = 33; |
| MISSING_ACKS = 34; |
| EXCEEDED_TXOP = 35; |
| STA_LEAVING = 36; |
| /// Values 37 and 38 are overloaded but should be clear from context. |
| END_TS_BA_DLS = 37; |
| UNKNOWN_TS_BA = 38; |
| TIMEOUT = 39; |
| /// 40-44 Reserved |
| PEERKEY_MISMATCH = 45; |
| PEER_INITIATED = 46; |
| AP_INITIATED = 47; |
| INVALID_FT_ACTION_FRAME_COUNT = 48; |
| INVALID_PMKID = 49; |
| INVALID_MDE = 50; |
| INVALID_FTE = 51; |
| MESH_PEERING_CANCELED = 52; |
| MESH_MAX_PEERS = 53; |
| MESH_CONFIGURATION_POLICY_VIOLATION = 54; |
| MESH_CLOSE_RCVD = 55; |
| MESH_MAX_RETRIES = 56; |
| MESH_CONFIRM_TIMEOUT = 57; |
| MESH_INVALID_GTK = 58; |
| MESH_INCONSISTENT_PARAMETERS = 59; |
| MESH_INVALID_SECURITY_CAPABILITY = 60; |
| MESH_PATH_ERROR_NO_PROXY_INFORMATION = 61; |
| MESH_PATH_ERROR_NO_FORWARDING_INFORMATION = 62; |
| MESH_PATH_ERROR_DESTINATION_UNREACHABLE = 63; |
| MAC_ADDRESS_ALREADY_EXISTS_IN_MBSS = 64; |
| MESH_CHANNEL_SWITCH_REGULATORY_REQUIREMENTS = 65; |
| MESH_CHANNEL_SWITCH_UNSPECIFIED = 66; |
| // 67 - 65535 Reserved |
| }; |
| |
| struct WlanifDeauthReq { |
| array<uint8>:WLAN_ETH_ALEN peer_sta_address; |
| WlanDeauthReason reason_code; |
| }; |
| |
| struct WlanifAssocReq { |
| array<uint8>:WLAN_ETH_ALEN peer_sta_address; |
| usize rsne_len; |
| array<uint8>:WLAN_RSNE_MAX_LEN rsne; |
| usize vendor_ie_len; |
| array<uint8>:WLAN_VIE_MAX_LEN vendor_ie; |
| }; |
| |
| struct WlanifAssocInd { |
| array<uint8>:WLAN_ETH_ALEN peer_sta_address; |
| uint16 listen_interval; |
| WlanifSsid ssid; |
| usize rsne_len; |
| array<uint8>:WLAN_RSNE_MAX_LEN rsne; |
| usize vendor_ie_len; |
| array<uint8>:WLAN_VIE_MAX_LEN vendor_ie; |
| }; |
| |
| struct WlanifDisassocReq { |
| array<uint8>:WLAN_ETH_ALEN peer_sta_address; |
| uint16 reason_code; |
| }; |
| |
| struct WlanifResetReq { |
| array<uint8>:WLAN_ETH_ALEN sta_address; |
| bool set_default_mib; |
| }; |
| |
| struct WlanifStartReq { |
| WlanifSsid ssid; |
| ddk.protocol.wlan.info.WlanBssType bss_type; |
| uint32 beacon_period; |
| uint32 dtim_period; |
| uint8 channel; |
| usize rsne_len; |
| array<uint8>:WLAN_RSNE_MAX_LEN rsne; |
| usize vendor_ie_len; |
| array<uint8>:WLAN_VIE_MAX_LEN vendor_ie; |
| }; |
| |
| struct WlanifStopReq { |
| WlanifSsid ssid; |
| }; |
| |
| struct SetKeyDescriptor { |
| vector<uint8> key; |
| uint16 key_id; |
| ddk.protocol.wlan.info.WlanKeyType key_type; |
| array<uint8>:WLAN_ETH_ALEN address; |
| uint64 rsc; |
| array<uint8>:3 cipher_suite_oui; |
| uint8 cipher_suite_type; |
| }; |
| |
| const uint32 WLAN_MAX_KEYLIST_SIZE = 4; |
| |
| struct WlanifSetKeysReq { |
| usize num_keys; |
| array<SetKeyDescriptor>:WLAN_MAX_KEYLIST_SIZE keylist; |
| }; |
| |
| struct DeleteKeyDescriptor { |
| uint16 key_id; |
| ddk.protocol.wlan.info.WlanKeyType key_type; |
| array<uint8>:WLAN_ETH_ALEN address; |
| }; |
| |
| struct WlanifDelKeysReq { |
| usize num_keys; |
| array<DeleteKeyDescriptor>:WLAN_MAX_KEYLIST_SIZE keylist; |
| }; |
| |
| struct WlanifEapolReq { |
| array<uint8>:WLAN_ETH_ALEN src_addr; |
| array<uint8>:WLAN_ETH_ALEN dst_addr; |
| vector<uint8> data; |
| }; |
| |
| /// Bits used to request management frame subtypes to be captured. Also used by driver to indicate |
| /// which management frame subtypes are supported for capture. |
| /// |
| /// These values are set at `1 << MgmtFrameSubtypeValue` |
| /// See IEEE Std 802.11-2016, 9.2.4.1.3, for value of each management frame subtype |
| enum WlanMgmtCaptureFlag : uint32 { |
| ASSOC_REQ = 0x1; |
| ASSOC_RESP = 0x2; |
| REASSOC_REQ = 0x4; |
| REASSOC_RESP = 0x8; |
| PROBE_REQ = 0x10; |
| PROBE_RESP = 0x20; |
| TIMING_AD = 0x40; |
| |
| BEACON = 0x100; |
| ATIM = 0x200; |
| DISASSOC = 0x400; |
| AUTH = 0x800; |
| DEAUTH = 0x1000; |
| ACTION = 0x2000; |
| ACTION_NO_ACK = 0x4000; |
| }; |
| |
| struct WlanifStartCaptureFramesReq { |
| uint32 mgmt_frame_flags; |
| }; |
| |
| struct WlanifStartCaptureFramesResp { |
| int32 status; |
| uint32 supported_mgmt_frames; |
| }; |
| |
| struct WlanifScanResult { |
| uint64 txn_id; |
| WlanifBssDescription bss; |
| }; |
| |
| enum WlanScanResult : uint8 { |
| SUCCESS = 0; |
| NOT_SUPPORTED = 1; |
| INVALID_ARGS = 2; |
| INTERNAL_ERROR = 3; |
| }; |
| |
| struct WlanifScanEnd { |
| uint64 txn_id; |
| WlanScanResult code; |
| }; |
| |
| enum WlanJoinResult : uint8 { |
| SUCCESS = 0; |
| FAILURE_TIMEOUT = 1; |
| }; |
| |
| struct WlanifJoinConfirm { |
| WlanJoinResult result_code; |
| }; |
| |
| enum WlanAuthResult : uint8 { |
| SUCCESS = 0; |
| REFUSED = 1; |
| ANTI_CLOGGING_TOKEN_REQUIRED = 2; |
| FINITE_CYCLIC_GROUP_NOT_SUPPORTED = 3; |
| REJECTED = 4; |
| FAILURE_TIMEOUT = 5; |
| }; |
| |
| struct WlanifAuthConfirm { |
| array<uint8>:WLAN_ETH_ALEN peer_sta_address; |
| WlanAuthType auth_type; |
| WlanAuthResult result_code; |
| }; |
| |
| struct WlanifAuthResp { |
| array<uint8>:WLAN_ETH_ALEN peer_sta_address; |
| WlanAuthResult result_code; |
| }; |
| |
| struct WlanifDeauthConfirm { |
| array<uint8>:WLAN_ETH_ALEN peer_sta_address; |
| }; |
| |
| struct WlanifDeauthIndication { |
| array<uint8>:WLAN_ETH_ALEN peer_sta_address; |
| WlanDeauthReason reason_code; |
| }; |
| |
| enum WlanAssocResult : uint8 { |
| SUCCESS = 0; |
| REFUSED_REASON_UNSPECIFIED = 1; |
| REFUSED_NOT_AUTHENTICATED = 2; |
| REFUSED_CAPABILITIES_MISMATCH = 3; |
| REFUSED_EXTERNAL_REASON = 4; |
| REFUSED_AP_OUT_OF_MEMORY = 5; |
| REFUSED_BASIC_RATES_MISMATCH = 6; |
| REJECTED_EMERGENCY_SERVICES_NOT_SUPPORTED = 7; |
| REFUSED_TEMPORARILY = 8; |
| }; |
| |
| struct WlanifAssocConfirm { |
| WlanAssocResult result_code; |
| uint16 association_id; |
| }; |
| |
| struct WlanifAssocResp { |
| array<uint8>:WLAN_ETH_ALEN peer_sta_address; |
| WlanAssocResult result_code; |
| uint16 association_id; |
| }; |
| |
| struct WlanifDisassocConfirm { |
| int32 status; |
| }; |
| |
| struct WlanifDisassocIndication { |
| array<uint8>:WLAN_ETH_ALEN PeerStaAddress; |
| WlanDeauthReason reason_code; |
| }; |
| |
| enum WlanStartResult : uint8 { |
| SUCCESS = 0; |
| BSS_ALREADY_STARTED_OR_JOINED = 1; |
| RESET_REQUIRED_BEFORE_START = 2; |
| NOT_SUPPORTED = 3; |
| }; |
| |
| struct WlanifStartConfirm { |
| WlanStartResult result_code; |
| }; |
| |
| enum WlanStopResult : uint8 { |
| SUCCESS = 0; |
| BSS_ALREADY_STOPPED = 1; |
| INTERNAL_ERROR = 2; |
| }; |
| |
| struct WlanifStopConfirm { |
| WlanStopResult result_code; |
| }; |
| |
| enum WlanEapolResult : uint8 { |
| SUCCESS = 0; |
| TRANSMISSION_FAILURE = 1; |
| }; |
| |
| struct WlanifEapolConfirm { |
| WlanEapolResult result_code; |
| }; |
| |
| struct WlanifSignalReportIndication { |
| int8 rssi_dbm; |
| int8 snr_db; |
| }; |
| |
| struct WlanifEapolIndication { |
| array<uint8>:WLAN_ETH_ALEN src_addr; |
| array<uint8>:WLAN_ETH_ALEN dst_addr; |
| vector<uint8> data; |
| }; |
| |
| struct WlanifBandCapabilities { |
| /// Values from enum Band (WLAN_BAND_*) |
| uint8 band_id; |
| usize num_rates; |
| array<uint16>:WLAN_INFO_BAND_INFO_MAX_RATES rates; |
| uint16 base_frequency; |
| usize num_channels; |
| array<uint8>:WLAN_INFO_CHANNEL_LIST_MAX_CHANNELS channels; |
| bool ht_supported; |
| ddk.hw.wlan.ieee80211.Ieee80211HtCapabilities ht_caps; |
| bool vht_supported; |
| ddk.hw.wlan.ieee80211.Ieee80211VhtCapabilities vht_caps; |
| }; |
| |
| enum WlanifFeature : uint32 { |
| /// Supports DMA buffer transfer protocol |
| DMA = 0x1; |
| /// Synthetic (i.e., non-physical) device |
| SYNTH = 0x2; |
| }; |
| |
| struct WlanifQueryInfo { |
| array<uint8>:WLAN_ETH_ALEN mac_addr; |
| /// WLAN_MAC_ROLE_* |
| uint8 role; |
| /// WLANIF_FEATURE_* |
| uint32 features; |
| usize num_bands; |
| array<WlanifBandCapabilities>:WLAN_INFO_MAX_BANDS bands; |
| /// WLAN_DRIVER_FEATURE_* |
| uint32 driver_features; |
| }; |
| |
| struct WlanifCounter { |
| uint64 count; |
| string name; |
| }; |
| |
| struct WlanifPacketCounter { |
| WlanifCounter in; |
| WlanifCounter out; |
| WlanifCounter drop; |
| WlanifCounter in_bytes; |
| WlanifCounter out_bytes; |
| WlanifCounter drop_bytes; |
| }; |
| |
| struct WlanifDispatcherStats { |
| WlanifPacketCounter any_packet; |
| WlanifPacketCounter mgmt_frame; |
| WlanifPacketCounter ctrl_frame; |
| WlanifPacketCounter data_frame; |
| }; |
| |
| struct WlanifRssiStats { |
| vector<uint64> hist; |
| }; |
| |
| enum WlanifMlmeStatsType : uint8 { |
| CLIENT = 0; |
| AP = 1; |
| }; |
| |
| struct WlanifClientMlmeStats { |
| WlanifPacketCounter svc_msg; |
| WlanifPacketCounter data_frame; |
| WlanifPacketCounter mgmt_frame; |
| WlanifPacketCounter tx_frame; |
| WlanifPacketCounter rx_frame; |
| WlanifRssiStats assoc_data_rssi; |
| WlanifRssiStats beacon_rssi; |
| }; |
| |
| struct WlanifApMlmeStats { |
| WlanifPacketCounter not_used; |
| }; |
| |
| union StatsUnion { |
| WlanifClientMlmeStats client_mlme_stats; |
| WlanifApMlmeStats ap_mlme_stats; |
| }; |
| |
| struct WlanifMlmeStats { |
| WlanifMlmeStatsType tag; |
| StatsUnion stats; |
| }; |
| |
| struct WlanifStats { |
| WlanifDispatcherStats dispatcher_stats; |
| vector<WlanifMlmeStats> mlme_stats; |
| }; |
| |
| struct WlanifStatsQueryResponse { |
| WlanifStats stats; |
| }; |
| |
| struct WlanifCapturedFrameResult { |
| vector<uint8> data; |
| }; |
| |
| struct WlanifChannelSwitchInfo { |
| uint8 new_channel; |
| }; |
| |
| [Layout = "ddk-interface"] |
| protocol WlanifImplIfc { |
| // MLME operations |
| OnScanResult(WlanifScanResult result) -> (); |
| OnScanEnd(WlanifScanEnd end) -> (); |
| JoinConf(WlanifJoinConfirm resp) -> (); |
| AuthConf(WlanifAuthConfirm resp) -> (); |
| AuthInd(WlanifAuthInd resp) -> (); |
| DeauthConf(WlanifDeauthConfirm resp) -> (); |
| DeauthInd(WlanifDeauthIndication ind) -> (); |
| AssocConf(WlanifAssocConfirm resp) -> (); |
| AssocInd(WlanifAssocInd resp) -> (); |
| DisassocConf(WlanifDisassocConfirm resp) -> (); |
| DisassocInd(WlanifDisassocIndication ind) -> (); |
| StartConf(WlanifStartConfirm resp) -> (); |
| StopConf(WlanifStopConfirm resp) -> (); |
| EapolConf(WlanifEapolConfirm resp) -> (); |
| |
| // MLME extensions |
| SignalReport(WlanifSignalReportIndication ind) -> (); |
| EapolInd(WlanifEapolIndication ind) -> (); |
| StatsQueryResp(WlanifStatsQueryResponse resp) -> (); |
| RelayCapturedFrame(WlanifCapturedFrameResult result) -> (); |
| |
| // Data operations |
| DataRecv(vector<voidptr> data, uint32 flags) -> (); |
| }; |
| |
| [Layout = "ddk-protocol"] |
| protocol WlanifImpl { |
| // Lifecycle operations |
| Start(WlanifImplIfc ifc) -> (zx.status status, handle<channel> sme_channel); |
| Stop() -> (); |
| |
| // State operation |
| Query() -> (WlanifQueryInfo info); |
| |
| // MLME operations |
| StartScan(WlanifScanReq req) -> (); |
| JoinReq(WlanifJoinReq req) -> (); |
| AuthReq(WlanifAuthReq req) -> (); |
| AuthResp(WlanifAuthResp resp) -> (); |
| DeauthReq(WlanifDeauthReq req) -> (); |
| AssocReq(WlanifAssocReq req) -> (); |
| AssocResp(WlanifAssocResp resp) -> (); |
| DisassocReq(WlanifDisassocReq req) -> (); |
| ResetReq(WlanifResetReq req) -> (); |
| StartReq(WlanifStartReq req) -> (); |
| StopReq(WlanifStopReq req) -> (); |
| SetKeysReq(WlanifSetKeysReq req) -> (); |
| DelKeysReq(WlanifDelKeysReq req) -> (); |
| EapolReq(WlanifEapolReq req) -> (); |
| |
| // MLME extensions |
| StatsQueryReq() -> (); |
| StartCaptureFrames(WlanifStartCaptureFramesReq req) -> (WlanifStartCaptureFramesResp resp); |
| StopCaptureFrames() -> (); |
| |
| // Configuration operations |
| SetMulticastPromisc(bool enable) -> (zx.status status); |
| |
| // Data operations |
| [Async] |
| DataQueueTx(uint32 options, ddk.protocol.ethernet.EthernetNetbuf? netbuf) -> |
| (zx.status status, ddk.protocol.ethernet.EthernetNetbuf? netbuf); |
| |
| }; |
| |