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_vap.h
15 * 生成日期 : 2012年10月19日
16 * 功能描述 : hmac_vap.c 的头文件
17 */
18
19
20 #ifndef __HMAC_VAP_H__
21 #define __HMAC_VAP_H__
22
23 /*****************************************************************************
24 1 其他头文件包含
25 *****************************************************************************/
26 #include "hmac_user.h"
27 #include "hmac_main.h"
28 #include "mac_resource_ext.h"
29 #ifdef _PRE_WLAN_TCP_OPT
30 #include "hmac_tcp_opt_struc.h"
31 #include "hcc_host_if.h"
32 #endif
33 #include "msg_vap_manage_rom.h"
34
35 #ifdef __cplusplus
36 #if __cplusplus
37 extern "C" {
38 #endif
39 #endif
40
41 #undef THIS_FILE_ID
42 #define THIS_FILE_ID OAM_FILE_ID_HMAC_VAP_H
43
44 /*****************************************************************************
45 2 宏定义
46 *****************************************************************************/
47 #ifdef _PRE_WLAN_FEATURE_HS20
48 #define MAX_QOS_UP_RANGE 8
49 #define MAX_DSCP_EXCEPT 21 /* maximum of DSCP Exception fields for QoS Map set */
50 #endif
51
52 #define HMAC_DSCP_VALUE_INVALID 0xA5
53
54 /*****************************************************************************
55 4 全局变量声明
56 *****************************************************************************/
57
58 /*****************************************************************************
59 5 消息头定义
60 *****************************************************************************/
61
62
63 /*****************************************************************************
64 6 消息定义
65 *****************************************************************************/
66
67
68 /*****************************************************************************
69 7 STRUCT定义
70 *****************************************************************************/
71 typedef struct {
72 hmac_vap_stru *hmac_vap;
73 mac_vap_state_enum_uint8 old_state;
74 mac_vap_state_enum_uint8 new_state;
75 osal_u8 resv[2]; /* 保留2个字节对齐 */
76 } hmac_vap_state_change_notify_stru;
77
78 typedef struct {
79 struct osal_list_head timeout_head;
80 } hmac_mgmt_timeout_stru;
81
82 typedef struct {
83 struct osal_list_head entry;
84 osal_u8 bssid[WLAN_MAC_ADDR_LEN];
85 osal_u8 reserved[2];
86 osal_u8 pmkid[WLAN_PMKID_LEN];
87 } hmac_pmksa_cache_stru;
88
89 typedef enum _hmac_cac_event_ {
90 HMAC_CAC_STARTED = 0,
91 HMAC_CAC_FINISHED,
92 HMAC_CAC_ABORTED,
93
94 HMAC_CAC_BUTT
95 } hmac_cac_event;
96
97 typedef struct {
98 hmac_cac_event type;
99 osal_u32 freq;
100 wlan_channel_bandwidth_enum_uint8 bw_mode;
101 osal_u8 auc[23];
102 } hmac_cac_event_stru;
103
104 /*****************************************************************************
105 8 UNION定义
106 *****************************************************************************/
107
108
109 /*****************************************************************************
110 9 OTHERS定义
111 *****************************************************************************/
112
113 /*****************************************************************************
114 10 函数声明
115 *****************************************************************************/
116 osal_void hmac_set_host_rx_ampdu_amsdu(osal_u8 val);
117 osal_u8 hmac_get_host_rx_ampdu_amsdu(osal_void);
118 extern osal_s32 hmac_vap_destroy_etc(hmac_vap_stru *hmac_vap, frw_msg *msg);
119 extern osal_u32 hmac_vap_init_etc(
120 hmac_vap_stru *hmac_vap,
121 osal_u8 chip_id,
122 osal_u8 device_id,
123 osal_u8 vap_id,
124 hmac_cfg_add_vap_param_stru *param);
125
126 extern osal_u32 hmac_vap_creat_netdev_etc(hmac_vap_stru *hmac_vap, osal_s8 *netdev_name, osal_u8 name_len,
127 osal_s8 *mac_addr);
128
129
130 osal_u16 hmac_vap_check_ht_capabilities_ap_etc(hmac_vap_stru *hmac_vap, osal_u8 *payload, osal_u32 msg_len,
131 hmac_user_stru *hmac_user, osal_bool is_tkip);
132 extern osal_u32 hmac_search_ht_cap_ie_ap_etc(
133 hmac_vap_stru *hmac_vap,
134 hmac_user_stru *hmac_user,
135 osal_u8 *payload,
136 osal_u16 offset,
137 oal_bool_enum prev_asoc_ht);
138 extern oal_bool_enum_uint8 hmac_vap_addba_check(
139 hmac_vap_stru *hmac_vap,
140 hmac_user_stru *hmac_user,
141 osal_u8 tidno);
142
143 extern osal_void hmac_handle_disconnect_rsp_etc(hmac_vap_stru *hmac_vap, hmac_user_stru *hmac_user,
144 mac_reason_code_enum_uint16 disasoc_reason);
145 extern osal_u8 *hmac_vap_get_pmksa_etc(hmac_vap_stru *hmac_vap, osal_u8 *bssid);
146 osal_u32 hmac_tx_get_mac_vap_etc(osal_u8 vap_id, hmac_vap_stru **hmac_vap);
147 hmac_vap_stru *hmac_get_vap(osal_u32 idx);
148 osal_void mac_vap_intrrupt_enable(osal_void);
149 osal_void mac_vap_intrrupt_disable(osal_void);
150 wlan_protocol_mode_enum_uint8 hmac_get_protocol_mode_by_wlan_protocol(wlan_protocol_enum_uint8 protocol);
151 osal_bool hmac_vap_need_update_protocol(const hmac_vap_stru *hmac_vap, wlan_protocol_enum_uint8 new_wlan_protocol);
152 extern osal_u8 hmac_vap_is_connecting(hmac_vap_stru *mac_vap);
153
154 // from dmac_vap_rom.h
155 /*****************************************************************************
156 2 宏定义
157 *****************************************************************************/
158 #define HMAC_MAX_SW_RETRIES 10 /* 数据报文重传次数 */
159 #define HMAC_MGMT_MAX_SW_RETRIES 3 /* 管理报文重传次数 */
160 #define HMAC_MAX_AMPDU_LENGTH_PERFOMANCE_COUNT 32 /* 进行计数的最大的聚合长度 */
161
162 #define HMAC_BW_VERIFY_MAX_THRESHOLD 60
163
164 #define HMAC_DEF_BCN_TIMEOUT 30 /* STA接收bcn超时时间单位ms */
165 #define HMAC_DEF_BCN_TIMEOUT_MIN 10 /* STA接收bcn超时最小时间单位ms */
166 #define HMAC_DEF_BCN_TIMEOUT_MAX 100 /* STA接收bcn超时最大时间单位ms */
167 #define HMAC_DEF_AP_TBTT_OFFSET 15000 /* AP的tbtt提前量单位us */
168 #define HMAC_DEF_BCN_TOUT_MAX_CNT 5 /* STA接收bcn超时时间最大次数,超过次数后暂停休眠 */
169
170 #define HMAC_MAX_TX_SUCCESSIVE_FAIL_PRINT_THRESHOLD_BTCOEX 40 /* 连续发送失败的打印RF寄存器门限 */
171 #define HMAC_MAX_TX_SUCCESSIVE_FAIL_PRINT_THRESHOLD 20 /* 连续发送失败的打印RF寄存器门限 */
172
173 /*****************************************************************************
174 3 枚举定义
175 *****************************************************************************/
176 typedef enum {
177 HMAC_STA_BW_SWITCH_EVENT_CHAN_SYNC = 0,
178 HMAC_STA_BW_SWITCH_EVENT_BEACON_20M,
179 HMAC_STA_BW_SWITCH_EVENT_BEACON_40M,
180 HMAC_STA_BW_SWITCH_EVENT_RX_UCAST_DATA_COMPLETE,
181 HMAC_STA_BW_SWITCH_EVENT_USER_DEL,
182 HMAC_STA_BW_SWITCH_EVENT_RSV,
183 HMAC_STA_BW_SWITCH_EVENT_BUTT
184 } wlan_sta_bw_switch_event_enum;
185 typedef osal_u8 wlan_sta_bw_switch_event_enum_uint8;
186
187 /* 统计的AMPDU的门限值枚举值 */
188 typedef enum {
189 HMAC_AMPDU_LENGTH_COUNT_LEVEL_1 = 1,
190 HMAC_AMPDU_LENGTH_COUNT_LEVEL_14 = 14,
191 HMAC_AMPDU_LENGTH_COUNT_LEVEL_15 = 15,
192 HMAC_AMPDU_LENGTH_COUNT_LEVEL_17 = 17,
193 HMAC_AMPDU_LENGTH_COUNT_LEVEL_18 = 18,
194 HMAC_AMPDU_LENGTH_COUNT_LEVEL_30 = 30,
195 HMAC_AMPDU_LENGTH_COUNT_LEVEL_31 = 31,
196 HMAC_AMPDU_LENGTH_COUNT_LEVEL_32 = 32
197 } hmac_count_by_ampdu_length_level_enum;
198
199 typedef enum {
200 HMAC_DBDC_START,
201 HMAC_DBDC_STOP,
202 HMAC_DBDC_STATE_BUTT
203 } hmac_dbdc_state_enum;
204 typedef osal_u8 hmac_dbdc_state_enum_uint8;
205
206 typedef enum {
207 HMAC_STA_BW_SWITCH_FSM_INIT = 0,
208 HMAC_STA_BW_SWITCH_FSM_NORMAL,
209 HMAC_STA_BW_SWITCH_FSM_VERIFY20M, // 20m校验
210 HMAC_STA_BW_SWITCH_FSM_VERIFY40M, // 40m校验
211 HMAC_STA_BW_SWITCH_FSM_INVALID,
212 HMAC_STA_BW_SWITCH_FSM_BUTT
213 } hmac_sta_bw_switch_fsm_enum;
214
215 typedef enum {
216 HMAC_STA_BW_VERIFY_20M_TO_40M = 0,
217 HMAC_STA_BW_VERIFY_40M_TO_20M,
218 HMAC_STA_BW_VERIFY_SWITCH_BUTT
219 } hmac_sta_bw_switch_type_enum;
220 typedef osal_u8 hmac_sta_bw_switch_type_enum_enum_uint8;
221
222 /* device多vap状态切换 */
223 typedef enum {
224 HMAC_VAP_MVAP_STATE_SINGLE = 0, /* device单vap工作 */
225 HMAC_VAP_MVAP_STATE_DBAC, /* dbac状态 */
226 HMAC_VAP_MVAP_STATE_DBDC, /* dbdc状态 */
227 HMAC_VAP_MVAP_STATE_DCHN, /* 同信道 */
228
229 HMAC_VAP_MVAP_STATE_BUTT
230 } hmac_vap_mvap_state_enum;
231
232 typedef enum {
233 HMAC_VAP_MVAP_STATE_TRANS_NONE = 0, /* 单vap切信道 */
234
235 HMAC_VAP_MVAP_STATE_TRANS_DBAC_TO_DBDC, /* dbdc状态到dbac状态切换 */
236 HMAC_VAP_MVAP_STATE_TRANS_DBAC_TO_DCHN, /* 切换信道后退出dbac状态到同信道状态 */
237 HMAC_VAP_MVAP_STATE_TRANS_DBAC_TO_DBAC, /* 切换信道后仍然停留在dbac状态 */
238
239 HMAC_VAP_MVAP_STATE_TRANS_DBDC_TO_DBDC, /* dbdc状态不变 */
240 HMAC_VAP_MVAP_STATE_TRANS_DBDC_TO_DBAC, /* dbdc到dbac状态切换 */
241
242 HMAC_VAP_MVAP_STATE_TRANS_DCHN_TO_DCHN, /* 同频同信道状态不变 */
243 HMAC_VAP_MVAP_STATE_TRANS_DCHN_TO_DBAC, /* 同频同信道到dbac */
244
245 HMAC_VAP_MVAP_STATE_TRANS_BUTT
246 } hmac_vap_mvap_state_trans_enum;
247
248 /*****************************************************************************
249 7 STRUCT定义
250 *****************************************************************************/
251 /* vap tx参数,从架构分析文档获得成员 */
252 typedef struct {
253 osal_u16 rts_threshold; /* rts阈值 */
254 osal_u8 mcast_rate; /* 广播速率 */
255 osal_u8 auc_resv[1]; /* 字节对齐 */
256 } hmac_vap_tx_param_stru;
257
258
259 typedef osal_u8 hmac_linkloss_status_enum_uint8;
260
261
262 typedef struct {
263 oal_fsm_stru oal_fsm; /* 状态机 */
264 oal_bool_enum_uint8 is_fsm_attached; /* 状态机是否已经注册 */
265 osal_u8 verify_fail_cnt_20m;
266 osal_u8 verify_fail_cnt_40m;
267 osal_u8 rsv[1];
268 } hmac_sta_bw_switch_fsm_info_stru;
269
270
271 typedef enum {
272 HMAC_BEACON_TX_POLICY_SINGLE = 0,
273 HMAC_BEACON_TX_POLICY_SWITCH = 1,
274 HMAC_BEACON_TX_POLICY_DOUBLE = 2,
275 } hmac_beacon_tx_policy_enum_uint8;
276
277 /*****************************************************************************
278 9 OTHERS定义
279 *****************************************************************************/
280
281 #ifdef _PRE_WLAN_FEATURE_PMF
is_open_pmf_reg(const hmac_vap_stru * hmac_vap)282 static INLINE__ osal_u8 is_open_pmf_reg(const hmac_vap_stru *hmac_vap)
283 {
284 return (hmac_vap->user_pmf_status != 0);
285 }
286 #endif
287
get_current_linkloss_threshold(const hmac_vap_stru * hmac_vap)288 static INLINE__ osal_u16 get_current_linkloss_threshold(const hmac_vap_stru *hmac_vap)
289 {
290 return hmac_vap->linkloss_info.linkloss_info[hmac_vap->linkloss_info.linkloss_mode].linkloss_threshold;
291 }
292
get_current_linkloss_cnt(const hmac_vap_stru * hmac_vap)293 static INLINE__ osal_u16 get_current_linkloss_cnt(const hmac_vap_stru *hmac_vap)
294 {
295 return hmac_vap->linkloss_info.linkloss_info[hmac_vap->linkloss_info.linkloss_mode].link_loss;
296 }
297
get_current_linkloss_int_threshold(const hmac_vap_stru * hmac_vap)298 static INLINE__ osal_u16 get_current_linkloss_int_threshold(const hmac_vap_stru *hmac_vap)
299 {
300 return hmac_vap->linkloss_info.linkloss_info[hmac_vap->linkloss_info.linkloss_mode].int_linkloss_threshold;
301 }
302
hmac_is_linkloss(const hmac_vap_stru * hmac_vap)303 static INLINE__ osal_u8 hmac_is_linkloss(const hmac_vap_stru *hmac_vap)
304 {
305 return (get_current_linkloss_cnt(hmac_vap) > get_current_linkloss_threshold(hmac_vap));
306 }
307
hmac_is_hml(const hmac_vap_stru * hmac_vap)308 static INLINE__ osal_bool hmac_is_hml(const hmac_vap_stru *hmac_vap)
309 {
310 return (hmac_vap->hml == 1) ? OSAL_TRUE : OSAL_FALSE;
311 }
312
313 /*****************************************************************************
314 函 数 名 : hmac_vap_get_bss_type
315 功能描述 : 获取VAP类型,指针是否为空,调用者判断
316 *****************************************************************************/
hmac_vap_get_bss_type(const hmac_vap_stru * hmac_vap)317 static INLINE__ wlan_vap_mode_enum_uint8 hmac_vap_get_bss_type(const hmac_vap_stru *hmac_vap)
318 {
319 return hmac_vap->vap_mode;
320 }
321
322 /*****************************************************************************
323 函 数 名 : hmac_user_get_hal_device
324 功能描述 : 根据mac_user获取对应的hal_device指针
325 *****************************************************************************/
hmac_user_get_hal_device(const hmac_user_stru * hmac_user)326 static INLINE__ hal_to_dmac_device_stru *hmac_user_get_hal_device(const hmac_user_stru *hmac_user)
327 {
328 hmac_vap_stru *hmac_vap;
329
330 hmac_vap = (hmac_vap_stru *)mac_res_get_hmac_vap(hmac_user->vap_id);
331 if (hmac_vap == OSAL_NULL) {
332 return OSAL_NULL;
333 }
334
335 return hmac_vap->hal_device;
336 }
337
338 /*****************************************************************************
339 函 数 名 : hmac_user_get_hal_chip
340 功能描述 : 根据mac_user获取对应的hal_chip指针
341 *****************************************************************************/
hmac_user_get_hal_chip(const hmac_user_stru * hmac_user)342 static INLINE__ hal_to_dmac_chip_stru *hmac_user_get_hal_chip(const hmac_user_stru *hmac_user)
343 {
344 hmac_vap_stru *hmac_vap;
345
346 hmac_vap = (hmac_vap_stru *)mac_res_get_hmac_vap(hmac_user->vap_id);
347 if (hmac_vap == OSAL_NULL) {
348 return OSAL_NULL;
349 }
350
351 return hmac_vap->hal_chip;
352 }
353
354 osal_u8 hmac_sta_bw_fsm_get_current_state(const hmac_vap_stru *hmac_vap);
355
mac_vap_get_curren_bw_state(const hmac_vap_stru * hmac_vap)356 static INLINE__ osal_u8 mac_vap_get_curren_bw_state(const hmac_vap_stru *hmac_vap)
357 {
358 return hmac_sta_bw_fsm_get_current_state(hmac_vap);
359 }
360
mac_vap_bw_fsm_beacon_avail(const hmac_vap_stru * hmac_vap)361 static INLINE__ osal_u8 mac_vap_bw_fsm_beacon_avail(const hmac_vap_stru *hmac_vap)
362 {
363 return ((!is_legacy_sta(hmac_vap)) ||
364 (is_legacy_sta(hmac_vap) && (mac_vap_get_curren_bw_state(hmac_vap) > HMAC_STA_BW_SWITCH_FSM_INIT) &&
365 (mac_vap_get_curren_bw_state(hmac_vap) < HMAC_STA_BW_SWITCH_FSM_INVALID)));
366 }
367
mac_vap_bw_fsm_verify(const hmac_vap_stru * hmac_vap)368 static INLINE__ osal_u8 mac_vap_bw_fsm_verify(const hmac_vap_stru *hmac_vap)
369 {
370 return ((mac_vap_get_curren_bw_state(hmac_vap) == HMAC_STA_BW_SWITCH_FSM_VERIFY20M) ||
371 (mac_vap_get_curren_bw_state(hmac_vap) == HMAC_STA_BW_SWITCH_FSM_VERIFY40M));
372 }
373
374 /*****************************************************************************
375 10 函数声明
376 *****************************************************************************/
377 osal_s8 *hmac_config_index2string_etc(osal_u32 index, osal_s8 *string[], osal_u32 max_str_nums);
378 osal_void hmac_sta_bw_switch_fsm_attach(hmac_vap_stru *hmac_vap);
379 osal_void hmac_sta_bw_switch_fsm_detach(hmac_vap_stru *hmac_vap);
380 osal_void hmac_sta_bw_switch_fsm_init(const hmac_vap_stru * const hmac_vap);
381 osal_u8 hmac_sta_bw_switch_need_new_verify(const hmac_vap_stru *hmac_vap, wlan_bw_cap_enum_uint8 bw_becaon_new);
382 osal_u32 hmac_sta_bw_switch_fsm_post_event(const hmac_vap_stru *hmac_vap, osal_u16 type, osal_u16 datalen,
383 osal_u8 *data);
384 osal_u32 hmac_vap_init(hmac_vap_stru *hmac_vap, osal_u8 vap_id, const mac_cfg_add_vap_param_stru *param);
385 osal_u32 hmac_vap_init_tx_frame_params(hmac_vap_stru *hmac_vap, oal_bool_enum_uint8 mgmt_rate_init_flag);
386 osal_void hmac_vap_init_tx_mgmt_rate(const hmac_vap_stru *hmac_vap, hal_tx_txop_alg_stru *tx_mgmt_cast);
387 osal_u32 hmac_vap_sta_reset(hmac_vap_stru *hmac_vap);
388 osal_void mac_vap_pause_tx(hmac_vap_stru *hmac_vap);
389 osal_void hmac_vap_pause_tx(hmac_vap_stru *hmac_vap);
390
391 osal_void hmac_vap_resume_tx_by_chl(hmac_device_stru *hmac_device, hal_to_dmac_device_stru *hal_device,
392 mac_channel_stru *dst_channel);
393 osal_u32 hmac_vap_is_in_p2p_listen(osal_void);
394 #ifdef _PRE_WLAN_FEATURE_DBAC
395 osal_void hmac_vap_restart_dbac(hmac_vap_stru *hmac_vap);
396 #endif
397 osal_void hmac_vap_down_notify(hmac_vap_stru *down_vap);
398 osal_u8 hmac_vap_fake_queue_empty_assert(hmac_vap_stru *hmac_vap, osal_u32 file_id);
399 osal_void hmac_vap_clear_fake_queue(hmac_vap_stru *hmac_vap);
400 osal_u32 hmac_vap_get_fake_queue_pkt_nums(osal_void);
401 osal_void hmac_vap_send_fake_queue(hmac_vap_stru *hmac_vap);
402 osal_void hmac_vap_send_all_fake_queue(osal_void);
403 osal_void hmac_vap_update_snr_info(hmac_vap_stru *hmac_vap, const dmac_rx_ctl_stru *const rx_ctrl);
404 osal_void hmac_vap_work_set_channel(hmac_vap_stru *hmac_vap);
405
406 osal_void hmac_vap_flush_rate(hmac_vap_stru *hmac_vap, const hmac_set_rate_stru *const rate);
407 osal_u32 hmac_vap_init_rate_info(hmac_set_rate_stru *surr_rate);
408 osal_u32 hmac_config_start_vap_event_etc(hmac_vap_stru *hmac_vap, oal_bool_enum_uint8 mgmt_rate_init_flag);
409 osal_u32 hmac_get_chip_vap_num(mac_chip_stru *pst_chip);
410 osal_u32 hmac_config_add_vap_feature(hmac_vap_stru *hmac_vap);
411 osal_void hmac_config_del_vap_feature(hmac_vap_stru *hmac_vap);
412 osal_s32 hmac_config_del_vap_success(hmac_vap_stru *hmac_vap, frw_msg *msg);
413 osal_s32 hmac_config_start_vap(hmac_vap_stru *hmac_vap, oal_bool_enum_uint8 mgmt_rate_init_flag);
414 osal_s32 hmac_config_add_vap(hmac_vap_stru *vap_new, frw_msg *msg);
415 osal_s32 hmac_config_del_vap(hmac_vap_stru *hmac_vap, frw_msg *msg);
416 osal_s32 hmac_config_down_vap(hmac_vap_stru *hmac_vap, frw_msg *msg);
417 osal_s32 hmac_vap_sync(hmac_vap_stru *hmac_vap);
418 osal_void hmac_vap_refresh_tx_bitmap(osal_void);
419 oal_bool_enum_uint8 hmac_vap_is_pause_tx_bitmap(hmac_vap_stru *hmac_vap);
420 hmac_vap_stru *hmac_get_valid_vap(osal_u32 idx);
421 osal_void hmac_vap_net_start_subqueue_etc(hcc_queue_type queue_idx);
422 osal_void hmac_vap_net_stop_subqueue_etc(hcc_queue_type queue_idx);
423 #ifdef __cplusplus
424 #if __cplusplus
425 }
426 #endif
427 #endif
428
429 #endif /* end of hmac_vap.h */
430