1*4882a593Smuzhiyun /****************************************************************************** 2*4882a593Smuzhiyun * 3*4882a593Smuzhiyun * Copyright(c) 2007 - 2017 Realtek Corporation. 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * This program is free software; you can redistribute it and/or modify it 6*4882a593Smuzhiyun * under the terms of version 2 of the GNU General Public License as 7*4882a593Smuzhiyun * published by the Free Software Foundation. 8*4882a593Smuzhiyun * 9*4882a593Smuzhiyun * This program is distributed in the hope that it will be useful, but WITHOUT 10*4882a593Smuzhiyun * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11*4882a593Smuzhiyun * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 12*4882a593Smuzhiyun * more details. 13*4882a593Smuzhiyun * 14*4882a593Smuzhiyun *****************************************************************************/ 15*4882a593Smuzhiyun #ifndef _RTW_MBO_H_ 16*4882a593Smuzhiyun #define _RTW_MBO_H_ 17*4882a593Smuzhiyun 18*4882a593Smuzhiyun #define MBO_CH_LIST_MAX_NUM 247 19*4882a593Smuzhiyun #define MBO_OCE_ELEMENT_MAX_LEN 255 20*4882a593Smuzhiyun 21*4882a593Smuzhiyun #define MBO_CH_PREFER_NON_OP 0 22*4882a593Smuzhiyun #define MBO_CH_PREFER_NOT 1 23*4882a593Smuzhiyun #define MBO_CH_PREFER_OK 255 24*4882a593Smuzhiyun 25*4882a593Smuzhiyun #define rtw_mbo_wifi_logo_test(a) \ 26*4882a593Smuzhiyun (((a)->registrypriv.wifi_spec) == 1) 27*4882a593Smuzhiyun 28*4882a593Smuzhiyun #define rtw_mbo_wifi_spec_test(a) \ 29*4882a593Smuzhiyun (((a)->mlmepriv.mbo_attr.mbo_spec_test) == 1) 30*4882a593Smuzhiyun 31*4882a593Smuzhiyun #define rtw_mbo_ap_assoc_disallow(a) \ 32*4882a593Smuzhiyun (((a)->mlmepriv.mbo_attr.assoc_disallow) > 0) 33*4882a593Smuzhiyun 34*4882a593Smuzhiyun #define rtw_mbo_add_internw_ext_cap(d, l) \ 35*4882a593Smuzhiyun rtw_add_ext_cap_info(d, l, INTERWORKING) 36*4882a593Smuzhiyun 37*4882a593Smuzhiyun #define rtw_mbo_wnm_notification_req(c, a) \ 38*4882a593Smuzhiyun (((c) == RTW_WLAN_CATEGORY_WNM) && \ 39*4882a593Smuzhiyun (((a) == RTW_WLAN_ACTION_WNM_NOTIF_REQ))) 40*4882a593Smuzhiyun 41*4882a593Smuzhiyun /* IEEE Std 802.11-2016 Table 9-46 - Status codes */ 42*4882a593Smuzhiyun #define RTW_ASSOC_DENIED_NO_MORE_STAS 17 43*4882a593Smuzhiyun #define RTW_ASSOC_REFUSED_TEMPORARILY 30 44*4882a593Smuzhiyun 45*4882a593Smuzhiyun /* MBO-OCE Information Element */ 46*4882a593Smuzhiyun #define RTW_MBO_EID WLAN_EID_VENDOR_SPECIFIC 47*4882a593Smuzhiyun #define RTW_MBO_OUI 0x506F9A 48*4882a593Smuzhiyun #define RTW_MBO_OUI_TYPE 0x16 49*4882a593Smuzhiyun 50*4882a593Smuzhiyun /* MBO AP Capability Indication */ 51*4882a593Smuzhiyun #define RTW_MBO_ATTR_AP_CAP_ID 0x1 52*4882a593Smuzhiyun /* Non-preferred Channel Report */ 53*4882a593Smuzhiyun #define RTW_MBO_ATTR_NPREF_CH_RPT_ID 0x2 54*4882a593Smuzhiyun /* Cellular Data Capabilities */ 55*4882a593Smuzhiyun #define RTW_MBO_ATTR_CELL_DATA_CAP_ID 0x3 56*4882a593Smuzhiyun /* Association Disallowed */ 57*4882a593Smuzhiyun #define RTW_MBO_ATTR_ASSOC_DISABLED_ID 0x4 58*4882a593Smuzhiyun /* Transition Reason Code */ 59*4882a593Smuzhiyun #define RTW_MBO_ATTR_TRANS_RES_ID 0x6 60*4882a593Smuzhiyun /* Transition Rejection Reason Code */ 61*4882a593Smuzhiyun #define RTW_MBO_ATTR_TRANS_REJ_ID 0x7 62*4882a593Smuzhiyun /* Association Retry Delay */ 63*4882a593Smuzhiyun #define RTW_MBO_ATTR_ASSOC_RETRY_DELAY_ID 0x8 64*4882a593Smuzhiyun 65*4882a593Smuzhiyun #define RTW_MBO_MAX_CH_LIST_NUM MAX_CHANNEL_NUM 66*4882a593Smuzhiyun 67*4882a593Smuzhiyun #define RTW_MBO_MAX_CH_RPT_NUM 32 68*4882a593Smuzhiyun 69*4882a593Smuzhiyun #define RTW_MBO_TEST_CMD_REST 0x00 70*4882a593Smuzhiyun #define RTW_MBO_TEST_CMD_BTM_REQ_SEND 0xfd 71*4882a593Smuzhiyun #define RTW_MBO_TEST_CMD_BTM_REQ_SET 0xfe 72*4882a593Smuzhiyun #define RTW_MBO_TEST_CMD_NB_BSS_ADD 0xff 73*4882a593Smuzhiyun 74*4882a593Smuzhiyun enum rtw_mbo_attri_type { 75*4882a593Smuzhiyun MBO_AP_CAPABILITY = 1, 76*4882a593Smuzhiyun NON_PREFER_CHANNEL_RPT = 2, 77*4882a593Smuzhiyun CELLULAR_DATA_CAPABILITY = 3, 78*4882a593Smuzhiyun ASSOCIATION_DISALLOW = 4, 79*4882a593Smuzhiyun CELLULAR_DATA_CONNECT_PREFER = 5, 80*4882a593Smuzhiyun TRANS_REASON_CODE = 6, 81*4882a593Smuzhiyun TRANS_REJECT_REASON_CODE = 7, 82*4882a593Smuzhiyun ASSOCIATION_RETRY_DELAY = 8 83*4882a593Smuzhiyun }; 84*4882a593Smuzhiyun 85*4882a593Smuzhiyun struct rtw_mbo_ch_list { 86*4882a593Smuzhiyun u8 op_class; 87*4882a593Smuzhiyun u8 channel; 88*4882a593Smuzhiyun u8 preference; 89*4882a593Smuzhiyun }; 90*4882a593Smuzhiyun 91*4882a593Smuzhiyun struct mbo_priv { 92*4882a593Smuzhiyun u8 enable; 93*4882a593Smuzhiyun u8 assoc_disallow; 94*4882a593Smuzhiyun u8 cellular_aware; 95*4882a593Smuzhiyun struct rtw_mbo_ch_list ch_list[MBO_CH_LIST_MAX_NUM]; 96*4882a593Smuzhiyun u8 ch_list_num; 97*4882a593Smuzhiyun u8 mbo_oce_element[MBO_OCE_ELEMENT_MAX_LEN]; 98*4882a593Smuzhiyun u8 mbo_oce_element_len; 99*4882a593Smuzhiyun }; 100*4882a593Smuzhiyun 101*4882a593Smuzhiyun struct mbo_user_btm_req_pkt { 102*4882a593Smuzhiyun struct btm_req_hdr hdr; 103*4882a593Smuzhiyun u32 candidate_cnt; 104*4882a593Smuzhiyun struct wnm_btm_cant btm_cants[RTW_MAX_NB_RPT_NUM]; 105*4882a593Smuzhiyun u8 append_mbo_ie; 106*4882a593Smuzhiyun }; 107*4882a593Smuzhiyun 108*4882a593Smuzhiyun struct mbo_attr_info { 109*4882a593Smuzhiyun u8 mbo_spec_test; 110*4882a593Smuzhiyun u8 ap_cap_ind; 111*4882a593Smuzhiyun u8 assoc_disallow; 112*4882a593Smuzhiyun u8 cell_data_cap; 113*4882a593Smuzhiyun u8 reason; 114*4882a593Smuzhiyun u16 delay; 115*4882a593Smuzhiyun struct mbo_user_btm_req_pkt user_raw; 116*4882a593Smuzhiyun }; 117*4882a593Smuzhiyun 118*4882a593Smuzhiyun struct npref_ch { 119*4882a593Smuzhiyun u8 op_class; 120*4882a593Smuzhiyun u8 chs[RTW_MBO_MAX_CH_LIST_NUM]; 121*4882a593Smuzhiyun size_t nm_of_ch; 122*4882a593Smuzhiyun u8 preference; 123*4882a593Smuzhiyun u8 reason; 124*4882a593Smuzhiyun }; 125*4882a593Smuzhiyun 126*4882a593Smuzhiyun struct npref_ch_rtp { 127*4882a593Smuzhiyun struct npref_ch ch_rpt[RTW_MBO_MAX_CH_RPT_NUM]; 128*4882a593Smuzhiyun size_t nm_of_rpt; 129*4882a593Smuzhiyun }; 130*4882a593Smuzhiyun 131*4882a593Smuzhiyun 132*4882a593Smuzhiyun void rtw_mbo_ie_handler(_adapter *padapter, struct mbo_priv *mbopriv, 133*4882a593Smuzhiyun const u8 *pbuf, uint limit_len); 134*4882a593Smuzhiyun struct sta_info; 135*4882a593Smuzhiyun void rtw_ap_parse_sta_mbo_element(_adapter *padapter, 136*4882a593Smuzhiyun struct sta_info *psta, u8 *ies_buf, u16 ies_len); 137*4882a593Smuzhiyun void rtw_mbo_fill_non_prefer_channel_list(_adapter *padapter, struct mbo_priv *mbopriv, 138*4882a593Smuzhiyun const u8 *pbuf, u8 len); 139*4882a593Smuzhiyun 140*4882a593Smuzhiyun 141*4882a593Smuzhiyun 142*4882a593Smuzhiyun void rtw_mbo_build_cell_data_cap_attr( 143*4882a593Smuzhiyun _adapter *padapter, u8 **pframe, struct pkt_attrib *pattrib); 144*4882a593Smuzhiyun 145*4882a593Smuzhiyun void rtw_mbo_update_ie_data( 146*4882a593Smuzhiyun _adapter *padapter, u8 *pie, u32 ie_len); 147*4882a593Smuzhiyun 148*4882a593Smuzhiyun void rtw_mbo_build_supp_op_class_elem( 149*4882a593Smuzhiyun _adapter *padapter, u8 **pframe, struct pkt_attrib *pattrib); 150*4882a593Smuzhiyun 151*4882a593Smuzhiyun void rtw_mbo_build_npref_ch_rpt_attr( 152*4882a593Smuzhiyun _adapter *padapter, u8 **pframe, struct pkt_attrib *pattrib); 153*4882a593Smuzhiyun 154*4882a593Smuzhiyun void rtw_mbo_build_trans_reject_reason_attr( 155*4882a593Smuzhiyun _adapter *padapter, u8 **pframe, struct pkt_attrib *pattrib, u8 *pres); 156*4882a593Smuzhiyun 157*4882a593Smuzhiyun u8 rtw_mbo_disallowed_network(struct wlan_network *pnetwork); 158*4882a593Smuzhiyun 159*4882a593Smuzhiyun void rtw_mbo_build_extended_cap( 160*4882a593Smuzhiyun _adapter *padapter, u8 **pframe, struct pkt_attrib *pattrib); 161*4882a593Smuzhiyun 162*4882a593Smuzhiyun ssize_t rtw_mbo_proc_non_pref_chans_set( 163*4882a593Smuzhiyun struct file *pfile, const char __user *buffer, 164*4882a593Smuzhiyun size_t count, loff_t *pos, void *pdata); 165*4882a593Smuzhiyun 166*4882a593Smuzhiyun int rtw_mbo_proc_non_pref_chans_get( 167*4882a593Smuzhiyun struct seq_file *m, void *v); 168*4882a593Smuzhiyun 169*4882a593Smuzhiyun ssize_t rtw_mbo_proc_cell_data_set( 170*4882a593Smuzhiyun struct file *pfile, const char __user *buffer, 171*4882a593Smuzhiyun size_t count, loff_t *pos, void *pdata); 172*4882a593Smuzhiyun 173*4882a593Smuzhiyun int rtw_mbo_proc_cell_data_get( 174*4882a593Smuzhiyun struct seq_file *m, void *v); 175*4882a593Smuzhiyun 176*4882a593Smuzhiyun ssize_t rtw_mbo_proc_attr_set( 177*4882a593Smuzhiyun struct file *pfile, const char __user *buffer, 178*4882a593Smuzhiyun size_t count, loff_t *pos, void *pdata); 179*4882a593Smuzhiyun 180*4882a593Smuzhiyun int rtw_mbo_proc_attr_get( 181*4882a593Smuzhiyun struct seq_file *m, void *v); 182*4882a593Smuzhiyun 183*4882a593Smuzhiyun void rtw_mbo_wnm_notification_parsing( 184*4882a593Smuzhiyun _adapter *padapter, const u8 *pdata, size_t data_len); 185*4882a593Smuzhiyun 186*4882a593Smuzhiyun void rtw_mbo_build_wnm_notification( 187*4882a593Smuzhiyun _adapter *padapter, u8 **pframe, struct pkt_attrib *pattrib); 188*4882a593Smuzhiyun 189*4882a593Smuzhiyun void rtw_mbo_build_probe_req_ies( 190*4882a593Smuzhiyun _adapter *padapter, u8 **pframe, struct pkt_attrib *pattrib); 191*4882a593Smuzhiyun 192*4882a593Smuzhiyun void rtw_mbo_build_assoc_req_ies( 193*4882a593Smuzhiyun _adapter *padapter, u8 **pframe, struct pkt_attrib *pattrib); 194*4882a593Smuzhiyun 195*4882a593Smuzhiyun void rtw_mbo_attr_info_init(_adapter *padapter); 196*4882a593Smuzhiyun 197*4882a593Smuzhiyun void rtw_mbo_process_assoc_req( 198*4882a593Smuzhiyun _adapter *padapter, u8 *pie, int ie_len); 199*4882a593Smuzhiyun 200*4882a593Smuzhiyun void rtw_mbo_build_beacon_ies( 201*4882a593Smuzhiyun _adapter *padapter, u8 **pframe, struct pkt_attrib *pattrib); 202*4882a593Smuzhiyun 203*4882a593Smuzhiyun void rtw_mbo_build_probe_rsp_ies( 204*4882a593Smuzhiyun _adapter *padapter, u8 **pframe, struct pkt_attrib *pattrib); 205*4882a593Smuzhiyun 206*4882a593Smuzhiyun void rtw_mbo_build_assoc_rsp_ies( 207*4882a593Smuzhiyun _adapter *padapter, u8 **pframe, struct pkt_attrib *pattrib); 208*4882a593Smuzhiyun 209*4882a593Smuzhiyun void rtw_mbo_build_wnm_btmreq_reason_ies( 210*4882a593Smuzhiyun _adapter *padapter, u8 **pframe, struct pkt_attrib *pattrib); 211*4882a593Smuzhiyun 212*4882a593Smuzhiyun #endif /* _RTW_MBO_H_ */ 213*4882a593Smuzhiyun 214