• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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