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