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: hmac csa ap
15 * Create: 2023-2-17
16 */
17
18 #include "hmac_csa_ap.h"
19 #include "hmac_beacon.h"
20 #include "hmac_chan_mgmt.h"
21 #include "hmac_tx_mgmt.h"
22 #include "frw_util_notifier.h"
23 #include "hmac_feature_dft.h"
24 #include "hmac_feature_interface.h"
25 #include "hmac_ccpriv.h"
26 #include "wal_utils.h"
27 #ifdef __cplusplus
28 #if __cplusplus
29 extern "C" {
30 #endif
31 #endif
32 #undef THIS_FILE_ID
33 #define THIS_FILE_ID DIAG_FILE_ID_WIFI_HOST_HMAC_CSA_AP_C
34
35 #undef THIS_MOD_ID
36 #define THIS_MOD_ID DIAG_MOD_ID_WIFI_HOST
37
38 OSAL_STATIC osal_u32 hmac_ap_send_csa_action(hmac_vap_stru *hmac_vap);
39
40 hmac_csa_ap_info_stru *g_csa_ap_vapinfo[WLAN_VAP_MAX_NUM_PER_DEVICE_LIMIT] = {
41 OSAL_NULL, OSAL_NULL, OSAL_NULL, OSAL_NULL
42 };
43
hmac_csa_ap_get_vap_info(osal_u8 vap_id)44 OSAL_STATIC hmac_csa_ap_info_stru *hmac_csa_ap_get_vap_info(osal_u8 vap_id)
45 {
46 if (hmac_vap_id_param_check(vap_id) != OSAL_TRUE) {
47 return OSAL_NULL;
48 }
49 return g_csa_ap_vapinfo[vap_id];
50 }
51
hmac_csa_ap_is_ch_switch(osal_u8 vap_id)52 OSAL_STATIC osal_bool hmac_csa_ap_is_ch_switch(osal_u8 vap_id)
53 {
54 if (hmac_vap_id_param_check(vap_id) != OSAL_TRUE) {
55 return OSAL_FALSE;
56 }
57
58 if (g_csa_ap_vapinfo[vap_id] == OSAL_NULL) {
59 return OSAL_FALSE;
60 }
61
62 return (g_csa_ap_vapinfo[vap_id]->ch_switch_status == WLAN_CH_SWITCH_STATUS_1) ? OSAL_TRUE : OSAL_FALSE;
63 }
64
hmac_csa_ap_csa_present_in_bcn(osal_u8 vap_id)65 OSAL_STATIC oal_bool_enum_uint8 hmac_csa_ap_csa_present_in_bcn(osal_u8 vap_id)
66 {
67 if (hmac_vap_id_param_check(vap_id) != OSAL_TRUE) {
68 return OSAL_FALSE;
69 }
70
71 if (g_csa_ap_vapinfo[vap_id] == OSAL_NULL) {
72 return OSAL_FALSE;
73 }
74
75 return g_csa_ap_vapinfo[vap_id]->csa_present_in_bcn;
76 }
77
78 /*****************************************************************************
79 函 数 名 : hmac_csa_ap_switch_new_channel
80 功能描述 : 设置VAP信道参数,准备切换至新信道运行
81 输入参数 : hmac_vap : MAC VAP结构体指针
82 channel : 新信道号(准备切换到的20MHz主信道号)
83 en_bandwidth: 新带宽模式
84 输出参数 : 无
85 返 回 值 : 无
86 *****************************************************************************/
hmac_csa_ap_switch_new_channel(hmac_vap_stru * hmac_vap,osal_u8 channel,wlan_channel_bandwidth_enum_uint8 en_bandwidth,osal_bool disable_tx,osal_u8 switch_cnt)87 OSAL_STATIC osal_void hmac_csa_ap_switch_new_channel(hmac_vap_stru *hmac_vap, osal_u8 channel,
88 wlan_channel_bandwidth_enum_uint8 en_bandwidth, osal_bool disable_tx, osal_u8 switch_cnt)
89 {
90 hmac_csa_ap_info_stru *ap_csa_info = OSAL_NULL;
91
92 if (hmac_vap_mode_param_check(hmac_vap) != OSAL_TRUE) {
93 return;
94 }
95
96 ap_csa_info = hmac_csa_ap_get_vap_info(hmac_vap->vap_id);
97 if (osal_unlikely(ap_csa_info == OSAL_NULL)) {
98 return;
99 }
100 /* AP准备切换信道 */
101 ap_csa_info->csa_mode = disable_tx;
102 ap_csa_info->ch_switch_cnt = switch_cnt;
103 ap_csa_info->ch_switch_status = WLAN_CH_SWITCH_STATUS_1;
104 ap_csa_info->announced_channel = channel;
105 ap_csa_info->announced_bandwidth = en_bandwidth;
106 /* 在Beacon帧中添加Channel Switch Announcement IE */
107 ap_csa_info->csa_present_in_bcn = OAL_TRUE;
108
109 oam_warning_log4(0, OAM_SF_2040,
110 "vap_id[%d] {hmac_csa_ap_switch_new_channel::announced_channel=%d,announced_bandwidth=%d csa_cnt=%d}",
111 hmac_vap->vap_id, channel, en_bandwidth, ap_csa_info->ch_switch_cnt);
112
113 /* 11n 协议模式才支持CSA action 帧 发送 Channel Switch Announcement 帧 */
114 if (mac_mib_get_high_throughput_option_implemented(hmac_vap) == OSAL_TRUE) {
115 hmac_ap_send_csa_action(hmac_vap);
116 }
117
118 ap_csa_info->delay_update_switch_cnt = OSAL_TRUE;
119 /* 发送CSA帧后及时更新Beacon帧 */
120 hmac_encap_beacon(hmac_vap, oal_netbuf_header(hmac_vap->beacon_buffer));
121
122 return;
123 }
124
125 /*****************************************************************************
126 函 数 名 : hmac_csa_ap_set_bandwidth_ie
127 功能描述 : 为11AC模式下,信道切换构建宽带IE
128 *****************************************************************************/
hmac_csa_ap_vht_set_bw_ie(osal_u8 channel,wlan_channel_bandwidth_enum_uint8 bw,osal_u8 * buffer,osal_u8 * output_len)129 OSAL_STATIC osal_u32 hmac_csa_ap_vht_set_bw_ie(osal_u8 channel, wlan_channel_bandwidth_enum_uint8 bw, osal_u8 *buffer,
130 osal_u8 *output_len)
131 {
132 if ((buffer == OSAL_NULL) || (output_len == OSAL_NULL)) {
133 oam_error_log0(0, OAM_SF_SCAN, "{hmac_csa_ap_vht_set_bw_ie::param null.}");
134
135 return OAL_ERR_CODE_PTR_NULL;
136 }
137
138 /* 默认输出为空 */
139 *buffer = '\0';
140 *output_len = 0;
141
142 /* 11ac 设置Wide Bandwidth Channel Switch Element */
143 /******************************************************************/
144 /* -------------------------------------------------------------- */
145 /* |ID |Length |New Ch width |Center Freq seg1 |Center Freq seg2 */
146 /* -------------------------------------------------------------- */
147 /* |1 |1 |1 |1 |1 */
148 /* */
149 /******************************************************************/
150 buffer[0] = 194; /* 194: Element ID */
151 buffer[1] = 3; /* 3 */
152 switch (bw) {
153 case WLAN_BAND_WIDTH_20M:
154 case WLAN_BAND_WIDTH_40PLUS:
155 case WLAN_BAND_WIDTH_40MINUS:
156 buffer[MAC_IE_HDR_LEN] = 0;
157 buffer[3] = 0; /* 3 */
158 break;
159
160 case WLAN_BAND_WIDTH_80PLUSPLUS:
161 buffer[MAC_IE_HDR_LEN] = 1;
162 buffer[3] = channel + 6; /* 3, 6 */
163 break;
164
165 case WLAN_BAND_WIDTH_80PLUSMINUS:
166 buffer[MAC_IE_HDR_LEN] = 1;
167 buffer[3] = channel - 2; /* 3, 2 */
168 break;
169
170 case WLAN_BAND_WIDTH_80MINUSPLUS:
171 buffer[MAC_IE_HDR_LEN] = 1;
172 buffer[3] = channel + 2; /* 3, 2 */
173 break;
174
175 case WLAN_BAND_WIDTH_80MINUSMINUS:
176 buffer[MAC_IE_HDR_LEN] = 1;
177 buffer[3] = channel - 6; /* 3, 6 */
178 break;
179 default:
180 oam_error_log1(0, OAM_SF_SCAN, "{hmac_csa_ap_vht_set_bw_ie::invalid bandwidth[%d].}", bw);
181
182 return OAL_FAIL;
183 }
184
185 buffer[4] = 0; /* 4: reserved. Not support 80M + 80M */
186
187 *output_len = 5; /* 5 */
188
189 return OAL_SUCC;
190 }
191 /*****************************************************************************
192 函 数 名 : hmac_cas_ap_set_sec_channel_offset_ie
193 功能描述 : 构建从20M信道偏移IE
194 *****************************************************************************/
hmac_cas_ap_set_sec_channel_offset_ie(wlan_channel_bandwidth_enum_uint8 bw,osal_u8 * buffer,osal_u8 * len)195 OSAL_STATIC osal_u32 hmac_cas_ap_set_sec_channel_offset_ie(wlan_channel_bandwidth_enum_uint8 bw, osal_u8 *buffer,
196 osal_u8 *len)
197 {
198 if ((buffer == OSAL_NULL) || (len == OSAL_NULL)) {
199 oam_error_log0(0, OAM_SF_SCAN, "{hmac_cas_ap_set_sec_channel_offset_ie::param null.}");
200
201 return OAL_ERR_CODE_PTR_NULL;
202 }
203
204 /* 默认输出为空 */
205 *buffer = '\0';
206 *len = 0;
207
208 /* 11n 设置Secondary Channel Offset Element */
209 /******************************************************************/
210 /* -------------------------------------------------------------- */
211 /* |Ele. ID |Length |Secondary channel offset | */
212 /* -------------------------------------------------------------- */
213 /* |1 |1 |1 | */
214 /* */
215 /******************************************************************/
216 buffer[0] = 62; /* 62: Element ID */
217 buffer[1] = 1;
218
219 switch (bw) {
220 case WLAN_BAND_WIDTH_20M:
221 buffer[MAC_IE_HDR_LEN] = 0; /* no secondary channel */
222 break;
223
224 case WLAN_BAND_WIDTH_40PLUS:
225 case WLAN_BAND_WIDTH_80PLUSPLUS:
226 case WLAN_BAND_WIDTH_80PLUSMINUS:
227 buffer[MAC_IE_HDR_LEN] = 1; /* secondary 20M channel above */
228 break;
229
230 case WLAN_BAND_WIDTH_40MINUS:
231 case WLAN_BAND_WIDTH_80MINUSPLUS:
232 case WLAN_BAND_WIDTH_80MINUSMINUS:
233 buffer[MAC_IE_HDR_LEN] = 3; /* 2, 3: secondary 20M channel below */
234 break;
235
236 default:
237 oam_error_log1(0, OAM_SF_SCAN, "{hmac_cas_ap_set_sec_channel_offset_ie::invalid bandwidth[%d].}", bw);
238
239 return OAL_FAIL;
240 }
241
242 *len = 3; /* 3 */
243 return OAL_SUCC;
244 }
245
246 /*****************************************************************************
247 函 数 名 : hmac_csa_ap_set_channel_ie
248 功能描述 : 设置Channel Switch Announcement IE
249 *****************************************************************************/
hmac_csa_ap_set_channel_ie(osal_u8 mode,osal_u8 channel,osal_u8 csa_cnt,osal_u8 * buffer,osal_u8 * ie_len)250 OSAL_STATIC osal_u32 hmac_csa_ap_set_channel_ie(osal_u8 mode, osal_u8 channel, osal_u8 csa_cnt, osal_u8 *buffer,
251 osal_u8 *ie_len)
252 {
253 if (osal_unlikely((buffer == OSAL_NULL) || (ie_len == OSAL_NULL))) {
254 return OAL_ERR_CODE_PTR_NULL;
255 }
256
257 /* Channel Switch Announcement Information Element Format */
258 /* --------------------------------------------------------------------- */
259 /* | Element ID | Length | Chnl Switch Mode | New Chnl | Ch Switch Cnt | */
260 /* --------------------------------------------------------------------- */
261 /* | 1 | 1 | 1 | 1 | 1 | */
262 /* --------------------------------------------------------------------- */
263
264 /* 设置Channel Switch Announcement Element */
265 buffer[0] = MAC_EID_CHANSWITCHANN;
266 buffer[1] = MAC_CHANSWITCHANN_LEN;
267 buffer[2] = mode; /* 2 */
268 buffer[3] = channel; /* 3 */
269 buffer[4] = csa_cnt; /* 4 */
270
271 *ie_len = MAC_IE_HDR_LEN + MAC_CHANSWITCHANN_LEN;
272
273 return OAL_SUCC;
274 }
275
276 /*****************************************************************************
277 函 数 名 : hmac_csa_ap_set_bw_ie
278 功能描述 : 设置csa bw 相关IE
279 *****************************************************************************/
hmac_csa_ap_set_bw_ie(const hmac_vap_stru * hmac_vap,osal_u8 * buf,osal_u8 * ie_len)280 OSAL_STATIC osal_u32 hmac_csa_ap_set_bw_ie(const hmac_vap_stru *hmac_vap, osal_u8 *buf, osal_u8 *ie_len)
281 {
282 wlan_channel_bandwidth_enum_uint8 bw;
283 osal_u8 len;
284 osal_u8 channel;
285 hmac_csa_ap_info_stru *ap_csa_info = OSAL_NULL;
286 osal_u8 *buffer = buf;
287
288 if (osal_unlikely((buffer == OSAL_NULL) || (ie_len == OSAL_NULL) || (hmac_vap == OSAL_NULL))) {
289 return OAL_ERR_CODE_PTR_NULL;
290 }
291
292 ap_csa_info = hmac_csa_ap_get_vap_info(hmac_vap->vap_id);
293 if (osal_unlikely(ap_csa_info == OSAL_NULL)) {
294 return OAL_ERR_CODE_PTR_NULL;
295 }
296
297 bw = ap_csa_info->announced_bandwidth;
298 channel = ap_csa_info->announced_channel;
299 len = 0;
300 /* 封装Second channel offset IE */
301 if (hmac_cas_ap_set_sec_channel_offset_ie(bw, buffer, &len) != OAL_SUCC) {
302 oam_error_log1(0, 0, "vap_id[%d] {hmac_csa_ap_set_bw_ie::set_second_ch_ie failed}", hmac_vap->vap_id);
303 return OAL_FAIL;
304 }
305
306 buffer += len;
307 *ie_len = len;
308
309 if (mac_mib_get_vht_option_implemented(hmac_vap) == OSAL_TRUE) {
310 /* 11AC Wide Bandwidth Channel Switch IE */
311 len = 0;
312 if (hmac_csa_ap_vht_set_bw_ie(channel, bw, buffer, &len) != OAL_SUCC) {
313 oam_error_log1(0, 0, "vap_id[%d] {hmac_csa_ap_set_bw_ie::set_11ac_wideband_ie failed}", hmac_vap->vap_id);
314 return OAL_FAIL;
315 }
316 *ie_len += len;
317 }
318
319 return OAL_SUCC;
320 }
321
hmac_csa_ap_encap_csa_ie(hmac_vap_stru * hmac_vap,osal_u8 * buf,osal_u8 * ie_len)322 OSAL_STATIC osal_u32 hmac_csa_ap_encap_csa_ie(hmac_vap_stru *hmac_vap, osal_u8 *buf, osal_u8 *ie_len)
323 {
324 osal_u8 len = 0;
325 hmac_csa_ap_info_stru *ap_csa_info = hmac_csa_ap_get_vap_info(hmac_vap->vap_id);
326 osal_u8 *buffer = buf;
327
328 *ie_len = 0;
329 /* 开始封装信道切换所需的各种IE */
330 /* 封装CSA IE */
331 if (hmac_csa_ap_set_channel_ie(ap_csa_info->csa_mode, ap_csa_info->announced_channel,
332 ap_csa_info->ch_switch_cnt, buffer, &len) != OAL_SUCC) {
333 *ie_len = 0;
334 return OAL_FAIL;
335 }
336 buffer += len;
337 *ie_len += len;
338
339 len = 0;
340 hmac_csa_ap_set_bw_ie(hmac_vap, buffer, &len);
341 buffer += len;
342
343 *ie_len += len;
344
345 return OAL_SUCC;
346 }
347
hmac_csa_ap_encap_beacon_csa_ie(hmac_vap_stru * hmac_vap,osal_u8 * buffer,osal_u8 * ie_len)348 OSAL_STATIC osal_void hmac_csa_ap_encap_beacon_csa_ie(hmac_vap_stru *hmac_vap, osal_u8 *buffer, osal_u8 *ie_len)
349 {
350 hmac_csa_ap_info_stru *ap_csa_info = OSAL_NULL;
351
352 if (hmac_vap_mode_param_check(hmac_vap) != OSAL_TRUE || osal_unlikely(ie_len == OSAL_NULL)) {
353 return;
354 }
355
356 *ie_len = 0;
357
358 ap_csa_info = hmac_csa_ap_get_vap_info(hmac_vap->vap_id);
359 if (osal_unlikely(ap_csa_info == OSAL_NULL)) {
360 return;
361 }
362
363 if (ap_csa_info->csa_present_in_bcn != OSAL_TRUE) {
364 return;
365 }
366
367 hmac_csa_ap_encap_csa_ie(hmac_vap, buffer, ie_len);
368 }
369
370 /*****************************************************************************
371 函 数 名 : hmac_ap_encap_csa_action
372 功能描述 : 封装channel switch announcement action 管理帧
373 *****************************************************************************/
hmac_ap_encap_csa_action(hmac_vap_stru * hmac_vap,oal_netbuf_stru * buffer)374 OSAL_STATIC osal_u16 hmac_ap_encap_csa_action(hmac_vap_stru *hmac_vap, oal_netbuf_stru *buffer)
375 {
376 osal_u8 len = 0;
377 osal_u8 *mac_header = oal_netbuf_header(buffer);
378 osal_u8 *payload_addr = oal_netbuf_data_offset(buffer, MAC_80211_FRAME_LEN);
379 osal_u8 *payload_addr_origin = payload_addr;
380 osal_u16 frame_length;
381
382 /*************************************************************************/
383 /* Management Frame Format */
384 /* -------------------------------------------------------------------- */
385 /* |Frame Control|Duration|DA|SA|BSSID|Sequence Control|Frame Body|FCS| */
386 /* -------------------------------------------------------------------- */
387 /* | 2 |2 |6 |6 |6 |2 |0 - 2312 |4 | */
388 /* -------------------------------------------------------------------- */
389 /* */
390 /*************************************************************************/
391 /*************************************************************************/
392 /* Set the fields in the frame header */
393 /*************************************************************************/
394 /* 帧控制字段全为0,除了type和subtype */
395 mac_hdr_set_frame_control(mac_header, WLAN_PROTOCOL_VERSION | WLAN_FC0_TYPE_MGT | WLAN_FC0_SUBTYPE_ACTION);
396
397 /* 设置分片序号为0 */
398 mac_hdr_set_fragment_number(mac_header, 0);
399
400 /* 设置地址1,广播地址 */
401 oal_set_mac_addr(mac_header + WLAN_HDR_ADDR1_OFFSET, BROADCAST_MACADDR);
402
403 /* 设置地址2为自己的MAC地址 */
404 oal_set_mac_addr(mac_header + WLAN_HDR_ADDR2_OFFSET, hmac_vap->bssid);
405
406 /* 地址3,为VAP自己的MAC地址 */
407 oal_set_mac_addr(mac_header + WLAN_HDR_ADDR3_OFFSET, hmac_vap->bssid);
408
409 /*************************************************************************/
410 /* Set the fields in the frame body */
411 /*************************************************************************/
412 /*************************************************************************/
413 /* Channel Switch Announcement Frame - Frame Body */
414 /* --------------------------------------------------------------------- */
415 /* |Category |Action |Ch switch IE| 2nd Ch offset|Wide bw IE (11ac only) */
416 /* --------------------------------------------------------------------- */
417 /* |1 |1 | 5 | 3 |5 */
418 /* --------------------------------------------------------------------- */
419 /* */
420 /*************************************************************************/
421 /* 设置Action的Category */
422 /* 0: Spectrum Management */
423 payload_addr[0] = 0;
424
425 /* 设置Spectrum Management Action Field */
426 /* 4: Channel Switch Announcement Frame */
427 payload_addr[1] = 4;
428
429 payload_addr += 2; /* 2表示定位到信息元素ACTION位之后的数据 */
430
431 if (hmac_csa_ap_encap_csa_ie(hmac_vap, payload_addr, &len) != OAL_SUCC) {
432 oam_error_log0(0, OAM_SF_SCAN, "hmac_ap_encap_csa_action: build csa ie failed!");
433 return 0;
434 }
435 payload_addr += len;
436
437 frame_length = ((osal_u16)(payload_addr - payload_addr_origin) + MAC_80211_FRAME_LEN);
438
439 oam_warning_log2(0, OAM_SF_DFS, "vap_id[%d] {hmac_ap_encap_csa_action::LEN = %d.}",
440 hmac_vap->vap_id, frame_length);
441
442 return frame_length;
443 }
444
445 /*****************************************************************************
446 函 数 名 : hmac_ap_send_csa_action
447 功能描述 : 发送信道切换广播管理帧
448 *****************************************************************************/
hmac_ap_send_csa_action(hmac_vap_stru * hmac_vap)449 OSAL_STATIC osal_u32 hmac_ap_send_csa_action(hmac_vap_stru *hmac_vap)
450 {
451 oal_netbuf_stru *mgmt_buf = OSAL_NULL;
452 osal_u16 mgmt_len;
453 mac_tx_ctl_stru *tx_ctl = OSAL_NULL;
454 osal_u32 ret;
455
456 if (hmac_vap == OSAL_NULL) {
457 oam_error_log0(0, OAM_SF_SCAN, "{hmac_ap_send_csa_action::hmac_vap null.}");
458
459 return OAL_ERR_CODE_PTR_NULL;
460 }
461
462 /* 至少应该是HT(11n)才能发送该帧 */
463 if (mac_mib_get_high_throughput_option_implemented(hmac_vap) != OSAL_TRUE) {
464 oam_error_log1(0, OAM_SF_SCAN, "vap_id[%d] {hmac_ap_send_csa_action::vap not in HT mode.}",
465 hmac_vap->vap_id);
466 return OAL_FAIL;
467 }
468
469 /* 申请管理帧内存 */
470 mgmt_buf = oal_netbuf_alloc_ext(WLAN_MGMT_NETBUF_SIZE);
471 if (mgmt_buf == OSAL_NULL) {
472 /* 信道切换action帧没有发送成功,对acs以外的业务引起的带宽切换并无影响。beacon帧中也有信道切换信息。下同 */
473 oam_warning_log1(0, OAM_SF_SCAN,
474 "vap_id[%d] {hmac_ap_send_csa_action::mgmt_buf null.}", hmac_vap->vap_id);
475 return OAL_ERR_CODE_PTR_NULL;
476 }
477
478 oal_set_netbuf_prev(mgmt_buf, OSAL_NULL);
479 oal_set_netbuf_next(mgmt_buf, OSAL_NULL);
480
481 /* 封装 Channel Switch Announcement 帧 */
482 mgmt_len = hmac_ap_encap_csa_action(hmac_vap, mgmt_buf);
483 if (mgmt_len == 0) {
484 hmac_dft_print_drop_frame_info(THIS_FILE_ID, __LINE__, 1, OSAL_NULL);
485 oal_netbuf_free(mgmt_buf);
486 oam_error_log0(0, OAM_SF_SCAN, "{hmac_ap_send_csa_action::encap csa action failed.}");
487 return OAL_FAIL;
488 }
489
490 /* 填写netbuf的cb字段,供发送管理帧和发送完成接口使用 */
491 tx_ctl = (mac_tx_ctl_stru *)oal_netbuf_cb(mgmt_buf);
492 tx_ctl->tx_user_idx = (osal_u8)hmac_vap->multi_user_idx; /* channel switch帧是广播帧 */
493 tx_ctl->ismcast = OSAL_TRUE;
494 tx_ctl->ac = WLAN_WME_AC_MGMT;
495
496 /* 调用发送管理帧接口 */
497 ret = hmac_tx_mgmt(hmac_vap, mgmt_buf, mgmt_len, OSAL_FALSE);
498 if (ret != OAL_SUCC) {
499 oal_netbuf_free(mgmt_buf);
500 oam_warning_log1(0, OAM_SF_SCAN,
501 "vap_id[%d] {hmac_ap_send_csa_action::tx csa action failed.}", hmac_vap->vap_id);
502 return ret;
503 }
504 return OAL_SUCC;
505 }
506
hmac_csa_ap_tbtt_event(osal_void * notify_data)507 OSAL_STATIC osal_bool hmac_csa_ap_tbtt_event(osal_void *notify_data)
508 {
509 hmac_vap_stru *hmac_vap = (hmac_vap_stru *)notify_data;
510 hmac_csa_ap_info_stru *ap_csa_info = hmac_csa_ap_get_vap_info(hmac_vap->vap_id);
511
512 if (hmac_vap->vap_mode != WLAN_VAP_MODE_BSS_AP) {
513 return OSAL_TRUE;
514 }
515
516 if (osal_unlikely(ap_csa_info == OSAL_NULL)) {
517 return OSAL_TRUE;
518 }
519
520 /* AP准备进行信道切换 */
521 if (ap_csa_info->ch_switch_status != WLAN_CH_SWITCH_STATUS_1) {
522 return OSAL_TRUE;
523 }
524
525 if (ap_csa_info->delay_update_switch_cnt == OSAL_TRUE) {
526 ap_csa_info->delay_update_switch_cnt = OSAL_FALSE;
527 } else if (ap_csa_info->ch_switch_cnt != 0) {
528 /* Beacon帧中Channel Switch Count做递减操作 */
529 ap_csa_info->ch_switch_cnt--;
530 }
531
532 if (ap_csa_info->ch_switch_cnt == 0) {
533 osal_u8 null_addr[6] = {0}; /* index 6 */
534 /* 在当前信道挂起beacon帧发送 */
535 mac_vap_pause_tx(hmac_vap);
536 hal_vap_beacon_suspend(hmac_vap->hal_vap);
537 hal_set_machw_tx_suspend();
538 /* 去除Beacon帧中的Channel Switch IE信息 */
539 ap_csa_info->csa_present_in_bcn = OSAL_FALSE;
540 ap_csa_info->delay_update_switch_cnt = OSAL_FALSE;
541 ap_csa_info->ch_switch_status = WLAN_CH_SWITCH_DONE;
542 (osal_void)memcpy_s(hmac_vap->bssid, WLAN_MAC_ADDR_LEN, null_addr, WLAN_MAC_ADDR_LEN);
543 hmac_chan_attempt_new_chan(hmac_vap, ap_csa_info->announced_channel, ap_csa_info->announced_bandwidth);
544 }
545
546 return OSAL_TRUE;
547 }
548
hmac_csa_ap_vap_add(osal_void * notify_data)549 OSAL_STATIC osal_bool hmac_csa_ap_vap_add(osal_void *notify_data)
550 {
551 hmac_vap_stru *hmac_vap = (hmac_vap_stru *)notify_data;
552 osal_void *mem_ptr = OSAL_NULL;
553 osal_u8 vap_id = hmac_vap->vap_id;
554 if (vap_id >= WLAN_VAP_MAX_NUM_PER_DEVICE_LIMIT) {
555 return OSAL_FALSE;
556 }
557
558 if (hmac_vap->vap_mode != WLAN_VAP_MODE_BSS_AP) {
559 return OSAL_TRUE;
560 }
561
562 if (g_csa_ap_vapinfo[vap_id] != OSAL_NULL) {
563 oam_warning_log1(0, OAM_SF_CSA, "vap_id[%d] hmac_csa_ap_vap_add mem already malloc!", vap_id);
564 return OSAL_TRUE;
565 }
566
567 mem_ptr = oal_mem_alloc(OAL_MEM_POOL_ID_LOCAL, sizeof(hmac_csa_ap_info_stru), OAL_TRUE);
568 if (mem_ptr == OSAL_NULL) {
569 oam_error_log1(0, OAM_SF_CSA, "vap_id[%d] hmac_csa_ap_vap_add malloc null!", vap_id);
570 return OSAL_FALSE;
571 }
572
573 (osal_void)memset_s(mem_ptr, sizeof(hmac_csa_ap_info_stru), 0, sizeof(hmac_csa_ap_info_stru));
574 g_csa_ap_vapinfo[vap_id] = (hmac_csa_ap_info_stru *)mem_ptr;
575
576 return OSAL_TRUE;
577 }
578
hmac_csa_ap_vap_del(osal_void * notify_data)579 OSAL_STATIC osal_bool hmac_csa_ap_vap_del(osal_void *notify_data)
580 {
581 hmac_vap_stru *hmac_vap = (hmac_vap_stru *)notify_data;
582 osal_u8 vap_id = hmac_vap->vap_id;
583
584 if (vap_id >= WLAN_VAP_MAX_NUM_PER_DEVICE_LIMIT) {
585 return OSAL_FALSE;
586 }
587
588 if (hmac_vap->vap_mode != WLAN_VAP_MODE_BSS_AP) {
589 return OSAL_TRUE;
590 }
591
592 if (g_csa_ap_vapinfo[vap_id] == OSAL_NULL) {
593 oam_warning_log1(0, OAM_SF_CSA, "vap_id[%d] hmac_csa_ap_vap_del mem already free!", vap_id);
594 return OSAL_TRUE;
595 }
596
597 oal_mem_free((osal_void *)g_csa_ap_vapinfo[vap_id], OAL_TRUE);
598 g_csa_ap_vapinfo[vap_id] = OSAL_NULL;
599
600 return OSAL_TRUE;
601 }
602
603 #ifdef _PRE_WLAN_SUPPORT_CCPRIV_CMD
604 /*****************************************************************************
605 功能描述 : 设置CSA的控制参数
606 *****************************************************************************/
hmac_csa_set_control_param(hmac_vap_stru * hmac_vap,mac_protocol_debug_switch_stru * protocol_debug)607 OSAL_STATIC osal_s32 hmac_csa_set_control_param(hmac_vap_stru *hmac_vap, mac_protocol_debug_switch_stru *protocol_debug)
608 {
609 hmac_csa_ap_info_stru *ap_csa_info = hmac_csa_ap_get_vap_info(hmac_vap->vap_id);
610
611 if (protocol_debug == OSAL_NULL || ap_csa_info == OSAL_NULL) {
612 oam_warning_log1(0, OAM_SF_CFG, "vap_id[%d] {hmac_csa_set_control_param::param is NULL!}", hmac_vap->vap_id);
613 return OAL_FAIL;
614 }
615
616 /* BIT0:band_force_switch, BIT1:2040_ch_swt_prohi, BIT2:40_intol, BIT3: CSA, BIT4:lsig */
617 if ((protocol_debug->cmd_bit_map & BIT3) != 0) {
618 oam_warning_log4(0, OAM_SF_CFG,
619 "{hmac_csa_set_control_param::csa_mode=[%d],csa_channel=[%d],csa_cnt=[%d],debuf_flag=[%d].",
620 protocol_debug->csa_debug_bit3.mode, protocol_debug->csa_debug_bit3.channel,
621 protocol_debug->csa_debug_bit3.cnt, protocol_debug->csa_debug_bit3.debug_flag);
622 if (protocol_debug->csa_debug_bit3.debug_flag == MAC_CSA_FLAG_CANCLE_DEBUG) {
623 ap_csa_info->csa_present_in_bcn = OSAL_FALSE;
624 ap_csa_info->ch_switch_status = WLAN_CH_SWITCH_DONE;
625 } else if (protocol_debug->csa_debug_bit3.debug_flag == MAC_CSA_FLAG_START_DEBUG) {
626 ap_csa_info->announced_channel = protocol_debug->csa_debug_bit3.channel;
627 ap_csa_info->csa_mode = protocol_debug->csa_debug_bit3.mode;
628 ap_csa_info->ch_switch_cnt = protocol_debug->csa_debug_bit3.cnt;
629 ap_csa_info->csa_present_in_bcn = OSAL_TRUE;
630 ap_csa_info->ch_switch_status = WLAN_CH_SWITCH_DONE;
631 } else {
632 return OAL_SUCC;
633 }
634 if (hmac_vap->beacon_buffer != OSAL_NULL) {
635 hmac_encap_beacon(hmac_vap, oal_netbuf_header(hmac_vap->beacon_buffer));
636 }
637 }
638
639 return OAL_SUCC;
640 }
641
hmac_config_csa_channel_check(hmac_vap_stru * hmac_vap,mac_protocol_debug_switch_stru * protocol_debug)642 static osal_s32 hmac_config_csa_channel_check(hmac_vap_stru *hmac_vap,
643 mac_protocol_debug_switch_stru *protocol_debug)
644 {
645 #ifdef _PRE_WLAN_FEATURE_DFS
646 osal_u8 idx;
647 osal_u32 ul_ret;
648 hmac_device_stru *dev = hmac_res_get_mac_dev_etc(hmac_vap->device_id);
649 #endif
650
651 if (hmac_is_channel_num_valid_etc(hmac_vap->channel.band,
652 protocol_debug->csa_debug_bit3.channel) != OAL_SUCC) {
653 oam_warning_log1(0, OAM_SF_CFG, "{hmac_config_csa_channel_check::hmac_is_channel_num_valid_etc(%d),return.",
654 protocol_debug->csa_debug_bit3.channel);
655 return OAL_FAIL;
656 }
657 #ifdef _PRE_WLAN_FEATURE_DFS
658 /* 2.4G不需要信道状态校验 */
659 if (hmac_vap->channel.band == WLAN_BAND_2G) {
660 return OAL_SUCC;
661 }
662
663 ul_ret = hmac_get_channel_idx_from_num_etc(hmac_vap->channel.band,
664 protocol_debug->csa_debug_bit3.channel, &idx);
665 if (ul_ret != OAL_SUCC) {
666 oam_warning_log1(0, OAM_SF_CFG, "{hmac_config_csa_channel_check::hmac_is_channel_num_valid_etc(%d),return.",
667 protocol_debug->csa_debug_bit3.channel);
668 return OAL_FAIL;
669 }
670 /* 5G频段需要验证该信道是否可用 */
671 if ((dev->ap_channel_list[idx].ch_status == MAC_CHAN_NOT_SUPPORT) ||
672 (dev->ap_channel_list[idx].ch_status == MAC_CHAN_BLOCK_DUE_TO_RADAR)) {
673 oam_warning_log1(0, OAM_SF_CFG,
674 "{hmac_config_csa_channel_check::The channel is invalid or radar is detected.(%d),return.",
675 protocol_debug->csa_debug_bit3.channel);
676 return OAL_FAIL;
677 }
678 /* 检查信道是否为雷达信道且存在dbac */
679 if (hmac_is_dfs_with_dbac_check(hmac_vap, dev, protocol_debug->csa_debug_bit3.channel)) {
680 oam_warning_log1(0, OAM_SF_CFG,
681 "{hmac_config_csa_channel_check::The channel(%d) is a radar channel and dbac exists. ",
682 protocol_debug->csa_debug_bit3.channel);
683 return OAL_FAIL;
684 }
685 #endif
686 return OAL_SUCC;
687 }
688
hmac_config_csa_bandwidth_check(hmac_vap_stru * hmac_vap,mac_protocol_debug_switch_stru * protocol_debug)689 static osal_s32 hmac_config_csa_bandwidth_check(hmac_vap_stru *hmac_vap,
690 mac_protocol_debug_switch_stru *protocol_debug)
691 {
692 /* 根据device能力对参数进行检查 */
693 if (((protocol_debug->csa_debug_bit3.en_bandwidth >= WLAN_BAND_WIDTH_80PLUSPLUS) &&
694 (mac_mib_get_dot11_vap_max_bandwidth(hmac_vap) < WLAN_BW_CAP_80M)) ||
695 ((protocol_debug->csa_debug_bit3.en_bandwidth >= WLAN_BAND_WIDTH_40PLUS) &&
696 (mac_mib_get_dot11_vap_max_bandwidth(hmac_vap) < WLAN_BW_CAP_40M))) {
697 protocol_debug->csa_debug_bit3.en_bandwidth =
698 hmac_vap_get_bandwith(hmac_vap, protocol_debug->csa_debug_bit3.en_bandwidth);
699
700 /* 设置指定带宽,但device能力不支持该带宽, 刷新成合适带宽做业务 */
701 oam_warning_log3(0, OAM_SF_CFG,
702 "vap_id[%d] {config_csa_param::not support this bw, new_bw=%d dot11_vap_max_bw=%d.}", hmac_vap->vap_id,
703 protocol_debug->csa_debug_bit3.en_bandwidth, mac_mib_get_dot11_vap_max_bandwidth(hmac_vap));
704 return OAL_ERR_CODE_CONFIG_BW_EXCEED;
705 }
706
707 if (!is_2g(hmac_vap) || hmac_vap->cap_flag.autoswitch_2040 == OAL_TRUE) {
708 return OAL_SUCC;
709 }
710
711 oam_info_log3(0, OAM_SF_CFG, "hmac_config_csa_bandwidth_check::csa_channel=%d bw=%d, vap bw=%d",
712 protocol_debug->csa_debug_bit3.channel, protocol_debug->csa_debug_bit3.en_bandwidth,
713 hmac_vap->channel.en_bandwidth);
714
715 /* 2.4G不支持20/40切换,csa也不允许改变vap频宽 */
716 if (hmac_vap->channel.en_bandwidth == WLAN_BAND_WIDTH_20M) {
717 protocol_debug->csa_debug_bit3.en_bandwidth = hmac_vap->channel.en_bandwidth;
718 } else if (hmac_vap->channel.en_bandwidth == WLAN_BAND_WIDTH_40PLUS ||
719 hmac_vap->channel.en_bandwidth == WLAN_BAND_WIDTH_40MINUS) {
720 /* 配置信道5~7,配置频宽40M,根据实际配置下发参数 */
721 if ((protocol_debug->csa_debug_bit3.channel >= HMAC_BW_40M_MIN_CHAN_IDX &&
722 protocol_debug->csa_debug_bit3.channel <= hmac_chan_get_bw_40m_max_chan_idx()) &&
723 (protocol_debug->csa_debug_bit3.en_bandwidth == WLAN_BAND_WIDTH_40PLUS ||
724 protocol_debug->csa_debug_bit3.en_bandwidth == WLAN_BAND_WIDTH_40MINUS)) {
725 return OAL_SUCC;
726 }
727
728 /* 配置信道<5或>7,修改下发的频宽参数为MINUS或PLUS */
729 if (protocol_debug->csa_debug_bit3.channel > hmac_chan_get_bw_40m_max_chan_idx()) {
730 protocol_debug->csa_debug_bit3.en_bandwidth = WLAN_BAND_WIDTH_40MINUS;
731 } else if (protocol_debug->csa_debug_bit3.channel < HMAC_BW_40M_MIN_CHAN_IDX) {
732 protocol_debug->csa_debug_bit3.en_bandwidth = WLAN_BAND_WIDTH_40PLUS;
733 } else {
734 protocol_debug->csa_debug_bit3.en_bandwidth = hmac_vap->channel.en_bandwidth;
735 }
736 } else {
737 return OAL_ERR_CODE_CONFIG_BW_EXCEED;
738 }
739 return OAL_SUCC;
740 }
741
742 /*****************************************************************************
743 函 数 名 : hmac_config_set_csa_param
744 功能描述 : 设置CSA的控制参数
745 *****************************************************************************/
hmac_config_set_csa_param(hmac_vap_stru * hmac_vap,mac_protocol_debug_switch_stru * protocol_debug)746 OSAL_STATIC osal_s32 hmac_config_set_csa_param(hmac_vap_stru *hmac_vap, mac_protocol_debug_switch_stru *protocol_debug)
747 {
748 osal_s32 ret = OAL_SUCC;
749 wlan_channel_bandwidth_enum_uint8 adapt_bandwidth;
750
751 /* BIT0:band_force_switch, BIT1:2040_ch_swt_prohi, BIT2:40_intol, BIT3: CSA, BIT4:lsig */
752 if ((protocol_debug->cmd_bit_map & BIT3) != BIT3) {
753 return OAL_FAIL;
754 }
755
756 if (!is_legacy_ap(hmac_vap) && !is_p2p_go(hmac_vap)) {
757 oam_warning_log1(0, OAM_SF_CFG, "vap_id[%d] {config_csa_param::vap mode is not ap,return.", hmac_vap->vap_id);
758 return OAL_SUCC;
759 }
760
761 ret = hmac_config_csa_channel_check(hmac_vap, protocol_debug);
762 if (ret != OAL_SUCC) {
763 return ret;
764 }
765
766 ret = hmac_config_csa_bandwidth_check(hmac_vap, protocol_debug);
767 if (ret != OAL_SUCC) {
768 return ret;
769 }
770
771 /* channel switch count若小于dtim_period,则设置为dtim_period */
772 if (protocol_debug->csa_debug_bit3.cnt < mac_mib_get_dot11_dtim_period(hmac_vap)) {
773 oam_warning_log3(0, OAM_SF_CFG, "vap_id[%d] {config_csa_param::cnt[%u] max bw[%u]}", hmac_vap->vap_id,
774 protocol_debug->csa_debug_bit3.cnt, mac_mib_get_dot11_vap_max_bandwidth(hmac_vap));
775 protocol_debug->csa_debug_bit3.cnt = (osal_u8)mac_mib_get_dot11_dtim_period(hmac_vap);
776 }
777
778 /* 检查设置的带宽模式是否合法,若非法,则自适应 */
779 adapt_bandwidth = hmac_regdomain_get_support_bw_mode(protocol_debug->csa_debug_bit3.en_bandwidth,
780 protocol_debug->csa_debug_bit3.channel);
781 oam_warning_log2(0, OAM_SF_CFG, "config_csa_param::csa_new_bandwidth=%d adapt_new_bandwidth=%d",
782 protocol_debug->csa_debug_bit3.en_bandwidth, adapt_bandwidth);
783 protocol_debug->csa_debug_bit3.en_bandwidth = adapt_bandwidth;
784
785 oam_warning_log4(0, OAM_SF_CFG, "config_set_csa_param::csa_mode=%d csa_channel=%d csa_cnt=%d debug_flag=%d \n",
786 protocol_debug->csa_debug_bit3.mode, protocol_debug->csa_debug_bit3.channel,
787 protocol_debug->csa_debug_bit3.cnt, protocol_debug->csa_debug_bit3.debug_flag);
788
789 if (protocol_debug->csa_debug_bit3.debug_flag == MAC_CSA_FLAG_NORMAL) {
790 hmac_csa_ap_switch_new_channel(hmac_vap, protocol_debug->csa_debug_bit3.channel,
791 protocol_debug->csa_debug_bit3.en_bandwidth, protocol_debug->csa_debug_bit3.mode,
792 protocol_debug->csa_debug_bit3.cnt);
793 return OAL_SUCC;
794 }
795
796 /***************************************************************************
797 直调接口同步MAC数据, 替代之前的抛事件到DMAC层
798 ***************************************************************************/
799 ret = hmac_csa_set_control_param(hmac_vap, protocol_debug);
800 if (osal_unlikely(ret != OAL_SUCC)) {
801 oam_warning_log1(0, OAM_SF_CFG, "{config_csa_param::hmac_csa_set_control_param fail[%d].", ret);
802 }
803
804 return ret;
805 }
806
807 /* 解析csa命令参数 */
hmac_parse_csa_cmd(const osal_s8 * param,mac_protocol_debug_switch_stru * info)808 OSAL_STATIC osal_u32 hmac_parse_csa_cmd(const osal_s8 *param, mac_protocol_debug_switch_stru *info)
809 {
810 osal_u32 ret, value;
811 osal_s8 str[WAL_CCPRIV_CMD_NAME_MAX_LEN] = {0};
812
813 /* 解析csa mode , 1: param num should be 1 */
814 ret = (osal_u32)hmac_ccpriv_get_digit_with_check_max(¶m, 1, &value);
815 if (ret != OAL_SUCC) {
816 wifi_printf("Error: csa mode %d error!\n", value);
817 oam_warning_log0(0, OAM_SF_CFG, "{wal_parse_csa_cmd::csa mode invalid.}");
818 return ret;
819 }
820 info->csa_debug_bit3.mode = (osal_bool)value;
821
822 /* 解析csa channel */
823 ret = (osal_u32)hmac_ccpriv_get_one_arg(¶m, str, OAL_SIZEOF(str));
824 if (ret != OAL_SUCC) {
825 wifi_printf("Error: csa channel %s error!\n", str);
826 oam_warning_log0(0, OAM_SF_CFG, "{wal_parse_csa_cmd::get csa channel error.}");
827 return ret;
828 }
829
830 info->csa_debug_bit3.channel = (osal_u8)oal_atoi((const osal_s8 *)str);
831
832 /* 解析bandwidth */
833 ret = (osal_u32)hmac_ccpriv_get_digit_with_check_max(¶m, WLAN_BAND_WIDTH_BUTT - 1, &value);
834 if (ret != OAL_SUCC) {
835 oam_warning_log0(0, OAM_SF_CFG, "{wal_parse_csa_cmd::get bandwidth error.}");
836 return ret;
837 }
838 info->csa_debug_bit3.en_bandwidth = (wlan_channel_bandwidth_enum_uint8)value;
839
840 /* 解析csa cnt, 255: max csa cnt */
841 ret = (osal_u32)hmac_ccpriv_get_digit_with_check_max(¶m, 255, &value);
842 if (ret != OAL_SUCC) {
843 oam_warning_log0(0, OAM_SF_CFG, "{wal_parse_csa_cmd::get csa cnt error.}");
844 return ret;
845 }
846 info->csa_debug_bit3.cnt = (osal_u8)value;
847
848 /* 解析debug flag */
849 ret = (osal_u32)hmac_ccpriv_get_digit_with_check_max(¶m, MAC_CSA_FLAG_BUTT - 1, &value);
850 if (ret != OAL_SUCC) {
851 oam_warning_log0(0, OAM_SF_CFG, "{wal_parse_csa_cmd::get debug flag error.}");
852 return ret;
853 }
854
855 info->csa_debug_bit3.debug_flag = (mac_csa_flag_enum_uint8)value;
856
857 return OAL_SUCC;
858 }
859
860 /*****************************************************************************
861 功能描述 : 打印csa调试命令的格式
862 *****************************************************************************/
print_csa_cmd_format(osal_void)863 static inline osal_void print_csa_cmd_format(osal_void)
864 {
865 oam_warning_log0(0, OAM_SF_ANY, "{CMD format::sh ccpriv.sh 'wlan0 protocol_debug\
866 [csa 0(csa mode) 1(csa channel) 10(csa cnt) 1(debug flag,0:normal channel channel,\
867 1:only include csa ie 2:cannel debug)]}");
868 }
869
hmac_ccpriv_csa_ctrl(hmac_vap_stru * hmac_vap,const osal_s8 * param)870 OSAL_STATIC osal_s32 hmac_ccpriv_csa_ctrl(hmac_vap_stru *hmac_vap, const osal_s8 *param)
871 {
872 mac_protocol_debug_switch_stru protocol_debug;
873 osal_s32 ret;
874
875 memset_s(&protocol_debug, OAL_SIZEOF(protocol_debug), 0, OAL_SIZEOF(protocol_debug));
876
877 ret = (osal_s32)hmac_parse_csa_cmd(param, &protocol_debug);
878 if (ret != OAL_SUCC) {
879 print_csa_cmd_format();
880 return ret;
881 }
882
883 protocol_debug.cmd_bit_map |= BIT3;
884
885 oam_warning_log1(0, OAM_SF_ANY, "{uapi_ccpriv_csa_ctrl::cmd_bit_map: 0x%08x.}",
886 protocol_debug.cmd_bit_map);
887
888 oam_warning_log4(0, OAM_SF_ANY,
889 "{hmac_ccpriv_csa_ctrl::csa_mode=[%d],csa_channel=[%d],csa_cnt=[%d],debuf_flag=[%d].",
890 protocol_debug.csa_debug_bit3.mode, protocol_debug.csa_debug_bit3.channel,
891 protocol_debug.csa_debug_bit3.cnt, protocol_debug.csa_debug_bit3.debug_flag);
892
893 if (protocol_debug.csa_debug_bit3.debug_flag != MAC_CSA_FLAG_NORMAL) {
894 wifi_printf("Error: invalid flag para[%d]!\r\n", protocol_debug.csa_debug_bit3.debug_flag);
895 oam_warning_log1(0, OAM_SF_ANY, "{hmac_ccpriv_csa_ctrl::invalid flag para[%d]}",
896 protocol_debug.csa_debug_bit3.debug_flag);
897 return OAL_ERR_CODE_INVALID_CONFIG;
898 }
899 /* hmac消息处理函数 */
900 ret = hmac_config_set_csa_param(hmac_vap, &protocol_debug);
901 if (ret != OAL_SUCC) {
902 wifi_printf("fail::ret %d\r\n", ret);
903 return ret;
904 }
905
906 wifi_printf("OK\r\n");
907 return OAL_SUCC;
908 }
909 #endif
910
hmac_csa_ap_init(osal_void)911 osal_u32 hmac_csa_ap_init(osal_void)
912 {
913 frw_util_notifier_register(WLAN_UTIL_NOTIFIER_EVENT_ADD_VAP, hmac_csa_ap_vap_add);
914 frw_util_notifier_register(WLAN_UTIL_NOTIFIER_EVENT_DEL_VAP, hmac_csa_ap_vap_del);
915 frw_util_notifier_register(WLAN_UTIL_NOTIFIER_EVENT_TBTT_HANDLE, hmac_csa_ap_tbtt_event);
916
917 /* 对外接口注册 */
918 hmac_feature_hook_register(HMAC_FHOOK_CSA_AP_IS_SWITCH, hmac_csa_ap_is_ch_switch);
919 hmac_feature_hook_register(HMAC_FHOOK_CSA_AP_ENCAP_BEACON_CSA_IE, hmac_csa_ap_encap_beacon_csa_ie);
920 hmac_feature_hook_register(HMAC_FHOOK_CSA_AP_CSA_PRESENT_IN_BCN, hmac_csa_ap_csa_present_in_bcn);
921 hmac_feature_hook_register(HMAC_FHOOK_CSA_AP_SWITCH_NEW_CHANNEL, hmac_csa_ap_switch_new_channel);
922 #ifdef _PRE_WLAN_SUPPORT_CCPRIV_CMD
923 hmac_ccpriv_register((const osal_s8 *)"csa_ctrl", hmac_ccpriv_csa_ctrl);
924 #endif
925
926 return OAL_SUCC;
927 }
928
hmac_csa_ap_deinit(osal_void)929 osal_void hmac_csa_ap_deinit(osal_void)
930 {
931 frw_util_notifier_unregister(WLAN_UTIL_NOTIFIER_EVENT_ADD_VAP, hmac_csa_ap_vap_add);
932 frw_util_notifier_unregister(WLAN_UTIL_NOTIFIER_EVENT_DEL_VAP, hmac_csa_ap_vap_del);
933 frw_util_notifier_unregister(WLAN_UTIL_NOTIFIER_EVENT_TBTT_HANDLE, hmac_csa_ap_tbtt_event);
934
935 /* 对外接口去注册 */
936 hmac_feature_hook_unregister(HMAC_FHOOK_CSA_AP_IS_SWITCH);
937 hmac_feature_hook_unregister(HMAC_FHOOK_CSA_AP_ENCAP_BEACON_CSA_IE);
938 hmac_feature_hook_unregister(HMAC_FHOOK_CSA_AP_CSA_PRESENT_IN_BCN);
939 hmac_feature_hook_unregister(HMAC_FHOOK_CSA_AP_SWITCH_NEW_CHANNEL);
940 #ifdef _PRE_WLAN_SUPPORT_CCPRIV_CMD
941 hmac_ccpriv_unregister((const osal_s8 *)"csa_ctrl");
942 #endif
943
944 return;
945 }
946
947 #ifdef __cplusplus
948 #if __cplusplus
949 }
950 #endif
951 #endif
952