• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2020 HiSilicon (Shanghai) Technologies CO., LIMITED.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  * 文 件 名   : hmac_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, &current_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