• 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: 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(&param, 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(&param, 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(&param, 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(&param, 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(&param, 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