• 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  * Description: Header file of the DMAC external public interface.
15  * Create: 2020-7-9
16  */
17 
18 #ifndef __DMAC_EXT_IF_HCM_H__
19 #define __DMAC_EXT_IF_HCM_H__
20 
21 /*****************************************************************************
22   1 其他头文件包含
23 *****************************************************************************/
24 #include "oal_types.h"
25 #include "oal_ext_if.h"
26 #include "oam_ext_if.h"
27 #include "oal_mm.h"
28 #include "oal_netbuf_ext.h"
29 #include "frw_ext_if.h"
30 #include "wlan_types_common.h"
31 #include "mac_frame.h"
32 #include "mac_device_ext.h"
33 #include "mac_user_ext.h"
34 #include "mac_vap_ext.h"
35 #include "mac_data.h"
36 #include "dmac_ext_if_type.h"
37 #include "dmac_ext_if_device.h"
38 
39 #ifdef __cplusplus
40 #if __cplusplus
41 extern "C" {
42 #endif
43 #endif
44 
45 /*****************************************************************************
46   2 宏定义
47 *****************************************************************************/
48 #define MAC_INVALID_RX_BA_LUT_INDEX           HAL_MAX_RX_BA_LUT_SIZE
49 
50 /* 安全加密 :  bss_info 中记录AP 能力标识, WPA or WPA2 */
51 #define HMAC_WPA_802_11I    BIT0
52 #define HMAC_RSNA_802_11I   BIT1
53 
54 #ifdef _PRE_PLAT_FEATURE_CUSTOMIZE
55 /* 抛往dmac侧消息头的长度 */
56 #define CUSTOM_MSG_DATA_HDR_LEN      (sizeof(custom_cfgid_enum_uint32) + sizeof(osal_u32))
57 #endif /* _PRE_PLAT_FEATURE_CUSTOMIZE */
58 
59 /* DMAC CB中用于不同算法对帧进行标记 */
60 #define HMAC_CB_ALG_TAGS_MUCTRL_MASK        0x1         /* CB中用于多用户流控算法对帧进行标记 */
61 #define HMAC_CB_ALG_TAGS_TIDSCH_MASK        0x2         /* CB中用于调度算法对队列调度的帧标记 */
62 
63 #define HMAC_BA_SEQNO_MASK                  0x0FFF      /* max sequece number */
64 #define HMAC_BA_MAX_SEQNO_BY_TWO            2048
65 #define HMAC_BA_RX_ALLOW_MIN_SEQNO_BY_TWO   64
66 #define HMAC_BA_RX_ALLOW_MAX_SEQNO_BY_TWO   4032
67 
68 #define HMAC_BA_GREATER_THAN_SEQHI          1
69 #define HMAC_BA_BETWEEN_SEQLO_SEQHI         2
70 #define HMAC_BA_AMSDU_BACK_SUPPORTED_FLAG   1           /* BA会话对AMSDU的支持标识 */
71 
72 #define HMAC_BA_DELBA_TIMEOUT               0
73 #define HMAC_BATX_WIN_STALL_THRESHOLD       6
74 
75 #define MAC_TX_CTL_SIZE                     OAL_NETBUF_CB_SIZE()
76 
77 /* DMAC TID中TCP ACK比例 */
78 #define HMAC_TID_TCK_ACK_PROPORTION_MAX     32
79 #define HMAC_TID_TCK_ACK_PROPORTION_MIN     1
80 #define HMAC_TID_TCK_ACK_PROPORTION_THRES   28
81 
82 #define hmac_ba_seq_add(_seq1, _seq2)       ((osal_u32)((_seq1) + (_seq2)) & HMAC_BA_SEQNO_MASK)
83 #define hmac_ba_seq_sub(_seq1, _seq2)       ((osal_u32)((_seq1) - (_seq2)) & HMAC_BA_SEQNO_MASK)
84 
85 #define HMAC_BA_BMP_SIZE                    64
86 
87 #define HMAC_INVALID_SIGNAL_DELTA      (30)
88 #define HMAC_RSSI_SIGNAL_MIN           (-103)    /* 信号强度极小值 */
89 #define HMAC_RSSI_SIGNAL_MAX           (5)       /* 信号强度极大值 */
90 #define HMAC_INVALID_SIGNAL_INITIAL    (100)     /* 非法初始信号极大值 */
91 
92 /* 发送BA窗口记录seq number的最大个数,必须是2的整数次幂 */
93 #define HMAC_TID_MAX_BUFS       128
94 /* 发送BA窗口记录seq number的bitmap所使用的类型长度 */
95 #define DMAC_TX_BUF_BITMAP_WORD_SIZE        32
96 /* 发送BA窗口记录seq number的bit map的长度 */
97 #define HMAC_TX_BUF_BITMAP_WORDS \
98     ((HMAC_TID_MAX_BUFS + DMAC_TX_BUF_BITMAP_WORD_SIZE - 1) / DMAC_TX_BUF_BITMAP_WORD_SIZE)
99 
100 #define HMAC_TX_MAX_RISF_NUM    6
101 #define DMAX_TX_QUEUE_SINGLE_DEPTH   2
102 #define HMAC_TX_QEUEU_MAX_PPDU_NUM   2
103 #define HMAC_TX_QUEUE_FAIL_CHECK_NUM    1000
104 
105 #define HMAC_SCAN_MAX_AP_NUM_TO_GNSS            32
106 #define GNSS_DMAC_SCAN_RESULTS_VALID_MS         5000
107 #define HMAC_TX_ONE_MPDU_AMSDU_NUM_MAX 4
108 
109 #define THRUPUT_BYPASS_LEN  1300    /* WIFI侧hw bypass发送长度:仅bypass iperf跑流长包 */
110 
111 /* 不区分offload架构的CB字段 */
112 #define mac_get_cb_is_4address(_pst_tx_ctrl)             ((_pst_tx_ctrl)->use_4_addr)
113 #define mac_get_cb_is_amsdu(_pst_tx_ctrl)                ((_pst_tx_ctrl)->is_amsdu)
114 #define mac_get_cb_is_large_skb_amsdu(_pst_tx_ctrl)      ((_pst_tx_ctrl)->is_large_skb_amsdu)
115 #define mac_get_cb_has_ether_head(_pst_tx_ctrl)          ((_pst_tx_ctrl)->ether_head_including)
116 #define mac_get_cb_is_first_msdu(_pst_tx_ctrl)           ((_pst_tx_ctrl)->is_first_msdu)
117 #define mac_get_cb_is_need_resp(_pst_tx_ctrl)            ((_pst_tx_ctrl)->need_rsp)
118 #define mac_get_cb_is_eapol_key_ptk(_pst_tx_ctrl)        ((_pst_tx_ctrl)->is_eapol_key_ptk)
119 #define mac_get_cb_is_roam_data(_pst_tx_ctrl)            ((_pst_tx_ctrl)->roam_data)
120 #define mac_get_cb_is_from_ps_queue(_pst_tx_ctrl)        ((_pst_tx_ctrl)->is_get_from_ps_queue)
121 #define mac_get_cb_is_mcast(_pst_tx_ctrl)                ((_pst_tx_ctrl)->ismcast)
122 #define mac_get_cb_is_needretry(_pst_tx_ctrl)            ((_pst_tx_ctrl)->is_needretry)
123 #define mac_get_cb_get_probe_data_type(_pst_tx_ctrl)     ((_pst_tx_ctrl)->probe_data_type)
124 #define mac_get_cb_alg_tags(_pst_tx_ctrl)                ((_pst_tx_ctrl)->alg_frame_tag)
125 
126 #define mac_get_cb_mgmt_frame_id(_pst_tx_ctrl)           ((_pst_tx_ctrl)->mgmt_frame_id)
127 #define mac_get_cb_mpdu_len(_pst_tx_ctrl)                ((_pst_tx_ctrl)->mpdu_payload_len)
128 #define mac_get_cb_frame_type(_pst_tx_ctrl)              ((_pst_tx_ctrl)->frame_type)
129 #define mac_get_cb_frame_subtype(_pst_tx_ctrl)           ((_pst_tx_ctrl)->frame_subtype)
130 
131 /* VIP数据帧 */
132 #define mac_get_cb_is_vipframe(_pst_tx_ctrl) \
133     ((WLAN_CB_FRAME_TYPE_DATA == mac_get_cb_frame_type(_pst_tx_ctrl)) && \
134     (MAC_DATA_VIP_FRAME >= mac_get_cb_frame_subtype(_pst_tx_ctrl)))
135 
136 #define mac_get_cb_is_smps_frame(_pst_tx_ctrl) \
137     ((WLAN_CB_FRAME_TYPE_ACTION == mac_get_cb_frame_type(_pst_tx_ctrl)) && \
138     (WLAN_ACTION_SMPS_FRAME_SUBTYPE == mac_get_cb_frame_subtype(_pst_tx_ctrl)))
139 #define mac_get_cb_is_opmode_frame(_pst_tx_ctrl) \
140     ((WLAN_CB_FRAME_TYPE_ACTION == mac_get_cb_frame_type(_pst_tx_ctrl)) && \
141     (WLAN_ACTION_OPMODE_FRAME_SUBTYPE == mac_get_cb_frame_subtype(_pst_tx_ctrl)))
142 
143 /* 模块发送流程控制信息结构体的信息元素获取 */
144 #define mac_get_cb_mpdu_num(_pst_tx_ctrl)                ((_pst_tx_ctrl)->mpdu_num)
145 #define mac_get_cb_netbuf_num(_pst_tx_ctrl)              ((_pst_tx_ctrl)->netbuf_num)
146 #define mac_get_cb_frame_header_length(_pst_tx_ctrl)     ((_pst_tx_ctrl)->frame_header_length)
147 #define mac_get_cb_ack_polacy(_pst_tx_ctrl)              ((_pst_tx_ctrl)->ack_policy)
148 #define mac_get_cb_tx_vap_index(_pst_tx_ctrl)            ((_pst_tx_ctrl)->tx_vap_index)
149 #define mac_get_cb_tx_user_idx(_pst_tx_ctrl)             ((_pst_tx_ctrl)->tx_user_idx)
150 #define mac_get_cb_wme_ac_type(_pst_tx_ctrl)             ((_pst_tx_ctrl)->ac)
151 #define mac_get_cb_wme_tid_type(_pst_tx_ctrl)            ((_pst_tx_ctrl)->tid)
152 #define mac_get_cb_retried_num(_pst_tx_ctrl)             ((_pst_tx_ctrl)->retried_num)
153 #define mac_get_cb_alg_pktno(_pst_tx_ctrl)               ((_pst_tx_ctrl)->alg_pktno)
154 #define mac_get_cb_tcp_ack(_pst_tx_ctrl)                 ((_pst_tx_ctrl)->is_tcp_ack)
155 #define mac_get_cb_msdu_num(_pst_tx_ctrl)                ((_pst_tx_ctrl)->msdu_num)
156 #define mac_get_cb_pk_mode(_pst_tx_ctrl)                 ((_pst_tx_ctrl)->resrv_6)
157 #define mac_get_cb_icmp(_pst_tx_ctrl)                    ((_pst_tx_ctrl)->resrv_2)
158 #define mac_get_cb_vip_tcp_ack(_pst_tx_ctrl)             ((_pst_tx_ctrl)->resrv_3)
159 
160 #define mac_get_cb_is_data_frame(_pst_tx_ctrl) \
161     ((WLAN_DATA_BASICTYPE == mac_get_cb_wlan_frame_type(_pst_tx_ctrl)) && \
162     ((WLAN_DATA == mac_get_cb_wlan_frame_subtype(_pst_tx_ctrl)) || \
163     (WLAN_QOS_DATA == mac_get_cb_wlan_frame_subtype(_pst_tx_ctrl))))
164 
165 #define mac_get_cb_wlan_frame_type(_pst_tx_ctrl)                ((_pst_tx_ctrl)->expand_cb.frame_type)
166 #define mac_get_cb_wlan_frame_subtype(_pst_tx_ctrl) \
167     (((_pst_tx_ctrl)->frame_header)->frame_control.sub_type)
168 #define mac_get_cb_seq_num(_pst_tx_ctrl)                        ((_pst_tx_ctrl)->expand_cb.seqnum)
169 #define mac_get_cb_frame_header_addr(_pst_tx_ctrl)              ((_pst_tx_ctrl)->expand_cb.frame_header)
170 #define mac_set_cb_is_qos_data(_pst_tx_ctrl, _flag)
171 #define mac_get_cb_is_qos_data(_pst_tx_ctrl)             OAL_FALSE
172 
173 #define mac_get_rx_cb_frame_len(_pst_rx_ctl)                    ((_pst_rx_ctl)->frame_len)
174 #define mac_get_rx_cb_mac_header_len(_pst_rx_ctl)               ((_pst_rx_ctl)->mac_header_len)
175 #define mac_get_rx_cb_mac_vap_id(_pst_rx_ctl)                   ((_pst_rx_ctl)->mac_vap_id)
176 #define mac_get_rx_cb_hal_vap_idx(_pst_rx_ctl)                  ((_pst_rx_ctl)->vap_id)
177 
178 /* DMAC模块接收流程控制信息结构体的信息元素获取 */
179 #define mac_get_rx_cb_ta_user_idx(_pst_rx_ctl)                  ((_pst_rx_ctl)->ta_user_idx)
180 #define mac_get_rx_cb_payload_len(_pst_rx_ctl) \
181     ((_pst_rx_ctl)->frame_len - (_pst_rx_ctl)->mac_header_len)
182 #define mac_get_rx_cb_mac_header_addr(_pst_rx_ctl)      ((osal_u8 *)(mac_get_rx_cb_mac_hdr(_pst_rx_ctl)))
183 #define mac_get_rx_payload_addr(_pst_rx_ctl, _pst_buf) \
184             ((osal_u8 *)(mac_get_rx_cb_mac_hdr(_pst_rx_ctl)) + mac_get_rx_cb_mac_header_len(_pst_rx_ctl))
185 /*****************************************************************************
186   3 枚举定义
187 *****************************************************************************/
188 /*****************************************************************************
189   枚举名  : hmac_wlan_ctx_event_sub_type_enum_uint8
190   协议表格:
191   枚举说明: WLAN CTX事件子类型定义
192 *****************************************************************************/
193 typedef enum {
194     HMAC_WLAN_CTX_EVENT_SUB_TYPE_MGMT = 0, /* 管理帧处理 */
195     HMAC_WLAN_CTX_EVENT_SUB_TYPE_ADD_USER,
196     HMAC_WLAN_CTX_EVENT_SUB_TYPE_NOTIFY_ALG_ADD_USER,
197     HMAC_WLAN_CTX_EVENT_SUB_TYPE_DEL_USER,
198 
199     HMAC_WLAN_CTX_EVENT_SUB_TYPE_BA_SYNC,  /* 收到wlan的Delba和addba rsp用于到dmac的同步 */
200     HMAC_WLAN_CTX_EVENT_SUB_TYPE_PRIV_REQ, /* 11N自定义的请求的事件类型 */
201 
202     HMAC_WLAN_CTX_EVENT_SUB_TYPE_SCAN_REQ,       /* 扫描请求 */
203     HMAC_WLAN_CTX_EVENT_SUB_TYPE_SCHED_SCAN_REQ, /* PNO调度扫描请求 */
204     HMAC_WLAN_CTX_EVENT_SUB_TYPE_RESET_PSM,      /* 收到认证请求 关联请求,复位用户的节能状态 */
205 
206     HMAC_WLAN_CTX_EVENT_SUB_TYPE_JOIN_SET_REG,
207     HMAC_WLAN_CTX_EVENT_SUB_TYPE_JOIN_DTIM_TSF_REG,
208     HMAC_WLAN_CTX_EVENT_SUB_TYPE_CONN_RESULT, /* 关联结果 */
209 
210     HMAC_WLAN_CTX_EVENT_SUB_TYPE_ASOC_WRITE_REG, /* AP侧处理关联时,修改SEQNUM_DUPDET_CTRL寄存器 */
211 
212     HMAC_WLAN_CTX_EVENT_SUB_TYPE_STA_SET_EDCA_REG,       /* STA收到beacon和assoc rsp时,更新EDCA寄存器 */
213     HMAC_WLAN_CTX_EVENT_SUB_TYPE_STA_SET_DEFAULT_VO_REG, /* 如果AP不是WMM的,则STA会去使能EDCA寄存器,并设置VO寄存器 */
214 
215     HMAC_WLAN_CTX_EVENT_SUB_TYPE_SWITCH_TO_NEW_CHAN, /* 切换至新信道事件 */
216     HMAC_WALN_CTX_EVENT_SUB_TYPR_SELECT_CHAN,        /* 设置信道事件 */
217     HMAC_WALN_CTX_EVENT_SUB_TYPR_DISABLE_TX,         /* 禁止硬件发送 */
218     HMAC_WALN_CTX_EVENT_SUB_TYPR_ENABLE_TX,          /* 恢复硬件发送 */
219 #ifdef _PRE_WLAN_FEATURE_DFS
220     HMAC_WLAN_CTX_EVENT_SUB_TYPR_DFS_TEST,
221     HMAC_WALN_CTX_EVENT_SUB_TYPR_DFS_CAC_CTRL_TX, /* DFS 1min CAC把vap状态位置为pause或者up,同时禁止或者开启硬件发送 */
222 #endif
223 
224     HMAC_WLAN_CTX_EVENT_SUB_TYPE_CALI_HMAC2DMAC,
225     HMAC_WLAN_CTX_EVENT_SUB_TYPE_DSCR_OPT,
226     HMAC_WLAN_CTX_EVENT_SUB_TYPE_CALI_MATRIX_HMAC2DMAC,
227     HMAC_WLAN_CTX_EVENT_SUB_TYPE_APP_IE_H2D,
228     HMAC_WLAN_CTX_EVENT_SUB_TYPE_STA_SET_MU_EDCA_REG,      /* STA收到beacon和assoc rsp时,更新MU EDCA寄存器 */
229     HMAC_WLAN_CTX_EVENT_SUB_TYPE_STA_SET_AFFECTED_ACS_REG, /* STA收到MU EDCA Control Frame时,更新相关寄存器 */
230     HMAC_WLAN_CTX_EVENT_SUB_TYPE_STA_SET_FEEDBACK_STATUS,
231     HMAC_WLAN_CTX_EVENT_SUB_TYPE_STA_SET_SPATIAL_REUSE_REG,
232     HMAC_WLAN_CTX_EVENT_SUB_TYPE_CLOSE_11AX_RELATED_PARA,
233 
234 #ifdef _PRE_WLAN_FEATURE_TWT
235     HMAC_WLAN_CTX_EVENT_SUB_TYPE_UPDATE_TWT, /* STA收到twt 时,更新寄存器 */
236 #endif
237 
238 #ifdef _PRE_WLAN_FEATURE_WUR_TX
239     HMAC_WLAN_CTX_EVENT_SUB_TYPE_UPDATE_WUR, /* STA收到WUR相关帧时,更新相关参数 */
240 #endif
241 
242     HMAC_WLAN_CTX_EVENT_SUB_TYPE_STA_SEND_PROBE_REQUEST_FRAME,
243 
244     HMAC_WLAN_CTX_EVENT_SUB_TYPE_STA_MULTI_BSSID_SET,
245 
246     HMAC_WLAN_CTX_EVENT_SUB_TYPE_APF_CMD,
247     HMAC_WLAN_CTX_EVENT_SUB_TYPE_NEW_FRW_MGMT, /* 新frw机制的管理帧发送处理消息,
248                                                  此 ID为保证新老机制共存而增加,待调好之后删除 */
249     HMAC_WLAN_CTX_EVENT_SUB_TYPE_BUTT
250 } hmac_wlan_ctx_event_sub_type_enum;
251 typedef osal_u8 hmac_wlan_ctx_event_sub_type_enum_uint8;
252 
253 /* MISC杂散事件 */
254 typedef enum {
255     HMAC_MISC_SUB_TYPE_RADAR_DETECT,
256     HMAC_MISC_SUB_TYPE_DISASOC,
257     HMAC_MISC_SUB_TYPE_CALI_TO_HMAC,
258     HMAC_MISC_SUB_TYPE_HMAC_TO_CALI,
259 // #ifdef _PRE_SUPPORT_ACS
260     HMAC_MISC_SUB_TYPE_RESCAN,
261 // #endif
262 
263 #ifdef _PRE_WLAN_ONLINE_DPD
264     HMAC_TO_HMAC_DPD,
265 #endif
266 
267     HMAC_MISC_SUB_TYPE_BUTT
268 } hmac_misc_sub_type_enum;
269 
270 typedef enum {
271     THRUPUT_NOACK,               /* 使用最大速率NOACK测试峰值性能 */
272     THRUPUT_DEV_WIFI,            /* DEV wifi线程峰值性能测试 frw死循环noack发包 */
273     THRUPUT_HAL_BYPASS,          /* 逻辑bypass峰值性能测试,不写入FIFO队列软件产生发送完成中断 */
274     THRUPUT_HMAC_PK,             /* HMAC pk版本,bypass不相关流程 */
275     THRUPUT_FIX_AGGR,            /* 配置强制聚合数 */
276     THRUPUT_COMP_SCHE_BYPASS,    /* 发送完成上报HMAC消息bypass使能 */
277     THRUPUT_CACHE_MISS_STATISTIC, /* CACHE MISS DFX */
278     THRUPUT_DELAY_START_NUM,     /* 延时统计开始序号 */
279     THRUPUT_DELAY_END_NUM,       /* 延时统计结束序号 */
280     THRUPUT_TX_BEFORE_HCC,       /* TX HCC之前丢包 */
281     THRUPUT_RX_AFTER_HCC,        /* RX HCC之后丢包 */
282     THRUPUT_RX_REPORT,           /* RX 流量上报 */
283     THRUPUT_TASK_CPU,            /* 查看任务CPU使用率 */
284     THRUPUT_TX_PK,               /* TX PK流程 */
285     THRUPUT_RX_PK,               /* RX PK流程 */
286     THRUPUT_HCC_STAT,            /* HCC队列查询 */
287     THRUPUT_RESUME_FRW_TX_DATA,  /* 数据通路TX恢复走wifi_frw_txdata任务 */
288     THRUPUT_ALG_BYPASS,          /* bypass host侧tx rx逐包通知 */
289     THRUPUT_RESUME_FRW_RX_DATA,  /* 数据通路RX恢复走wifi_frw_txdata任务 */
290     THRUPUT_TEST_SCHEDULE,       /* 开关打开后,下行数据报文入tid队列 */
291     THRUPUT_TEST_NO_SCHEDULE,    /* 开关打开后,下行数据报文都不入tid队列 */
292     THRUPUT_TX_ENQUE_TID,        /* 开关打开后,TX方向性能模式关闭 */
293     THRUPUT_TEST_QUERY_RATE_STAT, /* 查询一段时间收发包速率统计 */
294     THRUPUT_TYPE_BUTT
295 } hmac_thruput_enum;
296 
297 /*****************************************************************************
298   7 STRUCT定义
299 *****************************************************************************/
300 
301 /* DMAC与HMAC模块共用的WLAN DRX事件结构体 */
302 typedef struct {
303     oal_netbuf_stru *netbuf; /* netbuf链表一个元素 */
304     osal_u16 netbuf_num;        /* netbuf链表的个数 */
305     osal_u8 resv[2];           /* 2字节对齐 */
306 } hmac_wlan_drx_event_stru;
307 
308 /* DMAC与HMAC模块共用的WLAN CRX事件结构体 */
309 typedef struct {
310     oal_netbuf_stru *netbuf; /* 指向管理帧对应的netbuf */
311     //    osal_u8              *chtxt;          /* Shared Key认证用的challenge text */
312 } hmac_wlan_crx_event_stru;
313 
314 /* DMAC与HMAC模块共用的DTX事件结构体 */
315 typedef struct {
316     oal_netbuf_stru *netbuf; /* netbuf链表一个元素 */
317     osal_u16 frame_len;
318     osal_u16 remain;
319     osal_u8 data[0];
320 } dmac_tx_event_stru;
321 
322 typedef struct {
323     mac_channel_stru channel;
324     mac_ch_switch_info_stru ch_switch_info;
325 
326     oal_bool_enum_uint8 switch_immediately; /* 1 - 马上切换  0 - 暂不切换, 推迟到tbtt中切换 */
327     oal_bool_enum_uint8 check_cac;
328     oal_bool_enum_uint8 dot11_40mhz_intolerant;
329     osal_u8 resv[1];
330 } hmac_set_chan_stru;
331 
332 /* 扫描请求事件payload结构体 */
333 typedef struct {
334     mac_scan_req_stru *scan_params; /* 将扫描参数传下去 */
335 } hmac_ctx_scan_req_stru;
336 
337 /* 处理MPDU的MSDU的处理状态的结构体的定义 */
338 typedef struct {
339     oal_netbuf_stru *curr_netbuf; /* 当前处理的netbuf指针 */
340     osal_u8 *curr_netbuf_data;      /* 当前处理的netbuf的data指针 */
341     osal_u16 submsdu_offset;         /* 当前处理的submsdu的偏移量,   */
342     osal_u8 msdu_nums_in_netbuf;     /* 当前netbuf包含的总的msdu数目 */
343     osal_u8 procd_msdu_in_netbuf;    /* 当前netbuf中已处理的msdu数目 */
344     osal_u8 netbuf_nums_in_mpdu;     /* 当前MPDU的中的总的netbuf的数目 */
345     osal_u8 procd_netbuf_nums;       /* 当前MPDU中已处理的netbuf的数目 */
346     osal_u8 procd_msdu_nums_in_mpdu; /* 当前MPDU中已处理的MSDU数目 */
347 
348     osal_u8 flag;
349 } hmac_msdu_proc_state_stru;
350 
351 /* 每一个MSDU包含的内容的结构体的定义 */
352 typedef struct {
353     osal_u8 sa[WLAN_MAC_ADDR_LEN]; /* MSDU发送的源地址 */
354     osal_u8 da[WLAN_MAC_ADDR_LEN]; /* MSDU接收的目的地址 */
355     osal_u8 ta[WLAN_MAC_ADDR_LEN]; /* MSDU接收的发送地址 */
356     osal_u8 priority;
357     osal_u8 resv[1];
358 
359     oal_netbuf_stru *netbuf; /* MSDU对应的netbuf指针(可以使clone的netbuf) */
360 } hmac_msdu_stru;
361 
362 typedef struct {
363     osal_char signal;          /* 信号强度 */
364     osal_u16 asoc_id;         /* Association ID of the STA */
365     osal_u32 rx_packets;      /* total packets received */
366     osal_u32 tx_packets;      /* total packets transmitted */
367     osal_u32 rx_bytes;        /* total bytes received     */
368     osal_u32 tx_bytes;        /* total bytes transmitted  */
369     osal_u32 tx_retries;      /* 发送重传次数 */
370     osal_u32 rx_dropped_misc; /* 接收失败次数 */
371     osal_u32 tx_failed;       /* 发送失败次数 */
372     osal_s16 free_power;      /* 底噪 */
373     osal_u16 chload;          /* 信道繁忙程度 */
374     station_info_extend_stru station_info_extend;
375     mac_rate_info_stru txrate; /* vap当前速率 */
376 } hmac_stat_info_rsp_stru;
377 
378 #ifdef _PRE_WLAN_FEATURE_M2S
379 typedef struct {
380     wlan_m2s_mgr_vap_stru m2s_comp_vap[WLAN_SERVICE_STA_MAX_NUM_PER_DEVICE];
381     oal_bool_enum_uint8 m2s_result;
382     osal_u8 m2s_mode;  /* 当前切换业务 */
383     osal_u8 m2s_state; /* 当前m2s状态 */
384     osal_u8 vap_num;
385 } hmac_m2s_complete_syn_stru;
386 #endif
387 
388 /* MU EDCA Control Field */
389 typedef struct {
390     /* 协议中规定的B0~B3分别对应BK、BE、VI、VO,而硬件刚好相反,对应VO、VI、BE、BK */
391     osal_u8 affected_acs_b0 : 1;
392     osal_u8 affected_acs_b1 : 1;
393     osal_u8 affected_acs_b2 : 1;
394     osal_u8 affected_acs_b3 : 1;
395     osal_u8 reserved : 4;
396 } mac_mu_edca_control;
397 
398 typedef struct {
399     osal_u8                      scan_idx;
400     osal_u8                      resv[3];
401     wlan_scan_chan_stats_stru    chan_result;
402 } hmac_crx_chan_result_stru;
403 
404 typedef struct {
405     hal_reset_hw_type_enum_uint8 reset_type; /* 命令类型0|1|2|3(all|phy|mac|debug) */
406     hal_reset_mac_submod_enum_uint8 reset_mac_mod;
407     osal_u8 reset_phy_reg         : 1;
408     osal_u8 reset_mac_reg         : 1;
409     osal_u8 is_rx_dscrlist_reset  : 1;
410     osal_u8 resv                  : 5;
411     osal_u8 resv1[1];
412 } hmac_reset_para_stru;
413 
414 typedef struct {
415     dmac_disasoc_misc_reason_enum_uint16   disasoc_reason;
416     osal_u16                               user_idx;
417 } hmac_disasoc_misc_stru;
418 
419 typedef struct {
420     osal_u16 user_id;
421     osal_u8  ba_size;
422     oal_bool_enum_uint8 need_delba;
423 } hmac_to_hmac_btcoex_rx_delba_trigger_event_stru;
424 
425 typedef struct {
426     osal_u8                      device_id;
427     wlan_nss_enum_uint8          m2s_nss;
428     wlan_m2s_type_enum_uint8     m2s_type;   /* 0:软切换 1:硬切换 */
429     osal_u8                      reserve[1];
430 } hmac_to_hmac_m2s_event_stru;
431 
432 #ifdef _PRE_WLAN_FEATURE_WMMAC
433 /* 挂载在hmac_ctx_action_event_stru.resv[2]传递给dmac */
434 typedef struct {
435     osal_u8   ac;
436     osal_u8   psb       : 1;
437     osal_u8   direction : 7;
438 } hmac_addts_info_stru;
439 #endif
440 
441 /* DMAC与HMAC模块共用的CTX子类型ACTION对应的事件的结构体,当DMAC自身产生DELBA帧时,使用该结构体向HMAC模块抛事件 */
442 typedef struct {
443     mac_category_enum_uint8   action_category;     /* ACTION帧的类型 */
444     osal_u8                   action;              /* 不同ACTION类下的子帧类型 */
445     osal_u16                  user_idx;
446     osal_u16                  frame_len;           /* 帧长度 */
447     osal_u8                   hdr_len;             /* 帧头长度 */
448     osal_u8                   tidno;               /* tidno,部分action帧使用 */
449     osal_u8                   initiator;           /* 触发端方向 */
450 
451     /* 以下为接收到req帧,发送rsp帧后,需要同步到dmac的内容 */
452     osal_u8                       status;              /* rsp帧中的状态 */
453     osal_u16                      baw_start;           /* 窗口开始序列号 */
454     osal_u16                      baw_size;            /* 窗口大小 */
455     osal_u8                       ampdu_max_num;       /* BA会话下的最多聚合的AMPDU的个数 */
456     oal_bool_enum_uint8           amsdu_supp;          /* 是否支持AMSDU */
457     osal_u16                      ba_timeout;          /* BA会话交互超时时间 */
458     mac_back_variant_enum_uint8   back_var;            /* BA会话的变体 */
459     osal_u8                       dialog_token;        /* ADDBA交互帧的dialog token */
460     osal_u8                       ba_policy;           /* Immediate=1 Delayed=0 */
461     osal_u8                       lut_index;           /* LUT索引 */
462     osal_u8                       mac_addr[WLAN_MAC_ADDR_LEN];    /* 用于DELBA/DELTS查找HMAC用户 */
463 #ifdef _PRE_WLAN_FEATURE_WMMAC
464     osal_u8                       tsid;                /* TS相关Action帧中的tsid值 */
465     osal_u8                       ts_dialog_token;     /* ADDTS交互帧的dialog token */
466     hmac_addts_info_stru          addts_info;
467 #endif
468 } hmac_ctx_action_event_stru;
469 
470 /* Update join req 参数写寄存器的结构体定义 */
471 typedef struct {
472     osal_u8               bssid[WLAN_MAC_ADDR_LEN];     /* 加入的AP的BSSID */
473     osal_u16              beacon_period;
474     mac_channel_stru      current_channel;               /* 要切换的信道信息 */
475     osal_u32              beacon_filter;                 /* 过滤beacon帧的滤波器开启标识位 */
476     osal_u32              non_frame_filter;              /* 过滤no_frame帧的滤波器开启标识位 */
477     osal_u8               ssid[WLAN_SSID_MAX_LEN];      /* 加入的AP的SSID  */
478     osal_u8               dtim_period;                   /* dtim period      */
479     oal_bool_enum_uint8   dot11_40mhz_operation_implemented; /* dot11FortyMHzOperationImplemented */
480     osal_u8               resv;
481     hmac_set_rate_stru    min_rate;      /* Update join req 需要配置的速率集参数 */
482 } hmac_ctx_join_req_set_reg_stru;
483 
484 #ifdef _PRE_WLAN_FEATURE_11AX
485 typedef struct {
486     mac_frame_he_spatial_reuse_parameter_set_ie_stru sr_ie;
487 } hmac_ctx_sta_asoc_set_sr_reg_stru;
488 #endif
489 
490 typedef  hal_rx_ctl_stru mac_rx_ctl_stru;
491 
492 /* hmac to dmac配置同步消息结构体 */
493 typedef struct {
494     wlan_cfgid_enum_uint16            syn_id;        /* 同步事件ID */
495     osal_u16                          len;           /* 事件payload长度 */
496     osal_u8                           msg_body[0];   /* 事件payload */
497 } hmac_to_dmac_cfg_msg_stru;
498 
499 /* HMAC到DMAC配置同步操作结构体 */
500 typedef struct {
501     wlan_cfgid_enum_uint16    cfgid;
502     osal_u8                   resv[2];
503     osal_u32(*set_func)(hmac_vap_stru *hmac_vap, osal_u8 len, osal_u8 *param);
504 } hmac_config_syn_stru;
505 
506 /* 1字节对齐 */
507 #pragma pack(push, 1)
508 #pragma pack(pop)
509 
510 /*****************************************************************************
511     函数定义
512 *****************************************************************************/
513 /*****************************************************************************
514  功能描述  : 从当前的netbuf指针开始,释放后续n个netbuf元素
515 *****************************************************************************/
hmac_rx_free_netbuf_list(oal_netbuf_head_stru * netbuf_hdr,oal_netbuf_stru ** pst_netbuf,osal_u16 nums)516 static INLINE__ osal_u32  hmac_rx_free_netbuf_list(
517     oal_netbuf_head_stru       *netbuf_hdr,
518     oal_netbuf_stru           **pst_netbuf,
519     osal_u16                    nums)
520 {
521     oal_netbuf_stru    *netbuf_temp;
522     osal_u16          us_netbuf_num;
523 
524     if (OAL_UNLIKELY((netbuf_hdr == OAL_PTR_NULL) || (pst_netbuf == OAL_PTR_NULL))) {
525         return OAL_ERR_CODE_PTR_NULL;
526     }
527 
528     for (us_netbuf_num = 0; us_netbuf_num < nums; us_netbuf_num++) {
529         netbuf_temp = oal_get_netbuf_next(*pst_netbuf);
530 
531         oal_netbuf_delete(*pst_netbuf, netbuf_hdr);
532         if (oal_netbuf_free(*pst_netbuf) == OAL_ERR_CODE_OAL_MEM_ALREADY_FREE) {
533         }
534         *pst_netbuf = netbuf_temp;
535         if (netbuf_hdr == (oal_netbuf_head_stru *)(*pst_netbuf)) {
536             break;
537         }
538     }
539     return OAL_SUCC;
540 }
541 
542 /*****************************************************************************
543  功能描述  : 根据netbuf获取payload地址
544 *****************************************************************************/
mac_netbuf_get_payload(const oal_netbuf_stru * pst_netbuf)545 static INLINE__ osal_u8* mac_netbuf_get_payload(const oal_netbuf_stru *pst_netbuf)
546 {
547 #if defined(_PRE_PRODUCT_ID_HIMPXX_DEV)
548     return OAL_NETBUF_PAYLOAD(pst_netbuf);
549 #else
550     /* 注意!对51而言,此处只偏移了24字节,所以如果mac header长度不是24字节的不要使用该函数 */
551     return OAL_NETBUF_PAYLOAD(pst_netbuf) + MAC_80211_FRAME_LEN;
552 #endif
553 }
554 
555 #define mac_get_netbuf_by_cb(ptr) \
556     ((oal_netbuf_stru *)((osal_s8 *)(ptr) - (osal_ulong)(&((oal_netbuf_stru *)0)->cb)))
557 
558 /*****************************************************************************
559  函 数 名  : mac_get_wlan_frame_type
560  功能描述  : 根据tx control block获取帧类型
561 *****************************************************************************/
mac_get_wlan_frame_type(const mac_tx_ctl_stru * tx_ctl)562 static INLINE__ osal_u16 mac_get_wlan_frame_type(const mac_tx_ctl_stru *tx_ctl)
563 {
564     oal_netbuf_stru *netbuf = mac_get_netbuf_by_cb(tx_ctl);
565     return ((mac_ieee80211_frame_stru *)(oal_netbuf_header(netbuf)))->frame_control.type;
566 }
567 
568 /*****************************************************************************
569  函 数 名  : mac_get_wlan_frame_subtype
570  功能描述  : 根据tx control block获取帧子类型
571 *****************************************************************************/
mac_get_wlan_frame_subtype(const mac_tx_ctl_stru * tx_ctl)572 static INLINE__ osal_u16 mac_get_wlan_frame_subtype(const mac_tx_ctl_stru *tx_ctl)
573 {
574     oal_netbuf_stru *netbuf = mac_get_netbuf_by_cb(tx_ctl);
575     return ((mac_ieee80211_frame_stru *)(oal_netbuf_header(netbuf)))->frame_control.sub_type;
576 }
577 
578 /*****************************************************************************
579  函 数 名  : mac_get_is_data_frame
580  功能描述  : 判断一个帧是否为数据帧中的data帧或qos data帧
581 *****************************************************************************/
mac_get_is_data_frame(const mac_tx_ctl_stru * tx_ctrl)582 static INLINE__ osal_u8 mac_get_is_data_frame(const mac_tx_ctl_stru *tx_ctrl)
583 {
584     if ((mac_get_wlan_frame_type(tx_ctrl) == WLAN_DATA_BASICTYPE) &&
585         (mac_get_wlan_frame_subtype(tx_ctrl) == WLAN_DATA ||
586         mac_get_wlan_frame_subtype(tx_ctrl) == WLAN_QOS_DATA)) {
587         return OSAL_TRUE;
588     }
589     return OSAL_FALSE;
590 }
591 
592 /*****************************************************************************
593  函 数 名  : mac_get_is_qos_data
594  功能描述  : 判断一个帧是否为数据帧中的qos data帧或qos null data帧
595 *****************************************************************************/
mac_get_is_qos_data(const mac_tx_ctl_stru * tx_ctrl)596 static INLINE__ osal_u8 mac_get_is_qos_data(const mac_tx_ctl_stru *tx_ctrl)
597 {
598     if ((mac_get_wlan_frame_type(tx_ctrl) == WLAN_DATA_BASICTYPE) &&
599         (mac_get_wlan_frame_subtype(tx_ctrl) == WLAN_QOS_DATA ||
600         mac_get_wlan_frame_subtype(tx_ctrl) == WLAN_QOS_NULL_FRAME)) {
601         return OSAL_TRUE;
602     }
603     return OSAL_FALSE;
604 }
605 
606 /*****************************************************************************
607  函 数 名  : mac_get_is_bar
608  功能描述  : 判断一个帧是否为控制帧中的block ack req帧
609 *****************************************************************************/
mac_get_is_bar(const mac_tx_ctl_stru * tx_ctrl)610 static INLINE__ osal_u8 mac_get_is_bar(const mac_tx_ctl_stru *tx_ctrl)
611 {
612     if (mac_get_wlan_frame_type(tx_ctrl) == WLAN_CONTROL &&
613         mac_get_wlan_frame_subtype(tx_ctrl) == WLAN_BLOCKACK_REQ) {
614         return OSAL_TRUE;
615     }
616     return OSAL_FALSE;
617 }
618 /*****************************************************************************
619  函 数 名  : mac_set_rx_cb_mac_hdr
620  功能描述  : 设置mac头的值
621 
622 *****************************************************************************/
mac_set_rx_cb_mac_hdr(mac_rx_ctl_stru * cb_ctrl,osal_u32 * mac_hdr_start_addr)623 static INLINE__ osal_void mac_set_rx_cb_mac_hdr(mac_rx_ctl_stru *cb_ctrl, osal_u32 *mac_hdr_start_addr)
624 {
625     unref_param(cb_ctrl);
626     unref_param(mac_hdr_start_addr);
627     return;
628 }
629 
630 /* to do */
631 /*****************************************************************************
632  函 数 名  : mac_get_frame_header_addr
633  功能描述  : 根据tx control block获取对应的帧头地址
634 *****************************************************************************/
mac_get_frame_header_addr(const mac_tx_ctl_stru * tx_ctl)635 static INLINE__ mac_ieee80211_frame_stru *mac_get_frame_header_addr(const mac_tx_ctl_stru *tx_ctl)
636 {
637     oal_netbuf_stru *netbuf = mac_get_netbuf_by_cb(tx_ctl);
638     return (mac_ieee80211_frame_stru *)(oal_netbuf_header(netbuf));
639 }
640 
641 /*****************************************************************************
642  函 数 名  : mac_get_rx_cb_mac_hdr
643  功能描述  : 获取mac头的值
644 
645 *****************************************************************************/
mac_get_rx_cb_mac_hdr(mac_rx_ctl_stru * cb_ctrl)646 static INLINE__ osal_u32 *mac_get_rx_cb_mac_hdr(mac_rx_ctl_stru *cb_ctrl)
647 {
648     oal_netbuf_stru *netbuf = mac_get_netbuf_by_cb(cb_ctrl);
649     return (osal_u32 *)(oal_netbuf_header(netbuf));
650 }
651 
mac_pk_mode(const oal_netbuf_stru * netbuf)652 static INLINE__ osal_bool mac_pk_mode(const oal_netbuf_stru *netbuf)
653 {
654     return (mac_get_cb_pk_mode((mac_tx_ctl_stru *)OAL_NETBUF_CB(netbuf)) == OSAL_TRUE);
655 }
656 
657 osal_void mac_set_rx_cb_mac_hdr(mac_rx_ctl_stru *cb_ctrl, osal_u32 *mac_hdr_start_addr);
658 osal_u32 hmac_vap_set_cb_tx_user_idx(hmac_vap_stru *hmac_vap, mac_tx_ctl_stru *tx_ctl, const osal_u8 *data);
659 
660 #ifdef __cplusplus
661 #if __cplusplus
662 }
663 #endif
664 #endif
665 
666 #endif /* end of file */
667