blob: 1ea78b1ccacd3fd08d9adaaba89a9d7eee1ea242 [file] [log] [blame]
// Copyright 2017 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 fuchsia.wlan.mlme;
using fuchsia.wlan.common;
using fuchsia.wlan.mesh;
// Stub types for communicating between the wlan service and the MLME drivers. Based on the 802.11
// MLME SAP interface (IEEE Std 802.11-2016 section 6.3).
// TODO(NET-631): restore the commented out enum aliases
// MLME-SCAN.request (IEEE Std 802.11-2016 6.3.3.2)
enum BSSTypes {
INFRASTRUCTURE = 1;
PERSONAL = 2;
INDEPENDENT = 3;
MESH = 4;
ANY_BSS = 5;
//LAST = ANY_BSS;
};
enum ScanTypes {
ACTIVE = 1;
PASSIVE = 2;
//LAST = PASSIVE;
};
struct ScanRequest {
uint64 txn_id;
BSSTypes bss_type;
array<uint8>:6 bssid;
bytes:32 ssid;
ScanTypes scan_type;
uint32 probe_delay; // in TimeUnits
vector<uint8>? channel_list;
uint32 min_channel_time; // in TimeUnits
uint32 max_channel_time; // in TimeUnits
// RequestInformation
vector<bytes:32>? ssid_list;
// ChannelUsage
// AccessNetworkType
// HESSID
// Mesh ID
// DiscoveryMode
// VendorSpecificInfo
};
// MLME-SCAN.confirm (IEEE Std 802.11-2016 6.3.3.3)
// IEEE Std 802.11-2016, 9.4.1.4
struct CapabilityInfo {
bool ess;
bool ibss;
bool cf_pollable;
bool cf_poll_req;
bool privacy;
bool short_preamble;
bool spectrum_mgmt;
bool qos;
bool short_slot_time;
bool apsd;
bool radio_msmt;
bool delayed_block_ack;
bool immediate_block_ack;
};
// IEEE Std 802.11-2016, 9.4.2.56
enum ChanWidthSet : uint8 {
TWENTY_ONLY = 0;
TWENTY_FORTY = 1;
};
enum SmPowerSave : uint8 {
STATIC = 0;
DYNAMIC = 1;
RESERVED = 2;
DISABLED = 3;
};
enum MaxAmsduLen : uint8 {
OCTETS_3839 = 0;
OCTETS_7935 = 1;
};
struct HtCapabilityInfo {
bool ldpc_coding_cap;
uint8 chan_width_set; // see enum ChanWidthSet
uint8 sm_power_save; // see enum SmPowerSave
bool greenfield;
bool short_gi_20;
bool short_gi_40;
bool tx_stbc;
uint8 rx_stbc;
bool delayed_block_ack;
uint8 max_amsdu_len; // see enum MaxAmsduLen
bool dsss_in_40;
bool intolerant_40;
bool lsig_txop_protect;
};
enum MinMpduStartSpacing : uint8 {
NO_RESTRICT = 0;
QUARTER_USEC = 1;
HALF_USEC = 2;
ONE_USEC = 3;
TWO_USEC = 4;
FOUR_USEC = 5;
EIGHT_USEC = 6;
SIXTEEN_USEC = 7;
};
struct AmpduParams {
uint8 exponent;
uint8 min_start_spacing; // see enum MinMpduStartSpacing
};
// SupportedMcsSet
// IEEE Std 802.11-2016, 9.4.2.56.4 Table 9-164
struct SupportedMcsSet {
// Names are deviated from //garnet/lib/wlan/common/include/wlan/common/element.h's class SupportedMcsSet
uint64 rx_mcs_set; // bitmask indicating MCS 0-63 support
// MCS 64-76 not supported
uint16 rx_highest_rate; // Mbps
bool tx_mcs_set_defined;
bool tx_rx_diff;
uint8 tx_max_ss; // Actual count, different from IEEE spec
bool tx_ueqm; // Transmit Unequal Modulation
};
// HtExtCapabilities
// IEEE Std 802.11-2016, 9.4.2.56.5 Table 9-165
enum PcoTransitionTime : uint8 {
PCO_RESERVED = 0; // Often translated as "No transition".
PCO_400_USEC = 1;
PCO_1500_USEC = 2;
PCO_5000_USEC = 3;
};
enum McsFeedback : uint8 {
MCS_NOFEEDBACK = 0;
MCS_RESERVED = 1;
MCS_UNSOLICIED = 2;
MCS_BOTH = 3;
};
struct HtExtCapabilities {
bool pco;
uint8 pco_transition; // see enum PcoTransitionTime
uint8 mcs_feedback; // see enum McsFeedback
bool htc_ht_support;
bool rd_responder;
};
// TxBfCapability
// IEEE Std 802.11-2016, 9.4.2.56.6 Table 9-166
enum Calibration : uint8 {
CALIBRATION_NONE = 0;
CALIBRATION_RESPOND_NOINITIATE = 1;
CALIBRATION_RESERVED = 2;
CALIBRATION_RESPOND_INITIATE = 3;
};
enum Feedback : uint8 {
// Shared for csi_feedback, noncomp_feedback, comp_feedback
FEEDBACK_NONE = 0;
FEEDBACK_DELAYED = 1;
FEEDBACK_IMMEDIATE = 2;
FEEDBACK_DELAYED_IMMEDIATE = 3;
};
enum MinGroup : uint8 {
MIN_GROUP_ONE = 0; // Meaning no grouping
MIN_GROUP_ONE_TWO = 1;
MIN_GROUP_ONE_FOUR = 2;
MIN_GROUP_ONE_TWO_FOUR = 3;
};
struct TxBfCapability {
bool implicit_rx;
bool rx_stag_sounding;
bool tx_stag_sounding;
bool rx_ndp;
bool tx_ndp;
bool implicit;
uint8 calibration; // see enum Calibration
bool csi; // Explicit CsI Transmit Beamforming
bool noncomp_steering; // Explicit Noncompressed Steering
bool comp_steering; // Explicit Compressed Steering
uint8 csi_feedback; // see enum Feedback
uint8 noncomp_feedback; // see enum Feedback
uint8 comp_feedback; // see enum Feedback
uint8 min_grouping; // see enum MinGroup
uint8 csi_antennas; // Actual count, different from IEEE spec
uint8 noncomp_steering_ants; // Actual count, different from IEEE spec
uint8 comp_steering_ants; // Actual count, different from IEEE spec
uint8 csi_rows; // Actual count, different from IEEE spec
uint8 chan_estimation; // Actual count, different from IEEE spec
};
// IEEE Std 802.11-2016, 9.4.2.56.7 Table 9-167
struct AselCapability {
bool asel;
bool csi_feedback_tx_asel; // Explicit CSI Feedback Based Transmit ASEL
bool ant_idx_feedback_tx_asel;
bool explicit_csi_feedback;
bool antenna_idx_feedback;
bool rx_asel;
bool tx_sounding_ppdu;
};
struct HtCapabilities {
// Note, a minimum granuality of adding fields selectively is
// a group of BitField structure, as defined in element.h
HtCapabilityInfo ht_cap_info;
AmpduParams ampdu_params;
SupportedMcsSet mcs_set;
HtExtCapabilities ht_ext_cap;
TxBfCapability txbf_cap;
AselCapability asel_cap;
};
// HT Operation Element
// IEEE Std 802.11-2016 9.4.2.57 Table 9-168
// HTOperationInfo
enum SecChanOffset : uint8 {
SECONDARY_NONE = 0; // No secondary channel
SECONDARY_ABOVE = 1; // Secondary channel is above the primary channel
RESERVED = 2;
SECONDARY_BELOW = 3; // Secondary channel is below the primary channel
};
enum StaChanWidth : uint8 {
TWENTY = 0; // 20 MHz
ANY = 1; // Any in the Supported Channel Width set
};
enum HtProtect : uint8 {
NONE = 0;
NONMEMBER = 1;
TWENTY_MHZ = 2;
NON_HT_MIXED = 3;
};
struct HTOperationInfo {
uint8 secondary_chan_offset; // see enum SecChanOffset
uint8 sta_chan_width; // see enum StaChanWidth
bool rifs_mode;
uint8 ht_protect; // see enum HtProtect
bool nongreenfield_present; // Nongreenfield HT STAs present
bool obss_non_ht; // OBSS Non-HT STAs present
uint8 center_freq_seg2; // VHT
bool dual_beacon;
bool dual_cts_protect;
bool stbc_beacon;
bool lsig_txop_protect;
bool pco_active;
bool pco_phase;
};
struct HtOperation {
uint8 primary_chan; // Primary 20 MHz channel.
HTOperationInfo ht_op_info;
SupportedMcsSet basic_mcs_set;
};
enum MaxMpduLen : uint8 {
OCTETS_3895 = 0;
OCTETS_7991 = 1;
OCTETS_11454 = 2;
};
enum VhtLinkAdaptation : uint8 {
NO_FEEDBACK = 0;
// 1 reserved
UNSOLICITED = 2;
BOTH = 3;
};
// IEEE Std 802.11-2016, 9.4.2.158.2
struct VhtCapabilitiesInfo {
uint8 max_mpdu_len; // see enum MaxMpduLen
uint8 supported_cbw_set;
bool rx_ldpc;
bool sgi_cbw80;
bool sgi_cbw160;
bool tx_stbc;
uint8 rx_stbc; // number of spatial streams supported. [0, 4] are valid. [5, 7] are reserved.
bool su_bfer;
bool su_bfee;
uint8 bfee_sts; // Maximum number of STS - 1, if su_bfee is true. Reserved otherwise.
uint8 num_sounding;
bool mu_bfer;
bool mu_bfee;
bool txop_ps;
bool htc_vht;
uint8 max_ampdu_exp;
uint8 link_adapt; // see enum VhtLinkAdaptation
bool rx_ant_pattern;
bool tx_ant_pattern;
uint8 ext_nss_bw;
};
enum VhtMcs : uint8 {
SET_0_TO_7 = 0;
SET_0_TO_8 = 1;
SET_0_TO_9 = 2;
SET_NONE = 3;
};
// IEEE Std 802.11-2016 9.4.2.158.3
struct VhtMcsNss {
array<uint8>:8 rx_max_mcs; // idx 0 for ss1, .. idx 7 for ss8. See enum VhtMcs
uint16 rx_max_data_rate; // Mbps
uint8 max_nsts;
array<uint8>:8 tx_max_mcs; // idx 0 for ss1, .. idx 7 for ss8. See enum VhtMcs
uint16 tx_max_data_rate; // Mbps
bool ext_nss_bw;
};
// IEEE Std 802.11-2016, Figure 9-562
struct BasicVhtMcsNss {
array<uint8>:8 max_mcs; // idx 0 for ss1, .. idx 7 for ss8. See enum VhtMcs
};
// IEEE Std 802.11-2016 9.5.2.158
struct VhtCapabilities {
VhtCapabilitiesInfo vht_cap_info;
VhtMcsNss vht_mcs_nss;
};
// IEEE Std 802.11-2016 deprecates the use of CBW_160, CBW_80P80
enum VhtCbw : uint8 {
CBW_20_40 = 0;
CBW_80_160_80P80 = 1;
CBW_160 = 2;
CBW_80P80 = 3;
};
// IEEE Std 802.11-2016 9.5.2.159
struct VhtOperation {
uint8 vht_cbw; // see enum VhtCbw
uint8 center_freq_seg0; // channel number
uint8 center_freq_seg1; // channel number
BasicVhtMcsNss basic_mcs;
};
// IEEE Std 802.11-2016 6.3.3.3.2
struct BSSDescription {
array<uint8>:6 bssid;
bytes:32 ssid;
BSSTypes bss_type;
uint16 beacon_period; // in TU
uint8 dtim_period;
uint64 timestamp;
uint64 local_time;
CapabilityInfo cap;
vector<uint8> basic_rate_set; // in 0.5 Mbps, valid value: 1-127. See Table 9-78 for 126, 127.
vector<uint8> op_rate_set; // in 0.5 Mbps, valid value: 1-127. See Table 9-78 for 126, 127.
bytes? country;
// TODO(hahnr): This field represents an IE and should thus be named RSNE.
bytes? rsn;
int16 rcpi_dbmh; // 0.5 step dBm. Do not use encoding from IEEE Std 802.11-2016 9.4.2.38.
int16 rsni_dbh; // 0.5 step dB. Do not use encoding from IEEE Std 802.11-2016 9.4.2.41.
HtCapabilities? ht_cap;
HtOperation? ht_op;
VhtCapabilities? vht_cap;
VhtOperation? vht_op;
// List up non-standard, Fuchsia only parameters
fuchsia.wlan.common.WlanChan chan;
int8 rssi_dbm; // dBm
};
enum ScanResultCodes {
SUCCESS = 0;
NOT_SUPPORTED = 1;
INVALID_ARGS = 2;
INTERNAL_ERROR = 3;
};
struct ScanResult {
uint64 txn_id;
BSSDescription bss;
};
struct ScanEnd {
uint64 txn_id;
ScanResultCodes code;
};
// MLME-JOIN.request (IEEE Std 802.11-2016, 6.3.4.2)
struct JoinRequest {
BSSDescription selected_bss;
uint32 join_failure_timeout;
uint32 nav_sync_delay;
vector<uint16> op_rate_set;
// Combined with what MLME knows about the device capabilities,
// following parameters determine what to be advertised to the peer
// (in AssociationRequest). Effectively this way replaces the following
// fields originally defined in MLME-JOIN.request
// - Capability Information
// - HT Capabilities
// - VHT Capabilities
// - Extended Capabilities
fuchsia.wlan.common.PHY phy;
fuchsia.wlan.common.CBW cbw;
};
// MLME-JOIN.confirm (IEEE Std 802.11-2016, 6.3.4.3)
enum JoinResultCodes {
SUCCESS = 0;
JOIN_FAILURE_TIMEOUT = 1;
//LAST = JOIN_FAILURE_TIMEOUT;
};
struct JoinConfirm {
JoinResultCodes result_code;
};
// MLME-AUTHENTICATE.request (IEEE Std 802.11-2016, 6.3.5.2)
enum AuthenticationTypes {
OPEN_SYSTEM = 1;
SHARED_KEY = 2;
FAST_BSS_TRANSITION = 3;
SAE = 4;
//LAST = SAE;
};
struct AuthenticateRequest {
array<uint8>:6 peer_sta_address;
AuthenticationTypes auth_type;
uint32 auth_failure_timeout;
// etc
};
// MLME-AUTHENTICATE.confirm (IEEE Std 802.11-2016, 6.3.5.3)
enum AuthenticateResultCodes {
SUCCESS = 0;
REFUSED = 1;
ANTI_CLOGGING_TOKEN_REQUIRED = 2;
FINITE_CYCLIC_GROUP_NOT_SUPPORTED = 3;
AUTHENTICATION_REJECTED = 4;
AUTH_FAILURE_TIMEOUT = 5;
//LAST = AUTH_FAILURE_TIMEOUT;
};
struct AuthenticateConfirm {
array<uint8>:6 peer_sta_address;
AuthenticationTypes auth_type;
AuthenticateResultCodes result_code;
// etc
};
// MLME-AUTHENTICATE.indication (IEEE Std 802.11-2016, 6.3.5.4)
struct AuthenticateIndication {
array<uint8>:6 peer_sta_address;
AuthenticationTypes auth_type;
// etc
};
// MLME-AUTHENTICATE.response (IEEE Std 802.11-2016, 6.3.5.5)
struct AuthenticateResponse {
array<uint8>:6 peer_sta_address;
AuthenticateResultCodes result_code;
// etc
};
// MLME-DEAUTHENTICATE.request (IEEE Std 802.11-2016, 6.3.6.2)
// IEEE Std 802.11-2016, 9.4.1.7, Table 9-45
enum ReasonCode : uint16 {
// 0 Reserved
UNSPECIFIED_REASON = 1;
INVALID_AUTHENTICATION = 2;
LEAVING_NETWORK_DEAUTH = 3;
REASON_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;
REASON_INVALID_ELEMENT = 13;
MIC_FAILURE = 14;
FOURWAY_HANDSHAKE_TIMEOUT = 15;
GK_HANDSHAKE_TIMEOUT = 16;
HANDSHAKE_ELEMENT_MISMATCH = 17;
REASON_INVALID_GROUP_CIPHER = 18;
REASON_INVALID_PAIRWISE_CIPHER = 19;
REASON_INVALID_AKMP = 20;
UNSUPPORTED_RSNE_VERSION = 21;
INVALID_RSNE_CAPABILITIES = 22;
IEEE802_1_X_AUTH_FAILED = 23;
REASON_CIPHER_OUT_OF_POLICY = 24;
TDLS_PEER_UNREACHABLE = 25;
TDLS_UNSPECIFIED_REASON = 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_REASON = 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;
REASON_INVALID_FT_ACTION_FRAME_COUNT = 48;
REASON_INVALID_PMKID = 49;
REASON_INVALID_MDE = 50;
REASON_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 DeauthenticateRequest {
array <uint8>:6 peer_sta_address;
// TODO(tkilbourn): define a ReasonCode enum for FIDL
ReasonCode reason_code;
// VendorSpecificInfo
};
// MLME-DEAUTHENTICATE.confirm (IEEE Std 802.11-2016, 6.3.6.3)
struct DeauthenticateConfirm {
array <uint8>:6 peer_sta_address;
};
// MLME-DEAUTHENTICATE.indication (IEEE Std 802.11-2016, 6.3.6.4)
struct DeauthenticateIndication {
array<uint8>:6 peer_sta_address;
// TODO(tkilbourn): define a ReasonCode enum for FIDL
ReasonCode reason_code;
// VendorSpecificInfo
};
// MLME-ASSOCIATE.request (IEEE Std 802.11-2016, 6.3.7.2)
struct AssociateRequest {
array<uint8>:6 peer_sta_address;
// TODO(hahnr): This field represents an IE and should thus be named RSNE.
bytes? rsn;
// etc
};
// MLME-ASSOCIATE.confrm (IEEE Std 802.11-2016, 6.3.7.3)
enum AssociateResultCodes {
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 AssociateConfirm {
AssociateResultCodes result_code;
// CapabilityInformation
uint16 association_id;
// etc
};
// MLME-ASSOCIATE.indication (IEEE Std 802.11-2016, 6.3.7.4)
struct AssociateIndication {
array<uint8>:6 peer_sta_address;
// CapabilityInformation
uint16 listen_interval;
bytes? ssid;
// OperationalRateSet
// BSSMembershipSelectorSet
bytes? rsn;
// etc
};
// MLME-ASSOCIATE.response (IEEE Std 802.11-2016, 6.3.7.5)
struct AssociateResponse {
array<uint8>:6 peer_sta_address;
AssociateResultCodes result_code;
uint16 association_id;
// etc
};
// MLME-DISASSOCIATE.request (IEEE Std 802.11-2016, 6.3.9.1)
struct DisassociateRequest {
array<uint8>:6 peer_sta_address;
// TODO(tkilbourn): define a ReasonCode enum for FIDL
uint16 reason_code;
// VendorSpecificInfo
};
// MLME-DISASSOCIATE.confirm (IEEE Std 802.11-2016, 6.3.9.2)
struct DisassociateConfirm {
int32 status;
};
// MLME-DISASSOCIATE.indication (IEEE Std 802.11-2016, 6.3.9.3)
struct DisassociateIndication {
array<uint8>:6 peer_sta_address;
// TODO(tkilbourn): define a ReasonCode enum for FIDL
uint16 reason_code;
// VendorSpecificInfo
};
// MLME-RESET.request (IEEE Std 802.11-2016, 6.3.10.2)
struct ResetRequest {
array<uint8>:6 sta_address;
bool set_default_mib;
};
// MLME-START.request (IEEE Std 802.11-2016, 6.3.11.2)
// See dot11CountryString of IEEE Std 802.11-2016, Annex C
const uint8 countryEnvironAll = 32; // an ASCII ' ' character
const uint8 countryEnvironOutdoor = 79; // an ASCII 'O' character
const uint8 countryEnvironIndoor = 73; // an ASCII 'I' character
const uint8 countryEnvironNonCountry = 88; // an ASCII 'X' character
// Information derived from Country Element, IEEE Std 802.11-2016, 9.4.2.9.
struct Country {
array<uint8>:2 alpha2; // ISO 3116-1
// countryEnviron constant from above
// or Operating Class Table number from IEEE Std 802.11-2016 Annex D.
uint8 suffix;
};
struct StartRequest {
bytes:32 ssid;
BSSTypes bss_type;
uint16 beacon_period; // in TU
uint8 dtim_period;
// PHY parameter sets
uint8 channel;
// TODO(porce): Conditionally present. See IEEE Std 802.11-2016, 10.2, 11.8, 11.10.
// See also dot11MultiDomainCapabilityActivated.
Country country;
bytes:32 mesh_id;
// TODO(hahnr): Add additional elements.
// Although MLME-START.request is used to start a BSS, IEEE does not include an RSNE in this
// primitive. However, IEEE doesn't define any other primitive to configure the RSN after its
// BSS was started. The RSNE must be available when the BSS is started, and thus, this is the
// right place to transfer the RSNE to the MLME.
bytes? rsne;
// Combined with what MLME knows about the device capabilities,
// following parameters determine what to be advertised to the peer
// (in Beacons/ProbeResponse/AssociationResponse). Effectively this way replaces the following
// fields originally defined in MLME-START.request.
// TODO(WLAN-909): Replace phy and cbw with full-fledged parameters below.
// - Capability Information
// - HT Capabilities
// - HT Operation
// - VHT Capabilities
// - VHT Operation
// - Extended Capabilities
fuchsia.wlan.common.PHY phy;
fuchsia.wlan.common.CBW cbw;
};
// MLME-START.confirm (IEEE Std 802.11-2016, 6.3.11.3)
enum StartResultCodes {
SUCCESS = 0;
BSS_ALREADY_STARTED_OR_JOINED = 1;
RESET_REQUIRED_BEFORE_START = 2;
NOT_SUPPORTED = 3;
INTERNAL_ERROR = 4;
};
struct StartConfirm {
StartResultCodes result_code;
};
// MLME-STOP.request (IEEE Std 802.11-2016, 6.3.12.2)
struct StopRequest {
bytes:32 ssid;
};
enum StopResultCodes {
SUCCESS = 0;
BSS_ALREADY_STOPPED = 1;
INTERNAL_ERROR = 2;
};
struct StopConfirm {
StopResultCodes result_code;
};
// MLME-SETKEYS.request (IEEE Std 802.11-2016 6.3.19.1)
enum KeyType {
GROUP = 1;
PAIRWISE = 2;
PEER_KEY = 3;
IGTK = 4;
};
struct SetKeyDescriptor {
// Specs specify a bit string, we use byte array.
bytes key;
uint16 key_id;
KeyType key_type;
array<uint8>:6 address;
array<uint8>:8 rsc;
array<uint8>:3 cipher_suite_oui;
uint8 cipher_suite_type;
};
struct SetKeysRequest {
vector<SetKeyDescriptor> keylist;
};
// MLME-DELETEKEYS.request (IEEE Std 802.11-2016 6.3.20.1)
struct DeleteKeyDescriptor {
uint16 key_id;
KeyType key_type;
array<uint8>:6 address;
};
struct DeleteKeysRequest {
vector<DeleteKeyDescriptor> keylist;
};
// MLME-EAPOL.request (IEEE Std 802.11-2016 6.3.22.1)
struct EapolRequest {
array<uint8>:6 src_addr;
array<uint8>:6 dst_addr;
bytes data;
};
// MLME-EAPOL.confirm (IEEE Std 802.11-2016 6.3.22.2)
enum EapolResultCodes {
SUCCESS = 0;
TRANSMISSION_FAILURE = 1;
//LAST = TRANSMISSION_FAILURE;
};
struct EapolConfirm {
EapolResultCodes result_code;
};
// IEEE Std 802.11-2016, 9.4.2.98
struct MeshConfiguration {
uint8 active_path_sel_proto_id;
uint8 active_path_sel_metric_id;
uint8 congest_ctrl_method_id;
uint8 sync_method_id;
uint8 auth_proto_id;
uint8 mesh_formation_info;
uint8 mesh_capability;
};
// Fields that are common between the MPM Open and Confirm actions
struct MeshPeeringCommon {
array<uint8>:6 peer_sta_address;
uint16 protocol_id;
uint16 local_link_id;
bytes:32 mesh_id;
vector<uint8> rates;
MeshConfiguration mesh_config;
HtCapabilities? ht_cap;
HtOperation? ht_op;
VhtCapabilities? vht_cap;
VhtOperation? vht_op;
};
// IEEE Std 802.11-2016, 9.6.16.2.2
struct MeshPeeringOpenAction {
MeshPeeringCommon common;
};
// IEEE Std 802.11-2016, 9.6.16.3.2
struct MeshPeeringConfirmAction {
MeshPeeringCommon common;
uint16 aid;
uint16 peer_link_id;
};
struct MeshPeeringParams {
array<uint8>:6 peer_sta_address;
uint16 local_aid;
vector<uint8> rates;
// TODO(gbonik): HT/VHT caps
};
struct GetMeshPathTableRequest {
uint8 dummy;
};
// Because these methods rely on an external entity to provide a response, events are used instead
// of return values.
protocol MLME {
// ==== 01xxxx: scanning ====
// We deviate from the spec here in order to support incremental scan
// results easily. We could stay closer to 802.11ai, but the protocol
// that is described there is more difficult to implement correctly.
// Initiate a scan transaction. The caller is responsible for filling
// the `txn_id` field in `req` with a unique number that will be used
// to identify the transaction.
//
// Zero or more `OnScanResult` events with a matching `txn_id` will be sent
// in response.
//
// At the end on the transaction, whether it is successful or not,
// a `OnScanEnd` event with a matching `txn_id` is guaranteed to be sent
// in response (unless the channel is closed first).
//
// After `OnScanEnd`, no further events with the same `txn_id` shall be sent.
StartScan(ScanRequest req);
// An incremental scan result containing information about a single BSS.
// Only one event per unique BSSID per transaction will be sent.
-> OnScanResult(ScanResult result);
// An event that signals the end of a scan transaction.
-> OnScanEnd(ScanEnd end);
// ====
JoinReq(JoinRequest req);
-> JoinConf(JoinConfirm resp);
AuthenticateReq(AuthenticateRequest req);
-> AuthenticateConf(AuthenticateConfirm resp);
-> AuthenticateInd(AuthenticateIndication ind);
AuthenticateResp(AuthenticateResponse resp);
DeauthenticateReq(DeauthenticateRequest req);
-> DeauthenticateConf(DeauthenticateConfirm resp);
-> DeauthenticateInd(DeauthenticateIndication ind);
AssociateReq(AssociateRequest req);
-> AssociateConf(AssociateConfirm resp);
-> AssociateInd(AssociateIndication ind);
AssociateResp(AssociateResponse resp);
DisassociateReq(DisassociateRequest req);
-> DisassociateConf(DisassociateConfirm resp);
-> DisassociateInd(DisassociateIndication ind);
ResetReq(ResetRequest req);
StartReq(StartRequest req);
-> StartConf(StartConfirm resp);
StopReq(StopRequest req);
-> StopConf(StopConfirm resp);
SetKeysReq(SetKeysRequest req);
DeleteKeysReq(DeleteKeysRequest req);
EapolReq(EapolRequest req);
-> EapolConf(EapolConfirm resp);
// The following are extensions to the 802.11 MLME SAP interface.
// ==== Mesh ===
-> IncomingMpOpenAction(MeshPeeringOpenAction action);
SendMpOpenAction(MeshPeeringOpenAction action);
-> IncomingMpConfirmAction(MeshPeeringConfirmAction action);
SendMpConfirmAction(MeshPeeringConfirmAction action);
MeshPeeringEstablished(MeshPeeringParams peering);
GetMeshPathTableReq(GetMeshPathTableRequest req) -> (fuchsia.wlan.mesh.MeshPathTable table);
-> SignalReport(SignalReportIndication ind);
-> EapolInd(EapolIndication ind);
SetControlledPort(SetControlledPortRequest req);
QueryDeviceInfo() -> (DeviceInfo info);
StatsQueryReq();
-> StatsQueryResp(StatsQueryResponse resp);
ListMinstrelPeers() -> (MinstrelListResponse resp);
GetMinstrelStats(MinstrelStatsRequest req) -> (MinstrelStatsResponse resp);
};