1*4882a593Smuzhiyun /* 2*4882a593Smuzhiyun * Fundamental types and constants relating to WFA MBO 3*4882a593Smuzhiyun * (Multiband Operation) 4*4882a593Smuzhiyun * Portions of this code are copyright (c) 2021 Cypress Semiconductor Corporation 5*4882a593Smuzhiyun * 6*4882a593Smuzhiyun * Copyright (C) 1999-2017, Broadcom Corporation 7*4882a593Smuzhiyun * 8*4882a593Smuzhiyun * Unless you and Broadcom execute a separate written software license 9*4882a593Smuzhiyun * agreement governing use of this software, this software is licensed to you 10*4882a593Smuzhiyun * under the terms of the GNU General Public License version 2 (the "GPL"), 11*4882a593Smuzhiyun * available at http://www.broadcom.com/licenses/GPLv2.php, with the 12*4882a593Smuzhiyun * following added to such license: 13*4882a593Smuzhiyun * 14*4882a593Smuzhiyun * As a special exception, the copyright holders of this software give you 15*4882a593Smuzhiyun * permission to link this software with independent modules, and to copy and 16*4882a593Smuzhiyun * distribute the resulting executable under terms of your choice, provided that 17*4882a593Smuzhiyun * you also meet, for each linked independent module, the terms and conditions of 18*4882a593Smuzhiyun * the license of that module. An independent module is a module which is not 19*4882a593Smuzhiyun * derived from this software. The special exception does not apply to any 20*4882a593Smuzhiyun * modifications of the software. 21*4882a593Smuzhiyun * 22*4882a593Smuzhiyun * Notwithstanding the above, under no circumstances may you combine this 23*4882a593Smuzhiyun * software in any way with any other Broadcom software provided under a license 24*4882a593Smuzhiyun * other than the GPL, without Broadcom's express prior written consent. 25*4882a593Smuzhiyun * 26*4882a593Smuzhiyun * 27*4882a593Smuzhiyun * <<Broadcom-WL-IPTag/Open:>> 28*4882a593Smuzhiyun * 29*4882a593Smuzhiyun * $Id$ 30*4882a593Smuzhiyun */ 31*4882a593Smuzhiyun 32*4882a593Smuzhiyun #ifndef _MBO_H_ 33*4882a593Smuzhiyun #define _MBO_H_ 34*4882a593Smuzhiyun 35*4882a593Smuzhiyun /* This marks the start of a packed structure section. */ 36*4882a593Smuzhiyun #include <packed_section_start.h> 37*4882a593Smuzhiyun 38*4882a593Smuzhiyun /* WiFi MBO OUI values */ 39*4882a593Smuzhiyun #define MBO_OUI WFA_OUI /* WiFi OUI 50:6F:9A */ 40*4882a593Smuzhiyun /* oui_type field identifying the type and version of the MBO IE. */ 41*4882a593Smuzhiyun #define MBO_OUI_TYPE WFA_OUI_TYPE_MBO /* OUI Type/Version */ 42*4882a593Smuzhiyun /* IEEE 802.11 vendor specific information element. */ 43*4882a593Smuzhiyun #define MBO_IE_ID 0xdd 44*4882a593Smuzhiyun 45*4882a593Smuzhiyun /* MBO ATTR related macros */ 46*4882a593Smuzhiyun #define MBO_ATTR_ID_OFF 0 47*4882a593Smuzhiyun #define MBO_ATTR_LEN_OFF 1 48*4882a593Smuzhiyun #define MBO_ATTR_DATA_OFF 2 49*4882a593Smuzhiyun 50*4882a593Smuzhiyun #define MBO_ATTR_ID_LEN 1 /* Attr ID field length */ 51*4882a593Smuzhiyun #define MBO_ATTR_LEN_LEN 1 /* Attr Length field length */ 52*4882a593Smuzhiyun #define MBO_ATTR_HDR_LEN 2 /* ID + 1-byte length field */ 53*4882a593Smuzhiyun 54*4882a593Smuzhiyun /* MBO subelemts related */ 55*4882a593Smuzhiyun #define MBO_SUBELEM_ID 0xdd 56*4882a593Smuzhiyun #define MBO_SUBELEM_OUI WFA_OUI 57*4882a593Smuzhiyun 58*4882a593Smuzhiyun #define MBO_SUBELEM_ID_LEN 1 /* SubElement ID field length */ 59*4882a593Smuzhiyun #define MBO_SUBELEM_LEN_LEN 1 /* SubElement length field length */ 60*4882a593Smuzhiyun #define MBO_SUBELEM_HDR_LEN 6 /* ID + length + OUI + OUY TYPE */ 61*4882a593Smuzhiyun 62*4882a593Smuzhiyun #define MBO_NON_PREF_CHAN_SUBELEM_LEN_LEN(L) (7 + (L)) /* value of length field */ 63*4882a593Smuzhiyun #define MBO_NON_PREF_CHAN_SUBELEM_TOT_LEN(L) \ 64*4882a593Smuzhiyun (MBO_SUBELEM_ID_LEN + MBO_SUBELEM_LEN_LEN + MBO_NON_PREF_CHAN_SUBELEM_LEN_LEN(L)) 65*4882a593Smuzhiyun /* MBO attributes as defined in the mbo spec */ 66*4882a593Smuzhiyun enum { 67*4882a593Smuzhiyun MBO_ATTR_MBO_AP_CAPABILITY = 1, 68*4882a593Smuzhiyun MBO_ATTR_NON_PREF_CHAN_REPORT = 2, 69*4882a593Smuzhiyun MBO_ATTR_CELL_DATA_CAP = 3, 70*4882a593Smuzhiyun MBO_ATTR_ASSOC_DISALLOWED = 4, 71*4882a593Smuzhiyun MBO_ATTR_CELL_DATA_CONN_PREF = 5, 72*4882a593Smuzhiyun MBO_ATTR_TRANS_REASON_CODE = 6, 73*4882a593Smuzhiyun MBO_ATTR_TRANS_REJ_REASON_CODE = 7, 74*4882a593Smuzhiyun MBO_ATTR_ASSOC_RETRY_DELAY = 8 75*4882a593Smuzhiyun }; 76*4882a593Smuzhiyun 77*4882a593Smuzhiyun typedef BWL_PRE_PACKED_STRUCT struct wifi_mbo_ie_s { 78*4882a593Smuzhiyun uint8 id; /* IE ID: MBO_IE_ID 0xDD */ 79*4882a593Smuzhiyun uint8 len; /* IE length */ 80*4882a593Smuzhiyun uint8 oui[WFA_OUI_LEN]; /* MBO_OUI 50:6F:9A */ 81*4882a593Smuzhiyun uint8 oui_type; /* MBO_OUI_TYPE 0x16 */ 82*4882a593Smuzhiyun uint8 attr[1]; /* var len attributes */ 83*4882a593Smuzhiyun } BWL_POST_PACKED_STRUCT wifi_mbo_ie_t; 84*4882a593Smuzhiyun 85*4882a593Smuzhiyun #define MBO_IE_HDR_SIZE (OFFSETOF(wifi_mbo_ie_t, attr)) 86*4882a593Smuzhiyun /* oui:3 bytes + oui type:1 byte */ 87*4882a593Smuzhiyun #define MBO_IE_NO_ATTR_LEN 4 88*4882a593Smuzhiyun 89*4882a593Smuzhiyun /* MBO AP Capability Attribute */ 90*4882a593Smuzhiyun typedef BWL_PRE_PACKED_STRUCT struct wifi_mbo_ap_cap_ind_attr_s { 91*4882a593Smuzhiyun /* Attribute ID - 0x01. */ 92*4882a593Smuzhiyun uint8 id; 93*4882a593Smuzhiyun /* Length of the following fields in the attribute */ 94*4882a593Smuzhiyun uint8 len; 95*4882a593Smuzhiyun /* AP capability bitmap */ 96*4882a593Smuzhiyun uint8 cap_ind; 97*4882a593Smuzhiyun } BWL_POST_PACKED_STRUCT wifi_mbo_ap_cap_ind_attr_t; 98*4882a593Smuzhiyun 99*4882a593Smuzhiyun /* MBO AP Capability Indication Field Values */ 100*4882a593Smuzhiyun #define MBO_AP_CAP_IND_CELLULAR_AWARE 0x40 101*4882a593Smuzhiyun 102*4882a593Smuzhiyun /* Non-preferred Channel Report Attribute */ 103*4882a593Smuzhiyun #define MBO_NON_PREF_CHAN_ATTR_OPCALSS_OFF 2 104*4882a593Smuzhiyun #define MBO_NON_PREF_CHAN_ATTR_CHANLIST_OFF 3 105*4882a593Smuzhiyun #define MBO_NON_PREF_CHAN_ATTR_PREF_OFF(L) \ 106*4882a593Smuzhiyun (MBO_NON_PREF_CHAN_ATTR_CHANLIST_OFF + (L)) 107*4882a593Smuzhiyun 108*4882a593Smuzhiyun #define MBO_NON_PREF_CHAN_ATTR_OPCALSS_LEN 1 109*4882a593Smuzhiyun #define MBO_NON_PREF_CHAN_ATTR_PREF_LEN 1 110*4882a593Smuzhiyun #define MBO_NON_PREF_CHAN_ATTR_REASON_LEN 1 111*4882a593Smuzhiyun 112*4882a593Smuzhiyun #define MBO_NON_PREF_CHAN_ATTR_LEN(L) ((L) + 3) 113*4882a593Smuzhiyun #define MBO_NON_PREF_CHAN_ATTR_TOT_LEN(L) (MBO_ATTR_HDR_LEN + (L) + 3) 114*4882a593Smuzhiyun 115*4882a593Smuzhiyun /* attribute len - (opclass + Pref + Reason) */ 116*4882a593Smuzhiyun #define MBO_NON_PREF_CHAN_ATTR_CHANLIST_LEN(L) ((L) - 3) 117*4882a593Smuzhiyun 118*4882a593Smuzhiyun /* MBO Non-preferred Channel Report: "Preference" field value */ 119*4882a593Smuzhiyun enum { 120*4882a593Smuzhiyun MBO_STA_NON_OPERABLE_BAND_CHAN = 0, 121*4882a593Smuzhiyun MBO_STA_NON_PREFERRED_BAND_CHAN = 1, 122*4882a593Smuzhiyun MBO_STA_PREFERRED_BAND_CHAN = 255 123*4882a593Smuzhiyun }; 124*4882a593Smuzhiyun 125*4882a593Smuzhiyun /* MBO Non-preferred Channel Report: "Reason Code" field value */ 126*4882a593Smuzhiyun enum { 127*4882a593Smuzhiyun MBO_NON_PREF_CHAN_RC_UNSPECIFIED = 0, 128*4882a593Smuzhiyun MBO_NON_PREF_CHAN_RC_BCN_STRENGTH = 1, 129*4882a593Smuzhiyun MBO_NON_PREF_CHAN_RC_CO_LOC_INTERFERENCE = 2, 130*4882a593Smuzhiyun MBO_NON_PREF_CHAN_RC_IN_DEV_INTERFERENCE = 3 131*4882a593Smuzhiyun }; 132*4882a593Smuzhiyun 133*4882a593Smuzhiyun /* Cellular Data Capability Attribute */ 134*4882a593Smuzhiyun typedef BWL_PRE_PACKED_STRUCT struct wifi_mbo_cell_data_cap_attr_s { 135*4882a593Smuzhiyun /* Attribute ID - 0x03. */ 136*4882a593Smuzhiyun uint8 id; 137*4882a593Smuzhiyun /* Length of the following fields in the attribute */ 138*4882a593Smuzhiyun uint8 len; 139*4882a593Smuzhiyun /* MBO STA's cellular capability */ 140*4882a593Smuzhiyun uint8 cell_conn; 141*4882a593Smuzhiyun } BWL_POST_PACKED_STRUCT wifi_mbo_cell_data_cap_attr_t; 142*4882a593Smuzhiyun 143*4882a593Smuzhiyun /* MBO Cellular Data Capability: "Cellular Connectivity" field value */ 144*4882a593Smuzhiyun enum { 145*4882a593Smuzhiyun MBO_CELL_DATA_CONN_AVAILABLE = 1, 146*4882a593Smuzhiyun MBO_CELL_DATA_CONN_NOT_AVAILABLE = 2, 147*4882a593Smuzhiyun MBO_CELL_DATA_CONN_NOT_CAPABLE = 3 148*4882a593Smuzhiyun }; 149*4882a593Smuzhiyun 150*4882a593Smuzhiyun /* Association Disallowed attribute */ 151*4882a593Smuzhiyun typedef BWL_PRE_PACKED_STRUCT struct wifi_mbo_assoc_disallowed_attr_s { 152*4882a593Smuzhiyun /* Attribute ID - 0x04. */ 153*4882a593Smuzhiyun uint8 id; 154*4882a593Smuzhiyun /* Length of the following fields in the attribute */ 155*4882a593Smuzhiyun uint8 len; 156*4882a593Smuzhiyun /* Reason of not accepting new association */ 157*4882a593Smuzhiyun uint8 reason_code; 158*4882a593Smuzhiyun } BWL_POST_PACKED_STRUCT wifi_mbo_assoc_disallowed_attr_t; 159*4882a593Smuzhiyun 160*4882a593Smuzhiyun /* Association Disallowed attr Reason code field values */ 161*4882a593Smuzhiyun enum { 162*4882a593Smuzhiyun MBO_ASSOC_DISALLOWED_RC_UNSPECIFIED = 1, 163*4882a593Smuzhiyun MBO_ASSOC_DISALLOWED_RC_MAX_STA_REACHED = 2, 164*4882a593Smuzhiyun MBO_ASSOC_DISALLOWED_RC_AIR_IFACE_OVERLOADED = 3, 165*4882a593Smuzhiyun MBO_ASSOC_DISALLOWED_RC_AUTH_SRVR_OVERLOADED = 4, 166*4882a593Smuzhiyun MBO_ASSOC_DISALLOWED_RC_INSUFFIC_RSSI = 5, 167*4882a593Smuzhiyun MBO_ASSOC_DISALLOWED_RC_INVALID = 0xffff 168*4882a593Smuzhiyun }; 169*4882a593Smuzhiyun 170*4882a593Smuzhiyun /* Cellular Data Conn Pref attribute */ 171*4882a593Smuzhiyun typedef BWL_PRE_PACKED_STRUCT struct wifi_mbo_cell_data_conn_pref_attr_s { 172*4882a593Smuzhiyun /* Attribute ID - 0x05. */ 173*4882a593Smuzhiyun uint8 id; 174*4882a593Smuzhiyun /* Length of the following fields in the attribute */ 175*4882a593Smuzhiyun uint8 len; 176*4882a593Smuzhiyun /* Preference value of cellular connection */ 177*4882a593Smuzhiyun uint8 cell_pref; 178*4882a593Smuzhiyun } BWL_POST_PACKED_STRUCT wifi_mbo_cell_data_conn_pref_attr_t; 179*4882a593Smuzhiyun 180*4882a593Smuzhiyun /* Cellular Data Conn Pref attr: Cellular Pref field values */ 181*4882a593Smuzhiyun enum { 182*4882a593Smuzhiyun MBO_CELLULAR_DATA_CONN_EXCLUDED = 1, 183*4882a593Smuzhiyun MBO_CELLULAR_DATA_CONN_NOT_PREFERRED = 2, 184*4882a593Smuzhiyun MBO_CELLULAR_DATA_CONN_PREFERRED = 255 185*4882a593Smuzhiyun }; 186*4882a593Smuzhiyun 187*4882a593Smuzhiyun /* Transition Reason Code Attribute */ 188*4882a593Smuzhiyun typedef BWL_PRE_PACKED_STRUCT struct wifi_mbo_trans_reason_code_attr_s { 189*4882a593Smuzhiyun /* Attribute ID - 0x06. */ 190*4882a593Smuzhiyun uint8 id; 191*4882a593Smuzhiyun /* Length of the following fields in the attribute */ 192*4882a593Smuzhiyun uint8 len; 193*4882a593Smuzhiyun /* Reason of transition recommendation */ 194*4882a593Smuzhiyun uint8 trans_reason_code; 195*4882a593Smuzhiyun } BWL_POST_PACKED_STRUCT wifi_mbo_trans_reason_code_attr_t; 196*4882a593Smuzhiyun 197*4882a593Smuzhiyun /* Transition Reason Code Attr: trans reason code field values */ 198*4882a593Smuzhiyun enum { 199*4882a593Smuzhiyun MBO_TRANS_REASON_UNSPECIFIED = 0, 200*4882a593Smuzhiyun MBO_TRANS_REASON_EXCESSV_FRM_LOSS_RATE = 1, 201*4882a593Smuzhiyun MBO_TRANS_REASON_EXCESSV_TRAFFIC_DELAY = 2, 202*4882a593Smuzhiyun MBO_TRANS_REASON_INSUFF_BW = 3, 203*4882a593Smuzhiyun MBO_TRANS_REASON_LOAD_BALANCING = 4, 204*4882a593Smuzhiyun MBO_TRANS_REASON_LOW_RSSI = 5, 205*4882a593Smuzhiyun MBO_TRANS_REASON_EXCESSV_RETRANS_RCVD = 6, 206*4882a593Smuzhiyun MBO_TRANS_REASON_HIGH_INTERFERENCE = 7, 207*4882a593Smuzhiyun MBO_TRANS_REASON_GRAY_ZONE = 8, 208*4882a593Smuzhiyun MBO_TRANS_REASON_PREMIUM_AP_TRANS = 9 209*4882a593Smuzhiyun }; 210*4882a593Smuzhiyun 211*4882a593Smuzhiyun /* Transition Rejection Reason Code Attribute */ 212*4882a593Smuzhiyun typedef BWL_PRE_PACKED_STRUCT struct wifi_mbo_trans_rej_reason_code_attr_s { 213*4882a593Smuzhiyun /* Attribute ID - 0x07. */ 214*4882a593Smuzhiyun uint8 id; 215*4882a593Smuzhiyun /* Length of the following fields in the attribute */ 216*4882a593Smuzhiyun uint8 len; 217*4882a593Smuzhiyun /* Reason of transition rejection */ 218*4882a593Smuzhiyun uint8 trans_rej_reason_code; 219*4882a593Smuzhiyun } BWL_POST_PACKED_STRUCT wifi_mbo_trans_rej_reason_code_attr_t; 220*4882a593Smuzhiyun 221*4882a593Smuzhiyun /* Transition Rej Reason Code Attr: trans rej reason code field values */ 222*4882a593Smuzhiyun enum { 223*4882a593Smuzhiyun MBO_TRANS_REJ_REASON_UNSPECIFIED = 0, 224*4882a593Smuzhiyun MBO_TRANS_REJ_REASON_EXSSIV_FRM_LOSS_RATE = 1, 225*4882a593Smuzhiyun MBO_TRANS_REJ_REASON_EXSSIV_TRAFFIC_DELAY = 2, 226*4882a593Smuzhiyun MBO_TRANS_REJ_REASON_INSUFF_QOS_CAPACITY = 3, 227*4882a593Smuzhiyun MBO_TRANS_REJ_REASON_LOW_RSSI = 4, 228*4882a593Smuzhiyun MBO_TRANS_REJ_REASON_HIGH_INTERFERENCE = 5, 229*4882a593Smuzhiyun MBO_TRANS_REJ_REASON_SERVICE_UNAVAIL = 6 230*4882a593Smuzhiyun }; 231*4882a593Smuzhiyun 232*4882a593Smuzhiyun /* Assoc Retry Delay Attribute */ 233*4882a593Smuzhiyun typedef BWL_PRE_PACKED_STRUCT struct wifi_mbo_assoc_retry_delay_attr_s { 234*4882a593Smuzhiyun /* Attribute ID - 0x08. */ 235*4882a593Smuzhiyun uint8 id; 236*4882a593Smuzhiyun /* Length of the following fields in the attribute */ 237*4882a593Smuzhiyun uint8 len; 238*4882a593Smuzhiyun /* No of Seconds before next assoc attempt */ 239*4882a593Smuzhiyun uint16 reassoc_delay; 240*4882a593Smuzhiyun } BWL_POST_PACKED_STRUCT wifi_mbo_assoc_retry_delay_attr_t; 241*4882a593Smuzhiyun 242*4882a593Smuzhiyun #define MBO_ANQP_OUI_TYPE 0x12 /* OUTI Type/Version */ 243*4882a593Smuzhiyun 244*4882a593Smuzhiyun /* MBO ANQP Element */ 245*4882a593Smuzhiyun typedef BWL_PRE_PACKED_STRUCT struct wifi_mbo_anqp_elem_s { 246*4882a593Smuzhiyun /* ID - 56797 */ 247*4882a593Smuzhiyun uint16 info_id; 248*4882a593Smuzhiyun /* Length of the OUI + Vendor Specific content */ 249*4882a593Smuzhiyun uint16 len; 250*4882a593Smuzhiyun /* WFA_OUI 50:6F:9A */ 251*4882a593Smuzhiyun uint8 oui[WFA_OUI_LEN]; 252*4882a593Smuzhiyun /* MBO_ANQP_OUI_TYPE 0x12 */ 253*4882a593Smuzhiyun uint8 oui_type; 254*4882a593Smuzhiyun /* MBO ANQP element type */ 255*4882a593Smuzhiyun uint8 sub_type; 256*4882a593Smuzhiyun /* variable len payload */ 257*4882a593Smuzhiyun uint8 payload[1]; 258*4882a593Smuzhiyun } BWL_POST_PACKED_STRUCT wifi_mbo_anqp_elem_t; 259*4882a593Smuzhiyun 260*4882a593Smuzhiyun #define MBO_ANQP_ELEM_HDR_SIZE (OFFSETOF(wifi_mbo_anqp_elem_t, payload)) 261*4882a593Smuzhiyun 262*4882a593Smuzhiyun /* oui:3 bytes + oui type:1 byte + sub type:1 byte */ 263*4882a593Smuzhiyun #define MBO_ANQP_ELEM_NO_PAYLOAD_LEN 5 264*4882a593Smuzhiyun 265*4882a593Smuzhiyun /* MBO ANQP Subtype Values */ 266*4882a593Smuzhiyun enum { 267*4882a593Smuzhiyun MBO_ANQP_ELEM_MBO_QUERY_LIST = 1, 268*4882a593Smuzhiyun MBO_ANQP_ELEM_CELL_DATA_CONN_PREF = 2 269*4882a593Smuzhiyun }; 270*4882a593Smuzhiyun 271*4882a593Smuzhiyun /* MBO sub-elements */ 272*4882a593Smuzhiyun typedef BWL_PRE_PACKED_STRUCT struct wifi_mbo_cell_cap_subelem_s { 273*4882a593Smuzhiyun /* 0xDD */ 274*4882a593Smuzhiyun uint8 sub_elem_id; 275*4882a593Smuzhiyun /* Length of the following fields in sub-element */ 276*4882a593Smuzhiyun uint8 len; 277*4882a593Smuzhiyun /* WFA_OUI 50:6F:9A */ 278*4882a593Smuzhiyun uint8 oui[WFA_OUI_LEN]; 279*4882a593Smuzhiyun /* OUI_TYPE 0x03 */ 280*4882a593Smuzhiyun uint8 oui_type; 281*4882a593Smuzhiyun /* STA cellular capability */ 282*4882a593Smuzhiyun uint8 cell_conn; 283*4882a593Smuzhiyun } BWL_POST_PACKED_STRUCT wifi_mbo_cell_cap_subelem_t; 284*4882a593Smuzhiyun 285*4882a593Smuzhiyun typedef BWL_PRE_PACKED_STRUCT struct wifi_mbo_perf_chan_subelem_s { 286*4882a593Smuzhiyun /* 0xDD */ 287*4882a593Smuzhiyun uint8 sub_elem_id; 288*4882a593Smuzhiyun /* Length of the following fields in sub-element */ 289*4882a593Smuzhiyun uint8 len; 290*4882a593Smuzhiyun /* WFA_OUI 50:6F:9A */ 291*4882a593Smuzhiyun uint8 oui[WFA_OUI_LEN]; 292*4882a593Smuzhiyun /* OUI_TYPE 0x02 */ 293*4882a593Smuzhiyun uint8 oui_type; 294*4882a593Smuzhiyun /* variable length of channel preference data */ 295*4882a593Smuzhiyun uint8 data[1]; 296*4882a593Smuzhiyun } BWL_POST_PACKED_STRUCT wifi_mbo_pref_chan_subelem_t; 297*4882a593Smuzhiyun 298*4882a593Smuzhiyun /* This marks the end of a packed structure section. */ 299*4882a593Smuzhiyun #include <packed_section_end.h> 300*4882a593Smuzhiyun 301*4882a593Smuzhiyun #endif /* __MBO_H__ */ 302