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