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