• 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_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