1 /*
2 * Copyright (c) 2020 HiSilicon (Shanghai) Technologies CO., LIMITED.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 * 文 件 名 : hmac_mbo.c
15 * 创建日期 : 2022年09月24日
16 */
17
18 #include "hmac_mbo.h"
19 #include "oam_ext_if.h"
20 #include "wlan_types_common.h"
21 #include "mac_frame.h"
22 #include "hmac_config.h"
23 #include "securec.h"
24 #include "frw_util_notifier.h"
25 #include "hmac_feature_interface.h"
26
27 #ifdef __cplusplus
28 #if __cplusplus
29 extern "C" {
30 #endif
31 #endif
32
33 #undef THIS_FILE_ID
34 #define THIS_FILE_ID DIAG_FILE_ID_WIFI_HOST_HMAC_MBO_C
35
36 #undef THIS_MOD_ID
37 #define THIS_MOD_ID DIAG_MOD_ID_WIFI_HOST
38
39 mac_mbo_para_stru *g_sta_mbo_para_info[WLAN_VAP_MAX_NUM_PER_DEVICE_LIMIT] = {
40 OSAL_NULL, OSAL_NULL, OSAL_NULL, OSAL_NULL
41 };
42 mac_assoc_retry_delay_attr_mbo_ie_stru *g_assoc_delay_attr_mbo_ie = OSAL_NULL;
43
hmac_mbo_get_param_info(osal_u8 vap_id)44 OAL_STATIC mac_mbo_para_stru *hmac_mbo_get_param_info(osal_u8 vap_id)
45 {
46 return g_sta_mbo_para_info[vap_id];
47 }
48
hmac_mbo_get_assoc_delay_ie(osal_void)49 OAL_STATIC mac_assoc_retry_delay_attr_mbo_ie_stru *hmac_mbo_get_assoc_delay_ie(osal_void)
50 {
51 return g_assoc_delay_attr_mbo_ie;
52 }
53
54 /* 功能描述 : 获取ies中的MBO IE指针地址 */
mac_get_mbo_ie(osal_u8 * ies,osal_s32 ie_len)55 OAL_STATIC osal_u8 *mac_get_mbo_ie(osal_u8 *ies, osal_s32 ie_len)
56 {
57 osal_u8 *ie = OSAL_NULL;
58
59 if (ie_len == 0) {
60 return OSAL_NULL;
61 }
62
63 /* 查找私有vendor ie */
64 ie = hmac_find_vendor_ie_etc(MAC_MBO_VENDOR_IE, MAC_MBO_IE_OUI_TYPE, ies, ie_len);
65 if (ie != OSAL_NULL) {
66 oam_warning_log0(0, OAM_SF_ANY, "mac_get_mbo_ie::Get mbo ie succ!");
67 }
68 return ie;
69 }
70
71 /* 功能描述 : 填充vendor mbo element信息 MBO IE */
mac_set_mbo_ie(hmac_vap_stru * hmac_vap,osal_u8 * buffer)72 OAL_STATIC osal_void mac_set_mbo_ie(hmac_vap_stru *hmac_vap, osal_u8 *buffer)
73 {
74 /***************************************************************************
75 --------------------------------------------------
76 |Element ID |Length |OUI|OUI Type|MBO Attributes |
77 --------------------------------------------------
78 Octets: |1 |1 |3 |1 |n |
79 --------------------------------------------------
80 ***************************************************************************/
81 mac_ieee80211_vendor_ie_stru *vendor_ie = NULL;
82
83 vendor_ie = (mac_ieee80211_vendor_ie_stru *)buffer;
84
85 /* 设置MBO元素的OUI和OUI type = 0x16 */
86 vendor_ie->element_id = MAC_EID_VENDOR;
87 vendor_ie->len = 7; /* ie长度为7 */
88 vendor_ie->oui[0] = (osal_u8)((MAC_MBO_VENDOR_IE >> BIT_OFFSET_16) & 0xff);
89 vendor_ie->oui[1] = (osal_u8)((MAC_MBO_VENDOR_IE >> BIT_OFFSET_8) & 0xff);
90 vendor_ie->oui[2] = (osal_u8)((MAC_MBO_VENDOR_IE) & 0xff); // 2: OUI byte idex
91 vendor_ie->oui_type = MAC_MBO_IE_OUI_TYPE;
92
93 buffer[6] = MBO_ATTR_ID_CELL_DATA_CAPA; /* 6 cell data attr offset */
94 buffer[7] = 1; /* 7 cell data attr len offset */
95 buffer[8] = hmac_mbo_get_param_info(hmac_vap->vap_id)->mbo_cell_capa; /* 8 cell data attr value offset */
96 }
97
98 /* 功能描述 : 填充Supported Operating Classes element信息 */
mac_set_supported_operating_classes_ie(const hmac_vap_stru * hmac_vap,osal_u8 * buffer,osal_u8 * ie_len,const hmac_scanned_bss_info * scaned_bss)99 OAL_STATIC osal_void mac_set_supported_operating_classes_ie(const hmac_vap_stru *hmac_vap, osal_u8 *buffer,
100 osal_u8 *ie_len, const hmac_scanned_bss_info *scaned_bss)
101 {
102 *ie_len = 0;
103
104 if (scaned_bss == OSAL_NULL) {
105 return;
106 }
107
108 /*******************************************************************************************
109 ------------------------------------------------------------------------------------
110 |ElementID | Length | Current Operating Class| Operating Class |
111 ------------------------------------------------------------------------------------
112 Octets: |1 | 1 | 1 | variable |
113 ------------------------------------------------------------------------------------
114 |Current Operating Class Extension Sequence(O) | Operating Class Duple Sequence(O) |
115 ------------------------------------------------------------------------------------
116 Octets: | variable | variable |
117 ------------------------------------------------------------------------------------
118
119 *********************************************************************************************/
120 buffer[0] = MAC_EID_OPERATING_CLASS;
121 buffer[1] = 3; /* length为3 */
122 if (hmac_vap->channel.band == WLAN_BAND_2G) {
123 buffer[2] = MAC_GLOBAL_OPERATING_CLASS_NUMBER81; // 2: CLASS_NUMBER idex
124 }
125 if (hmac_vap->channel.band == WLAN_BAND_5G) {
126 buffer[2] = MAC_GLOBAL_OPERATING_CLASS_NUMBER115; // 2: CLASS_NUMBER idex
127 }
128 buffer[3] = MAC_GLOBAL_OPERATING_CLASS_NUMBER81; // 3: CLASS_NUMBER idex
129 buffer[4] = MAC_GLOBAL_OPERATING_CLASS_NUMBER115; // 4: CLASS_NUMBER idex
130
131 *ie_len = MAC_IE_HDR_LEN + 3; /* length为3 */
132 }
133
134 /* 功能描述 : 查找mbo attribute信息 */
mac_find_mbo_attribute(osal_u8 eid,osal_u8 * ies,osal_s32 len)135 OAL_STATIC osal_u8 *mac_find_mbo_attribute(osal_u8 eid, osal_u8 *ies, osal_s32 len)
136 {
137 osal_s32 ie_len;
138 osal_u8 *frame_ie = ies;
139
140 if (frame_ie == NULL) {
141 return NULL;
142 }
143
144 /* 查找MBO Attribute,如果不是直接找下一个 */
145 ie_len = len;
146 while (ie_len > MAC_MBO_ATTRIBUTE_HDR_LEN && frame_ie[0] != eid) {
147 ie_len -= (osal_s32)(frame_ie[1] + MAC_MBO_ATTRIBUTE_HDR_LEN);
148 frame_ie += frame_ie[1] + MAC_MBO_ATTRIBUTE_HDR_LEN;
149 }
150
151 /* 查找到MBO Attribute,剩余长度不匹配直接返回空指针 */
152 if ((ie_len < MAC_MBO_ATTRIBUTE_HDR_LEN) || (ie_len < (MAC_MBO_ATTRIBUTE_HDR_LEN + frame_ie[1]))) {
153 return NULL;
154 }
155
156 return frame_ie;
157 }
158
hmac_handle_ie_specific_mbo(osal_u8 * ie_data,hmac_neighbor_bss_info_stru * bss_list_alloc,osal_u8 bss_list_index)159 OAL_STATIC osal_void hmac_handle_ie_specific_mbo(osal_u8 *ie_data,
160 hmac_neighbor_bss_info_stru *bss_list_alloc, osal_u8 bss_list_index)
161 {
162 unref_param(bss_list_alloc);
163
164 if (memcpy_s((hmac_mbo_get_assoc_delay_ie())[bss_list_index].oui,
165 sizeof((hmac_mbo_get_assoc_delay_ie())[bss_list_index].oui),
166 ie_data + MAC_IE_HDR_LEN, MAC_MBO_OUI_LENGTH) != EOK) {
167 oam_error_log0(0, OAM_SF_ANY, "hmac_handle_ie_by_data_length::memcpy oui fail!");
168 return;
169 }
170 if ((ie_data[5] == MAC_MBO_IE_OUI_TYPE) && /* 5 MBO OUI TYPE offset */
171 (ie_data[6] == MBO_ATTR_ID_ASSOC_RETRY_DELAY)) { /* 6 MBO ASSOC RETRY DELAY ATTR offset */
172 (hmac_mbo_get_assoc_delay_ie())[bss_list_index].reassoc_delay_time =
173 (((osal_u16)ie_data[9]) << BIT_OFFSET_8) | (ie_data[8]); /* 8,9 MBO reassoc delay value offset */
174 }
175 return;
176 }
177
178 /*
179 * 函 数 名 : hmac_mbo_check_is_assoc_or_re_assoc_allowed
180 * 功能描述 : 携带Association Retry Delay Attribute或Association Disallowed Attribute MBO IE的AP,
181 * 与这样的AP关联时需要判断是否满足不允许关联,或在re-assoc delay time时间内不可以关联
182 */
hmac_mbo_check_is_assoc_or_re_assoc_allowed(hmac_vap_stru * hmac_vap,mac_conn_param_stru * connect_param,mac_bss_dscr_stru * bss_dscr)183 OAL_STATIC osal_u32 hmac_mbo_check_is_assoc_or_re_assoc_allowed(hmac_vap_stru *hmac_vap,
184 mac_conn_param_stru *connect_param, mac_bss_dscr_stru *bss_dscr)
185 {
186 osal_u32 current_time;
187
188 if (!is_legacy_sta(hmac_vap)) {
189 return OAL_CONTINUE;
190 }
191
192 /* 先判断此bss是不是含有不允许关联MBO IE的BSS,如果是则返回false */
193 if (bss_dscr->bss_assoc_disallowed == OSAL_TRUE) {
194 oam_warning_log4(hmac_vap->vap_id, OAM_SF_ANY,
195 "{hmac_mbo_check_is_assoc_or_re_assoc_allowed::bssid:%02x:%02x:%02x:%02x:xx:xx mbo assoc disallowed}",
196 connect_param->bssid[MAC_ADDR_0], connect_param->bssid[MAC_ADDR_1],
197 connect_param->bssid[MAC_ADDR_2], connect_param->bssid[MAC_ADDR_3]);
198 return OAL_FAIL;
199 }
200
201 /* re-assoc delay不允许关联标标记为0,return true */
202 if (hmac_mbo_get_param_info(hmac_vap->vap_id)->disable_connect == OSAL_FALSE) {
203 return OAL_CONTINUE;
204 }
205
206 /* 判断此BSS是否是re-assoc delay bss,如果是进行相关处理 */
207 if (memcmp(hmac_mbo_get_param_info(hmac_vap->vap_id)->reassoc_delay_bss_mac_addr,
208 connect_param->bssid, WLAN_MAC_ADDR_LEN) == 0) {
209 current_time = (osal_u32)oal_time_get_stamp_ms(); /* 获取当前时间 */
210 /* 在收到btm req帧的ul_re_assoc_delay_time内不允许给该bss发重关联请求帧 */
211 if ((current_time - hmac_mbo_get_param_info(hmac_vap->vap_id)->btm_req_received_time) <=
212 hmac_mbo_get_param_info(hmac_vap->vap_id)->reassoc_delay_time) {
213 oam_warning_log3(0, OAM_SF_ANY, "hmac_mbo_check_is_assoc_or_re_assoc_allowed::current time[%u] < \
214 (btm recv time[%u] + reassoc_delay time[%d]) not timed out!bss connect disallowed!",
215 current_time, hmac_mbo_get_param_info(hmac_vap->vap_id)->btm_req_received_time,
216 hmac_mbo_get_param_info(hmac_vap->vap_id)->reassoc_delay_time);
217 return OAL_FAIL;
218 }
219
220 /* 已超时,不允许关联标志位清零 */
221 hmac_mbo_get_param_info(hmac_vap->vap_id)->disable_connect = OSAL_FALSE;
222 }
223
224 return OAL_CONTINUE;
225 }
226
227 /* 功能描述 : 判断AP是否携带MBO IE(Association Disallowed Attribute) */
hmac_scan_update_bss_assoc_disallowed_attr(hmac_vap_stru * hmac_vap,mac_bss_dscr_stru * bss_dscr,osal_u8 * frame_body,osal_u16 frame_len)228 OAL_STATIC osal_void hmac_scan_update_bss_assoc_disallowed_attr(hmac_vap_stru *hmac_vap, mac_bss_dscr_stru *bss_dscr,
229 osal_u8 *frame_body, osal_u16 frame_len)
230 {
231 osal_u8 *mbo_ie = NULL;
232 osal_u8 *mbo_attribute = NULL;
233
234 unref_param(hmac_vap);
235
236 mbo_ie = hmac_find_vendor_ie_etc(MAC_MBO_VENDOR_IE, MAC_MBO_IE_OUI_TYPE, frame_body, frame_len);
237 if (mbo_ie == NULL) {
238 bss_dscr->bss_assoc_disallowed = OSAL_FALSE;
239 return;
240 }
241 if (mbo_ie[1] < (MBO_IE_HEADER - MAC_IE_HDR_LEN)) {
242 return;
243 }
244 mbo_attribute = mac_find_mbo_attribute(MBO_ATTR_ID_ASSOC_DISALLOW,
245 mbo_ie + MBO_IE_HEADER,
246 mbo_ie[1] - (MBO_IE_HEADER - MAC_IE_HDR_LEN));
247 if (mbo_attribute == NULL) {
248 /* 不带有Association Disallowed Attribute,允许关联 */
249 bss_dscr->bss_assoc_disallowed = OSAL_FALSE;
250 } else {
251 oam_warning_log0(0, OAM_SF_ANY, "{hmac_scan_update_bss_assoc_disallowed_attr::Assoc Disallowed Attr found!}");
252 /* 带有Association Disallowed Attribute,AP 不允许被关联 */
253 bss_dscr->bss_assoc_disallowed = OSAL_TRUE;
254 }
255
256 return;
257 }
258
259 /*
260 * 功能描述 : 将btm req的Neighbor元素中的re-assoc delay相关参数保存在MBO结构体下
261 */
hmac_set_bss_re_assoc_delay_params(const hmac_bsst_req_info_stru * bsst_req_info,const hmac_user_stru * hmac_user,hmac_vap_stru * hmac_vap,oal_bool_enum_uint8 need_roam)262 OAL_STATIC osal_void hmac_set_bss_re_assoc_delay_params(const hmac_bsst_req_info_stru *bsst_req_info,
263 const hmac_user_stru *hmac_user, hmac_vap_stru *hmac_vap, oal_bool_enum_uint8 need_roam)
264 {
265 osal_u8 bss_index_loop;
266
267 if (!is_legacy_sta(hmac_vap) || need_roam == OSAL_FALSE) {
268 return;
269 }
270
271 for (bss_index_loop = 0; bss_index_loop < bsst_req_info->bss_list_num; bss_index_loop++) {
272 if (memcmp(hmac_user->user_mac_addr, bsst_req_info->neighbor_bss_list[bss_index_loop].auc_mac_addr,
273 WLAN_MAC_ADDR_LEN) == 0) {
274 hmac_mbo_get_param_info(hmac_vap->vap_id)->reassoc_delay_time = HMAC_11V_MBO_RE_ASSOC_DALAY_TIME_S_TO_MS *
275 (hmac_mbo_get_assoc_delay_ie())[bss_index_loop].reassoc_delay_time;
276 hmac_mbo_get_param_info(hmac_vap->vap_id)->btm_req_received_time = (osal_u32)oal_time_get_stamp_ms();
277 hmac_mbo_get_param_info(hmac_vap->vap_id)->disable_connect = OSAL_TRUE;
278
279 (osal_void)memcpy_s(hmac_mbo_get_param_info(hmac_vap->vap_id)->reassoc_delay_bss_mac_addr,
280 WLAN_MAC_ADDR_LEN, hmac_user->user_mac_addr, WLAN_MAC_ADDR_LEN);
281 break;
282 }
283 }
284 return;
285 }
286
hmac_roam_attach_mbo_ie_auth(hmac_vap_stru * hmac_vap,osal_u8 * mgmt_frame,osal_u16 * auth_len,mac_bss_dscr_stru * bss_dscr)287 OAL_STATIC osal_void hmac_roam_attach_mbo_ie_auth(hmac_vap_stru *hmac_vap,
288 osal_u8 *mgmt_frame, osal_u16 *auth_len, mac_bss_dscr_stru *bss_dscr)
289 {
290 osal_u8 *mgmt_frame_tail = mgmt_frame + *auth_len;
291 osal_u8 *payload = OSAL_NULL;
292 osal_s32 payload_len = 0;
293 osal_u8 *vendor_ie = OSAL_NULL;
294
295 if (bss_dscr == OSAL_NULL || !is_legacy_sta(hmac_vap)) {
296 oam_warning_log0(0, OAM_SF_ANY, "{hmac_roam_attach_mbo_ie_auth::bss_dscr is null.}");
297 return;
298 }
299
300 payload = bss_dscr->mgmt_buff + MAC_80211_FRAME_LEN;
301 payload_len = (osal_s32)(bss_dscr->mgmt_len - MAC_80211_FRAME_LEN);
302 vendor_ie = mac_get_mbo_ie(payload, payload_len);
303 if (vendor_ie == OSAL_NULL || (*auth_len + *(vendor_ie + 1)) > WLAN_MEM_NETBUF_SIZE2) {
304 return;
305 }
306
307 mac_set_mbo_ie(hmac_vap, mgmt_frame_tail);
308 *auth_len += 9; // 9: mbo ie fix len
309 oam_info_log0(0, OAM_SF_ANY, "hmac_roam_attach_mbo_ie_auth::add mbo ie succ!");
310 }
311
312 /*
313 * 函 数 名 : hmac_vap_mbo_update_rrm_scan_params
314 * 功能描述 : 解决mbo认证扫描不全的问题: 每个信道停留40ms,发送两次probe req
315 */
hmac_vap_mbo_update_rrm_scan_params(const mac_bcn_req_stru * bcn_req,mac_scan_req_stru * scan_req)316 OAL_STATIC osal_void hmac_vap_mbo_update_rrm_scan_params(const mac_bcn_req_stru *bcn_req, mac_scan_req_stru *scan_req)
317 {
318 /* 解决mbo认证扫描不全的问题: 每个信道停留40ms,发送两次probe req */
319 if (bcn_req->mode != RM_BCN_REQ_MEAS_MODE_ACTIVE) {
320 return;
321 }
322
323 scan_req->scan_time = WLAN_LONG_ACTIVE_SCAN_TIME;
324 scan_req->max_scan_count_per_channel = WLAN_DEFAULT_FG_SCAN_COUNT_PER_CHANNEL;
325 scan_req->max_send_probe_req_count_per_channel = WLAN_DEFAULT_FG_SCAN_COUNT_PER_CHANNEL;
326 }
327
hmac_mbo_modify_chan_param(osal_u8 optclass,wlan_channel_band_enum_uint8 * chan_band,osal_u8 * chan_count)328 OAL_STATIC osal_void hmac_mbo_modify_chan_param(osal_u8 optclass, wlan_channel_band_enum_uint8 *chan_band,
329 osal_u8 *chan_count)
330 {
331 /* 对MBO Beacon Report用例进行打桩,MBO AP请求beacon request的operating class为81(2.4G)或115(5G) */
332 if (optclass == MAC_GLOBAL_OPERATING_CLASS_NUMBER81) { /* operating class 81 对应信道集1-13 */
333 *chan_band = WLAN_BAND_2G;
334 *chan_count = (osal_u8)MAC_CHANNEL_FREQ_2_BUTT;
335 } else if (optclass == MAC_GLOBAL_OPERATING_CLASS_NUMBER115) {
336 /* operating class 115对应信道集36 40 44 48 */
337 *chan_band = WLAN_BAND_5G;
338 *chan_count = MAC_GLOBAL_OPERATING_CLASS_115_CH_NUMS;
339 }
340 }
341
hmac_mbo_scan_add_mbo_ie(hmac_vap_stru * hmac_vap,osal_u8 * app_ie,osal_u8 * ie_len)342 OAL_STATIC osal_void hmac_mbo_scan_add_mbo_ie(hmac_vap_stru *hmac_vap, osal_u8 *app_ie, osal_u8 *ie_len)
343 {
344 *ie_len = 0;
345
346 if (!is_legacy_sta(hmac_vap)) {
347 return;
348 }
349
350 mac_set_mbo_ie(hmac_vap, app_ie);
351 *ie_len = MAX_STA_MBO_IE_LEN;
352 }
353
hmac_mbo_assoc_add_mbo_and_soc_ie(hmac_vap_stru * hmac_vap,osal_u8 * buffer,osal_u8 * ie_len,hmac_scanned_bss_info * scaned_bss)354 OAL_STATIC osal_void hmac_mbo_assoc_add_mbo_and_soc_ie(hmac_vap_stru *hmac_vap, osal_u8 *buffer, osal_u8 *ie_len,
355 hmac_scanned_bss_info *scaned_bss)
356 {
357 osal_u8 len = 0;
358
359 *ie_len = 0;
360
361 if (!is_legacy_sta(hmac_vap)) {
362 return;
363 }
364
365 mac_set_mbo_ie(hmac_vap, buffer);
366 *ie_len += MAX_STA_MBO_IE_LEN;
367
368 mac_set_supported_operating_classes_ie(hmac_vap, buffer + *ie_len, &len, scaned_bss);
369 *ie_len += len;
370 }
371
hmac_mbo_sta_get_bss_list(osal_void * notify_data)372 OAL_STATIC osal_bool hmac_mbo_sta_get_bss_list(osal_void *notify_data)
373 {
374 osal_u8 bss_num = *(osal_u8 *)notify_data;
375 osal_void *mem_ptr = OSAL_NULL;
376
377 if (g_assoc_delay_attr_mbo_ie != OSAL_NULL) {
378 oam_warning_log0(0, OAM_SF_ANY, "vap_id[%d] hmac_mbo_sta_get_bss_list mem already malloc!");
379 return OSAL_TRUE;
380 }
381
382 mem_ptr = oal_mem_alloc(OAL_MEM_POOL_ID_LOCAL, bss_num * sizeof(mac_assoc_retry_delay_attr_mbo_ie_stru), OAL_TRUE);
383 if (mem_ptr == OSAL_NULL) {
384 oam_error_log0(0, OAM_SF_ANY, "vap_id[%d] hmac_mbo_sta_get_bss_list malloc null!");
385 return OSAL_FALSE;
386 }
387
388 (osal_void)memset_s(mem_ptr, bss_num * sizeof(mac_assoc_retry_delay_attr_mbo_ie_stru),
389 0, bss_num * sizeof(mac_assoc_retry_delay_attr_mbo_ie_stru));
390 g_assoc_delay_attr_mbo_ie = mem_ptr;
391
392 return OSAL_TRUE;
393 }
394
hmac_mbo_sta_handled_bss_list(osal_void * notify_data)395 OAL_STATIC osal_bool hmac_mbo_sta_handled_bss_list(osal_void *notify_data)
396 {
397 unref_param(notify_data);
398
399 if (g_assoc_delay_attr_mbo_ie == OSAL_NULL) {
400 oam_warning_log0(0, OAM_SF_ANY, "vap_id[%d] hmac_mbo_sta_handled_bss_list mem already free!");
401 return OSAL_TRUE;
402 }
403 oal_mem_free(g_assoc_delay_attr_mbo_ie, OAL_TRUE);
404 g_assoc_delay_attr_mbo_ie = OSAL_NULL;
405
406 return OSAL_TRUE;
407 }
408
hmac_mbo_sta_vap_add(osal_void * notify_data)409 OAL_STATIC osal_bool hmac_mbo_sta_vap_add(osal_void *notify_data)
410 {
411 hmac_vap_stru *hmac_vap = (hmac_vap_stru *)notify_data;
412 osal_void *mem_ptr = OSAL_NULL;
413 osal_u8 vap_id = hmac_vap->vap_id;
414
415 if (vap_id >= WLAN_VAP_MAX_NUM_PER_DEVICE_LIMIT) {
416 return OSAL_FALSE;
417 }
418
419 if (!is_legacy_sta(hmac_vap)) {
420 return OSAL_TRUE;
421 }
422
423 if (g_sta_mbo_para_info[vap_id] != OSAL_NULL) {
424 oam_warning_log1(0, OAM_SF_ANY, "vap_id[%d] hmac_mbo_sta_vap_add mem already malloc!", vap_id);
425 return OSAL_TRUE;
426 }
427
428 mem_ptr = oal_mem_alloc(OAL_MEM_POOL_ID_LOCAL, sizeof(mac_mbo_para_stru), OAL_TRUE);
429 if (mem_ptr == OSAL_NULL) {
430 oam_error_log1(0, OAM_SF_ANY, "vap_id[%d] hmac_mbo_sta_vap_add malloc null!", vap_id);
431 return OSAL_FALSE;
432 }
433
434 (osal_void)memset_s(mem_ptr, sizeof(mac_mbo_para_stru), 0, sizeof(mac_mbo_para_stru));
435 g_sta_mbo_para_info[vap_id] = mem_ptr;
436 g_sta_mbo_para_info[vap_id]->mbo_cell_capa = 0x3; // 0x3: not support cell
437
438 return OSAL_TRUE;
439 }
440
hmac_mbo_sta_vap_del(osal_void * notify_data)441 OAL_STATIC osal_bool hmac_mbo_sta_vap_del(osal_void *notify_data)
442 {
443 hmac_vap_stru *hmac_vap = (hmac_vap_stru *)notify_data;
444 osal_u8 vap_id = hmac_vap->vap_id;
445
446 if (vap_id >= WLAN_VAP_MAX_NUM_PER_DEVICE_LIMIT) {
447 return OSAL_FALSE;
448 }
449
450 if (!is_legacy_sta(hmac_vap)) {
451 return OSAL_TRUE;
452 }
453
454 if (g_sta_mbo_para_info[vap_id] == OSAL_NULL) {
455 oam_warning_log1(0, OAM_SF_ANY, "vap_id[%d] hmac_mbo_sta_vap_del mem already free!", vap_id);
456 return OSAL_TRUE;
457 }
458 oal_mem_free(g_sta_mbo_para_info[hmac_vap->vap_id], OAL_TRUE);
459 g_sta_mbo_para_info[vap_id] = OSAL_NULL;
460
461 return OSAL_TRUE;
462 }
463
hmac_mbo_sta_init(osal_void)464 osal_u32 hmac_mbo_sta_init(osal_void)
465 {
466 frw_util_notifier_register(WLAN_UTIL_NOTIFIER_EVENT_ADD_VAP, hmac_mbo_sta_vap_add);
467 frw_util_notifier_register(WLAN_UTIL_NOTIFIER_EVENT_DEL_VAP, hmac_mbo_sta_vap_del);
468 frw_util_notifier_register(WLAN_UTIL_NOTIFIER_EVENT_11V_NEW_BSS_LIST, hmac_mbo_sta_get_bss_list);
469 frw_util_notifier_register(WLAN_UTIL_NOTIFIER_EVENT_11V_FREE_BSS_LIST, hmac_mbo_sta_handled_bss_list);
470
471 hmac_feature_hook_register(HMAC_FHOOK_MBO_STA_ASSOC_ADD_MBO_SOC_IE, hmac_mbo_assoc_add_mbo_and_soc_ie);
472 hmac_feature_hook_register(HMAC_FHOOK_MBO_STA_HANDLE_MBO_IE, hmac_handle_ie_specific_mbo);
473 hmac_feature_hook_register(HMAC_FHOOK_MBO_STA_CHECK_IS_ASSOC_ALLOWED, hmac_mbo_check_is_assoc_or_re_assoc_allowed);
474 hmac_feature_hook_register(HMAC_FHOOK_MBO_STA_UPDATE_IS_ASSOC_ALLOWED, hmac_scan_update_bss_assoc_disallowed_attr);
475 hmac_feature_hook_register(HMAC_FHOOK_MBO_STA_SET_DELAY_PARAM, hmac_set_bss_re_assoc_delay_params);
476 hmac_feature_hook_register(HMAC_FHOOK_MBO_STA_ATTACH_MBO_IE_AUTH, hmac_roam_attach_mbo_ie_auth);
477 hmac_feature_hook_register(HMAC_FHOOK_MBO_STA_UPDATE_RRM_SCAN_PARAM, hmac_vap_mbo_update_rrm_scan_params);
478 hmac_feature_hook_register(HMAC_FHOOK_MBO_STA_MODIFY_CHAN_PARAM, hmac_mbo_modify_chan_param);
479 hmac_feature_hook_register(HMAC_FHOOK_MBO_STA_SCAN_ADD_MBO_IE, hmac_mbo_scan_add_mbo_ie);
480
481 return OAL_SUCC;
482 }
483
hmac_mbo_sta_deinit(osal_void)484 osal_void hmac_mbo_sta_deinit(osal_void)
485 {
486 frw_util_notifier_unregister(WLAN_UTIL_NOTIFIER_EVENT_ADD_VAP, hmac_mbo_sta_vap_add);
487 frw_util_notifier_unregister(WLAN_UTIL_NOTIFIER_EVENT_DEL_VAP, hmac_mbo_sta_vap_del);
488 frw_util_notifier_unregister(WLAN_UTIL_NOTIFIER_EVENT_11V_NEW_BSS_LIST, hmac_mbo_sta_get_bss_list);
489 frw_util_notifier_unregister(WLAN_UTIL_NOTIFIER_EVENT_11V_FREE_BSS_LIST, hmac_mbo_sta_handled_bss_list);
490
491 hmac_feature_hook_unregister(HMAC_FHOOK_MBO_STA_ASSOC_ADD_MBO_SOC_IE);
492 hmac_feature_hook_unregister(HMAC_FHOOK_MBO_STA_HANDLE_MBO_IE);
493 hmac_feature_hook_unregister(HMAC_FHOOK_MBO_STA_CHECK_IS_ASSOC_ALLOWED);
494 hmac_feature_hook_unregister(HMAC_FHOOK_MBO_STA_UPDATE_IS_ASSOC_ALLOWED);
495 hmac_feature_hook_unregister(HMAC_FHOOK_MBO_STA_SET_DELAY_PARAM);
496 hmac_feature_hook_unregister(HMAC_FHOOK_MBO_STA_ATTACH_MBO_IE_AUTH);
497 hmac_feature_hook_unregister(HMAC_FHOOK_MBO_STA_UPDATE_RRM_SCAN_PARAM);
498 hmac_feature_hook_unregister(HMAC_FHOOK_MBO_STA_MODIFY_CHAN_PARAM);
499 hmac_feature_hook_unregister(HMAC_FHOOK_MBO_STA_SCAN_ADD_MBO_IE);
500
501 return;
502 }
503 #ifdef __cplusplus
504 #if __cplusplus
505 }
506 #endif
507 #endif
508