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_roam_main.c
15 * 生成日期 : 2015年3月18日
16 * 功能描述 : 漫游模块主要对其他模块接口实现
17 */
18
19 /*****************************************************************************
20 1 头文件包含
21 *****************************************************************************/
22 #include "hmac_roam_main.h"
23
24 #include "oal_netbuf_data.h"
25 #include "oam_struct.h"
26 #include "mac_ie.h"
27 #include "mac_device_ext.h"
28 #include "mac_resource_ext.h"
29 #include "dmac_ext_if_hcm.h"
30 #include "hmac_fsm.h"
31 #include "hmac_sme_sta.h"
32 #include "hmac_mgmt_sta.h"
33 #include "hmac_resource.h"
34 #include "hmac_device.h"
35 #include "hmac_11i.h"
36 #include "hmac_roam_connect.h"
37 #include "hmac_roam_alg.h"
38 #ifdef _PRE_PLAT_FEATURE_CUSTOMIZE
39 #include "soc_customize_wifi.h"
40 #endif /* #ifdef _PRE_PLAT_FEATURE_CUSTOMIZE */
41 #include "wlan_msg.h"
42 #include "hmac_dfx.h"
43 #include "hmac_feature_dft.h"
44 #include "hmac_feature_interface.h"
45 #include "hmac_btcoex_ps.h"
46 #include "common_dft.h"
47 #include "frw_util_notifier.h"
48 #include "hmac_feature_interface.h"
49 #include "frw_hmac.h"
50 #include "wlan_msg.h"
51 #include "hmac_hook.h"
52 #include "hmac_11v.h"
53 #include "hmac_11r.h"
54 #include "hmac_ccpriv.h"
55 #if defined(CONFIG_MIDDLEWARE_SUPPORT_NV)
56 #include "nv.h"
57 #endif
58
59 #ifdef __cplusplus
60 #if __cplusplus
61 extern "C" {
62 #endif
63 #endif
64
65 #undef THIS_FILE_ID
66 #define THIS_FILE_ID DIAG_FILE_ID_WIFI_HOST_HMAC_ROAM_MAIN_C
67
68 #undef THIS_MOD_ID
69 #define THIS_MOD_ID DIAG_MOD_ID_WIFI_HOST
70
71 /*****************************************************************************
72 2 全局变量定义
73 *****************************************************************************/
74 hmac_roam_info_stru *g_roam_info[WLAN_VAP_MAX_NUM_PER_DEVICE_LIMIT] = {
75 OSAL_NULL, OSAL_NULL, OSAL_NULL, OSAL_NULL
76 };
77
78 OAL_STATIC hmac_roam_fsm_func g_hmac_roam_main_fsm_func[ROAM_MAIN_STATE_BUTT][ROAM_MAIN_FSM_EVENT_TYPE_BUTT];
79 OAL_STATIC osal_u32 hmac_roam_main_null_fn(hmac_roam_info_stru *roam_info, osal_void *param);
80 OAL_STATIC osal_u32 hmac_roam_scan_init(hmac_roam_info_stru *roam_info, osal_void *param);
81 OAL_STATIC osal_u32 hmac_roam_scan_channel(hmac_roam_info_stru *roam_info, osal_void *param);
82 OAL_STATIC osal_u32 hmac_roam_check_scan_result(hmac_roam_info_stru *roam_info, hmac_bss_mgmt_stru *bss_mgmt,
83 mac_bss_dscr_stru **ppst_bss_dscr_out);
84 OAL_STATIC osal_u32 hmac_roam_to_old_bss(hmac_roam_info_stru *roam_info);
85 OAL_STATIC osal_u32 hmac_roam_to_new_bss(hmac_roam_info_stru *roam_info, osal_void *param);
86 OAL_STATIC osal_u32 hmac_roam_main_check_state(hmac_roam_info_stru *roam_info,
87 mac_vap_state_enum_uint8 vap_state, roam_main_state_enum_uint8 main_state);
88 OAL_STATIC osal_u32 hmac_roam_scan_timeout(hmac_roam_info_stru *roam_info, osal_void *param);
89 OAL_STATIC osal_u32 hmac_roam_connecting_timeout(hmac_roam_info_stru *roam_info, osal_void *p_param);
90 OAL_STATIC osal_u32 hmac_roam_connecting_fail(hmac_roam_info_stru *roam_info, osal_void *p_param);
91 OAL_STATIC osal_u32 hmac_roam_handle_fail_handshake_phase(hmac_roam_info_stru *roam_info, osal_void *p_param);
92 OAL_STATIC osal_u32 hmac_roam_handle_scan_result(hmac_roam_info_stru *roam_info, osal_void *p_param);
93 OAL_STATIC osal_u32 hmac_roam_rssi_trigger_type(hmac_vap_stru *hmac_vap, roam_scenario_enum_uint8 val);
94 OAL_STATIC osal_s32 hmac_config_roam_hmac_sync_dmac(hmac_vap_stru *hmac_vap, mac_h2d_roam_sync_stru *sync_param);
95 OAL_STATIC osal_u32 hmac_roam_scan_complete_etc(hmac_vap_stru *hmac_vap);
96 OAL_STATIC osal_u32 hmac_roam_resume_user_etc(hmac_vap_stru *hmac_vap);
97 OAL_STATIC osal_u32 hmac_roam_trigger_handle_etc(hmac_vap_stru *hmac_vap, osal_s8 c_rssi,
98 oal_bool_enum_uint8 cur_bss_ignore);
99 OAL_STATIC osal_s32 hmac_config_roam_enable(hmac_vap_stru *hmac_vap, osal_u8 roaming_mode);
100
101 /*****************************************************************************
102 3 函数实现
103 *****************************************************************************/
104 /*****************************************************************************
105 函 数 名 : hmac_roam_fsm_init
106 返 回 值 : OAL_SUCC 或 失败错误码
107 *****************************************************************************/
108
hmac_get_roam_info(osal_u8 vap_id)109 hmac_roam_info_stru *hmac_get_roam_info(osal_u8 vap_id)
110 {
111 if (hmac_vap_id_param_check(vap_id) != OSAL_TRUE) {
112 return OSAL_NULL;
113 }
114 return g_roam_info[vap_id];
115 }
116
hmac_roam_set_linkloss_done(osal_u8 vap_id,osal_u8 val)117 OAL_STATIC osal_void hmac_roam_set_linkloss_done(osal_u8 vap_id, osal_u8 val)
118 {
119 if (hmac_get_roam_info(vap_id) != OSAL_NULL) {
120 g_roam_info[vap_id]->linkloss_roam_done = val;
121 }
122 }
123
hmac_roam_fsm_deinit(osal_void)124 OAL_STATIC osal_void hmac_roam_fsm_deinit(osal_void)
125 {
126 osal_u32 state;
127 osal_u32 event;
128
129 for (state = 0; state < ROAM_MAIN_STATE_BUTT; state++) {
130 for (event = 0; event < ROAM_MAIN_FSM_EVENT_TYPE_BUTT; event++) {
131 g_hmac_roam_main_fsm_func[state][event] = hmac_roam_main_null_fn;
132 }
133 }
134 }
135
hmac_roam_fsm_init(osal_void)136 OAL_STATIC osal_void hmac_roam_fsm_init(osal_void)
137 {
138 hmac_roam_fsm_deinit();
139 g_hmac_roam_main_fsm_func[ROAM_MAIN_STATE_INIT][ROAM_MAIN_FSM_EVENT_START] = hmac_roam_scan_init;
140 g_hmac_roam_main_fsm_func[ROAM_MAIN_STATE_SCANING][ROAM_MAIN_FSM_EVENT_START] = hmac_roam_scan_channel;
141 g_hmac_roam_main_fsm_func[ROAM_MAIN_STATE_SCANING][ROAM_MAIN_FSM_EVENT_SCAN_RESULT] =
142 hmac_roam_handle_scan_result;
143 g_hmac_roam_main_fsm_func[ROAM_MAIN_STATE_SCANING][ROAM_MAIN_FSM_EVENT_TIMEOUT] = hmac_roam_scan_timeout;
144 g_hmac_roam_main_fsm_func[ROAM_MAIN_STATE_SCANING][ROAM_MAIN_FSM_EVENT_START_CONNECT] = hmac_roam_connect_to_bss;
145 g_hmac_roam_main_fsm_func[ROAM_MAIN_STATE_CONNECTING][ROAM_MAIN_FSM_EVENT_TIMEOUT] =
146 hmac_roam_connecting_timeout;
147 g_hmac_roam_main_fsm_func[ROAM_MAIN_STATE_CONNECTING][ROAM_MAIN_FSM_EVENT_CONNECT_FAIL] = hmac_roam_connecting_fail;
148 g_hmac_roam_main_fsm_func[ROAM_MAIN_STATE_CONNECTING][ROAM_MAIN_FSM_EVENT_HANDSHAKE_FAIL] =
149 hmac_roam_handle_fail_handshake_phase;
150 g_hmac_roam_main_fsm_func[ROAM_MAIN_STATE_CONNECTING][ROAM_MAIN_FSM_EVENT_CONNECT_SUCC] = hmac_roam_to_new_bss;
151 }
152
153 /*****************************************************************************
154 函 数 名 : hmac_roam_main_fsm_action_etc
155 功能描述 : 调用漫游主状态机函数表
156 输入参数 : hmac_vap: hmac vap
157 event: 事件类型
158 p_param: 输入参数
159 ************* ****************************************************************/
hmac_roam_main_fsm_action_etc(hmac_roam_info_stru * roam_info,roam_main_fsm_event_type_enum event,osal_void * p_param)160 osal_u32 hmac_roam_main_fsm_action_etc(hmac_roam_info_stru *roam_info, roam_main_fsm_event_type_enum event,
161 osal_void *p_param)
162 {
163 if (osal_unlikely(roam_info == OAL_PTR_NULL)) {
164 return OAL_ERR_CODE_PTR_NULL;
165 }
166
167 if (roam_info->main_state >= ROAM_MAIN_STATE_BUTT) {
168 return OAL_ERR_CODE_ROAM_STATE_UNEXPECT;
169 }
170
171 if (event >= ROAM_MAIN_FSM_EVENT_TYPE_BUTT) {
172 return OAL_ERR_CODE_ROAM_EVENT_UXEXPECT;
173 }
174
175 oam_warning_log2(0, OAM_SF_ROAM, "hmac_roam_main_fsm_action_etc::roam_main_state[%d] event[%d]\r\n",
176 roam_info->main_state, event);
177 return g_hmac_roam_main_fsm_func[roam_info->main_state][event](roam_info, p_param);
178 }
179
180 /*****************************************************************************
181 函 数 名 : hmac_roam_main_change_state
182 功能描述 : 改变状态机状态
183 输入参数 : roam_info
184 roam_main_state
185 *****************************************************************************/
hmac_roam_main_change_state(hmac_roam_info_stru * roam_info,roam_main_state_enum_uint8 state)186 osal_void hmac_roam_main_change_state(hmac_roam_info_stru *roam_info, roam_main_state_enum_uint8 state)
187 {
188 if (roam_info) {
189 oam_warning_log2(0, OAM_SF_ROAM,
190 "{hmac_roam_main_change_state::[%d]->[%d]}", roam_info->main_state, state);
191 roam_info->main_state = state;
192 }
193 }
194
195 /*****************************************************************************
196 函 数 名 : hmac_roam_main_timeout
197 功能描述 : 超时处理函数
198 返 回 值 : OAL_SUCC 或 失败错误码
199 *****************************************************************************/
hmac_roam_main_timeout(osal_void * p_arg)200 OAL_STATIC osal_u32 hmac_roam_main_timeout(osal_void *p_arg)
201 {
202 hmac_roam_info_stru *roam_info;
203
204 if (osal_unlikely(p_arg == OAL_PTR_NULL)) {
205 return OAL_ERR_CODE_PTR_NULL;
206 }
207 roam_info = (hmac_roam_info_stru *)p_arg;
208
209 oam_warning_log2(0, OAM_SF_ROAM, "{hmac_roam_main_timeout::MAIN_STATE[%d] CONNECT_STATE[%d].}",
210 roam_info->main_state, roam_info->connect.state);
211
212 return hmac_roam_main_fsm_action_etc(roam_info, ROAM_MAIN_FSM_EVENT_TIMEOUT, OAL_PTR_NULL);
213 }
214
hmac_roam_renew_privacy_wpa(hmac_vap_stru * hmac_vap,mac_bss_dscr_stru * bss_dscr,mac_conn_security_stru * conn_sec)215 OAL_STATIC osal_void hmac_roam_renew_privacy_wpa(hmac_vap_stru *hmac_vap, mac_bss_dscr_stru *bss_dscr,
216 mac_conn_security_stru *conn_sec)
217 {
218 osal_u32 match_suite;
219
220 conn_sec->privacy = OAL_TRUE;
221 hmac_ie_get_wpa_cipher(bss_dscr->wpa_ie, &(conn_sec->crypto));
222
223 if (conn_sec->crypto.pair_suite[0] != 0 && conn_sec->crypto.pair_suite[1] != 0) {
224 /* wpa/wpa2 混合加密算法按算法最大能力漫游, AES > TKIP */
225 oam_warning_log2(0, OAM_SF_CFG, "{hmac_roam_renew_privacy_wpa::pair_suite[0]=[0x%x], pair_suite[1]=[0x%x]}",
226 conn_sec->crypto.pair_suite[0], conn_sec->crypto.pair_suite[1]);
227 conn_sec->crypto.pair_suite[0] = (conn_sec->crypto.pair_suite[0] == MAC_WPA_CHIPER_CCMP) ?
228 conn_sec->crypto.pair_suite[0] : conn_sec->crypto.pair_suite[1];
229 } else {
230 match_suite = mac_mib_wpa_pair_match_suites(hmac_vap, conn_sec->crypto.pair_suite);
231 if (match_suite != 0) {
232 conn_sec->crypto.pair_suite[0] = match_suite;
233 }
234 }
235 conn_sec->crypto.pair_suite[1] = 0;
236
237 match_suite = mac_mib_wpa_akm_match_suites(hmac_vap, conn_sec->crypto.pair_suite);
238 if (match_suite != 0) {
239 conn_sec->crypto.akm_suite[0] = match_suite;
240 }
241 conn_sec->crypto.akm_suite[1] = 0;
242 }
243
hmac_roam_renew_privacy_rsn(hmac_vap_stru * hmac_vap,mac_bss_dscr_stru * bss_dscr,mac_conn_security_stru * conn_sec,osal_u16 * rsn_cap_info)244 OAL_STATIC osal_void hmac_roam_renew_privacy_rsn(hmac_vap_stru *hmac_vap, mac_bss_dscr_stru *bss_dscr,
245 mac_conn_security_stru *conn_sec, osal_u16 *rsn_cap_info)
246 {
247 osal_u32 match_suite;
248
249 conn_sec->privacy = OAL_TRUE;
250 hmac_ie_get_rsn_cipher(bss_dscr->rsn_ie, &(conn_sec->crypto));
251
252 if (conn_sec->crypto.pair_suite[0] != 0 && conn_sec->crypto.pair_suite[1] != 0) {
253 /* wpa2/wpa3 混合加密算法按算法最大能力漫游, AES > TKIP */
254 oam_warning_log2(0, OAM_SF_CFG, "{hmac_roam_renew_privacy_rsn::pair_suite[0]=[0x%x], pair_suite[1]=[0x%x]}",
255 conn_sec->crypto.pair_suite[0], conn_sec->crypto.pair_suite[1]);
256 conn_sec->crypto.pair_suite[0] = (conn_sec->crypto.pair_suite[0] == MAC_RSN_CHIPER_CCMP) ?
257 conn_sec->crypto.pair_suite[0] : conn_sec->crypto.pair_suite[1];
258 } else {
259 match_suite = mac_mib_rsn_pair_match_suites(hmac_vap, conn_sec->crypto.pair_suite);
260 if (match_suite != 0) {
261 conn_sec->crypto.pair_suite[0] = match_suite;
262 }
263 }
264 conn_sec->crypto.pair_suite[1] = 0;
265
266 if (conn_sec->crypto.akm_suite[0] != 0 && conn_sec->crypto.akm_suite[1] != 0) {
267 /* wpa2/wpa3 混合加密方式按最大能力漫游, WPA3 > WPA2 */
268 oam_warning_log2(0, OAM_SF_CFG, "{hmac_roam_renew_privacy_rsn::akm_suite[0]=[0x%x], akm_suite[1]=[0x%x]}",
269 conn_sec->crypto.akm_suite[0], conn_sec->crypto.akm_suite[1]);
270 conn_sec->crypto.akm_suite[0] = (conn_sec->crypto.akm_suite[0] == MAC_RSN_AKM_SAE_SHA256) ?
271 conn_sec->crypto.akm_suite[0] : conn_sec->crypto.akm_suite[1];
272 } else {
273 match_suite = mac_mib_rsn_akm_match_suites(hmac_vap, conn_sec->crypto.pair_suite);
274 if (match_suite != 0) {
275 conn_sec->crypto.akm_suite[0] = match_suite;
276 }
277 }
278 conn_sec->crypto.akm_suite[1] = 0;
279 /* 获取目的AP的RSN CAP信息 */
280 *rsn_cap_info = hmac_get_rsn_capability_etc(bss_dscr->rsn_ie);
281 }
282
283 /*****************************************************************************
284 函 数 名 : hmac_roam_renew_privacy
285 功能描述 : 为了兼容不同加密方式的ap之间的漫游,需要对本vap的加密属性最大初始化
286 输入参数 : RSN优先,AKM优先,当前PAIR优先
287 返 回 值 : OAL_SUCC 或 失败错误码
288 *****************************************************************************/
hmac_roam_renew_privacy(hmac_vap_stru * hmac_vap,mac_bss_dscr_stru * bss_dscr)289 OAL_STATIC osal_u32 hmac_roam_renew_privacy(hmac_vap_stru *hmac_vap, mac_bss_dscr_stru *bss_dscr)
290 {
291 osal_u32 ul_ret;
292 mac_conn_security_stru conn_sec = {0};
293 mac_cap_info_stru *cap_info = OAL_PTR_NULL;
294 osal_u16 rsn_cap_info = 0;
295 oal_bool_enum_uint8 pmf_cap;
296 oal_bool_enum_uint8 pmf_require;
297
298 cap_info = (mac_cap_info_stru *)&bss_dscr->us_cap_info;
299
300 if (cap_info->privacy == 0) {
301 return OAL_SUCC;
302 }
303
304 memset_s(&conn_sec, OAL_SIZEOF(mac_conn_security_stru), 0, OAL_SIZEOF(mac_conn_security_stru));
305
306 if (bss_dscr->wpa_ie != OAL_PTR_NULL) {
307 hmac_roam_renew_privacy_wpa(hmac_vap, bss_dscr, &conn_sec);
308 }
309
310 if (bss_dscr->rsn_ie != OAL_PTR_NULL) {
311 hmac_roam_renew_privacy_rsn(hmac_vap, bss_dscr, &conn_sec, &rsn_cap_info);
312 }
313
314 /* 漫游时使用上次pmf能力位 并判断与漫游的目的ap能力位是否匹配 */
315 pmf_cap = mac_mib_get_dot11_rsnamfpc(hmac_vap);
316 pmf_require = mac_mib_get_dot11_rsnamfpr(hmac_vap);
317 /* AP1 roam to AP2, AP1 PMF=2, AP2 PMF = 0/1, 不支持漫游 */
318 if (((hmac_vap->user_rsn_cap & BIT6) != 0) && ((rsn_cap_info & BIT6) == 0)) {
319 oam_warning_log0(0, OAM_SF_CFG, "{hmac_roam_renew_privacy::PMF = 2 roam to PMF = 0/1 is not supported}");
320 return OAL_FAIL;
321 }
322 /* AP1 roam to AP2, AP1 PMF=0/1, AP2 PMF = 2, 不支持漫游 */
323 if (((hmac_vap->user_rsn_cap & BIT6) == 0) && ((rsn_cap_info & BIT6) != 0)) {
324 oam_warning_log0(0, OAM_SF_CFG, "{hmac_roam_renew_privacy::PMF = 0/1 roam to PMF = 2 is not supported}");
325 return OAL_FAIL;
326 }
327 /* 直接赋值上次一次的pmf能力位 不会出现r=1 c=0的异常,故不作判断 */
328 conn_sec.mgmt_proteced = hmac_vap->user_pmf_cap;
329 conn_sec.pmf_cap = pmf_cap + pmf_require;
330
331 ul_ret = hmac_vap_init_privacy_etc(hmac_vap, &conn_sec);
332 if (ul_ret != OAL_SUCC) {
333 oam_error_log1(0, OAM_SF_CFG, "{hmac_roam_renew_privacy:: mac_11i_init_privacy failed[%d]!}\r\n", ul_ret);
334 return ul_ret;
335 }
336
337 oam_warning_log3(0, OAM_SF_CFG, "{hmac_roam_renew_privacy::wpa_cap[%d], wpa2_cap[%d], wpa3_cap[%d]}",
338 hmac_vap->cap_flag.wpa, hmac_vap->cap_flag.wpa2, hmac_vap->cap_flag.wpa3);
339 return OAL_SUCC;
340 }
341
hmac_roam_init_config(hmac_vap_stru * hmac_vap,hmac_roam_info_stru * roam_info)342 static osal_void hmac_roam_init_config(hmac_vap_stru *hmac_vap, hmac_roam_info_stru *roam_info)
343 {
344 #ifdef _PRE_PLAT_FEATURE_CUSTOMIZE
345 wlan_customize_stru *wlan_customize_etc = (wlan_customize_stru *)hwifi_wlan_customize_etc();
346
347 roam_info->config.scan_band =
348 (hmac_device_check_5g_enable(hmac_vap->device_id) == OSAL_TRUE) ? (BIT0 | BIT1) : BIT0;
349 roam_info->config.scan_orthogonal = wlan_customize_etc->roam_scan_orthogonal;
350 roam_info->config.c_trigger_rssi_2g = wlan_customize_etc->c_roam_trigger_b;
351 roam_info->config.c_trigger_rssi_5g = wlan_customize_etc->c_roam_trigger_a;
352 roam_info->config.c_dense_env_trigger_rssi_2g = wlan_customize_etc->c_dense_env_roam_trigger_b;
353 roam_info->config.c_dense_env_trigger_rssi_5g = wlan_customize_etc->c_dense_env_roam_trigger_a;
354 roam_info->config.delta_rssi_2g = (osal_u8)wlan_customize_etc->c_roam_delta_b;
355 roam_info->config.delta_rssi_5g = (osal_u8)wlan_customize_etc->c_roam_delta_a;
356 roam_info->config.scenario_enable = wlan_customize_etc->scenario_enable;
357 roam_info->config.c_candidate_good_rssi = wlan_customize_etc->c_candidate_good_rssi;
358 roam_info->config.candidate_good_num = wlan_customize_etc->candidate_good_num;
359 roam_info->config.candidate_weak_num = wlan_customize_etc->candidate_weak_num;
360 #else
361 unref_param(hmac_vap);
362 roam_info->config.scan_band = ROAM_BAND_2G_BIT | ROAM_BAND_5G_BIT;
363 roam_info->config.scan_orthogonal = ROAM_SCAN_CHANNEL_ORG_BUTT;
364 roam_info->config.c_trigger_rssi_2g = ROAM_RSSI_NE70_DB;
365 roam_info->config.c_trigger_rssi_5g = ROAM_RSSI_NE70_DB;
366 roam_info->config.c_dense_env_trigger_rssi_2g = ROAM_RSSI_NE70_DB;
367 roam_info->config.c_dense_env_trigger_rssi_5g = ROAM_RSSI_NE68_DB;
368 roam_info->config.delta_rssi_2g = ROAM_RSSI_DIFF_10_DB;
369 roam_info->config.delta_rssi_5g = ROAM_RSSI_DIFF_10_DB;
370 roam_info->config.scenario_enable = OAL_FALSE;
371 roam_info->config.c_candidate_good_rssi = ROAM_ENV_RSSI_NE60_DB;
372 roam_info->config.candidate_good_num = ROAM_ENV_CANDIDATE_GOOD_NUM;
373 roam_info->config.candidate_weak_num = ROAM_ENV_CANDIDATE_WEAK_NUM;
374 #endif
375 }
376
377 /*****************************************************************************
378 函 数 名 : hmac_roam_info_init_etc
379 功能描述 : roam过程信息初始化
380 输入参数 : hmac_vap 需要初始化roam模块的vap,默认参数配置
381 返 回 值 : OAL_SUCC 或 失败错误码
382 *****************************************************************************/
hmac_roam_info_init_etc(osal_void * notify_data)383 OAL_STATIC osal_bool hmac_roam_info_init_etc(osal_void *notify_data)
384 {
385 hmac_user_stru *hmac_user = (hmac_user_stru *)notify_data;
386 hmac_vap_stru *hmac_vap;
387 hmac_roam_info_stru *roam_info;
388
389 if (osal_unlikely(hmac_user == OAL_PTR_NULL)) {
390 return OSAL_FALSE;
391 }
392
393 hmac_vap = mac_res_get_hmac_vap(hmac_user->vap_id);
394 if (osal_unlikely(hmac_vap == OSAL_NULL)) {
395 return OSAL_FALSE;
396 }
397
398 if (!is_legacy_sta(hmac_vap)) {
399 return OSAL_TRUE;
400 }
401
402 roam_info = hmac_get_roam_info(hmac_vap->vap_id);
403 if (roam_info == OAL_PTR_NULL) {
404 return OSAL_FALSE;
405 }
406
407 roam_info->main_state = ROAM_MAIN_STATE_INIT;
408 roam_info->rssi_type = ROAM_ENV_SPARSE_AP;
409 roam_info->invalid_scan_cnt = 0;
410 roam_info->connect.state = ROAM_CONNECT_STATE_INIT;
411 roam_info->alg.max_capacity = 0;
412 roam_info->alg.max_capacity_bss = OAL_PTR_NULL;
413 roam_info->alg.c_current_rssi = 0;
414 roam_info->alg.c_max_rssi = 0;
415 roam_info->alg.another_bss_scaned = 0;
416 roam_info->alg.invalid_scan_cnt = 0;
417 roam_info->alg.candidate_bss_num = 0;
418 roam_info->alg.candidate_good_rssi_num = 0;
419 roam_info->alg.candidate_weak_rssi_num = 0;
420 roam_info->alg.scan_period = 0;
421 roam_info->alg.max_rssi_bss = OAL_PTR_NULL;
422 roam_info->hmac_user = hmac_user;
423 if (roam_info->hmac_user == OAL_PTR_NULL) {
424 oam_error_log2(0, OAM_SF_ROAM,
425 "vap_id[%d] {hmac_roam_info_init_etc::assoc_vap_id[%d] can't found.}",
426 hmac_vap->vap_id, hmac_vap->assoc_vap_id);
427 return OSAL_FALSE;
428 }
429
430 roam_info->trigger.trigger_2g = roam_info->config.c_trigger_rssi_2g;
431 roam_info->trigger.trigger_5g = roam_info->config.c_trigger_rssi_5g;
432
433 /* 设置门限时,reset统计值,重新设置门限后,可以马上触发一次漫游 */
434 roam_info->trigger.cnt = 0;
435 roam_info->trigger.time_stamp = 0;
436
437 oam_warning_log3(0, OAM_SF_ROAM, "vap_id[%d] {hmac_roam_info_init_etc, trigger[%d, %d]}", hmac_vap->vap_id,
438 roam_info->trigger.trigger_2g, roam_info->trigger.trigger_5g);
439
440 return OSAL_TRUE;
441 }
442
443
444 /*****************************************************************************
445 函 数 名 : hmac_roam_connect_start_timer
446 功能描述 : 如果定时器已存在,重启,否则创建定时器
447 返 回 值 : OAL_SUCC 或 失败错误码
448 *****************************************************************************/
hmac_roam_main_start_timer(hmac_roam_info_stru * roam_info,osal_u32 timeout)449 OAL_STATIC osal_void hmac_roam_main_start_timer(hmac_roam_info_stru *roam_info, osal_u32 timeout)
450 {
451 frw_timeout_stru *timer = &(roam_info->timer);
452
453 oam_info_log1(0, OAM_SF_ROAM, "{hmac_roam_main_start_timer [%d].}", timeout);
454
455 /* 启动认证超时定时器 */
456 frw_create_timer_entry(timer,
457 hmac_roam_main_timeout,
458 timeout,
459 roam_info,
460 OAL_FALSE);
461 }
462
463 /*****************************************************************************
464 函 数 名 : hmac_roam_connect_del_timer
465 功能描述 : 立即删除roam connect定时器
466 返 回 值 : OAL_SUCC 或 失败错误码
467 *****************************************************************************/
hmac_roam_main_del_timer(hmac_roam_info_stru * roam_info)468 osal_void hmac_roam_main_del_timer(hmac_roam_info_stru *roam_info)
469 {
470 oam_info_log0(0, OAM_SF_ROAM, "{hmac_roam_main_del_timer.}");
471 frw_destroy_timer_entry(&(roam_info->timer));
472 return;
473 }
474
475 /*****************************************************************************
476 函 数 名 : hmac_roam_start_etc
477 功能描述 : 发起一次漫游
478 *****************************************************************************/
hmac_roam_start_etc(hmac_vap_stru * hmac_vap,roam_channel_org_enum scan_type,oal_bool_enum_uint8 cur_bss_ignore,roam_trigger_enum_uint8 roam_trigger)479 osal_u32 hmac_roam_start_etc(hmac_vap_stru *hmac_vap, roam_channel_org_enum scan_type,
480 oal_bool_enum_uint8 cur_bss_ignore, roam_trigger_enum_uint8 roam_trigger)
481 {
482 osal_u32 ul_ret;
483 hmac_roam_info_stru *roam_info;
484
485 if (osal_unlikely(hmac_vap == OAL_PTR_NULL)) {
486 oam_error_log0(0, OAM_SF_ROAM, "{hmac_roam_start_etc::hmac_vap null.}");
487 return OAL_ERR_CODE_PTR_NULL;
488 }
489
490 roam_info = hmac_get_roam_info(hmac_vap->vap_id);
491 ul_ret = hmac_roam_main_check_state(roam_info, MAC_VAP_STATE_UP, ROAM_MAIN_STATE_INIT);
492 if (ul_ret != OAL_SUCC) {
493 oam_warning_log1(0, OAM_SF_ROAM, "{hmac_roam_start_etc::check_state fail[%d]!}", ul_ret);
494 return ul_ret;
495 }
496
497 /* 每次漫游前,刷新是否支持漫游到自己的参数 */
498 roam_info->config.scan_orthogonal = scan_type;
499 roam_info->current_bss_ignore = cur_bss_ignore; /* true表示漫游到自己 */
500 roam_info->roam_trigger = roam_trigger;
501
502 oam_warning_log4(0, OAM_SF_ROAM,
503 "vap_id[%d] {hmac_roam_start_etc::START succ, scan_type=%d, cur_bss_ignore=%d roam_trigger=%d.}",
504 hmac_vap->vap_id, scan_type, cur_bss_ignore, roam_trigger);
505
506 hmac_roam_alg_init_etc(roam_info, ROAM_RSSI_CMD_TYPE);
507
508 /* 触发漫游是否搭配扫描0表示不扫描 */
509 if (scan_type == ROAM_SCAN_CHANNEL_ORG_0) {
510 hmac_roam_main_change_state(roam_info, ROAM_MAIN_STATE_SCANING);
511
512 ul_ret = hmac_roam_main_fsm_action_etc(roam_info, ROAM_MAIN_FSM_EVENT_TIMEOUT, OAL_PTR_NULL);
513 if (ul_ret != OAL_SUCC) {
514 oam_error_log2(0, OAM_SF_ROAM, "vap_id[%d] {hmac_roam_start_etc::START fail[%d].}",
515 hmac_vap->vap_id, ul_ret);
516 return ul_ret;
517 }
518 } else {
519 ul_ret = hmac_roam_main_fsm_action_etc(roam_info, ROAM_MAIN_FSM_EVENT_START, OAL_PTR_NULL);
520 if (ul_ret != OAL_SUCC) {
521 oam_error_log2(0, OAM_SF_ROAM, "vap_id[%d] {hmac_roam_start_etc::START fail[%d].}",
522 hmac_vap->vap_id, ul_ret);
523 return ul_ret;
524 }
525 }
526
527 return OAL_SUCC;
528 }
529
530 /*****************************************************************************
531 函 数 名 : hmac_roam_show_etc
532 功能描述 : 发起一次漫游
533 *****************************************************************************/
hmac_roam_show_etc(const hmac_vap_stru * hmac_vap)534 OAL_STATIC osal_u32 hmac_roam_show_etc(const hmac_vap_stru *hmac_vap)
535 {
536 hmac_roam_info_stru *roam_info;
537 hmac_roam_static_stru *pst_static;
538 hmac_roam_config_stru *info;
539 osal_u8 vap_id = hmac_vap->vap_id;
540
541 roam_info = hmac_get_roam_info(vap_id);
542 pst_static = &roam_info->st_static;
543 info = &(roam_info->config);
544
545 oam_warning_log4(0, OAM_SF_ROAM,
546 "{hmac_roam_show_etc::band[%d] scan_orthogonal[%d], c_trigger_rssi_2g=%d c_trigger_rssi_5g=%d}",
547 info->scan_band, info->scan_orthogonal, info->c_trigger_rssi_2g, info->c_trigger_rssi_5g);
548 oam_warning_log4(0, OAM_SF_ROAM,
549 "{hmac_roam_show_etc::trigger_rssi_cnt[%u] trigger_linkloss_cnt[%u],"
550 " dense env c_trigger_rssi_2g=%d c_trigger_rssi_5g=%d.}",
551 pst_static->trigger_rssi_cnt, pst_static->trigger_linkloss_cnt, info->c_dense_env_trigger_rssi_2g,
552 info->c_dense_env_trigger_rssi_5g);
553 oam_warning_log3(0, OAM_SF_ROAM, "vap_id[%d] {hmac_roam_show_etc::scan_cnt[%u] scan_result_cnt[%u].}",
554 vap_id, pst_static->scan_cnt, pst_static->scan_result_cnt);
555 oam_warning_log4(0, OAM_SF_ROAM,
556 "vap_id[%d] {hmac_roam_show_etc::total_cnt[%u] roam_success_cnt[%u] roam_fail_cnt[%u].}",
557 vap_id, pst_static->connect_cnt, pst_static->roam_new_cnt, pst_static->roam_old_cnt);
558 oam_warning_log3(0, OAM_SF_ROAM, "vap_id[%d] {hmac_roam_show_etc::roam_to, scan fail=%d, eap fail=%d}",
559 vap_id, roam_info->st_static.roam_scan_fail, roam_info->st_static.roam_eap_fail);
560
561 return OAL_SUCC;
562 }
563
564 /*****************************************************************************
565 函 数 名 : hmac_roam_main_null_fn
566 返 回 值 : OAL_SUCC 或 失败错误码
567 *****************************************************************************/
hmac_roam_main_null_fn(hmac_roam_info_stru * roam_info,osal_void * param)568 OAL_STATIC osal_u32 hmac_roam_main_null_fn(hmac_roam_info_stru *roam_info, osal_void *param)
569 {
570 unref_param(roam_info);
571 unref_param(param);
572
573 oam_warning_log0(0, OAM_SF_ROAM, "{hmac_roam_main_null_fn .}");
574
575 return OAL_SUCC;
576 }
577
578 /*****************************************************************************
579 函 数 名 : hmac_roam_scan_comp_cb
580 功能描述 : wpa_supplicant下发的扫描请求的回调函数,用于对扫描完成时对结果的处理
581 输入参数 : void *p_scan_record,扫描记录,包括扫描发起者信息和扫描结果
582 *****************************************************************************/
hmac_roam_scan_comp_cb(void * p_scan_record)583 OAL_STATIC osal_void hmac_roam_scan_comp_cb(void *p_scan_record)
584 {
585 hmac_scan_record_stru *scan_record = (hmac_scan_record_stru *)p_scan_record;
586 hmac_vap_stru *hmac_vap = OAL_PTR_NULL;
587 hmac_roam_info_stru *roam_info;
588 hmac_device_stru *hmac_device;
589 hmac_bss_mgmt_stru *scan_bss_mgmt;
590 osal_u32 ret;
591
592 /* 获取hmac vap */
593 hmac_vap = mac_res_get_hmac_vap(scan_record->vap_id);
594 if (hmac_vap == OAL_PTR_NULL) {
595 oam_error_log0(0, OAM_SF_SCAN, "{hmac_roam_scan_comp_cb::hmac_vap is null.");
596 return;
597 }
598
599 /* 获取hmac device */
600 hmac_device = hmac_res_get_mac_dev_etc(hmac_vap->device_id);
601 if (hmac_device == OAL_PTR_NULL) {
602 oam_error_log0(0, OAM_SF_ROAM, "{hmac_roam_scan_complete_etc::device null!}");
603 return;
604 }
605
606 scan_bss_mgmt = &(hmac_device->scan_mgmt.scan_record_mgmt.bss_mgmt);
607
608 roam_info = hmac_get_roam_info(hmac_vap->vap_id);
609 if (roam_info == OAL_PTR_NULL) {
610 return;
611 }
612
613 /* 漫游开关没有开时,不处理扫描结果 */
614 if (roam_info->enable == 0) {
615 return;
616 }
617
618 oam_info_log1(0, OAM_SF_ROAM, "vap_id[%d] {hmac_roam_scan_complete_etc::handling scan result!}",
619 scan_record->vap_id);
620
621 ret = hmac_roam_main_fsm_action_etc(roam_info, ROAM_MAIN_FSM_EVENT_SCAN_RESULT, (void *)scan_bss_mgmt);
622 if (ret != OAL_SUCC) {
623 oam_error_log2(0, OAM_SF_ROAM,
624 "vap_id[%d] {hmac_roam_scan_complete_etc::hmac_roam_main_fsm_action_etc failed[%d].}",
625 scan_record->vap_id, ret);
626 }
627 return;
628 }
629
630 /*****************************************************************************
631 函 数 名 : hmac_roam_scan_init
632 返 回 值 : OAL_SUCC 或 失败错误码
633 *****************************************************************************/
hmac_roam_scan_init(hmac_roam_info_stru * roam_info,osal_void * param)634 OAL_STATIC osal_u32 hmac_roam_scan_init(hmac_roam_info_stru *roam_info, osal_void *param)
635 {
636 osal_u32 ul_ret;
637 mac_scan_req_stru *scan_params;
638 osal_u8 *cur_ssid;
639 hmac_vap_stru *hmac_vap;
640
641 unref_param(param);
642
643 ul_ret = hmac_roam_main_check_state(roam_info, MAC_VAP_STATE_UP, ROAM_MAIN_STATE_INIT);
644 if (ul_ret != OAL_SUCC) {
645 oam_warning_log1(0, OAM_SF_ROAM, "{hmac_roam_scan_init::check_state fail[%d]!}", ul_ret);
646 return ul_ret;
647 }
648
649 if (mac_is_wep_enabled(roam_info->hmac_vap)) {
650 hmac_roam_rssi_trigger_type((roam_info->hmac_vap), ROAM_ENV_LINKLOSS);
651 return OAL_SUCC;
652 }
653
654 scan_params = &roam_info->scan_params;
655 cur_ssid = mac_mib_get_desired_ssid(roam_info->hmac_vap);
656
657 /* 扫描参数初始化 */
658 scan_params->bss_type = WLAN_MIB_DESIRED_BSSTYPE_INFRA;
659 scan_params->scan_type = WLAN_SCAN_TYPE_ACTIVE;
660 #ifdef _PRE_WLAN_FEATURE_WS92_MERGE
661 /* 解决ws92 liteOS 11v扫描结果不更新问题. probe resp从bin到device ko的耗时大于(2*scan_time) */
662 scan_params->scan_time = WLAN_DEFAULT_PASSIVE_SCAN_TIME;
663 #else
664 scan_params->scan_time = WLAN_DEFAULT_ACTIVE_SCAN_TIME;
665 #endif
666 scan_params->probe_delay = 0;
667 scan_params->scan_func = MAC_SCAN_FUNC_BSS; /* 默认扫描bss */
668 scan_params->fn_cb = hmac_roam_scan_comp_cb;
669 scan_params->max_send_probe_req_count_per_channel = 2; /* 2表示每次信道发送扫描请求帧的个数 */
670 scan_params->max_scan_count_per_channel = 2; /* 2表示每个信道扫描次数 */
671 scan_params->scan_mode = WLAN_SCAN_MODE_ROAM_SCAN;
672
673 hmac_vap = roam_info->hmac_vap;
674 scan_params->desire_fast_scan = hmac_vap->roam_scan_valid_rslt;
675
676 (osal_void)memcpy_s(scan_params->mac_ssid_set[0].ssid, WLAN_SSID_MAX_LEN, cur_ssid, WLAN_SSID_MAX_LEN);
677 scan_params->ssid_num = 1;
678
679 /* 初始扫描请求只指定1个bssid,为广播地址 */
680 memset_s(scan_params->bssid, WLAN_MAC_ADDR_LEN, 0xff, WLAN_MAC_ADDR_LEN);
681 scan_params->bssid_num = 1;
682
683 ul_ret = hmac_roam_alg_scan_channel_init_etc(roam_info, scan_params);
684 if (ul_ret != OAL_SUCC) {
685 oam_error_log1(0, OAM_SF_ROAM,
686 "{hmac_roam_scan_init::hmac_roam_alg_scan_channel_init_etc fail[%d]}", ul_ret);
687 return ul_ret;
688 }
689 hmac_roam_main_change_state(roam_info, ROAM_MAIN_STATE_SCANING);
690
691 ul_ret = hmac_roam_main_fsm_action_etc(roam_info, ROAM_MAIN_FSM_EVENT_START, (osal_void *)roam_info);
692 if (ul_ret != OAL_SUCC) {
693 hmac_roam_main_change_state(roam_info, ROAM_MAIN_STATE_FAIL);
694 return ul_ret;
695 }
696
697 return OAL_SUCC;
698 }
699 /*****************************************************************************
700 函 数 名 : hmac_roam_scan_channel
701 返 回 值 : OAL_SUCC 或 失败错误码
702 *****************************************************************************/
hmac_roam_scan_channel(hmac_roam_info_stru * roam_info,osal_void * param)703 OAL_STATIC osal_u32 hmac_roam_scan_channel(hmac_roam_info_stru *roam_info, osal_void *param)
704 {
705 osal_u32 ul_ret;
706
707 unref_param(param);
708
709 ul_ret = hmac_roam_main_check_state(roam_info, MAC_VAP_STATE_UP, ROAM_MAIN_STATE_SCANING);
710 if (ul_ret != OAL_SUCC) {
711 oam_warning_log1(0, OAM_SF_ROAM, "{hmac_roam_scan_channel::check_state fail[%d]!}", ul_ret);
712 return ul_ret;
713 }
714
715 roam_info->st_static.scan_cnt++;
716
717 /* 发起背景扫描 */
718 ul_ret = hmac_fsm_call_func_sta_etc(roam_info->hmac_vap, HMAC_FSM_INPUT_SCAN_REQ,
719 (osal_void *)(&roam_info->scan_params));
720 if (ul_ret != OAL_SUCC) {
721 oam_warning_log0(0, OAM_SF_ROAM, "{hmac_roam_scan_channel::start scan failed!}");
722 }
723
724 /* 启动扫描超时定时器 */
725 hmac_roam_main_start_timer(roam_info, ROAM_SCAN_TIME_MAX);
726
727 return OAL_SUCC;
728 }
729
hmac_roam_process(hmac_vap_stru * hmac_vap,const hmac_device_stru * hmac_device)730 static osal_u32 hmac_roam_process(hmac_vap_stru *hmac_vap, const hmac_device_stru *hmac_device)
731 {
732 hmac_roam_info_stru *roam_info = hmac_get_roam_info(hmac_vap->vap_id);
733 hmac_roam_alg_stru *alg = &roam_info->alg;
734
735 if (roam_info->config.scenario_enable != OAL_TRUE) {
736 alg->better_rssi_scan_period = 0;
737 return OAL_SUCC;
738 }
739 // full channel scan
740 if (hmac_device->scan_mgmt.scan_record_mgmt.chan_numbers >= WLAN_FULL_CHANNEL_NUM) {
741 if ((alg->candidate_good_rssi_num >= roam_info->config.candidate_good_num) ||
742 (alg->candidate_weak_rssi_num >= roam_info->config.candidate_weak_num)) {
743 alg->scan_period = 0;
744 oam_warning_log4(0, OAM_SF_ROAM,
745 "vap_id[%d] {hmac_roam_process::candidate bss total[%d] good[%d] weak[%d]}", hmac_vap->vap_id,
746 alg->candidate_bss_num, alg->candidate_good_rssi_num, alg->candidate_weak_rssi_num);
747 if (roam_info->rssi_type != ROAM_ENV_DENSE_AP) {
748 hmac_roam_rssi_trigger_type(hmac_vap, ROAM_ENV_DENSE_AP); // dense AP roaming scenario
749 }
750 } else {
751 /* When switch from dense AP scenario to default AP scenario, for 5 times continuous none-dense-AP scan; */
752 alg->scan_period++;
753 if ((alg->another_bss_scaned != 0) && (alg->scan_period == ROAM_ENV_DENSE_TO_SPARSE_PERIOD)) {
754 oam_warning_log4(0, OAM_SF_ROAM,
755 "vap_id[%d] {hmac_roam_process::roam_to sparse AP env: candidate bss total[%d] good[%d] weak[%d]}",
756 hmac_vap->vap_id, alg->candidate_bss_num,
757 alg->candidate_good_rssi_num, alg->candidate_weak_rssi_num);
758 hmac_roam_rssi_trigger_type(hmac_vap, ROAM_ENV_SPARSE_AP); // default roaming scenario
759 }
760 }
761 } else if (alg->another_bss_scaned == OSAL_TRUE) {
762 hmac_roam_rssi_trigger_type(hmac_vap, ROAM_ENV_SPARSE_AP); // default roaming scenario
763 }
764
765 if (hmac_roam_alg_need_to_stop_roam_trigger_etc(roam_info) == OSAL_TRUE) {
766 return hmac_roam_rssi_trigger_type(hmac_vap, ROAM_ENV_LINKLOSS); // LINKLOSS roaming scenario
767 }
768
769 /* Another Roaming Scenario: current AP >= -75dB, max RSSI AP - current AP >= 20dB */
770 if ((alg->c_max_rssi - alg->c_current_rssi >= ROAM_ENV_BETTER_RSSI_DISTANSE) &&
771 (alg->c_current_rssi >= ROAM_RSSI_NE75_DB) && // We'd better keep device to trigger roaming
772 (alg->c_current_rssi <= ROAM_ENV_RSSI_NE60_DB)) {
773 alg->better_rssi_scan_period++;
774 oam_warning_log4(0, OAM_SF_ROAM,
775 "vap_id[%d] {hmac_roam_process::roam_to better AP env:[%d] max_rssi[%d] current_rssi[%d]}",
776 hmac_vap->vap_id, alg->better_rssi_scan_period, alg->c_max_rssi, alg->c_current_rssi);
777 if (alg->better_rssi_scan_period == ROAM_ENV_BETTER_RSSI_PERIOD) {
778 alg->better_rssi_scan_period = 0;
779 hmac_roam_start_etc(hmac_vap, ROAM_SCAN_CHANNEL_ORG_0, OAL_FALSE, ROAM_TRIGGER_APP);
780 }
781 } else {
782 alg->better_rssi_scan_period = 0;
783 }
784 return OAL_SUCC;
785 }
786
787 /*****************************************************************************
788 函 数 名 : hmac_roam_check_bkscan_result_etc
789 返 回 值 : OAL_SUCC 或 失败错误码
790 *****************************************************************************/
hmac_roam_check_bkscan_result_etc(hmac_vap_stru * hmac_vap,hmac_scan_record_stru * scan_record)791 OAL_STATIC osal_u32 hmac_roam_check_bkscan_result_etc(hmac_vap_stru *hmac_vap, hmac_scan_record_stru *scan_record)
792 {
793 hmac_roam_info_stru *roam_info = OAL_PTR_NULL;
794 hmac_device_stru *hmac_device = OAL_PTR_NULL;
795 hmac_bss_mgmt_stru *scan_bss_mgmt = OAL_PTR_NULL;
796 struct osal_list_head *entry = OAL_PTR_NULL;
797 hmac_scanned_bss_info *scanned_bss = OAL_PTR_NULL;
798 mac_bss_dscr_stru *bss_dscr = OAL_PTR_NULL;
799
800 if ((hmac_vap == OAL_PTR_NULL) || (scan_record == OAL_PTR_NULL)) {
801 oam_error_log0(0, OAM_SF_ROAM, "{hmac_roam_check_bkscan_result_etc::param null}");
802 return OAL_ERR_CODE_PTR_NULL;
803 }
804
805 if (!is_legacy_sta(hmac_vap) || (hmac_vap->vap_state != MAC_VAP_STATE_UP)) {
806 return OAL_ERR_CODE_ROAM_STATE_UNEXPECT;
807 }
808
809 hmac_device = hmac_res_get_mac_dev_etc(hmac_vap->device_id);
810 if (hmac_device == OAL_PTR_NULL) {
811 oam_error_log0(0, OAM_SF_ROAM, "{hmac_roam_check_bkscan_result_etc::device is null}");
812 return OAL_ERR_CODE_ROAM_INVALID_VAP;
813 }
814
815 if (mac_is_wep_enabled(hmac_vap)) {
816 return OAL_SUCC;
817 }
818
819 roam_info = hmac_get_roam_info(hmac_vap->vap_id);
820 if (roam_info == OAL_PTR_NULL || roam_info->enable == 0) {
821 return OAL_SUCC;
822 }
823
824 scan_bss_mgmt = &(hmac_device->scan_mgmt.scan_record_mgmt.bss_mgmt);
825 roam_info->alg.candidate_bss_num = 0;
826 roam_info->alg.candidate_good_rssi_num = 0;
827 roam_info->alg.candidate_weak_rssi_num = 0;
828 roam_info->alg.c_max_rssi = ROAM_RSSI_CMD_TYPE;
829 roam_info->alg.c_current_rssi = 0;
830
831 osal_spin_lock(&(scan_bss_mgmt->lock));
832
833 /* 遍历扫描到的bss信息,查找可以漫游的bss */
834 osal_list_for_each(entry, &(scan_bss_mgmt->bss_list_head)) {
835 scanned_bss = osal_list_entry(entry, hmac_scanned_bss_info, dlist_head);
836 bss_dscr = &(scanned_bss->bss_dscr_info);
837 hmac_roam_alg_bss_in_ess_etc(roam_info, bss_dscr);
838 bss_dscr = OAL_PTR_NULL;
839 }
840
841 osal_spin_unlock(&(scan_bss_mgmt->lock));
842
843 /* Roaming Scenario Recognition (RISK: strong relationship with SCAN, need exclude partial channel scan)
844 * dense AP standard: RSSI>=-60dB, candidate num>=5;
845 * RSSI<-60dB && RSSI >=-75dB, candidate num>=10;
846 */
847 return hmac_roam_process(hmac_vap, hmac_device);
848 }
849
hmac_roam_search_bss(hmac_roam_info_stru * roam_info,hmac_bss_mgmt_stru * bss_mgmt)850 OAL_STATIC osal_u32 hmac_roam_search_bss(hmac_roam_info_stru *roam_info, hmac_bss_mgmt_stru *bss_mgmt)
851 {
852 struct osal_list_head *entry = OAL_PTR_NULL;
853 hmac_scanned_bss_info *scanned_bss = OAL_PTR_NULL;
854 mac_bss_dscr_stru *bss_dscr = OAL_PTR_NULL;
855 oal_bool_enum_uint8 flag_in_scan_rslts = OAL_FALSE;
856 osal_void *fhook = hmac_get_feature_fhook(HMAC_FHOOK_11V_CHECK_BSS_DSCR);
857
858 osal_spin_lock(&(bss_mgmt->lock));
859
860 osal_list_for_each(entry, &(bss_mgmt->bss_list_head)) {
861 scanned_bss = osal_list_entry(entry, hmac_scanned_bss_info, dlist_head);
862 bss_dscr = &(scanned_bss->bss_dscr_info);
863
864 if (hmac_roam_alg_bss_check_etc(roam_info, bss_dscr) != OAL_SUCC) {
865 continue;
866 }
867
868 if (fhook != OSAL_NULL) {
869 if (((hmac_11v_check_bss_dscr_cb)fhook)(roam_info, bss_dscr) == OSAL_TRUE) {
870 flag_in_scan_rslts = OAL_TRUE;
871 break;
872 }
873 }
874
875 bss_dscr = OAL_PTR_NULL;
876 }
877
878 osal_spin_unlock(&(bss_mgmt->lock));
879 fhook = hmac_get_feature_fhook(HMAC_FHOOK_11V_CHECK_SCAN_RESULT);
880 if (fhook != OSAL_NULL) {
881 if (((hmac_11v_check_scan_result_cb)fhook)(roam_info, flag_in_scan_rslts) != OSAL_TRUE) {
882 return OAL_ERR_CODE_ROAM_NO_VALID_BSS;
883 }
884 }
885
886 return OAL_SUCC;
887 }
888
889 /*****************************************************************************
890 函 数 名 : hmac_roam_check_scan_result
891 输出参数 : mac_bss_dscr_stru **ppst_bss_dscr_out
892 返 回 值 : OAL_SUCC 或 失败错误码
893 *****************************************************************************/
hmac_roam_check_scan_result(hmac_roam_info_stru * roam_info,hmac_bss_mgmt_stru * bss_mgmt,mac_bss_dscr_stru ** ppst_bss_dscr_out)894 OAL_STATIC osal_u32 hmac_roam_check_scan_result(hmac_roam_info_stru *roam_info, hmac_bss_mgmt_stru *bss_mgmt,
895 mac_bss_dscr_stru **ppst_bss_dscr_out)
896 {
897 osal_u32 ul_ret;
898 hmac_vap_stru *hmac_vap = OAL_PTR_NULL;
899 mac_bss_dscr_stru *bss_dscr = OAL_PTR_NULL;
900
901 hmac_vap = roam_info->hmac_vap;
902 if ((hmac_vap == OAL_PTR_NULL) || (bss_mgmt == OAL_PTR_NULL)) {
903 oam_error_log0(0, OAM_SF_ROAM, "{hmac_roam_check_scan_result::vap invalid!}");
904 return OAL_ERR_CODE_ROAM_INVALID_VAP;
905 }
906
907 roam_info->st_static.scan_result_cnt++;
908
909 /* 如果扫描到的bss个数为0,退出 */
910 if (bss_mgmt->bss_num == 0) {
911 oam_warning_log0(0, OAM_SF_ROAM, "{hmac_roam_check_scan_result::no bss scanned}");
912 return OAL_ERR_CODE_ROAM_NO_VALID_BSS;
913 }
914
915 /* 遍历扫描到的bss信息,查找可以漫游的bss */
916 ul_ret = hmac_roam_search_bss(roam_info, bss_mgmt);
917 if (ul_ret != OAL_SUCC) {
918 return ul_ret;
919 }
920
921 bss_dscr = hmac_roam_alg_select_bss_etc(roam_info);
922 if (bss_dscr == OAL_PTR_NULL) {
923 /* 没有扫描到可用的bss,等待定时器超时即可 */
924 roam_info->st_static.roam_scan_fail++;
925 oam_warning_log1(0, OAM_SF_ROAM, "{roam_to::hmac_roam_check_scan_result::no bss valid, scan fail=%d}",
926 roam_info->st_static.roam_scan_fail);
927
928 hmac_vap->roam_scan_valid_rslt = OAL_FALSE;
929 return OAL_ERR_CODE_ROAM_NO_VALID_BSS;
930 }
931
932 /* renew失败不漫游至该ap */
933 ul_ret = hmac_roam_renew_privacy(hmac_vap, bss_dscr);
934 if (ul_ret != OAL_SUCC) {
935 return ul_ret;
936 }
937
938 ul_ret = hmac_check_capability_mac_phy_supplicant_etc(hmac_vap, bss_dscr);
939 if (ul_ret != OAL_SUCC) {
940 /* MAC/PHY 能力不做严格检查 */
941 oam_warning_log1(0, OAM_SF_ROAM,
942 "{hmac_roam_check_scan_result::check mac and phy capability fail[%d]!}\r\n", ul_ret);
943 }
944
945 *ppst_bss_dscr_out = bss_dscr;
946 return OAL_SUCC;
947 }
948
949 /*****************************************************************************
950 函 数 名 : hmac_roam_handle_scan_result
951 功能描述 : 处理漫游扫描结果
952 返 回 值 : OAL_SUCC 或 失败错误码
953 *****************************************************************************/
hmac_roam_handle_scan_result(hmac_roam_info_stru * roam_info,osal_void * p_param)954 OAL_STATIC osal_u32 hmac_roam_handle_scan_result(hmac_roam_info_stru *roam_info, osal_void *p_param)
955 {
956 mac_bss_dscr_stru *bss_dscr = OAL_PTR_NULL;
957 hmac_scan_rsp_stru scan_rsp;
958 hmac_device_stru *hmac_device;
959 hmac_vap_stru *hmac_vap;
960 osal_u32 ul_ret;
961 osal_void *fhook = hmac_get_feature_fhook(HMAC_FHOOK_11V_TRIGGER_ROAM_CHECK);
962
963 ul_ret = hmac_roam_main_check_state(roam_info, MAC_VAP_STATE_UP, ROAM_MAIN_STATE_SCANING);
964 if (ul_ret != OAL_SUCC) {
965 oam_warning_log1(0, OAM_SF_ROAM, "{hmac_roam_handle_scan_result::check_state fail[%d]!}", ul_ret);
966 return ul_ret;
967 }
968
969 hmac_vap = roam_info->hmac_vap;
970
971 hmac_device = hmac_res_get_mac_dev_etc(hmac_vap->device_id);
972 if (osal_unlikely(hmac_device == OAL_PTR_NULL)) {
973 oam_error_log0(0, OAM_SF_ROAM, "{hmac_roam_handle_scan_result::hmac_device null.}");
974 return OAL_ERR_CODE_ROAM_INVALID_VAP;
975 }
976
977 ul_ret = hmac_roam_check_scan_result(roam_info, (hmac_bss_mgmt_stru *)p_param, &bss_dscr);
978 if (ul_ret == OAL_SUCC) {
979 roam_info->invalid_scan_cnt = 0;
980 /* 扫描结果发给sme */
981 memset_s(&scan_rsp, OAL_SIZEOF(scan_rsp), 0, OAL_SIZEOF(scan_rsp));
982
983 scan_rsp.result_code = MAC_SCAN_SUCCESS;
984
985 hmac_send_rsp_to_sme_sta_etc(hmac_vap, HMAC_SME_SCAN_RSP, (osal_u8 *)&scan_rsp);
986
987 /* 扫描到可用的bss,开始connect */
988 return hmac_roam_main_fsm_action_etc(roam_info, ROAM_MAIN_FSM_EVENT_START_CONNECT,
989 (osal_void *)bss_dscr);
990 }
991
992 oam_warning_log1(0, OAM_SF_ROAM, "{Roaming conditions are not met, ret[%d].}", ul_ret);
993 /* 如果是亮屏的,不暂停漫游 */
994 if (hmac_device->uc_in_suspend == OAL_FALSE) {
995 roam_info->invalid_scan_cnt = 0;
996 } else {
997 roam_info->invalid_scan_cnt++;
998 }
999
1000 /* 多次无效扫描暂停漫游,防止在某些场景下一直唤醒HOST */
1001 if (roam_info->invalid_scan_cnt >= ROAM_INVALID_SCAN_MAX) {
1002 oam_warning_log1(0, OAM_SF_ROAM, "{hmac_roam_handle_scan_result::ignore_rssi_trigger after %d invalid_scan.}",
1003 roam_info->invalid_scan_cnt);
1004 roam_info->invalid_scan_cnt = 0;
1005 hmac_roam_rssi_trigger_type(roam_info->hmac_vap, ROAM_ENV_LINKLOSS);
1006 }
1007 /* 删除定时器 */
1008 hmac_roam_main_del_timer(roam_info);
1009 hmac_roam_main_clear(roam_info);
1010
1011 if (fhook != OSAL_NULL) {
1012 ((hmac_11v_trigger_roam_check_cb)fhook)(roam_info, hmac_vap);
1013 }
1014
1015 return OAL_SUCC;
1016 }
1017
1018 /*****************************************************************************
1019 函 数 名 : hmac_roam_main_check_state
1020 功能描述 : 参数检查接口
1021 返 回 值 : OAL_SUCC 或 失败错误码
1022 *****************************************************************************/
hmac_roam_main_check_state(hmac_roam_info_stru * roam_info,mac_vap_state_enum_uint8 vap_state,roam_main_state_enum_uint8 main_state)1023 OAL_STATIC osal_u32 hmac_roam_main_check_state(hmac_roam_info_stru *roam_info,
1024 mac_vap_state_enum_uint8 vap_state, roam_main_state_enum_uint8 main_state)
1025 {
1026 if (roam_info == OAL_PTR_NULL) {
1027 return OAL_ERR_CODE_PTR_NULL;
1028 }
1029
1030 if (roam_info->hmac_user == OAL_PTR_NULL) {
1031 return OAL_ERR_CODE_ROAM_INVALID_USER;
1032 }
1033
1034 if (roam_info->hmac_vap == OAL_PTR_NULL || !is_legacy_sta(roam_info->hmac_vap)) {
1035 return OAL_ERR_CODE_ROAM_INVALID_VAP;
1036 }
1037
1038 if (roam_info->enable == 0) {
1039 return OAL_ERR_CODE_ROAM_DISABLED;
1040 }
1041
1042 if (roam_info->hmac_vap->wpa3_roaming == OSAL_TRUE) {
1043 oam_warning_log0(0, OAM_SF_ROAM, "hmac_roam_main_check_state::wpa3 roaming skip state check");
1044 return OAL_SUCC;
1045 }
1046
1047 if ((roam_info->hmac_vap->vap_state != vap_state) ||
1048 (roam_info->main_state != main_state)) {
1049 oam_warning_log2(0, OAM_SF_ROAM, "{hmac_roam_main_check_state::unexpect vap State[%d] main_state[%d]!}",
1050 roam_info->hmac_vap->vap_state, roam_info->main_state);
1051 return OAL_ERR_CODE_ROAM_INVALID_VAP_STATUS;
1052 }
1053
1054 return OAL_SUCC;
1055 }
1056
1057
1058 /*****************************************************************************
1059 函 数 名 : hmac_roam_main_clear
1060 功能描述 : 清理、释放 roam main 相关状态、buff、timer
1061 *****************************************************************************/
hmac_roam_main_clear(hmac_roam_info_stru * roam_info)1062 osal_void hmac_roam_main_clear(hmac_roam_info_stru *roam_info)
1063 {
1064 /* 清理状态 */
1065 hmac_roam_main_change_state(roam_info, ROAM_MAIN_STATE_INIT);
1066
1067 hmac_roam_connect_stop_etc(roam_info->hmac_vap);
1068 }
1069
1070
1071 /*****************************************************************************
1072 函 数 名 : hmac_roam_resume_pm
1073 *****************************************************************************/
hmac_roam_resume_pm(hmac_roam_info_stru * roam_info)1074 OAL_STATIC osal_u32 hmac_roam_resume_pm(hmac_roam_info_stru *roam_info)
1075 {
1076 osal_u32 ul_ret;
1077 osal_u8 pm_switch;
1078
1079 ul_ret = OAL_SUCC;
1080 #ifdef _PRE_WLAN_FEATURE_STA_PM
1081 pm_switch = (roam_info->hmac_vap->sta_pm_handler.last_ps_status != 0) ?
1082 MAC_STA_PM_SWITCH_ON : MAC_STA_PM_SWITCH_RESET;
1083 ul_ret = hmac_config_set_pm_by_module_etc(roam_info->hmac_vap, MAC_STA_PM_CTRL_TYPE_ROAM, pm_switch);
1084 if (ul_ret != OAL_SUCC) {
1085 oam_warning_log2(0, OAM_SF_CFG,
1086 "vap_id[%d] {hmac_roam_resume_pm::hmac_config_set_pm_by_module_etc failed[%d].}",
1087 roam_info->hmac_vap->vap_id, ul_ret);
1088 }
1089 #endif
1090
1091 return ul_ret;
1092 }
1093
1094 /*****************************************************************************
1095 函 数 名 : hmac_roam_resume_security_port
1096 *****************************************************************************/
hmac_roam_resume_security_port(hmac_roam_info_stru * roam_info)1097 OAL_STATIC osal_u32 hmac_roam_resume_security_port(hmac_roam_info_stru *roam_info)
1098 {
1099 mac_h2d_roam_sync_stru h2d_sync = {0};
1100 osal_s32 ret;
1101
1102 if (roam_info == OAL_PTR_NULL) {
1103 oam_error_log0(0, OAM_SF_ROAM, "{hmac_roam_resume_security_port::roam_info null!}");
1104 return OAL_ERR_CODE_PTR_NULL;
1105 }
1106
1107 if (roam_info->hmac_vap == OAL_PTR_NULL) {
1108 oam_error_log0(0, OAM_SF_ROAM, "{hmac_roam_resume_security_port::vap null!}");
1109 return OAL_ERR_CODE_ROAM_INVALID_VAP;
1110 }
1111
1112 if (roam_info->hmac_user == OAL_PTR_NULL) {
1113 oam_error_log0(0, OAM_SF_ROAM, "{hmac_roam_resume_security_port::user null!}");
1114 return OAL_ERR_CODE_ROAM_INVALID_USER;
1115 }
1116
1117 /* 设置用户8021x端口合法性的状态为合法 */
1118 hmac_user_set_port_etc(roam_info->hmac_user, OAL_TRUE);
1119
1120 // 填充同步信息
1121 h2d_sync.back_to_old = OAL_FALSE;
1122
1123 ret = hmac_config_roam_hmac_sync_dmac(roam_info->hmac_vap, &h2d_sync);
1124 if (ret != OAL_SUCC) {
1125 oam_error_log2(0, OAM_SF_ROAM,
1126 "vap_id[%d] {hmac_roam_resume_security_port::send event failed[%d].}", roam_info->hmac_vap->vap_id,
1127 ret);
1128 }
1129
1130 return (osal_u32)ret;
1131 }
1132
1133 /*****************************************************************************
1134 函 数 名 : hmac_roam_scan_timeout
1135 功能描述 : 扫描超时
1136 *****************************************************************************/
hmac_roam_scan_timeout(hmac_roam_info_stru * roam_info,osal_void * param)1137 OAL_STATIC osal_u32 hmac_roam_scan_timeout(hmac_roam_info_stru *roam_info, osal_void *param)
1138 {
1139 osal_u32 ul_ret;
1140
1141 unref_param(param);
1142
1143 ul_ret = hmac_roam_main_check_state(roam_info, MAC_VAP_STATE_UP, ROAM_MAIN_STATE_SCANING);
1144 if (ul_ret != OAL_SUCC) {
1145 oam_warning_log1(0, OAM_SF_ROAM, "{hmac_roam_scan_timeout::check_state fail[%d]!}", ul_ret);
1146 return ul_ret;
1147 }
1148
1149 ul_ret = hmac_roam_scan_complete_etc(roam_info->hmac_vap);
1150 if (ul_ret != OAL_SUCC) {
1151 oam_error_log1(0, OAM_SF_ROAM, "{hmac_roam_scan_timeout::hmac_roam_scan_complete_etc failed[%d].}", ul_ret);
1152 }
1153 return OAL_SUCC;
1154 }
1155
1156 /*****************************************************************************
1157 函 数 名 : hmac_roam_connecting_timeout
1158 功能描述 : roam 在尝试 connect 之后的错误处理。
1159 *****************************************************************************/
hmac_roam_connecting_timeout(hmac_roam_info_stru * roam_info,osal_void * p_param)1160 OAL_STATIC osal_u32 hmac_roam_connecting_timeout(hmac_roam_info_stru *roam_info, osal_void *p_param)
1161 {
1162 osal_u32 ul_ret;
1163
1164 unref_param(p_param);
1165 ul_ret = hmac_roam_main_check_state(roam_info, MAC_VAP_STATE_ROAMING, ROAM_MAIN_STATE_CONNECTING);
1166 if (ul_ret != OAL_SUCC) {
1167 oam_warning_log1(0, OAM_SF_ROAM, "{hmac_roam_connecting_timeout::check_state fail[%d]!}", ul_ret);
1168 return ul_ret;
1169 }
1170
1171 ul_ret = hmac_roam_to_old_bss(roam_info);
1172 if (ul_ret != OAL_SUCC) {
1173 oam_warning_log1(0, OAM_SF_ROAM,
1174 "{hmac_roam_handle_fail_connect_phase:: hmac_roam_to_old_bss fail[%d]!}", ul_ret);
1175 }
1176
1177 /* 切换vap的状态为UP,恢复用户节能,恢复发送 */
1178 ul_ret = hmac_roam_resume_user_etc(roam_info->hmac_vap);
1179 if (ul_ret != OAL_SUCC) {
1180 oam_error_log1(0, OAM_SF_ROAM,
1181 "{hmac_roam_handle_fail_connect_phase:: hmac_fsm_call_func_sta_etc fail[%d]!}", ul_ret);
1182 }
1183
1184 hmac_roam_main_clear(roam_info);
1185
1186 return ul_ret;
1187 }
1188
1189 /*****************************************************************************
1190 函 数 名 : hmac_roam_connecting_fail
1191 功能描述 : roam 在尝试 connect 之后的错误处理。
1192 *****************************************************************************/
hmac_roam_connecting_fail(hmac_roam_info_stru * roam_info,osal_void * p_param)1193 OAL_STATIC osal_u32 hmac_roam_connecting_fail(hmac_roam_info_stru *roam_info, osal_void *p_param)
1194 {
1195 osal_u32 ret;
1196 oal_bool_enum_uint8 is_protected;
1197 hmac_vap_stru *hmac_vap = OSAL_NULL;
1198 osal_void *fhook = hmac_get_feature_fhook(HMAC_FHOOK_DFX_USER_CONN_ABNORMAL_RECORD);
1199
1200 ret = hmac_roam_main_check_state(roam_info, MAC_VAP_STATE_ROAMING, ROAM_MAIN_STATE_CONNECTING);
1201 if (ret != OAL_SUCC) {
1202 oam_warning_log1(0, OAM_SF_ROAM, "{hmac_roam_connecting_fail::check_state fail[%d]!}", ret);
1203 return ret;
1204 }
1205
1206 hmac_roam_main_del_timer(roam_info);
1207 ret = hmac_roam_connecting_timeout(roam_info, p_param);
1208
1209 /* auth/assoc被拒绝的处理. 漫游时auth被拒绝不删除用户 */
1210 if ((roam_info->connect.auth_num >= MAX_AUTH_CNT) && (roam_info->connect.state == ROAM_CONNECT_STATE_INIT)) {
1211 oam_warning_log2(0, OAM_SF_ROAM, "{hmac_roam_connecting_fail::auth failed, auth_num=[%d], conn_state=[%d]}",
1212 roam_info->connect.auth_num, roam_info->connect.state);
1213 return ret;
1214 }
1215
1216 if (roam_info->connect.status_code == MAC_REJECT_TEMP) {
1217 return ret;
1218 }
1219
1220 /* 管理帧加密是否开启 */
1221 is_protected = roam_info->hmac_user->cap_info.pmf_active;
1222
1223 /* roam_info结构体会在del user的时候释放掉,提前取出hmac_vap以便后续使用 */
1224 hmac_vap = roam_info->hmac_vap;
1225
1226 /* 发去关联帧 */
1227 hmac_mgmt_send_disassoc_frame_etc(hmac_vap,
1228 roam_info->hmac_user->user_mac_addr, MAC_DEAUTH_LV_SS, is_protected);
1229 oam_warning_log1(0, OAM_SF_DFT, "hmac_roam_connecting_fail:send DISASSOC,err code[%d]", MAC_DEAUTH_LV_SS);
1230
1231 if (fhook != OSAL_NULL) {
1232 ((dfx_user_conn_abnormal_record_cb)fhook)(roam_info->hmac_user->vap_id, roam_info->hmac_user->user_mac_addr,
1233 ROAM_CONNECTING_FAIL, USER_CONN_OFFLINE);
1234 }
1235
1236 /* 删除对应用户 */
1237 hmac_user_del_etc(hmac_vap, roam_info->hmac_user);
1238
1239 hmac_sta_handle_disassoc_rsp_etc(hmac_vap, MAC_NOT_ASSOCED);
1240
1241 return ret;
1242 }
1243
1244 /*****************************************************************************
1245 函 数 名 : hmac_roam_handle_fail_handshake_phase
1246 功能描述 : roam 在尝试 handshake 之后的错误处理。
1247 *****************************************************************************/
hmac_roam_handle_fail_handshake_phase(hmac_roam_info_stru * roam_info,osal_void * p_param)1248 OAL_STATIC osal_u32 hmac_roam_handle_fail_handshake_phase(hmac_roam_info_stru *roam_info, osal_void *p_param)
1249 {
1250 osal_u32 ret;
1251 oal_bool_enum_uint8 is_protected;
1252 hmac_vap_stru *hmac_vap = OSAL_NULL;
1253 osal_void *fhook = hmac_get_feature_fhook(HMAC_FHOOK_DFX_USER_CONN_ABNORMAL_RECORD);
1254
1255 unref_param(p_param);
1256 ret = hmac_roam_main_check_state(roam_info, MAC_VAP_STATE_ROAMING, ROAM_MAIN_STATE_CONNECTING);
1257 if (ret != OAL_SUCC) {
1258 oam_warning_log1(0, OAM_SF_ROAM, "{hmac_roam_handle_fail_handshake_phase::check_state fail[%d]!}", ret);
1259 return ret;
1260 }
1261
1262 /* roam_info结构体会在del user的时候释放掉,提前取出hmac_vap以便后续使用 */
1263 hmac_vap = roam_info->hmac_vap;
1264
1265 ret = hmac_roam_to_old_bss(roam_info);
1266 if (ret != OAL_SUCC) {
1267 oam_warning_log2(0, OAM_SF_ROAM,
1268 "vap_id[%d] {hmac_roam_handle_fail_handshake_phase:: hmac_roam_to_old_bss fail[%d]!}",
1269 hmac_vap->vap_id, ret);
1270 }
1271
1272 /* 切换vap的状态为UP,恢复用户节能,恢复发送 */
1273 ret = hmac_roam_resume_user_etc(hmac_vap);
1274
1275 hmac_roam_main_clear(roam_info);
1276 hmac_roam_main_del_timer(roam_info);
1277
1278 /* 为提高漫游成功的概率,在握手失败时触发立即重新漫游 */
1279 if (roam_info->alg.c_current_rssi > ROAM_RSSI_MAX_TYPE) {
1280 /* 如果是弱信号触发的漫游,先把rssi修改成ROAM_RSSI_LINKLOSS_TYPE来将弱信号跟LINKLOSS触发的重漫游归一 */
1281 if (roam_info->alg.c_current_rssi > ROAM_RSSI_LINKLOSS_TYPE) {
1282 roam_info->alg.c_current_rssi = ROAM_RSSI_LINKLOSS_TYPE;
1283 }
1284 /* 漫游握手失败时,rssi 逐次减1dBm,一直到到ROAM_RSSI_MAX_TYPE。这样可以最多触发5次重漫游 */
1285 return hmac_roam_trigger_handle_etc(hmac_vap, roam_info->alg.c_current_rssi - 1,
1286 OAL_FALSE);
1287 }
1288
1289 oam_warning_log1(0, OAM_SF_ROAM,
1290 "{hmac_roam_handle_fail_handshake_phase:: report deauth to wpas! c_current_rssi=%d}",
1291 roam_info->alg.c_current_rssi);
1292
1293 /* 管理帧加密是否开启 */
1294 is_protected = roam_info->hmac_user->cap_info.pmf_active;
1295
1296 /* 发去关联帧 */
1297 hmac_mgmt_send_disassoc_frame_etc(hmac_vap,
1298 roam_info->hmac_user->user_mac_addr, MAC_DEAUTH_LV_SS, is_protected);
1299 oam_warning_log1(0, OAM_SF_DFT, "hmac_roam_handle_fail_handshake_phase:send DISASSOC,err code[%d]",
1300 MAC_DEAUTH_LV_SS);
1301
1302 if (fhook != OSAL_NULL) {
1303 ((dfx_user_conn_abnormal_record_cb)fhook)(roam_info->hmac_user->vap_id, roam_info->hmac_user->user_mac_addr,
1304 ROAM_HANDSHAKE_FAIL, USER_CONN_OFFLINE);
1305 }
1306 /* 删除对应用户 */
1307 hmac_user_del_etc(hmac_vap, roam_info->hmac_user);
1308
1309 hmac_sta_handle_disassoc_rsp_etc(hmac_vap, MAC_4WAY_HANDSHAKE_TIMEOUT);
1310
1311 return ret;
1312 }
1313
hmac_roam_save_bss(hmac_vap_stru * hmac_vap,hmac_user_stru * hmac_user,hmac_roam_info_stru * roam_info)1314 static osal_void hmac_roam_save_bss(hmac_vap_stru *hmac_vap, hmac_user_stru *hmac_user,
1315 hmac_roam_info_stru *roam_info)
1316 {
1317 hmac_roam_old_bss_stru *old_bss = &roam_info->old_bss;
1318
1319 old_bss->sta_aid = hmac_vap->sta_aid;
1320 old_bss->protocol_mode = hmac_vap->protocol;
1321 (osal_void)memcpy_s(&old_bss->cap_info, OAL_SIZEOF(mac_user_cap_info_stru), &hmac_user->cap_info,
1322 OAL_SIZEOF(mac_user_cap_info_stru));
1323 (osal_void)memcpy_s(&old_bss->key_info, OAL_SIZEOF(mac_key_mgmt_stru), &(hmac_user->key_info),
1324 OAL_SIZEOF(mac_key_mgmt_stru));
1325 (osal_void)memcpy_s(&old_bss->user_tx_info, OAL_SIZEOF(mac_user_tx_param_stru), &(hmac_user->user_tx_info),
1326 OAL_SIZEOF(mac_user_tx_param_stru));
1327 (osal_void)memcpy_s(&old_bss->mib_info, OAL_SIZEOF(wlan_mib_ieee802dot11_stru), hmac_vap->mib_info,
1328 OAL_SIZEOF(wlan_mib_ieee802dot11_stru));
1329 (osal_void)memcpy_s(&old_bss->op_rates, OAL_SIZEOF(mac_rate_stru), &(hmac_user->op_rates),
1330 OAL_SIZEOF(mac_rate_stru));
1331 (osal_void)memcpy_s(&old_bss->ht_hdl, OAL_SIZEOF(mac_user_ht_hdl_stru), &(hmac_user->ht_hdl),
1332 OAL_SIZEOF(mac_user_ht_hdl_stru));
1333 (osal_void)memcpy_s(&old_bss->vht_hdl, OAL_SIZEOF(mac_vht_hdl_stru), &(hmac_user->vht_hdl),
1334 OAL_SIZEOF(mac_vht_hdl_stru));
1335 old_bss->avail_bandwidth = hmac_user->avail_bandwidth;
1336 old_bss->cur_bandwidth = hmac_user->cur_bandwidth;
1337 (osal_void)memcpy_s(&old_bss->st_channel, OAL_SIZEOF(mac_channel_stru), &(hmac_vap->channel),
1338 OAL_SIZEOF(mac_channel_stru));
1339 (osal_void)memcpy_s(&old_bss->bssid, WLAN_MAC_ADDR_LEN, &(hmac_vap->bssid), WLAN_MAC_ADDR_LEN);
1340 old_bss->us_cap_info = hmac_vap->assoc_user_cap_info;
1341 return;
1342 }
1343
hmac_roam_connect_to_bss_check(hmac_vap_stru * hmac_vap,hmac_roam_info_stru * roam_info)1344 OAL_STATIC osal_u32 hmac_roam_connect_to_bss_check(hmac_vap_stru *hmac_vap, hmac_roam_info_stru *roam_info)
1345 {
1346 osal_u32 ul_ret;
1347 hmac_device_stru *hmac_device = OAL_PTR_NULL;
1348 hmac_vap_stru *other_vap = OAL_PTR_NULL;
1349 osal_u8 vap_idx;
1350
1351 ul_ret = hmac_roam_main_check_state(roam_info, MAC_VAP_STATE_UP, ROAM_MAIN_STATE_SCANING);
1352 if (ul_ret != OAL_SUCC) {
1353 oam_warning_log1(0, OAM_SF_ROAM, "{hmac_roam_connect_to_bss::check_state fail[%d]!}", ul_ret);
1354 return ul_ret;
1355 }
1356
1357 hmac_device = (hmac_device_stru *)hmac_res_get_mac_dev_etc(hmac_vap->device_id);
1358 if (hmac_device == OAL_PTR_NULL) {
1359 oam_error_log1(0, OAM_SF_ROAM, "vap_id[%d] {hmac_roam_connect_to_bss::hmac_device ptr is null!}\r\n",
1360 hmac_vap->vap_id);
1361 return -OAL_EINVAL;
1362 }
1363
1364 /* check all vap state in case other vap is connecting now */
1365 for (vap_idx = 0; vap_idx < hmac_device->vap_num; vap_idx++) {
1366 other_vap = mac_res_get_hmac_vap(hmac_device->vap_id[vap_idx]);
1367 if (other_vap == OAL_PTR_NULL) {
1368 oam_warning_log1(0, OAM_SF_ROAM, "vap_id[%d] {hmac_roam_connect_to_bss::vap is null!}",
1369 hmac_device->vap_id[vap_idx]);
1370 continue;
1371 }
1372
1373 if ((other_vap->vap_state >= MAC_VAP_STATE_STA_JOIN_COMP) &&
1374 (other_vap->vap_state <= MAC_VAP_STATE_STA_WAIT_ASOC)) {
1375 oam_warning_log2(0, OAM_SF_ROAM, "vap_id[%d] {hmac_roam_connect_to_bss::vap is connecting, state=[%d]!}",
1376 other_vap->vap_id,
1377 other_vap->vap_state);
1378 hmac_roam_main_change_state(roam_info, ROAM_MAIN_STATE_INIT);
1379 return -OAL_EFAIL;
1380 }
1381 }
1382
1383 return OAL_SUCC;
1384 }
1385
1386 /*****************************************************************************
1387 函 数 名 : hmac_roam_connect_to_bss
1388 返 回 值 : OAL_SUCC 或 失败错误码
1389 *****************************************************************************/
hmac_roam_connect_to_bss(hmac_roam_info_stru * roam_info,osal_void * p_param)1390 osal_u32 hmac_roam_connect_to_bss(hmac_roam_info_stru *roam_info, osal_void *p_param)
1391 {
1392 hmac_vap_stru *hmac_vap = roam_info->hmac_vap;
1393 hmac_user_stru *hmac_user = roam_info->hmac_user;
1394 mac_bss_dscr_stru *bss_dscr = (mac_bss_dscr_stru *)p_param;
1395 osal_u32 ul_ret;
1396 oal_bool_enum_uint8 need_to_stop_user = OSAL_TRUE;
1397 osal_void *fhook = hmac_get_feature_fhook(HMAC_FHOOK_11R_ROAM_CONNECT_TO_BSS);
1398
1399 ul_ret = hmac_roam_connect_to_bss_check(hmac_vap, roam_info);
1400 if (ul_ret != OAL_SUCC) {
1401 return ul_ret;
1402 }
1403
1404 if (fhook != OSAL_NULL) {
1405 ((hmac_11r_roam_connect_to_bss_cb)fhook)(hmac_vap, roam_info, &need_to_stop_user);
1406 }
1407
1408 if (need_to_stop_user != OSAL_FALSE) {
1409 /* 切换vap的状态为ROAMING,将用户节能,暂停发送 */
1410 ul_ret = hmac_roam_pause_user_etc(hmac_vap);
1411 if (ul_ret != OAL_SUCC) {
1412 oam_warning_log1(0, OAM_SF_ROAM,
1413 "{hmac_roam_connect_to_bss::hmac_fsm_call_func_sta_etc fail[%ld]!}", ul_ret);
1414 return ul_ret;
1415 }
1416 }
1417
1418 /* 原bss信息保存,以便回退 */
1419 hmac_roam_save_bss(hmac_vap, hmac_user, roam_info);
1420
1421 /* 切换状态至connecting */
1422 hmac_roam_main_change_state(roam_info, ROAM_MAIN_STATE_CONNECTING);
1423
1424 roam_info->st_static.connect_cnt++;
1425
1426 /* 设置漫游到的bss能力位,重关联请求使用 */
1427 hmac_vap->assoc_user_cap_info = bss_dscr->us_cap_info;
1428
1429 /* 启动connect状态机 */
1430 ul_ret = hmac_roam_connect_start_etc(hmac_vap, bss_dscr);
1431 if (ul_ret != OAL_SUCC && ul_ret != OAL_CONTINUE) {
1432 oam_error_log1(0, OAM_SF_ROAM, "{hmac_roam_connect_to_bss::hmac_roam_connect_start_etc fail[%ld]!}", ul_ret);
1433 hmac_roam_main_change_state(roam_info, ROAM_MAIN_STATE_FAIL);
1434 return ul_ret;
1435 }
1436
1437 /* 启动connect超时定时器 */
1438 hmac_roam_main_start_timer(roam_info, ROAM_CONNECT_TIME_MAX);
1439
1440 return OAL_SUCC;
1441 }
1442
hmac_roam_restore_bss(hmac_vap_stru * hmac_vap,hmac_roam_old_bss_stru * old_bss,hmac_user_stru * hmac_user)1443 static osal_void hmac_roam_restore_bss(hmac_vap_stru *hmac_vap, hmac_roam_old_bss_stru *old_bss,
1444 hmac_user_stru *hmac_user)
1445 {
1446 hmac_vap->sta_aid = old_bss->sta_aid;
1447 hmac_vap->protocol = old_bss->protocol_mode;
1448 (osal_void)memcpy_s(&(hmac_user->cap_info), OAL_SIZEOF(mac_user_cap_info_stru), &old_bss->cap_info,
1449 OAL_SIZEOF(mac_user_cap_info_stru));
1450 (osal_void)memcpy_s(&(hmac_user->key_info), OAL_SIZEOF(mac_key_mgmt_stru), &old_bss->key_info,
1451 OAL_SIZEOF(mac_key_mgmt_stru));
1452 (osal_void)memcpy_s(&(hmac_user->user_tx_info), OAL_SIZEOF(mac_user_tx_param_stru), &old_bss->user_tx_info,
1453 OAL_SIZEOF(mac_user_tx_param_stru));
1454 (osal_void)memcpy_s(hmac_vap->mib_info, OAL_SIZEOF(wlan_mib_ieee802dot11_stru), &old_bss->mib_info,
1455 OAL_SIZEOF(wlan_mib_ieee802dot11_stru));
1456 (osal_void)memcpy_s(&(hmac_user->op_rates), OAL_SIZEOF(mac_rate_stru), &old_bss->op_rates,
1457 OAL_SIZEOF(mac_rate_stru));
1458 (osal_void)memcpy_s(&(hmac_user->ht_hdl), OAL_SIZEOF(mac_user_ht_hdl_stru), &old_bss->ht_hdl,
1459 OAL_SIZEOF(mac_user_ht_hdl_stru));
1460 (osal_void)memcpy_s(&(hmac_user->vht_hdl), OAL_SIZEOF(mac_vht_hdl_stru), &old_bss->vht_hdl,
1461 OAL_SIZEOF(mac_vht_hdl_stru));
1462 hmac_user->avail_bandwidth = old_bss->avail_bandwidth;
1463 hmac_user->cur_bandwidth = old_bss->cur_bandwidth;
1464 (osal_void)memcpy_s(&(hmac_vap->channel), OAL_SIZEOF(mac_channel_stru), &old_bss->st_channel,
1465 OAL_SIZEOF(mac_channel_stru));
1466 (osal_void)memcpy_s(hmac_vap->bssid, WLAN_MAC_ADDR_LEN, old_bss->bssid, WLAN_MAC_ADDR_LEN);
1467 hmac_vap->assoc_user_cap_info = old_bss->us_cap_info;
1468 return;
1469 }
1470
hmac_roam_to_old_bss_sync_event(hmac_vap_stru * hmac_vap,hmac_roam_old_bss_stru * old_bss,hmac_user_stru * hmac_user)1471 static osal_u32 hmac_roam_to_old_bss_sync_event(hmac_vap_stru *hmac_vap, hmac_roam_old_bss_stru *old_bss,
1472 hmac_user_stru *hmac_user)
1473 {
1474 mac_h2d_roam_sync_stru *h2d_sync = OAL_PTR_NULL;
1475 osal_s32 ret;
1476
1477 h2d_sync = oal_mem_alloc(OAL_MEM_POOL_ID_LOCAL, OAL_SIZEOF(mac_h2d_roam_sync_stru), OAL_TRUE);
1478 if (h2d_sync == OAL_PTR_NULL) {
1479 oam_error_log1(0, OAM_SF_ROAM, "vap_id[%d] {hmac_roam_to_old_bss::no buff to alloc sync info!}",
1480 hmac_vap->vap_id);
1481 return OAL_ERR_CODE_ALLOC_MEM_FAIL;
1482 }
1483
1484 // 填充同步信息
1485 h2d_sync->back_to_old = OAL_TRUE;
1486 h2d_sync->sta_aid = old_bss->sta_aid;
1487 (osal_void)memcpy_s(&(h2d_sync->channel), OAL_SIZEOF(mac_channel_stru), &old_bss->st_channel,
1488 OAL_SIZEOF(mac_channel_stru));
1489 (osal_void)memcpy_s(&(h2d_sync->cap_info), OAL_SIZEOF(mac_user_cap_info_stru), &old_bss->cap_info,
1490 OAL_SIZEOF(mac_user_cap_info_stru));
1491 (osal_void)memcpy_s(&(h2d_sync->key_info), OAL_SIZEOF(mac_key_mgmt_stru), &old_bss->key_info,
1492 OAL_SIZEOF(mac_key_mgmt_stru));
1493 (osal_void)memcpy_s(&(h2d_sync->user_tx_info), OAL_SIZEOF(mac_user_tx_param_stru), &old_bss->user_tx_info,
1494 OAL_SIZEOF(mac_user_tx_param_stru));
1495
1496 /* 在漫游过程中可能又建立了聚合,因此回退时需要删除掉 */
1497 hmac_tid_clear_etc(hmac_vap, hmac_user, OSAL_FALSE);
1498
1499 ret = hmac_config_roam_hmac_sync_dmac(hmac_vap, h2d_sync);
1500 if (ret != OAL_SUCC) {
1501 oam_error_log2(0, OAM_SF_ROAM,
1502 "vap_id[%d] {hmac_roam_to_old_bss::hmac_config_roam_hmac_sync_dmac failed[%d].}",
1503 hmac_vap->vap_id, ret);
1504 }
1505
1506 /* 释放同步数据 */
1507 if (h2d_sync != OAL_PTR_NULL) {
1508 oal_mem_free(h2d_sync, OAL_TRUE);
1509 }
1510
1511 return OAL_SUCC;
1512 }
1513
1514 #ifdef _PRE_WLAN_FEATURE_PMF
1515 /* 功能描述 : 更新vap中的PMF能力并同步到device */
hmac_config_vap_pmf_cap_etc(hmac_vap_stru * hmac_vap,wlan_pmf_cap_status_uint8 pmf_cap)1516 OAL_STATIC osal_u32 hmac_config_vap_pmf_cap_etc(hmac_vap_stru *hmac_vap, wlan_pmf_cap_status_uint8 pmf_cap)
1517 {
1518 mac_vap_pmf_mab_stru mac_vap_pmf_tbl[MAC_PMF_BUTT] = {
1519 { OSAL_FALSE, OSAL_FALSE },
1520 { OSAL_TRUE, OSAL_FALSE },
1521 { OSAL_TRUE, OSAL_TRUE },
1522 };
1523
1524 mac_mib_set_dot11_rsnamfpc(hmac_vap, mac_vap_pmf_tbl[pmf_cap].mac_mib_dot11rsnamfpc);
1525 mac_mib_set_dot11_rsnamfpr(hmac_vap, mac_vap_pmf_tbl[pmf_cap].mac_mib_dot11rsnamfpr);
1526
1527 hmac_vap->user_pmf_cap = (pmf_cap != MAC_PMF_DISABLED) ? OSAL_TRUE : OSAL_FALSE;
1528
1529 oam_warning_log1(hmac_vap->vap_id, OAM_SF_CFG, "hmac_config_vap_pmf_cap_etc::vap pmf cap [%d]", pmf_cap);
1530
1531 return OAL_SUCC;
1532 }
1533
1534 /* 功能描述 : 漫游时,根据对端pmf能力更新vap的pmf能力 */
hmac_sta_roam_update_pmf_etc(hmac_vap_stru * hmac_vap,mac_bss_dscr_stru * mac_bss_dscr)1535 OAL_STATIC osal_void hmac_sta_roam_update_pmf_etc(hmac_vap_stru *hmac_vap, mac_bss_dscr_stru *mac_bss_dscr)
1536 {
1537 osal_u16 rsn_cap_info;
1538 wlan_pmf_cap_status_uint8 pmf_cap;
1539
1540 if (hmac_vap == OSAL_NULL || mac_bss_dscr == OSAL_NULL || hmac_vap->vap_state != MAC_VAP_STATE_ROAMING) {
1541 return;
1542 }
1543
1544 rsn_cap_info = hmac_get_rsn_capability_etc(mac_bss_dscr->rsn_ie);
1545 pmf_cap = ((rsn_cap_info & BIT7) != 0) ? MAC_PMF_ENABLED : MAC_PMF_DISABLED;
1546
1547 hmac_config_vap_pmf_cap_etc(hmac_vap, pmf_cap);
1548 }
1549 #endif
1550
1551 /*****************************************************************************
1552 函 数 名 : hmac_roam_to_old_bss
1553 返 回 值 : OAL_SUCC 或 失败错误码
1554 *****************************************************************************/
hmac_roam_to_old_bss(hmac_roam_info_stru * roam_info)1555 OAL_STATIC osal_u32 hmac_roam_to_old_bss(hmac_roam_info_stru *roam_info)
1556 {
1557 osal_u32 ul_ret;
1558 hmac_vap_stru *hmac_vap = roam_info->hmac_vap;
1559 hmac_user_stru *hmac_user = roam_info->hmac_user;
1560 hmac_roam_old_bss_stru *old_bss = &roam_info->old_bss;
1561
1562 if (old_bss == OAL_PTR_NULL) {
1563 oam_error_log0(0, OAM_SF_ROAM, "{hmac_roam_to_old_bss::old_bss null}");
1564 return OAL_ERR_CODE_PTR_NULL;
1565 }
1566
1567 roam_info->st_static.roam_old_cnt++;
1568 roam_info->st_static.roam_eap_fail++;
1569
1570 /* 恢复原来bss相关信息 */
1571 hmac_roam_restore_bss(hmac_vap, old_bss, hmac_user);
1572
1573 /* 设置用户8021x端口合法性的状态为合法 */
1574 hmac_user_set_port_etc(hmac_user, OAL_TRUE);
1575
1576 ul_ret = hmac_config_start_vap_event_etc(hmac_vap, OAL_FALSE);
1577 if (ul_ret != OAL_SUCC) {
1578 oam_error_log2(0, OAM_SF_ROAM,
1579 "vap_id[%d] {hmac_roam_to_old_bss::hmac_config_start_vap_event_etc failed[%d].}",
1580 hmac_vap->vap_id, ul_ret);
1581 return ul_ret;
1582 }
1583
1584 /* 相关参数需要配置到dmac */
1585 hmac_roam_connect_set_join_reg_etc(hmac_vap, hmac_user);
1586
1587 /* 更新用户的mac地址,漫游时mac会更新 */
1588 oal_set_mac_addr(hmac_user->user_mac_addr, hmac_vap->bssid);
1589
1590 #ifdef _PRE_WLAN_FEATURE_PMF
1591 /* 此函数要在同步user能力前调用,同步user能力后会开启硬件PMF使能 */
1592 hmac_config_vap_pmf_cap_etc(hmac_vap, old_bss->cap_info.pmf_active);
1593 #endif
1594
1595 ul_ret = hmac_config_user_info_syn_etc(hmac_vap, hmac_user);
1596 if (ul_ret != OAL_SUCC) {
1597 oam_error_log2(0, OAM_SF_ROAM,
1598 "vap_id[%d] {hmac_roam_to_old_bss::hmac_syn_vap_state failed[%d].}",
1599 hmac_vap->vap_id, ul_ret);
1600 }
1601
1602 /* 回退 bss 时,hmac 2 dmac 同步的相关信息,以便失败的时候回退 */
1603 ul_ret = hmac_roam_to_old_bss_sync_event(hmac_vap, old_bss, hmac_user);
1604 if (ul_ret != OAL_SUCC) {
1605 return ul_ret;
1606 }
1607
1608 /* user已经关联上,抛事件给DMAC,在DMAC层挂用户算法钩子 */
1609 hmac_user_add_notify_alg_etc(hmac_vap, hmac_user->assoc_id);
1610
1611 oam_warning_log4(0, OAM_SF_ROAM,
1612 "{hmac_roam_to_old_bss::now resuming to [%02X:%02X:%02X:%02X:XX:XX]}",
1613 old_bss->bssid[0], old_bss->bssid[1], /* 0 1:MAC地址 */
1614 old_bss->bssid[2], old_bss->bssid[3]); /* 2 3:MAC地址 */
1615
1616 return ul_ret;
1617 }
1618
hmac_roam_sync_bssid_and_dbac_status(hmac_vap_stru * hmac_vap)1619 OAL_STATIC osal_u32 hmac_roam_sync_bssid_and_dbac_status(hmac_vap_stru *hmac_vap)
1620 {
1621 frw_msg msg_info = {0};
1622 osal_u8 bssid[WLAN_MAC_ADDR_LEN] = {0};
1623 osal_u32 ret;
1624 osal_u8 dbac_running;
1625 #ifdef _PRE_WLAN_FEATURE_DBAC
1626 hmac_device_stru *hmac_device = OSAL_NULL;
1627 #endif
1628
1629 (osal_void)memcpy_s((osal_void *)bssid, WLAN_MAC_ADDR_LEN, (osal_void *)(hmac_vap->bssid), WLAN_MAC_ADDR_LEN);
1630
1631 frw_msg_init((osal_u8 *)bssid, WLAN_MAC_ADDR_LEN, &dbac_running, sizeof(osal_u8), &msg_info);
1632 ret = (osal_u32)frw_send_msg_to_device(hmac_vap->vap_id, WLAN_MSG_H2D_C_CFG_UPDATE_BSSID, &msg_info, OSAL_TRUE);
1633 if (ret != OAL_SUCC) {
1634 oam_warning_log1(0, OAM_SF_CFG, "{hmac_roam_sync_bssid_and_dbac_status::sync msg fail[%d].}", ret);
1635 }
1636
1637 #ifdef _PRE_WLAN_FEATURE_DBAC
1638 /* dbac场景,漫游过程中start vap后,device侧dbac已经running,会发消息通知host侧,
1639 存在漫游成功后host侧还未处理该消息的情况,host侧dbac状态更新不及时,此时restart dbac会失败,
1640 所以在restart dbac之前查询device侧dbac状态并更新host侧的值 */
1641 hmac_device = hmac_res_get_mac_dev_etc(0);
1642 if (hmac_device == OSAL_NULL) {
1643 oam_warning_log0(0, OAM_SF_CFG, "{hmac_roam_sync_bssid_and_dbac_status::device null}");
1644 return OAL_FAIL;
1645 }
1646 hmac_device->en_dbac_running = dbac_running;
1647 #endif
1648
1649 return ret;
1650 }
1651
1652 #ifdef _PRE_WLAN_SUPPORT_5G
hmac_roam_to_diff_freq_band_proc(hmac_vap_stru * hmac_vap,hmac_roam_info_stru * roam_info)1653 osal_void hmac_roam_to_diff_freq_band_proc(hmac_vap_stru *hmac_vap, hmac_roam_info_stru *roam_info)
1654 {
1655 hmac_user_stru *hmac_user = roam_info->hmac_user;
1656 wlan_roam_main_band_state_enum_uint8 roam_band_state;
1657 osal_void *fhook = NULL;
1658
1659 /* 标识漫游类型,传到dmac做对应业务处理 */
1660 if (roam_info->old_bss.st_channel.band == WLAN_BAND_2G) {
1661 roam_band_state = WLAN_ROAM_MAIN_BAND_STATE_2TO5;
1662 if (hmac_vap->channel.band == WLAN_BAND_2G) {
1663 roam_band_state = WLAN_ROAM_MAIN_BAND_STATE_2TO2;
1664 }
1665 } else {
1666 roam_band_state = WLAN_ROAM_MAIN_BAND_STATE_5TO5;
1667 if (hmac_vap->channel.band == WLAN_BAND_2G) {
1668 roam_band_state = WLAN_ROAM_MAIN_BAND_STATE_5TO2;
1669 }
1670 }
1671
1672 /* 如果是从2g漫游到5g,需要清楚vap统计信息 */
1673 if ((roam_band_state == WLAN_ROAM_MAIN_BAND_STATE_2TO5) || (roam_band_state == WLAN_ROAM_MAIN_BAND_STATE_5TO2)) {
1674 fhook = hmac_get_feature_fhook(HMAC_FHOOK_BTCOEX_ROAM_SUCC_HANDLER);
1675 if (fhook != OSAL_NULL) {
1676 ((hmac_btcoex_roam_succ_handler_cb)fhook)(hmac_vap);
1677 }
1678 }
1679
1680 oam_warning_log2(0, OAM_SF_ROAM, "vap_id[%d] {hmac_roam_to_diff_freq_proc:: roam_band_state = %d!!}",
1681 hmac_vap->vap_id, roam_band_state);
1682 }
1683 #endif
1684
1685 /*****************************************************************************
1686 函 数 名 : hmac_roam_to_new_bss
1687 返 回 值 : OAL_SUCC 或 失败错误码
1688 *****************************************************************************/
hmac_roam_to_new_bss(hmac_roam_info_stru * roam_info,osal_void * param)1689 OAL_STATIC osal_u32 hmac_roam_to_new_bss(hmac_roam_info_stru *roam_info, osal_void *param)
1690 {
1691 hmac_vap_stru *hmac_vap = roam_info->hmac_vap;
1692 osal_u32 ul_ret;
1693
1694 unref_param(param);
1695
1696 ul_ret = hmac_roam_main_check_state(roam_info, MAC_VAP_STATE_ROAMING, ROAM_MAIN_STATE_CONNECTING);
1697 if (ul_ret != OAL_SUCC) {
1698 oam_warning_log1(0, OAM_SF_ROAM, "{hmac_roam_to_new_bss::check_state fail[%d]!}", ul_ret);
1699 return ul_ret;
1700 }
1701
1702 roam_info->st_static.roam_new_cnt++;
1703 hmac_roam_alg_add_history_etc(roam_info, hmac_vap->bssid);
1704
1705 hmac_roam_main_change_state(roam_info, ROAM_MAIN_STATE_UP);
1706
1707 hmac_roam_main_del_timer(roam_info);
1708
1709 /* 切换vap的状态为UP,恢复用户节能,恢复发送 */
1710 ul_ret = hmac_roam_resume_user_etc(roam_info->hmac_vap);
1711 if (ul_ret != OAL_SUCC) {
1712 oam_warning_log2(0, OAM_SF_ROAM,
1713 "vap_id[%d] {hmac_roam_to_new_bss::hmac_fsm_call_func_sta_etc fail! erro code is %u}",
1714 hmac_vap->vap_id, ul_ret);
1715 }
1716
1717 hmac_vap->roam_scan_valid_rslt = OAL_TRUE;
1718 hmac_vap->wpa3_roaming = OSAL_FALSE;
1719
1720 wifi_printf("hmac_roam_to_new_bss::roam to [%02X:%02X:%02X:%02X:XX:XX] succ\r\n",
1721 hmac_vap->bssid[0], hmac_vap->bssid[1], /* 0 1:MAC地址 */
1722 hmac_vap->bssid[2], hmac_vap->bssid[3]); /* 2 3:MAC地址 */
1723 oam_warning_log4(0, OAM_SF_ROAM, "{hmac_roam_to_new_bss::roam to [%02X:%02X:%02X:%02X:XX:XX] succ}",
1724 hmac_vap->bssid[0], hmac_vap->bssid[1], /* 0 1:MAC地址 */
1725 hmac_vap->bssid[2], hmac_vap->bssid[3]); /* 2 3:MAC地址 */
1726 hmac_roam_main_clear(roam_info);
1727
1728 /* 漫游成功同步bssid到dmac侧,否则dmac组帧会出现错误,
1729 dbac 发送ps=1的fcs one packet null帧,帧内容只在start vap时更新,
1730 所以需要重启dbac更新帧的内容 */
1731 hmac_roam_sync_bssid_and_dbac_status(hmac_vap);
1732 #ifdef _PRE_WLAN_FEATURE_DBAC
1733 hmac_vap_restart_dbac(hmac_vap);
1734 #endif
1735 #ifdef _PRE_WLAN_SUPPORT_5G
1736 hmac_roam_to_diff_freq_band_proc(hmac_vap, roam_info);
1737 #endif
1738
1739 return OAL_SUCC;
1740 }
1741
1742 /*****************************************************************************
1743 函 数 名 : hmac_roam_ignore_rssi_trigger_etc
1744 功能描述 : 暂停漫游rssi检测触发扫描,
1745 防止在弱信号下非漫游场景时频繁上报trigger事件
1746 返 回 值 : OAL_SUCC 或 失败错误码
1747 *****************************************************************************/
hmac_roam_rssi_trigger_type(hmac_vap_stru * hmac_vap,roam_scenario_enum_uint8 val)1748 osal_u32 hmac_roam_rssi_trigger_type(hmac_vap_stru *hmac_vap, roam_scenario_enum_uint8 val)
1749 {
1750 hmac_roam_info_stru *roam_info;
1751 osal_u8 vap_id;
1752
1753 if (hmac_vap == OAL_PTR_NULL) {
1754 oam_error_log0(0, OAM_SF_ROAM, "{hmac_roam_rssi_trigger_type::vap null!}");
1755 return OAL_ERR_CODE_ROAM_INVALID_VAP;
1756 }
1757
1758 vap_id = hmac_vap->vap_id;
1759 roam_info = hmac_get_roam_info(vap_id);
1760 if (roam_info->trigger.trigger_2g == OAL_RSSI_INIT_VALUE &&
1761 roam_info->trigger.trigger_5g == OAL_RSSI_INIT_VALUE) {
1762 return OAL_ERR_CODE_ROAM_DISABLED;
1763 }
1764
1765 if (roam_info->rssi_type == val) {
1766 return OAL_SUCC;
1767 }
1768
1769 if (val == ROAM_ENV_LINKLOSS) {
1770 roam_info->trigger.trigger_2g = ROAM_RSSI_LINKLOSS_TYPE;
1771 roam_info->trigger.trigger_5g = ROAM_RSSI_LINKLOSS_TYPE;
1772 } else if (val == ROAM_ENV_DENSE_AP) {
1773 roam_info->trigger.trigger_2g = roam_info->config.c_dense_env_trigger_rssi_2g;
1774 roam_info->trigger.trigger_5g = roam_info->config.c_dense_env_trigger_rssi_5g;
1775 } else {
1776 roam_info->trigger.trigger_2g = roam_info->config.c_trigger_rssi_2g;
1777 roam_info->trigger.trigger_5g = roam_info->config.c_trigger_rssi_5g;
1778 }
1779 /* 设置门限时,reset统计值,重新设置门限后,可以马上触发一次漫游 */
1780 roam_info->trigger.cnt = 0;
1781 roam_info->trigger.time_stamp = 0;
1782
1783 oam_warning_log3(0, OAM_SF_ROAM, "vap_id[%d] {hmac_config_set_roam_trigger, trigger[%d, %d]}", hmac_vap->vap_id,
1784 roam_info->trigger.trigger_2g, roam_info->trigger.trigger_5g);
1785 roam_info->rssi_type = val;
1786
1787 oam_warning_log2(0, OAM_SF_ROAM, "vap_id[%d] {hmac_roam_rssi_trigger_type::[%d]}", vap_id, val);
1788 return OAL_SUCC;
1789 }
1790
hmac_roam_pause_user_check(hmac_vap_stru * hmac_vap)1791 static osal_u32 hmac_roam_pause_user_check(hmac_vap_stru *hmac_vap)
1792 {
1793 osal_u8 vap_id;
1794 oal_net_device_stru *net_device = OAL_PTR_NULL;
1795
1796 if (hmac_vap == OAL_PTR_NULL) {
1797 oam_error_log0(0, OAM_SF_ROAM, "{hmac_roam_pause_user_etc::vap null!}");
1798 return OAL_ERR_CODE_ROAM_INVALID_VAP;
1799 }
1800
1801 vap_id = hmac_vap->vap_id;
1802
1803 net_device = hmac_vap->net_device;
1804 if (net_device == OAL_PTR_NULL) {
1805 oam_error_log1(0, OAM_SF_ROAM, "vap_id[%d] {hmac_roam_pause_user_etc::net_device null!}", vap_id);
1806 return OAL_ERR_CODE_ROAM_INVALID_VAP;
1807 }
1808
1809 /* 必须保证vap的状态是UP */
1810 if (hmac_vap->vap_state != MAC_VAP_STATE_UP) {
1811 oam_warning_log2(0, OAM_SF_ROAM,
1812 "vap_id[%d] {hmac_roam_pause_user_etc::vap state = [%d] NOT FOR ROAMING!}", vap_id,
1813 hmac_vap->vap_state);
1814 return OAL_ERR_CODE_ROAM_STATE_UNEXPECT;
1815 }
1816
1817 return OAL_SUCC;
1818 }
1819
1820 /*****************************************************************************
1821 函 数 名 : hmac_roam_pause_user_etc
1822 功能描述 : 1、通知内核协议栈暂停数据发送,
1823 2、关闭低功耗,防止漫游期间进入低功耗模式
1824 返 回 值 : OAL_SUCC 或 失败错误码
1825 *****************************************************************************/
hmac_roam_pause_user_etc(hmac_vap_stru * hmac_vap)1826 osal_u32 hmac_roam_pause_user_etc(hmac_vap_stru *hmac_vap)
1827 {
1828 hmac_roam_info_stru *roam_info = OAL_PTR_NULL;
1829 oal_net_device_stru *net_device = OAL_PTR_NULL;
1830 osal_u32 ul_ret;
1831 osal_s32 ret;
1832 osal_u8 vap_id;
1833 osal_u8 roaming_mode = 1;
1834
1835 ul_ret = hmac_roam_pause_user_check(hmac_vap);
1836 if (ul_ret != OAL_SUCC) {
1837 return ul_ret;
1838 }
1839
1840 net_device = hmac_vap->net_device;
1841 vap_id = hmac_vap->vap_id;
1842 roam_info = hmac_get_roam_info(vap_id);
1843 /* 暂停所有协议层数据,这样就不需要再hmac搞一个缓存队列了 */
1844 oal_net_tx_stop_all_queues(net_device);
1845 oal_net_wake_subqueue(net_device, WLAN_HI_QUEUE);
1846
1847 /* 清空 HMAC层TID信息 */
1848 hmac_tid_clear_etc(hmac_vap, roam_info->hmac_user, OSAL_FALSE);
1849
1850 #ifdef _PRE_WLAN_FEATURE_STA_PM
1851 ul_ret = hmac_config_set_pm_by_module_etc(hmac_vap, MAC_STA_PM_CTRL_TYPE_ROAM, MAC_STA_PM_SWITCH_OFF);
1852 if (ul_ret != OAL_SUCC) {
1853 oam_error_log2(0, OAM_SF_CFG,
1854 "vap_id[%d] {hmac_roam_pause_user_etc::hmac_config_set_pm_by_module_etc failed[%d].}", vap_id, ul_ret);
1855 oal_net_tx_wake_all_queues(net_device);
1856 return ul_ret;
1857 }
1858 #endif
1859 ret = hmac_config_roam_enable(hmac_vap, roaming_mode);
1860 if (ret != OAL_SUCC) {
1861 oam_error_log2(0, OAM_SF_CFG,
1862 "vap_id[%d] {hmac_roam_pause_user_etc::send event[WLAN_MSG_H2D_C_CFG_SET_ROAMING_MODE] failed[%d].}",
1863 vap_id, ret);
1864 oal_net_tx_wake_all_queues(net_device);
1865 return (osal_u32)ret;
1866 }
1867
1868 hmac_fsm_change_state_etc(hmac_vap, MAC_VAP_STATE_ROAMING);
1869
1870 oam_warning_log1(0, OAM_SF_ROAM, "vap_id[%d] {hmac_roam_pause_user_etc::queues stopped!}", vap_id);
1871 return OAL_SUCC;
1872 }
1873
1874 /*****************************************************************************
1875 函 数 名 : hmac_roam_resume_user_etc
1876 功能描述 : 1、通知内核协议栈恢复数据发送,
1877 2、使能低功耗
1878 返 回 值 : OAL_SUCC 或 失败错误码
1879 *****************************************************************************/
hmac_roam_resume_user_etc(hmac_vap_stru * hmac_vap)1880 osal_u32 hmac_roam_resume_user_etc(hmac_vap_stru *hmac_vap)
1881 {
1882 hmac_roam_info_stru *roam_info;
1883 oal_net_device_stru *net_device;
1884 osal_u32 ul_ret;
1885 osal_u8 vap_id;
1886 osal_u8 roaming_mode;
1887 osal_s32 ret;
1888
1889 if (hmac_vap == OAL_PTR_NULL) {
1890 oam_error_log0(0, OAM_SF_ROAM, "{hmac_roam_resume_user_etc::vap null!}");
1891 return OAL_ERR_CODE_ROAM_INVALID_VAP;
1892 }
1893
1894 vap_id = hmac_vap->vap_id;
1895 roam_info = hmac_get_roam_info(vap_id);
1896
1897 net_device = hmac_vap->net_device;
1898 if (net_device == OAL_PTR_NULL) {
1899 oam_error_log1(0, OAM_SF_ROAM, "vap_id[%d] {hmac_roam_resume_user_etc::net_device null!}", vap_id);
1900 return OAL_ERR_CODE_ROAM_INVALID_VAP;
1901 }
1902
1903 /* 必须保证vap的状态是roaming */
1904 if (hmac_vap->vap_state != MAC_VAP_STATE_ROAMING) {
1905 hmac_roam_resume_pm(roam_info);
1906 ul_ret = hmac_roam_resume_security_port(roam_info);
1907 if (ul_ret != OAL_SUCC) {
1908 oam_error_log1(0, OAM_SF_ROAM, "{hmac_roam_resume_user_etc::roam resume security failed[%d].}", ul_ret);
1909 }
1910 oal_net_tx_wake_all_queues(net_device);
1911 oam_warning_log2(0, OAM_SF_ROAM,
1912 "vap_id[%d] {hmac_roam_resume_user_etc::vap state[%d] NOT ROAMING!}", vap_id, hmac_vap->vap_state);
1913 return OAL_SUCC;
1914 }
1915
1916 roaming_mode = 0;
1917 ret = hmac_config_roam_enable(hmac_vap, roaming_mode);
1918 if (ret != OAL_SUCC) {
1919 oam_error_log1(0, OAM_SF_CFG,
1920 "vap_id[%d] {hmac_roam_resume_user_etc::send event[WLAN_MSG_H2D_C_CFG_SET_ROAMING_MODE] failed[%d].}", ret);
1921 }
1922
1923 hmac_fsm_change_state_etc(hmac_vap, MAC_VAP_STATE_UP);
1924
1925 hmac_roam_resume_pm(roam_info);
1926
1927 ul_ret = hmac_roam_resume_security_port(roam_info);
1928 if (ul_ret != OAL_SUCC) {
1929 oam_error_log1(0, OAM_SF_ROAM,
1930 "{hmac_roam_resume_user_etc::hmac_roam_resume_security_port failed[%d].}", ul_ret);
1931 }
1932
1933 oal_net_tx_wake_all_queues(net_device);
1934
1935 oam_warning_log1(0, OAM_SF_ROAM, "vap_id[%d] {hmac_roam_resume_user_etc::all_queues awake!}", vap_id);
1936
1937 return OAL_SUCC;
1938 }
1939
1940 /*****************************************************************************
1941 函 数 名 : hmac_roam_scan_complete_etc
1942 返 回 值 : OAL_SUCC 或 失败错误码
1943 *****************************************************************************/
hmac_roam_scan_complete_etc(hmac_vap_stru * hmac_vap)1944 osal_u32 hmac_roam_scan_complete_etc(hmac_vap_stru *hmac_vap)
1945 {
1946 hmac_roam_info_stru *roam_info;
1947 hmac_device_stru *hmac_device;
1948 osal_u8 vap_id;
1949 hmac_bss_mgmt_stru *scan_bss_mgmt;
1950
1951 if (hmac_vap == OAL_PTR_NULL) {
1952 oam_error_log0(0, OAM_SF_ROAM, "{hmac_roam_scan_complete_etc::vap null!}");
1953 return OAL_ERR_CODE_ROAM_INVALID_VAP;
1954 }
1955
1956 vap_id = hmac_vap->vap_id;
1957 roam_info = hmac_get_roam_info(vap_id);
1958
1959 /* 获取hmac device */
1960 hmac_device = hmac_res_get_mac_dev_etc(hmac_vap->device_id);
1961 if (hmac_device == OAL_PTR_NULL) {
1962 oam_error_log0(0, OAM_SF_ROAM, "{hmac_roam_scan_complete_etc::device null!}");
1963 return OAL_ERR_CODE_MAC_DEVICE_NULL;
1964 }
1965
1966 scan_bss_mgmt = &(hmac_device->scan_mgmt.scan_record_mgmt.bss_mgmt);
1967
1968 oam_info_log1(0, OAM_SF_ROAM, "vap_id[%d] {hmac_roam_scan_complete_etc::handling scan result!}", vap_id);
1969 return hmac_roam_main_fsm_action_etc(roam_info, ROAM_MAIN_FSM_EVENT_SCAN_RESULT, (void *)scan_bss_mgmt);
1970 }
1971
1972 /*****************************************************************************
1973 函 数 名 : hmac_roam_trigger_handle_etc
1974 返 回 值 : OAL_SUCC 或 失败错误码
1975 *****************************************************************************/
hmac_roam_trigger_handle_etc(hmac_vap_stru * hmac_vap,osal_s8 c_rssi,oal_bool_enum_uint8 cur_bss_ignore)1976 osal_u32 hmac_roam_trigger_handle_etc(hmac_vap_stru *hmac_vap, osal_s8 c_rssi,
1977 oal_bool_enum_uint8 cur_bss_ignore)
1978 {
1979 hmac_roam_info_stru *roam_info;
1980 osal_u32 ul_ret;
1981
1982 if (hmac_vap == OAL_PTR_NULL) {
1983 oam_error_log0(0, OAM_SF_ROAM, "{hmac_roam_trigger_handle_etc::hmac_vap null!}");
1984 return OAL_ERR_CODE_ROAM_INVALID_VAP;
1985 }
1986
1987 roam_info = hmac_get_roam_info(hmac_vap->vap_id);
1988
1989 /* 每次漫游前,刷新是否支持漫游到自己的参数 */
1990 roam_info->current_bss_ignore = cur_bss_ignore;
1991 roam_info->config.scan_orthogonal = ROAM_SCAN_CHANNEL_ORG_BUTT;
1992 roam_info->roam_trigger = ROAM_TRIGGER_DMAC;
1993 roam_info->connect.ft_force_air = OAL_FALSE;
1994 roam_info->connect.ft_failed = OAL_FALSE;
1995
1996 ul_ret = hmac_roam_main_check_state(roam_info, MAC_VAP_STATE_UP, ROAM_MAIN_STATE_INIT);
1997 if (ul_ret != OAL_SUCC) {
1998 oam_warning_log1(0, OAM_SF_ROAM, "{hmac_roam_trigger_handle_etc::check_state fail[%d]!}", ul_ret);
1999 return ul_ret;
2000 }
2001
2002 hmac_roam_alg_init_etc(roam_info, c_rssi);
2003
2004 ul_ret = hmac_roam_main_fsm_action_etc(roam_info, ROAM_MAIN_FSM_EVENT_START, OAL_PTR_NULL);
2005 if (ul_ret != OAL_SUCC) {
2006 oam_warning_log2(0, OAM_SF_ROAM, "vap_id[%d] {hmac_roam_trigger_handle_etc::START fail[%d].}",
2007 hmac_vap->vap_id, ul_ret);
2008 return ul_ret;
2009 }
2010
2011 return OAL_SUCC;
2012 }
2013
2014 /*****************************************************************************
2015 函 数 名 : hmac_roam_rx_mgmt
2016 返 回 值 : OAL_SUCC 或 失败错误码
2017 *****************************************************************************/
hmac_sta_roam_rx_mgmt_etc(oal_netbuf_stru ** netbuf,hmac_vap_stru * hmac_vap)2018 OAL_STATIC osal_u32 hmac_sta_roam_rx_mgmt_etc(oal_netbuf_stru **netbuf, hmac_vap_stru *hmac_vap)
2019 {
2020 if (hmac_vap == OSAL_NULL || *netbuf == OSAL_NULL || (hmac_vap->vap_state != MAC_VAP_STATE_ROAMING)) {
2021 return OAL_CONTINUE;
2022 }
2023
2024 return hmac_roam_connect_rx_mgmt_etc(*netbuf, hmac_vap);
2025 }
2026 /*****************************************************************************
2027 函 数 名 : hmac_roam_add_key_done_etc
2028 返 回 值 : OAL_SUCC 或 失败错误码
2029 *****************************************************************************/
hmac_roam_add_key_done_etc(hmac_vap_stru * hmac_vap,oal_bool_enum_uint8 pairwise)2030 OAL_STATIC osal_void hmac_roam_add_key_done_etc(hmac_vap_stru *hmac_vap, oal_bool_enum_uint8 pairwise)
2031 {
2032 if (hmac_vap == OSAL_NULL || pairwise != OSAL_FALSE) {
2033 return;
2034 }
2035
2036 if ((!is_legacy_sta(hmac_vap)) ||
2037 (hmac_vap->vap_state != MAC_VAP_STATE_ROAMING && hmac_vap->wpa3_roaming != OSAL_TRUE)) {
2038 return;
2039 }
2040 hmac_roam_connect_key_done_etc(hmac_vap);
2041 }
2042
2043 /*****************************************************************************
2044 函 数 名 : hmac_roam_wpas_connect_state_notify_etc
2045 功能描述 : wpas 关联状态通知函数
2046 返 回 值 : OAL_SUCC 或 失败错误码
2047 *****************************************************************************/
hmac_roam_wpas_connect_state_notify_etc(hmac_vap_stru * hmac_vap,wpas_connect_state_enum_uint32 conn_state)2048 OAL_STATIC osal_void hmac_roam_wpas_connect_state_notify_etc(hmac_vap_stru *hmac_vap,
2049 wpas_connect_state_enum_uint32 conn_state)
2050 {
2051 hmac_roam_info_stru *roam_info;
2052
2053 if (hmac_vap == OAL_PTR_NULL) {
2054 oam_error_log0(0, OAM_SF_ROAM, "{hmac_roam_wpas_connect_state_notify_etc::vap null!}");
2055 return;
2056 }
2057
2058 if (!is_legacy_sta(hmac_vap)) {
2059 return;
2060 }
2061
2062 roam_info = hmac_get_roam_info(hmac_vap->vap_id);
2063 if (roam_info == OAL_PTR_NULL) {
2064 return;
2065 }
2066
2067 if (roam_info->connected_state == conn_state) {
2068 oam_warning_log1(0, OAM_SF_ROAM,
2069 "hmac_roam_wpas_connect_state_notify_etc::roam_info->connected_state == conn_state, [%d]\r\n", conn_state);
2070 return;
2071 }
2072
2073 oam_warning_log3(0, OAM_SF_ROAM,
2074 "vap_id[%d] {hmac_roam_wpas_connect_state_notify_etc:: state changed: [%d]-> [%d]}",
2075 hmac_vap->vap_id,
2076 roam_info->connected_state, conn_state);
2077
2078 roam_info->connected_state = conn_state;
2079 if (conn_state == WPAS_CONNECT_STATE_IPADDR_OBTAINED) {
2080 roam_info->ip_addr_obtained = OAL_TRUE;
2081 }
2082 if (conn_state == WPAS_CONNECT_STATE_IPADDR_REMOVED) {
2083 roam_info->ip_addr_obtained = OAL_FALSE;
2084 }
2085
2086 roam_info->trigger.ip_addr_obtained = roam_info->ip_addr_obtained;
2087 roam_info->trigger.ip_obtain_stamp = (osal_u32)osal_get_time_stamp_ms();
2088 oam_warning_log2(0, OAM_SF_PWR, "vap_id[%d] {hmac_roam_wpas_connect_state_notify_etc:: ip_addr_obtained = %d!!}",
2089 hmac_vap->vap_id, roam_info->ip_addr_obtained);
2090 }
2091
hmac_roam_set_ip_state(hmac_vap_stru * hmac_vap,frw_msg * msg)2092 OAL_STATIC osal_s32 hmac_roam_set_ip_state(hmac_vap_stru *hmac_vap, frw_msg *msg)
2093 {
2094 wpas_connect_state_enum_uint32 ip_state;
2095
2096 if (msg == OSAL_NULL) {
2097 return OAL_ERR_CODE_PTR_NULL;
2098 }
2099
2100 ip_state = *(osal_u32 *)msg->data;
2101 hmac_roam_wpas_connect_state_notify_etc(hmac_vap, ip_state);
2102
2103 return OAL_SUCC;
2104 }
2105
2106 /*****************************************************************************
2107 函 数 名 : hmac_framer_modify_bssid
2108 功能描述 : 修改帧的bssid
2109 *****************************************************************************/
hmac_frame_modify_bssid(oal_netbuf_stru * netbuf,const osal_u8 * bssid)2110 OAL_STATIC osal_void hmac_frame_modify_bssid(oal_netbuf_stru *netbuf, const osal_u8 *bssid)
2111 {
2112 mac_ieee80211_qos_htc_frame_addr4_stru *mac_hdr;
2113 mac_tx_ctl_stru *tx_ctl;
2114 osal_u8 is_tods;
2115 osal_u8 is_from_ds;
2116
2117 mac_hdr = (mac_ieee80211_qos_htc_frame_addr4_stru *)oal_netbuf_tx_data(netbuf);
2118 tx_ctl = (mac_tx_ctl_stru *)oal_netbuf_cb(netbuf);
2119
2120 is_tods = mac_hdr_get_to_ds((osal_u8 *)mac_hdr);
2121 is_from_ds = mac_hdr_get_from_ds((osal_u8 *)mac_hdr);
2122 /*************************************************************************/
2123 /* 80211 MAC HEADER */
2124 /* --------------------------------------------------------------------- */
2125 /* | To | From | ADDR1 | ADDR2 | ADDR3 | ADDR3 | ADDR4 | ADDR4 | */
2126 /* | DS | DS | | | MSDU | A-MSDU | MSDU | A-MSDU | */
2127 /* ---------------------------------------------------------------------- */
2128 /* | 0 | 0 | RA=DA | TA=SA | BSSID | BSSID | N/A | N/A | */
2129 /* | 0 | 1 | RA=DA |TA=BSSID| SA | BSSID | N/A | N/A | */
2130 /* | 1 | 0 |RA=BSSID| RA=SA | DA | BSSID | N/A | N/A | */
2131 /* | 1 | 1 | RA | TA | DA | BSSID | SA | BSSID | */
2132 /*************************************************************************/
2133 if ((is_tods == 0) && (is_from_ds == 0)) {
2134 (osal_void)memcpy_s((osal_void *)(mac_hdr->qos_frame_addr4.address3), WLAN_MAC_ADDR_LEN,
2135 (osal_void *)(bssid), WLAN_MAC_ADDR_LEN);
2136 return;
2137 }
2138
2139 if ((is_tods == 0) && (is_from_ds == 1)) {
2140 (osal_void)memcpy_s((osal_void *)(mac_hdr->qos_frame_addr4.address2), WLAN_MAC_ADDR_LEN,
2141 (osal_void *)(bssid), WLAN_MAC_ADDR_LEN);
2142 if (tx_ctl->is_amsdu == OSAL_TRUE) {
2143 (osal_void)memcpy_s((osal_void *)(mac_hdr->qos_frame_addr4.address3), WLAN_MAC_ADDR_LEN,
2144 (osal_void *)(bssid), WLAN_MAC_ADDR_LEN);
2145 }
2146 return;
2147 }
2148
2149 if ((is_tods == 1) && (is_from_ds == 0)) {
2150 (osal_void)memcpy_s((osal_void *)(mac_hdr->qos_frame_addr4.address1), WLAN_MAC_ADDR_LEN,
2151 (osal_void *)(bssid), WLAN_MAC_ADDR_LEN);
2152 if (tx_ctl->is_amsdu == OSAL_TRUE) {
2153 (osal_void)memcpy_s((osal_void *)(mac_hdr->qos_frame_addr4.address3), WLAN_MAC_ADDR_LEN,
2154 (osal_void *)(bssid), WLAN_MAC_ADDR_LEN);
2155 }
2156 return;
2157 }
2158
2159 if ((is_tods == 1) && (is_from_ds == 1)) {
2160 if (tx_ctl->is_amsdu == OSAL_TRUE) {
2161 (osal_void)memcpy_s((osal_void *)(mac_hdr->qos_frame_addr4.address3), WLAN_MAC_ADDR_LEN,
2162 (osal_void *)(bssid), WLAN_MAC_ADDR_LEN);
2163 (osal_void)memcpy_s((osal_void *)(mac_hdr->qos_frame_addr4.address4), WLAN_MAC_ADDR_LEN,
2164 (osal_void *)(bssid), WLAN_MAC_ADDR_LEN);
2165 }
2166 return;
2167 }
2168
2169 return;
2170 }
2171 /*****************************************************************************
2172 函 数 名 : hmac_roam_update_framer
2173 功能描述 : 更新tid队列的报文
2174 *****************************************************************************/
hmac_roam_update_framer(const hmac_vap_stru * hmac_vap,hmac_user_stru * hmac_user)2175 OAL_STATIC osal_u32 hmac_roam_update_framer(const hmac_vap_stru *hmac_vap, hmac_user_stru *hmac_user)
2176 {
2177 hal_to_dmac_device_stru *hal_device;
2178 hmac_tid_stru *tid_queue;
2179 struct osal_list_head *dscr_entry;
2180 hal_tx_dscr_stru *tx_dscr;
2181 oal_netbuf_stru *netbuf;
2182 osal_u16 mpdu_num;
2183 osal_u8 tid_idx;
2184
2185 hal_device = hmac_vap->hal_device;
2186
2187 if (osal_unlikely(hal_device == OSAL_NULL)) {
2188 oam_error_log0(0, OAM_SF_ROAM, "{hmac_roam_update_framer::hal_device null.}");
2189 return OAL_ERR_CODE_PTR_NULL;
2190 }
2191
2192 for (tid_idx = 0; tid_idx < WLAN_TID_MAX_NUM; tid_idx++) {
2193 osal_u32 irq_status;
2194 tid_queue = &hmac_user->tx_tid_queue[tid_idx];
2195 if (osal_list_empty(&tid_queue->retry_q) == OSAL_FALSE) {
2196 /* 重传队列非空 */
2197 mpdu_num = 0;
2198 osal_list_for_each(dscr_entry, &tid_queue->retry_q) {
2199 tx_dscr = osal_list_entry(dscr_entry, hal_tx_dscr_stru, entry);
2200
2201 netbuf = (oal_netbuf_stru *)tx_dscr->skb_start_addr;
2202 hmac_frame_modify_bssid(netbuf, hmac_user->user_mac_addr);
2203 mpdu_num++;
2204 }
2205 oam_warning_log2(0, OAM_SF_ROAM,
2206 "{hmac_roam_update_framer:: TID[%d]:%d mpdu is updated in retry_q.}", tid_idx, mpdu_num);
2207 }
2208 irq_status = frw_osal_irq_lock();
2209 if (oal_netbuf_list_empty(&tid_queue->buff_head) == OSAL_FALSE) {
2210 /* netbuf队列非空 */
2211 mpdu_num = 0;
2212 for (netbuf = tid_queue->buff_head.next;
2213 netbuf != (oal_netbuf_stru *)(&tid_queue->buff_head); netbuf = netbuf->next) {
2214 hmac_frame_modify_bssid(netbuf, hmac_user->user_mac_addr);
2215 mpdu_num++;
2216 }
2217 oam_warning_log2(0, OAM_SF_ROAM, "{hmac_roam_update_framer:: TID[%d]:%d mpdu is updated in buff_q.}",
2218 tid_idx, mpdu_num);
2219 }
2220 frw_osal_irq_restore(irq_status);
2221 }
2222
2223 return OAL_SUCC;
2224 }
2225
2226 /*****************************************************************************
2227 功能描述 : 清除ba会话
2228 输入参数 : hmac_vap_stru *mac_vap
2229 osal_u8 len
2230 osal_u8 *param
2231 返 回 值: osal_u32
2232 *****************************************************************************/
hmac_roam_reset_ba(hmac_vap_stru * hmac_vap,hmac_user_stru * hmac_user)2233 OAL_STATIC osal_void hmac_roam_reset_ba(hmac_vap_stru *hmac_vap, hmac_user_stru *hmac_user)
2234 {
2235 frw_msg msg_info = {0};
2236 osal_s32 ret;
2237 osal_u16 aid = hmac_user->assoc_id;
2238 hmac_tid_stru *tid_queue;
2239 osal_u8 tid_idx;
2240
2241 if (hmac_vap == OSAL_NULL) {
2242 oam_warning_log0(0, OAM_SF_ANY, "{hmac_roam_reset_ba::hmac_vap is NULL.}");
2243 }
2244
2245 /* 抛事件至Device侧DMAC,同步重置BA */
2246 frw_msg_init((osal_u8 *)&aid, sizeof(osal_u16), OSAL_NULL, 0, &msg_info);
2247 ret = frw_send_msg_to_device(hmac_vap->vap_id, WLAN_MSG_H2D_C_CFG_DEVICE_RESET_BA, &msg_info, OSAL_TRUE);
2248 if (ret != OAL_SUCC) {
2249 oam_warning_log1(hmac_vap->vap_id, OAM_SF_CFG,
2250 "{hmac_roam_reset_ba::frw_send_msg_to_device failed[%d].}", ret);
2251 }
2252
2253 for (tid_idx = 0; tid_idx < WLAN_TID_MAX_NUM; tid_idx++) {
2254 tid_queue = &hmac_user->tx_tid_queue[tid_idx];
2255
2256 /* 释放BA相关的内容 */
2257 if (tid_queue->ba_rx_hdl.ba_conn_status == HMAC_BA_COMPLETE) {
2258 tid_queue->ba_rx_hdl.ba_conn_status = HMAC_BA_INIT;
2259 oam_warning_log1(0, OAM_SF_ROAM, "{hmac_roam_reset_ba:: TID[%d]:reset rx ba.}", tid_idx);
2260 }
2261
2262 /* 恢复TX方向Tid队列 */
2263 hmac_tid_resume(tid_queue, DMAC_TID_PAUSE_RESUME_TYPE_BA);
2264 oam_warning_log1(0, OAM_SF_ROAM, "{hmac_roam_reset_ba:: TID[%d]:reset tx ba.}", tid_idx);
2265 }
2266
2267 return;
2268 }
2269
hmac_config_roam_enable_active(hmac_user_stru * hmac_user,hmac_vap_stru * hmac_vap)2270 OAL_STATIC osal_void hmac_config_roam_enable_active(hmac_user_stru *hmac_user, hmac_vap_stru *hmac_vap)
2271 {
2272 osal_void *fhook = NULL;
2273 hmac_user_pause(hmac_user);
2274 hmac_roam_reset_ba(hmac_vap, hmac_user);
2275
2276 hmac_vap_state_change_etc(hmac_vap, MAC_VAP_STATE_ROAMING);
2277
2278 /* 通知算法用户下线,在dbac场景下减少在关联期间的信道切换操作 */
2279 hmac_vap_down_notify(hmac_vap);
2280 oam_warning_log1(0, OAM_SF_ROAM,
2281 "vap_id[%d] {hmac_config_roam_enable_active:: [MAC_VAP_STATE_UP]->[MAC_VAP_STATE_ROAMING]}", hmac_vap->vap_id);
2282 /* 漫游开始,需要重新出将legacy速率信息设为初始值 */
2283 hmac_vap_init_rate_info(&(hmac_vap->vap_curr_rate));
2284 hmac_vap_init_tx_frame_params(hmac_vap, OSAL_TRUE);
2285 /* 需要临时暂停ps机制 */
2286 fhook = hmac_get_feature_fhook(HMAC_FHOOK_BTCOEX_SET_WLAN_PRIORITY);
2287 if (fhook != OSAL_NULL) {
2288 ((hmac_btcoex_set_wlan_priority_cb)fhook)(hmac_vap, OSAL_TRUE, BTCOEX_PRIO_TIMEOUT_100MS);
2289 }
2290 frw_util_notifier_notify(WLAN_UTIL_NOTIFIER_EVENT_ROAM_ACTIVE, hmac_vap);
2291 }
2292
2293 /*****************************************************************************
2294 功能描述 : 进入/退出漫游模式
2295 输入参数 : hmac_vap_stru *mac_vap
2296 osal_u8 len
2297 osal_u8 *param
2298 返 回 值: osal_u32
2299 *****************************************************************************/
hmac_config_roam_enable(hmac_vap_stru * hmac_vap,osal_u8 roaming_mode)2300 osal_s32 hmac_config_roam_enable(hmac_vap_stru *hmac_vap, osal_u8 roaming_mode)
2301 {
2302 hmac_user_stru *hmac_user = OSAL_NULL;
2303 osal_void *fhook = NULL;
2304 hal_to_dmac_chip_stru *hal_chip = hmac_vap->hal_chip;
2305 if (hal_chip == OSAL_NULL) {
2306 oam_error_log1(0, OAM_SF_ROAM, "vap_id[%d] {hmac_config_roam_enable:: hal_chip null.}", hmac_vap->vap_id);
2307 return OAL_ERR_CODE_PTR_NULL;
2308 }
2309
2310 hmac_user = (hmac_user_stru *)mac_res_get_hmac_user_etc(hmac_vap->assoc_vap_id);
2311 if (hmac_user == OSAL_NULL) {
2312 oam_warning_log2(0, OAM_SF_ROAM, "vap_id[%d] {hmac_config_roam_enable::hmac_user[%d] null.}", hmac_vap->vap_id,
2313 hmac_vap->assoc_vap_id);
2314 return OAL_ERR_CODE_PTR_NULL;
2315 }
2316 if ((roaming_mode == 1) &&
2317 (hmac_vap->vap_state == MAC_VAP_STATE_UP || hmac_vap->vap_state == MAC_VAP_STATE_PAUSE)) {
2318 hmac_config_roam_enable_active(hmac_user, hmac_vap);
2319 } else if ((roaming_mode == 0) && (hmac_vap->vap_state == MAC_VAP_STATE_ROAMING)) {
2320 hmac_roam_update_framer(hmac_vap, hmac_user);
2321 hmac_user_resume(hmac_user);
2322
2323 oam_warning_log1(0, OAM_SF_ROAM,
2324 "vap_id[%d] {hmac_config_roam_enable:: [MAC_VAP_STATE_ROAMING]->[MAC_VAP_STATE_UP]}", hmac_vap->vap_id);
2325 hmac_vap_state_change_etc(hmac_vap, MAC_VAP_STATE_UP);
2326
2327 /* 漫游结束后,刷掉occupied_period以保证BT竞争到 */
2328 /* 需要临时暂停ps机制 */
2329 frw_util_notifier_notify(WLAN_UTIL_NOTIFIER_EVENT_ROAM_DEACTIVE, hmac_vap);
2330 fhook = hmac_get_feature_fhook(HMAC_FHOOK_BTCOEX_RECOVER_COEX_PRIORITY);
2331 if (fhook != OSAL_NULL) {
2332 ((hmac_btcoex_recover_coex_priority_cb)fhook)(hmac_vap);
2333 }
2334 } else {
2335 oam_warning_log3(0, OAM_SF_ROAM, "vap_id[%d] {hmac_config_roam_enable::unexpect state[%d] or mode[%d]}",
2336 hmac_vap->vap_id, hmac_vap->vap_state, roaming_mode);
2337 }
2338 return OAL_SUCC;
2339 }
2340
2341 /*****************************************************************************
2342 功能描述 : 漫游模式下更新 hmac info 到 dmac
2343 输入参数 : hmac_vap_stru *mac_vap
2344 osal_u8 len
2345 osal_u8 *param
2346 返 回 值: osal_u32
2347 *****************************************************************************/
hmac_config_roam_hmac_sync_dmac(hmac_vap_stru * hmac_vap,mac_h2d_roam_sync_stru * sync_param)2348 osal_s32 hmac_config_roam_hmac_sync_dmac(hmac_vap_stru *hmac_vap, mac_h2d_roam_sync_stru *sync_param)
2349 {
2350 hmac_user_stru *hmac_user;
2351 osal_u8 old_chan_number, old_bandwidth;
2352
2353 hmac_user = (hmac_user_stru *)mac_res_get_hmac_user_etc(hmac_vap->assoc_vap_id);
2354 if (hmac_user == OSAL_NULL) {
2355 /* 漫游中会遇到 kick user 的情况,降低 log level */
2356 oam_warning_log2(0, OAM_SF_ANY, "vap_id[%d] {hmac_config_roam_hmac_sync_dmac::hmac_user[%d] null.}",
2357 hmac_vap->vap_id, hmac_vap->assoc_vap_id);
2358 return OAL_ERR_CODE_PTR_NULL;
2359 }
2360
2361 if (sync_param->back_to_old == OSAL_TRUE) {
2362 old_chan_number = hmac_vap->channel.chan_number;
2363 old_bandwidth = hmac_vap->channel.en_bandwidth;
2364 /* 恢复原来bss相关信息 */
2365 hmac_vap_set_aid_etc(hmac_vap, sync_param->sta_aid);
2366 (osal_void)memcpy_s(&(hmac_vap->channel), sizeof(mac_channel_stru),
2367 &sync_param->channel, sizeof(mac_channel_stru));
2368 (osal_void)memcpy_s(&(hmac_user->cap_info), sizeof(mac_user_cap_info_stru),
2369 &sync_param->cap_info, sizeof(mac_user_cap_info_stru));
2370 (osal_void)memcpy_s(&(hmac_user->key_info), sizeof(mac_key_mgmt_stru),
2371 &sync_param->key_info, sizeof(mac_key_mgmt_stru));
2372 (osal_void)memcpy_s(&(hmac_user->user_tx_info), sizeof(mac_user_tx_param_stru),
2373 &sync_param->user_tx_info, sizeof(mac_user_tx_param_stru));
2374 /* 在漫游过程中可能又建立了聚合,因此回退时需要删除掉 */
2375 hmac_user_pause(hmac_user);
2376 hmac_roam_reset_ba(hmac_vap, hmac_user);
2377
2378 if (old_chan_number != hmac_vap->channel.chan_number || old_bandwidth != hmac_vap->channel.en_bandwidth) {
2379 hmac_vap_sync(hmac_vap);
2380 }
2381 #ifdef _PRE_WLAN_FEATURE_MAC_PARSE_TIM
2382 /* 判断aid有效性 */
2383 if (sync_param->sta_aid == 0 || sync_param->sta_aid >= 2008) { // sta aid为0或大于等于2008,返回错误退出。
2384 oam_error_log2(0, OAM_SF_TX, "vap_id[%d] {hmac_config_roam_hmac_sync_dmac::aid invalid[%d]}",
2385 hmac_vap->vap_id, sync_param->sta_aid);
2386 return OAL_FAIL;
2387 }
2388 /* STA漫游回old bss时重新配置aid寄存器,防止被意外覆盖 */
2389 if (hmac_vap->vap_mode == WLAN_VAP_MODE_BSS_STA) {
2390 hal_set_mac_aid(hmac_vap->hal_vap, hmac_vap->sta_aid);
2391 }
2392 #endif
2393 }
2394 /* 设置用户8021x端口合法性的状态为合法 */
2395 hmac_user_set_port_etc(hmac_user, OSAL_TRUE);
2396 oam_warning_log1(0, OAM_SF_ROAM, "vap_id[%d] {hmac_config_roam_hmac_sync_dmac:: Sync Done!!}", hmac_vap->vap_id);
2397 return OAL_SUCC;
2398 }
2399
hmac_roam_proc_connect_cmd(hmac_vap_stru * hmac_vap,mac_conn_param_stru * connect_param)2400 OAL_STATIC osal_u32 hmac_roam_proc_connect_cmd(hmac_vap_stru *hmac_vap, mac_conn_param_stru *connect_param)
2401 {
2402 if (hmac_vap == OSAL_NULL || connect_param == OSAL_NULL) {
2403 return OAL_CONTINUE;
2404 }
2405
2406 if (hmac_vap->vap_state == MAC_VAP_STATE_ROAMING) {
2407 /* 通知ROAM主状态机, ABORT Roaming FSM */
2408 hmac_roam_connect_complete_etc(hmac_vap, OAL_FAIL);
2409
2410 /* After roam_to_old_bss, hmac_vap->vap_state should be MAC_VAP_STATE_UP,
2411 * hmac_roam_info_stru *roam_info;
2412 * roam_info = (hmac_roam_info_stru *)hmac_vap->pul_roam_info;
2413 * roam_info->main_state and roam_info->connect.state should be 0 */
2414 }
2415
2416 if (hmac_vap->vap_state == MAC_VAP_STATE_UP) {
2417 oal_bool_enum_uint8 bss_ignore = osal_memcmp(hmac_vap->bssid, connect_param->bssid, OAL_MAC_ADDR_LEN) == 0 ?
2418 OAL_TRUE : OAL_FALSE;
2419 /* support wpa_cli/wpa_supplicant reassociate function */
2420 oam_warning_log1(0, OAM_SF_CFG, "vap_id[%d]", hmac_vap->vap_id);
2421 oam_warning_log4(0, OAM_SF_CFG, "roaming AP with ressoc frame, %02X:%02X:%02X:%02X:XX:XX",
2422 /* 0:1:2:3:数组下标 */
2423 connect_param->bssid[0], connect_param->bssid[1], connect_param->bssid[2], connect_param->bssid[3]);
2424 return hmac_roam_start_etc(hmac_vap, ROAM_SCAN_CHANNEL_ORG_0, bss_ignore, ROAM_TRIGGER_APP);
2425 }
2426
2427 return OAL_CONTINUE;
2428 }
2429
hmac_config_get_ip_status(hmac_vap_stru * hmac_vap,frw_msg * msg)2430 OAL_STATIC osal_s32 hmac_config_get_ip_status(hmac_vap_stru *hmac_vap, frw_msg *msg)
2431 {
2432 osal_u8 ip_status;
2433 wpas_connect_state_enum_uint32 conn_state;
2434
2435 if (osal_unlikely(hmac_vap == OAL_PTR_NULL || msg->data == OAL_PTR_NULL)) {
2436 oam_error_log0(0, OAM_SF_ROAM, "{hmac_config_get_ip_status::null ptr.");
2437 return OAL_ERR_CODE_PTR_NULL;
2438 }
2439
2440 ip_status = (osal_u8)*(msg->data);
2441 conn_state = (ip_status == 1) ? WPAS_CONNECT_STATE_IPADDR_OBTAINED : WPAS_CONNECT_STATE_IPADDR_REMOVED;
2442
2443 hmac_roam_wpas_connect_state_notify_etc(hmac_vap, conn_state);
2444 return OAL_SUCC;
2445 }
2446
hmac_sta_roam_trigger_check(hmac_vap_stru * hmac_vap,osal_s8 trigger_rssi,osal_u32 * cur_time,osal_s8 * current_rssi)2447 OAL_STATIC osal_bool hmac_sta_roam_trigger_check(hmac_vap_stru *hmac_vap, osal_s8 trigger_rssi, osal_u32 *cur_time,
2448 osal_s8 *current_rssi)
2449 {
2450 osal_u32 delta_time;
2451 osal_bool ret = OSAL_FALSE;
2452 hmac_roam_info_stru *roam_info = hmac_get_roam_info(hmac_vap->vap_id);
2453
2454 if (*current_rssi >= trigger_rssi) {
2455 roam_info->trigger.cnt = 0;
2456 } else if (roam_info->trigger.cnt++ >= ROAM_TRIGGER_COUNT_THRESHOLD) {
2457 /* 连续若干次rssi小于门限时发起一次漫游 */
2458 /* 漫游触发事件需要满足上报最小间隔 */
2459 *cur_time = (osal_u32)osal_get_time_stamp_ms();
2460 delta_time = (osal_u32)osal_get_runtime(roam_info->trigger.time_stamp, *cur_time);
2461 if ((*current_rssi <= ROAM_TRIGGER_RSSI_NE80_DB && delta_time >= ROAM_TRIGGER_INTERVAL_10S) ||
2462 (*current_rssi <= ROAM_TRIGGER_RSSI_NE75_DB && delta_time >= ROAM_TRIGGER_INTERVAL_15S) ||
2463 (delta_time >= ROAM_TRIGGER_INTERVAL_20S)) {
2464 ret = OSAL_TRUE;
2465 roam_info->trigger.cnt = 0;
2466 }
2467 }
2468
2469 /* WLAN0: LINK LOSS计数满足3/4的门限时发起一次漫游,rssi为0表示强制漫游 */
2470 if ((get_current_linkloss_cnt(hmac_vap) >= (get_current_linkloss_threshold(hmac_vap) >> 1) +
2471 /* 右移2位 */
2472 (get_current_linkloss_threshold(hmac_vap) >> 2)) && (roam_info->linkloss_roam_done == OSAL_FALSE)) {
2473 oam_warning_log3(0, OAM_SF_ROAM,
2474 "vap_id[%d] {hmac_sta_roam_trigger_check:: link cnt[%d] >= 3/4 threshold[%d], start roam scan.}",
2475 hmac_vap->vap_id,
2476 get_current_linkloss_cnt(hmac_vap), get_current_linkloss_threshold(hmac_vap));
2477
2478 /* 计数超过门限3/4,防止重复发起漫游扫描 */
2479 roam_info->linkloss_roam_done = OSAL_TRUE;
2480
2481 *current_rssi = ROAM_RSSI_LINKLOSS_TYPE;
2482 ret = OSAL_TRUE;
2483 }
2484 return ret;
2485 }
2486
2487 /*****************************************************************************
2488 函 数 名 : hmac_sta_roam_trigger_event_send
2489 功能描述 : 判断漫游触发是否需要上报HMAC
2490 *****************************************************************************/
hmac_sta_roam_trigger_event_send(hmac_vap_stru * hmac_vap)2491 OAL_STATIC osal_void hmac_sta_roam_trigger_event_send(hmac_vap_stru *hmac_vap)
2492 {
2493 osal_u32 cur_time = 0;
2494 osal_s8 trigger_rssi;
2495 osal_u32 delta_time;
2496 osal_s8 current_rssi;
2497 hmac_roam_info_stru *roam_info;
2498 osal_u8 is_5g_enable;
2499
2500 if (hmac_vap == OSAL_NULL || !is_legacy_sta(hmac_vap)) {
2501 return;
2502 }
2503
2504 roam_info = hmac_get_roam_info(hmac_vap->vap_id);
2505 is_5g_enable = (osal_u8)hmac_device_check_5g_enable(hmac_vap->device_id);
2506 /* ini中2.4G和5G漫游触发阈值都配置-128,表示关闭弱信号漫游 */
2507 if (roam_info == OSAL_NULL || roam_info->enable == OSAL_FALSE ||
2508 (roam_info->trigger.trigger_2g == OAL_RSSI_INIT_VALUE &&
2509 (roam_info->trigger.trigger_5g == OAL_RSSI_INIT_VALUE || is_5g_enable == OSAL_FALSE))) {
2510 return;
2511 }
2512
2513 current_rssi = (osal_s8)oal_get_real_rssi(hmac_vap->query_stats.signal);
2514 trigger_rssi = (hmac_vap->channel.band == WLAN_BAND_5G) ?
2515 roam_info->trigger.trigger_5g : roam_info->trigger.trigger_2g;
2516
2517 if (hmac_sta_roam_trigger_check(hmac_vap, trigger_rssi, &cur_time, ¤t_rssi) == OSAL_FALSE) {
2518 return;
2519 }
2520
2521 /* 漫游触发需要与正常关联保持时间间隔,WIFI+切换频繁,与漫游冲突。正常关联,并且 IP ADDR 已获取 */
2522 delta_time = (osal_u32)osal_get_runtime(roam_info->trigger.ip_obtain_stamp, cur_time);
2523 if (roam_info->trigger.ip_addr_obtained == OSAL_FALSE || delta_time < ROAM_WPA_CONNECT_INTERVAL_TIME) {
2524 oam_warning_log2(0, OAM_SF_ROAM,
2525 "{hmac_sta_roam_trigger_event_send:: ip_addr_check, ip_addr_obtained = %d, delta_time = %d}",
2526 roam_info->trigger.ip_addr_obtained, delta_time);
2527 return;
2528 }
2529
2530 hmac_roam_trigger_handle_etc(hmac_vap, current_rssi, OAL_FALSE);
2531 oam_warning_log2(0, OAM_SF_ROAM, "vap_id[%d] {hmac_sta_roam_trigger_event_send::D2H roam trigger SUCC, RSSI=%d}",
2532 hmac_vap->vap_id, current_rssi);
2533
2534 roam_info->trigger.time_stamp = (osal_u32)osal_get_time_stamp_ms();
2535 return;
2536 }
2537
hmac_roam_change_app_ie(hmac_vap_stru * hmac_vap,app_ie_type_uint8 * app_ie_type,const osal_u8 * curr_bssid)2538 OAL_STATIC osal_void hmac_roam_change_app_ie(hmac_vap_stru *hmac_vap, app_ie_type_uint8 *app_ie_type,
2539 const osal_u8 *curr_bssid)
2540 {
2541 osal_void *fhook = hmac_get_feature_fhook(HMAC_FHOOK_11R_ROAM_CHANGE_APP_IE);
2542
2543 if (hmac_vap == OSAL_NULL) {
2544 return;
2545 }
2546
2547 if (curr_bssid != OAL_PTR_NULL) {
2548 *app_ie_type = OAL_APP_REASSOC_REQ_IE;
2549 if (fhook != OSAL_NULL) {
2550 ((hmac_11r_roam_change_app_ie_cb)fhook)(hmac_vap, app_ie_type);
2551 }
2552 }
2553 }
2554
hmac_roam_update_user_mac(hmac_vap_stru * hmac_vap,hmac_ctx_join_req_set_reg_stru * reg_params)2555 OAL_STATIC osal_void hmac_roam_update_user_mac(hmac_vap_stru *hmac_vap, hmac_ctx_join_req_set_reg_stru *reg_params)
2556 {
2557 hmac_user_stru *hmac_user;
2558
2559 if (hmac_vap == OSAL_NULL || reg_params == OSAL_NULL) {
2560 return;
2561 }
2562
2563 hmac_user = (hmac_user_stru *)mac_res_get_hmac_user_etc(hmac_vap->assoc_vap_id);
2564 if (hmac_user != OSAL_NULL) {
2565 /* 更新用户mac */
2566 (osal_void)memcpy_s((osal_void *)(hmac_user->user_mac_addr), WLAN_MAC_ADDR_LEN,
2567 (osal_void *)(reg_params->bssid), WLAN_MAC_ADDR_LEN);
2568 hmac_user_del_lut_info(hmac_user->lut_index);
2569 hmac_user_set_lut_info(hmac_vap->hal_device, hmac_user->lut_index, reg_params->bssid);
2570 hmac_user_sync(hmac_user);
2571 }
2572 }
2573
2574 #ifdef _PRE_WLAN_SUPPORT_CCPRIV_CMD
2575 /*****************************************************************************
2576 功能描述 : 设置三个漫游配置项的值:
2577 scenario_enable: 强信号漫游使能开关
2578 c_trigger_rssi_2g: 弱信号2.4G漫游门限
2579 c_trigger_rssi_5g: 弱信号5G漫游门限
2580 *****************************************************************************/
hmac_config_set_roam_config(hmac_vap_stru * hmac_vap,hmac_roam_config_stru * roam_config)2581 OAL_STATIC osal_s32 hmac_config_set_roam_config(hmac_vap_stru *hmac_vap, hmac_roam_config_stru *roam_config)
2582 {
2583 hmac_roam_info_stru *roam_info = OSAL_NULL;
2584
2585 if (hmac_vap == OSAL_NULL) {
2586 return OAL_ERR_CODE_PTR_NULL;
2587 }
2588
2589 roam_info = hmac_get_roam_info(hmac_vap->vap_id);
2590 if (osal_unlikely(roam_info == OSAL_NULL)) {
2591 oam_error_log2(0, OAM_SF_CFG, "vap_id[%d] {hmac_config_set_roam_config::null ptr, roam_info[%p]}",
2592 hmac_vap->vap_id, (uintptr_t)roam_info);
2593 return OAL_ERR_CODE_PTR_NULL;
2594 }
2595
2596 roam_info->config.scenario_enable = roam_config->scenario_enable;
2597 if (roam_config->c_trigger_rssi_2g < 0) {
2598 roam_info->config.c_trigger_rssi_2g = roam_config->c_trigger_rssi_2g;
2599 roam_info->trigger.trigger_2g = roam_config->c_trigger_rssi_2g;
2600 roam_info->trigger.cnt = 0;
2601 }
2602
2603 if (roam_config->c_trigger_rssi_5g < 0) {
2604 roam_info->config.c_trigger_rssi_5g = roam_config->c_trigger_rssi_5g;
2605 roam_info->trigger.trigger_5g = roam_config->c_trigger_rssi_5g;
2606 roam_info->trigger.cnt = 0;
2607 }
2608 oam_warning_log4(0, OAM_SF_CFG,
2609 "vap_id[%d] {hmac_config_set_roam_config::scenario_enable=[%d], trigger_rssi_2G=[%d], trigger_rssi_5G=[%d]}",
2610 hmac_vap->vap_id,
2611 roam_info->config.scenario_enable, roam_info->trigger.trigger_2g, roam_info->trigger.trigger_5g);
2612
2613 return OAL_SUCC;
2614 }
2615
hmac_ccpriv_roam_cfg(hmac_vap_stru * hmac_vap,const osal_s8 * pc_param)2616 OAL_STATIC osal_s32 hmac_ccpriv_roam_cfg(hmac_vap_stru *hmac_vap, const osal_s8 *pc_param)
2617 {
2618 osal_s32 ret;
2619 hmac_roam_config_stru roam_cofig = {0};
2620 osal_s32 value;
2621
2622 /* 获取第1个参数 scenario_enable */
2623 ret = hmac_ccpriv_get_one_arg_digit(&pc_param, &value);
2624 if (ret != OAL_SUCC) {
2625 oam_warning_log1(0, OAM_SF_ANY, "{hmac_ccpriv_roam_cfg:: get scenario_enable return err_code [%d]!}", ret);
2626 return ret;
2627 }
2628 roam_cofig.scenario_enable = (oal_bool_enum_uint8)value;
2629
2630 /* 获取第2个参数 c_trigger_rssi_2g */
2631 ret = hmac_ccpriv_get_one_arg_digit(&pc_param, &value);
2632 if (ret != OAL_SUCC) {
2633 oam_warning_log1(0, OAM_SF_ANY, "{hmac_ccpriv_roam_cfg:: get trigger_rssi_2G return err_code [%d]!}", ret);
2634 return ret;
2635 }
2636 roam_cofig.c_trigger_rssi_2g = (osal_s8)value;
2637
2638 /* 获取第3个参数 c_trigger_rssi_5g */
2639 ret = hmac_ccpriv_get_one_arg_digit(&pc_param, &value);
2640 if (ret != OAL_SUCC) {
2641 oam_warning_log1(0, OAM_SF_ANY, "{hmac_ccpriv_roam_cfg:: get trigger_rssi_5G return err_code [%d]!}", ret);
2642 return ret;
2643 }
2644 roam_cofig.c_trigger_rssi_5g = (osal_s8)value;
2645
2646 hmac_config_set_roam_config(hmac_vap, &roam_cofig);
2647 if (osal_unlikely(ret != OAL_SUCC)) {
2648 oam_warning_log1(0, OAM_SF_CFG, "{hmac_ccpriv_roam_cfg::return err code [%d]!}", ret);
2649 return ret;
2650 }
2651
2652 return OAL_SUCC;
2653 }
2654 #endif
2655
hmac_roam_info_init(hmac_vap_stru * hmac_vap)2656 OAL_STATIC osal_void hmac_roam_info_init(hmac_vap_stru *hmac_vap)
2657 {
2658 osal_u32 i;
2659 hmac_roam_info_stru *roam_info = hmac_get_roam_info(hmac_vap->vap_id);
2660
2661 /* 参数初始化 */
2662 #if defined(CONFIG_MIDDLEWARE_SUPPORT_NV)
2663 osal_u8 nv_roam_enable;
2664 osal_u16 nv_roam_enable_len = 0;
2665 osal_u32 nv_ret;
2666
2667 nv_ret = uapi_nv_read(NV_ID_ROAM_ENABLE, sizeof(nv_roam_enable), &nv_roam_enable_len, &nv_roam_enable);
2668 if (nv_ret == OAL_SUCC) {
2669 roam_info->enable = nv_roam_enable;
2670 wifi_printf("hmac_roam_info_init nv roam_enable[%d]\r\n", nv_roam_enable);
2671 }
2672 #elif defined(_PRE_PLAT_FEATURE_CUSTOMIZE)
2673 wlan_customize_stru *wlan_customize_etc = (wlan_customize_stru *)hwifi_wlan_customize_etc();
2674 roam_info->enable = wlan_customize_etc->roam_switch;
2675 #else
2676 roam_info->enable = 1;
2677 #endif
2678 roam_info->roam_trigger = ROAM_TRIGGER_DMAC;
2679 roam_info->main_state = ROAM_MAIN_STATE_INIT;
2680 roam_info->current_bss_ignore = OAL_FALSE;
2681 roam_info->hmac_vap = hmac_vap;
2682 roam_info->hmac_user = OAL_PTR_NULL;
2683 roam_info->connected_state = WPAS_CONNECT_STATE_INIT;
2684
2685 hmac_roam_init_config(hmac_vap, roam_info);
2686
2687 for (i = 0; i < ROAM_LIST_MAX; i++) {
2688 roam_info->alg.history.bss[i].count_limit = ROAM_HISTORY_COUNT_LIMIT;
2689 roam_info->alg.history.bss[i].timeout = ROAM_HISTORY_BSS_TIME_OUT;
2690 }
2691
2692 for (i = 0; i < ROAM_LIST_MAX; i++) {
2693 roam_info->alg.blacklist.bss[i].count_limit = ROAM_BLACKLIST_COUNT_LIMIT;
2694 roam_info->alg.blacklist.bss[i].timeout = ROAM_BLACKLIST_NORMAL_AP_TIME_OUT;
2695 }
2696 }
2697
2698 /*****************************************************************************
2699 函 数 名 : hmac_roam_init_etc
2700 功能描述 : roam模块控制信息初始化
2701 输入参数 : hmac_vap 需要初始化roam模块的vap,默认参数配置
2702 返 回 值 : OAL_SUCC 或 失败错误码
2703 *****************************************************************************/
hmac_roam_init_etc(osal_void * notify_data)2704 OAL_STATIC osal_bool hmac_roam_init_etc(osal_void *notify_data)
2705 {
2706 hmac_user_stru *hmac_user = (hmac_user_stru *)notify_data;
2707 hmac_vap_stru *hmac_vap;
2708 osal_void *mem_ptr = OSAL_NULL;
2709 osal_u8 vap_id;
2710
2711 if (hmac_user == OSAL_NULL) {
2712 return OSAL_FALSE;
2713 }
2714
2715 hmac_vap = mac_res_get_hmac_vap(hmac_user->vap_id);
2716 if (hmac_vap == OSAL_NULL) {
2717 return OSAL_FALSE;
2718 }
2719
2720 if (!is_legacy_sta(hmac_vap)) {
2721 return OSAL_TRUE;
2722 }
2723
2724 vap_id = hmac_vap->vap_id;
2725 if (g_roam_info[vap_id] != OSAL_NULL) {
2726 oam_warning_log1(0, OAM_SF_ROAM, "vap_id[%d] hmac_roam_init_etc mem already malloc!", vap_id);
2727 return OSAL_TRUE;
2728 }
2729
2730 mem_ptr = oal_mem_alloc(OAL_MEM_POOL_ID_LOCAL, sizeof(hmac_roam_info_stru), OAL_TRUE);
2731 if (mem_ptr == OSAL_NULL) {
2732 oam_error_log1(0, OAM_SF_ROAM, "vap_id[%d] hmac_roam_init_etc malloc null!", vap_id);
2733 return OSAL_FALSE;
2734 }
2735
2736 (osal_void)memset_s(mem_ptr, sizeof(hmac_roam_info_stru), 0, sizeof(hmac_roam_info_stru));
2737 g_roam_info[vap_id] = (hmac_roam_info_stru *)mem_ptr;
2738
2739 frw_util_notifier_notify(WLAN_UTIL_NOTIFIER_EVENT_11V_VAP_ROAM_INFO_INIT, hmac_vap);
2740
2741 hmac_roam_info_init(hmac_vap);
2742
2743 hmac_roam_fsm_init();
2744 hmac_roam_connect_fsm_init_etc();
2745
2746 oam_warning_log1(0, OAM_SF_ROAM,
2747 "vap_id[%d] {hmac_roam_init_etc::SUCC.}", hmac_vap->vap_id);
2748 return OSAL_TRUE;
2749 }
2750
2751 /*****************************************************************************
2752 函 数 名 : hmac_roam_exit_etc
2753 功能描述 : roam模块控制信息卸载
2754 输入参数 : hmac_vap 需要卸载roam模块的vap
2755 返 回 值 : OAL_SUCC 或 失败错误码
2756 *****************************************************************************/
hmac_roam_exit_etc(osal_void * notify_data)2757 OAL_STATIC osal_bool hmac_roam_exit_etc(osal_void *notify_data)
2758 {
2759 hmac_user_stru *hmac_user = (hmac_user_stru *)notify_data;
2760 hmac_vap_stru *hmac_vap;
2761 osal_u8 vap_id;
2762
2763 if (hmac_user == OSAL_NULL) {
2764 return OSAL_FALSE;
2765 }
2766
2767 hmac_vap = mac_res_get_hmac_vap(hmac_user->vap_id);
2768 if (hmac_vap == OSAL_NULL) {
2769 return OSAL_FALSE;
2770 }
2771
2772 if (!is_legacy_vap(hmac_vap)) {
2773 return OSAL_TRUE;
2774 }
2775 vap_id = hmac_vap->vap_id;
2776 if (g_roam_info[vap_id] == OAL_PTR_NULL) {
2777 oam_warning_log1(0, OAM_SF_ROAM, "vap_id[%d] {hmac_roam_exit_etc::pul_roam_info is NULL.}",
2778 hmac_vap->vap_id);
2779 return OSAL_TRUE;
2780 }
2781
2782 hmac_roam_show_etc(hmac_vap);
2783
2784 frw_destroy_timer_entry(&(g_roam_info[vap_id]->connect.timer));
2785 hmac_roam_main_del_timer(g_roam_info[vap_id]);
2786 if (hmac_vap->net_device != OAL_PTR_NULL) {
2787 oal_net_tx_wake_all_queues(hmac_vap->net_device);
2788 }
2789
2790 hmac_roam_connect_fsm_deinit_etc();
2791 hmac_roam_fsm_deinit();
2792
2793 frw_util_notifier_notify(WLAN_UTIL_NOTIFIER_EVENT_11V_VAP_ROAM_INFO_DEINIT, hmac_vap);
2794 oal_mem_free(g_roam_info[vap_id], OAL_TRUE);
2795 g_roam_info[vap_id] = OAL_PTR_NULL;
2796
2797 oam_warning_log1(0, OAM_SF_ROAM, "vap_id[%d] {hmac_roam_exit_etc::SUCC.}",
2798 hmac_vap->vap_id);
2799
2800 return OSAL_TRUE;
2801 }
2802
2803 hmac_netbuf_hook_stru roam_netbuf_hook = {
2804 .hooknum = HMAC_FRAME_MGMT_RX_EVENT_FEATURE,
2805 .priority = HMAC_HOOK_PRI_HIGH,
2806 .hook_func = hmac_sta_roam_rx_mgmt_etc,
2807 };
2808
hmac_roam_sta_init(osal_void)2809 osal_u32 hmac_roam_sta_init(osal_void)
2810 {
2811 osal_u32 ret;
2812
2813 #ifdef _PRE_WLAN_SUPPORT_CCPRIV_CMD
2814 hmac_ccpriv_register((const osal_s8 *)"roam_cfg", hmac_ccpriv_roam_cfg);
2815 #endif
2816
2817 frw_util_notifier_register(WLAN_UTIL_NOTIFIER_EVENT_ADD_USER, hmac_roam_init_etc);
2818 frw_util_notifier_register(WLAN_UTIL_NOTIFIER_EVENT_DEL_USER, hmac_roam_exit_etc);
2819 frw_util_notifier_register(WLAN_UTIL_NOTIFIER_EVENT_RX_ASSOC_RSP, hmac_roam_info_init_etc);
2820
2821 frw_msg_hook_register(WLAN_MSG_W2H_CFG_GET_IP_STATUS, hmac_config_get_ip_status);
2822 frw_msg_hook_register(WLAN_MSG_W2H_CFG_SET_IP_STATE, hmac_roam_set_ip_state);
2823
2824 /* 对外接口注册 */
2825 hmac_feature_hook_register(HMAC_FHOOK_ROAM_START, hmac_roam_start_etc);
2826 hmac_feature_hook_register(HMAC_FHOOK_ROAM_GET_INFO, hmac_get_roam_info);
2827 hmac_feature_hook_register(HMAC_FHOOK_ROAM_PROC_CONNECT_CMD, hmac_roam_proc_connect_cmd);
2828 hmac_feature_hook_register(HMAC_FHOOK_ROAM_CHECK_BKSCAN, hmac_roam_check_bkscan_result_etc);
2829 hmac_feature_hook_register(HMAC_FHOOK_ROAM_ADD_KEY_DONE, hmac_roam_add_key_done_etc);
2830 hmac_feature_hook_register(HMAC_FHOOK_ROAM_UPDATE_PMF, hmac_sta_roam_update_pmf_etc);
2831 hmac_feature_hook_register(HMAC_FHOOK_ROAM_TRIGGER_SEND, hmac_sta_roam_trigger_event_send);
2832 hmac_feature_hook_register(HMAC_FHOOK_ROAM_CHANGE_APP_IE, hmac_roam_change_app_ie);
2833 hmac_feature_hook_register(HMAC_FHOOK_ROAM_UPDATE_USER_MAC, hmac_roam_update_user_mac);
2834 hmac_feature_hook_register(HMAC_FHOOK_ROAM_SET_LINKLOSS_DONE, hmac_roam_set_linkloss_done);
2835
2836 ret = hmac_register_netbuf_hook(&roam_netbuf_hook);
2837 if (ret != OAL_SUCC) {
2838 oam_error_log0(0, OAM_SF_RX, "{hmac_roam_sta_init:: MGMT RX IN register_netbuf_hooks error!");
2839 return ret;
2840 }
2841
2842 return OAL_SUCC;
2843 }
2844
hmac_roam_sta_deinit(osal_void)2845 osal_void hmac_roam_sta_deinit(osal_void)
2846 {
2847 #ifdef _PRE_WLAN_SUPPORT_CCPRIV_CMD
2848 hmac_ccpriv_unregister((const osal_s8 *)"roam_cfg");
2849 #endif
2850
2851 frw_util_notifier_unregister(WLAN_UTIL_NOTIFIER_EVENT_ADD_USER, hmac_roam_init_etc);
2852 frw_util_notifier_unregister(WLAN_UTIL_NOTIFIER_EVENT_DEL_USER, hmac_roam_exit_etc);
2853 frw_util_notifier_unregister(WLAN_UTIL_NOTIFIER_EVENT_RX_ASSOC_RSP, hmac_roam_info_init_etc);
2854
2855 frw_msg_hook_unregister(WLAN_MSG_W2H_CFG_GET_IP_STATUS);
2856 frw_msg_hook_unregister(WLAN_MSG_W2H_CFG_SET_IP_STATE);
2857
2858 /* 对外接口去注册 */
2859 hmac_feature_hook_unregister(HMAC_FHOOK_ROAM_START);
2860 hmac_feature_hook_unregister(HMAC_FHOOK_ROAM_GET_INFO);
2861 hmac_feature_hook_unregister(HMAC_FHOOK_ROAM_PROC_CONNECT_CMD);
2862 hmac_feature_hook_unregister(HMAC_FHOOK_ROAM_CHECK_BKSCAN);
2863 hmac_feature_hook_unregister(HMAC_FHOOK_ROAM_ADD_KEY_DONE);
2864 hmac_feature_hook_unregister(HMAC_FHOOK_ROAM_UPDATE_PMF);
2865 hmac_feature_hook_unregister(HMAC_FHOOK_ROAM_TRIGGER_SEND);
2866 hmac_feature_hook_unregister(HMAC_FHOOK_ROAM_CHANGE_APP_IE);
2867 hmac_feature_hook_unregister(HMAC_FHOOK_ROAM_UPDATE_USER_MAC);
2868 hmac_feature_hook_unregister(HMAC_FHOOK_ROAM_SET_LINKLOSS_DONE);
2869
2870 hmac_unregister_netbuf_hook(&roam_netbuf_hook);
2871
2872 return;
2873 }
2874
2875 #ifdef __cplusplus
2876 #if __cplusplus
2877 }
2878 #endif
2879 #endif
2880