• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2021 HiSilicon (Shanghai) Technologies CO., LIMITED.
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License
6  * as published by the Free Software Foundation; either version 2
7  * of the License, or (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
17  */
18 
19 /* ****************************************************************************
20   1 头文件包含
21 **************************************************************************** */
22 #include "oal_ext_if.h"
23 #include "oam_ext_if.h"
24 #include "hmac_ext_if.h"
25 #include "wal_main.h"
26 #include "wal_hipriv.h"
27 #include "wal_ioctl.h"
28 #include "wal_event_msg.h"
29 #include "wal_11d.h"
30 #include "net_adpater.h"
31 #include "oal_util.h"
32 #include "oal_net.h"
33 #include "oal_kernel_file.h"
34 #include "plat_pm_wlan.h"
35 #include "wal_customize.h"
36 #include "wal_cfg80211_apt.h"
37 #if (_PRE_OS_VERSION_LITEOS == _PRE_OS_VERSION)
38 #include "hi_wifi_mfg_test_if.h"
39 #endif
40 #include "hi_wifi_api.h"
41 #if (_PRE_OS_VERSION_LITEOS == _PRE_OS_VERSION)
42 #include "lwip/netifapi.h"
43 #endif
44 #include "plat_firmware.h"
45 
46 #ifdef __cplusplus
47 #if __cplusplus
48 extern "C" {
49 #endif
50 #endif
51 
52 #define hi_at_printf dprintf
53 
54 /* ****************************************************************************
55   2 全局变量定义
56 **************************************************************************** */
57 static hi_bool g_under_ps = HI_FALSE; /* 是否处于低功耗状态 */
58 static hi_u32 g_under_mfg = HI_FALSE; /* 是否处于产测状态 */
59 
60 #if (_PRE_OS_VERSION_LINUX == _PRE_OS_VERSION)
61 static oal_proc_dir_entry_stru *g_proc_entry = HI_NULL;
62 struct kobject *g_gp_sys_kobject = HI_NULL;
63 #ifdef _PRE_CONFIG_CONN_HISI_SYSFS_SUPPORT
64 static hi_ssize_t wal_hipriv_sys_write(oal_device_stru *dev, oal_device_attribute_stru *attr, const char *buf,
65     hi_size_t count);
66 static hi_ssize_t wal_hipriv_sys_read(oal_device_stru *dev, oal_device_attribute_stru *attr, char *buf);
67 static DEVICE_ATTR(hipriv, (S_IRUGO | S_IWUSR), wal_hipriv_sys_read, wal_hipriv_sys_write);
68 
69 static struct attribute *g_hipriv_sysfs_entries[] = {
70     &dev_attr_hipriv.attr,
71     HI_NULL
72 };
73 static struct attribute_group hipriv_attribute_group = {
74     .attrs = g_hipriv_sysfs_entries,
75 };
76 #endif
77 #endif
78 hi_u32 g_auto_rate_flag = 1; /* 自动速率调节默认打开 */
79 
80 static const hi_char *g_pauc_bw_tbl[WLAN_BAND_ASSEMBLE_AUTO] = {
81     "20",
82     "rsv1",
83     "rsv2",
84     "rsv3",
85     "rsv4",
86     "rsv5",
87     "rsv6",
88     "rsv7",
89     "rsv8",
90     "rsv9",
91     "rsv10",
92     "rsv11",
93     "rsv12",
94     "rsv13",
95     "rsv14",
96     "rsv15",
97     "5",
98     "10"
99 };
100 
101 static const hi_char *g_pauc_non_ht_rate_tbl[WLAN_LEGACY_RATE_VALUE_BUTT] = {
102     "1",
103     "2",
104     "5.5",
105     "11",
106     "rsv0",
107     "rsv1",
108     "rsv2",
109     "rsv3",
110     "48",
111     "24",
112     "12",
113     "6",
114     "54",
115     "36",
116     "18",
117     "9"
118 };
119 
120 #ifdef _PRE_WLAN_FEATURE_HIPRIV
121 static const wal_ioctl_alg_cfg_stru g_ast_alg_cfg_map[] = {
122     {"sch_vi_ctrl_ena",         MAC_ALG_CFG_SCHEDULE_VI_CTRL_ENA, {0}},
123     {"sch_bebk_minbw_ena",      MAC_ALG_CFG_SCHEDULE_BEBK_MIN_BW_ENA, {0}},
124     {"sch_mvap_sch_ena",        MAC_ALG_CFG_SCHEDULE_MVAP_SCH_ENA, {0}},
125     {"sch_vi_sch_ms",           MAC_ALG_CFG_SCHEDULE_VI_SCH_LIMIT, {0}},
126     {"sch_vo_sch_ms",           MAC_ALG_CFG_SCHEDULE_VO_SCH_LIMIT, {0}},
127     {"sch_vi_drop_ms",          MAC_ALG_CFG_SCHEDULE_VI_DROP_LIMIT, {0}},
128     {"sch_vi_ctrl_ms",          MAC_ALG_CFG_SCHEDULE_VI_CTRL_MS, {0}},
129     {"sch_vi_life_ms",          MAC_ALG_CFG_SCHEDULE_VI_MSDU_LIFE_MS, {0}},
130     {"sch_vo_life_ms",          MAC_ALG_CFG_SCHEDULE_VO_MSDU_LIFE_MS, {0}},
131     {"sch_be_life_ms",          MAC_ALG_CFG_SCHEDULE_BE_MSDU_LIFE_MS, {0}},
132     {"sch_bk_life_ms",          MAC_ALG_CFG_SCHEDULE_BK_MSDU_LIFE_MS, {0}},
133     {"sch_vi_low_delay",        MAC_ALG_CFG_SCHEDULE_VI_LOW_DELAY_MS, {0}},
134     {"sch_vi_high_delay",       MAC_ALG_CFG_SCHEDULE_VI_HIGH_DELAY_MS, {0}},
135     {"sch_cycle_ms",            MAC_ALG_CFG_SCHEDULE_SCH_CYCLE_MS, {0}},
136     {"sch_ctrl_cycle_ms",       MAC_ALG_CFG_SCHEDULE_TRAFFIC_CTRL_CYCLE, {0}},
137     {"sch_cir_nvip_kbps",       MAC_ALG_CFG_SCHEDULE_CIR_NVIP_KBPS, {0}},
138     {"sch_cir_nvip_be",         MAC_ALG_CFG_SCHEDULE_CIR_NVIP_KBPS_BE, {0}},
139     {"sch_cir_nvip_bk",         MAC_ALG_CFG_SCHEDULE_CIR_NVIP_KBPS_BK, {0}},
140     {"sch_cir_vip_kbps",        MAC_ALG_CFG_SCHEDULE_CIR_VIP_KBPS, {0}},
141     {"sch_cir_vip_be",          MAC_ALG_CFG_SCHEDULE_CIR_VIP_KBPS_BE, {0}},
142     {"sch_cir_vip_bk",          MAC_ALG_CFG_SCHEDULE_CIR_VIP_KBPS_BK, {0}},
143     {"sch_cir_vap_kbps",        MAC_ALG_CFG_SCHEDULE_CIR_VAP_KBPS, {0}},
144     {"sch_sm_delay_ms",         MAC_ALG_CFG_SCHEDULE_SM_TRAIN_DELAY, {0}},
145     {"sch_drop_pkt_limit",      MAC_ALG_CFG_VIDEO_DROP_PKT_LIMIT, {0}},
146     {"sch_flowctl_ena",         MAC_ALG_CFG_FLOWCTRL_ENABLE_FLAG, {0}},
147     {"sch_log_start",           MAC_ALG_CFG_SCHEDULE_LOG_START, {0}},
148     {"sch_log_end",             MAC_ALG_CFG_SCHEDULE_LOG_END, {0}},
149     {"sch_vap_prio",            MAC_ALG_CFG_SCHEDULE_VAP_SCH_PRIO, {0}},
150     /* 开启或关闭速率自适应算法: sh hipriv.sh "vap0 alg_cfg ar_enable [1|0]" */
151     {"ar_enable",               MAC_ALG_CFG_AUTORATE_ENABLE, {0}},
152     /* 开启或关闭使用最低速率: sh hipriv.sh "vap0 alg_cfg ar_use_lowest [1|0]" */
153     {"ar_use_lowest",           MAC_ALG_CFG_AUTORATE_USE_LOWEST_RATE, {0}},
154     /* 设置短期统计的包数目:sh hipriv.sh "vap0 alg_cfg ar_short_num [包数目]" */
155     {"ar_short_num",            MAC_ALG_CFG_AUTORATE_SHORT_STAT_NUM, {0}},
156     /* 设置短期统计的包位移值:sh hipriv.sh "vap0 alg_cfg ar_short_shift [位移值]" */
157     {"ar_short_shift",          MAC_ALG_CFG_AUTORATE_SHORT_STAT_SHIFT, {0}},
158     /* 设置长期统计的包数目:sh hipriv.sh "vap0 alg_cfg ar_long_num [包数目]" */
159     {"ar_long_num",             MAC_ALG_CFG_AUTORATE_LONG_STAT_NUM, {0}},
160     /* 设置长期统计的包位移值:sh hipriv.sh "vap0 alg_cfg ar_long_shift [位移值]" */
161     {"ar_long_shift",           MAC_ALG_CFG_AUTORATE_LONG_STAT_SHIFT, {0}},
162     /* 设置最小探测包间隔:sh hipriv.sh "vap0 alg_cfg ar_min_probe_no [包数目]" */
163     {"ar_min_probe_no",         MAC_ALG_CFG_AUTORATE_MIN_PROBE_INTVL_PKTNUM, {0}},
164     /* 设置最大探测包间隔:sh hipriv.sh "vap0 alg_cfg ar_max_probe_no [包数目]" */
165     {"ar_max_probe_no",         MAC_ALG_CFG_AUTORATE_MAX_PROBE_INTVL_PKTNUM, {0}},
166     /* 设置探测间隔保持次数:sh hipriv.sh "vap0 alg_cfg ar_keep_times [次数]" */
167     {"ar_keep_times",           MAC_ALG_CFG_AUTORATE_PROBE_INTVL_KEEP_TIMES, {0}},
168     /* 设置goodput突变门限(千分比,如300):sh hipriv.sh "vap0 alg_cfg ar_delta_ratio [千分比]" */
169     {"ar_delta_ratio",          MAC_ALG_CFG_AUTORATE_DELTA_GOODPUT_RATIO, {0}},
170     /* 设置vi的per门限(千分比,如300):sh hipriv.sh "vap0 alg_cfg ar_vi_per_limit [千分比]" */
171     {"ar_vi_per_limit",         MAC_ALG_CFG_AUTORATE_VI_PROBE_PER_LIMIT, {0}},
172     /* 设置vo的per门限(千分比,如300):sh hipriv.sh "vap0 alg_cfg ar_vo_per_limit [千分比]" */
173     {"ar_vo_per_limit",         MAC_ALG_CFG_AUTORATE_VO_PROBE_PER_LIMIT, {0}},
174     /* 设置ampdu的durattion值:sh hipriv.sh "vap0 alg_cfg ar_ampdu_time [时间值]" */
175     {"ar_ampdu_time",           MAC_ALG_CFG_AUTORATE_AMPDU_DURATION, {0}},
176     /* 设置mcs0的传输失败门限:sh hipriv.sh "vap0 alg_cfg ar_cont_loss_num [包数目]" */
177     {"ar_cont_loss_num",        MAC_ALG_CFG_AUTORATE_MCS0_CONT_LOSS_NUM, {0}},
178     /* 设置升回11b的rssi门限:sh hipriv.sh "vap0 alg_cfg ar_11b_diff_rssi [数值]" */
179     {"ar_11b_diff_rssi",        MAC_ALG_CFG_AUTORATE_UP_PROTOCOL_DIFF_RSSI, {0}},
180     /* 设置rts模式:sh hipriv.sh "vap0 alg_cfg ar_rts_mode [0(都不开)|1(都开)|2(rate[0]动态RTS, rate[1..3]
181        都开RTS)|3(rate[0]不开RTS, rate[1..3]都开RTS)]" */
182     {"ar_rts_mode",             MAC_ALG_CFG_AUTORATE_RTS_MODE, {0}},
183     /* 设置Legacy首包错误率门限:sh hipriv.sh "vap0 alg_cfg ar_legacy_loss [数值]" */
184     {"ar_legacy_loss",          MAC_ALG_CFG_AUTORATE_LEGACY_1ST_LOSS_RATIO_TH, {0}},
185     /* 设置Legacy首包错误率门限:sh hipriv.sh "vap0 alg_cfg ar_ht_vht_loss [数值]" */
186     {"ar_ht_vht_loss",          MAC_ALG_CFG_AUTORATE_HT_VHT_1ST_LOSS_RATIO_TH, {0}},
187     /* 开始速率统计日志:sh hipriv.sh "vap0 alg_cfg ar_stat_log_do [mac地址] [业务类别] [包数目]"
188        如: sh hipriv.sh "vap0 alg_cfg ar_stat_log_do 06:31:04:E3:81:02 1 1000" */
189     {"ar_stat_log_do",          MAC_ALG_CFG_AUTORATE_STAT_LOG_START, {0}},
190     /* 开始速率选择日志:sh hipriv.sh "vap0 alg_cfg ar_sel_log_do [mac地址] [业务类别] [包数目]"
191        如: sh hipriv.sh "vap0 alg_cfg ar_sel_log_do 06:31:04:E3:81:02 1 200" */
192     {"ar_sel_log_do",           MAC_ALG_CFG_AUTORATE_SELECTION_LOG_START, {0}},
193     /* 开始固定速率日志:sh hipriv.sh "vap0 alg_cfg ar_fix_log_do [mac地址] [tidno] [per门限]"
194        如: sh hipriv.sh "vap0 alg_cfg ar_sel_log_do 06:31:04:E3:81:02 1 200" */
195     {"ar_fix_log_do",           MAC_ALG_CFG_AUTORATE_FIX_RATE_LOG_START, {0}},
196     /* 开始聚合自适应日志:sh hipriv.sh "vap0 alg_cfg ar_fix_log_do [mac地址] [tidno]"
197        如: sh hipriv.sh "vap0 alg_cfg ar_sel_log_do 06:31:04:E3:81:02 1 " */
198     {"ar_aggr_log_do",          MAC_ALG_CFG_AUTORATE_AGGR_STAT_LOG_START, {0}},
199     /* 打印速率统计日志:sh hipriv.sh "vap0 alg_cfg ar_st_log_out 06:31:04:E3:81:02" */
200     {"ar_st_log_out",           MAC_ALG_CFG_AUTORATE_STAT_LOG_WRITE, {0}},
201     /* 打印速率选择日志:sh hipriv.sh "vap0 alg_cfg ar_sel_log_out 06:31:04:E3:81:02" */
202     {"ar_sel_log_out",          MAC_ALG_CFG_AUTORATE_SELECTION_LOG_WRITE, {0}},
203     /* 打印固定速率日志:sh hipriv.sh "vap0 alg_cfg ar_fix_log_out 06:31:04:E3:81:02" */
204     {"ar_fix_log_out",          MAC_ALG_CFG_AUTORATE_FIX_RATE_LOG_WRITE, {0}},
205     /* 打印固定速率日志:sh hipriv.sh "vap0 alg_cfg ar_fix_log_out 06:31:04:E3:81:02" */
206     {"ar_aggr_log_out",         MAC_ALG_CFG_AUTORATE_AGGR_STAT_LOG_WRITE, {0}},
207     /* 打印速率集合:sh hipriv.sh "vap0 alg_cfg ar_disp_rateset 06:31:04:E3:81:02" */
208     {"ar_disp_rateset",         MAC_ALG_CFG_AUTORATE_DISPLAY_RATE_SET, {0}},
209     /* 配置固定速率:sh hipriv.sh "vap0 alg_cfg ar_cfg_fix_rate 06:31:04:E3:81:02 0" */
210     {"ar_cfg_fix_rate",         MAC_ALG_CFG_AUTORATE_CONFIG_FIX_RATE, {0}},
211     /* 打印接收速率集合:sh hipriv.sh "vap0 alg_cfg ar_disp_rx_rate 06:31:04:E3:81:02" */
212     {"ar_disp_rx_rate",         MAC_ALG_CFG_AUTORATE_DISPLAY_RX_RATE, {0}},
213     /* 开启或关闭速率自适应日志: sh hipriv.sh "vap0 alg_cfg ar_log_enable [1|0]" */
214     {"ar_log_enable",           MAC_ALG_CFG_AUTORATE_LOG_ENABLE, {0}},
215     /* 设置最大的VO速率: sh hipriv.sh "vap0 alg_cfg ar_max_vo_rate [速率值]" */
216     {"ar_max_vo_rate",          MAC_ALG_CFG_AUTORATE_VO_RATE_LIMIT, {0}},
217     /* 设置深衰弱的per门限值: sh hipriv.sh "vap0 alg_cfg ar_fading_per_th [per门限值(千分数)]" */
218     {"ar_fading_per_th",        MAC_ALG_CFG_AUTORATE_JUDGE_FADING_PER_TH, {0}},
219     /* 设置聚合自适应开关: sh hipriv.sh "vap0 alg_cfg ar_aggr_opt [1|0]" */
220     {"ar_aggr_opt",             MAC_ALG_CFG_AUTORATE_AGGR_OPT, {0}},
221     /* 设置聚合自适应探测间隔: sh hipriv.sh "vap0 alg_cfg ar_aggr_pb_intvl [探测间隔]" */
222     {"ar_aggr_pb_intvl",        MAC_ALG_CFG_AUTORATE_AGGR_PROBE_INTVL_NUM, {0}},
223     /* 设置调试用的VI状态: sh hipriv.sh "vap0 alg_cfg ar_dbg_vi_status [0/1/2]" */
224     {"ar_dbg_vi_status",        MAC_ALG_CFG_AUTORATE_DBG_VI_STATUS, {0}},
225     /* 聚合自适应log开关: sh hipriv.sh "vap0 alg_cfg ar_dbg_aggr_log [0/1]" */
226     {"ar_dbg_aggr_log",         MAC_ALG_CFG_AUTORATE_DBG_AGGR_LOG, {0}},
227     /* 最优速率变化时不进行聚合探测的报文数: sh hipriv.sh "vap0 alg_cfg ar_aggr_pck_num [报文数]" */
228     {"ar_aggr_pck_num",         MAC_ALG_CFG_AUTORATE_AGGR_NON_PROBE_PCK_NUM, {0}},
229     /* 最小聚合时间索引: sh hipriv.sh "vap0 alg_cfg ar_aggr_min_idx [索引值]" */
230     {"ar_min_aggr_idx",         MAC_ALG_CFG_AUTORATE_AGGR_MIN_AGGR_TIME_IDX, {0}},
231     /* 设置最大聚合数目: sh hipriv.sh "vap0 alg_cfg ar_max_aggr_num [聚合数目]" */
232     {"ar_max_aggr_num",         MAC_ALG_CFG_AUTORATE_MAX_AGGR_NUM, {0}},
233     /* 设置最低阶MCS限制聚合为1的PER门限: sh hipriv.sh "vap0 alg_cfg ar_1mpdu_per_th [per门限值(千分数)]" */
234     {"ar_1mpdu_per_th",         MAC_ALG_CFG_AUTORATE_LIMIT_1MPDU_PER_TH, {0}},
235 
236     /* 开启或关闭共存探测机制: sh hipriv.sh "vap0 alg_cfg ar_btcoxe_probe [1|0]" */
237     {"ar_btcoxe_probe",         MAC_ALG_CFG_AUTORATE_BTCOEX_PROBE_ENABLE, {0}},
238     /* 开启或关闭共存聚合机制: sh hipriv.sh "vap0 alg_cfg ar_btcoxe_aggr [1|0]" */
239     {"ar_btcoxe_aggr",          MAC_ALG_CFG_AUTORATE_BTCOEX_AGGR_ENABLE, {0}},
240     /* 设置共存统计时间间隔参数: sh hipriv.sh "vap0 alg_cfg ar_coxe_intvl [统计周期ms]" */
241     {"ar_coxe_intvl",           MAC_ALG_CFG_AUTORATE_COEX_STAT_INTVL, {0}},
242     /* 设置共存abort低比例门限参数: sh hipriv.sh "vap0 alg_cfg ar_coxe_low_th [千分数]" */
243     {"ar_coxe_low_th",          MAC_ALG_CFG_AUTORATE_COEX_LOW_ABORT_TH, {0}},
244     /* 设置共存abort高比例门限参数: sh hipriv.sh "vap0 alg_cfg ar_coxe_high_th [千分数]" */
245     {"ar_coxe_high_th",         MAC_ALG_CFG_AUTORATE_COEX_HIGH_ABORT_TH, {0}},
246     /* 设置共存聚合数目为1的门限参数: sh hipriv.sh "vap0 alg_cfg ar_coxe_agrr_th [千分数]" */
247     {"ar_coxe_agrr_th",         MAC_ALG_CFG_AUTORATE_COEX_AGRR_NUM_ONE_TH, {0}},
248 
249     /* 动态带宽特性使能开关: sh hipriv.sh "vap0 alg_cfg ar_dyn_bw_en [0/1]" */
250     {"ar_dyn_bw_en",            MAC_ALG_CFG_AUTORATE_DYNAMIC_BW_ENABLE, {0}},
251     /* 吞吐量波动优化开关: sh hipriv.sh "vap0 alg_cfg ar_thpt_wave_opt [0/1]" */
252     {"ar_thpt_wave_opt",        MAC_ALG_CFG_AUTORATE_THRPT_WAVE_OPT, {0}},
253     /* 设置判断吞吐量波动的goodput差异比例门限(千分数): sh hipriv.sh "vap0 alg_cfg ar_gdpt_diff_th [goodput相差
254        比例门限(千分数)]" */
255     {"ar_gdpt_diff_th",         MAC_ALG_CFG_AUTORATE_GOODPUT_DIFF_TH, {0}},
256     /* 设置判断吞吐量波动的PER变差的门限(千分数): sh hipriv.sh "vap0 alg_cfg ar_per_worse_th [PER变差门限(千分数)]" */
257     {"ar_per_worse_th",         MAC_ALG_CFG_AUTORATE_PER_WORSE_TH, {0}},
258     /* 设置发RTS收到CTS但发DATA都不回BA的发送完成中断次数门限: sh hipriv.sh "vap0 alg_cfg ar_cts_no_ba_num [次数]" */
259     {"ar_cts_no_ack_num",       MAC_ALG_CFG_AUTORATE_RX_CTS_NO_BA_NUM, {0}},
260     /* 设置是否支持voice业务聚合: sh hipriv.sh "vap0 alg_cfg ar_vo_aggr [0/1]" */
261     {"ar_vo_aggr",              MAL_ALG_CFG_AUTORATE_VOICE_AGGR, {0}},
262     /* 设置快速平滑统计的平滑因子偏移量: sh hipriv.sh "vap0 alg_cfg ar_fast_smth_shft [偏移量]"
263        (取255表示取消快速平滑) */
264     {"ar_fast_smth_shft",       MAC_ALG_CFG_AUTORATE_FAST_SMOOTH_SHIFT, {0}},
265     /* 设置快速平滑统计的最小聚合数目门限: sh hipriv.sh "vap0 alg_cfg ar_fast_smth_aggr_num [最小聚合数目]" */
266     {"ar_fast_smth_aggr_num",   MAC_ALG_CFG_AUTORATE_FAST_SMOOTH_AGGR_NUM, {0}},
267     /* 设置short GI惩罚的PER门限值(千分数): sh hipriv.sh "vap0 alg_cfg ar_sgi_punish_per [PER门限值(千分数)]" */
268     {"ar_sgi_punish_per",       MAC_ALG_CFG_AUTORATE_SGI_PUNISH_PER, {0}},
269     /* 设置short GI惩罚的等待探测数目: sh hipriv.sh "vap0 alg_cfg ar_sgi_punish_num [等待探测数目]" */
270     {"ar_sgi_punish_num",       MAC_ALG_CFG_AUTORATE_SGI_PUNISH_NUM, {0}},
271     /* 设置VI业务保持速率的RSSI阈值: sh hipriv.sh "vap0 alg_cfg ar_vi_hold_rate_rssi_th [RSSI阈值]" */
272     {"ar_vi_hold_rate_rssi_th", MAC_ALG_CFG_AUTORATE_VI_HOLD_RATE_RSSI_TH, {0}},
273     /* 设置VI业务的保持速率: sh hipriv.sh "vap0 alg_cfg ar_vi_holding_rate [保持速率]" */
274     {"ar_vi_holding_rate",      MAC_ALG_CFG_AUTORATE_VI_HOLDING_RATE, {0}},
275     /* 弱干扰免疫中non-direct使能: sh hipriv.sh "vap0 alg_cfg anti_inf_imm_en 0|1" */
276     {"anti_inf_imm_en",         MAC_ALG_CFG_ANTI_INTF_IMM_ENABLE, {0}},
277     /* 弱干扰免疫中dynamic unlock使能: sh hipriv.sh "vap0 alg_cfg anti_inf_unlock_en 0|1" */
278     {"anti_inf_unlock_en",      MAC_ALG_CFG_ANTI_INTF_UNLOCK_ENABLE, {0}},
279     /* 弱干扰免疫中rssi统计周期: sh hipriv.sh "vap0 anti_inf_stat_time [time]" */
280     {"anti_inf_stat_time",      MAC_ALG_CFG_ANTI_INTF_RSSI_STAT_CYCLE, {0}},
281     /* 弱干扰免疫中unlock关闭周期: sh hipriv.sh "vap0 anti_inf_off_time [time]" */
282     {"anti_inf_off_time",       MAC_ALG_CFG_ANTI_INTF_UNLOCK_CYCLE, {0}},
283     /* 弱干扰免疫中unlock关闭持续时间: sh hipriv.sh "vap0 anti_inf_off_dur [time]" */
284     {"anti_inf_off_dur",        MAC_ALG_CFG_ANTI_INTF_UNLOCK_DUR_TIME, {0}},
285     /* 抗干扰nav免疫使能: sh hipriv.sh "vap0 alg_cfg anti_inf_nav_en 0|1" */
286     {"anti_inf_nav_en",         MAC_ALG_CFG_ANTI_INTF_NAV_IMM_ENABLE, {0}},
287     /* 弱干扰免疫goodput下降门限: sh hipriv.sh "vap0 alg_cfg anti_inf_gd_th [num]" */
288     {"anti_inf_gd_th",          MAC_ALG_CFG_ANTI_INTF_GOODPUT_FALL_TH, {0}},
289     /* 弱干扰免疫探测保持最大周期数: sh hipriv.sh "vap0 alg_cfg anti_inf_keep_max [num]" */
290     {"anti_inf_keep_max",       MAC_ALG_CFG_ANTI_INTF_KEEP_CYC_MAX_NUM, {0}},
291     /* 弱干扰免疫探测保持最大周期数: sh hipriv.sh "vap0 alg_cfg anti_inf_keep_min [num]" */
292     {"anti_inf_keep_min",       MAC_ALG_CFG_ANTI_INTF_KEEP_CYC_MIN_NUM, {0}},
293     /* 弱干扰免疫是否使能tx time探测: sh hipriv.sh "vap0 anti_inf_tx_pro_en 0|1" */
294     {"anti_inf_per_pro_en",     MAC_ALG_CFG_ANTI_INTF_PER_PROBE_EN, {0}},
295     /* tx time下降门限: sh hipriv.sh "vap0 alg_cfg anti_inf_txtime_th [val]" */
296     {"anti_inf_txtime_th",      MAC_ALG_CFG_ANTI_INTF_TX_TIME_FALL_TH, {0}},
297     /* per下降门限: sh hipriv.sh "vap0 alg_cfg anti_inf_per_th [val]" */
298     {"anti_inf_per_th",         MAC_ALG_CFG_ANTI_INTF_PER_FALL_TH, {0}},
299     /* goodput抖动门限: sh hipriv.sh "vap0 alg_cfg anti_inf_gd_jitter_th [val]" */
300     {"anti_inf_gd_jitter_th",   MAC_ALG_CFG_ANTI_INTF_GOODPUT_JITTER_TH, {0}},
301     /* 弱干扰免疫debug的打印信息: sh hipriv.sh "vap0 alg_cfg anti_inf_debug_mode 0|1|2" */
302     {"anti_inf_debug_mode",     MAC_ALG_CFG_ANTI_INTF_DEBUG_MODE, {0}},
303 
304     /* 同频干扰检测周期: sh hipriv.sh "vap0 alg_cfg edca_opt_co_ch_time [time]" */
305     {"edca_opt_co_ch_time",     MAC_ALG_CFG_EDCA_OPT_CO_CH_DET_CYCLE, {0}},
306     /* ap模式下edca优化使能模式: sh hipriv.sh "vap0 alg_cfg edca_opt_en_ap 0|1|2" */
307     {"edca_opt_en_ap",          MAC_ALG_CFG_EDCA_OPT_AP_EN_MODE, {0}},
308     /* sta模式下edca优化使能模式: sh hipriv.sh "vap0 alg_cfg edca_opt_en_sta 0|1" */
309     {"edca_opt_en_sta",         MAC_ALG_CFG_EDCA_OPT_STA_EN, {0}},
310     /* sta模式下edca优化的weighting系数: sh hipriv.sh "vap0 alg_cfg edca_opt_sta_weight 0~3" */
311     {"edca_opt_sta_weight",     MAC_ALG_CFG_EDCA_OPT_STA_WEIGHT, {0}},
312     /* non-direct包占空比门限 sh hipriv.sh "vap0 alg_cfg edca_opt_nondir_th [val]" */
313     {"edca_opt_nondir_th",      MAC_ALG_CFG_EDCA_OPT_NONDIR_TH, {0}},
314     /* ap模式下UDP业务对应包判别门限 sh hipriv.sh "vap0 alg_cfg edca_opt_th_udp [val]" */
315     {"edca_opt_th_udp",         MAC_ALG_CFG_EDCA_OPT_TH_UDP, {0}},
316     /* ap模式下tcP业务对应包判别门限 sh hipriv.sh "vap0 alg_cfg edca_opt_th_tcp [val]" */
317     {"edca_opt_th_tcp",         MAC_ALG_CFG_EDCA_OPT_TH_TCP, {0}},
318     /* 是否打印相关信息,仅用于本地版本调试 */
319     {"edca_opt_debug_mode",     MAC_ALG_CFG_EDCA_OPT_DEBUG_MODE, {0}},
320 
321     /* CCA优化功能使能: sh hipriv.sh "vap0 alg_cfg cca_opt_alg_en_mode 0|1" */
322     {"cca_opt_alg_en_mode",         MAC_ALG_CFG_CCA_OPT_ALG_EN_MODE, {0}},
323     /* CCA优化DEBUG模式启动: sh hipriv.sh "vap0 alg_cfg cca_opt_debug_mode 0|1" */
324     {"cca_opt_debug_mode",          MAC_ALG_CFG_CCA_OPT_DEBUG_MODE, {0}},
325     /* CCA优化T1计时周期:sh hipriv.sh "vap0 alg_cfg cca_opt_set_t1_counter_time [time]" */
326     {"cca_opt_set_t1_counter_time", MAC_ALG_CFG_CCA_OPT_SET_T1_COUNTER_TIME, {0}},
327     { "tpc_mode",                MAC_ALG_CFG_TPC_MODE, { 0 } }, /* 设置TPC工作模式 */
328     { "tpc_dbg",                 MAC_ALG_CFG_TPC_DEBUG, { 0 } }, /* 设置TPC的debug开关 */
329     /* 设置TPC功率等级(0,1,2,3), 在固定功率模式下使用 */
330     {"tpc_pow_lvl",             MAC_ALG_CFG_TPC_POWER_LEVEL, {0}},
331     /* 设置TPC的log开关:sh hipriv.sh "vap0 alg_cfg tpc_log 1 */
332     {"tpc_log",                 MAC_ALG_CFG_TPC_LOG, {0}},
333     /* 开始功率统计日志:sh hipriv.sh "vap0 alg_tpc_log tpc_stat_log_do [mac地址] [业务类别] [包数目]"
334        如: sh hipriv.sh "vap0 alg_tpc_log tpc_stat_log_do 06:31:04:E3:81:02 1 1000" */
335     {"tpc_stat_log_do",         MAC_ALG_CFG_TPC_STAT_LOG_START, {0}},
336     /* 打印功率统计日志:sh hipriv.sh "vap0 alg_tpc_log tpc_stat_log_out 06:31:04:E3:81:02" */
337     {"tpc_stat_log_out",        MAC_ALG_CFG_TPC_STAT_LOG_WRITE, {0}},
338     /* 开始每包统计日志:sh hipriv.sh "vap0 alg_tpc_log tpc_pkt_log_do [mac地址] [业务类别] [包数目]"
339        如: sh hipriv.sh "vap0 alg_tpc_log tpc_pkt_log_do 06:31:04:E3:81:02 1 1000" */
340     {"tpc_pkt_log_do",          MAC_ALG_CFG_TPC_PER_PKT_LOG_START, {0}},
341     /* 获取特殊帧功率:sh hipriv.sh "vap0 alg_tpc_log tpc_get_frame_pow beacon_pow" */
342     {"tpc_get_frame_pow",       MAC_ALG_CFG_TPC_GET_FRAME_POW, {0}},
343     { "tpc_mag_frm_pow_lvl",     MAC_ALG_CFG_TPC_MANAGEMENT_MCAST_FRM_POWER_LEVEL, { 0 } }, /* TPC管理帧和多播帧功率等级 */
344     { "tpc_ctl_frm_pow_lvl",     MAC_ALG_CFG_TPC_CONTROL_FRM_POWER_LEVEL, { 0 } }, /* TPC控制帧功率等级 */
345     { "tpc_reset_stat",          MAC_ALG_CFG_TPC_RESET_STAT, { 0 } },                   /* 释放统计内存 */
346     { "tpc_reset_pkt",           MAC_ALG_CFG_TPC_RESET_PKT, { 0 } },                     /* 释放每包内存 */
347     { "tpc_over_temp_th",        MAC_ALG_CFG_TPC_OVER_TMP_TH, { 0 } },                /* TPC过温门限 */
348     { "tpc_dpd_enable_rate",     MAC_ALG_CFG_TPC_DPD_ENABLE_RATE, { 0 } },         /* 配置DPD生效的速率INDEX */
349     { "tpc_target_rate_11b",     MAC_ALG_CFG_TPC_TARGET_RATE_11B, { 0 } },         /* 11b目标速率设置 */
350     { "tpc_target_rate_11ag",    MAC_ALG_CFG_TPC_TARGET_RATE_11AG, { 0 } },       /* 11ag目标速率设置 */
351     { "tpc_target_rate_11n20",   MAC_ALG_CFG_TPC_TARGET_RATE_HT20, { 0 } },      /* 11n20目标速率设置 */
352     { "tpc_no_margin_pow",       MAC_ALG_CFG_TPC_NO_MARGIN_POW, { 0 } },             /* 51功率没有余量配置 */
353     { "tpc_power_amend",         MAC_ALG_CFG_TPC_POWER_AMEND, { 0 } }, /* tx power在带内不平坦,tpc进行功率修正,默认为0 */
354     {HI_NULL,0,{0}}
355 };
356 #endif
357 
358 /* hipriv 参数解析结构体定义 */
359 typedef struct {
360     hi_char cmd_param1[WAL_HIPRIV_CMD_NAME_MAX_LEN]; /* 命令第一个参数字符串 */
361     hi_char cmd_param2[WAL_HIPRIV_CMD_NAME_MAX_LEN]; /* 命令第二个参数字符串 */
362 } wal_hipriv_two_param_stru;
363 
364 typedef struct {
365     hi_char cmd_param1[WAL_HIPRIV_CMD_NAME_MAX_LEN]; /* 命令第一个参数字符串 */
366     hi_char cmd_param2[WAL_HIPRIV_CMD_NAME_MAX_LEN]; /* 命令第二个参数字符串 */
367     hi_char cmd_param3[WAL_HIPRIV_CMD_NAME_MAX_LEN]; /* 命令第三个参数字符串 */
368 } wal_hipriv_three_param_stru;
369 
370 typedef struct {
371     hi_char cmd_param1[WAL_HIPRIV_CMD_NAME_MAX_LEN]; /* 命令第一个参数字符串 */
372     hi_char cmd_param2[WAL_HIPRIV_CMD_NAME_MAX_LEN]; /* 命令第二个参数字符串 */
373     hi_char cmd_param3[WAL_HIPRIV_CMD_NAME_MAX_LEN]; /* 命令第三个参数字符串 */
374     hi_char cmd_param4[WAL_HIPRIV_CMD_NAME_MAX_LEN]; /* 命令第三个参数字符串 */
375 } wal_hipriv_four_param_stru;
376 /* ****************************************************************************
377   3 函数实现
378 **************************************************************************** */
379 /* 返回协议低功耗状态 */
is_under_ps()380 hi_bool is_under_ps()
381 {
382     return g_under_ps;
383 }
384 
set_under_ps(hi_bool under_ps)385 hi_void set_under_ps(hi_bool under_ps)
386 {
387     if (g_under_mfg) {
388         g_under_ps = 0; /* 产测模式下,不处于低功耗模式 */
389     } else {
390         g_under_ps = under_ps;
391     }
392 }
393 
set_under_mfg(hi_u32 under_mfg)394 hi_void set_under_mfg(hi_u32 under_mfg)
395 {
396     g_under_mfg = under_mfg;
397 }
398 #ifdef _PRE_WLAN_FEATURE_HIPRIV
399 /* ****************************************************************************
400  功能描述  : hipriv命令2个参数解析函数
401  输入参数  : pc_param, 配置命令的参数字符串
402  输出参数  : out_param, 解析出的2个配置参数
403 **************************************************************************** */
wal_hipriv_two_param_parse(hi_char * pc_param,wal_hipriv_two_param_stru * out_param)404 static hi_u32 wal_hipriv_two_param_parse(hi_char *pc_param, wal_hipriv_two_param_stru *out_param)
405 {
406     hi_u32 ret;
407     hi_u32 off_set = 0;
408     /* 获取第一个参数 */
409     ret = wal_get_cmd_one_arg(pc_param, out_param->cmd_param1, WAL_HIPRIV_CMD_NAME_MAX_LEN, &off_set);
410     if (ret != HI_SUCCESS) {
411         oam_warning_log0(0, OAM_SF_ANY, "{wal_hipriv_two_param_parse::get first param failed!}");
412         return ret;
413     }
414     /* 偏移,取下一个参数 */
415     pc_param = pc_param + off_set;
416     /* 获取第二个参数 */
417     ret = wal_get_cmd_one_arg(pc_param, out_param->cmd_param2, WAL_HIPRIV_CMD_NAME_MAX_LEN, &off_set);
418     if (ret != HI_SUCCESS) {
419         oam_warning_log0(0, OAM_SF_ANY, "{wal_hipriv_two_param_parse::get second param failed!}");
420         return ret;
421     }
422     return HI_SUCCESS;
423 }
424 #endif
425 
426 #if defined(_PRE_WLAN_FEATURE_HIPRIV) || defined(_PRE_WLAN_FEATURE_SIGMA)
427 /* ****************************************************************************
428  功能描述  : hipriv命令3个参数解析函数
429  输入参数  : pc_param, 配置命令的参数字符串
430  输出参数  : out_param, 解析出的3个配置参数
431 **************************************************************************** */
wal_hipriv_three_param_parse(hi_char * pc_param,wal_hipriv_three_param_stru * out_param)432 static hi_u32 wal_hipriv_three_param_parse(hi_char *pc_param, wal_hipriv_three_param_stru *out_param)
433 {
434     hi_u32 ret;
435     hi_u32 off_set = 0;
436     /* 获取第一个参数 */
437     ret = wal_get_cmd_one_arg(pc_param, out_param->cmd_param1, WAL_HIPRIV_CMD_NAME_MAX_LEN, &off_set);
438     if (ret != HI_SUCCESS) {
439         oam_warning_log0(0, OAM_SF_ANY, "{wal_hipriv_three_param_parse::get first param failed!}");
440         return ret;
441     }
442     /* 偏移,取下一个参数 */
443     pc_param = pc_param + off_set;
444     /* 获取第二个参数 */
445     ret = wal_get_cmd_one_arg(pc_param, out_param->cmd_param2, WAL_HIPRIV_CMD_NAME_MAX_LEN, &off_set);
446     if (ret != HI_SUCCESS) {
447         oam_warning_log0(0, OAM_SF_ANY, "{wal_hipriv_three_param_parse::get second param failed!}");
448         return ret;
449     }
450     pc_param = pc_param + off_set;
451     /* 获取第三个参数 */
452     ret = wal_get_cmd_one_arg(pc_param, out_param->cmd_param3, WAL_HIPRIV_CMD_NAME_MAX_LEN, &off_set);
453     if (ret != HI_SUCCESS) {
454         oam_warning_log0(0, OAM_SF_ANY, "{wal_hipriv_three_param_parse::get third param failed!}");
455         return ret;
456     }
457     return HI_SUCCESS;
458 }
459 #endif
460 
461 #if defined(_PRE_WLAN_FEATURE_SIGMA) || defined(_PRE_WLAN_FEATURE_HIPRIV)
462 /* ****************************************************************************
463  功能描述  : hipriv命令4个参数解析函数
464  输入参数  : pc_param, 配置命令的参数字符串
465  输出参数  : out_param, 解析出的4个配置参数
466 **************************************************************************** */
wal_hipriv_four_param_parse(hi_char * pc_param,wal_hipriv_four_param_stru * out_param)467 static hi_u32 wal_hipriv_four_param_parse(hi_char *pc_param, wal_hipriv_four_param_stru *out_param)
468 {
469     hi_u32 ret;
470     hi_u32 off_set = 0;
471     /* 获取第一个参数 */
472     ret = wal_get_cmd_one_arg(pc_param, out_param->cmd_param1, WAL_HIPRIV_CMD_NAME_MAX_LEN, &off_set);
473     if (ret != HI_SUCCESS) {
474         oam_warning_log0(0, OAM_SF_ANY, "{wal_hipriv_four_param_parse::get first param failed!}");
475         return ret;
476     }
477     /* 偏移,取下一个参数 */
478     pc_param = pc_param + off_set;
479     /* 获取第二个参数 */
480     ret = wal_get_cmd_one_arg(pc_param, out_param->cmd_param2, WAL_HIPRIV_CMD_NAME_MAX_LEN, &off_set);
481     if (ret != HI_SUCCESS) {
482         oam_warning_log0(0, OAM_SF_ANY, "{wal_hipriv_four_param_parse::get second param failed!}");
483         return ret;
484     }
485     pc_param = pc_param + off_set;
486     /* 获取第三个参数 */
487     ret = wal_get_cmd_one_arg(pc_param, out_param->cmd_param3, WAL_HIPRIV_CMD_NAME_MAX_LEN, &off_set);
488     if (ret != HI_SUCCESS) {
489         oam_warning_log0(0, OAM_SF_ANY, "{wal_hipriv_four_param_parse::get third param failed!}");
490         return ret;
491     }
492     pc_param = pc_param + off_set;
493     /* 获取第四个参数 */
494     ret = wal_get_cmd_one_arg(pc_param, out_param->cmd_param4, WAL_HIPRIV_CMD_NAME_MAX_LEN, &off_set);
495     if (ret != HI_SUCCESS) {
496         oam_warning_log0(0, OAM_SF_ANY, "{wal_hipriv_four_param_parse::get fouth param failed!}");
497         return ret;
498     }
499     return HI_SUCCESS;
500 }
501 #endif
502 
503 /* ************************* API接口 START ****************************** */
504 /* ****************************************************************************
505  功能描述  : 读取国家码
506 **************************************************************************** */
wal_hipriv_getcountry(oal_net_device_stru * netdev,hi_char * pc_param)507 hi_u32 wal_hipriv_getcountry(oal_net_device_stru *netdev, hi_char *pc_param)
508 {
509     wal_msg_query_stru          query_msg;
510     hi_u32                      ret;
511     wal_msg_stru                *rsp_msg = HI_NULL;
512     wal_msg_rsp_stru            *queue_rsp_msg = HI_NULL;
513 
514     /* **************************************************************************
515                                 抛事件到wal层处理
516     ************************************************************************** */
517     query_msg.wid = WLAN_CFGID_COUNTRY;
518     ret = wal_send_cfg_event(netdev, WAL_MSG_TYPE_QUERY, WAL_MSG_WID_LENGTH, (hi_u8 *)&query_msg, HI_TRUE, &rsp_msg);
519     if ((ret != HI_SUCCESS) || (rsp_msg == HI_NULL)) {
520         oam_warning_log0(0, OAM_SF_ANY, "{wal_hipriv_getcountry:: alloc_cfg_event failed!}");
521         return ret;
522     }
523     /* 处理返回消息 */
524     queue_rsp_msg = (wal_msg_rsp_stru *)(rsp_msg->auc_msg_data);
525     pc_param[0] = (hi_char)queue_rsp_msg->auc_value[0];
526     pc_param[1] = (hi_char)queue_rsp_msg->auc_value[1];
527     pc_param[2] = 0; /* 2: 第3位 */
528 
529     oal_free(rsp_msg);
530 #if (_PRE_OS_VERSION_LITEOS == _PRE_OS_VERSION)
531     hi_at_printf("+CC:%c%c\r\n", pc_param[0], pc_param[1]);
532     hi_at_printf("OK\r\n");
533 #endif
534     return HI_SUCCESS;
535 }
536 
537 /* ****************************************************************************
538  功能描述  : 设置驱动vap状态(UP/DOWN)
539 **************************************************************************** */
wal_hipriv_set_vap_state(oal_net_device_stru * netdev,hi_char * pc_param)540 hi_u32 wal_hipriv_set_vap_state(oal_net_device_stru *netdev, hi_char *pc_param)
541 {
542     hi_u32 ret = HI_FAIL;
543     hi_u32 state;
544 
545     if (pc_param == HI_NULL) {
546         return HI_FAIL;
547     }
548 
549     state = (hi_u32)oal_atoi(pc_param);
550     if (state == 0) {
551         ret = wal_netdev_stop(netdev);
552     } else if (state == 1) {
553         ret = wal_netdev_open(netdev);
554     } else {
555         oam_error_log1(0, 0, "wal_hipriv_set_vap_state en_netdev ERROR: %d\r\n", state);
556         return HI_FAIL;
557     }
558 
559     if (ret != HI_SUCCESS) {
560         oam_error_log1(0, 0, "wal_hipriv_set_vap_state netdev start/stop fail![%d]\r\n", state);
561         return HI_FAIL;
562     }
563     oam_warning_log0(0, OAM_SF_ANY, "OK\r\n");
564     return HI_SUCCESS;
565 }
566 
567 #ifdef _PRE_WLAN_FEATURE_MESH
568 /* ****************************************************************************
569  功能描述  : 读取Mesh节点信息
570 **************************************************************************** */
wal_hipriv_get_mesh_node_info(oal_net_device_stru * netdev,hi_char * pc_param)571 hi_u32 wal_hipriv_get_mesh_node_info(oal_net_device_stru *netdev, hi_char *pc_param)
572 {
573     hi_unref_param(pc_param);
574     wal_msg_query_stru          query_msg;
575     hi_u32                      ret;
576     wal_msg_stru                *rsp_msg = HI_NULL;
577     wal_msg_rsp_stru            *queue_rsp_msg = HI_NULL;
578     mac_cfg_mesh_nodeinfo_stru  *mesh_node_info = HI_NULL;
579 
580     /* **************************************************************************
581                                 抛事件到wal层处理
582     ************************************************************************** */
583     query_msg.wid = WLAN_CFGID_GET_MESH_NODE_INFO;
584     ret = wal_send_cfg_event(netdev, WAL_MSG_TYPE_QUERY, WAL_MSG_WID_LENGTH, (hi_u8 *)&query_msg, HI_TRUE, &rsp_msg);
585     if ((ret != HI_SUCCESS) || (rsp_msg == HI_NULL)) {
586         oam_warning_log0(0, OAM_SF_ANY, "{wal_hipriv_get_mesh_node_info:: alloc_cfg_event failed!}");
587         return ret;
588     }
589     /* 处理返回消息 */
590     queue_rsp_msg = (wal_msg_rsp_stru *)(rsp_msg->auc_msg_data);
591     mesh_node_info = (mac_cfg_mesh_nodeinfo_stru *)queue_rsp_msg->auc_value;
592 
593 #ifdef CUSTOM_AT_COMMAND
594     if (mesh_node_info->node_type == MAC_HISI_MESH_UNSPEC) {
595         hi_at_printf("+MeshNode Type:%d\r\n", mesh_node_info->node_type);
596     } else {
597         hi_at_printf("+MeshNode Type:%d\r\n", mesh_node_info->node_type);
598         hi_at_printf("+MeshNode Info:%d,%d,%d,%d,%d\r\n", mesh_node_info->user_num, mesh_node_info->chan,
599             mesh_node_info->privacy, mesh_node_info->priority, mesh_node_info->mesh_accept_sta);
600     }
601 #endif
602 
603     oal_free(rsp_msg);
604 
605     return HI_SUCCESS;
606 }
607 #endif
608 
609 /* **************************** SIGMA 使用的调试命令 START *********************************** */
610 /* 下列命令使用需要开启SIGMA特性宏或者从DEBUG宏中移出 */
611 #if defined _PRE_WLAN_FEATURE_SIGMA
612 /* ****************************************************************************
613  功能描述  : 建立BA会话的调测命令
614  命令格式  : hipriv wlan0 addba_req xx:xx:xx:xx:xx:xx(mac地址) tidno buffsize timeout
615 **************************************************************************** */
wal_hipriv_addba_req(oal_net_device_stru * netdev,hi_char * pc_param)616 hi_u32 wal_hipriv_addba_req(oal_net_device_stru *netdev, hi_char *pc_param)
617 {
618     wal_msg_write_stru              write_msg;
619     hi_u32                          ret;
620     mac_cfg_addba_req_param_stru    addba_req_param_info;     /* 临时保存获取的addba req的信息 */
621     wal_hipriv_four_param_stru      cmd_param;
622     hi_char*                        cmd_param1_ptr = HI_NULL;
623 
624     /* 命令配置参数为4个 */
625     ret = wal_hipriv_four_param_parse(pc_param, &cmd_param);
626     if (ret != HI_SUCCESS) {
627         oam_warning_log0(0, OAM_SF_ANY, "{wal_hipriv_addba_req::parse param failed!}");
628         return ret;
629     }
630     cmd_param1_ptr = cmd_param.cmd_param1;
631     /* 规则6.6:禁止使用内存操作类危险函数 例外(1)对固定长度的数组进行初始化,或对固定长度的结构体进行内存初始化 */
632     memset_s(&addba_req_param_info, sizeof(mac_cfg_addba_req_param_stru), 0, sizeof(mac_cfg_addba_req_param_stru));
633     /* MAC地址 */
634     oal_strtoaddr(cmd_param1_ptr, addba_req_param_info.auc_mac_addr, WLAN_MAC_ADDR_LEN);
635     /* tid */
636     addba_req_param_info.tidno = (hi_u8)oal_atoi(cmd_param.cmd_param2);
637     if (addba_req_param_info.tidno >= WLAN_TID_MAX_NUM) {
638         oam_warning_log1(0, OAM_SF_ANY, "{wal_hipriv_addba_req::tidno[%d] of addba req is invalid!}",
639             addba_req_param_info.tidno);
640         return HI_ERR_CODE_INVALID_CONFIG;
641     }
642     /* BA POLICY 只支持立即响应,写死 */
643     addba_req_param_info.ba_policy = MAC_BA_POLICY_IMMEDIATE;
644     /* buffsize */
645     addba_req_param_info.us_buff_size = (hi_u16)oal_atoi(cmd_param.cmd_param3);
646     /* timeout时间 */
647     addba_req_param_info.us_timeout = (hi_u16)oal_atoi(cmd_param.cmd_param4);
648 
649     /* **************************************************************************
650                                 抛事件到wal层处理
651     ************************************************************************** */
652     wal_write_msg_hdr_init(&write_msg, WLAN_CFGID_ADDBA_REQ, sizeof(mac_cfg_addba_req_param_stru));
653     /* 设置配置命令参数 */
654     if (memcpy_s(write_msg.auc_value, sizeof(mac_cfg_addba_req_param_stru), &addba_req_param_info,
655         sizeof(mac_cfg_addba_req_param_stru)) != EOK) {
656         oam_warning_log0(0, OAM_SF_ANY, "{wal_hipriv_addba_req::memcpy_s param failed!}");
657         return HI_FAIL;
658     }
659     ret = wal_send_cfg_event(netdev, WAL_MSG_TYPE_WRITE,
660         WAL_MSG_WRITE_MSG_HDR_LENGTH + sizeof(mac_cfg_addba_req_param_stru), (hi_u8 *)&write_msg, HI_FALSE, HI_NULL);
661     if (oal_unlikely(ret != HI_SUCCESS)) {
662         oam_warning_log0(0, OAM_SF_ANY, "{wal_hipriv_addba_req::send event failed!}");
663         return ret;
664     }
665     return HI_SUCCESS;
666 }
667 #endif
668 
669 /*****************************************************************************
670  功能描述  : 打印vap的所有参数信息
671 **************************************************************************** */
wal_hipriv_vap_info(oal_net_device_stru * netdev,hi_char * pc_param)672 hi_u32 wal_hipriv_vap_info(oal_net_device_stru *netdev, hi_char *pc_param)
673 {
674     wal_msg_write_stru          write_msg;
675     hi_u32                      ret;
676 
677     if (*pc_param != '\0') {
678         oam_warning_log0(0, OAM_SF_ANY, "{wal_hipriv_vap_info::cmd len error}");
679         return HI_FAIL;
680     }
681     /* **************************************************************************
682         抛事件到wal层处理
683     ************************************************************************** */
684     wal_write_msg_hdr_init(&write_msg, WLAN_CFGID_VAP_INFO, sizeof(hi_u32));
685     ret = wal_send_cfg_event(netdev, WAL_MSG_TYPE_WRITE, WAL_MSG_WRITE_MSG_HDR_LENGTH + sizeof(hi_u32),
686         (hi_u8 *)&write_msg, HI_FALSE, HI_NULL);
687     if (oal_unlikely(ret != HI_SUCCESS)) {
688         oam_warning_log1(0, OAM_SF_ANY, "{wal_hipriv_vap_info::return err code [%u]!}", ret);
689         return ret;
690     }
691 
692     return HI_SUCCESS;
693 }
694 
695 /* ************************* SDV开发阶段 使用的调试命令 START ****************************** */
696 #ifdef _PRE_WLAN_FEATURE_HIPRIV
697 /* ****************************************************************************
698  功能描述  : 设置描述符参数配置命令 目前仅支持rate设置
699 **************************************************************************** */
wal_hipriv_set_tx_dscr_param(oal_net_device_stru * netdev,hi_char * pc_param)700 static hi_u32 wal_hipriv_set_tx_dscr_param(oal_net_device_stru *netdev, hi_char *pc_param)
701 {
702     wal_msg_write_stru              write_msg;
703     mac_cfg_set_dscr_param_stru     *set_dscr_param = HI_NULL;
704     mac_set_dscr_param_enum_uint8   index;
705     wal_hipriv_three_param_stru     cmd_param;
706     /* 支持帧类型设置参数,参数需与mac_set_dscr_frame_type_enum 枚举中的顺序严格一致! */
707     const hi_char                   *pauc_dscr_type_name[MAC_SET_DSCR_TYPE_BUTT] = {
708         "ucast_data", "mcast_data", "bcast_data", "ucast_mgmt", "mbcast_mgmt"
709     };
710     /* 设置描述符的参数, 参数定义参考mac_set_dscr_enum 并与枚举中的顺序严格一致! */
711     const hi_char                   *pauc_tx_dscr_param_name[MAC_SET_DSCR_PARAM_BUTT] = {
712         "data0", "data1", "data2", "data3", "rate", "power", "shortgi"
713     };
714 
715     /* 获取命令参数 */
716     hi_u32 ret = wal_hipriv_three_param_parse(pc_param, &cmd_param);
717     if (ret != HI_SUCCESS) {
718         oam_warning_log0(0, OAM_SF_ANY, "{wal_hipriv_set_tx_dscr_param::get parse cmd param failed!}");
719         return ret;
720     }
721     /* **************************************************************************
722                                 抛事件到wal层处理
723     ************************************************************************** */
724     wal_write_msg_hdr_init(&write_msg, WLAN_CFGID_SET_DSCR, sizeof(mac_cfg_set_dscr_param_stru));
725     /* 解析并设置配置命令参数 */
726     set_dscr_param = (mac_cfg_set_dscr_param_stru *)(write_msg.auc_value);
727     /* 解析是设置哪一个帧类型 */
728     for (index = 0; index < MAC_SET_DSCR_TYPE_BUTT; index++) {
729         if (!strcmp(pauc_dscr_type_name[index], cmd_param.cmd_param1)) {
730             break;
731         }
732     }
733     if (index == MAC_SET_DSCR_TYPE_BUTT) {
734         oam_warning_log0(0, OAM_SF_ANY, "{wal_hipriv_set_tx_dscr_param::no such type for tx dscr!}");
735         return HI_FAIL;
736     }
737     set_dscr_param->type = index;
738     /* 解析是设置哪一个字段 */
739     for (index = 0; index < MAC_SET_DSCR_PARAM_BUTT; index++) {
740         if (!strcmp(pauc_tx_dscr_param_name[index], cmd_param.cmd_param2)) {
741             break;
742         }
743     }
744     if (index == MAC_SET_DSCR_PARAM_BUTT) {
745         oam_warning_log0(0, OAM_SF_ANY, "{wal_hipriv_set_tx_dscr_param::no such param for tx dscr!}");
746         return HI_FAIL;
747     }
748     set_dscr_param->function_index = index;
749     /* 解析要设置为多大的值 */
750     set_dscr_param->l_value = oal_strtol(cmd_param.cmd_param3, HI_NULL, 0);
751 
752     ret = wal_send_cfg_event(netdev, WAL_MSG_TYPE_WRITE,
753         WAL_MSG_WRITE_MSG_HDR_LENGTH + sizeof(mac_cfg_set_dscr_param_stru), (hi_u8 *)&write_msg, HI_FALSE, HI_NULL);
754     if (oal_unlikely(ret != HI_SUCCESS)) {
755         oam_warning_log1(0, OAM_SF_ANY, "{wal_hipriv_set_tx_dscr_param::return err code [%u]!}", ret);
756     }
757     return ret;
758 }
759 
760 
761 /* ****************************************************************************
762  功能描述  : 手动触发建立BA会话
763 **************************************************************************** */
wal_hipriv_ampdu_start(oal_net_device_stru * netdev,hi_char * pc_param)764 static hi_u32 wal_hipriv_ampdu_start(oal_net_device_stru *netdev, hi_char *pc_param)
765 {
766     wal_msg_write_stru             write_msg;
767     hi_u32                         ret;
768     mac_cfg_ampdu_start_param_stru ampdu_start_param_info;  /* 临时保存获取的use的信息 */
769     wal_hipriv_two_param_stru      cmd_param;
770     hi_char*                       cmd_param1_ptr = HI_NULL;
771 
772     /* 设置AMPDU开启的配置命令: hipriv Hisilicon0 ampdu_start xx xx xx xx xx xx(mac地址) tidno */
773     ret = wal_hipriv_two_param_parse(pc_param, &cmd_param);
774     if (ret != HI_SUCCESS) {
775         oam_warning_log0(0, OAM_SF_ANY, "{wal_hipriv_ampdu_start::parse cmd param failed!}");
776         return ret;
777     }
778     /* 规则6.6:禁止使用内存操作类危险函数 例外(1)对固定长度的数组进行初始化,或对固定长度的结构体进行内存初始化 */
779     memset_s(&ampdu_start_param_info, sizeof(mac_cfg_ampdu_start_param_stru), 0,
780         sizeof(mac_cfg_ampdu_start_param_stru));
781 
782     cmd_param1_ptr = cmd_param.cmd_param1;
783     /* 获取mac地址 */
784     oal_strtoaddr(cmd_param1_ptr, ampdu_start_param_info.auc_mac_addr, WLAN_MAC_ADDR_LEN);
785     /* 获取tid */
786     ampdu_start_param_info.tidno = (hi_u8)oal_atoi(cmd_param.cmd_param2);
787     if (ampdu_start_param_info.tidno >= WLAN_TID_MAX_NUM) {
788         oam_warning_log1(0, OAM_SF_ANY, "{wal_hipriv_ampdu_start::tidno[%d] is invalid!}",
789             ampdu_start_param_info.tidno);
790         return HI_ERR_CODE_INVALID_CONFIG;
791     }
792     /* **************************************************************************
793                                 抛事件到wal层处理
794     ************************************************************************** */
795     wal_write_msg_hdr_init(&write_msg, WLAN_CFGID_AMPDU_START, sizeof(mac_cfg_ampdu_start_param_stru));
796     /* 设置配置命令参数 */
797     if (memcpy_s(write_msg.auc_value, sizeof(mac_cfg_ampdu_start_param_stru), &ampdu_start_param_info,
798         sizeof(mac_cfg_ampdu_start_param_stru)) != EOK) {
799         oam_warning_log0(0, OAM_SF_ANY, "{wal_hipriv_ampdu_start::memcpy_s event msg failed!}");
800         return HI_FAIL;
801     }
802     ret = wal_send_cfg_event(netdev, WAL_MSG_TYPE_WRITE,
803         WAL_MSG_WRITE_MSG_HDR_LENGTH + sizeof(mac_cfg_ampdu_start_param_stru), (hi_u8 *)&write_msg, HI_FALSE, HI_NULL);
804     if (oal_unlikely(ret != HI_SUCCESS)) {
805         oam_warning_log1(0, OAM_SF_ANY, "{wal_hipriv_ampdu_start::return err code[%u]!}", ret);
806     }
807     return ret;
808 }
809 
810 /* ****************************************************************************
811  功能描述  : 开启或关闭amsdu ampdu联合发送
812 **************************************************************************** */
813 /* 大数组g_ast_hipriv_cmd的成员,其中wal_hipriv_getcountry修改了对应变量,lint_t e818告警屏蔽 */
wal_hipriv_ampdu_amsdu_switch(oal_net_device_stru * netdev,hi_char * pc_param)814 static hi_u32 wal_hipriv_ampdu_amsdu_switch(oal_net_device_stru *netdev, hi_char *pc_param)
815 {
816     wal_msg_write_stru      write_msg;
817     hi_s32                  l_tmp;
818     hi_u32                  off_set;
819     hi_char                 ac_name[WAL_HIPRIV_CMD_NAME_MAX_LEN] = {0};
820     hi_u32                  ret;
821 
822     /* 设置自动开始BA会话的开关:hipriv "vap0  auto_ba 0 | 1" 该命令针对某一个VAP */
823     ret = wal_get_cmd_one_arg(pc_param, ac_name, WAL_HIPRIV_CMD_NAME_MAX_LEN, &off_set);
824     if (ret != HI_SUCCESS) {
825         oam_warning_log1(0, OAM_SF_ANY, "{wal_hipriv_ampdu_amsdu_switch::wal_get_cmd_one_arg return err_code [%u]!}",
826             ret);
827         return ret;
828     }
829     /* 针对解析出的不同命令,对AUTO BA进行不同的设置 非0即开启 */
830     if (0 == (strcmp("0", ac_name))) {
831         l_tmp = 0;
832     } else {
833         l_tmp = 1;
834     }
835     /* **************************************************************************
836                                 抛事件到wal层处理
837     ************************************************************************** */
838     wal_write_msg_hdr_init(&write_msg, WLAN_CFGID_AMSDU_AMPDU_SWITCH, sizeof(hi_s32));
839     *((hi_s32 *)(write_msg.auc_value)) = l_tmp; /* 设置配置命令参数 */
840     ret = wal_send_cfg_event(netdev, WAL_MSG_TYPE_WRITE, WAL_MSG_WRITE_MSG_HDR_LENGTH + sizeof(hi_s32),
841         (hi_u8 *)&write_msg, HI_FALSE, HI_NULL);
842     if (oal_unlikely(ret != HI_SUCCESS)) {
843         oam_warning_log1(0, OAM_SF_ANY, "{wal_hipriv_ampdu_amsdu_switch::return err code[%u]!}", ret);
844     }
845     return ret;
846 }
847 
848 /* ****************************************************************************
849  功能描述  : 删除BA会话的调测命令
850 **************************************************************************** */
wal_hipriv_delba_req(oal_net_device_stru * netdev,hi_char * pc_param)851 static hi_u32 wal_hipriv_delba_req(oal_net_device_stru *netdev, hi_char *pc_param)
852 {
853     wal_msg_write_stru              write_msg;
854     hi_u32                          ret;
855     mac_cfg_delba_req_param_stru    delba_req_param_info;     /* 临时保存获取的delba req的信息 */
856     wal_hipriv_four_param_stru      cmd_param;
857     hi_char*                        cmd_param1_ptr = HI_NULL;
858 
859     /* 删除对应tid的ba配置命令: hipriv Hisilicon0 delba_req xx xx xx xx xx xx(mac地址) tidno direction
860        direction:0为RX BA, 1为TX BA */
861     ret = wal_hipriv_four_param_parse(pc_param, &cmd_param);
862     if (ret != HI_SUCCESS) {
863         oam_warning_log0(0, OAM_SF_ANY, "{wal_hipriv_delba_req::parse cmd param failed!}");
864         return ret;
865     }
866     /* 规则6.6:禁止使用内存操作类危险函数 例外(1)对固定长度的数组进行初始化,或对固定长度的结构体进行内存初始化 */
867     memset_s(&delba_req_param_info, sizeof(mac_cfg_delba_req_param_stru), 0, sizeof(mac_cfg_delba_req_param_stru));
868 
869     cmd_param1_ptr = cmd_param.cmd_param1;
870     /* 获取mac地址 */
871     oal_strtoaddr(cmd_param1_ptr, delba_req_param_info.auc_mac_addr, WLAN_MAC_ADDR_LEN);
872     /* 获取tid */
873     delba_req_param_info.tidno = (hi_u8)oal_atoi(cmd_param.cmd_param2);
874     if (delba_req_param_info.tidno >= WLAN_TID_MAX_NUM) {
875         oam_warning_log1(0, OAM_SF_ANY, "{wal_hipriv_delba_req::tidno [%d] is invalid!}", delba_req_param_info.tidno);
876         return HI_ERR_CODE_INVALID_CONFIG;
877     }
878     /* 获取direction */
879     delba_req_param_info.direction = (hi_u8)oal_atoi(cmd_param.cmd_param3);
880     if (delba_req_param_info.direction >= MAC_BUTT_DELBA) {
881         oam_warning_log1(0, OAM_SF_ANY, "{wal_hipriv_delba_req::the direction is not correct! direction is[%d]!}",
882             delba_req_param_info.direction);
883         return HI_ERR_CODE_INVALID_CONFIG;
884     }
885     /* **************************************************************************
886                                 抛事件到wal层处理
887     ************************************************************************** */
888     wal_write_msg_hdr_init(&write_msg, WLAN_CFGID_DELBA_REQ, sizeof(mac_cfg_delba_req_param_stru));
889     /* 设置配置命令参数 */
890     if (memcpy_s(write_msg.auc_value, sizeof(mac_cfg_delba_req_param_stru), &delba_req_param_info,
891         sizeof(mac_cfg_delba_req_param_stru)) != EOK) {
892         oam_warning_log0(0, OAM_SF_ANY, "{wal_hipriv_delba_req::memcpy_s cmd param failed.");
893         return HI_FAIL;
894     }
895     ret = wal_send_cfg_event(netdev, WAL_MSG_TYPE_WRITE,
896         WAL_MSG_WRITE_MSG_HDR_LENGTH + sizeof(mac_cfg_delba_req_param_stru), (hi_u8 *)&write_msg, HI_FALSE, HI_NULL);
897     if (oal_unlikely(ret != HI_SUCCESS)) {
898         oam_warning_log1(0, OAM_SF_ANY, "{wal_hipriv_delba_req::return err code[%u]!}", ret);
899     }
900     return ret;
901 }
902 
903 #endif
904 
905 /* ****************************************************************************
906  功能描述  : 打印user的所有参数信息
907 **************************************************************************** */
908 /* 大数组g_ast_hipriv_cmd的成员,其中wal_hipriv_getcountry修改了对应变量,lint_t e818告警屏蔽 */
wal_hipriv_user_info(oal_net_device_stru * netdev,hi_char * pc_param)909 hi_u32 wal_hipriv_user_info(oal_net_device_stru *netdev, hi_char *pc_param)
910 {
911     wal_msg_write_stru write_msg;
912     hi_u32 ret;
913 
914     /* 规则6.6:禁止使用内存操作类危险函数 例外(1)对固定长度的数组进行初始化,或对固定长度的结构体进行内存初始化 */
915     memset_s(&write_msg, sizeof(wal_msg_write_stru), 0, sizeof(wal_msg_write_stru));
916     if (*pc_param == ' ') {
917         pc_param++;
918     }
919     oal_strtoaddr(pc_param, write_msg.auc_value, WLAN_MAC_ADDR_LEN);
920 
921     /* 建议5.5 这里强制类型转换会不会出问题 */
922     if (wal_macaddr_check(write_msg.auc_value) != HI_SUCCESS) {
923         oam_warning_log0(0, OAM_SF_ANY, "wal_hipriv_user_info:: Mac address invalid!");
924         return HI_FAIL;
925     }
926 
927     pc_param += WLAN_MAC_ADDR_BYTE_LEN;
928     /* 判断命令长度是否有问题 */
929     if (*pc_param != '\0') {
930         oam_warning_log0(0, OAM_SF_ANY, "{wal_hipriv_user_info::cmd len error!}\r\n");
931         return HI_FAIL;
932     }
933 
934     /* **************************************************************************
935                                 抛事件到wal层处理
936     ************************************************************************** */
937     wal_write_msg_hdr_init(&write_msg, WLAN_CFGID_USER_INFO, WLAN_MAC_ADDR_LEN);
938     ret = wal_send_cfg_event(netdev, WAL_MSG_TYPE_WRITE, WAL_MSG_WRITE_MSG_HDR_LENGTH + WLAN_MAC_ADDR_LEN,
939         (hi_u8 *)&write_msg, HI_FALSE, HI_NULL);
940     if (oal_unlikely(ret != HI_SUCCESS)) {
941         oam_warning_log1(0, OAM_SF_ANY, "{wal_hipriv_user_info::return err code [%u]!}", ret);
942         return ret;
943     }
944 #ifdef AT_DEBUG_CMD_SUPPORT
945     hi_at_printf("OK\r\n");
946 #endif
947 
948     return HI_SUCCESS;
949 }
950 
951 #ifdef _PRE_WLAN_FEATURE_HIPRIV
952 /* ****************************************************************************
953  功能描述  : 显示设备支持的信道列表
954 
955  修改历史      :
956   1.日    期   : 2013年12月27日,星期五
957     作    者   : HiSilicon
958     修改内容   : 新生成函数
959 
960 **************************************************************************** */
wal_hipriv_list_channel(oal_net_device_stru * netdev,hi_char * pc_param)961 static hi_u32 wal_hipriv_list_channel(oal_net_device_stru *netdev, hi_char *pc_param)
962 {
963     wal_msg_write_stru write_msg;
964     hi_u32 ret;
965 
966     hi_unref_param(pc_param);
967     /* **************************************************************************
968                                 抛事件到wal层处理
969     ************************************************************************** */
970     wal_write_msg_hdr_init(&write_msg, WLAN_CFGID_LIST_CHAN, sizeof(hi_s32));
971 
972     ret = wal_send_cfg_event(netdev, WAL_MSG_TYPE_WRITE, WAL_MSG_WRITE_MSG_HDR_LENGTH + sizeof(hi_s32),
973         (hi_u8 *)&write_msg, HI_FALSE, HI_NULL);
974     if (oal_unlikely(ret != HI_SUCCESS)) {
975         oam_warning_log1(0, OAM_SF_ANY, "{wal_hipriv_list_channel::return err code [%u]!}\r\n", ret);
976         return ret;
977     }
978 
979     return HI_SUCCESS;
980 }
981 #endif
982 
983 #ifdef _PRE_DEBUG_MODE
984 #ifdef _PRE_WLAN_FEATURE_HIPRIV
985 /* ****************************************************************************
986  功能描述  : 设置管制域最大发送功率
987 
988  修改历史      :
989   1.日    期   : 2013年12月27日,星期五
990     作    者   : HiSilicon
991     修改内容   : 新生成函数
992 **************************************************************************** */
993 /* 大数组g_ast_hipriv_cmd的成员,其中wal_hipriv_getcountry修改了对应变量,lint_t e818告警屏蔽 */
wal_hipriv_set_regdomain_pwr(oal_net_device_stru * netdev,hi_char * pc_param)994 static hi_u32 wal_hipriv_set_regdomain_pwr(oal_net_device_stru *netdev, hi_char *pc_param)
995 {
996     hi_u32                   off_set;
997     hi_char                  ac_name[WAL_HIPRIV_CMD_NAME_MAX_LEN] = {0};
998     hi_u32                   ret;
999     hi_s32                   l_pwr;
1000     wal_msg_write_stru       write_msg;
1001 
1002     ret = wal_get_cmd_one_arg(pc_param, ac_name, WAL_HIPRIV_CMD_NAME_MAX_LEN, &off_set);
1003     if (ret != HI_SUCCESS) {
1004         oam_warning_log1(0, OAM_SF_CFG, "wal_hipriv_set_regdomain_pwr, get arg return err %u", ret);
1005         return ret;
1006     }
1007 
1008     l_pwr = oal_atoi(ac_name);
1009     if (l_pwr <= 0 || l_pwr > 100) { /* 大于100为无效值 */
1010         oam_warning_log1(0, OAM_SF_CFG, "invalid value, %d", l_pwr);
1011         return HI_ERR_CODE_INVALID_CONFIG;
1012     }
1013 
1014     /* **************************************************************************
1015                                 抛事件到wal层处理
1016     ************************************************************************** */
1017     wal_write_msg_hdr_init(&write_msg, WLAN_CFGID_REGDOMAIN_PWR, sizeof(mac_cfg_regdomain_max_pwr_stru));
1018 
1019     ((mac_cfg_regdomain_max_pwr_stru *)write_msg.auc_value)->pwr = (hi_u8)l_pwr;
1020     ((mac_cfg_regdomain_max_pwr_stru *)write_msg.auc_value)->exceed_reg = HI_FALSE;
1021 
1022     ret = wal_send_cfg_event(netdev, WAL_MSG_TYPE_WRITE, WAL_MSG_WRITE_MSG_HDR_LENGTH + sizeof(hi_s32),
1023         (hi_u8 *)&write_msg, HI_FALSE, HI_NULL);
1024     if (ret != HI_SUCCESS) {
1025         oam_warning_log1(0, OAM_SF_CFG, "{wal_hipriv_set_regdomain_pwr::wal_send_cfg_event fail.return err code [%u]}",
1026             ret);
1027     }
1028 
1029     return ret;
1030 }
1031 
1032 /* ****************************************************************************
1033  功能描述  : 设置管制域最大发送功率
1034 
1035  修改历史      :
1036   1.日    期   : 2013年12月27日,星期五
1037     作    者   : HiSilicon
1038     修改内容   : 新生成函数
1039 **************************************************************************** */
1040 /* 大数组g_ast_hipriv_cmd的成员,其中wal_hipriv_getcountry修改了对应变量,lint_t e818告警屏蔽 */
wal_hipriv_set_regdomain_pwr_priv(oal_net_device_stru * netdev,hi_char * pc_param)1041 static hi_u32 wal_hipriv_set_regdomain_pwr_priv(oal_net_device_stru *netdev, hi_char *pc_param)
1042 {
1043     hi_u32                  off_set;
1044     hi_char                 ac_name[WAL_HIPRIV_CMD_NAME_MAX_LEN] = {0};
1045     hi_u32                  ret;
1046     hi_u32                  pwr;
1047     wal_msg_write_stru      write_msg;
1048 
1049     ret = wal_get_cmd_one_arg(pc_param, ac_name, WAL_HIPRIV_CMD_NAME_MAX_LEN, &off_set);
1050     if (ret != HI_SUCCESS) {
1051         oam_warning_log1(0, OAM_SF_CFG, "wal_hipriv_set_regdomain_pwr, get arg return err %d", ret);
1052         return ret;
1053     }
1054 
1055     pwr = (hi_u32)oal_atoi(ac_name);
1056 
1057     /* **************************************************************************
1058                                 抛事件到wal层处理
1059     ************************************************************************** */
1060     wal_write_msg_hdr_init(&write_msg, WLAN_CFGID_REGDOMAIN_PWR, sizeof(hi_s32));
1061 
1062     ((mac_cfg_regdomain_max_pwr_stru *)write_msg.auc_value)->pwr        = (hi_u8)pwr;
1063     ((mac_cfg_regdomain_max_pwr_stru *)write_msg.auc_value)->exceed_reg = HI_TRUE;
1064 
1065     ret = wal_send_cfg_event(netdev, WAL_MSG_TYPE_WRITE, WAL_MSG_WRITE_MSG_HDR_LENGTH + sizeof(hi_s32),
1066         (hi_u8 *)&write_msg, HI_FALSE, HI_NULL);
1067     if (ret != HI_SUCCESS) {
1068         oam_warning_log1(0, OAM_SF_CFG, "{wal_hipriv_set_regdomain_pwr::wal_send_cfg_event fail.return err code %u}",
1069             ret);
1070     }
1071 
1072     return ret;
1073 }
1074 
1075 /* ****************************************************************************
1076  功能描述  : 触发sta初始扫描
1077 
1078  修改历史      :
1079   1.日    期   : 2013年6月27日
1080     作    者   : HiSilicon
1081     修改内容   : 新生成函数
1082 
1083 **************************************************************************** */
wal_hipriv_start_scan(oal_net_device_stru * netdev,hi_char * pc_param)1084 static hi_u32 wal_hipriv_start_scan(oal_net_device_stru *netdev, hi_char *pc_param)
1085 {
1086     wal_msg_write_stru        write_msg;
1087     hi_u32                    ret;
1088 #ifdef _PRE_WLAN_FEATURE_P2P
1089     hi_u8                     is_p2p0_scan;
1090 #endif
1091 
1092     hi_unref_param(pc_param);
1093     /* **************************************************************************
1094                                 抛事件到wal层处理
1095     ************************************************************************** */
1096     wal_write_msg_hdr_init(&write_msg, WLAN_CFGID_START_SCAN, sizeof(hi_s32));
1097 
1098 #ifdef _PRE_WLAN_FEATURE_P2P
1099     is_p2p0_scan = (memcmp(netdev->name, "p2p0", strlen("p2p0")) == 0) ? 1 : 0;
1100     write_msg.auc_value[0] = is_p2p0_scan;
1101 #endif /* _PRE_WLAN_FEATURE_P2P */
1102 
1103     ret = wal_send_cfg_event(netdev, WAL_MSG_TYPE_WRITE, WAL_MSG_WRITE_MSG_HDR_LENGTH + sizeof(hi_s32),
1104         (hi_u8 *)&write_msg, HI_FALSE, HI_NULL);
1105     if (oal_unlikely(ret != HI_SUCCESS)) {
1106         oam_warning_log1(0, OAM_SF_ANY, "{wal_hipriv_start_scan::return err code [%u]!}\r\n", ret);
1107         return ret;
1108     }
1109 
1110     return HI_SUCCESS;
1111 }
1112 
1113 /* ****************************************************************************
1114  功能描述  : 触发sta初始扫描
1115 
1116  修改历史      :
1117   1.日    期   : 2013年6月27日
1118     作    者   : HiSilicon
1119     修改内容   : 新生成函数
1120 **************************************************************************** */
1121 /* 大数组g_ast_hipriv_cmd的成员,其中wal_hipriv_getcountry修改了对应变量,lint_t e818告警屏蔽 */
wal_hipriv_start_join(oal_net_device_stru * netdev,hi_char * pc_param)1122 static hi_u32 wal_hipriv_start_join(oal_net_device_stru *netdev, hi_char *pc_param)
1123 {
1124     wal_msg_write_stru           write_msg;
1125     hi_u32                       ret;
1126     hi_u32                       off_set;
1127     hi_char                      ac_name[WAL_HIPRIV_CMD_NAME_MAX_LEN] = {0};
1128 
1129     /* **************************************************************************
1130                                 抛事件到wal层处理
1131     ************************************************************************** */
1132     wal_write_msg_hdr_init(&write_msg, WLAN_CFGID_START_JOIN, sizeof(hi_s32));
1133 
1134     ret = wal_get_cmd_one_arg(pc_param, ac_name, WAL_HIPRIV_CMD_NAME_MAX_LEN, &off_set);
1135     if (ret != HI_SUCCESS) {
1136         oam_warning_log1(0, OAM_SF_ANY, "{wal_hipriv_start_join::wal_get_cmd_one_arg return err_code [%u]!}\r\n", ret);
1137         return ret;
1138     }
1139 
1140     /* 将要关联AP的编号复制到事件msg中,AP编号是数字的ASSCI码,不超过4个字节 */
1141     if (memcpy_s((hi_s8 *)write_msg.auc_value, WAL_MSG_WRITE_MAX_LEN, (hi_s8 *)ac_name, sizeof(hi_s32)) != EOK) {
1142         oam_error_log0(0, OAM_SF_ANY, "{wal_hipriv_start_join::mem safe function err!}");
1143         return HI_FAIL;
1144     }
1145 
1146     ret = wal_send_cfg_event(netdev, WAL_MSG_TYPE_WRITE, WAL_MSG_WRITE_MSG_HDR_LENGTH + sizeof(hi_s32),
1147         (hi_u8 *)&write_msg, HI_FALSE, HI_NULL);
1148     if (oal_unlikely(ret != HI_SUCCESS)) {
1149         oam_warning_log1(0, OAM_SF_ANY, "{wal_hipriv_start_join::return err code [%u]!}\r\n", ret);
1150         return ret;
1151     }
1152 
1153     return HI_SUCCESS;
1154 }
1155 
1156 /* ****************************************************************************
1157  功能描述  : 触发去认证
1158 
1159  修改历史      :
1160   1.日    期   : 2013年6月27日
1161     作    者   : HiSilicon
1162     修改内容   : 新生成函数
1163 
1164 **************************************************************************** */
wal_hipriv_start_deauth(oal_net_device_stru * netdev,hi_char * pc_param)1165 static hi_u32 wal_hipriv_start_deauth(oal_net_device_stru *netdev, hi_char *pc_param)
1166 {
1167     wal_msg_write_stru        write_msg;
1168     hi_u32                    ret;
1169 
1170     hi_unref_param(pc_param);
1171     /* **************************************************************************
1172                                 抛事件到wal层处理
1173     ************************************************************************** */
1174     wal_write_msg_hdr_init(&write_msg, WLAN_CFGID_START_DEAUTH, sizeof(hi_s32));
1175 
1176     ret = wal_send_cfg_event(netdev, WAL_MSG_TYPE_WRITE, WAL_MSG_WRITE_MSG_HDR_LENGTH + sizeof(hi_s32),
1177         (hi_u8 *)&write_msg, HI_FALSE, HI_NULL);
1178     if (oal_unlikely(ret != HI_SUCCESS)) {
1179         oam_warning_log1(0, OAM_SF_ANY, "{wal_hipriv_start_deauth::return err code [%u]!}\r\n", ret);
1180         return ret;
1181     }
1182 
1183     return HI_SUCCESS;
1184 }
1185 #endif
1186 #endif
1187 
1188 #ifdef _PRE_WLAN_FEATURE_HIPRIV
1189 /* ****************************************************************************
1190  功能描述  : 删除1个用户
1191 
1192  修改历史      :
1193   1.日    期   : 2013年8月27日
1194     作    者   : HiSilicon
1195     修改内容   : 新生成函数
1196 **************************************************************************** */
1197 /* 大数组g_ast_hipriv_cmd的成员,其中wal_hipriv_getcountry修改了对应变量,lint_t e818告警屏蔽 */
wal_hipriv_kick_user(oal_net_device_stru * netdev,hi_char * pc_param)1198 static hi_u32 wal_hipriv_kick_user(oal_net_device_stru *netdev, hi_char *pc_param)
1199 {
1200     wal_msg_write_stru              write_msg;
1201     hi_u32                          off_set;
1202     hi_char                         ac_name[WAL_HIPRIV_CMD_NAME_MAX_LEN] = {0};
1203     hi_u32                          ret;
1204     mac_cfg_kick_user_param_stru    *kick_user_param = HI_NULL;
1205     hi_u8                           mac_addr[WLAN_MAC_ADDR_LEN] = {0, 0, 0, 0, 0, 0};
1206 
1207     /* 去关联1个用户的命令 hipriv "vap0 kick_user xx:xx:xx:xx:xx:xx" */
1208     /* 获取mac地址 */
1209     ret = wal_get_cmd_one_arg(pc_param, ac_name, WAL_HIPRIV_CMD_NAME_MAX_LEN, &off_set);
1210     if (ret != HI_SUCCESS) {
1211         oam_warning_log1(0, OAM_SF_ANY, "{wal_hipriv_kick_user::wal_get_cmd_one_arg return err_code [%u]!}\r\n", ret);
1212         return ret;
1213     }
1214     oal_strtoaddr(ac_name, mac_addr, WLAN_MAC_ADDR_LEN);
1215 
1216     /* **************************************************************************
1217                              抛事件到wal层处理
1218     ************************************************************************** */
1219     wal_write_msg_hdr_init(&write_msg, WLAN_CFGID_KICK_USER, sizeof(mac_cfg_kick_user_param_stru));
1220 
1221     /* 设置配置命令参数 */
1222     kick_user_param = (mac_cfg_kick_user_param_stru *)(write_msg.auc_value);
1223     if (memcpy_s(kick_user_param->auc_mac_addr, WLAN_MAC_ADDR_LEN, mac_addr, WLAN_MAC_ADDR_LEN) != EOK) {
1224         oam_error_log0(0, OAM_SF_PWR, "{wal_hipriv_send_bar::mem safe function err!}");
1225         return HI_FAIL;
1226     }
1227 
1228     /* 填写去关联reason code */
1229     kick_user_param->us_reason_code = MAC_UNSPEC_REASON;
1230 
1231     ret = wal_send_cfg_event(netdev, WAL_MSG_TYPE_WRITE,
1232         WAL_MSG_WRITE_MSG_HDR_LENGTH + sizeof(mac_cfg_kick_user_param_stru), (hi_u8 *)&write_msg, HI_FALSE, HI_NULL);
1233     if (oal_unlikely(ret != HI_SUCCESS)) {
1234         oam_warning_log1(0, OAM_SF_ANY, "{wal_hipriv_kick_user::return err code [%u]!}\r\n", ret);
1235         return ret;
1236     }
1237 
1238     return HI_SUCCESS;
1239 }
1240 
1241 /* ****************************************************************************
1242  功能描述  : 指定用户指定tid 发送bar
1243 
1244  修改历史      :
1245   1.日    期   : 2013年8月27日
1246     作    者   : HiSilicon
1247     修改内容   : 新生成函数
1248 
1249 **************************************************************************** */
wal_hipriv_send_bar(oal_net_device_stru * netdev,hi_char * pc_param)1250 static hi_u32 wal_hipriv_send_bar(oal_net_device_stru *netdev, hi_char *pc_param)
1251 {
1252     wal_msg_write_stru              write_msg;
1253     hi_u32                          off_set;
1254     hi_char                         ac_name[WAL_HIPRIV_CMD_NAME_MAX_LEN] = {0};
1255     hi_u32                          ret;
1256     mac_cfg_pause_tid_param_stru    *pause_tid_param = HI_NULL;
1257     hi_u8                           mac_addr[WLAN_MAC_ADDR_LEN] = {0, 0, 0, 0, 0, 0};
1258     hi_u8                           tid;
1259 
1260     /* 获取mac地址 */
1261     ret = wal_get_cmd_one_arg(pc_param, ac_name, WAL_HIPRIV_CMD_NAME_MAX_LEN, &off_set);
1262     if (ret != HI_SUCCESS) {
1263         oam_warning_log1(0, OAM_SF_ANY, "{wal_hipriv_send_bar::wal_get_cmd_one_arg return err_code [%u]!}\r\n", ret);
1264         return ret;
1265     }
1266     oal_strtoaddr(ac_name, mac_addr, WLAN_MAC_ADDR_LEN);
1267     /* 偏移,取下一个参数 */
1268     pc_param = pc_param + off_set;
1269 
1270     ret = wal_get_cmd_one_arg(pc_param, ac_name, WAL_HIPRIV_CMD_NAME_MAX_LEN, &off_set);
1271     if (ret != HI_SUCCESS) {
1272         oam_warning_log1(0, OAM_SF_ANY, "{wal_hipriv_send_bar::wal_get_cmd_one_arg return err_code [%u]!}\r\n", ret);
1273         return ret;
1274     }
1275 
1276     tid = (hi_u8)oal_atoi(ac_name);
1277 
1278     /* **************************************************************************
1279                              抛事件到wal层处理
1280     ************************************************************************** */
1281     wal_write_msg_hdr_init(&write_msg, WLAN_CFGID_SEND_BAR, sizeof(mac_cfg_pause_tid_param_stru));
1282 
1283     /* 设置配置命令参数 */
1284     pause_tid_param = (mac_cfg_pause_tid_param_stru *)(write_msg.auc_value);
1285     if (memcpy_s(pause_tid_param->auc_mac_addr, WLAN_MAC_ADDR_LEN, mac_addr, WLAN_MAC_ADDR_LEN) != EOK) {
1286         oam_error_log0(0, OAM_SF_PWR, "{wal_hipriv_send_bar::mem safe function err!}");
1287         return HI_FAIL;
1288     }
1289     pause_tid_param->tid = tid;
1290 
1291     ret = wal_send_cfg_event(netdev, WAL_MSG_TYPE_WRITE,
1292         WAL_MSG_WRITE_MSG_HDR_LENGTH + sizeof(mac_cfg_pause_tid_param_stru), (hi_u8 *)&write_msg, HI_FALSE, HI_NULL);
1293     if (oal_unlikely(ret != HI_SUCCESS)) {
1294         oam_warning_log1(0, OAM_SF_ANY, "{wal_hipriv_send_bar::return err code [%u]!}\r\n", ret);
1295         return ret;
1296     }
1297 
1298     return HI_SUCCESS;
1299 }
1300 
1301 /* ****************************************************************************
1302  功能描述  : 测试命令,打开/关闭WMM
1303  修改历史      :
1304   1.日    期   : 2014年1月27日
1305     作    者   : HiSilicon
1306     修改内容   : 新生成函数
1307 **************************************************************************** */
1308 /* 大数组g_ast_hipriv_cmd的成员,其中wal_hipriv_getcountry修改了对应变量,lint_t e818告警屏蔽 */
wal_hipriv_wmm_switch(oal_net_device_stru * netdev,hi_char * pc_param)1309 static hi_u32 wal_hipriv_wmm_switch(oal_net_device_stru *netdev, hi_char *pc_param)
1310 {
1311     wal_msg_write_stru          write_msg;
1312     hi_u32                      ret;
1313     hi_char                     ac_name[WAL_HIPRIV_CMD_NAME_MAX_LEN] = {0};
1314     hi_u32                      off_set = 0;
1315     hi_u8                       open_wmm;
1316     hi_u8                       orig_dev_state = wal_dev_is_running();
1317 
1318     if (wal_netdev_stop(netdev) != HI_SUCCESS) {
1319         oam_warning_log0(0, OAM_SF_ANY, "{wal_hipriv_wmm_switch::wal_netdev_stop failed\r\n");
1320         return HI_FAIL;
1321     }
1322 
1323     /* 设备在up状态不允许配置,必须先down */
1324     if (wal_dev_is_running() == HI_TRUE) {
1325         oam_warning_log0(0, OAM_SF_ANY, "{wal_hipriv_wmm_switch::device is busy,can not set wmm!}\r\n");
1326         return HI_ERR_CODE_CONFIG_BUSY;
1327     }
1328 
1329     /* 获取设定的值 */
1330     ret = wal_get_cmd_one_arg(pc_param, ac_name, WAL_HIPRIV_CMD_NAME_MAX_LEN, &off_set);
1331     if (ret != HI_SUCCESS) {
1332         oam_warning_log1(0, OAM_SF_ANY, "{wal_hipriv_wmm_switch::get_one_arg return err_code [%d]!}", ret);
1333         return ret;
1334     }
1335 
1336     open_wmm = (hi_u8)oal_atoi(ac_name);
1337     /* 将用户输入值转化成0 1 */
1338     open_wmm = (hi_u8)((open_wmm == 0) ? HI_FALSE : HI_TRUE);
1339     /* **************************************************************************
1340                               抛事件到wal层处理
1341     ************************************************************************** */
1342     *(hi_u8 *)(write_msg.auc_value) = open_wmm;
1343     wal_write_msg_hdr_init(&write_msg, WLAN_CFGID_WMM_SWITCH, sizeof(hi_u8));
1344     ret = wal_send_cfg_event(netdev, WAL_MSG_TYPE_WRITE, WAL_MSG_WRITE_MSG_HDR_LENGTH + sizeof(hi_u8),
1345         (hi_u8 *)&write_msg, HI_FALSE, HI_NULL);
1346     if (oal_unlikely(ret != HI_SUCCESS)) {
1347         oam_warning_log1(0, OAM_SF_ANY, "{wal_hipriv_wmm_switch::return err code [%u]!}", ret);
1348         return ret;
1349     }
1350 
1351     if (orig_dev_state == HI_TRUE) {
1352         if (wal_netdev_open(netdev) != HI_SUCCESS) {
1353             oam_warning_log0(0, OAM_SF_ANY, "{wal_hipriv_wmm_switch::wal_netdev_open failed\r\n");
1354             return HI_FAIL;
1355         }
1356     }
1357     return HI_SUCCESS;
1358 }
1359 #endif
1360 
1361 #ifdef _PRE_DEBUG_MODE
1362 #ifdef _PRE_WLAN_FEATURE_HIPRIV
1363 /* ****************************************************************************
1364  功能描述  : 测试命令,打开/关闭隐藏ssid
1365 
1366  修改历史      :
1367   1.日    期   : 2014年1月27日
1368     作    者   : HiSilicon
1369     修改内容   : 新生成函数
1370 **************************************************************************** */
1371 /* 大数组g_ast_hipriv_cmd的成员,其中wal_hipriv_getcountry修改了对应变量,lint_t e818告警屏蔽 */
wal_hipriv_hide_ssid(oal_net_device_stru * netdev,hi_char * pc_param)1372 static hi_u32 wal_hipriv_hide_ssid(oal_net_device_stru *netdev, hi_char *pc_param)
1373 {
1374     wal_msg_write_stru          write_msg;
1375     hi_u32                      ret;
1376     hi_u16                      us_len;
1377     hi_char                     ac_name[WAL_HIPRIV_CMD_NAME_MAX_LEN] = {0};
1378     hi_u32                      off_set = 0;
1379     hi_u8                       hide_ssid;
1380 
1381     /* 获取设定的值 */
1382     ret = wal_get_cmd_one_arg(pc_param, ac_name, WAL_HIPRIV_CMD_NAME_MAX_LEN, &off_set);
1383     if (ret != HI_SUCCESS) {
1384         oam_warning_log1(0, OAM_SF_ANY, "{wal_hipriv_hide_ssid::wal_get_cmd_one_arg return err_code [%u]!}\r\n", ret);
1385         return ret;
1386     }
1387 
1388     hide_ssid = (hi_u8)oal_atoi(ac_name);
1389 
1390     /* **************************************************************************
1391                               抛事件到wal层处理
1392     ************************************************************************** */
1393     us_len = sizeof(hi_u8);
1394     *(hi_u8 *)(write_msg.auc_value) = hide_ssid;
1395     wal_write_msg_hdr_init(&write_msg, WLAN_CFGID_HIDE_SSID, us_len);
1396 
1397     ret = wal_send_cfg_event(netdev, WAL_MSG_TYPE_WRITE, WAL_MSG_WRITE_MSG_HDR_LENGTH + us_len, (hi_u8 *)&write_msg,
1398         HI_FALSE, HI_NULL);
1399     if (oal_unlikely(ret != HI_SUCCESS)) {
1400         oam_warning_log1(0, OAM_SF_ANY, "{wal_hipriv_hide_ssid::return err code [%u]!}\r\n", ret);
1401         return ret;
1402     }
1403 
1404     return HI_SUCCESS;
1405 }
1406 #endif
1407 #endif
1408 
1409 #ifdef _PRE_WLAN_FEATURE_HIPRIV
1410 /* ****************************************************************************
1411  功能描述  : 设置聚合最大个数
1412 
1413  修改历史      :
1414   1.日    期   : 2014年10月29日
1415     作    者   : HiSilicon
1416     修改内容   : 新生成函数
1417 **************************************************************************** */
1418 /* 大数组g_ast_hipriv_cmd的成员,其中wal_hipriv_getcountry修改了对应变量,lint_t e818告警屏蔽 */
wal_hipriv_set_ampdu_aggr_num(oal_net_device_stru * netdev,hi_char * pc_param)1419 static hi_u32 wal_hipriv_set_ampdu_aggr_num(oal_net_device_stru *netdev, hi_char *pc_param)
1420 {
1421     wal_msg_write_stru      write_msg;
1422     hi_u32                  off_set;
1423     hi_char                 ac_name[WAL_HIPRIV_CMD_NAME_MAX_LEN] = {0};
1424     mac_cfg_aggr_num_stru   aggr_num_ctl = {0};
1425     hi_u32                  ret;
1426 
1427     /* 安全编程规则6.6例外(1) 固定长度的结构体进行内存初始化 */
1428     memset_s((hi_u8 *)&write_msg, sizeof(wal_msg_write_stru), 0, sizeof(wal_msg_write_stru));
1429 
1430     ret = wal_get_cmd_one_arg(pc_param, ac_name, WAL_HIPRIV_CMD_NAME_MAX_LEN, &off_set);
1431     if (ret != HI_SUCCESS) {
1432         oam_warning_log1(0, OAM_SF_ANY, "{wal_hipriv_set_ampdu_aggr_num::get switch error[%u]!}\r\n", ret);
1433         return ret;
1434     }
1435     pc_param += off_set;
1436 
1437     aggr_num_ctl.aggr_num_switch = (hi_u8)oal_atoi(ac_name);
1438     if (aggr_num_ctl.aggr_num_switch == 0) {
1439         /* 不指定聚合个数时,聚合个数恢复为0 */
1440         aggr_num_ctl.aggr_num = 0;
1441     } else {
1442         /* 获取聚合个数 */
1443         ret = wal_get_cmd_one_arg(pc_param, ac_name, WAL_HIPRIV_CMD_NAME_MAX_LEN, &off_set);
1444         if (ret != HI_SUCCESS) {
1445             oam_warning_log1(0, OAM_SF_ANY, "{wal_hipriv_set_ampdu_aggr_num::get aggr_num error[%u]!}\r\n", ret);
1446             return ret;
1447         }
1448 
1449         aggr_num_ctl.aggr_num = (hi_u8)oal_atoi(ac_name);
1450 
1451         /* 超过聚合最大限制判断 */
1452         if (aggr_num_ctl.aggr_num > WLAN_AMPDU_TX_MAX_NUM) {
1453             oam_warning_log1(0, OAM_SF_ANY, "{wal_hipriv_set_ampdu_aggr_num::num err[%d]!}\r\n", aggr_num_ctl.aggr_num);
1454             return ret;
1455         }
1456     }
1457 
1458     /* **************************************************************************
1459                              抛事件到wal层处理
1460     ************************************************************************** */
1461     wal_write_msg_hdr_init(&write_msg, WLAN_CFGID_SET_AGGR_NUM, sizeof(aggr_num_ctl));
1462 
1463     /* 填写消息体,参数 */
1464     if (memcpy_s(write_msg.auc_value, WAL_MSG_WRITE_MAX_LEN, &aggr_num_ctl, sizeof(aggr_num_ctl)) != EOK) {
1465         oam_error_log0(0, OAM_SF_ANY, "{wal_hipriv_set_ampdu_aggr_num::mem safe function err!}");
1466         return HI_FAIL;
1467     }
1468 
1469     ret = wal_send_cfg_event(netdev, WAL_MSG_TYPE_WRITE, WAL_MSG_WRITE_MSG_HDR_LENGTH + sizeof(aggr_num_ctl),
1470         (hi_u8 *)&write_msg, HI_FALSE, HI_NULL);
1471     if (oal_unlikely(ret != HI_SUCCESS)) {
1472         oam_warning_log1(0, OAM_SF_ANY, "{wal_hipriv_set_ampdu_aggr_num::send event return err code [%u]!}\r\n", ret);
1473         return ret;
1474     }
1475 
1476     return HI_SUCCESS;
1477 }
1478 #endif
1479 
1480 #ifdef _PRE_DEBUG_MODE
1481 #ifdef _PRE_WLAN_FEATURE_HIPRIV
wal_hipriv_packet_xmit_send_event(oal_net_device_stru * netdev,hi_u8 * ra_mac_addr,hi_u8 tid,hi_u8 packet_num,hi_u16 packet_len)1482 hi_u32 wal_hipriv_packet_xmit_send_event(oal_net_device_stru *netdev, hi_u8 *ra_mac_addr, hi_u8 tid, hi_u8 packet_num,
1483     hi_u16 packet_len)
1484 {
1485     wal_msg_write_stru write_msg;
1486     wal_write_msg_hdr_init(&write_msg, WLAN_CFGID_PACKET_XMIT, sizeof(mac_cfg_mpdu_ampdu_tx_param_stru));
1487 
1488     /* 设置配置命令参数 */
1489     mac_cfg_mpdu_ampdu_tx_param_stru *aggr_tx_on_param = (mac_cfg_mpdu_ampdu_tx_param_stru *)(write_msg.auc_value);
1490     aggr_tx_on_param->packet_num    = packet_num;
1491     aggr_tx_on_param->tid           = tid;
1492     aggr_tx_on_param->us_packet_len = packet_len;
1493 
1494     if (memcpy_s(aggr_tx_on_param->auc_ra_mac, WLAN_MAC_ADDR_LEN, ra_mac_addr, WLAN_MAC_ADDR_LEN) != EOK) {
1495         oam_error_log0(0, OAM_SF_PWR, "{wal_hipriv_packet_xmit::mem safe function err!}");
1496         return HI_FAIL;
1497     }
1498 
1499     hi_u32 ret = wal_send_cfg_event(netdev, WAL_MSG_TYPE_WRITE,
1500         WAL_MSG_WRITE_MSG_HDR_LENGTH + sizeof(mac_cfg_mpdu_ampdu_tx_param_stru), (hi_u8 *)&write_msg, HI_FALSE,
1501         HI_NULL);
1502     if (oal_unlikely(ret != HI_SUCCESS)) {
1503         oam_warning_log1(0, OAM_SF_ANY, "{wal_hipriv_packet_xmit::return err code [%u]!}\r\n", ret);
1504         return ret;
1505     }
1506 
1507     return HI_SUCCESS;
1508 }
1509 
1510 /* ****************************************************************************
1511  功能描述  : 数据包发送
1512 
1513  修改历史      :
1514   1.日    期   : 2013年9月6日
1515     作    者   : HiSilicon
1516     修改内容   : 新生成函数
1517 
1518 **************************************************************************** */
wal_hipriv_packet_xmit(oal_net_device_stru * netdev,hi_char * pc_param)1519 static hi_u32 wal_hipriv_packet_xmit(oal_net_device_stru *netdev, hi_char *pc_param)
1520 {
1521     hi_u32             off_set;
1522     hi_char            ac_name[WAL_HIPRIV_CMD_NAME_MAX_LEN] = {0};
1523     hi_u8              ra_mac_addr[WLAN_MAC_ADDR_LEN] = {0};
1524     hi_u8              *ra_mac_addr_ptr = ra_mac_addr;
1525 
1526     hi_u32 ret = wal_get_cmd_one_arg(pc_param, ac_name, WAL_HIPRIV_CMD_NAME_MAX_LEN, &off_set);
1527     if (ret != HI_SUCCESS) {
1528         oam_warning_log1(0, OAM_SF_ANY, "{wal_hipriv_packet_xmit::wal_get_cmd_one_arg return err_code [%u]!}\r\n", ret);
1529         return ret;
1530     }
1531 
1532     hi_u8 tid = (hi_u8)oal_atoi(ac_name);
1533     if (tid >= WLAN_TID_MAX_NUM) {
1534         return HI_FAIL;
1535     }
1536     pc_param = pc_param + off_set;
1537 
1538     ret = wal_get_cmd_one_arg(pc_param, ac_name, WAL_HIPRIV_CMD_NAME_MAX_LEN, &off_set);
1539     if (ret != HI_SUCCESS) {
1540         oam_warning_log1(0, OAM_SF_ANY, "{wal_hipriv_packet_xmit::wal_get_cmd_one_arg return err_code [%u]!}\r\n", ret);
1541         return ret;
1542     }
1543     pc_param = pc_param + off_set;
1544 
1545     hi_u8 packet_num = (hi_u8)oal_atoi(ac_name);
1546 
1547     ret = wal_get_cmd_one_arg(pc_param, ac_name, WAL_HIPRIV_CMD_NAME_MAX_LEN, &off_set);
1548     if (ret != HI_SUCCESS) {
1549         oam_warning_log1(0, OAM_SF_ANY, "{wal_hipriv_packet_xmit::wal_get_cmd_one_arg return err_code [%u]!}\r\n", ret);
1550         return ret;
1551     }
1552 
1553     hi_u16 packet_len = (hi_u16)oal_atoi(ac_name);
1554     if (packet_len < 30) { /* 长度不能小于30 */
1555         return HI_FAIL;
1556     }
1557     pc_param += off_set;
1558 
1559     /* 获取MAC地址字符串 */
1560     ret = wal_get_cmd_one_arg(pc_param, ac_name, WAL_HIPRIV_CMD_NAME_MAX_LEN, &off_set);
1561     if (ret != HI_SUCCESS) {
1562         oam_warning_log1(0, OAM_SF_ANY, "{wal_hipriv_packet_xmit::get mac err_code [%d]!}\r\n", ret);
1563         return ret;
1564     }
1565     /* 地址字符串转地址数组 */
1566     oal_strtoaddr(ac_name, ra_mac_addr_ptr, WLAN_MAC_ADDR_LEN);
1567 
1568     /* **************************************************************************
1569                              抛事件到wal层处理
1570     ************************************************************************** */
1571     ret = wal_hipriv_packet_xmit_send_event(netdev, ra_mac_addr_ptr, tid, packet_num, packet_len);
1572     return ret;
1573 }
1574 
1575 /* ****************************************************************************
1576  功能描述  : 设置保护模式开关
1577 
1578  修改历史      :
1579   1.日    期   : 2014年2月27日
1580     作    者   : HiSilicon
1581     修改内容   : 新生成函数
1582 **************************************************************************** */
1583 /* 大数组g_ast_hipriv_cmd的成员,其中wal_hipriv_getcountry修改了对应变量,lint_t e818告警屏蔽 */
wal_hipriv_set_auto_protection(oal_net_device_stru * netdev,hi_char * pc_param)1584 static hi_u32 wal_hipriv_set_auto_protection(oal_net_device_stru *netdev, hi_char *pc_param)
1585 {
1586     wal_msg_write_stru          write_msg;
1587     hi_u32                      ret;
1588     hi_u16                      us_len;
1589     hi_char                     ac_name[WAL_HIPRIV_CMD_NAME_MAX_LEN] = {0};
1590     hi_u32                      off_set = 0;
1591     hi_u32                      auto_protection_flag;
1592 
1593     /* 获取mib名称 */
1594     ret = wal_get_cmd_one_arg(pc_param, ac_name, WAL_HIPRIV_CMD_NAME_MAX_LEN, &off_set);
1595     if (ret != HI_SUCCESS) {
1596         oam_warning_log1(0, OAM_SF_ANY,
1597             "{wal_hipriv_set_auto_protection::wal_get_cmd_one_arg return err_code [%u]!}\r\n", ret);
1598         return ret;
1599     }
1600 
1601     auto_protection_flag = (hi_u32)oal_atoi(ac_name);
1602 
1603     us_len = sizeof(hi_u32);
1604     *(hi_u32 *)(write_msg.auc_value) = auto_protection_flag;
1605     /* **************************************************************************
1606                               抛事件到wal层处理
1607     ************************************************************************** */
1608     wal_write_msg_hdr_init(&write_msg, WLAN_CFGID_SET_AUTO_PROTECTION, us_len);
1609 
1610     ret = wal_send_cfg_event(netdev, WAL_MSG_TYPE_WRITE, WAL_MSG_WRITE_MSG_HDR_LENGTH + us_len, (hi_u8 *)&write_msg,
1611         HI_FALSE, HI_NULL);
1612     if (oal_unlikely(ret != HI_SUCCESS)) {
1613         oam_warning_log1(0, OAM_SF_ANY, "{wal_hipriv_set_auto_protection::return err code [%u]!}\r\n", ret);
1614         return ret;
1615     }
1616 
1617     return HI_SUCCESS;
1618 }
1619 
1620 /* ****************************************************************************
1621  功能描述  : 停止背景扫描命令
1622 
1623  修改历史      :
1624   1.日    期   : 2015年10月31日
1625     作    者   : HiSilicon
1626     修改内容   : 新生成函数
1627 **************************************************************************** */
1628 /* 大数组g_ast_hipriv_cmd的成员,其中wal_hipriv_getcountry修改了对应变量,lint_t e818告警屏蔽 */
wal_hipriv_bgscan_enable(oal_net_device_stru * netdev,hi_char * pc_param)1629 static hi_u32 wal_hipriv_bgscan_enable(oal_net_device_stru *netdev, hi_char *pc_param)
1630 {
1631     hi_u32                off_set;
1632     hi_char               ac_stop[80] = {0}; /* 数组元素个数为80 */
1633     hi_u32                ret;
1634     wal_msg_write_stru    write_msg;
1635     hi_u8                 *pen_bgscan_enable_flag = HI_NULL;
1636 
1637     ret = wal_get_cmd_one_arg(pc_param, ac_stop, 80, &off_set); /* 传参易溢出,2---->80 */
1638     if (ret != HI_SUCCESS) {
1639         oam_warning_log0(0, OAM_SF_SCAN, "wal_hipriv_scan_stop: get first arg fail.");
1640         return HI_FAIL;
1641     }
1642 
1643     /* **************************************************************************
1644                             抛事件到wal层处理
1645     ************************************************************************** */
1646     wal_write_msg_hdr_init(&write_msg, WLAN_CFIGD_BGSCAN_ENABLE, sizeof(hi_u8));
1647 
1648     /* 设置配置命令参数 */
1649     pen_bgscan_enable_flag = (hi_u8 *)(write_msg.auc_value);
1650 
1651     *pen_bgscan_enable_flag = (hi_u8)oal_atoi(ac_stop);
1652 
1653     oam_warning_log1(0, OAM_SF_SCAN, "wal_hipriv_scan_stop:: bgscan_enable_flag= %d.", *pen_bgscan_enable_flag);
1654 
1655     ret = wal_send_cfg_event(netdev, WAL_MSG_TYPE_WRITE, WAL_MSG_WRITE_MSG_HDR_LENGTH + sizeof(hi_u8),
1656         (hi_u8 *)&write_msg, HI_FALSE, HI_NULL);
1657     if (ret != HI_SUCCESS) {
1658         oam_warning_log1(0, OAM_SF_ANY, "{wal_hipriv_packet_xmit::return err code [%u]!}\r\n", ret);
1659         return ret;
1660     }
1661 
1662     return HI_SUCCESS;
1663 }
1664 #endif
1665 #endif
1666 
1667 #ifdef _PRE_WLAN_FEATURE_BW_HIEX
1668 #ifdef _PRE_WLAN_FEATURE_HIPRIV
1669 /* ****************************************************************************
1670  功能描述      : 设置窄带切换到发送selfcts的参数
1671  修改历史      :
1672   1.日    期   : 2019年7月10日
1673     作    者   : HiSilicon
1674     修改内容   : 新生成函数
1675 **************************************************************************** */
1676 /* 大数组g_ast_hipriv_cmd的成员,其中wal_hipriv_getcountry修改了对应变量,lint_t e818告警屏蔽 */
wal_hipriv_hiex_config_selfcts(oal_net_device_stru * netdev,hi_char * pc_param)1677 static hi_u32 wal_hipriv_hiex_config_selfcts(oal_net_device_stru *netdev, hi_char *pc_param)
1678 {
1679     wal_msg_write_stru write_msg;
1680     hi_u32 off_set = 0;
1681     hi_char            ac_arg[WAL_HIPRIV_CMD_NAME_MAX_LEN] = {0};
1682 
1683     wal_write_msg_hdr_init(&write_msg, WLAN_CFGID_SET_SELFCTS, sizeof(mac_cfg_tx_comp_stru));
1684     wlan_selfcts_param_stru *param = (wlan_selfcts_param_stru *)(write_msg.auc_value);
1685 
1686     /* 发送selfcts使能 */
1687     hi_u32 ret = wal_get_cmd_one_arg(pc_param, ac_arg, WAL_HIPRIV_CMD_NAME_MAX_LEN, &off_set);
1688     if (ret != HI_SUCCESS) {
1689         oam_warning_log1(0, OAM_SF_ANY, "{wal_hipriv_hiex_config_selfcts::get selfcts error[%u]}\r\n", ret);
1690         return ret;
1691     }
1692     pc_param += off_set;
1693 
1694     param->selfcts = (hi_u8)oal_atoi(ac_arg);
1695     if ((param->selfcts != HI_TRUE) && (param->selfcts != HI_FALSE)) {
1696         oam_warning_log0(0, OAM_SF_ANY, "{wal_hipriv_hiex_config_selfcts::invalid enable param!}\r\n");
1697         return HI_FAIL;
1698     }
1699 
1700     /* selfcts的占用信道时间 */
1701     ret = wal_get_cmd_one_arg(pc_param, ac_arg, WAL_HIPRIV_CMD_NAME_MAX_LEN, &off_set);
1702     if (ret != HI_SUCCESS) {
1703         oam_warning_log1(0, OAM_SF_ANY, "{wal_hipriv_hiex_config_selfcts::get duration error[%u]}\r\n", ret);
1704         return ret;
1705     }
1706     pc_param += off_set;
1707 
1708     param->duration = (hi_u8)oal_atoi(ac_arg);
1709     if (param->duration > WAL_HIPRIV_SELFCTS_DURATION_MAX) {
1710         oam_warning_log0(0, OAM_SF_ANY, "{wal_hipriv_hiex_config_selfcts::invalid duration param!}\r\n");
1711         return HI_FAIL;
1712     }
1713 
1714     /* 发送selfcts的PER阈值 */
1715     ret = wal_get_cmd_one_arg(pc_param, ac_arg, WAL_HIPRIV_CMD_NAME_MAX_LEN, &off_set);
1716     if (ret != HI_SUCCESS) {
1717         oam_warning_log1(0, OAM_SF_ANY, "{wal_hipriv_hiex_config_selfcts::get duration error[%u]}\r\n", ret);
1718         return ret;
1719     }
1720 
1721     param->us_per = (hi_u16)oal_atoi(ac_arg);
1722     if (param->us_per > WAL_HIPRIV_SELFCTS_PER_MAX) {
1723         oam_warning_log0(0, OAM_SF_ANY, "{wal_hipriv_hiex_config_selfcts::invalid PER param!}\r\n");
1724         return HI_FAIL;
1725     }
1726 
1727     ret = wal_send_cfg_event(netdev, WAL_MSG_TYPE_WRITE, WAL_MSG_WRITE_MSG_HDR_LENGTH + sizeof(wlan_selfcts_param_stru),
1728         (hi_u8 *)&write_msg, HI_FALSE, HI_NULL);
1729     if (oal_unlikely(ret != HI_SUCCESS)) {
1730         oam_warning_log1(0, OAM_SF_ANY, "{wal_hipriv_hiex_config_selfcts::return err code [%u]!}\r\n", ret);
1731         return ret;
1732     }
1733 
1734     return HI_SUCCESS;
1735 }
1736 #endif
1737 #endif
1738 
1739 #ifdef _PRE_WLAN_FEATURE_OFFLOAD_FLOWCTL
1740 #ifdef _PRE_WLAN_FEATURE_HIPRIV
1741 /* ****************************************************************************
1742  功能描述  : 设置be,bk,vi,vo的每次调度报文个数,lowwater_line, high_waterline
1743 
1744  修改历史      :
1745   1.日    期   : 2015年08月24日
1746     作    者   : HiSilicon
1747     修改内容   : 新生成函数
1748 
1749 **************************************************************************** */
wal_hipriv_set_flowctl_param(oal_net_device_stru * netdev,hi_char * pc_param)1750 static hi_u32 wal_hipriv_set_flowctl_param(oal_net_device_stru *netdev, hi_char *pc_param)
1751 {
1752     wal_msg_write_stru          write_msg;
1753     hi_u32                      ret;
1754     hi_u32                      off_set = 0;
1755     hi_char                     ac_param[WAL_HIPRIV_CMD_NAME_MAX_LEN];
1756     mac_cfg_flowctl_param_stru  flowctl_param;
1757     mac_cfg_flowctl_param_stru *param = HI_NULL;
1758 
1759     /* sh hipriv.sh "Hisilicon0 set_flowctl_param 0/1/2/3 20 20 40" */
1760     /* 0/1/2/3 分别代表be,bk,vi,vo */
1761     /* 获取队列类型参数 */
1762     ret = wal_get_cmd_one_arg(pc_param, ac_param, &off_set);
1763     if (ret != HI_SUCCESS) {
1764         oam_warning_log1(0, OAM_SF_ANY, "{wal_hipriv_set_flowctl_param::get queue_type error[%u]}\r\n", ret);
1765         return ret;
1766     }
1767 
1768     flowctl_param.queue_type = (hi_u8)oal_atoi(ac_param);
1769 
1770     /* 设置队列对应的每次调度报文个数 */
1771     pc_param += off_set;
1772     ret = wal_get_cmd_one_arg(pc_param, ac_param, &off_set);
1773     if (ret != HI_SUCCESS) {
1774         oam_warning_log1(0, OAM_SF_ANY, "{wal_hipriv_set_flowctl_param::get burst_limit error[%d]}\r\n", ret);
1775         return (hi_u32)ret;
1776     }
1777 
1778     flowctl_param.us_burst_limit = (hi_u16)oal_atoi(ac_param);
1779 
1780     /* 设置队列对应的流控low_waterline */
1781     pc_param += off_set;
1782     ret = wal_get_cmd_one_arg(pc_param, ac_param, &off_set);
1783     if (ret != HI_SUCCESS) {
1784         oam_warning_log1(0, OAM_SF_ANY, "{wal_hipriv_set_flowctl_param::get low_waterline error[%d]}\r\n", ret);
1785         return (hi_u32)ret;
1786     }
1787 
1788     flowctl_param.us_low_waterline = (hi_u16)oal_atoi(ac_param);
1789 
1790     /* 设置队列对应的流控high_waterline */
1791     pc_param += off_set;
1792     ret = wal_get_cmd_one_arg(pc_param, ac_param, &off_set);
1793     if (ret != HI_SUCCESS) {
1794         oam_warning_log1(0, OAM_SF_ANY, "{wal_hipriv_set_flowctl_param::get high_waterline error[%d]}\r\n", ret);
1795         return (hi_u32)ret;
1796     }
1797 
1798     flowctl_param.us_high_waterline = (hi_u16)oal_atoi(ac_param);
1799 
1800     /* 申请事件内存 */
1801     wal_write_msg_hdr_init(&write_msg, WLAN_CFGID_SET_FLOWCTL_PARAM, sizeof(mac_cfg_flowctl_param_stru));
1802     param = (mac_cfg_flowctl_param_stru *)(write_msg.auc_value);
1803 
1804     param->queue_type = flowctl_param.queue_type;
1805     param->us_burst_limit = flowctl_param.us_burst_limit;
1806     param->us_low_waterline = flowctl_param.us_low_waterline;
1807     param->us_high_waterline = flowctl_param.us_high_waterline;
1808 
1809     /* **************************************************************************
1810                              抛事件到wal层处理
1811     ************************************************************************** */
1812     ret = wal_send_cfg_event(netdev, WAL_MSG_TYPE_WRITE,
1813         WAL_MSG_WRITE_MSG_HDR_LENGTH + sizeof(mac_cfg_flowctl_param_stru), (hi_u8 *)&write_msg, HI_FALSE, HI_NULL);
1814     if (oal_unlikely(ret != HI_SUCCESS)) {
1815         oam_warning_log1(0, OAM_SF_ANY, "{wal_hipriv_set_flowctl_param:: return err_code [%u]!}\r\n", ret);
1816         return ret;
1817     }
1818 
1819     return HI_SUCCESS;
1820 }
1821 
1822 /* ****************************************************************************
1823  功能描述  : 获取流控相关状态信息
1824 
1825  修改历史      :
1826   1.日    期   : 2015年08月24日
1827     作    者   : HiSilicon
1828     修改内容   : 新生成函数
1829 
1830 **************************************************************************** */
wal_hipriv_get_flowctl_stat(oal_net_device_stru * netdev,hi_char * pc_param)1831 static hi_u32 wal_hipriv_get_flowctl_stat(oal_net_device_stru *netdev, hi_char *pc_param)
1832 {
1833     wal_msg_write_stru write_msg;
1834     hi_u32 ret;
1835 
1836     /*  sh hipriv.sh "Hisilicon0 get_flowctl_stat" */
1837     /* 申请事件内存 */
1838     wal_write_msg_hdr_init(&write_msg, WLAN_CFGID_GET_FLOWCTL_STAT, sizeof(hi_u8));
1839 
1840     /* **************************************************************************
1841                              抛事件到wal层处理
1842     ************************************************************************** */
1843     ret = wal_send_cfg_event(netdev, WAL_MSG_TYPE_WRITE, WAL_MSG_WRITE_MSG_HDR_LENGTH + sizeof(hi_u8),
1844         (hi_u8 *)&write_msg, HI_FALSE, HI_NULL);
1845     if (oal_unlikely(ret != HI_SUCCESS)) {
1846         oam_warning_log1(0, OAM_SF_ANY, "{wal_hipriv_get_flowctl_stat:: return err_code [%u]!}\r\n", ret);
1847         return ret;
1848     }
1849 
1850     return HI_SUCCESS;
1851 }
1852 #endif
1853 #endif
1854 
1855 /* ****************************************************************************
1856  功能描述  : 设置管制域国家码
1857 
1858  修改历史      :
1859   1.日    期   : 2015年1月16日
1860     作    者   : HiSilicon
1861     修改内容   : 新生成函数
1862 **************************************************************************** */
1863 /* 大数组g_ast_hipriv_cmd的成员,其中wal_hipriv_getcountry修改了对应变量,lint_t e818告警屏蔽 */
wal_hipriv_setcountry(oal_net_device_stru * netdev,hi_char * pc_param)1864 hi_u32 wal_hipriv_setcountry(oal_net_device_stru *netdev, hi_char *pc_param)
1865 {
1866     hi_u32                        ret;
1867     hi_u32                        off_set;
1868     hi_char                       ac_arg[WAL_HIPRIV_CMD_NAME_MAX_LEN];
1869     hi_char                      *puc_para = HI_NULL;
1870 
1871     /* 设备在up状态不允许配置,必须先down */
1872     if (wal_dev_is_running() == HI_TRUE) {
1873         oam_warning_log0(0, OAM_SF_ANY, "{wal_hipriv_setcountry::device is busy,can not set country code!}\r\n");
1874         return HI_ERR_CODE_CONFIG_BUSY;
1875     }
1876     ret = wal_get_cmd_one_arg(pc_param, ac_arg, WAL_HIPRIV_CMD_NAME_MAX_LEN, &off_set);
1877     if (ret != HI_SUCCESS) {
1878         oam_warning_log1(0, OAM_SF_ANY, "{wal_hipriv_setcountry::wal_get_cmd_one_arg return err_code [%u]!}\r\n", ret);
1879         return ret;
1880     }
1881     puc_para = &ac_arg[0];
1882 
1883     pc_param += off_set;
1884     /* 判断命令长度是否有问题 */
1885     if (*pc_param != '\0') {
1886         oam_warning_log0(0, OAM_SF_ANY, "{wal_hipriv_user_info::cmd len error!}\r\n");
1887         return HI_FAIL;
1888     }
1889     if (strlen(puc_para) > (MAC_CONTRY_CODE_LEN - 1)) {
1890         return HI_FAIL;
1891     }
1892     ret = wal_regdomain_update(netdev, puc_para, MAC_CONTRY_CODE_LEN);
1893     if (ret != HI_SUCCESS) {
1894         oam_warning_log1(0, OAM_SF_ANY, "{wal_hipriv_setcountry::regdomain_update return err code %u!}\r\n", ret);
1895         return ret;
1896     }
1897 
1898     return HI_SUCCESS;
1899 }
1900 
1901 /* ****************************************************************************
1902  功能描述  : 删除vap
1903 **************************************************************************** */
wal_hipriv_del_vap(oal_net_device_stru * netdev)1904 hi_u32 wal_hipriv_del_vap(oal_net_device_stru *netdev)
1905 {
1906     mac_vap_stru *mac_vap = HI_NULL;
1907     /* 设备在up状态不允许删除,必须先down */
1908     if (oal_unlikely(0 != (OAL_IFF_RUNNING & oal_netdevice_flags(netdev)))) {
1909         oam_error_log1(0, OAM_SF_ANY, "{wal_hipriv_del_vap::netdev status[%d] is busy, please down it first!}",
1910             oal_netdevice_flags(netdev));
1911         return HI_ERR_CODE_CONFIG_BUSY;
1912     }
1913     /* 去注册 */
1914     mac_vap = (mac_vap_stru *)GET_NET_DEV_PRIV(netdev);
1915     if (mac_vap->vap_id == WLAN_CFG_VAP_ID) {
1916         oal_net_unregister_netdev(netdev);
1917         oal_net_free_netdev(netdev);
1918     }
1919 
1920     return HI_SUCCESS;
1921 }
1922 
1923 #if defined(_PRE_WLAN_FEATURE_HIPRIV) || defined(_PRE_WLAN_FEATURE_SIGMA)
1924 /* ****************************************************************************
1925  功能描述      : 使能低功耗
1926  命令格式      : hipriv wlan0 pm_switch 1/0
1927  修改历史      :
1928   1.日    期   : 2014年5月21日,星期三
1929     作    者   : HiSilicon
1930     修改内容   : 新生成函数
1931 **************************************************************************** */
1932 /* 大数组g_ast_hipriv_cmd的成员,其中wal_hipriv_getcountry修改了对应变量,lint_t e818告警屏蔽 */
wal_hipriv_set_pm_switch(oal_net_device_stru * netdev,hi_char * pc_param)1933 hi_u32 wal_hipriv_set_pm_switch(oal_net_device_stru *netdev, hi_char *pc_param)
1934 {
1935     wal_msg_write_stru  write_msg;
1936     hi_u32              ret;
1937     hi_u32              pm_cfg;
1938 
1939     if (pc_param == HI_NULL) {
1940         return HI_FAIL;
1941     }
1942 
1943     pm_cfg = (hi_u32)oal_atoi(pc_param);
1944     /* 缓存低功耗标志 */
1945     set_under_ps(pm_cfg == 1);
1946     /* **************************************************************************
1947                                 抛事件到wal层处理
1948     ************************************************************************** */
1949     wal_write_msg_hdr_init(&write_msg, WLAN_CFGID_SET_PM_SWITCH, sizeof(hi_u32));
1950     *((hi_u32 *)(write_msg.auc_value)) = pm_cfg;
1951     ret = wal_send_cfg_event(netdev, WAL_MSG_TYPE_WRITE, WAL_MSG_WRITE_MSG_HDR_LENGTH + sizeof(hi_u32),
1952         (hi_u8 *)&write_msg, HI_FALSE, HI_NULL);
1953     if (oal_unlikely(ret != HI_SUCCESS)) {
1954         oam_warning_log1(0, OAM_SF_ANY, "{wal_hipriv_pm_switch::return err code [%u]!}\r\n", ret);
1955         return ret;
1956     }
1957 
1958     return HI_SUCCESS;
1959 }
1960 
1961 /* ****************************************************************************
1962  功能描述      : 设置device 平台是否允许进入低功耗
1963  命令格式      : hipriv wlan0 pm_switch 1/0
1964  修改历史      :
1965   1.日    期   : 2020年6月4日
1966     作    者   : HiSilicon
1967     修改内容   : 新生成函数
1968 **************************************************************************** */
wal_hipriv_set_wlan_pm_enable(oal_net_device_stru * netdev,hi_char * pc_param)1969 hi_u32 wal_hipriv_set_wlan_pm_enable(oal_net_device_stru *netdev, hi_char *pc_param)
1970 {
1971     hi_u32 ret;
1972     hi_u32 pm_cfg;
1973 
1974     (void)netdev;
1975     if (pc_param == HI_NULL) {
1976         return HI_FAIL;
1977     }
1978 
1979     pm_cfg = (hi_u32)oal_atoi(pc_param);
1980     if (pm_cfg == 1) { /* 1: enable */
1981         ret = hi_wifi_plat_pm_enable();
1982     } else if (pm_cfg == 0) { /* 0: disable */
1983         ret = hi_wifi_plat_pm_disable();
1984     } else {
1985         printk("parameter error, enbale:1, disable:0 \r\n");
1986         ret = HI_FAIL;
1987     }
1988     return ret;
1989 }
1990 
wal_hipriv_setwk_fail_process(oal_net_device_stru * netdev,hi_char * pc_param)1991 hi_u32 wal_hipriv_setwk_fail_process(oal_net_device_stru *netdev, hi_char *pc_param)
1992 {
1993     hi_s32 pid;
1994 
1995     (void)netdev;
1996 
1997     if (pc_param == HI_NULL) {
1998         return HI_FAIL;
1999     }
2000     pid = (hi_u32)oal_atoi(pc_param);
2001     if (pid <= 0) {
2002         printk("[ERROR]pid less 0 \r\n");
2003         return HI_FAIL;
2004     }
2005     wlan_pm_set_wkfail_pid(pid);
2006     return HI_SUCCESS;
2007 }
2008 
wal_hipriv_dump_pm_info(oal_net_device_stru * netdev,hi_char * pc_param)2009 hi_u32 wal_hipriv_dump_pm_info(oal_net_device_stru *netdev, hi_char *pc_param)
2010 {
2011     hi_u8 is_host;
2012 
2013     (void)netdev;
2014 
2015     if (pc_param == HI_NULL) {
2016         return HI_FAIL;
2017     }
2018 
2019     is_host = (hi_u8)oal_atoi(pc_param);
2020     if (is_host > 1) { /* > 1: 无效参数 */
2021         printk("parameter error, host:1, device:0 \r\n");
2022         return HI_FAIL;
2023     }
2024     hi_wlan_dump_pm_info(is_host);
2025     return HI_SUCCESS;
2026 }
2027 
2028 /* ****************************************************************************
2029  功能描述      : 通知device侧,host睡眠状态
2030  命令格式      : hipriv wlan0 pm_switch 1/0
2031  修改历史      :
2032   1.日    期   : 2020年6月4日
2033     作    者   : HiSilicon
2034     修改内容   : 新生成函数
2035 **************************************************************************** */
wal_hipriv_set_host_sleep_status(oal_net_device_stru * netdev,hi_char * pc_param)2036 hi_u32 wal_hipriv_set_host_sleep_status(oal_net_device_stru *netdev, hi_char *pc_param)
2037 {
2038     hi_u32 ret;
2039     hi_u32 pm_cfg;
2040 
2041     (void)netdev;
2042     if (pc_param == HI_NULL) {
2043         return HI_FAIL;
2044     }
2045 
2046     pm_cfg = (hi_u32)oal_atoi(pc_param);
2047     if (pm_cfg == 1) { /* 1: enable */
2048         ret = (hi_u32)hi_wifi_host_request_sleep(1);
2049     } else if (pm_cfg == 0) { /* 0: disable */
2050         ret = (hi_u32)hi_wifi_host_request_sleep(0);
2051     } else {
2052         printk("parameter error, sleep:1, wake:0 \r\n");
2053         ret = HI_FAIL;
2054     }
2055     return ret;
2056 }
2057 
2058 
2059 #endif
2060 
2061 #if (_PRE_MULTI_CORE_MODE_OFFLOAD_DMAC == _PRE_MULTI_CORE_MODE)
2062 #ifdef _PRE_WLAN_FEATURE_HIPRIV
2063 /* ****************************************************************************
2064  功能描述  : 根据下发的对应标记位,上报对应的vap信息
2065 
2066  修改历史      :
2067   1.日    期   : 2015年7月20日
2068     作    者   : HiSilicon
2069     修改内容   : 新生成函数
2070 
2071 **************************************************************************** */
wal_hipriv_report_vap_info(oal_net_device_stru * netdev,hi_char * pc_param)2072 static hi_u32 wal_hipriv_report_vap_info(oal_net_device_stru *netdev, hi_char *pc_param)
2073 {
2074     wal_msg_write_stru          write_msg;
2075     hi_u32                      off_set;
2076     hi_u32                      flag_value;
2077     hi_char                     ac_name[WAL_HIPRIV_CMD_NAME_MAX_LEN] = {0};
2078     hi_u32                      ret;
2079 
2080     /* sh hipriv.sh "wlan0 report_vap_info  flags_value" */
2081     ret = wal_get_cmd_one_arg(pc_param, ac_name, WAL_HIPRIV_CMD_NAME_MAX_LEN, &off_set);
2082     if (ret != HI_SUCCESS) {
2083         oam_warning_log1(0, OAM_SF_ANY, "{wal_hipriv_report_vap_info::wal_get_cmd_one_arg return err_code [%u]!}\r\n",
2084             ret);
2085         return ret;
2086     }
2087 
2088     flag_value = (hi_u32)oal_atoi(ac_name);
2089 
2090     /* **************************************************************************
2091                              抛事件到wal层处理
2092     ************************************************************************** */
2093     wal_write_msg_hdr_init(&write_msg, WLAN_CFGID_REPORT_VAP_INFO, sizeof(hi_s32));
2094 
2095     /* 填写消息体,参数 */
2096     *(hi_u32 *)(write_msg.auc_value) = flag_value;
2097 
2098     ret = wal_send_cfg_event(netdev, WAL_MSG_TYPE_WRITE, WAL_MSG_WRITE_MSG_HDR_LENGTH + sizeof(hi_s32),
2099         (hi_u8 *)&write_msg, HI_FALSE, HI_NULL);
2100     if (oal_unlikely(ret != HI_SUCCESS)) {
2101         oam_warning_log1(0, OAM_SF_ANY, "{wal_hipriv_report_vap_info::wal_send_cfg_event return err code [%u]!}\r\n",
2102             ret);
2103         return ret;
2104     }
2105 
2106     return HI_SUCCESS;
2107 }
2108 #endif
2109 #endif
2110 
2111 #ifdef _PRE_WLAN_FEATURE_HIPRIV
2112 /* ****************************************************************************
2113  功能描述  : 设置随机mac addr扫描是否开启开关
2114 **************************************************************************** */
2115 /* 大数组g_ast_hipriv_cmd的成员,其中wal_hipriv_getcountry修改了对应变量,lint_t e818告警屏蔽 */
wal_hipriv_set_random_mac_addr_scan(oal_net_device_stru * netdev,hi_char * pc_param)2116 static hi_u32 wal_hipriv_set_random_mac_addr_scan(oal_net_device_stru *netdev, hi_char *pc_param)
2117 {
2118     wal_msg_write_stru          write_msg;
2119     hi_u32                      off_set;
2120     hi_char                     ac_name[WAL_HIPRIV_CMD_NAME_MAX_LEN] = {0};
2121     hi_u32                      ret;
2122     hi_u8                       rand_mac_addr_scan_switch;
2123 
2124     /* sh hipriv.sh "Hisilicon0 random_mac_addr_scan 0|1(开关)" */
2125     /* 获取帧方向 */
2126     ret = wal_get_cmd_one_arg(pc_param, ac_name, WAL_HIPRIV_CMD_NAME_MAX_LEN, &off_set);
2127     if (ret != HI_SUCCESS) {
2128         oam_warning_log1(0, OAM_SF_ANY, "{wal_hipriv_set_random_mac_addr_scan::get switch return err_code[%d]!}", ret);
2129         return ret;
2130     }
2131 
2132     rand_mac_addr_scan_switch = (hi_u8)oal_atoi(ac_name);
2133     /* 开关的取值范围为0|1,做参数合法性判断 */
2134     if (rand_mac_addr_scan_switch > 1) {
2135         oam_error_log1(0, OAM_SF_ANY, "{wal_hipriv_set_random_mac_addr_scan::param is error, switch_value[%d]!}",
2136             rand_mac_addr_scan_switch);
2137         return HI_FAIL;
2138     }
2139 
2140     /* **************************************************************************
2141                                 抛事件到wal层处理
2142     ************************************************************************** */
2143     wal_write_msg_hdr_init(&write_msg, WLAN_CFGID_SET_RANDOM_MAC_ADDR_SCAN, sizeof(hi_s32));
2144     *((hi_s32 *)(write_msg.auc_value)) = (hi_u32)rand_mac_addr_scan_switch;
2145 
2146     ret = wal_send_cfg_event(netdev, WAL_MSG_TYPE_WRITE, WAL_MSG_WRITE_MSG_HDR_LENGTH + sizeof(hi_s32),
2147         (hi_u8 *)&write_msg, HI_FALSE, HI_NULL);
2148     if (oal_unlikely(ret != HI_SUCCESS)) {
2149         oam_warning_log1(0, OAM_SF_ANY, "{wal_hipriv_set_random_mac_addr_scan::return err code[%u]!}", ret);
2150         return ret;
2151     }
2152 
2153     return HI_SUCCESS;
2154 }
2155 #endif
2156 
2157 #ifdef _PRE_WLAN_RF_110X_CALI_DPD
2158 #ifdef _PRE_WLAN_FEATURE_HIPRIV
2159 /* ****************************************************************************
2160  功能描述  : 开启DPD
2161 
2162  修改历史      :
2163   1.日    期   : 2014年6月17日
2164     作    者   : HiSilicon
2165     修改内容   : 新生成函数
2166 **************************************************************************** */
2167 /* 大数组g_ast_hipriv_cmd的成员,其中wal_hipriv_getcountry修改了对应变量,lint_t e818告警屏蔽 */
wal_hipriv_start_dpd(oal_net_device_stru * netdev,hi_char * pc_param)2168 static hi_u32 wal_hipriv_start_dpd(oal_net_device_stru *netdev, hi_char *pc_param)
2169 {
2170     wal_msg_write_stru              write_msg;
2171     hi_u32                          ret;
2172 
2173     /* **************************************************************************
2174                                 抛事件到wal层处理
2175     ************************************************************************** */
2176     wal_write_msg_hdr_init(&write_msg, WLAN_CFGID_START_DPD, sizeof(wal_specific_event_type_param_stru));
2177 
2178     ret = wal_send_cfg_event(netdev, WAL_MSG_TYPE_WRITE,
2179         WAL_MSG_WRITE_MSG_HDR_LENGTH + sizeof(wal_specific_event_type_param_stru), (hi_u8 *)&write_msg, HI_FALSE,
2180         HI_NULL);
2181     if (oal_unlikely(ret != HI_SUCCESS)) {
2182         oam_warning_log1(0, OAM_SF_ANY, "{wal_hipriv_start_dpd::return err code[%u]!}", ret);
2183         return ret;
2184     }
2185 
2186     return HI_SUCCESS;
2187 }
2188 #endif
2189 #endif
2190 
2191 #if defined(_PRE_WLAN_FEATURE_HIPRIV) || defined(_PRE_WLAN_FEATURE_SIGMA)
2192 /* ****************************************************************************
2193  功能描述  :  设置UAPSD开关
2194 
2195  修改历史      :
2196   1.日    期   : 2016年1月30日,星期六
2197     作    者   : HiSilicon
2198     修改内容   : 新生成函数
2199 **************************************************************************** */
2200 /* 大数组g_ast_hipriv_cmd的成员,其中wal_hipriv_getcountry修改了对应变量,lint_t e818告警屏蔽 */
wal_hipriv_set_uapsd_cap(oal_net_device_stru * netdev,hi_char * pc_param)2201 hi_u32 wal_hipriv_set_uapsd_cap(oal_net_device_stru *netdev, hi_char *pc_param)
2202 {
2203     wal_msg_write_stru       write_msg;
2204     hi_s32                   l_tmp;
2205     hi_u32                   off_set;
2206     hi_char                  ac_name[WAL_HIPRIV_CMD_NAME_MAX_LEN] = {0};
2207     hi_u32                   ret;
2208     hi_u8                    orig_dev_state = wal_dev_is_running();
2209 
2210     if (wal_netdev_stop(netdev) != HI_SUCCESS) {
2211         oam_warning_log0(0, OAM_SF_ANY, "{wal_hipriv_set_uapsd_cap::wal_netdev_stop failed\r\n");
2212         return HI_FAIL;
2213     }
2214 
2215     /* 此处将解析出"1"或"0"存入ac_name */
2216     ret = wal_get_cmd_one_arg(pc_param, ac_name, WAL_HIPRIV_CMD_NAME_MAX_LEN, &off_set);
2217     if (ret != HI_SUCCESS) {
2218         oam_warning_log1(0, OAM_SF_ANY, "{wal_hipriv_set_uapsd_cap::wal_get_cmd_one_arg return err_code[%d]}\r\n", ret);
2219         return ret;
2220     }
2221 
2222     /* 针对解析出的不同命令,对UAPSD开关进行不同的设置 */
2223     if (0 == (strcmp("0", ac_name))) {
2224         l_tmp = 0;
2225     } else if (0 == (strcmp("1", ac_name))) {
2226         l_tmp = 1;
2227     } else {
2228         oam_warning_log1(0, OAM_SF_ANY, "{wal_hipriv_set_uapsd_cap::the log switch command is error [%p]!}\r\n",
2229             (uintptr_t)ac_name);
2230         return HI_ERR_CODE_INVALID_CONFIG;
2231     }
2232 
2233     /* **************************************************************************
2234                                 抛事件到wal层处理
2235     ************************************************************************** */
2236     wal_write_msg_hdr_init(&write_msg, WLAN_CFGID_UAPSD_EN, sizeof(hi_s32));
2237     *((hi_s32 *)(write_msg.auc_value)) = l_tmp; /* 设置配置命令参数 */
2238 
2239     ret = wal_send_cfg_event(netdev, WAL_MSG_TYPE_WRITE, WAL_MSG_WRITE_MSG_HDR_LENGTH + sizeof(hi_s32),
2240         (hi_u8 *)&write_msg, HI_FALSE, HI_NULL);
2241     if (oal_unlikely(ret != HI_SUCCESS)) {
2242         oam_warning_log1(0, OAM_SF_ANY, "{wal_hipriv_set_uapsd_cap::return err code [%u]!}\r\n", ret);
2243         return ret;
2244     }
2245 
2246     if (orig_dev_state == HI_TRUE) {
2247         if (wal_netdev_open(netdev) != HI_SUCCESS) {
2248             oam_warning_log0(0, OAM_SF_ANY, "{wal_hipriv_set_uapsd_cap::wal_netdev_stop failed\r\n");
2249             return HI_FAIL;
2250         }
2251     }
2252 
2253     return HI_SUCCESS;
2254 }
2255 #endif
2256 
2257 /* ****************************************************************************
2258  功能描述  : 设置non-HT模式下的速率
2259 
2260  修改历史      :
2261   1.日    期   : 2014年3月12日
2262     作    者   : HiSilicon
2263     修改内容   : 新生成函数
2264 **************************************************************************** */
2265 /* 大数组g_ast_hipriv_cmd的成员,其中wal_hipriv_getcountry修改了对应变量,lint_t e818告警屏蔽 */
wal_hipriv_set_rate(oal_net_device_stru * netdev,hi_char * pc_param)2266 hi_u32 wal_hipriv_set_rate(oal_net_device_stru *netdev, hi_char *pc_param)
2267 {
2268     wal_msg_write_stru                  write_msg;
2269     hi_u32                              off_set;
2270     hi_u32                              ret;
2271     mac_cfg_non_ht_rate_stru           *set_rate_param = HI_NULL;
2272     wlan_legacy_rate_value_enum_uint8   rate_index;
2273     hi_char                             ac_arg[WAL_HIPRIV_CMD_NAME_MAX_LEN] = {0};
2274 
2275     /* **************************************************************************
2276                                 抛事件到wal层处理
2277     ************************************************************************** */
2278     wal_write_msg_hdr_init(&write_msg, WLAN_CFGID_SET_RATE, sizeof(mac_cfg_non_ht_rate_stru));
2279 
2280     /* 解析并设置配置命令参数 */
2281     set_rate_param = (mac_cfg_non_ht_rate_stru *)(write_msg.auc_value);
2282 
2283     /* 获取速率值字符串 */
2284     ret = wal_get_cmd_one_arg(pc_param, ac_arg, WAL_HIPRIV_CMD_NAME_MAX_LEN, &off_set);
2285     if (ret != HI_SUCCESS) {
2286         oam_warning_log1(0, OAM_SF_ANY, "{wal_hipriv_set_rate::wal_get_cmd_one_arg return err_code [%u]!}\r\n", ret);
2287         return ret;
2288     }
2289 
2290     /* 解析是设置为哪一级速率 */
2291     for (rate_index = 0; rate_index < WLAN_LEGACY_RATE_VALUE_BUTT; rate_index++) {
2292         if (!strcmp(g_pauc_non_ht_rate_tbl[rate_index], ac_arg)) {
2293             break;
2294         }
2295     }
2296 
2297     /* 根据速率配置TX描述符中的协议模式 */
2298     if (rate_index <= WLAN_SHORT_11B_11_M_BPS) {
2299         set_rate_param->protocol_mode = WLAN_11B_PHY_PROTOCOL_MODE;
2300     } else if (rate_index >= WLAN_LEGACY_OFDM_48M_BPS && rate_index <= WLAN_LEGACY_OFDM_9M_BPS) {
2301         set_rate_param->protocol_mode = WLAN_LEGACY_OFDM_PHY_PROTOCOL_MODE;
2302     } else {
2303         oam_warning_log0(0, OAM_SF_ANY, "{wal_hipriv_set_rate::invalid rate!}\r\n");
2304         return HI_ERR_CODE_INVALID_CONFIG;
2305     }
2306 
2307     /* 解析要设置为多大的值 */
2308     set_rate_param->rate = rate_index;
2309 
2310     ret = wal_send_cfg_event(netdev, WAL_MSG_TYPE_WRITE,
2311         WAL_MSG_WRITE_MSG_HDR_LENGTH + sizeof(mac_cfg_non_ht_rate_stru), (hi_u8 *)&write_msg, HI_FALSE, HI_NULL);
2312     if (oal_unlikely(ret != HI_SUCCESS)) {
2313         oam_warning_log1(0, OAM_SF_ANY, "{wal_hipriv_set_rate::return err code [%u]!}\r\n", ret);
2314         return ret;
2315     }
2316     return HI_SUCCESS;
2317 }
2318 
2319 /* ****************************************************************************
2320  功能描述  : 设置HT模式下的速率
2321 
2322  修改历史      :
2323   1.日    期   : 2014年3月12日
2324     作    者   : HiSilicon
2325     修改内容   : 新生成函数
2326 **************************************************************************** */
2327 /* 大数组g_ast_hipriv_cmd的成员,其中wal_hipriv_getcountry修改了对应变量,lint_t e818告警屏蔽 */
wal_hipriv_set_mcs(oal_net_device_stru * netdev,hi_char * pc_param)2328 hi_u32 wal_hipriv_set_mcs(oal_net_device_stru *netdev, hi_char *pc_param)
2329 {
2330     wal_msg_write_stru            write_msg;
2331     hi_u32                        off_set;
2332     hi_u32                        ret;
2333     mac_cfg_tx_comp_stru          *set_mcs_param = HI_NULL;
2334     hi_s32                        l_mcs;
2335     hi_char                       ac_arg[WAL_HIPRIV_CMD_NAME_MAX_LEN] = {0};
2336     hi_s32                        l_idx = 0;
2337 
2338     /* **************************************************************************
2339                                 抛事件到wal层处理
2340     ************************************************************************** */
2341     wal_write_msg_hdr_init(&write_msg, WLAN_CFGID_SET_MCS, sizeof(mac_cfg_tx_comp_stru));
2342 
2343     /* 解析并设置配置命令参数 */
2344     set_mcs_param = (mac_cfg_tx_comp_stru *)(write_msg.auc_value);
2345 
2346     /* 获取速率值字符串 */
2347     ret = wal_get_cmd_one_arg(pc_param, ac_arg, WAL_HIPRIV_CMD_NAME_MAX_LEN, &off_set);
2348     if (ret != HI_SUCCESS) {
2349         oam_warning_log1(0, OAM_SF_ANY, "{wal_hipriv_set_mcs::wal_get_cmd_one_arg return err_code [%u]!}\r\n", ret);
2350         return ret;
2351     }
2352 
2353     /* 输入命令合法性检测 */
2354     while (ac_arg[l_idx] != '\0') {
2355         if (isdigit(ac_arg[l_idx])) {
2356             l_idx++;
2357             continue;
2358         } else {
2359             oam_warning_log0(0, OAM_SF_ANY, "{wal_hipriv_set_mcs::input illegal!}\r\n");
2360             return HI_ERR_CODE_INVALID_CONFIG;
2361         }
2362     }
2363 
2364     /* 解析要设置为多大的值 */
2365     l_mcs = oal_atoi(ac_arg);
2366     if ((l_mcs < WAL_HIPRIV_HT_MCS_MIN) || (l_mcs > WAL_HIPRIV_HT_MCS_MAX)) {
2367         oam_warning_log1(0, OAM_SF_ANY, "{wal_hipriv_set_mcs::input val out of range [%d]!}\r\n", l_mcs);
2368         return HI_ERR_CODE_INVALID_CONFIG;
2369     }
2370 
2371     set_mcs_param->param = (hi_u8)l_mcs;
2372     set_mcs_param->protocol_mode = WLAN_HT_PHY_PROTOCOL_MODE;
2373 
2374     ret = wal_send_cfg_event(netdev, WAL_MSG_TYPE_WRITE, WAL_MSG_WRITE_MSG_HDR_LENGTH + sizeof(mac_cfg_tx_comp_stru),
2375         (hi_u8 *)&write_msg, HI_FALSE, HI_NULL);
2376     if (oal_unlikely(ret != HI_SUCCESS)) {
2377         oam_warning_log1(0, OAM_SF_ANY, "{wal_hipriv_set_mcs::return err code [%u]!}\r\n", ret);
2378         return ret;
2379     }
2380     return HI_SUCCESS;
2381 }
2382 
2383 /* ****************************************************************************
2384  功能描述  : 获取带宽
2385 
2386  修改历史      :
2387   1.日    期   : 2014年3月12日
2388     作    者   : HiSilicon
2389     修改内容   : 新生成函数
2390 **************************************************************************** */
wal_hipriv_get_bw(oal_net_device_stru * netdev,hal_channel_assemble_enum_uint8 * pen_bw_index)2391 hi_u32 wal_hipriv_get_bw(oal_net_device_stru *netdev, hal_channel_assemble_enum_uint8 *pen_bw_index)
2392 {
2393     hi_u32                         ret;
2394     wal_msg_query_stru             query_msg;
2395     wal_msg_stru                   *rsp_msg = HI_NULL;
2396     wal_msg_rsp_stru               *query_rsp_msg = HI_NULL;
2397     mac_cfg_tx_comp_stru           *set_bw_param = HI_NULL;
2398 
2399     if (netdev == HI_NULL) {
2400         oam_error_log0(0, 0, "wal_hipriv_get_bw device NULL.");
2401         return HI_ERR_CODE_PTR_NULL;
2402     }
2403 
2404     query_msg.wid = WLAN_CFGID_SET_BW;
2405     /* 发送消息 */
2406     ret = wal_send_cfg_event(netdev, WAL_MSG_TYPE_QUERY, WAL_MSG_WID_LENGTH, (hi_u8 *)&query_msg, HI_TRUE, &rsp_msg);
2407     if ((ret != HI_SUCCESS) || (rsp_msg == HI_NULL)) {
2408         oam_warning_log1(0, OAM_SF_ANY, "{wal_hipriv_get_bw::wal_alloc_cfg_event return err code %u!}\r\n", ret);
2409         return HI_FAIL;
2410     }
2411 
2412     /* 处理返回消息 */
2413     query_rsp_msg = (wal_msg_rsp_stru *)(rsp_msg->auc_msg_data);
2414     set_bw_param = (mac_cfg_tx_comp_stru *)(query_rsp_msg->auc_value);
2415     *pen_bw_index = (hal_channel_assemble_enum_uint8)set_bw_param->param;
2416     oal_free(rsp_msg);
2417 
2418     return ret;
2419 }
2420 
2421 /* ****************************************************************************
2422  功能描述  : 设置带宽
2423  修改历史      :
2424   1.日    期   : 2014年3月12日
2425     作    者   : HiSilicon
2426     修改内容   : 新生成函数
2427 **************************************************************************** */
2428 /* 大数组g_ast_hipriv_cmd的成员,其中wal_hipriv_getcountry修改了对应变量,lint_t e818告警屏蔽 */
wal_hipriv_set_bw(oal_net_device_stru * netdev,hi_char * pc_param)2429 hi_u32 wal_hipriv_set_bw(oal_net_device_stru *netdev, hi_char *pc_param)
2430 {
2431     wal_msg_write_stru write_msg;
2432     hi_u32 off_set, ret;
2433     hal_channel_assemble_enum_uint8 bw_index = WLAN_BAND_ASSEMBLE_20M;
2434     hi_char                         ac_arg[WAL_HIPRIV_CMD_NAME_MAX_LEN] = {0};
2435 
2436     /* **************************************************************************
2437                                 抛事件到wal层处理
2438     ************************************************************************** */
2439     wal_write_msg_hdr_init(&write_msg, WLAN_CFGID_SET_BW, sizeof(mac_cfg_tx_comp_stru));
2440 
2441     /* 解析并设置配置命令参数 */
2442     mac_cfg_tx_comp_stru *set_bw_param = (mac_cfg_tx_comp_stru *)(write_msg.auc_value);
2443 
2444     /* 获取带宽值字符串 */
2445     if (wal_get_cmd_one_arg(pc_param, ac_arg, WAL_HIPRIV_CMD_NAME_MAX_LEN, &off_set) != HI_SUCCESS) {
2446         oam_warning_log0(0, OAM_SF_ANY, "{wal_hipriv_set_bw::wal_get_cmd_one_arg failed!}\r\n");
2447         return HI_FAIL;
2448     }
2449 
2450     if (strcmp(ac_arg, "info") == 0) {
2451         if (wal_hipriv_get_bw(netdev, &bw_index) != HI_SUCCESS) {
2452             oam_warning_log0(0, OAM_SF_ANY, "{wal_hipriv_set_bw::wal_hipriv_get_bw failed!}\r\n");
2453             return HI_FAIL;
2454         }
2455         if (bw_index == WLAN_BAND_ASSEMBLE_5M) {
2456             oam_info_log0(0, OAM_SF_ANY, "{wal_hipriv_set_bw::HIEX 5M.}\n");
2457         } else if (bw_index == WLAN_BAND_ASSEMBLE_10M) {
2458             oam_info_log0(0, OAM_SF_ANY, "{wal_hipriv_set_bw::HIEX 10M.}\n");
2459         } else if (bw_index == WLAN_BAND_ASSEMBLE_20M) {
2460             oam_info_log0(0, OAM_SF_ANY, "{wal_hipriv_set_bw::LEGACY 20M.}\n");
2461         }
2462         return HI_SUCCESS;
2463     } else if ((OAL_IFF_RUNNING & oal_netdevice_flags(netdev)) != 0) { /* 设备在up状态不允许配置,必须先down */
2464         oam_error_log1(0, OAM_SF_ANY, "{wal_hipriv_set_bw::device busy,down it first %d}", oal_netdevice_flags(netdev));
2465         return HI_FAIL;
2466     }
2467 
2468     /* 解析要设置为多大的值 */
2469     for (bw_index = 0; bw_index < WLAN_BAND_ASSEMBLE_AUTO; bw_index++) {
2470         if (strcmp(g_pauc_bw_tbl[bw_index], ac_arg) == 0) {
2471             break;
2472         }
2473     }
2474 
2475     /* 检查命令是否打错 */
2476     if (bw_index >= WLAN_BAND_ASSEMBLE_AUTO) {
2477         oam_warning_log0(0, OAM_SF_ANY, "{wal_hipriv_set_bw::not support this bandwidth!}\r\n");
2478         return HI_ERR_CODE_INVALID_CONFIG;
2479     }
2480 
2481     set_bw_param->param = (hi_u8)(bw_index);
2482     ret = wal_send_cfg_event(netdev, WAL_MSG_TYPE_WRITE, WAL_MSG_WRITE_MSG_HDR_LENGTH + sizeof(mac_cfg_tx_comp_stru),
2483         (hi_u8 *)&write_msg, HI_FALSE, HI_NULL);
2484     if (oal_unlikely(ret != HI_SUCCESS)) {
2485         oam_warning_log1(0, OAM_SF_ANY, "{wal_hipriv_set_bw::return err code [%u]!}\r\n", ret);
2486         return ret;
2487     }
2488 
2489     return HI_SUCCESS;
2490 }
2491 
2492 /* ****************************************************************************
2493  功能描述  : 数据常发
2494 
2495  修改历史      :
2496   1.日    期   : 2014年3月12日
2497     作    者   : HiSilicon
2498     修改内容   : 新生成函数
2499 
2500 **************************************************************************** */
wal_hipriv_always_tx(oal_net_device_stru * netdev,hi_u8 tx_flag)2501 hi_u32 wal_hipriv_always_tx(oal_net_device_stru *netdev, hi_u8 tx_flag)
2502 {
2503     wal_msg_write_stru    write_msg;
2504     hi_u32                ret;
2505     mac_cfg_tx_comp_stru *set_bcast_param = HI_NULL;
2506 
2507     /* **************************************************************************
2508                                 抛事件到wal层处理
2509     ************************************************************************** */
2510     wal_write_msg_hdr_init(&write_msg, WLAN_CFGID_SET_ALWAYS_TX, sizeof(mac_cfg_tx_comp_stru));
2511 
2512     /* 解析并设置配置命令参数 */
2513     set_bcast_param = (mac_cfg_tx_comp_stru *)(write_msg.auc_value);
2514     set_bcast_param->param = tx_flag;
2515     if (tx_flag == 0) {
2516         set_bcast_param->payload_flag = RF_PAYLOAD_ALL_ZERO;
2517         set_bcast_param->payload_len = 0;
2518     } else {
2519         set_bcast_param->payload_flag = RF_PAYLOAD_RAND;
2520         set_bcast_param->payload_len = 2000; /* 2000:常发payload长度 */
2521     }
2522 
2523     ret = wal_send_cfg_event(netdev, WAL_MSG_TYPE_WRITE, WAL_MSG_WRITE_MSG_HDR_LENGTH + sizeof(mac_cfg_tx_comp_stru),
2524         (hi_u8 *)&write_msg, HI_FALSE, HI_NULL);
2525     if (oal_unlikely(ret != HI_SUCCESS)) {
2526         oam_warning_log2(0, OAM_SF_ANY, "{wal_hipriv_always_tx:: return Err=%u, tx_flag=%d}", ret, tx_flag);
2527     } else {
2528         if ((tx_flag == WAL_ALWAYS_TX_RF) || (tx_flag == WAL_ALWAYS_TX_DC)) {
2529 #if _PRE_WLAN_FEATURE_MFG_TEST
2530             printk("OK\r\n");
2531 #endif
2532         }
2533     }
2534 
2535     return ret;
2536 }
2537 
2538 /* ****************************************************************************
2539  功能描述  : 数据常收
2540 
2541  修改历史      :
2542   1.日    期   : 2014年3月28日
2543     作    者   : HiSilicon
2544     修改内容   : 新生成函数
2545 
2546 **************************************************************************** */
wal_hipriv_always_rx(oal_net_device_stru * netdev,hi_u8 rx_flag,hi_u8 mac_filter_flag)2547 hi_u32 wal_hipriv_always_rx(oal_net_device_stru *netdev, hi_u8 rx_flag, hi_u8 mac_filter_flag)
2548 {
2549     wal_msg_write_stru    write_msg;
2550     hi_u32                ret;
2551     hi_u8                *param = write_msg.auc_value;
2552 
2553     /* 安全编程规则6.6例外(1) 对固定长度的结构体进行内存初始化 */
2554     memset_s(&write_msg, sizeof(wal_msg_write_stru), 0, sizeof(wal_msg_write_stru));
2555 
2556     param[0] = rx_flag;
2557     param[1] = mac_filter_flag;
2558 
2559     /* **************************************************************************
2560                                 抛事件到wal层处理
2561     ************************************************************************** */
2562     wal_write_msg_hdr_init(&write_msg, WLAN_CFGID_SET_ALWAYS_RX, 2); /* 常收开关和过滤开关占用2字节 */
2563 
2564     ret = wal_send_cfg_event(netdev, WAL_MSG_TYPE_WRITE,
2565         WAL_MSG_WRITE_MSG_HDR_LENGTH + 2, /* 常收开关和过滤开关占用2字节 */
2566         (hi_u8 *)&write_msg, HI_FALSE, HI_NULL);
2567     if (oal_unlikely(ret != HI_SUCCESS)) {
2568         oam_warning_log2(0, OAM_SF_ANY, "{wal_hipriv_always_rx::return err code=%u, rx_flag=%d}", ret, rx_flag);
2569     } else {
2570         if (rx_flag == 1) {
2571 #if _PRE_WLAN_FEATURE_MFG_TEST
2572             printk("OK\r\n");
2573 #endif
2574         }
2575     }
2576 
2577     return ret;
2578 }
2579 
2580 #if (_PRE_OS_VERSION_LINUX == _PRE_OS_VERSION)
2581 #ifdef _PRE_WLAN_FEATURE_HIPRIV
2582 #if (LINUX_VERSION_CODE < kernel_version(3, 4, 35))
2583 /* ****************************************************************************
2584  功能描述  : proc write函数
2585  输入参数  : 无
2586  输出参数  : 无
2587  返 回 值  : 处理字节的长度
2588 **************************************************************************** */
wal_hipriv_proc_write(hi_s32 fd,const hi_char * pc_buffer,hi_u32 len,hi_void * data)2589 static hi_u32 wal_hipriv_proc_write(hi_s32 fd, const hi_char *pc_buffer, hi_u32 len, hi_void *data)
2590 {
2591     hi_char  *pc_cmd = HI_NULL;
2592     hi_u32    ret;
2593 
2594     if (len > WAL_HIPRIV_CMD_MAX_LEN) {
2595         oam_error_log1(0, OAM_SF_ANY, "{wal_hipriv_proc_write::ul_len>WAL_HIPRIV_CMD_MAX_LEN, ul_len [%d]!}\r\n", len);
2596         return HI_FAIL;
2597     }
2598 
2599     pc_cmd = oal_mem_alloc(OAL_MEM_POOL_ID_LOCAL, WAL_HIPRIV_CMD_MAX_LEN);
2600     if (oal_unlikely(pc_cmd == HI_NULL)) {
2601         oam_warning_log0(0, OAM_SF_ANY, "{wal_hipriv_proc_write::alloc mem return null ptr!}\r\n");
2602         return HI_ERR_WIFI_WAL_MALLOC_FAIL;
2603     }
2604     /* 安全编程规则6.6例外(3)从堆中分配内存后,赋予初值 */
2605     memset_s(pc_cmd, WAL_HIPRIV_CMD_MAX_LEN, 0, WAL_HIPRIV_CMD_MAX_LEN);
2606 
2607     ret = oal_copy_from_user((hi_void *)pc_cmd, len, pc_buffer, len);
2608     /* copy_from_user函数的目的是从用户空间拷贝数据到内核空间,失败返回没有被拷贝的字节数,成功返回0 */
2609     if (ret > 0) {
2610         oam_warning_log1(0, OAM_SF_ANY, "{wal_hipriv_proc_write::oal_copy_from_user return ul_ret[%d]!}\r\n", ret);
2611         oal_mem_free(pc_cmd);
2612         return HI_ERR_WIFI_WAL_FAILURE;
2613     }
2614 
2615     pc_cmd[len - 1] = '\0';
2616     if (len == wal_hipriv_entry(pc_cmd, (hi_u32)len)) {
2617         oam_warning_log0(0, OAM_SF_ANY, "hipriv success!");
2618     } else {
2619         oam_warning_log0(0, OAM_SF_ANY, "hipriv failed!");
2620     }
2621     oal_mem_free(pc_cmd);
2622 
2623     return len;
2624 }
2625 #endif
2626 #endif
2627 #ifdef _PRE_CONFIG_CONN_HISI_SYSFS_SUPPORT
2628 /* ****************************************************************************
2629  功能描述  : 创建proc入口
2630  输入参数  : p_proc_arg: 创建proc参数,此处不使用
2631  输出参数  : 无
2632  返 回 值  : 错误码
2633 **************************************************************************** */
wal_hipriv_create_proc(hi_void * proc_arg)2634 hi_u32 wal_hipriv_create_proc(hi_void *proc_arg)
2635 {
2636 #ifdef _PRE_CONFIG_CONN_HISI_SYSFS_SUPPORT
2637     hi_u32 ret;
2638 #endif
2639 
2640 #if (LINUX_VERSION_CODE >= kernel_version(3, 4, 35)) || (_PRE_OS_VERSION_LITEOS == _PRE_OS_VERSION)
2641     g_proc_entry = HI_NULL;
2642 #else
2643 
2644     /* 420十进制对应八进制是0644 linux模式定义 S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH); */
2645     /* S_IRUSR文件所有者具可读取权限, S_IWUSR文件所有者具可写入权限, S_IRGRP用户组具可读取权限,
2646      * S_IROTH其他用户具可读取权限 */
2647     g_proc_entry = oal_create_proc_entry(WAL_HIPRIV_PROC_ENTRY_NAME, 420, NULL); /* 420十进制对应八进制是0644 */
2648     if (g_proc_entry == HI_NULL) {
2649         oam_warning_log0(0, OAM_SF_ANY, "{wal_hipriv_create_proc::oal_create_proc_entry return null ptr!}\r\n");
2650         return HI_FAIL;
2651     }
2652 
2653     g_proc_entry->data  = proc_arg;
2654     g_proc_entry->nlink = 1;        /* linux创建proc默认值 */
2655     g_proc_entry->read_proc  = HI_NULL;
2656 
2657     g_proc_entry->write_proc = (write_proc_t *)wal_hipriv_proc_write;
2658 
2659 #endif
2660     /* hi1102-cb add sys for 51/02 */
2661 #ifdef _PRE_CONFIG_CONN_HISI_SYSFS_SUPPORT
2662     g_gp_sys_kobject = oal_get_sysfs_root_object();
2663     if (g_gp_sys_kobject == HI_NULL) {
2664         oam_error_log0(0, OAM_SF_ANY, "{wal_hipriv_create_proc::get sysfs root object failed!}");
2665         return HI_FALSE;
2666     }
2667     ret = (hi_u32)oal_debug_sysfs_create_group(g_gp_sys_kobject, &hipriv_attribute_group);
2668     return ret;
2669 #else
2670     return HI_SUCCESS;
2671 #endif
2672 }
2673 
2674 /* ****************************************************************************
2675  功能描述  : 删除proc
2676  返 回 值  : HI_SUCCESS
2677 **************************************************************************** */
wal_hipriv_remove_proc(hi_void)2678 hi_u32 wal_hipriv_remove_proc(hi_void)
2679 {
2680     /* 卸载时删除sysfs */
2681     if (g_gp_sys_kobject != HI_NULL) {
2682         oal_debug_sysfs_remove_group(g_gp_sys_kobject, &hipriv_attribute_group);
2683         kobject_del(g_gp_sys_kobject);
2684         g_gp_sys_kobject = HI_NULL;
2685     }
2686     oal_conn_sysfs_root_obj_exit();
2687     oal_conn_sysfs_root_boot_obj_exit();
2688     if (g_proc_entry != HI_NULL) {
2689         oal_remove_proc_entry(WAL_HIPRIV_PROC_ENTRY_NAME, HI_NULL);
2690         g_proc_entry = HI_NULL;
2691     }
2692 
2693     return HI_SUCCESS;
2694 }
2695 #endif
2696 #endif
2697 
2698 #if (_PRE_MULTI_CORE_MODE_OFFLOAD_DMAC == _PRE_MULTI_CORE_MODE)
2699 #ifdef _PRE_WLAN_FEATURE_HIPRIV
2700 /* ****************************************************************************
2701  功能描述  : 查询寄存器值(hipriv "Hisilicon0 reginfo regtype(soc/mac/phy) startaddr endaddr")
2702 
2703  修改历史      :
2704   1.日    期   : 2013年5月29日
2705     作    者   : HiSilicon
2706     修改内容   : 新生成函数
2707 
2708 **************************************************************************** */
wal_hipriv_reg_info(oal_net_device_stru * netdev,hi_char * pc_param)2709 static hi_u32 wal_hipriv_reg_info(oal_net_device_stru *netdev, hi_char *pc_param)
2710 {
2711     wal_msg_write_stru           write_msg;
2712     hi_u32                       ret;
2713     hi_u16                       us_len;
2714 
2715     /* **************************************************************************
2716                                 抛事件到wal层处理
2717     ************************************************************************** */
2718     if (memcpy_s(write_msg.auc_value, sizeof(write_msg.auc_value), pc_param, strlen(pc_param)) != EOK) {
2719         oam_error_log0(0, OAM_SF_ANY, "{wal_hipriv_reg_info::mem safe function err!}");
2720         return HI_FAIL;
2721     }
2722     write_msg.auc_value[strlen(pc_param)] = '\0';
2723     us_len = (hi_u16)(strlen(pc_param) + 1);
2724     wal_write_msg_hdr_init(&write_msg, WLAN_CFGID_REG_INFO, us_len);
2725 
2726     ret = wal_send_cfg_event(netdev, WAL_MSG_TYPE_WRITE, WAL_MSG_WRITE_MSG_HDR_LENGTH + us_len, (hi_u8 *)&write_msg,
2727         HI_FALSE, HI_NULL);
2728     if (oal_unlikely(ret != HI_SUCCESS)) {
2729         oam_warning_log1(0, OAM_SF_ANY, "{wal_hipriv_reg_info::return err code [%u]!}\r\n", ret);
2730         return ret;
2731     }
2732 
2733     return HI_SUCCESS;
2734 }
2735 #endif
2736 #endif
2737 
2738 #ifdef _PRE_WLAN_FEATURE_WOW
2739 #ifdef _PRE_WLAN_FEATURE_HIPRIV
2740 /* ****************************************************************************
2741  功能描述  : hipriv host sleep function
2742 
2743  修改历史      :
2744   1.日    期   : 2016年3月23日
2745     作    者   : HiSilicon
2746     修改内容   : 新生成函数
2747 **************************************************************************** */
2748 /* 大数组g_ast_hipriv_cmd的成员,其中wal_hipriv_getcountry修改了对应变量,lint_t e818告警屏蔽 */
wal_hipriv_host_sleep_switch(oal_net_device_stru * netdev,hi_char * pc_param)2749 static hi_u32 wal_hipriv_host_sleep_switch(oal_net_device_stru *netdev, hi_char *pc_param)
2750 {
2751     wal_msg_write_stru       write_msg;
2752     hi_s32                   l_tmp;
2753     hi_u32                   off_set;
2754     hi_char                  ac_name[WAL_HIPRIV_CMD_NAME_MAX_LEN] = {0};
2755     hi_u32                   ret;
2756 
2757     /* set FW no send any frame to driver, 0 will close this function: hipriv "wlan0 host_sleep 0|1" */
2758     ret = wal_get_cmd_one_arg(pc_param, ac_name, WAL_HIPRIV_CMD_NAME_MAX_LEN, &off_set);
2759     if (ret != HI_SUCCESS) {
2760         oam_warning_log1(0, OAM_SF_ANY, "{wal_hipriv_host_sleep_switch::wal_get_cmd_one_arg return err_code [%u]!}\r\n",
2761             ret);
2762         return ret;
2763     }
2764 
2765     if ((0 != strcmp("0", ac_name)) && (0 != strcmp("1", ac_name))) {
2766         oam_warning_log0(0, OAM_SF_ANY, "{wal_hipriv_host_sleep_switch::invalid switch value}\r\n");
2767         return HI_ERR_CODE_INVALID_CONFIG;
2768     }
2769 
2770     l_tmp = oal_atoi(ac_name);
2771 
2772     /* **************************************************************************
2773                                 抛事件到wal层处理
2774     ************************************************************************** */
2775     wal_write_msg_hdr_init(&write_msg, WLAN_CFGID_WOW_ACTIVATE_EN, sizeof(hi_s32));
2776     *((hi_s32 *)(write_msg.auc_value)) = l_tmp; /* 设置配置命令参数 */
2777 
2778     ret = wal_send_cfg_event(netdev, WAL_MSG_TYPE_WRITE, WAL_MSG_WRITE_MSG_HDR_LENGTH + sizeof(hi_s32),
2779         (hi_u8 *)&write_msg, HI_FALSE, HI_NULL);
2780     if (oal_unlikely(ret != HI_SUCCESS)) {
2781         oam_warning_log1(0, OAM_SF_ANY, "{wal_hipriv_wow_activate_switch::return err code[%u]!}\r\n", ret);
2782         return ret;
2783     }
2784 
2785     /* **************************************************************************
2786                                 抛事件到wal层处理
2787     ************************************************************************** */
2788     wal_write_msg_hdr_init(&write_msg, WLAN_CFGID_HOST_SLEEP_EN, sizeof(hi_s32));
2789     *((hi_s32 *)(write_msg.auc_value)) = l_tmp; /* 设置配置命令参数 */
2790 
2791     ret = wal_send_cfg_event(netdev, WAL_MSG_TYPE_WRITE, WAL_MSG_WRITE_MSG_HDR_LENGTH + sizeof(hi_s32),
2792         (hi_u8 *)&write_msg, HI_FALSE, HI_NULL);
2793     if (oal_unlikely(ret != HI_SUCCESS)) {
2794         oam_warning_log1(0, OAM_SF_ANY, "{wal_hipriv_host_sleep_switch::return err code[%u]!}\r\n", ret);
2795         return ret;
2796     }
2797 
2798     return HI_SUCCESS;
2799 }
2800 
2801 /* ****************************************************************************
2802  功能描述  : hipriv set wow function
2803 
2804  修改历史      :
2805   1.日    期   : 2016年3月23日
2806     作    者   : HiSilicon
2807     修改内容   : 新生成函数
2808 **************************************************************************** */
2809 /* 大数组g_ast_hipriv_cmd的成员,其中wal_hipriv_getcountry修改了对应变量,lint_t e818告警屏蔽 */
wal_hipriv_set_wow(oal_net_device_stru * netdev,hi_char * pc_param)2810 static hi_u32 wal_hipriv_set_wow(oal_net_device_stru *netdev, hi_char *pc_param)
2811 {
2812     wal_msg_write_stru       write_msg;
2813     hi_s32                   l_tmp;
2814     hi_u32                   off_set;
2815     hi_char                  ac_name[WAL_HIPRIV_CMD_NAME_MAX_LEN] = {0};
2816     hi_u32                   ret;
2817     hi_char                 *pc_end = HI_NULL;
2818 
2819     /* Enable/disable WOW events: hipriv "wlan0 wow <value>" 0:clear all events, Bit 0:Magic Packet Bit 1:NetPattern
2820        Bit 2:loss-of-link Bit 3:retrograde tsf Bit 4:loss of beacon Bit 17:TCP keep alive timeout */
2821     ret = wal_get_cmd_one_arg(pc_param, ac_name, WAL_HIPRIV_CMD_NAME_MAX_LEN, &off_set);
2822     if (ret != HI_SUCCESS) {
2823         oam_warning_log1(0, OAM_SF_ANY, "{wal_hipriv_set_wow::wal_get_cmd_one_arg return err_code [%u]!}\r\n", ret);
2824         return ret;
2825     }
2826 
2827     if ((*ac_name != '0') || ((*(ac_name + 1) != 'x') && (*(ac_name + 1) != 'X'))) {
2828         oam_warning_log0(0, OAM_SF_ANY, "{wal_hipriv_set_wow::invalid wow value}\r\n");
2829         return HI_ERR_CODE_INVALID_CONFIG;
2830     }
2831 
2832     l_tmp = oal_strtol(ac_name, &pc_end, 16); /* 16: 转换为16进制 */
2833 
2834     /* **************************************************************************
2835                                 抛事件到wal层处理
2836     ************************************************************************** */
2837     wal_write_msg_hdr_init(&write_msg, WLAN_CFGID_SET_WOW, sizeof(hi_s32));
2838     *((hi_s32 *)(write_msg.auc_value)) = l_tmp; /* 设置配置命令参数 */
2839 
2840     ret = wal_send_cfg_event(netdev, WAL_MSG_TYPE_WRITE, WAL_MSG_WRITE_MSG_HDR_LENGTH + sizeof(hi_s32),
2841         (hi_u8 *)&write_msg, HI_FALSE, HI_NULL);
2842     if (oal_unlikely(ret != HI_SUCCESS)) {
2843         oam_warning_log1(0, OAM_SF_ANY, "{wal_hipriv_set_wow::return err code[%u]!}\r\n", ret);
2844         return ret;
2845     }
2846 
2847     return HI_SUCCESS;
2848 }
2849 
2850 /* ****************************************************************************
2851  功能描述  : 获取add wow pattern的参数
2852 **************************************************************************** */
wal_hipriv_get_add_wow_pattern_param(hi_char * pc_param,hmac_cfg_wow_pattern_param_stru * wow_param)2853 static hi_u32 wal_hipriv_get_add_wow_pattern_param(hi_char *pc_param, hmac_cfg_wow_pattern_param_stru *wow_param)
2854 {
2855     hi_char ac_value[WAL_HIPRIV_CMD_NAME_MAX_LEN] = {0};
2856     hi_char *pc_end = HI_NULL;
2857     hi_u32  data_offset, off_set, pattern_len;
2858     hi_u32  idx;
2859     hi_char high, low;
2860 
2861     /* pc_param 指向'index', 将其取出放到 ac_index 中 */
2862     if (wal_get_cmd_one_arg(pc_param, ac_value, WAL_HIPRIV_CMD_NAME_MAX_LEN, &off_set) != HI_SUCCESS) {
2863         oam_warning_log0(0, OAM_SF_ANY, "{wal_hipriv_set_wow_pattern::get index failed!}");
2864         return HI_FAIL;
2865     }
2866     wow_param->us_pattern_index = (hi_u16)oal_strtol(ac_value, &pc_end, 10); /* 10: 转换为10进制 */
2867     pc_param += off_set;
2868 
2869     /* pc_param 指向'value', 将其取出放到ac_value中 */
2870     if (wal_get_cmd_one_arg(pc_param, ac_value, WAL_HIPRIV_CMD_NAME_MAX_LEN, &off_set) != HI_SUCCESS) {
2871         oam_warning_log0(0, OAM_SF_ANY, "{wal_hipriv_set_wow_pattern::get value failed!}");
2872         return HI_FAIL;
2873     }
2874     if ((*ac_value != '0') || ((*(ac_value + 1) != 'x') && (*(ac_value + 1) != 'X'))) {
2875         oam_warning_log0(0, OAM_SF_ANY, "{wal_hipriv_set_wow_pattern::invalid wow value}");
2876         return HI_ERR_CODE_INVALID_CONFIG;
2877     }
2878 
2879     wow_param->us_pattern_option = MAC_WOW_PATTERN_PARAM_OPTION_ADD;
2880     /* 长度减去 [ 空格 + 0 + X ] */
2881     pattern_len = (off_set > 3) ? ((off_set - 3) >> 1) : 0; /* 3: 数据偏移量 */
2882     pattern_len = (pattern_len > WAL_HIPRIV_CMD_NAME_MAX_LEN) ? (WAL_HIPRIV_CMD_NAME_MAX_LEN) : pattern_len;
2883     wow_param->pattern_len = pattern_len;
2884 
2885     /* 转化 netpattern 格式, 命令方式最多支持 40字节 */
2886     for (idx = 0; idx < pattern_len; idx++) {
2887         /* 内容避开 [ 0 + X ]  */
2888         data_offset = 2; /* 2: 数据偏移 */
2889         if (isxdigit(ac_value[(idx << 1) + data_offset]) && isxdigit(ac_value[(idx << 1) + data_offset + 1])) {
2890             high = isdigit(ac_value[(idx << 1) + data_offset]) ?
2891                 (ac_value[(idx << 1) + data_offset] - '0') :
2892                 (hi_tolower((hi_u8)ac_value[(idx << 1) + data_offset]) - 'a' + 10); /* 10: 偏移量 */
2893             low = isdigit(ac_value[(idx << 1) + data_offset + 1]) ?
2894                 (ac_value[(idx << 1) + data_offset + 1] - '0') :
2895                 (hi_tolower((hi_u8)ac_value[(idx << 1) + data_offset + 1]) - 'a' + 10); /* 10: 偏移量 */
2896             if ((hi_u8)high > 0xF || (hi_u8)low > 0xF) {
2897                 oam_warning_log0(0, OAM_SF_ANY, "{wal_hipriv_set_wow_pattern::invalid wow value}\r\n");
2898                 break;
2899             }
2900             wow_param->auc_pattern_value[idx] = (((hi_u8)high & 0xF) << 4) | ((hi_u8)low & 0xF); /* 4: 左移4位 */
2901         } else {
2902             oam_warning_log0(0, OAM_SF_ANY, "{wal_hipriv_set_wow_pattern::invalid wow value}\r\n");
2903             break;
2904         }
2905     }
2906     return HI_SUCCESS;
2907 }
2908 
wal_get_add_wow_pattern_param(hi_u8 index,hi_char * pattern,hmac_cfg_wow_pattern_param_stru * cfg_wow_param)2909 hi_u32 wal_get_add_wow_pattern_param(hi_u8 index, hi_char *pattern, hmac_cfg_wow_pattern_param_stru *cfg_wow_param)
2910 {
2911     hi_u32 pattern_len, idx, data_offset;
2912     hi_char high, low;
2913     if ((index >= WOW_NETPATTERN_MAX_NUM) || (pattern == HI_NULL)) {
2914         oam_error_log2(0, 0, "wal_get_add_wow_pattern_param:: invalid_param, index[%d], pattern[%p]", index,
2915             (uintptr_t)pattern);
2916         return HI_FAIL;
2917     }
2918 
2919     cfg_wow_param->us_pattern_index = index;
2920 
2921     if ((*pattern != '0') || ((*(pattern + 1) != 'x') && (*(pattern + 1) != 'X'))) {
2922         oam_warning_log0(0, OAM_SF_ANY, "{wal_get_add_wow_pattern_param::invalid wow value}");
2923         return HI_ERR_CODE_INVALID_CONFIG;
2924     }
2925 
2926     cfg_wow_param->us_pattern_option = MAC_WOW_PATTERN_PARAM_OPTION_ADD;
2927     pattern_len = (strlen(pattern) > 2) ? ((strlen(pattern) - 2) >> 1) : 0; /* 2: 数据偏移量 */
2928     pattern_len = (pattern_len > WAL_HIPRIV_CMD_NAME_MAX_LEN) ? (WAL_HIPRIV_CMD_NAME_MAX_LEN) : pattern_len;
2929     cfg_wow_param->pattern_len = pattern_len;
2930 
2931     /* 转化 netpattern 格式, 命令方式最多支持 40字节 */
2932     for (idx = 0; idx < pattern_len; idx++) {
2933         /* 内容避开 [ 0 + X ]  */
2934         data_offset = 2; /* 2: 数据偏移 */
2935         if (isxdigit(pattern[(idx << 1) + data_offset]) && isxdigit(pattern[(idx << 1) + data_offset + 1])) {
2936             high = isdigit(pattern[(idx << 1) + data_offset]) ?
2937                 (pattern[(idx << 1) + data_offset] - '0') :
2938                 (hi_tolower((hi_u8)pattern[(idx << 1) + data_offset]) - 'a' + 10); /* 10: 偏移量 */
2939             low = isdigit(pattern[(idx << 1) + data_offset + 1]) ?
2940                 (pattern[(idx << 1) + data_offset + 1] - '0') :
2941                 (hi_tolower((hi_u8)pattern[(idx << 1) + data_offset + 1]) - 'a' + 10); /* 10: 偏移量 */
2942             if ((hi_u8)high > 0xF || (hi_u8)low > 0xF) {
2943                 oam_warning_log0(0, OAM_SF_ANY, "{wal_hipriv_set_wow_pattern::invalid wow value}\r\n");
2944                 break;
2945             }
2946             cfg_wow_param->auc_pattern_value[idx] = (((hi_u8)high & 0xF) << 4) | ((hi_u8)low & 0xF); /* 4: 左移4位 */
2947         } else {
2948             oam_warning_log0(0, OAM_SF_ANY, "{wal_hipriv_set_wow_pattern::invalid wow value}\r\n");
2949             break;
2950         }
2951     }
2952 
2953     return HI_SUCCESS;
2954 }
2955 
2956 /* ****************************************************************************
2957  功能描述  : hipriv set wow pattern function
2958              hipriv.sh 'wlan0 wow_pattern add index 0x983B16F8F39C'
2959              hipriv.sh 'wlan0 wow_pattern del index'
2960              hipriv.sh 'wlan0 wow_pattern clr'
2961 
2962  修改历史      :
2963   1.日    期   : 2016年3月23日
2964     作    者   : HiSilicon
2965     修改内容   : 新生成函数
2966 **************************************************************************** */
2967 /* 大数组g_ast_hipriv_cmd的成员,其中wal_hipriv_getcountry修改了对应变量,lint_t e818告警屏蔽 */
wal_hipriv_set_wow_pattern(oal_net_device_stru * netdev,hi_char * pc_param)2968 static hi_u32 wal_hipriv_set_wow_pattern(oal_net_device_stru *netdev, hi_char *pc_param)
2969 {
2970     hmac_cfg_wow_pattern_param_stru cfg_wow_param = {0};
2971     wal_msg_write_stru      write_msg;
2972     hi_char                 *pc_end = HI_NULL;
2973     hi_char                 ac_option[WAL_HIPRIV_CMD_NAME_MAX_LEN] = {0};
2974     hi_char                 ac_index[WAL_HIPRIV_CMD_NAME_MAX_LEN] = {0};
2975     hi_u32                  retval, off_set;
2976 
2977     /* No options – lists existing pattern list */
2978     if (pc_param == HI_NULL) {
2979         return HI_ERR_CODE_PTR_NULL;
2980     }
2981 
2982     /* pc_param 指向'clr|add|del', 将其取出放到ac_option中 */
2983     if (wal_get_cmd_one_arg(pc_param, ac_option, WAL_HIPRIV_CMD_NAME_MAX_LEN, &off_set) != HI_SUCCESS) {
2984         oam_warning_log0(0, OAM_SF_ANY, "{wal_hipriv_set_wow_pattern::get option failed");
2985         return HI_FAIL;
2986     }
2987     pc_param += off_set;
2988     /* add wow事件 */
2989     if (strcmp("add", ac_option) == 0) {
2990         if (wal_hipriv_get_add_wow_pattern_param(pc_param, &cfg_wow_param) != HI_SUCCESS) {
2991             oam_error_log0(0, OAM_SF_ANY, "{wal_hipriv_set_wow_pattern::get add param failed.}");
2992             return HI_FAIL;
2993         }
2994         /* 设置pattern value参数 */
2995         if (memcpy_s(&((hmac_cfg_wow_pattern_param_stru *)(write_msg.auc_value))->auc_pattern_value[0],
2996             WAL_HIPRIV_CMD_NAME_MAX_LEN, cfg_wow_param.auc_pattern_value, cfg_wow_param.pattern_len) != EOK) {
2997             oam_error_log0(0, OAM_SF_ANY, "{wal_hipriv_set_wow_pattern::copy pattern value failed.}");
2998             return HI_FAIL;
2999         }
3000     } else if (strcmp("del", ac_option) == 0) {
3001         /* pc_param 指向'index', 将其取出放到 ac_index 中 */
3002         if (wal_get_cmd_one_arg(pc_param, ac_index, WAL_HIPRIV_CMD_NAME_MAX_LEN, &off_set) != HI_SUCCESS) {
3003             oam_warning_log0(0, OAM_SF_ANY, "{wal_hipriv_set_wow_pattern::get del index failed!}");
3004             return HI_FAIL;
3005         }
3006         cfg_wow_param.us_pattern_option = MAC_WOW_PATTERN_PARAM_OPTION_DEL;
3007         cfg_wow_param.us_pattern_index = (hi_u16)oal_strtol(ac_index, &pc_end, 10); /* 10: 转换为10进制 */
3008     } else if (strcmp("clr", ac_option) == 0) {
3009         cfg_wow_param.us_pattern_option = MAC_WOW_PATTERN_PARAM_OPTION_CLR;
3010     } else {
3011         oam_warning_log0(0, OAM_SF_ANY, "{wal_hipriv_set_wow_pattern::invalid pattern OPTION}");
3012         return HI_FAIL;
3013     }
3014 
3015     /* **************************************************************************
3016                                 抛事件到wal层处理
3017     ************************************************************************** */
3018     wal_write_msg_hdr_init(&write_msg, WLAN_CFGID_SET_WOW_PATTERN, sizeof(hmac_cfg_wow_pattern_param_stru));
3019     /* 设置pattern option参数 */
3020     ((hmac_cfg_wow_pattern_param_stru *)(write_msg.auc_value))->us_pattern_option = cfg_wow_param.us_pattern_option;
3021     /* 设置pattern index参数 */
3022     ((hmac_cfg_wow_pattern_param_stru *)(write_msg.auc_value))->us_pattern_index = cfg_wow_param.us_pattern_index;
3023     /* 设置pattern pattern len参数 */
3024     ((hmac_cfg_wow_pattern_param_stru *)(write_msg.auc_value))->pattern_len = cfg_wow_param.pattern_len;
3025     retval = wal_send_cfg_event(netdev, WAL_MSG_TYPE_WRITE,
3026         WAL_MSG_WRITE_MSG_HDR_LENGTH + sizeof(hmac_cfg_wow_pattern_param_stru), (hi_u8 *)&write_msg, HI_FALSE, HI_NULL);
3027     if (oal_unlikely(retval != HI_SUCCESS)) {
3028         oam_warning_log1(0, OAM_SF_ANY, "{wal_hipriv_set_wow_pattern::return err code[%u]!}", retval);
3029     }
3030 
3031     return retval;
3032 }
3033 #endif
3034 #endif
3035 
3036 #ifdef _PRE_WLAN_FEATURE_PROMIS
3037 #ifdef _PRE_WLAN_FEATURE_HIPRIV
3038 /* ****************************************************************************
3039  功能描述  : 开启或关闭monitor模式
3040 
3041  修改历史      :
3042   1.日    期   : 2016年3月14日
3043     作    者   : HiSilicon
3044     修改内容   : 新生成函数
3045 **************************************************************************** */
3046 /* 大数组g_ast_hipriv_cmd的成员,其中wal_hipriv_getcountry修改了对应变量,lint_t e818告警屏蔽 */
wal_hipriv_set_monitor_switch(oal_net_device_stru * netdev,hi_char * pc_param)3047 hi_u32 wal_hipriv_set_monitor_switch(oal_net_device_stru *netdev, hi_char *pc_param)
3048 {
3049     wal_msg_write_stru write_msg;
3050     hi_u32             off_set;
3051     hi_char            ac_name[WAL_HIPRIV_CMD_NAME_MAX_LEN] = {0};
3052     hi_u8              tmp;
3053     hi_u32             ret;
3054 
3055     ret = wal_get_cmd_one_arg(pc_param, ac_name, WAL_HIPRIV_CMD_NAME_MAX_LEN, &off_set);
3056     if (ret != HI_SUCCESS) {
3057         oam_warning_log1(0, OAM_SF_ANY, "{wal_hipriv_set_monitor_switch::wal_get_cmd_one_arg return err_code %d!}\r\n",
3058             ret);
3059         return ret;
3060     }
3061 
3062     if ((strcmp("0", ac_name)) == 0) {
3063         tmp = 0; /* 0: 关闭报文上报 */
3064     } else if ((strcmp("1", ac_name)) == 0) {
3065         tmp = 0x1; /* 0x1: 上报组播(广播)数据包 */
3066     } else if ((strcmp("2", ac_name)) == 0) {
3067         tmp = 0x2; /* 0x2: 上报单播数据包 */
3068     } else if ((strcmp("3", ac_name)) == 0) {
3069         tmp = 0x4; /* 0x4: 上报组播(广播)管理包 */
3070     } else if ((strcmp("4", ac_name)) == 0) {
3071         tmp = 0x8; /* 0x8: 上报单播管理包 */
3072     } else {
3073         oam_warning_log0(0, OAM_SF_ANY, "{wal_hipriv_set_monitor_switch::command param is error!}\r\n");
3074         return HI_ERR_CODE_INVALID_CONFIG;
3075     }
3076 
3077     /* **************************************************************************
3078                                 抛事件到wal层处理
3079     ************************************************************************** */
3080     wal_write_msg_hdr_init(&write_msg, WLAN_CFGID_MONITOR_EN, sizeof(hi_u8));
3081     *((hi_u8 *)(write_msg.auc_value)) = tmp; /* 设置配置命令参数 */
3082 
3083     ret = wal_send_cfg_event(netdev, WAL_MSG_TYPE_WRITE, WAL_MSG_WRITE_MSG_HDR_LENGTH + sizeof(hi_u8),
3084         (hi_u8 *)&write_msg, HI_FALSE, HI_NULL);
3085     if (oal_unlikely(ret != HI_SUCCESS)) {
3086         oam_warning_log1(0, OAM_SF_ANY, "{wal_hipriv_set_monitor_switch::return err code [%u]!}\r\n", ret);
3087         return ret;
3088     }
3089 
3090     return HI_SUCCESS;
3091 }
3092 #endif
3093 #endif
3094 
3095 #if defined(_PRE_WLAN_FEATURE_HIPRIV) || defined(_PRE_WLAN_FEATURE_SIGMA)
3096 /* ****************************************************************************
3097  功能描述  : 开启或关闭ampdu发送功能
3098 
3099  修改历史      :
3100   1.日    期   : 2013年8月27日
3101     作    者   : HiSilicon
3102     修改内容   : 新生成函数
3103 **************************************************************************** */
3104 /* 大数组g_ast_hipriv_cmd的成员,其中wal_hipriv_getcountry修改了对应变量,lint_t e818告警屏蔽 */
wal_hipriv_ampdu_tx_on(oal_net_device_stru * netdev,hi_char * pc_param)3105 hi_u32 wal_hipriv_ampdu_tx_on(oal_net_device_stru *netdev, hi_char *pc_param)
3106 {
3107     wal_msg_write_stru              write_msg;
3108     hi_u32                          off_set;
3109     hi_char                         ac_name[WAL_HIPRIV_CMD_NAME_MAX_LEN] = {0};
3110     hi_u32                          ret;
3111     mac_cfg_ampdu_tx_on_param_stru  *aggr_tx_on_param = HI_NULL;
3112     hi_u8                           aggr_tx_on;
3113 
3114     ret = wal_get_cmd_one_arg(pc_param, ac_name, WAL_HIPRIV_CMD_NAME_MAX_LEN, &off_set);
3115     if (ret != HI_SUCCESS) {
3116         oam_warning_log1(0, OAM_SF_ANY, "{wal_hipriv_ampdu_tx_on::wal_get_cmd_one_arg return err_code [%u]!}\r\n", ret);
3117         return ret;
3118     }
3119 
3120     aggr_tx_on = (hi_u8)oal_atoi(ac_name);
3121 
3122     /* **************************************************************************
3123                              抛事件到wal层处理
3124     ************************************************************************** */
3125     wal_write_msg_hdr_init(&write_msg, WLAN_CFGID_AMPDU_TX_ON, sizeof(mac_cfg_ampdu_tx_on_param_stru));
3126 
3127     /* 设置配置命令参数 */
3128     aggr_tx_on_param = (mac_cfg_ampdu_tx_on_param_stru *)(write_msg.auc_value);
3129     aggr_tx_on_param->aggr_tx_on = aggr_tx_on;
3130 
3131     ret = wal_send_cfg_event(netdev, WAL_MSG_TYPE_WRITE,
3132         WAL_MSG_WRITE_MSG_HDR_LENGTH + sizeof(mac_cfg_ampdu_tx_on_param_stru), (hi_u8 *)&write_msg, HI_FALSE, HI_NULL);
3133     if (oal_unlikely(ret != HI_SUCCESS)) {
3134         oam_warning_log1(0, OAM_SF_ANY, "{wal_hipriv_ampdu_tx_on::return err code [%u]!}\r\n", ret);
3135         return ret;
3136     }
3137 
3138     return HI_SUCCESS;
3139 }
3140 #endif
3141 
3142 #if defined _PRE_WLAN_FEATURE_SIGMA
3143 /* ****************************************************************************
3144  功能描述  : 设置AP的STBC能力
3145 
3146  修改历史      :
3147   1.日    期   : 2014年11月14日
3148     作    者   : HiSilicon
3149     修改内容   : 新生成函数
3150 
3151 **************************************************************************** */
wal_hipriv_set_stbc_cap(oal_net_device_stru * netdev,hi_char * pc_param)3152 hi_u32 wal_hipriv_set_stbc_cap(oal_net_device_stru *netdev, hi_char *pc_param)
3153 {
3154     wal_msg_write_stru          write_msg;
3155     hi_u32                      off_set;
3156     hi_char                     ac_name[WAL_HIPRIV_CMD_NAME_MAX_LEN] = {0};
3157     hi_u32                      ret;
3158     hi_u32                      value;
3159 
3160     if (oal_unlikely((netdev == HI_NULL) || (pc_param == HI_NULL))) {
3161         oam_error_log2(0, OAM_SF_ANY,
3162             "{wal_hipriv_set_stbc_cap::pst_cfg_net_dev or pc_param null ptr error %p, %p!}\r\n", (uintptr_t)netdev,
3163             (uintptr_t)pc_param);
3164         return HI_ERR_CODE_PTR_NULL;
3165     }
3166 
3167     /* STBC设置开关的命令: hipriv "vap0 set_stbc_cap 0 | 1"
3168             此处将解析出"1"或"0"存入ac_name
3169     */
3170     ret = wal_get_cmd_one_arg(pc_param, ac_name, WAL_HIPRIV_CMD_NAME_MAX_LEN, &off_set);
3171     if (ret != HI_SUCCESS) {
3172         oam_warning_log1(0, OAM_SF_ANY, "{wal_hipriv_set_stbc_cap::wal_get_cmd_one_arg return err_code [%u]!}\r\n",
3173             ret);
3174         return ret;
3175     }
3176 
3177     /* 针对解析出的不同命令,设置TDLS禁用开关 */
3178     if (0 == (strcmp("0", ac_name))) {
3179         value = 0;
3180     } else if (0 == (strcmp("1", ac_name))) {
3181         value = 1;
3182     } else {
3183         oam_warning_log1(0, OAM_SF_ANY, "{wal_hipriv_set_stbc_cap::the set stbc command is error %p!}\r\n",
3184             (uintptr_t)ac_name);
3185         return HI_ERR_CODE_INVALID_CONFIG;
3186     }
3187 
3188     /* **************************************************************************
3189                              抛事件到wal层处理
3190     ************************************************************************** */
3191     wal_write_msg_hdr_init(&write_msg, WLAN_CFGID_SET_STBC_CAP, sizeof(hi_u32));
3192 
3193     /* 设置配置命令参数 */
3194     *((hi_u32 *)(write_msg.auc_value)) = value;
3195 
3196     ret = wal_send_cfg_event(netdev, WAL_MSG_TYPE_WRITE, WAL_MSG_WRITE_MSG_HDR_LENGTH + sizeof(hi_u32),
3197         (hi_u8 *)&write_msg, HI_FALSE, HI_NULL);
3198     if (oal_unlikely(ret != HI_SUCCESS)) {
3199         oam_warning_log1(0, OAM_SF_ANY, "{wal_hipriv_set_stbc_cap::return err code [%u]!}\r\n", ret);
3200         return ret;
3201     }
3202 
3203     return HI_SUCCESS;
3204 }
3205 #endif
3206 
3207 #if defined(_PRE_WLAN_FEATURE_HIPRIV) || defined(_PRE_WLAN_FEATURE_SIGMA)
3208 /* ****************************************************************************
3209  功能描述  : 设置分片门限配置命令
3210  修改历史      :
3211   1.日    期   : 2014年1月27日
3212     作    者   : HiSilicon
3213     修改内容   : 新生成函数
3214 **************************************************************************** */
3215 /* 大数组g_ast_hipriv_cmd的成员,其中wal_hipriv_getcountry修改了对应变量,lint_t e818告警屏蔽 */
wal_hipriv_frag_threshold(oal_net_device_stru * netdev,hi_char * pc_param)3216 hi_u32 wal_hipriv_frag_threshold(oal_net_device_stru *netdev, hi_char *pc_param)
3217 {
3218     wal_msg_write_stru              write_msg;
3219     hi_u32                          ret;
3220     hi_u16                          us_len;
3221     hi_char                         ac_name[WAL_HIPRIV_CMD_NAME_MAX_LEN] = {0};
3222     hi_u32                          off_set = 0;
3223     mac_cfg_frag_threshold_stru     *threshold = HI_NULL;
3224     hi_u32                          thresholdval;
3225 
3226     /* 获取分片门限 */
3227     ret = wal_get_cmd_one_arg(pc_param, ac_name, WAL_HIPRIV_CMD_NAME_MAX_LEN, &off_set);
3228     if (ret != HI_SUCCESS) {
3229         hi_diag_log_msg_w0(0, "{wal_hipriv_frag_threshold::wal_get_cmd_one_arg failed.");
3230         return ret;
3231     }
3232 
3233     thresholdval = (hi_u32)oal_atoi(ac_name);
3234     if ((thresholdval < WLAN_FRAG_THRESHOLD_MIN) || (thresholdval > WLAN_FRAG_THRESHOLD_MAX)) {
3235         hi_diag_log_msg_w1(0, "{wal_hipriv_frag_threshold::ul_threshold value error [%d]!}", thresholdval);
3236         return HI_FAIL;
3237     }
3238 
3239     threshold = (mac_cfg_frag_threshold_stru *)(write_msg.auc_value);
3240     threshold->frag_threshold = thresholdval;
3241     /* **************************************************************************
3242                               抛事件到wal层处理
3243     ************************************************************************** */
3244     us_len = sizeof(mac_cfg_frag_threshold_stru);
3245     wal_write_msg_hdr_init(&write_msg, WLAN_CFGID_FRAG_THRESHOLD_REG, us_len);
3246     ret = wal_send_cfg_event(netdev, WAL_MSG_TYPE_WRITE, WAL_MSG_WRITE_MSG_HDR_LENGTH + us_len, (hi_u8 *)&write_msg,
3247         HI_FALSE, HI_NULL);
3248     if (oal_unlikely(ret != HI_SUCCESS)) {
3249         oam_warning_log1(0, OAM_SF_ANY, "{wal_hipriv_frag_threshold::return err code [%u]!}\r\n", ret);
3250         return ret;
3251     }
3252     return HI_SUCCESS;
3253 }
3254 #endif
3255 
3256 #if defined _PRE_WLAN_FEATURE_SIGMA
3257 /* ****************************************************************************
3258  功能描述  : 设置RTS门限配置命令
3259   修改历史      :
3260   1.日    期   : 2014年1月27日
3261     作    者   : HiSilicon
3262     修改内容   : 新生成函数
3263 **************************************************************************** */
3264 /* 大数组g_ast_hipriv_cmd的成员,其中wal_hipriv_getcountry修改了对应变量,lint_t e818告警屏蔽 */
wal_hipriv_rts_threshold(oal_net_device_stru * netdev,hi_char * pc_param)3265 hi_u32 wal_hipriv_rts_threshold(oal_net_device_stru *netdev, hi_char *pc_param)
3266 {
3267     wal_msg_write_stru          write_msg;
3268     hi_u32                      ret;
3269     hi_u16                      us_len;
3270     hi_char                       ac_name[WAL_HIPRIV_CMD_NAME_MAX_LEN] = {0};
3271     hi_u32                      off_set = 0;
3272     mac_cfg_rts_threshold_stru  *threshold = HI_NULL;
3273     hi_u32                      thresholdval;
3274 
3275     /* 获取RTS门限 */
3276     ret = wal_get_cmd_one_arg(pc_param, ac_name, WAL_HIPRIV_CMD_NAME_MAX_LEN, &off_set);
3277     if (ret != HI_SUCCESS) {
3278         hi_diag_log_msg_w0(0, "{wal_hipriv_rts_threshold::wal_get_cmd_one_arg failed!}");
3279         return ret;
3280     }
3281 
3282     thresholdval = (hi_u32)oal_atoi(ac_name);
3283     if ((thresholdval < WLAN_RTS_MIN) || (thresholdval > WLAN_RTS_MAX)) {
3284         hi_diag_log_msg_w1(0, "{wal_hipriv_rts_threshold::ul_threshold value error [%d]!}", thresholdval);
3285         return HI_FAIL;
3286     }
3287     threshold = (mac_cfg_rts_threshold_stru *)(write_msg.auc_value);
3288     threshold->rts_threshold = thresholdval;
3289 
3290     /* **************************************************************************
3291                               抛事件到wal层处理
3292     ************************************************************************** */
3293     us_len = sizeof(mac_cfg_rts_threshold_stru);
3294     wal_write_msg_hdr_init(&write_msg, WLAN_CFGID_SET_RTS_THRESHHOLD, us_len);
3295     ret = wal_send_cfg_event(netdev, WAL_MSG_TYPE_WRITE, WAL_MSG_WRITE_MSG_HDR_LENGTH + us_len, (hi_u8 *)&write_msg,
3296         HI_FALSE, HI_NULL);
3297     if (oal_unlikely(ret != HI_SUCCESS)) {
3298         oam_warning_log1(0, OAM_SF_ANY, "{wal_hipriv_rts_threshold::return err code [%u]!}\r\n", ret);
3299         return ret;
3300     }
3301     return HI_SUCCESS;
3302 }
3303 #endif
3304 
3305 #ifdef _PRE_WLAN_FEATURE_HIPRIV
3306 /* ****************************************************************************
3307  功能描述  : 写寄存器
3308 
3309  修改历史      :
3310   1.日    期   : 2013年9月6日
3311     作    者   : HiSilicon
3312     修改内容   : 新生成函数
3313 **************************************************************************** */
3314 /* 大数组g_ast_hipriv_cmd的成员,其中wal_hipriv_getcountry修改了对应变量,lint_t e818告警屏蔽 */
wal_hipriv_reg_write(oal_net_device_stru * netdev,hi_char * pc_param)3315 hi_u32 wal_hipriv_reg_write(oal_net_device_stru *netdev, hi_char *pc_param)
3316 {
3317     wal_msg_write_stru           write_msg;
3318     hi_u32                       ret;
3319     hi_u16                       us_len;
3320 
3321     /* **************************************************************************
3322                               抛事件到wal层处理
3323     ************************************************************************** */
3324     if (memcpy_s(write_msg.auc_value, WAL_MSG_WRITE_MAX_LEN, pc_param, strlen(pc_param)) != EOK) {
3325         oam_error_log0(0, OAM_SF_ANY, "{wal_hipriv_set_ampdu_aggr_num::mem safe function err!}");
3326         return HI_FAIL;
3327     }
3328 
3329     write_msg.auc_value[strlen(pc_param)] = '\0';
3330 
3331     us_len = (hi_u16)(strlen(pc_param) + 1);
3332 
3333     wal_write_msg_hdr_init(&write_msg, WLAN_CFGID_REG_WRITE, us_len);
3334 
3335     ret = wal_send_cfg_event(netdev, WAL_MSG_TYPE_WRITE, WAL_MSG_WRITE_MSG_HDR_LENGTH + us_len, (hi_u8 *)&write_msg,
3336         HI_FALSE, HI_NULL);
3337     if (oal_unlikely(ret != HI_SUCCESS)) {
3338         oam_warning_log1(0, OAM_SF_ANY, "{wal_hipriv_reg_write::return err code [%u]!}\r\n", ret);
3339         return ret;
3340     }
3341 
3342     return HI_SUCCESS;
3343 }
3344 #endif
3345 
3346 #ifdef _PRE_DEBUG_MODE
3347 #ifdef _PRE_WLAN_FEATURE_HIPRIV
3348 /* ****************************************************************************
3349  功能描述  : 获取某一个vap的收发包统计信息
3350 
3351  修改历史      :
3352   1.日    期   : 2014年7月10日
3353     作    者   : HiSilicon
3354     修改内容   : 新生成函数
3355 
3356 **************************************************************************** */
wal_hipriv_show_vap_pkt_stat(oal_net_device_stru * netdev,hi_char * pc_param)3357 static hi_u32 wal_hipriv_show_vap_pkt_stat(oal_net_device_stru *netdev, hi_char *pc_param)
3358 {
3359     wal_msg_write_stru           write_msg;
3360     hi_u32                       ret;
3361 
3362     hi_unref_param(pc_param);
3363     /* **************************************************************************
3364                                  抛事件到wal层处理
3365     ************************************************************************** */
3366     wal_write_msg_hdr_init(&write_msg, WLAN_CFGID_VAP_PKT_STAT, sizeof(hi_u32));
3367 
3368     ret = wal_send_cfg_event(netdev, WAL_MSG_TYPE_WRITE, WAL_MSG_WRITE_MSG_HDR_LENGTH + sizeof(hi_u32),
3369         (hi_u8 *)&write_msg, HI_FALSE, HI_NULL);
3370     if (oal_unlikely(ret != HI_SUCCESS)) {
3371         oam_warning_log1(0, OAM_SF_ANY, "{wal_hipriv_show_vap_pkt_stat::return err code [%u]!}\r\n", ret);
3372         return ret;
3373     }
3374 
3375     return HI_SUCCESS;
3376 }
3377 #endif
3378 #endif
3379 
3380 #ifdef _PRE_WLAN_FEATURE_HIPRIV
3381 /* ****************************************************************************
3382  功能描述  : 配置CCA 门限
3383 **************************************************************************** */
wal_hipriv_set_cca_threshold(oal_net_device_stru * netdev,hi_char * pc_param)3384 static hi_u32 wal_hipriv_set_cca_threshold(oal_net_device_stru *netdev, hi_char *pc_param)
3385 {
3386     wal_msg_write_stru                      write_msg;
3387     hi_u32                                  off_set;
3388     hi_char                                 ac_name[WAL_HIPRIV_CMD_NAME_MAX_LEN] = {'\0'};
3389 
3390     /* 低功耗状态下不允许执行 */
3391     if (is_under_ps()) {
3392         oam_warning_log0(0, 0, "under ps mode,can not exec cmd");
3393         return HI_FAIL;
3394     }
3395     /* 获取CCA门限 */
3396     hi_u32 ret = wal_get_cmd_one_arg(pc_param, ac_name, WAL_HIPRIV_CMD_NAME_MAX_LEN, &off_set);
3397     if (ret != HI_SUCCESS) {
3398         oam_warning_log1(0, OAM_SF_ANY, "{wal_hipriv_cca_opt_log::wal_get_cmd_one_arg return err_code [%u]!}", ret);
3399         return ret;
3400     }
3401 
3402     hi_s32 cca_threshold = oal_atoi(ac_name);
3403     if (cca_threshold < HI_CCA_THRESHOLD_LO || cca_threshold > HI_CCA_THRESHOLD_HI) {
3404         oam_error_log1(0, 0, "wal_hipriv_set_cca_threshold:: invalid cca threshold[%d]", cca_threshold);
3405         return HI_FAIL;
3406     }
3407     hi_s32 *param = (hi_s32 *)write_msg.auc_value;
3408     *param = cca_threshold;
3409 
3410     /* **************************************************************************
3411                              抛事件到wal层处理
3412     ************************************************************************** */
3413     wal_write_msg_hdr_init(&write_msg, WLAN_CFGID_SET_CCA_TH, sizeof(hi_s32));
3414 
3415     ret = wal_send_cfg_event(netdev, WAL_MSG_TYPE_WRITE,
3416         WAL_MSG_WRITE_MSG_HDR_LENGTH + sizeof(mac_ioctl_alg_param_stru), (hi_u8 *)&write_msg, HI_FALSE, HI_NULL);
3417     if (oal_unlikely(ret != HI_SUCCESS)) {
3418         oam_warning_log1(0, OAM_SF_ANY, "{hi_wifi_set_cca_threshold::return err code [%u]!}\r\n", ret);
3419         return ret;
3420     }
3421 
3422     return HI_SUCCESS;
3423 }
3424 #endif
3425 
3426 #ifdef _PRE_WLAN_FEATURE_ALG_CFG
3427 #ifdef _PRE_WLAN_FEATURE_HIPRIV
3428 /* ****************************************************************************
3429  功能描述  : cca_opt算法日志参数配置
3430         (1)统计的配置命令: hipriv.sh "vap0 alg_tpc_log tpc_stat_log 11:22:33:44:55:66  2 500"
3431            该命令针对某一个USER
3432 
3433  修改历史      :
3434   1.日    期   : 2015年8月31日
3435     作    者   : HiSilicon
3436     修改内容   : 新生成函数
3437 
3438 **************************************************************************** */
wal_hipriv_cca_opt_log(oal_net_device_stru * netdev,hi_char * pc_param)3439 static hi_u32 wal_hipriv_cca_opt_log(oal_net_device_stru *netdev, hi_char *pc_param)
3440 {
3441     wal_msg_write_stru                      write_msg;
3442     hi_u32                                  off_set;
3443     hi_char                                 ac_name[WAL_HIPRIV_CMD_NAME_MAX_LEN] = {'\0'};
3444     mac_ioctl_alg_cca_opt_log_param_stru    *alg_cca_opt_log_param = HI_NULL;
3445     wal_ioctl_alg_cfg_stru                  alg_cfg;
3446     hi_u8                                   map_index = 0;
3447 
3448     alg_cca_opt_log_param = (mac_ioctl_alg_cca_opt_log_param_stru *)(write_msg.auc_value);
3449 
3450     /* 获取配置参数名称 */
3451     hi_u32 ret = wal_get_cmd_one_arg(pc_param, ac_name, WAL_HIPRIV_CMD_NAME_MAX_LEN, &off_set);
3452     if (ret != HI_SUCCESS) {
3453         oam_warning_log1(0, OAM_SF_ANY, "{wal_hipriv_cca_opt_log::wal_get_cmd_one_arg return err_code [%u]!}", ret);
3454         return ret;
3455     }
3456     pc_param = pc_param + off_set;
3457 
3458     /* 寻找匹配的命令 */
3459     alg_cfg = g_ast_alg_cfg_map[0];
3460     while (alg_cfg.pc_name != HI_NULL) {
3461         if (strcmp(alg_cfg.pc_name, ac_name) == 0) {
3462             break;
3463         }
3464         alg_cfg = g_ast_alg_cfg_map[++map_index];
3465     }
3466 
3467     /* 没有找到对应的命令,则报错 */
3468     if (alg_cfg.pc_name == HI_NULL) {
3469         oam_warning_log0(0, OAM_SF_ANY, "{wal_hipriv_cca_opt_log::invalid alg_cfg command!}\r\n");
3470         return HI_FAIL;
3471     }
3472 
3473     /* 记录命令对应的枚举值 */
3474     alg_cca_opt_log_param->alg_cfg = g_ast_alg_cfg_map[map_index].alg_cfg;
3475 
3476     /* 区分获取特定帧功率和统计日志命令处理:获取功率只需获取帧名字 */
3477     if (alg_cca_opt_log_param->alg_cfg == MAC_ALG_CFG_CCA_OPT_STAT_LOG_START) {
3478         /* 获取配置参数名称 */
3479         ret = wal_get_cmd_one_arg(pc_param, ac_name, WAL_HIPRIV_CMD_NAME_MAX_LEN, &off_set);
3480         if (ret != HI_SUCCESS) {
3481             oam_warning_log1(0, OAM_SF_ANY, "{wal_hipriv_cca_opt_log::wal_get_cmd_one_arg return err_code [%u]!}", ret);
3482             return ret;
3483         }
3484 
3485         /* 记录参数 */
3486         alg_cca_opt_log_param->us_value = (hi_u16)oal_atoi(ac_name);
3487     }
3488 
3489     /* **************************************************************************
3490                              抛事件到wal层处理
3491     ************************************************************************** */
3492     wal_write_msg_hdr_init(&write_msg, WLAN_CFGID_ALG_PARAM, sizeof(mac_ioctl_alg_cca_opt_log_param_stru));
3493 
3494     ret = wal_send_cfg_event(netdev, WAL_MSG_TYPE_WRITE,
3495         WAL_MSG_WRITE_MSG_HDR_LENGTH + sizeof(mac_ioctl_alg_cca_opt_log_param_stru), (hi_u8 *)&write_msg, HI_FALSE,
3496         HI_NULL);
3497     if (oal_unlikely(ret != HI_SUCCESS)) {
3498         oam_warning_log1(0, OAM_SF_ANY, "{wal_hipriv_cca_opt_log::return err code [%u]!}\r\n", ret);
3499         return ret;
3500     }
3501 
3502     return HI_SUCCESS;
3503 }
3504 #endif
3505 #endif
3506 
3507 #ifdef _PRE_WLAN_FEATURE_HIPRIV
3508 /* ****************************************************************************
3509  功能描述  : 算法模块参数配置
3510         配置算法的配置命令: hipriv "vap0 alg_cfg vi_sch_limit 10"
3511         该命令针对某一个VAP
3512 
3513  修改历史      :
3514   1.日    期   : 2013年10月25日
3515     作    者   : HiSilicon
3516     修改内容   : 新生成函数
3517 **************************************************************************** */
3518 /* 大数组g_ast_hipriv_cmd的成员,其中wal_hipriv_getcountry修改了对应变量,lint_t e818告警屏蔽 */
wal_hipriv_alg_cfg(oal_net_device_stru * netdev,hi_char * pc_param)3519 static hi_u32 wal_hipriv_alg_cfg(oal_net_device_stru *netdev, hi_char *pc_param)
3520 {
3521     wal_msg_write_stru          write_msg;
3522     hi_u32                      off_set;
3523     hi_char                     ac_name[WAL_HIPRIV_CMD_NAME_MAX_LEN] = {'\0'};
3524     hi_u8                       map_index = 0;
3525     mac_ioctl_alg_param_stru   *alg_param = (mac_ioctl_alg_param_stru *)(write_msg.auc_value);
3526 
3527     /* 低功耗状态下不允许执行 */
3528     if (is_under_ps()) {
3529         oam_warning_log0(0, 0, "under ps mode,can not exec cmd");
3530         return HI_FAIL;
3531     }
3532     /* 获取配置参数名称 */
3533     if (wal_get_cmd_one_arg(pc_param, ac_name, WAL_HIPRIV_CMD_NAME_MAX_LEN, &off_set) != HI_SUCCESS) {
3534         oam_warning_log0(0, OAM_SF_ANY, "{wal_hipriv_alg_cfg::wal_get_cmd_one_arg failed!}\r\n");
3535         return HI_FAIL;
3536     }
3537 
3538     /* 寻找匹配的命令 */
3539     wal_ioctl_alg_cfg_stru alg_cfg = g_ast_alg_cfg_map[0];
3540     while (alg_cfg.pc_name != HI_NULL) {
3541         if (0 == strcmp(alg_cfg.pc_name, ac_name)) {
3542             break;
3543         }
3544         alg_cfg = g_ast_alg_cfg_map[++map_index];
3545     }
3546 
3547     /* 没有找到对应的命令,则报错 */
3548     if (alg_cfg.pc_name == HI_NULL) {
3549         oam_warning_log0(0, OAM_SF_ANY, "{wal_hipriv_alg_cfg::invalid alg_cfg command!}\r\n");
3550         return HI_FAIL;
3551     }
3552 
3553     /* 记录命令对应的枚举值 */
3554     alg_param->alg_cfg = g_ast_alg_cfg_map[map_index].alg_cfg;
3555 
3556     /* 获取参数配置值 */
3557     if (wal_get_cmd_one_arg(pc_param + off_set, ac_name, WAL_HIPRIV_CMD_NAME_MAX_LEN, &off_set) != HI_SUCCESS) {
3558         oam_warning_log0(0, OAM_SF_ANY, "{wal_hipriv_alg_cfg::wal_get_cmd_one_arg failed!}\r\n");
3559         return HI_FAIL;
3560     }
3561 
3562     /* 记录参数配置值 */
3563     alg_param->is_negtive = (ac_name[0] == '-');
3564     alg_param->value = (hi_u32)((ac_name[0] == '-') ? (-1 * oal_atoi(ac_name)) : oal_atoi(ac_name));
3565     /* **************************************************************************
3566                              抛事件到wal层处理
3567     ************************************************************************** */
3568     wal_write_msg_hdr_init(&write_msg, WLAN_CFGID_ALG_PARAM, sizeof(mac_ioctl_alg_param_stru));
3569 
3570     hi_u32 ret = wal_send_cfg_event(netdev, WAL_MSG_TYPE_WRITE,
3571         WAL_MSG_WRITE_MSG_HDR_LENGTH + sizeof(mac_ioctl_alg_param_stru), (hi_u8 *)&write_msg, HI_FALSE, HI_NULL);
3572     if (oal_unlikely(ret != HI_SUCCESS)) {
3573         oam_warning_log1(0, OAM_SF_ANY, "{wal_hipriv_alg_cfg::return err code [%u]!}\r\n", ret);
3574         return ret;
3575     }
3576 
3577     printk("OK\r\n");
3578     return HI_SUCCESS;
3579 }
3580 
3581 #ifdef _PRE_WLAN_FEATURE_ALG_CFG
wal_hipriv_tpc_log_cfg(hi_char * pc_param,mac_ioctl_alg_tpc_log_param_stru * alg_tpc_log_param,hi_u32 * off_set,hi_char * ac_name,hi_u8 * stop_flag)3582 static hi_u32 wal_hipriv_tpc_log_cfg(hi_char *pc_param, mac_ioctl_alg_tpc_log_param_stru *alg_tpc_log_param,
3583     hi_u32 *off_set, hi_char *ac_name, hi_u8 *stop_flag)
3584 {
3585     hi_u32 ret = wal_hipriv_get_mac_addr(pc_param, alg_tpc_log_param->auc_mac_addr, WLAN_MAC_ADDR_LEN, off_set);
3586     if (ret != HI_SUCCESS) {
3587         oam_warning_log0(0, OAM_SF_ANY, "{wal_hipriv_tpc_log::wal_hipriv_get_mac_addr failed!}\r\n");
3588         return ret;
3589     }
3590     pc_param += *off_set;
3591 
3592     while ((*pc_param == '\0') || (*pc_param == ' ')) {
3593         if (*pc_param == '\0') {
3594             *stop_flag = HI_TRUE;
3595             break;
3596         }
3597         ++pc_param;
3598     }
3599 
3600     /* 获取业务类型值 */
3601     if (*stop_flag != HI_TRUE) {
3602         ret = wal_get_cmd_one_arg(pc_param, ac_name, WAL_HIPRIV_CMD_NAME_MAX_LEN, off_set);
3603         if (ret != HI_SUCCESS) {
3604             oam_warning_log1(0, OAM_SF_ANY, "{wal_hipriv_tpc_log::wal_get_cmd_one_arg return err_code %u}\n", ret);
3605             return ret;
3606         }
3607 
3608         alg_tpc_log_param->ac_no = (hi_u8)oal_atoi(ac_name);
3609         pc_param = pc_param + *off_set;
3610 
3611         *stop_flag = HI_FALSE;
3612         while ((*pc_param == ' ') || (*pc_param == '\0')) {
3613             if (*pc_param == '\0') {
3614                 *stop_flag = HI_TRUE;
3615                 break;
3616             }
3617             ++pc_param;
3618         }
3619 
3620         if (*stop_flag != HI_TRUE) {
3621             /* 获取参数配置值 */
3622             ret = wal_get_cmd_one_arg(pc_param, ac_name, WAL_HIPRIV_CMD_NAME_MAX_LEN, off_set);
3623             if (ret != HI_SUCCESS) {
3624                 oam_warning_log1(0, OAM_SF_ANY, "{wal_hipriv_tpc_log::wal_get_cmd_one_arg return err_code [%u]!}\r\n",
3625                     ret);
3626                 return ret;
3627             }
3628 
3629             /* 记录参数配置值 */
3630             alg_tpc_log_param->us_value = (hi_u16)oal_atoi(ac_name);
3631         }
3632     }
3633 
3634     return HI_SUCCESS;
3635 }
3636 
3637 /* ****************************************************************************
3638  功能描述  : tpc算法日志参数配置
3639         (1)统计的配置命令: hipriv.sh "vap0 alg_tpc_log tpc_stat_log 11:22:33:44:55:66  2 500"
3640            该命令针对某一个USER
3641         (2)获取功率的配置命令: hipriv.sh "vap0 alg_tpc_log tpc_get_frame_pow <frm>_power"
3642             其中, <frm>字符串的取值如下:
3643             - rts
3644             - ctsack
3645             - onepkt
3646             - selfcts
3647             - cfend
3648             - ndp
3649             - report
3650 
3651  修改历史      :
3652   1.日    期   : 2015年1月12日
3653     作    者   : HiSilicon
3654     修改内容   : 新生成函数
3655 
3656 **************************************************************************** */
wal_hipriv_tpc_log(oal_net_device_stru * netdev,hi_char * pc_param)3657 static hi_u32 wal_hipriv_tpc_log(oal_net_device_stru *netdev, hi_char *pc_param)
3658 {
3659     wal_msg_write_stru                  write_msg;
3660     hi_u32                              off_set;
3661     hi_char                             ac_name[WAL_HIPRIV_CMD_NAME_MAX_LEN] = {'\0'};
3662     hi_u8                               map_index = 0;
3663     hi_u8                               stop_flag = HI_FALSE;
3664 
3665     mac_ioctl_alg_tpc_log_param_stru *alg_tpc_log_param = (mac_ioctl_alg_tpc_log_param_stru *)(write_msg.auc_value);
3666 
3667     /* 获取配置参数名称 */
3668     hi_u32 ret = wal_get_cmd_one_arg(pc_param, ac_name, WAL_HIPRIV_CMD_NAME_MAX_LEN, &off_set);
3669     if (ret != HI_SUCCESS) {
3670         oam_warning_log1(0, OAM_SF_ANY, "{wal_hipriv_tpc_log::wal_get_cmd_one_arg return err_code [%u]!}\r\n", ret);
3671         return ret;
3672     }
3673     pc_param = pc_param + off_set;
3674 
3675     /* 寻找匹配的命令 */
3676     wal_ioctl_alg_cfg_stru alg_cfg = g_ast_alg_cfg_map[0];
3677     while (alg_cfg.pc_name != HI_NULL) {
3678         if (0 == strcmp(alg_cfg.pc_name, ac_name)) {
3679             break;
3680         }
3681         alg_cfg = g_ast_alg_cfg_map[++map_index];
3682     }
3683 
3684     /* 没有找到对应的命令,则报错 */
3685     if (alg_cfg.pc_name == HI_NULL) {
3686         oam_warning_log0(0, OAM_SF_ANY, "{wal_hipriv_tpc_log::invalid alg_cfg command!}\r\n");
3687         return HI_FAIL;
3688     }
3689 
3690     /* 记录命令对应的枚举值 */
3691     alg_tpc_log_param->alg_cfg = g_ast_alg_cfg_map[map_index].alg_cfg;
3692 
3693     /* 区分获取特定帧功率和统计日志命令处理:获取功率只需获取帧名字 */
3694     if (alg_tpc_log_param->alg_cfg == MAC_ALG_CFG_TPC_GET_FRAME_POW) {
3695         /* 获取配置参数名称 */
3696         ret = wal_get_cmd_one_arg(pc_param, ac_name, WAL_HIPRIV_CMD_NAME_MAX_LEN, &off_set);
3697         if (ret != HI_SUCCESS) {
3698             oam_warning_log1(0, OAM_SF_ANY, "{wal_hipriv_tpc_log::wal_get_cmd_one_arg return err_code [%u]!}\r\n", ret);
3699             return ret;
3700         }
3701         /* 记录命令对应的帧名字 */
3702         alg_tpc_log_param->pc_frame_name = ac_name;
3703     } else {
3704         ret = wal_hipriv_tpc_log_cfg(pc_param, alg_tpc_log_param, &off_set, ac_name, &stop_flag);
3705         if (ret != HI_SUCCESS) {
3706             return ret;
3707         }
3708     }
3709 
3710     /* **************************************************************************
3711                              抛事件到wal层处理
3712     ************************************************************************** */
3713     wal_write_msg_hdr_init(&write_msg, WLAN_CFGID_ALG_PARAM, sizeof(mac_ioctl_alg_tpc_log_param_stru));
3714 
3715     ret = wal_send_cfg_event(netdev, WAL_MSG_TYPE_WRITE,
3716         WAL_MSG_WRITE_MSG_HDR_LENGTH + sizeof(mac_ioctl_alg_tpc_log_param_stru), (hi_u8 *)&write_msg, HI_FALSE,
3717         HI_NULL);
3718     if (oal_unlikely(ret != HI_SUCCESS)) {
3719         oam_warning_log1(0, OAM_SF_ANY, "{wal_hipriv_tpc_log::return err code [%u]!}\r\n", ret);
3720         return ret;
3721     }
3722 
3723     return HI_SUCCESS;
3724 }
3725 
3726 
wal_hipriv_ar_log_cfg(mac_ioctl_alg_ar_log_param_stru * alg_ar_log_param,hi_char * pc_param,hi_u32 * off_set,hi_char * ac_name,hi_u8 * stop_flag)3727 static hi_u32 wal_hipriv_ar_log_cfg(mac_ioctl_alg_ar_log_param_stru *alg_ar_log_param, hi_char *pc_param,
3728     hi_u32 *off_set, hi_char *ac_name, hi_u8 *stop_flag)
3729 {
3730     hi_u8 map_index = 0;
3731 
3732     /* 获取配置参数名称 */
3733     hi_u32 ret = wal_get_cmd_one_arg(pc_param, ac_name, WAL_HIPRIV_CMD_NAME_MAX_LEN, off_set);
3734     if (ret != HI_SUCCESS) {
3735         oam_warning_log1(0, OAM_SF_ANY, "{wal_hipriv_ar_log_cfg::wal_get_cmd_one_arg return err_code [%u]!}\r\n", ret);
3736         return ret;
3737     }
3738     pc_param = pc_param + *off_set;
3739 
3740     /* 寻找匹配的命令 */
3741     wal_ioctl_alg_cfg_stru alg_cfg = g_ast_alg_cfg_map[0];
3742     while (alg_cfg.pc_name != HI_NULL) {
3743         if (0 == strcmp(alg_cfg.pc_name, ac_name)) {
3744             break;
3745         }
3746         alg_cfg = g_ast_alg_cfg_map[++map_index];
3747     }
3748 
3749     /* 没有找到对应的命令,则报错 */
3750     if (alg_cfg.pc_name == HI_NULL) {
3751         oam_warning_log0(0, OAM_SF_ANY, "{wal_hipriv_ar_log_cfg::invalid alg_cfg command!}\r\n");
3752         return HI_FAIL;
3753     }
3754 
3755     /* 记录命令对应的枚举值 */
3756     alg_ar_log_param->alg_cfg = g_ast_alg_cfg_map[map_index].alg_cfg;
3757 
3758     ret = wal_hipriv_get_mac_addr(pc_param, alg_ar_log_param->auc_mac_addr, WLAN_MAC_ADDR_LEN, off_set);
3759     if (ret != HI_SUCCESS) {
3760         oam_warning_log0(0, OAM_SF_ANY, "{wal_hipriv_ar_log_cfg::wal_hipriv_get_mac_addr failed!}\r\n");
3761         return ret;
3762     }
3763     pc_param += *off_set;
3764 
3765     while ((*pc_param == ' ') || (*pc_param == '\0')) {
3766         if (*pc_param == '\0') {
3767             *stop_flag = HI_TRUE;
3768             break;
3769         }
3770         ++pc_param;
3771     }
3772 
3773     return HI_SUCCESS;
3774 }
3775 
3776 /* ****************************************************************************
3777  功能描述  : autorate算法日志参数配置
3778         配置算法的配置命令: hipriv "vap0 alg_ar_log ar_stat_log 11:22:33:44:55:66  2 500"
3779         该命令针对某一个USER
3780 
3781  修改历史      :
3782   1.日    期   : 2013年10月25日
3783     作    者   : HiSilicon
3784     修改内容   : 新生成函数
3785 
3786 **************************************************************************** */
wal_hipriv_ar_log(oal_net_device_stru * netdev,hi_char * pc_param)3787 static hi_u32 wal_hipriv_ar_log(oal_net_device_stru *netdev, hi_char *pc_param)
3788 {
3789     wal_msg_write_stru                  write_msg;
3790     hi_u32                              off_set;
3791     hi_char                             ac_name[WAL_HIPRIV_CMD_NAME_MAX_LEN] = {'\0'};
3792     hi_u8                               stop_flag = HI_FALSE;
3793 
3794     mac_ioctl_alg_ar_log_param_stru *alg_ar_log_param = (mac_ioctl_alg_ar_log_param_stru *)(write_msg.auc_value);
3795 
3796     hi_u32 ret = wal_hipriv_ar_log_cfg(alg_ar_log_param, pc_param, &off_set, ac_name, &stop_flag);
3797     if (ret != HI_SUCCESS) {
3798         oam_warning_log0(0, OAM_SF_ANY, "{wal_hipriv_ar_log::wal_hipriv_ar_log_cfg failed!}\r\n");
3799         return ret;
3800     }
3801 
3802     /* 获取业务类型值 */
3803     if (stop_flag != HI_TRUE) {
3804         ret = wal_get_cmd_one_arg(pc_param, ac_name, WAL_HIPRIV_CMD_NAME_MAX_LEN, &off_set);
3805         if (ret != HI_SUCCESS) {
3806             oam_warning_log1(0, OAM_SF_ANY, "{wal_hipriv_ar_log::wal_get_cmd_one_arg return err_code [%u]!}\r\n", ret);
3807             return ret;
3808         }
3809 
3810         alg_ar_log_param->ac_no = (hi_u8)oal_atoi(ac_name);
3811         pc_param = pc_param + off_set;
3812 
3813         stop_flag = HI_FALSE;
3814         while ((*pc_param == ' ') || (*pc_param == '\0')) {
3815             if (*pc_param == '\0') {
3816                 stop_flag = HI_TRUE;
3817                 break;
3818             }
3819             ++pc_param;
3820         }
3821 
3822         if (stop_flag != HI_TRUE) {
3823             /* 获取参数配置值 */
3824             ret = wal_get_cmd_one_arg(pc_param, ac_name, WAL_HIPRIV_CMD_NAME_MAX_LEN, &off_set);
3825             if (ret != HI_SUCCESS) {
3826                 oam_warning_log1(0, OAM_SF_ANY, "{wal_hipriv_ar_log::wal_get_cmd_one_arg return err_code %u}\n", ret);
3827                 return ret;
3828             }
3829 
3830             /* 记录参数配置值 */
3831             alg_ar_log_param->us_value = (hi_u16)oal_atoi(ac_name);
3832         }
3833     }
3834 
3835     /* **************************************************************************
3836                              抛事件到wal层处理
3837     ************************************************************************** */
3838     wal_write_msg_hdr_init(&write_msg, WLAN_CFGID_ALG_PARAM, sizeof(mac_ioctl_alg_ar_log_param_stru));
3839 
3840     ret = wal_send_cfg_event(netdev, WAL_MSG_TYPE_WRITE,
3841         WAL_MSG_WRITE_MSG_HDR_LENGTH + sizeof(mac_ioctl_alg_ar_log_param_stru), (hi_u8 *)&write_msg, HI_FALSE, HI_NULL);
3842     if (oal_unlikely(ret != HI_SUCCESS)) {
3843         oam_warning_log1(0, OAM_SF_ANY, "{wal_hipriv_ar_log::return err code [%u]!}\r\n", ret);
3844         return ret;
3845     }
3846 
3847     return HI_SUCCESS;
3848 }
3849 #endif
3850 
3851 #ifdef _PRE_WLAN_FEATURE_ALG_CFG_TEST
3852 /* ****************************************************************************
3853  功能描述  : autorate算法测试配置命令:
3854             该命令针对某一个USER
3855             配置算法的配置命令: hipriv "vap0 alg_ar_test cycle_rate 11:22:33:44:55:66 1"
3856             该命令针对某一个USER
3857 
3858  修改历史      :
3859   1.日    期   : 2013年11月14日
3860     作    者   : HiSilicon
3861     修改内容   : 新生成函数
3862 
3863 **************************************************************************** */
wal_hipriv_ar_test(oal_net_device_stru * netdev,hi_char * pc_param)3864 static hi_u32 wal_hipriv_ar_test(oal_net_device_stru *netdev, hi_char *pc_param)
3865 {
3866     wal_msg_write_stru write_msg;
3867     hi_u32             offset = 0;
3868     hi_char            ac_name[WAL_HIPRIV_CMD_NAME_MAX_LEN];
3869     hi_u8              map_index = 0;
3870 
3871     mac_ioctl_alg_ar_test_param_stru *alg_ar_test_param = (mac_ioctl_alg_ar_test_param_stru *)(write_msg.auc_value);
3872 
3873     /* 获取配置参数名称 */
3874     hi_u32 ret = wal_get_cmd_one_arg(pc_param, ac_name, WAL_HIPRIV_CMD_NAME_MAX_LEN, &offset);
3875     if (ret != HI_SUCCESS) {
3876         oam_warning_log1(0, OAM_SF_ANY, "{wal_hipriv_ar_test::wal_get_cmd_one_arg return err_code [%u]!}\r\n", ret);
3877         return ret;
3878     }
3879     pc_param = pc_param + offset;
3880 
3881     /* 寻找匹配的命令 */
3882     wal_ioctl_alg_cfg_stru alg_cfg = g_ast_alg_cfg_map[0];
3883     while (alg_cfg.pc_name != HI_NULL) {
3884         if (0 == strcmp(alg_cfg.pc_name, ac_name)) {
3885             break;
3886         }
3887         alg_cfg = g_ast_alg_cfg_map[++map_index];
3888     }
3889 
3890     /* 没有找到对应的命令,则报错 */
3891     if (alg_cfg.pc_name == HI_NULL) {
3892         oam_warning_log0(0, OAM_SF_ANY, "{wal_hipriv_ar_test::invalid alg_cfg command!}\r\n");
3893         return HI_FAIL;
3894     }
3895 
3896     /* 记录命令对应的枚举值 */
3897     alg_ar_test_param->alg_cfg = g_ast_alg_cfg_map[map_index].alg_cfg;
3898 
3899     ret = wal_hipriv_get_mac_addr(pc_param, alg_ar_test_param->auc_mac_addr, WLAN_MAC_ADDR_LEN, &offset);
3900     if (ret != HI_SUCCESS) {
3901         oam_warning_log0(0, OAM_SF_ANY, "{wal_hipriv_ar_test::wal_hipriv_get_mac_addr failed!}\r\n");
3902         return ret;
3903     }
3904     pc_param += offset;
3905 
3906     /* 获取参数配置值 */
3907     ret = wal_get_cmd_one_arg(pc_param, ac_name, WAL_HIPRIV_CMD_NAME_MAX_LEN, &offset);
3908     if (ret != HI_SUCCESS) {
3909         oam_warning_log1(0, OAM_SF_ANY, "{wal_hipriv_ar_test::wal_get_cmd_one_arg return err_code [%u]!}\r\n", ret);
3910         return ret;
3911     }
3912 
3913     /* 记录参数配置值 */
3914     alg_ar_test_param->us_value = (hi_u16)oal_atoi(ac_name);
3915 
3916     /* **************************************************************************
3917                              抛事件到wal层处理
3918     ************************************************************************** */
3919     wal_write_msg_hdr_init(&write_msg, WLAN_CFGID_ALG_PARAM, sizeof(mac_ioctl_alg_ar_test_param_stru));
3920     ret = wal_send_cfg_event(netdev, WAL_MSG_TYPE_WRITE,
3921         WAL_MSG_WRITE_MSG_HDR_LENGTH + sizeof(mac_ioctl_alg_ar_test_param_stru), (hi_u8 *)&write_msg, HI_FALSE,
3922         HI_NULL);
3923     if (oal_unlikely(ret != HI_SUCCESS)) {
3924         oam_warning_log1(0, OAM_SF_ANY, "{wal_hipriv_ar_test::return err code [%u]!}\r\n", ret);
3925         return ret;
3926     }
3927 
3928     return HI_SUCCESS;
3929 }
3930 #endif
3931 #endif
3932 
3933 /* ****************************************************************************
3934  功能描述  : 统计指定tid的吞吐量
3935 
3936  修改历史      :
3937   1.日    期   : 2014年1月14日
3938     作    者   : HiSilicon
3939     修改内容   : 新生成函数
3940 
3941 **************************************************************************** */
wal_hipriv_get_mac_addr(const hi_char * pc_param,hi_u8 mac_addr[],hi_u8 addr_len,hi_u32 * pul_total_offset)3942 hi_u32 wal_hipriv_get_mac_addr(const hi_char *pc_param, hi_u8 mac_addr[], hi_u8 addr_len, hi_u32 *pul_total_offset)
3943 {
3944     hi_u32                      off_set      = 0;
3945     hi_u32                      ret;
3946     hi_char                     ac_name[WAL_HIPRIV_CMD_NAME_MAX_LEN] = {0};
3947 
3948     /* 获取mac地址 */
3949     ret = wal_get_cmd_one_arg(pc_param, ac_name, WAL_HIPRIV_CMD_NAME_MAX_LEN, &off_set);
3950     if (ret != HI_SUCCESS) {
3951         oam_warning_log1(0, OAM_SF_ANY, "{wal_hipriv_get_mac_addr::wal_get_cmd_one_arg return err_code [%u]!}\r\n",
3952             ret);
3953         return ret;
3954     }
3955     oal_strtoaddr(ac_name, mac_addr, addr_len);
3956 
3957     *pul_total_offset = off_set;
3958 
3959     return HI_SUCCESS;
3960 }
3961 
3962 #ifdef _PRE_WLAN_FEATURE_EDCA_OPT_AP_DEBUG
3963 #ifdef _PRE_WLAN_FEATURE_HIPRIV
3964 /* ****************************************************************************
3965  功能描述  : 指定打开或者关闭sta的edca优化功能
3966 
3967  修改历史      :
3968   1.日    期   : 2014年1月14日
3969     作    者   : HiSilicon
3970     修改内容   : 新生成函数
3971 
3972 **************************************************************************** */
wal_hipriv_set_edca_opt_switch_sta(oal_net_device_stru * netdev,hi_char * pc_param)3973 static hi_u32 wal_hipriv_set_edca_opt_switch_sta(oal_net_device_stru *netdev, hi_char *pc_param)
3974 {
3975     wal_msg_write_stru  write_msg;
3976     hi_u8               flag;
3977     hi_u8               *puc_value       = 0;
3978     hi_u32              ret;
3979     hi_u32              off_set      = 0;
3980     mac_vap_stru        *mac_vap     = HI_NULL;
3981     hi_char             ac_name[WAL_HIPRIV_CMD_NAME_MAX_LEN];
3982 
3983     /* sh hipriv.sh "vap0 set_edca_switch_sta 1/0" */
3984     /* 获取mac_vap */
3985     mac_vap = oal_net_dev_priv(netdev);
3986     if (mac_vap->vap_mode != WLAN_VAP_MODE_BSS_STA) {
3987         oam_warning_log0(0, OAM_SF_EDCA, "{wal_hipriv_set_edca_opt_switch_sta:: only STA_MODE support}");
3988         return HI_FAIL;
3989     }
3990 
3991     /* 获取配置参数 */
3992     ret = wal_get_cmd_one_arg(pc_param, ac_name, WAL_HIPRIV_CMD_NAME_MAX_LEN, &off_set);
3993     if (ret != HI_SUCCESS) {
3994         oam_warning_log1(0, OAM_SF_EDCA,
3995             "{wal_hipriv_set_edca_opt_switch_sta::wal_get_cmd_one_arg return err_code [%u]!}\r\n", ret);
3996         return ret;
3997     }
3998 
3999     flag = (hi_u8)oal_atoi(ac_name);
4000     /* 非法配置参数 */
4001     if (flag > 1) {
4002         oam_warning_log0(0, OAM_SF_EDCA, "wal_hipriv_set_edca_opt_switch_sta, invalid config, should be 0 or 1");
4003         return HI_SUCCESS;
4004     }
4005 
4006     /* 申请事件内存 */
4007     wal_write_msg_hdr_init(&write_msg, WLAN_CFGID_EDCA_OPT_SWITCH_STA, sizeof(hi_u8));
4008     puc_value = (hi_u8 *)(write_msg.auc_value);
4009     *puc_value = flag;
4010 
4011     /* **************************************************************************
4012                              抛事件到wal层处理
4013     ************************************************************************** */
4014     ret = wal_send_cfg_event(netdev, WAL_MSG_TYPE_WRITE, WAL_MSG_WRITE_MSG_HDR_LENGTH + sizeof(hi_u8),
4015         (hi_u8 *)&write_msg, HI_FALSE, HI_NULL);
4016     if (oal_unlikely(ret != HI_SUCCESS)) {
4017         oam_warning_log1(0, OAM_SF_EDCA, "{wal_hipriv_set_edca_opt_switch_sta::return err code [%u]!}\r\n", ret);
4018         return ret;
4019     }
4020 
4021     return HI_SUCCESS;
4022 }
4023 
4024 /* ****************************************************************************
4025  功能描述  : 指定打开或者关闭ap的edca优化功能
4026 
4027  修改历史      :
4028   1.日    期   : 2014年1月14日
4029     作    者   : HiSilicon
4030     修改内容   : 新生成函数
4031 
4032 **************************************************************************** */
wal_hipriv_set_edca_opt_switch_ap(oal_net_device_stru * netdev,hi_char * pc_param)4033 static hi_u32 wal_hipriv_set_edca_opt_switch_ap(oal_net_device_stru *netdev, hi_char *pc_param)
4034 {
4035     wal_msg_write_stru  write_msg;
4036     hi_u8               flag;
4037     hi_u8               *puc_value       = 0;
4038     hi_u32              ret;
4039     hi_u32              off_set      = 0;
4040     mac_vap_stru        *mac_vap     = HI_NULL;
4041     hi_char             ac_name[WAL_HIPRIV_CMD_NAME_MAX_LEN];
4042 
4043     /* sh hipriv.sh "vap0 set_edca_switch_ap 1/0" */
4044     /* 获取mac_vap */
4045     mac_vap = oal_net_dev_priv(netdev);
4046     if ((mac_vap->vap_mode != WLAN_VAP_MODE_BSS_AP)
4047 #ifdef _PRE_WLAN_FEATURE_MESH
4048         && (mac_vap->vap_mode != WLAN_VAP_MODE_MESH)
4049 #endif
4050     ) {
4051         oam_warning_log0(0, OAM_SF_EDCA, "{wal_hipriv_set_edca_opt_cycle_ap:: only AP_MODE support}");
4052         return HI_FAIL;
4053     }
4054 
4055     /* 获取配置参数 */
4056     ret = wal_get_cmd_one_arg(pc_param, ac_name, WAL_HIPRIV_CMD_NAME_MAX_LEN, &off_set);
4057     if (ret != HI_SUCCESS) {
4058         oam_warning_log1(0, OAM_SF_EDCA,
4059             "{wal_hipriv_set_edca_opt_cycle_ap::wal_get_cmd_one_arg return err_code [%u]!}\r\n", ret);
4060         return ret;
4061     }
4062 
4063     flag = (hi_u8)oal_atoi(ac_name);
4064     /* 非法配置参数 */
4065     if (flag > 1) {
4066         oam_warning_log0(0, OAM_SF_EDCA, "wal_hipriv_set_edca_opt_cycle_ap, invalid config, should be 0 or 1");
4067         return HI_SUCCESS;
4068     }
4069 
4070     /* 申请事件内存 */
4071     wal_write_msg_hdr_init(&write_msg, WLAN_CFGID_EDCA_OPT_SWITCH_AP, sizeof(hi_u8));
4072     puc_value = (hi_u8 *)(write_msg.auc_value);
4073     *puc_value = flag;
4074 
4075     /* **************************************************************************
4076                              抛事件到wal层处理
4077     ************************************************************************** */
4078     ret = wal_send_cfg_event(netdev, WAL_MSG_TYPE_WRITE, WAL_MSG_WRITE_MSG_HDR_LENGTH + sizeof(hi_u8),
4079         (hi_u8 *)&write_msg, HI_FALSE, HI_NULL);
4080     if (oal_unlikely(ret != HI_SUCCESS)) {
4081         oam_warning_log1(0, OAM_SF_EDCA, "{wal_hipriv_set_edca_opt_switch_ap::return err_code [%u]!}\r\n", ret);
4082         return ret;
4083     }
4084 
4085     return HI_SUCCESS;
4086 }
4087 
4088 /* ****************************************************************************
4089  功能描述  : 调整edca参数调整的周期
4090 
4091  修改历史      :
4092   1.日    期   : 2014年1月14日
4093     作    者   : HiSilicon
4094     修改内容   : 新生成函数
4095 
4096 **************************************************************************** */
wal_hipriv_set_edca_opt_cycle_ap(oal_net_device_stru * netdev,hi_char * pc_param)4097 static hi_u32 wal_hipriv_set_edca_opt_cycle_ap(oal_net_device_stru *netdev, hi_char *pc_param)
4098 {
4099     wal_msg_write_stru  write_msg;
4100     hi_u32              cycle_ms;
4101     hi_u32             *pul_value       = 0;
4102     hi_u32              ret;
4103     hi_u32              off_set      = 0;
4104     mac_vap_stru       *mac_vap     = HI_NULL;
4105     hi_char             ac_name[WAL_HIPRIV_CMD_NAME_MAX_LEN];
4106 
4107     /* sh hipriv.sh "vap0 set_edca_cycle_ap 200" */
4108     /* 获取mac_vap */
4109     mac_vap = oal_net_dev_priv(netdev);
4110     if ((mac_vap->vap_mode != WLAN_VAP_MODE_BSS_AP)
4111 #ifdef _PRE_WLAN_FEATURE_MESH
4112         || (mac_vap->vap_mode != WLAN_VAP_MODE_MESH)
4113 #endif
4114     ) {
4115         oam_warning_log0(0, OAM_SF_EDCA, "{wal_hipriv_set_edca_opt_cycle_ap:: only AP_MODE support}");
4116         return HI_FAIL;
4117     }
4118 
4119     /* 获取参数值 */
4120     ret = wal_get_cmd_one_arg(pc_param, ac_name, WAL_HIPRIV_CMD_NAME_MAX_LEN, &off_set);
4121     if (ret != HI_SUCCESS) {
4122         oam_warning_log1(0, OAM_SF_EDCA,
4123             "{wal_hipriv_set_edca_opt_cycle_ap::wal_get_cmd_one_arg return err_code [%u]!}\r\n", ret);
4124         return ret;
4125     }
4126 
4127     cycle_ms = (hi_u32)oal_atoi(ac_name);
4128 
4129     /* 申请事件内存 */
4130     wal_write_msg_hdr_init(&write_msg, WLAN_CFGID_EDCA_OPT_CYCLE_AP, sizeof(hi_u32));
4131     pul_value = (hi_u32 *)(write_msg.auc_value);
4132     *pul_value = cycle_ms;
4133 
4134     /* **************************************************************************
4135                              抛事件到wal层处理
4136     ************************************************************************** */
4137     ret = wal_send_cfg_event(netdev, WAL_MSG_TYPE_WRITE, WAL_MSG_WRITE_MSG_HDR_LENGTH + sizeof(hi_u32),
4138         (hi_u8 *)&write_msg, HI_FALSE, HI_NULL);
4139     if (oal_unlikely(ret != HI_SUCCESS)) {
4140         oam_warning_log1(0, OAM_SF_EDCA, "{wal_hipriv_set_edca_opt_cycle_ap::return err code [%u]!}\r\n", ret);
4141         return ret;
4142     }
4143 
4144     return HI_SUCCESS;
4145 }
4146 #endif
4147 #endif
4148 
4149 #ifdef _PRE_WLAN_FEATURE_HIPRIV
4150 /* ****************************************************************************
4151  功能描述  :  设置VAP mib
4152 
4153  修改历史      :
4154   1.日    期   : 2014年2月27日
4155     作    者   : HiSilicon
4156     修改内容   : 新生成函数
4157 **************************************************************************** */
4158 /* 大数组g_ast_hipriv_cmd成员,其中一个成员wal_hipriv_getcountry对pc_param所指向的内容进行了修改,lint_t e818告警屏蔽 */
wal_hipriv_set_mib(oal_net_device_stru * netdev,hi_char * pc_param)4159 static hi_u32 wal_hipriv_set_mib(oal_net_device_stru *netdev, hi_char *pc_param)
4160 {
4161     wal_msg_write_stru          write_msg;
4162     hi_u32                      ret;
4163     hi_u16                      us_len;
4164     hi_char                     ac_name[WAL_HIPRIV_CMD_NAME_MAX_LEN] = {0};
4165     hi_u32                      off_set = 0;
4166     hi_u32                      mib_idx;
4167     hi_u32                      mib_value;
4168     mac_cfg_set_mib_stru        *set_mib = HI_NULL;
4169 
4170     /* 获取设定mib名称 */
4171     ret = wal_get_cmd_one_arg(pc_param, ac_name, WAL_HIPRIV_CMD_NAME_MAX_LEN, &off_set);
4172     if (ret != HI_SUCCESS) {
4173         oam_warning_log1(0, OAM_SF_ANY, "{wal_hipriv_set_mib::wal_get_cmd_one_arg return err_code [%u]!}\r\n", ret);
4174         return ret;
4175     }
4176     pc_param += off_set;
4177 
4178     mib_idx = (hi_u32)oal_atoi(ac_name);
4179 
4180     /* 获取设定置 */
4181     ret = wal_get_cmd_one_arg(pc_param, ac_name, WAL_HIPRIV_CMD_NAME_MAX_LEN, &off_set);
4182     if (ret != HI_SUCCESS) {
4183         oam_warning_log1(0, OAM_SF_ANY, "{wal_hipriv_set_mib::wal_get_cmd_one_arg return err_code [%u]!}\r\n", ret);
4184         return ret;
4185     }
4186 
4187     mib_value = (hi_u32)oal_atoi(ac_name);
4188 
4189     set_mib = (mac_cfg_set_mib_stru *)(write_msg.auc_value);
4190     set_mib->mib_idx = mib_idx;
4191     set_mib->mib_value = mib_value;
4192     us_len = sizeof(mac_cfg_set_mib_stru);
4193 
4194     /* **************************************************************************
4195                               抛事件到wal层处理
4196     ************************************************************************** */
4197     wal_write_msg_hdr_init(&write_msg, WLAN_CFGID_SET_MIB, us_len);
4198 
4199     ret = wal_send_cfg_event(netdev, WAL_MSG_TYPE_WRITE, WAL_MSG_WRITE_MSG_HDR_LENGTH + us_len, (hi_u8 *)&write_msg,
4200         HI_FALSE, HI_NULL);
4201     if (oal_unlikely(ret != HI_SUCCESS)) {
4202         oam_warning_log1(0, OAM_SF_ANY, "{wal_hipriv_set_mib::return err code [%u]!}\r\n", ret);
4203         return ret;
4204     }
4205 
4206     return HI_SUCCESS;
4207 }
4208 
4209 /* ****************************************************************************
4210  功能描述  : 获取VAP mib
4211 
4212  修改历史      :
4213   1.日    期   : 2014年2月27日
4214     作    者   : HiSilicon
4215     修改内容   : 新生成函数
4216 **************************************************************************** */
4217 /* 大数组g_ast_hipriv_cmd的成员,其中wal_hipriv_getcountry修改了对应变量,lint_t e818告警屏蔽 */
wal_hipriv_get_mib(oal_net_device_stru * netdev,hi_char * pc_param)4218 static hi_u32 wal_hipriv_get_mib(oal_net_device_stru *netdev, hi_char *pc_param)
4219 {
4220     wal_msg_write_stru          write_msg;
4221     hi_u32                      ret;
4222     hi_u16                      us_len;
4223     hi_char                     ac_name[WAL_HIPRIV_CMD_NAME_MAX_LEN] = {0};
4224     hi_u32                      off_set = 0;
4225     hi_u32                      mib_idx;
4226 
4227     /* 获取mib名称 */
4228     ret = wal_get_cmd_one_arg(pc_param, ac_name, WAL_HIPRIV_CMD_NAME_MAX_LEN, &off_set);
4229     if (ret != HI_SUCCESS) {
4230         oam_warning_log1(0, OAM_SF_ANY, "{wal_hipriv_get_mib::wal_get_cmd_one_arg return err_code [%u]!}\r\n", ret);
4231         return ret;
4232     }
4233 
4234     mib_idx = (hi_u32)oal_atoi(ac_name);
4235 
4236     us_len = sizeof(hi_u32);
4237     *(hi_u32 *)(write_msg.auc_value) = mib_idx;
4238     /* **************************************************************************
4239                               抛事件到wal层处理
4240     ************************************************************************** */
4241     wal_write_msg_hdr_init(&write_msg, WLAN_CFGID_GET_MIB, us_len);
4242 
4243     ret = wal_send_cfg_event(netdev, WAL_MSG_TYPE_WRITE, WAL_MSG_WRITE_MSG_HDR_LENGTH + us_len, (hi_u8 *)&write_msg,
4244         HI_FALSE, HI_NULL);
4245     if (oal_unlikely(ret != HI_SUCCESS)) {
4246         oam_warning_log1(0, OAM_SF_ANY, "{wal_hipriv_get_mib::return err_code [%u]!}\r\n", ret);
4247         return ret;
4248     }
4249 
4250     return HI_SUCCESS;
4251 }
4252 #endif
4253 
4254 #ifdef _PRE_WLAN_FEATURE_STA_PM
4255 #if defined(_PRE_WLAN_FEATURE_HIPRIV) || defined(_PRE_WLAN_FEATURE_SIGMA)
4256 /* ****************************************************************************
4257  功能描述  : 私有命令,PM功能关闭开启
4258 
4259  修改历史      :
4260   1.日    期   : 2014年12月10日
4261     作    者   : HiSilicon
4262     修改内容   : 新生成函数
4263 **************************************************************************** */
4264 /* 大数组g_ast_hipriv_cmd的成员,其中wal_hipriv_getcountry修改了对应变量,lint_t e818告警屏蔽 */
wal_hipriv_sta_ps_mode(oal_net_device_stru * netdev,hi_char * pc_param)4265 static hi_u32 wal_hipriv_sta_ps_mode(oal_net_device_stru *netdev, hi_char *pc_param)
4266 {
4267     wal_msg_write_stru           write_msg;
4268     hi_u32                       off_set;
4269     hi_char                      ac_name[WAL_HIPRIV_CMD_NAME_MAX_LEN] = {0};
4270     mac_cfg_ps_mode_param_stru   *ps_mode_param = HI_NULL;
4271     oal_net_device_stru          *netdev_tmp = HI_NULL;
4272     mac_vap_stru                 *mac_vap = HI_NULL;
4273     mac_device_stru              *mac_dev = mac_res_get_dev();
4274     hi_u8                        vap_idx;
4275 
4276     hi_unref_param(netdev);
4277 
4278     hi_u32 ret = wal_get_cmd_one_arg(pc_param, ac_name, WAL_HIPRIV_CMD_NAME_MAX_LEN, &off_set);
4279     if (ret != HI_SUCCESS) {
4280         oam_warning_log0(0, OAM_SF_ANY, "{wal_hipriv_sta_ps_mode::wal_get_cmd_one_arg fail!}");
4281         return ret;
4282     }
4283 
4284     hi_u8 vap_ps_mode = (hi_u8)oal_atoi(ac_name);
4285     /* 寻找STA */
4286     for (vap_idx = 0; vap_idx < mac_dev->vap_num; vap_idx++) {
4287         mac_vap = mac_vap_get_vap_stru(mac_dev->auc_vap_id[vap_idx]);
4288         if (mac_vap == HI_NULL) {
4289             continue;
4290         }
4291         if (mac_vap->vap_mode == WLAN_VAP_MODE_BSS_STA) {
4292             break;
4293         }
4294     }
4295     if (mac_vap == HI_NULL) {
4296         return HI_FAIL;
4297     }
4298     netdev_tmp = hmac_vap_get_net_device(mac_vap->vap_id);
4299     if (netdev_tmp == HI_NULL) {
4300         oam_error_log0(0, 0, "wal_hipriv_sta_ps_mode sta device not found.");
4301         return HI_FAIL;
4302     }
4303 
4304     /* **************************************************************************
4305                              抛事件到wal层处理
4306     ************************************************************************** */
4307     wal_write_msg_hdr_init(&write_msg, WLAN_CFGID_SET_PS_MODE, sizeof(mac_cfg_ps_mode_param_stru));
4308 
4309     /* 设置配置命令参数 */
4310     ps_mode_param = (mac_cfg_ps_mode_param_stru *)(write_msg.auc_value);
4311     ps_mode_param->vap_ps_mode = vap_ps_mode;
4312 
4313     ret = wal_send_cfg_event(netdev_tmp, WAL_MSG_TYPE_WRITE,
4314         WAL_MSG_WRITE_MSG_HDR_LENGTH + sizeof(mac_cfg_ps_mode_param_stru), (hi_u8 *)&write_msg, HI_FALSE, HI_NULL);
4315     if (oal_unlikely(ret != HI_SUCCESS)) {
4316         oam_warning_log1(0, OAM_SF_PWR, "{wal_hipriv_sta_ps_mode::return err code [%u]!}\r\n", ret);
4317         return ret;
4318     }
4319 
4320     return HI_SUCCESS;
4321 }
4322 #endif
4323 
4324 /* ****************************************************************************
4325  功能描述  : 私有命令,sta psm的listen interval / tbtt offset
4326 
4327  修改历史      :
4328   1.日    期   : 2015年5月3日
4329     作    者   : HiSilicon
4330     修改内容   : 新生成函数
4331 
4332 **************************************************************************** */
wal_hipriv_sta_pm_on(oal_net_device_stru * netdev,const hi_char * pc_param)4333 hi_u32 wal_hipriv_sta_pm_on(oal_net_device_stru *netdev, const hi_char *pc_param)
4334 {
4335     wal_msg_write_stru              write_msg;
4336     hi_u32                          off_set;
4337     hi_char                         ac_name[WAL_HIPRIV_CMD_NAME_MAX_LEN] = {0};
4338     hi_u32                          ret;
4339     hi_u8                           sta_pm_open;
4340     mac_cfg_ps_open_stru            *sta_pm_open_info = HI_NULL;
4341 
4342     ret = wal_get_cmd_one_arg(pc_param, ac_name, WAL_HIPRIV_CMD_NAME_MAX_LEN, &off_set);
4343     if (ret != HI_SUCCESS) {
4344         oam_warning_log1(0, OAM_SF_ANY, "{wal_hipriv_sta_pm_open::wal_get_cmd_one_arg return err_code [%u]!}\r\n", ret);
4345         return ret;
4346     }
4347 
4348     sta_pm_open = (hi_u8)oal_atoi(ac_name);
4349 
4350     /* **************************************************************************
4351                              抛事件到wal层处理
4352     ************************************************************************** */
4353     wal_write_msg_hdr_init(&write_msg, WLAN_CFGID_SET_STA_PM_ON, sizeof(mac_cfg_ps_open_stru));
4354 
4355     /* 设置配置命令参数 */
4356     sta_pm_open_info = (mac_cfg_ps_open_stru *)(write_msg.auc_value);
4357     /* MAC_STA_PM_SWITCH_ON / MAC_STA_PM_SWITCH_OFF */
4358     sta_pm_open_info->pm_enable = sta_pm_open;
4359     sta_pm_open_info->pm_ctrl_type = MAC_STA_PM_CTRL_TYPE_HOST;
4360 
4361     ret = wal_send_cfg_event(netdev, WAL_MSG_TYPE_WRITE, WAL_MSG_WRITE_MSG_HDR_LENGTH + sizeof(mac_cfg_ps_open_stru),
4362         (hi_u8 *)&write_msg, HI_FALSE, HI_NULL);
4363     if (oal_unlikely(ret != HI_SUCCESS)) {
4364         oam_warning_log1(0, OAM_SF_PWR, "{wal_hipriv_sta_pm_open::return err code [%u]!}\r\n", ret);
4365         return ret;
4366     }
4367 
4368     return HI_SUCCESS;
4369 }
4370 
4371 #ifdef _PRE_WLAN_FEATURE_HIPRIV
wal_hipriv_sta_set_psm_offset(oal_net_device_stru * netdev,hi_char * param)4372 hi_u32 wal_hipriv_sta_set_psm_offset(oal_net_device_stru *netdev, hi_char *param)
4373 {
4374     wal_msg_write_stru      write_msg;
4375     hi_u32                  off_set;
4376     hi_char                 name[WAL_HIPRIV_CMD_NAME_MAX_LEN] = {'\0'};
4377     hi_u32                  ret;
4378     hi_u16                  beacon_timeout;
4379     hi_u16                  tbtt_offset;
4380     hi_u16                  ext_tbtt_offset;
4381     mac_cfg_ps_param_stru   *cfg_ps_para = HI_NULL;
4382 
4383     /* beacon timeout */
4384     ret = wal_get_cmd_one_arg(param, name, WAL_HIPRIV_CMD_NAME_MAX_LEN, &off_set);
4385     if (ret != HI_SUCCESS) {
4386         oam_warning_log1(0, OAM_SF_ANY, "{wal_hipriv_sta_psm_param::btout arg error [%d]!}", ret);
4387         return ret;
4388     }
4389 
4390     beacon_timeout = (hi_u16)oal_atoi(name);
4391     param = param + off_set;
4392 
4393     /* tbtt offset */
4394     ret = wal_get_cmd_one_arg(param, name, WAL_HIPRIV_CMD_NAME_MAX_LEN, &off_set);
4395     if (ret != HI_SUCCESS) {
4396         oam_warning_log1(0, OAM_SF_PWR, "{wal_hipriv_sta_psm_param::tbtt arg error [%d]!}", ret);
4397         return ret;
4398     }
4399 
4400     tbtt_offset = (hi_u16)oal_atoi(name);
4401     param = param + off_set;
4402 
4403     /* ext tbtt offset */
4404     ret = wal_get_cmd_one_arg(param, name, WAL_HIPRIV_CMD_NAME_MAX_LEN, &off_set);
4405     if (ret != HI_SUCCESS) {
4406         oam_warning_log1(0, OAM_SF_PWR, "{wal_hipriv_sta_psm_param::ext tbtt arg error [%d]!}", ret);
4407         return ret;
4408     }
4409 
4410     ext_tbtt_offset = (hi_u16)oal_atoi(name);
4411 
4412     oam_info_log3(0, OAM_SF_PWR, "{wal_hipriv_sta_psm_param::[bcn tout] %d [tbtt] %d [ext] %d}!", beacon_timeout,
4413         tbtt_offset, ext_tbtt_offset);
4414 
4415     /* **************************************************************************
4416       抛事件到wal层处理
4417      ************************************************************************** */
4418     wal_write_msg_hdr_init(&write_msg, WLAN_CFGID_SET_PSM_PARAM, sizeof(mac_cfg_ps_param_stru));
4419 
4420     /* 设置配置命令参数 */
4421     cfg_ps_para = (mac_cfg_ps_param_stru *)(write_msg.auc_value);
4422     cfg_ps_para->beacon_timeout      = beacon_timeout;
4423     cfg_ps_para->tbtt_offset         = tbtt_offset;
4424     cfg_ps_para->ext_tbtt_offset     = ext_tbtt_offset;
4425 
4426     ret = wal_send_cfg_event(netdev, WAL_MSG_TYPE_WRITE, WAL_MSG_WRITE_MSG_HDR_LENGTH + sizeof(mac_cfg_ps_param_stru),
4427         (hi_u8 *)&write_msg, HI_FALSE, HI_NULL);
4428     if (oal_unlikely(ret != HI_SUCCESS)) {
4429         oam_warning_log1(0, OAM_SF_PWR, "{wal_hipriv_sta_psm_param::send evt error [%d]!}", ret);
4430         return ret;
4431     }
4432 
4433     return HI_SUCCESS;
4434 }
4435 
wal_hipriv_sta_set_offload_param(oal_net_device_stru * netdev,hi_char * param)4436 hi_u32 wal_hipriv_sta_set_offload_param(oal_net_device_stru *netdev, hi_char *param)
4437 {
4438     wal_msg_write_stru  write_msg;
4439     hi_u32              offset;
4440     hi_char             name[WAL_HIPRIV_CMD_NAME_MAX_LEN] = {0};
4441     hi_u32              ret;
4442     mac_cfg_psm_offset  cfg;
4443 
4444     /* 安全编程规则6.6例外(1) 对固定长度的数组进行初始化,或对固定长度的结构体进行内存初始化 */
4445     memset_s(&cfg, sizeof(mac_cfg_psm_offset), 0, sizeof(mac_cfg_psm_offset));
4446     ret = wal_get_cmd_one_arg(param, name, WAL_HIPRIV_CMD_NAME_MAX_LEN, &offset);
4447     if (ret != HI_SUCCESS) {
4448         oam_warning_log1(0, OAM_SF_PWR, "{wal_hipriv_sta_set_psm_offset::wal_get_cmd_one_arg return err_code [%u]!}",
4449             ret);
4450         return ret;
4451     }
4452 
4453     if (strcmp("free_arp_interval", name) == 0) {
4454         cfg.type = MAC_PSM_FREE_ARP_INTERVAL;
4455     }
4456     param = param + offset;
4457 
4458     ret = wal_get_cmd_one_arg(param, name, WAL_HIPRIV_CMD_NAME_MAX_LEN, &offset);
4459     if (ret != HI_SUCCESS) {
4460         oam_warning_log1(0, OAM_SF_PWR, "{wal_hipriv_sta_set_psm_offset::wal_get_cmd_one_arg return err_code [%u]!}",
4461             ret);
4462         return ret;
4463     }
4464 
4465     cfg.value = (hi_u16)oal_atoi(name);
4466     cfg.resv = 0;
4467     /* **************************************************************************
4468                               抛事件到wal层处理
4469      ************************************************************************** */
4470     wal_write_msg_hdr_init(&write_msg, WLAN_CFGID_SET_PSM_OFFSET, sizeof(mac_cfg_psm_offset));
4471     if (memcpy_s(write_msg.auc_value, sizeof(mac_cfg_psm_offset), &cfg, sizeof(mac_cfg_psm_offset)) != EOK) {
4472         oam_error_log0(0, OAM_SF_PWR, "{wal_hipriv_sta_set_psm_offset::mem safe function err!}");
4473         return HI_FAIL;
4474     }
4475     /* 设置配置命令参数 */
4476     ret = wal_send_cfg_event(netdev, WAL_MSG_TYPE_WRITE, WAL_MSG_WRITE_MSG_HDR_LENGTH + sizeof(mac_cfg_psm_offset),
4477         (hi_u8 *)&write_msg, HI_FALSE, HI_NULL);
4478     if (oal_unlikely(ret != HI_SUCCESS)) {
4479         oam_warning_log1(0, OAM_SF_PWR, "{wal_hipriv_sta_set_psm_offset::return err code [%u]!}", ret);
4480         return ret;
4481     }
4482 
4483     return HI_SUCCESS;
4484 }
4485 
4486 /* 大数组g_ast_hipriv_cmd的成员,其中wal_hipriv_getcountry修改了对应变量,lint_t e818告警屏蔽 */
wal_hipriv_sta_set_hw_ps_mode(oal_net_device_stru * netdev,hi_char * param)4487 hi_u32 wal_hipriv_sta_set_hw_ps_mode(oal_net_device_stru *netdev, hi_char *param)
4488 {
4489     wal_msg_write_stru          write_msg;
4490     hi_u32                      ret;
4491     hi_char                     ac_name[WAL_HIPRIV_CMD_NAME_MAX_LEN] = {0};
4492     hi_u32                      off_set = 0;
4493     hi_u8                       hw_ps_mode;
4494 
4495     /* 获取设定的值 */
4496     ret = wal_get_cmd_one_arg(param, ac_name, WAL_HIPRIV_CMD_NAME_MAX_LEN, &off_set);
4497     if (ret != HI_SUCCESS) {
4498         oam_warning_log1(0, OAM_SF_PWR, "{wal_hipriv_sta_set_hw_ps_mode::get_one_arg return err_code [%d]!}", ret);
4499         return ret;
4500     }
4501 
4502     hw_ps_mode = (hi_u8)oal_atoi(ac_name);
4503     /* **************************************************************************
4504                               抛事件到wal层处理
4505     ************************************************************************** */
4506     wal_write_msg_hdr_init(&write_msg, WLAN_CFGID_SET_STA_HW_PS_MODE, sizeof(hi_u8));
4507     *(hi_u8 *)(write_msg.auc_value) = hw_ps_mode;
4508 
4509     ret = wal_send_cfg_event(netdev, WAL_MSG_TYPE_WRITE, WAL_MSG_WRITE_MSG_HDR_LENGTH + sizeof(hi_u8),
4510         (hi_u8 *)&write_msg, HI_FALSE, HI_NULL);
4511     if (oal_unlikely(ret != HI_SUCCESS)) {
4512         oam_warning_log1(0, OAM_SF_PWR, "{wal_hipriv_sta_set_hw_ps_mode::return err code [%u]!}", ret);
4513         return ret;
4514     }
4515     return HI_SUCCESS;
4516 }
4517 #endif
4518 
4519 #if defined(_PRE_WLAN_FEATURE_HIPRIV) || defined(_PRE_WLAN_FEATURE_SIGMA)
4520 /* ****************************************************************************
4521  功能描述  : 私有命令,UAPSD参数配置
4522 
4523  修改历史      :
4524   1.日    期   : 2014年12月22日
4525     作    者   : HiSilicon
4526     修改内容   : 新生成函数
4527 
4528 **************************************************************************** */
wal_hipriv_set_uapsd_para(oal_net_device_stru * netdev,hi_char * pc_param)4529 hi_u32 wal_hipriv_set_uapsd_para(oal_net_device_stru *netdev, hi_char *pc_param)
4530 {
4531     wal_msg_write_stru          write_msg;
4532     hi_u32                      off_set;
4533     hi_char                     ac_name[WAL_HIPRIV_CMD_NAME_MAX_LEN] = {0};
4534     hi_u32                      ret;
4535     mac_cfg_uapsd_sta_stru     *uapsd_param = HI_NULL;
4536     hi_u8                       max_sp_len;
4537     hi_u8                       ac;
4538     hi_u8                       delivery_map = 0;
4539     hi_u8                       orig_dev_state = wal_dev_is_running();
4540 
4541     if (wal_netdev_stop(netdev) != HI_SUCCESS) {
4542         oam_warning_log0(0, OAM_SF_ANY, "{wal_hipriv_set_uapsd_para::wal_netdev_stop failed\r\n");
4543         return HI_FAIL;
4544     }
4545 
4546     if ((OAL_IFF_RUNNING & oal_netdevice_flags(netdev)) != 0) {
4547         oam_error_log1(0, OAM_SF_ANY, "{wal_hipriv_set_uapsd_para::device is busy, please down it first %d!}\n",
4548             oal_netdevice_flags(netdev));
4549         return HI_FAIL;
4550     }
4551 
4552     ret = wal_get_cmd_one_arg(pc_param, ac_name, WAL_HIPRIV_CMD_NAME_MAX_LEN, &off_set);
4553     if (ret != HI_SUCCESS) {
4554         oam_warning_log1(0, OAM_SF_ANY, "{wal_hipriv_set_uapsd_para::wal_get_cmd_one_arg return err_code [%u]!}\r\n",
4555             ret);
4556         return ret;
4557     }
4558 
4559     max_sp_len = (hi_u8)oal_atoi(ac_name);
4560 
4561     for (ac = 0; ac < WLAN_WME_AC_BUTT; ac++) {
4562         pc_param = pc_param + off_set;
4563         ret = wal_get_cmd_one_arg(pc_param, ac_name, WAL_HIPRIV_CMD_NAME_MAX_LEN, &off_set);
4564         if (ret != HI_SUCCESS) {
4565             oam_warning_log1(0, OAM_SF_ANY,
4566                 "{wal_hipriv_set_uapsd_para::wal_get_cmd_one_arg return err_code [%u]!}\r\n", ret);
4567             return ret;
4568         }
4569 
4570         /* delivery_enabled的参数设置 */
4571         delivery_map |= (hi_u8)(((hi_u8)oal_atoi(ac_name) & BIT0) << ac);
4572     }
4573 
4574     /* **************************************************************************
4575                              抛事件到wal层处理
4576     ************************************************************************** */
4577     wal_write_msg_hdr_init(&write_msg, WLAN_CFGID_SET_UAPSD_PARA, sizeof(mac_cfg_uapsd_sta_stru));
4578 
4579     /* 设置配置命令参数 */
4580     uapsd_param = (mac_cfg_uapsd_sta_stru *)(write_msg.auc_value);
4581     uapsd_param->max_sp_len   = max_sp_len;
4582     uapsd_param->delivery_map = delivery_map;
4583     /* trigger_enabled 参数的设置 trigger与delivery一致 */
4584     uapsd_param->trigger_map  = delivery_map;
4585     ret = wal_send_cfg_event(netdev, WAL_MSG_TYPE_WRITE, WAL_MSG_WRITE_MSG_HDR_LENGTH + sizeof(mac_cfg_uapsd_sta_stru),
4586         (hi_u8 *)&write_msg, HI_FALSE, HI_NULL);
4587     if (oal_unlikely(ret != HI_SUCCESS)) {
4588         oam_warning_log1(0, OAM_SF_PWR, "{wal_hipriv_set_uapsd_para::return err code [%u]!}\r\n", ret);
4589         return ret;
4590     }
4591 
4592     if (orig_dev_state == HI_TRUE) {
4593         if (wal_netdev_open(netdev) != HI_SUCCESS) {
4594             oam_warning_log0(0, OAM_SF_ANY, "{wal_hipriv_set_uapsd_para::wal_netdev_open failed\r\n");
4595             return HI_FAIL;
4596         }
4597     }
4598 
4599     return HI_SUCCESS;
4600 }
4601 #endif
4602 #endif
4603 
4604 #if defined(_PRE_WLAN_FEATURE_HIPRIV) || defined(_PRE_WLAN_FEATURE_SIGMA)
4605 /* ****************************************************************************
4606  功能描述  : 设置20M short gi参数
4607  修改历史      :
4608   1.日    期   : 2019年1月24日
4609     修改内容   : 新生成函数
4610 **************************************************************************** */
4611 /* 大数组g_ast_hipriv_cmd的成员,其中wal_hipriv_getcountry修改了对应变量,lint_t e818告警屏蔽 */
wal_hipriv_set_shortgi20(oal_net_device_stru * netdev,hi_char * pc_param)4612 hi_u32 wal_hipriv_set_shortgi20(oal_net_device_stru *netdev, hi_char *pc_param)
4613 {
4614     wal_msg_write_stru       write_msg;
4615     hi_s32                   l_tmp;
4616     hi_u32                   off_set;
4617     hi_char                  ac_name[WAL_HIPRIV_CMD_NAME_MAX_LEN] = {0};
4618     hi_u32                   ret;
4619 
4620     ret = wal_get_cmd_one_arg(pc_param, ac_name, WAL_HIPRIV_CMD_NAME_MAX_LEN, &off_set);
4621     if (ret != HI_SUCCESS) {
4622         oam_warning_log1(0, OAM_SF_ANY, "{wal_hipriv_set_shortgi20::wal_get_cmd_one_arg return err_code %d!}\r\n", ret);
4623         return ret;
4624     }
4625 
4626     if (strcmp("0", ac_name) == 0) {
4627         l_tmp = 0;
4628     } else if (strcmp("1", ac_name) == 0) {
4629         l_tmp = 1;
4630     } else {
4631         oam_warning_log0(0, OAM_SF_ANY, "{wal_hipriv_set_shortgi20::command param is error!}\r\n");
4632         return HI_ERR_CODE_INVALID_CONFIG;
4633     }
4634 
4635     /* **************************************************************************
4636         抛事件到wal层处理
4637     ************************************************************************** */
4638     wal_write_msg_hdr_init(&write_msg, WLAN_CFGID_SHORTGI, sizeof(hi_s32));
4639     *((hi_s32 *)(write_msg.auc_value)) = l_tmp; /* 设置配置命令参数 */
4640 
4641     ret = wal_send_cfg_event(netdev, WAL_MSG_TYPE_WRITE, WAL_MSG_WRITE_MSG_HDR_LENGTH + sizeof(hi_s32),
4642         (hi_u8 *)&write_msg, HI_FALSE, HI_NULL);
4643     if (oal_unlikely(ret != HI_SUCCESS)) {
4644         oam_warning_log1(0, OAM_SF_ANY, "{wal_hipriv_set_shortgi20::return err code [%u]!}\r\n", ret);
4645         return ret;
4646     }
4647 
4648     return HI_SUCCESS;
4649 }
4650 #endif
4651 
4652 #ifdef _PRE_WLAN_FEATURE_HIPRIV
4653 /* ****************************************************************************
4654  函 数 名  : wal_hipriv_set_retry_limit
4655  功能描述  : 设置软件重传参数
4656  输入参数  : [1]net_dev
4657              [2]pc_param
4658  返 回 值  : static hi_u32
4659 **************************************************************************** */
4660 /* 大数组g_ast_hipriv_cmd成员,其中一个成员wal_hipriv_getcountry对pc_param所指向的内容进行了修改,lint_t e818告警屏蔽 */
wal_hipriv_set_retry_limit(oal_net_device_stru * netdev,hi_char * pc_param)4661 static hi_u32 wal_hipriv_set_retry_limit(oal_net_device_stru *netdev, hi_char *pc_param)
4662 {
4663     wal_msg_write_stru          write_msg;
4664     hi_u32                      off_set;
4665     hi_char                     ac_name[WAL_HIPRIV_CMD_NAME_MAX_LEN] = {0};
4666     hi_u32                      ret;
4667     mac_cfg_retry_param_stru   *set_param = HI_NULL;
4668     hi_u8                       type;
4669     hi_u8                       limit;
4670 
4671     ret = wal_get_cmd_one_arg(pc_param, ac_name, WAL_HIPRIV_CMD_NAME_MAX_LEN, &off_set);
4672     if (ret != HI_SUCCESS) {
4673         oam_warning_log1(0, OAM_SF_CFG, "{wal_hipriv_set_retry_limit::wal_get_cmd_one_arg return err_code %d!}\r\n",
4674             ret);
4675         return ret;
4676     }
4677     pc_param += off_set;
4678 
4679     type = (hi_u8)oal_atoi(ac_name);
4680 
4681     ret = wal_get_cmd_one_arg(pc_param, ac_name, WAL_HIPRIV_CMD_NAME_MAX_LEN, &off_set);
4682     if (ret != HI_SUCCESS) {
4683         oam_warning_log1(0, OAM_SF_CFG, "{wal_hipriv_set_retry_limit1::wal_get_cmd_one_arg return err_code %d!}\r\n",
4684             ret);
4685         return ret;
4686     }
4687 
4688     limit = (hi_u8)oal_atoi(ac_name);
4689 
4690     set_param = (mac_cfg_retry_param_stru *)(write_msg.auc_value);
4691     set_param->type   = type;
4692     set_param->limit = limit;
4693 
4694     /* **************************************************************************
4695         抛事件到wal层处理
4696     ************************************************************************** */
4697     wal_write_msg_hdr_init(&write_msg, WLAN_CFGID_SET_RETRY_LIMIT, sizeof(mac_cfg_retry_param_stru));
4698 
4699     ret = wal_send_cfg_event(netdev, WAL_MSG_TYPE_WRITE,
4700         WAL_MSG_WRITE_MSG_HDR_LENGTH + sizeof(mac_cfg_retry_param_stru), (hi_u8 *)&write_msg, HI_FALSE, HI_NULL);
4701     if (oal_unlikely(ret != HI_SUCCESS)) {
4702         oam_warning_log1(0, OAM_SF_ANY, "{wal_hipriv_set_retry_limit::return err code [%u]!}\r\n", ret);
4703         return ret;
4704     }
4705 
4706     return HI_SUCCESS;
4707 }
4708 #endif
4709 
4710 #ifdef _PRE_WLAN_FEATURE_MESH
4711 #ifdef _PRE_WLAN_FEATURE_HIPRIV
4712 /* ****************************************************************************
4713  函 数 名  : wal_hipriv_set_report_param
4714  功能描述  : 设置驱动上报lwip 重传次数的相关限制参数
4715 
4716  修改历史      :
4717   1.日    期   : 2019年3月9日
4718     作    者   : HiSilicon
4719     修改内容   : 新生成函数
4720 **************************************************************************** */
4721 /* 大数组g_ast_hipriv_cmd的成员,其中wal_hipriv_getcountry修改了对应变量,lint_t e818告警屏蔽 */
wal_hipriv_set_report_times_limit(oal_net_device_stru * netdev,hi_char * pc_param)4722 static hi_u32 wal_hipriv_set_report_times_limit(oal_net_device_stru *netdev, hi_char *pc_param)
4723 {
4724     wal_msg_write_stru  write_msg;
4725     hi_u32              off_set;
4726     hi_char             ac_name[WAL_HIPRIV_CMD_NAME_MAX_LEN] = {0};
4727     hi_u32              ret;
4728     hi_u8               times_limit;
4729 
4730     /*
4731         命令格式
4732         hipriv wlan0 set_times_limit X
4733     */
4734     ret = wal_get_cmd_one_arg(pc_param, ac_name, WAL_HIPRIV_CMD_NAME_MAX_LEN, &off_set);
4735     if (ret != HI_SUCCESS) {
4736         oam_warning_log1(0, OAM_SF_CFG,
4737             "{wal_hipriv_set_report_times_limit::wal_get_cmd_one_arg return err_code %d!}\r\n", ret);
4738         return ret;
4739     }
4740 
4741     times_limit = (hi_u8)oal_atoi(ac_name);
4742 
4743     /* **************************************************************************
4744         抛事件到wal层处理
4745     ************************************************************************** */
4746     wal_write_msg_hdr_init(&write_msg, WLAN_CFGID_SET_REPORT_TIMES_LIMIT, sizeof(hi_u8));
4747     *(write_msg.auc_value) = times_limit; /* 设置配置命令参数 */
4748 
4749     ret = wal_send_cfg_event(netdev, WAL_MSG_TYPE_WRITE, WAL_MSG_WRITE_MSG_HDR_LENGTH + sizeof(hi_u8),
4750         (hi_u8 *)&write_msg, HI_FALSE, HI_NULL);
4751     if (oal_unlikely(ret != HI_SUCCESS)) {
4752         oam_warning_log1(0, OAM_SF_ANY, "{wal_hipriv_set_report_times_limit::return err code [%u]!}\r\n", ret);
4753         return HI_FAIL;
4754     }
4755 
4756     return HI_SUCCESS;
4757 }
4758 
4759 /* ****************************************************************************
4760  功能描述  : 设置驱动上报lwip 重传次数的相关限制参数
4761 
4762  修改历史      :
4763   1.日    期   : 2019年3月9日
4764     作    者   : HiSilicon
4765     修改内容   : 新生成函数
4766 **************************************************************************** */
4767 /* 大数组g_ast_hipriv_cmd的成员,其中wal_hipriv_getcountry修改了对应变量,lint_t e818告警屏蔽 */
wal_hipriv_set_report_cnt_limit(oal_net_device_stru * netdev,hi_char * pc_param)4768 static hi_u32 wal_hipriv_set_report_cnt_limit(oal_net_device_stru *netdev, hi_char *pc_param)
4769 {
4770     wal_msg_write_stru  write_msg;
4771     hi_u32              off_set;
4772     hi_char             ac_name[WAL_HIPRIV_CMD_NAME_MAX_LEN] = {0};
4773     hi_u32              ret;
4774     hi_u8               cnt_limit;
4775 
4776     /*
4777         命令格式
4778         hipriv wlan0 set_cnt_limit X
4779     */
4780     ret = wal_get_cmd_one_arg(pc_param, ac_name, WAL_HIPRIV_CMD_NAME_MAX_LEN, &off_set);
4781     if (ret != HI_SUCCESS) {
4782         oam_warning_log1(0, OAM_SF_CFG,
4783             "{wal_hipriv_set_report_cnt_limit::wal_get_cmd_one_arg return err_code %d!}\r\n", ret);
4784         return ret;
4785     }
4786 
4787     cnt_limit = (hi_u8)oal_atoi(ac_name);
4788 
4789     /* **************************************************************************
4790         抛事件到wal层处理
4791     ************************************************************************** */
4792     wal_write_msg_hdr_init(&write_msg, WLAN_CFGID_SET_REPORT_CNT_LIMIT, sizeof(hi_u8));
4793     *(write_msg.auc_value) = cnt_limit; /* 设置配置命令参数 */
4794 
4795     ret = wal_send_cfg_event(netdev, WAL_MSG_TYPE_WRITE, WAL_MSG_WRITE_MSG_HDR_LENGTH + sizeof(hi_u8),
4796         (hi_u8 *)&write_msg, HI_FALSE, HI_NULL);
4797     if (oal_unlikely(ret != HI_SUCCESS)) {
4798         oam_warning_log1(0, OAM_SF_ANY, "{wal_hipriv_set_report_cnt_limit::return err code [%u]!}\r\n", ret);
4799         return HI_FAIL;
4800     }
4801 
4802     return HI_SUCCESS;
4803 }
4804 
4805 /* ****************************************************************************
4806  功能描述  : 设置mesh vap是否为MBR节点
4807 
4808  修改历史      :
4809   1.日    期   : 2019年4月28日
4810     作    者   : HiSilicon
4811     修改内容   : 新生成函数
4812 **************************************************************************** */
4813 /* 大数组g_ast_hipriv_cmd的成员,其中wal_hipriv_getcountry修改了对应变量,lint_t e818告警屏蔽 */
wal_hipriv_set_en_mbr(oal_net_device_stru * netdev,hi_char * pc_param)4814 static hi_u32 wal_hipriv_set_en_mbr(oal_net_device_stru *netdev, hi_char *pc_param)
4815 {
4816     wal_msg_write_stru  write_msg;
4817     hi_u32              off_set;
4818     hi_char             ac_name[WAL_HIPRIV_CMD_NAME_MAX_LEN] = {0};
4819     hi_u32              ret;
4820     hi_u8               mbr;
4821 
4822     ret = wal_get_cmd_one_arg(pc_param, ac_name, WAL_HIPRIV_CMD_NAME_MAX_LEN, &off_set);
4823     if (ret != HI_SUCCESS) {
4824         oam_warning_log1(0, OAM_SF_CFG, "{wal_hipriv_set_en_mbr:wal_get_cmd_one_arg return err_code %d!}\r\n", ret);
4825         return ret;
4826     }
4827     if (strcmp("0", ac_name) == 0) {
4828         mbr = HI_FALSE;
4829     } else if (strcmp("1", ac_name) == 0) {
4830         mbr = HI_TRUE;
4831     } else {
4832         oam_warning_log0(0, OAM_SF_ANY, "{wal_hipriv_set_en_mbr::command param is error!}\r\n");
4833         return HI_ERR_CODE_INVALID_CONFIG;
4834     }
4835 
4836     /* **************************************************************************
4837         抛事件到wal层处理
4838     ************************************************************************** */
4839     wal_write_msg_hdr_init(&write_msg, WLAN_CFGID_SET_MBR_EN, sizeof(hi_u8));
4840     *(write_msg.auc_value) = mbr; /* 设置配置命令参数 */
4841 
4842     ret = wal_send_cfg_event(netdev, WAL_MSG_TYPE_WRITE, WAL_MSG_WRITE_MSG_HDR_LENGTH + sizeof(hi_u8),
4843         (hi_u8 *)&write_msg, HI_FALSE, HI_NULL);
4844     if (oal_unlikely(ret != HI_SUCCESS)) {
4845         oam_warning_log1(0, OAM_SF_ANY, "{wal_hipriv_set_en_mbr::return err code [%u]!}\r\n", ret);
4846         return HI_FAIL;
4847     }
4848 
4849     return HI_SUCCESS;
4850 }
4851 
4852 /* ****************************************************************************
4853  功能描述  : 设置mesh vap的mnid
4854 
4855  修改历史      :
4856   1.日    期   : 2019年4月28日
4857     作    者   : HiSilicon
4858     修改内容   : 新生成函数
4859 **************************************************************************** */
4860 /* 大数组g_ast_hipriv_cmd的成员,其中wal_hipriv_getcountry修改了对应变量,lint_t e818告警屏蔽 */
wal_hipriv_set_mnid(oal_net_device_stru * netdev,hi_char * pc_param)4861 static hi_u32 wal_hipriv_set_mnid(oal_net_device_stru *netdev, hi_char *pc_param)
4862 {
4863     wal_msg_write_stru  write_msg;
4864     hi_u32              off_set;
4865     hi_char             ac_name[WAL_HIPRIV_CMD_NAME_MAX_LEN] = {0};
4866     hi_u32              ret;
4867     hi_u8               mnid;
4868 
4869     ret = wal_get_cmd_one_arg(pc_param, ac_name, WAL_HIPRIV_CMD_NAME_MAX_LEN, &off_set);
4870     if (ret != HI_SUCCESS) {
4871         oam_warning_log1(0, OAM_SF_CFG, "{wal_hipriv_set_mnid::wal_get_cmd_one_arg return err_code %d!}\r\n", ret);
4872         return ret;
4873     }
4874 
4875     mnid = (hi_u8)oal_atoi(ac_name);
4876 
4877     /* **************************************************************************
4878         抛事件到wal层处理
4879     ************************************************************************** */
4880     wal_write_msg_hdr_init(&write_msg, WLAN_CFGID_SET_MNID, sizeof(hi_u8));
4881     *(write_msg.auc_value) = mnid; /* 设置配置命令参数 */
4882 
4883     ret = wal_send_cfg_event(netdev, WAL_MSG_TYPE_WRITE, WAL_MSG_WRITE_MSG_HDR_LENGTH + sizeof(hi_u8),
4884         (hi_u8 *)&write_msg, HI_FALSE, HI_NULL);
4885     if (oal_unlikely(ret != HI_SUCCESS)) {
4886         oam_warning_log1(0, OAM_SF_ANY, "{wal_hipriv_set_mnid::return err code [%u]!}\r\n", ret);
4887         return HI_FAIL;
4888     }
4889 
4890     return HI_SUCCESS;
4891 }
4892 
4893 /* ****************************************************************************
4894  功能描述  : 设置beacon priority(调试接口)
4895 
4896  修改历史      :
4897   1.日    期   : 2019年6月3日
4898     作    者   : HiSilicon
4899     修改内容   : 新生成函数
4900 **************************************************************************** */
4901 /* 大数组g_ast_hipriv_cmd的成员,其中wal_hipriv_getcountry修改了对应变量,lint_t e818告警屏蔽 */
wal_hipriv_set_beacon_priority(oal_net_device_stru * netdev,hi_char * pc_param)4902 static hi_u32 wal_hipriv_set_beacon_priority(oal_net_device_stru *netdev, hi_char *pc_param)
4903 {
4904     wal_msg_write_stru  write_msg;
4905     hi_u32              off_set;
4906     hi_char             ac_name[WAL_HIPRIV_CMD_NAME_MAX_LEN] = {0};
4907     hi_u32              ret;
4908     hi_u32              beacon_prio;
4909 
4910     ret = wal_get_cmd_one_arg(pc_param, ac_name, WAL_HIPRIV_CMD_NAME_MAX_LEN, &off_set);
4911     if (ret != HI_SUCCESS) {
4912         oam_warning_log1(0, OAM_SF_CFG, "{wal_hipriv_set_beacon_priority::wal_get_cmd_one_arg return err_code %d!}\r\n",
4913             ret);
4914         return ret;
4915     }
4916 
4917     beacon_prio = (hi_u32)oal_atoi(ac_name);
4918     if (beacon_prio > WLAN_MESH_BEACON_PRIO_MAX) {
4919         oam_warning_log0(0, OAM_SF_ANY, "{wal_hipriv_set_beacon_priority::invalid beacon prio!!}\r\n");
4920         return HI_FAIL;
4921     }
4922 
4923     /* **************************************************************************
4924         抛事件到wal层处理
4925     ************************************************************************** */
4926     wal_write_msg_hdr_init(&write_msg, WLAN_CFGID_SET_BEACON_PRIORITY, sizeof(hi_u8));
4927     *(write_msg.auc_value) = (hi_u8)beacon_prio; /* 设置配置命令参数 */
4928 
4929     ret = wal_send_cfg_event(netdev, WAL_MSG_TYPE_WRITE, WAL_MSG_WRITE_MSG_HDR_LENGTH + sizeof(hi_u8),
4930         (hi_u8 *)&write_msg, HI_FALSE, HI_NULL);
4931     if (oal_unlikely(ret != HI_SUCCESS)) {
4932         oam_warning_log1(0, OAM_SF_ANY, "{wal_hipriv_set_beacon_priority::return err code [%u]!}\r\n", ret);
4933         return ret;
4934     }
4935 
4936     return HI_SUCCESS;
4937 }
4938 
4939 /* ****************************************************************************
4940  功能描述  : 设置Mesh Accept STA标志位(调试接口)
4941 
4942  修改历史      :
4943   1.日    期   : 2019年6月20日
4944     作    者   : HiSilicon
4945     修改内容   : 新生成函数
4946 **************************************************************************** */
4947 /* 大数组g_ast_hipriv_cmd的成员,其中wal_hipriv_getcountry修改了对应变量,lint_t e818告警屏蔽 */
wal_hipriv_set_mesh_accept_sta(oal_net_device_stru * netdev,hi_char * pc_param)4948 static hi_u32 wal_hipriv_set_mesh_accept_sta(oal_net_device_stru *netdev, hi_char *pc_param)
4949 {
4950     wal_msg_write_stru  write_msg;
4951     hi_u32              off_set;
4952     hi_char             ac_name[WAL_HIPRIV_CMD_NAME_MAX_LEN] = {0};
4953     hi_u32              ret;
4954     hi_u8               accept_sta;
4955 
4956     /* 获取RSSI门限开关 */
4957     ret = wal_get_cmd_one_arg(pc_param, ac_name, WAL_HIPRIV_CMD_NAME_MAX_LEN, &off_set);
4958     if (ret != HI_SUCCESS) {
4959         oam_warning_log1(0, OAM_SF_ANY,
4960             "{wal_hipriv_set_mesh_accept_sta::wal_get_cmd_one_arg return err_code [%u]!}\r\n", ret);
4961         return ret;
4962     }
4963 
4964     if ((strcmp("0", ac_name) == 0)) {
4965         accept_sta = 0;
4966     } else if ((strcmp("1", ac_name) == 0)) {
4967         accept_sta = 1;
4968     } else {
4969         oam_warning_log1(0, OAM_SF_ANY, "{wal_hipriv_set_mesh_accept_sta::the mod switch command is error [%p]!}\r\n",
4970             (uintptr_t)ac_name);
4971         return HI_ERR_CODE_INVALID_CONFIG;
4972     }
4973 
4974     /* **************************************************************************
4975         抛事件到wal层处理
4976     ************************************************************************** */
4977     wal_write_msg_hdr_init(&write_msg, WLAN_CFGID_SET_MESH_ACCEPT_STA, sizeof(hi_u8));
4978     *(write_msg.auc_value) = accept_sta; /* 设置配置命令参数 */
4979 
4980     ret = wal_send_cfg_event(netdev, WAL_MSG_TYPE_WRITE, WAL_MSG_WRITE_MSG_HDR_LENGTH + sizeof(hi_u8),
4981         (hi_u8 *)&write_msg, HI_FALSE, HI_NULL);
4982     if (oal_unlikely(ret != HI_SUCCESS)) {
4983         oam_warning_log1(0, OAM_SF_ANY, "{wal_hipriv_set_mesh_accept_sta::return err code [%u]!}\r\n", ret);
4984         return ret;
4985     }
4986 
4987     return HI_SUCCESS;
4988 }
4989 #endif
4990 #endif
4991 
4992 #if defined(_PRE_WLAN_FEATURE_ARP_OFFLOAD) || defined(_PRE_WLAN_FEATURE_DHCP_OFFLOAD)
4993 #ifdef _PRE_WLAN_FEATURE_HIPRIV
wal_hipriv_offload_parse_ipv4(hi_char * ip_str,hi_u32 * result)4994 static hi_u32 wal_hipriv_offload_parse_ipv4(hi_char *ip_str, hi_u32 *result)
4995 {
4996     const hi_char *delims = ".";
4997     hi_char *byte = HI_NULL;
4998     hi_u8 count = 0;
4999     hi_u32 byte_value;
5000 
5001     if (strlen(ip_str) > 15) { /* IPV4 字符串长度最大 15 字节 */
5002         oam_error_log0(0, OAM_SF_ANY, "{wal_hipriv_offload_parse_ipv4::ip len wrong!}\n");
5003         return HI_FAIL;
5004     }
5005 
5006     byte = oal_strtok(ip_str, delims);
5007     while (byte != HI_NULL) {
5008         byte_value = (hi_u32)oal_atoi(byte);
5009         byte_value <<= count * 8; /* 移位3次,每次8比特。 */
5010         count++;
5011         *result += byte_value;
5012         byte = oal_strtok(HI_NULL, delims);
5013     }
5014 
5015     if (count != 4) { /* IPV4的长度为4个字节 */
5016         oam_error_log0(0, OAM_SF_ANY, "{wal_hipriv_offload_parse_ipv4::ip format wrong!}\n");
5017         return HI_FAIL;
5018     }
5019 
5020     return HI_SUCCESS;
5021 }
5022 
wal_hipriv_offload_build_ipv4(hi_char * param,mac_ip_addr_config_stru * ip)5023 static hi_u32 wal_hipriv_offload_build_ipv4(hi_char *param, mac_ip_addr_config_stru *ip)
5024 {
5025     hi_u32 ret;
5026     hi_u32 offset;
5027     hi_char name[WAL_HIPRIV_CMD_NAME_MAX_LEN] = {0};
5028 
5029     /* 默认IPV4类型 */
5030     ip->type = MAC_CONFIG_IPV4;
5031 
5032     /* 获取IP操作 */
5033     ret = wal_get_cmd_one_arg(param, name, WAL_HIPRIV_CMD_NAME_MAX_LEN, &offset);
5034     if (ret != HI_SUCCESS) {
5035         oam_warning_log1(0, OAM_SF_PWR, "{wal_hipriv_offload_build_ipv4::wal_get_cmd_one_arg return err_code [%u]!}\n",
5036             ret);
5037         return ret;
5038     }
5039     param = param + offset;
5040     if ((strcmp("0", name) == 0)) {
5041         ip->oper = MAC_IP_ADDR_DEL;
5042         /* 清楚所有ip地址,返回成功 */
5043         return HI_SUCCESS;
5044     } else if (strcmp("1", name) == 0) {
5045         ip->oper = MAC_IP_ADDR_ADD;
5046     } else {
5047         oam_error_log0(0, OAM_SF_PWR, "{wal_hipriv_offload_build_ipv4::IP operation wrong.}");
5048     }
5049 
5050     /* 获取IP地址 */
5051     ret = wal_get_cmd_one_arg(param, name, WAL_HIPRIV_CMD_NAME_MAX_LEN, &offset);
5052     if (ret != HI_SUCCESS) {
5053         oam_warning_log1(0, OAM_SF_PWR, "{wal_hipriv_offload_build_ipv4::wal_get_cmd_one_arg return err_code [%u]!}\n",
5054             ret);
5055         return ret;
5056     }
5057     ret = wal_hipriv_offload_parse_ipv4(name, &ip->ip.ipv4);
5058     if (ret != HI_SUCCESS) {
5059         oam_warning_log1(0, OAM_SF_PWR,
5060             "{wal_hipriv_offload_build_ipv4::wal_hipriv_offload_parse_ipv4 return err_code [%u]!}\n", ret);
5061         return ret;
5062     }
5063 
5064     return HI_SUCCESS;
5065 }
5066 #endif
5067 #endif
5068 
5069 #ifdef _PRE_WLAN_FEATURE_ARP_OFFLOAD
5070 #ifdef _PRE_WLAN_FEATURE_HIPRIV
5071 /* ****************************************************************************m
5072  功能描述      : 使能 ARP offload 功能
5073  命令格式      : hipriv wlan0 arp_offload 0/1 ip
5074  修改历史      :
5075   1.日    期   : 2019年4月19日
5076     作    者   : HiSilicon
5077     修改内容   : 新生成函数
5078 **************************************************************************** */
5079 /* 大数组g_ast_hipriv_cmd的成员,其中wal_hipriv_getcountry修改了对应变量,lint_t e818告警屏蔽 */
wal_hipriv_arp_offload_setting(oal_net_device_stru * netdev,hi_char * param)5080 static hi_u32 wal_hipriv_arp_offload_setting(oal_net_device_stru *netdev, hi_char *param)
5081 {
5082     wal_msg_write_stru  write_msg;
5083     hi_u32              ret;
5084     hi_u16              len;
5085     mac_ip_addr_config_stru ip_addr_cfg = {0};
5086 
5087     ret = wal_hipriv_offload_build_ipv4(param, &ip_addr_cfg);
5088     if (ret != HI_SUCCESS) {
5089         oam_warning_log1(0, OAM_SF_PWR, "{wal_hipriv_arp_offload_setting::build_ip error[%d]!}\n", ret);
5090         return HI_FAIL;
5091     }
5092 
5093     /* **************************************************************************
5094         抛事件到wal层处理
5095     ************************************************************************** */
5096     if (memcpy_s(write_msg.auc_value, sizeof(mac_ip_addr_config_stru), (const hi_void *)&ip_addr_cfg,
5097         sizeof(mac_ip_addr_config_stru)) != EOK) {
5098         oam_error_log0(0, 0, "{wal_hipriv_arp_offload_setting::mem safe function err!}");
5099         return HI_FAIL;
5100     }
5101     len = sizeof(mac_ip_addr_config_stru);
5102 
5103     wal_write_msg_hdr_init(&write_msg, WLAN_CFGID_ARP_OFFLOAD_SETTING, len);
5104     ret = wal_send_cfg_event(netdev, WAL_MSG_TYPE_WRITE, WAL_MSG_WRITE_MSG_HDR_LENGTH + len, (hi_u8 *)&write_msg,
5105         HI_FALSE, HI_NULL);
5106     if (oal_unlikely(ret != HI_SUCCESS)) {
5107         oam_warning_log1(0, OAM_SF_PWR, "{wal_hipriv_arp_offload_setting::wal_send_cfg_event error[%u]!}\r\n", ret);
5108         return ret;
5109     }
5110 
5111     return HI_SUCCESS;
5112 }
5113 
5114 /* ****************************************************************************
5115  功能描述      : 显示 ARP offload 信息
5116  命令格式      : hipriv wlan0 arp_offload_show_info 1/0 1/0
5117 
5118  修改历史      :
5119   1.日    期   : 2019年4月19日
5120     作    者   : HiSilicon
5121     修改内容   : 新生成函数
5122 **************************************************************************** */
wal_hipriv_arp_offload_show_info(oal_net_device_stru * netdev,hi_char * pc_param)5123 static hi_u32 wal_hipriv_arp_offload_show_info(oal_net_device_stru *netdev, hi_char *pc_param)
5124 {
5125     wal_msg_write_stru              write_msg;
5126     hi_u32                          off_set;
5127     hi_char                         ac_name[WAL_HIPRIV_CMD_NAME_MAX_LEN] = {0};
5128     hi_u32                          ret;
5129     mac_cfg_arpoffload_info_stru    arp_offload_info;
5130 
5131     /* 获取 show ip addr */
5132     ret = wal_get_cmd_one_arg(pc_param, ac_name, WAL_HIPRIV_CMD_NAME_MAX_LEN, &off_set);
5133     if (ret != HI_SUCCESS) {
5134         oam_warning_log1(0, OAM_SF_PWR,
5135             "{wal_hipriv_arp_offload_show_info::wal_get_cmd_one_arg return err_code [%u]!}\n", ret);
5136         return ret;
5137     }
5138 
5139     arp_offload_info.show_ip_addr = (hi_u8)oal_atoi(ac_name);
5140     pc_param = pc_param + off_set;
5141 
5142     /* 获取 show arp offload info */
5143     ret = wal_get_cmd_one_arg(pc_param, ac_name, WAL_HIPRIV_CMD_NAME_MAX_LEN, &off_set);
5144     if (ret != HI_SUCCESS) {
5145         oam_warning_log1(0, OAM_SF_PWR,
5146             "{wal_hipriv_arp_offload_show_info::wal_get_cmd_one_arg return err_code [%u]!}\n", ret);
5147         return ret;
5148     }
5149 
5150     arp_offload_info.show_arpoffload_info = (hi_u8)oal_atoi(ac_name);
5151 
5152     /* **************************************************************************
5153                                 抛事件到wal层处理
5154     ************************************************************************** */
5155     wal_write_msg_hdr_init(&write_msg, WLAN_CFGID_ARP_OFFLOAD_SHOW_INFO, sizeof(mac_cfg_arpoffload_info_stru));
5156     /* 设置配置命令参数 */
5157     if (memcpy_s(write_msg.auc_value, WAL_MSG_WRITE_MAX_LEN, (const hi_void *)&arp_offload_info,
5158         sizeof(mac_cfg_arpoffload_info_stru)) != EOK) {
5159         oam_error_log0(0, 0, "{wal_hipriv_arp_offload_show_info::mem safe function err!}");
5160         return HI_FAIL;
5161     }
5162 
5163     ret = wal_send_cfg_event(netdev, WAL_MSG_TYPE_WRITE,
5164         WAL_MSG_WRITE_MSG_HDR_LENGTH + sizeof(mac_cfg_arpoffload_info_stru), (hi_u8 *)&write_msg, HI_FALSE, HI_NULL);
5165     if (oal_unlikely(ret != HI_SUCCESS)) {
5166         oam_warning_log1(0, OAM_SF_ANY, "{wal_hipriv_arp_offload_show_info::return err code [%u]!}\n", ret);
5167         return ret;
5168     }
5169 
5170     return HI_SUCCESS;
5171 }
5172 #endif
5173 #endif
5174 
5175 #ifdef _PRE_WLAN_FEATURE_DHCP_OFFLOAD
5176 #ifdef _PRE_WLAN_FEATURE_HIPRIV
wal_hipriv_dhcp_offload_setting(oal_net_device_stru * netdev,hi_char * param)5177 static hi_u32 wal_hipriv_dhcp_offload_setting(oal_net_device_stru *netdev, hi_char *param)
5178 {
5179     wal_msg_write_stru  write_msg;
5180     hi_u32              ret;
5181     hi_u16              len;
5182     mac_ip_addr_config_stru ip_addr_cfg = {0};
5183 
5184     ret = wal_hipriv_offload_build_ipv4(param, &ip_addr_cfg);
5185     if (ret != HI_SUCCESS) {
5186         oam_warning_log1(0, OAM_SF_PWR, "{wal_hipriv_dhcp_offload_setting::build_ip error[%d]!}\n", ret);
5187         return HI_FAIL;
5188     }
5189 
5190     /* **************************************************************************
5191         抛事件到wal层处理
5192     ************************************************************************** */
5193     if (memcpy_s(write_msg.auc_value, sizeof(mac_ip_addr_config_stru), (const hi_void *)&ip_addr_cfg,
5194         sizeof(mac_ip_addr_config_stru)) != EOK) {
5195         oam_error_log0(0, 0, "{wal_hipriv_dhcp_offload_setting::mem safe function err!}");
5196         return HI_FAIL;
5197     }
5198     len = sizeof(mac_ip_addr_config_stru);
5199 
5200     wal_write_msg_hdr_init(&write_msg, WLAN_CFGID_DHCP_OFFLOAD_SETTING, len);
5201     ret = wal_send_cfg_event(netdev, WAL_MSG_TYPE_WRITE, WAL_MSG_WRITE_MSG_HDR_LENGTH + len, (hi_u8 *)&write_msg,
5202         HI_FALSE, HI_NULL);
5203     if (oal_unlikely(ret != HI_SUCCESS)) {
5204         oam_warning_log1(0, OAM_SF_PWR, "{wal_hipriv_dhcp_offload_setting::wal_send_cfg_event error[%u]!}\r\n", ret);
5205         return ret;
5206     }
5207 
5208     return HI_SUCCESS;
5209 }
5210 #endif
5211 #endif
5212 
5213 #ifdef _PRE_DEBUG_MODE
5214 #ifdef _PRE_WLAN_FEATURE_HIPRIV
5215 
wal_hipriv_get_cfg_id(hi_char ac_arg,wlan_cfgid_enum_uint16 * cfg_id)5216 hi_u32 wal_hipriv_get_cfg_id(hi_char ac_arg, wlan_cfgid_enum_uint16 *cfg_id)
5217 {
5218     if (strcmp(ac_arg, "aifsn") == 0) {
5219         *cfg_id = WLAN_CFGID_EDCA_TABLE_AIFSN;
5220     } else if (strcmp(ac_arg, "cwmin") == 0) {
5221         *cfg_id = WLAN_CFGID_EDCA_TABLE_CWMIN;
5222     } else if (strcmp(ac_arg, "cwmax") == 0) {
5223         *cfg_id = WLAN_CFGID_EDCA_TABLE_CWMAX;
5224     } else if (strcmp(ac_arg, "txoplimit") == 0) {
5225         *cfg_id = WLAN_CFGID_EDCA_TABLE_TXOP_LIMIT;
5226     } else if (strcmp(ac_arg, "qaifsn") == 0) {
5227         *cfg_id = WLAN_CFGID_QEDCA_TABLE_AIFSN;
5228     } else if (strcmp(ac_arg, "qcwmin") == 0) {
5229         *cfg_id = WLAN_CFGID_QEDCA_TABLE_CWMIN;
5230     } else if (strcmp(ac_arg, "qcwmax") == 0) {
5231         *cfg_id = WLAN_CFGID_QEDCA_TABLE_CWMAX;
5232     } else if (strcmp(ac_arg, "qtxoplimit") == 0) {
5233         *cfg_id = WLAN_CFGID_QEDCA_TABLE_TXOP_LIMIT;
5234     } else {
5235         oam_warning_log0(0, OAM_SF_ANY, "{wal_hipriv_get_cfg_id::invalid wmm param!}");
5236         return HI_FAIL;
5237     }
5238 
5239     return HI_SUCCESS;
5240 }
5241 
wal_hipriv_check_aifsn(wlan_cfgid_enum_uint16 cfg_id,hi_u32 value)5242 hi_u32 wal_hipriv_check_aifsn(wlan_cfgid_enum_uint16 cfg_id, hi_u32 value)
5243 {
5244     if ((cfg_id == WLAN_CFGID_EDCA_TABLE_AIFSN) || (cfg_id == WLAN_CFGID_QEDCA_TABLE_AIFSN)) {
5245         if ((value < WLAN_QEDCA_TABLE_AIFSN_MIN) || (value > WLAN_QEDCA_TABLE_AIFSN_MAX)) {
5246             oam_warning_log0(0, OAM_SF_ANY, "{wal_hipriv_check_aifsn::invalid AIFSN value!}");
5247             return HI_FAIL;
5248         }
5249     } else if ((cfg_id == WLAN_CFGID_EDCA_TABLE_CWMIN) || (cfg_id == WLAN_CFGID_QEDCA_TABLE_CWMIN)) {
5250         if ((value > WLAN_QEDCA_TABLE_CWMIN_MAX) || (value < WLAN_QEDCA_TABLE_CWMIN_MIN)) {
5251             oam_warning_log0(0, OAM_SF_ANY, "{wal_hipriv_check_aifsn::invalid CWMIN value!}");
5252             return HI_FAIL;
5253         }
5254     } else if ((cfg_id == WLAN_CFGID_EDCA_TABLE_CWMAX) || (cfg_id == WLAN_CFGID_QEDCA_TABLE_CWMAX)) {
5255         if ((value > WLAN_QEDCA_TABLE_CWMAX_MAX) || (value < WLAN_QEDCA_TABLE_CWMAX_MIN)) {
5256             oam_warning_log0(0, OAM_SF_ANY, "{wal_hipriv_check_aifsn::invalid CWMAX value!}");
5257             return HI_FAIL;
5258         }
5259     } else if ((cfg_id == WLAN_CFGID_EDCA_TABLE_TXOP_LIMIT) || (cfg_id == WLAN_CFGID_QEDCA_TABLE_TXOP_LIMIT)) {
5260         if ((value > WLAN_QEDCA_TABLE_TXOP_LIMIT_MAX) || (value < WLAN_QEDCA_TABLE_TXOP_LIMIT_MIN)) {
5261             oam_warning_log0(0, OAM_SF_ANY, "{wal_hipriv_check_aifsn::invalid TXOP_LIMIT value!}");
5262             return HI_FAIL;
5263         }
5264     }
5265 
5266     return HI_SUCCESS;
5267 }
5268 
5269 /* ****************************************************************************
5270  功能描述      : 设置WMM参数
5271 
5272  修改历史      :
5273   1.日    期   : 2019年4月23日
5274     作    者   : HiSilicon
5275     修改内容   : 新生成函数
5276 **************************************************************************** */
5277 /* 大数组g_ast_hipriv_cmd成员,其中一个成员wal_hipriv_getcountry对pc_param所指向的内容进行了修改,lint_t e818告警屏蔽 */
5278 /* 规则5.1 避免函数过长,函数不超过50行(非空非注释),申请例外: 包含本函数的宏没有打开,建议屏蔽 */
wal_hipriv_set_wmm_param(oal_net_device_stru * netdev,hi_char * pc_param)5279 static hi_u32 wal_hipriv_set_wmm_param(oal_net_device_stru *netdev, hi_char *pc_param)
5280 {
5281     wal_msg_write_stru write_msg;
5282     hi_u32 off_set;
5283     hi_char                ac_arg[WAL_HIPRIV_CMD_NAME_MAX_LEN] = {0};
5284     hi_char *ac_arg_ptr = ac_arg;
5285     wlan_cfgid_enum_uint16 cfg_id;
5286     hi_u8 orig_dev_state = wal_dev_is_running();
5287 
5288     if (wal_netdev_stop(netdev) != HI_SUCCESS) {
5289         oam_warning_log0(0, OAM_SF_ANY, "{wal_hipriv_set_wmm_param::wal_netdev_stop failed\r\n");
5290         return HI_FAIL;
5291     }
5292 
5293     /* wmm 参数 */
5294     hi_u32 ret = wal_get_cmd_one_arg(pc_param, ac_arg_ptr, WAL_HIPRIV_CMD_NAME_MAX_LEN, &off_set);
5295     if (ret != HI_SUCCESS) {
5296         oam_warning_log1(0, OAM_SF_ANY, "{wal_hipriv_set_wmm_param::wal_get_cmd_one_arg return err_code [%u]}", ret);
5297         return ret;
5298     }
5299     pc_param += off_set;
5300     ret = wal_hipriv_get_cfg_id(ac_arg_ptr, &cfg_id);
5301     if (ret != HI_SUCCESS) {
5302         return ret;
5303     }
5304 
5305     /* 获取ac num */
5306     ret = wal_get_cmd_one_arg(pc_param, ac_arg_ptr, WAL_HIPRIV_CMD_NAME_MAX_LEN, &off_set);
5307     if (ret != HI_SUCCESS) {
5308         oam_warning_log1(0, OAM_SF_ANY, "{wal_hipriv_set_wmm_param::wal_get_cmd_one_arg return err_code [%u]!}", ret);
5309         return ret;
5310     }
5311     pc_param += off_set;
5312 
5313     hi_u32 ac = (hi_u32)oal_atoi(ac_arg_ptr);
5314     /* ac取值0~3 */
5315     if (ac >= WLAN_WME_AC_BUTT) {
5316         oam_warning_log0(0, OAM_SF_ANY, "{wal_hipriv_set_wmm_param::invalid ac num!}\r\n");
5317         return HI_FAIL;
5318     }
5319 
5320     /* 获取ac value */
5321     ret = wal_get_cmd_one_arg(pc_param, ac_arg_ptr, WAL_HIPRIV_CMD_NAME_MAX_LEN, &off_set);
5322     if (ret != HI_SUCCESS) {
5323         oam_warning_log1(0, OAM_SF_ANY, "{wal_hipriv_set_wmm_param::wal_get_cmd_one_arg return err_code [%u]}", ret);
5324         return ret;
5325     }
5326 
5327     hi_u32 value = (hi_u32)oal_atoi(ac_arg_ptr);
5328     ret = wal_hipriv_check_aifsn(cfg_id, value);
5329     if (ret != HI_SUCCESS) {
5330         return ret;
5331     }
5332 
5333     wal_write_msg_hdr_init(&write_msg, cfg_id, sizeof(wal_msg_wmm_stru));
5334 
5335     wal_msg_wmm_stru *wmm_params = (wal_msg_wmm_stru *)(write_msg.auc_value);
5336     wmm_params->cfg_id = cfg_id;
5337     wmm_params->ac     = ac;
5338     wmm_params->value  = value;
5339 
5340     ret = wal_send_cfg_event(netdev, WAL_MSG_TYPE_WRITE, WAL_MSG_WRITE_MSG_HDR_LENGTH + sizeof(wal_msg_wmm_stru),
5341         (hi_u8 *)&write_msg, HI_FALSE, HI_NULL);
5342     if (oal_unlikely(ret != HI_SUCCESS)) {
5343         oam_warning_log1(0, OAM_SF_ANY, "{wal_hipriv_set_wmm_param::return err code [%u]!}\r\n", ret);
5344     }
5345 
5346     if (orig_dev_state == HI_TRUE) {
5347         if (wal_netdev_open(netdev) != HI_SUCCESS) {
5348             oam_warning_log0(0, OAM_SF_ANY, "{wal_hipriv_wmm_switch::wal_netdev_open failed\r\n");
5349             return HI_FAIL;
5350         }
5351     }
5352 
5353     return ret;
5354 }
5355 #endif
5356 #endif
5357 
5358 /* ****************************************************************************
5359  功能描述  : 打印对应vap的接收FCS的信息
5360 
5361  修改历史      :
5362   1.日    期   : 2019年5月5日
5363     作    者   : HiSilicon
5364     修改内容   : 新生成函数
5365 **************************************************************************** */
wal_hipriv_rx_fcs_info(oal_net_device_stru * netdev,hi_char * pc_param)5366 hi_u32 wal_hipriv_rx_fcs_info(oal_net_device_stru *netdev, hi_char *pc_param)
5367 {
5368     wal_msg_write_stru      write_msg;
5369     hi_u32                  ret;
5370 
5371     hi_unref_param(pc_param);
5372     wal_write_msg_hdr_init(&write_msg, WLAN_CFGID_RX_FCS_INFO, sizeof(hi_u32));
5373     ret = wal_send_cfg_event(netdev, WAL_MSG_TYPE_WRITE, WAL_MSG_WRITE_MSG_HDR_LENGTH + sizeof(hi_u32),
5374         (hi_u8 *)&write_msg, HI_FALSE, HI_NULL);
5375     if (oal_unlikely(ret != HI_SUCCESS)) {
5376         oam_warning_log1(0, OAM_SF_ANY, "{wal_hipriv_rx_fcs_info::return err code [%u]!}\r\n", ret);
5377         return ret;
5378     }
5379 
5380     return HI_SUCCESS;
5381 }
5382 
wal_set_protocol(oal_net_device_stru * netdev,hi_char * protocol_param,hi_s32 len,hi_s32 * protocol_value)5383 hi_u32 wal_set_protocol(oal_net_device_stru *netdev, hi_char *protocol_param, hi_s32 len, hi_s32 *protocol_value)
5384 {
5385     hi_s32 protocol = oal_strtol(protocol_param, NULL, 10); /* 10进制 */
5386     hi_u32 ret;
5387 
5388     if ((len != 1) || (protocol_param[0] < '0') || (protocol_param[0] > '2')) {
5389         oam_warning_log1(0, OAM_SF_ANY, "{wal_set_protocol:: protocol len [%d] error!}\r\n", len);
5390         return HI_FAIL;
5391     }
5392 
5393     switch (protocol) {
5394         case 0: /* 0:代表模式11bgn */
5395             /* 安全编程规则6.6例外(5) 源内存全部是静态字符串常量 */
5396             strcpy_s(protocol_param, WAL_HIPRIV_CMD_NAME_MAX_LEN, "11bgn");
5397             break;
5398         case 1: /* 1:代表模式11bg */
5399             /* 安全编程规则6.6例外(5) 源内存全部是静态字符串常量 */
5400             strcpy_s(protocol_param, WAL_HIPRIV_CMD_NAME_MAX_LEN, "11bg");
5401             break;
5402         case 2: /* 2:代表模式11b */
5403             /* 安全编程规则6.6例外(5) 源内存全部是静态字符串常量 */
5404             strcpy_s(protocol_param, WAL_HIPRIV_CMD_NAME_MAX_LEN, "11b");
5405             break;
5406         default:
5407             oam_warning_log0(0, OAM_SF_ANY, "{wal_set_protocol:: protocol error!}\r\n");
5408             return HI_FAIL;
5409     }
5410 
5411     ret = wal_ioctl_set_mode(netdev, protocol_param);
5412     if (ret != HI_SUCCESS) {
5413         oam_error_log1(0, OAM_SF_ANY, "wal_set_protocol::set_mode return err_code [%d]!", ret);
5414         return ret;
5415     }
5416 
5417     *protocol_value = protocol;
5418     return HI_SUCCESS;
5419 }
5420 
wal_set_rate(oal_net_device_stru * netdev,hi_char * rate_param,hi_s32 protocol)5421 hi_u32 wal_set_rate(oal_net_device_stru *netdev, hi_char *rate_param, hi_s32 protocol)
5422 {
5423     wlan_legacy_rate_value_enum_uint8 rate_index;
5424     hi_u32 ret;
5425 
5426     /* 解析是设置为哪一级速率 */
5427     for (rate_index = 0; rate_index < WLAN_LEGACY_RATE_VALUE_BUTT; rate_index++) {
5428         if (!strcmp(g_pauc_non_ht_rate_tbl[rate_index], rate_param)) {
5429             break;
5430         }
5431     }
5432 
5433     /* 根据速率配置TX描述符中的协议模式 */
5434     if (((rate_index <= WLAN_SHORT_11B_11_M_BPS) && (protocol == WAL_PHY_MODE_11B)) ||
5435         ((rate_index >= WLAN_LEGACY_OFDM_48M_BPS) && (rate_index <= WLAN_LEGACY_OFDM_9M_BPS) &&
5436         (protocol == WAL_PHY_MODE_11G))) {
5437         ret = wal_hipriv_set_rate(netdev, rate_param);
5438         if (ret != HI_SUCCESS) {
5439             oam_error_log1(0, OAM_SF_ANY, "wal_set_rate::set_rate return err_code [%d]!}\r\n", ret);
5440         }
5441         return ret;
5442     } else {
5443         oam_warning_log0(0, OAM_SF_ANY, "{wal_set_rate::invalid rate!}\r\n");
5444         return HI_FAIL;
5445     }
5446 }
5447 
wal_hipriv_get_value(const hi_char * pc_param,hi_char * ac_arg,hi_u32 * off_set,hi_u32 first_elem_flag)5448 hi_u32 wal_hipriv_get_value(const hi_char *pc_param, hi_char *ac_arg, hi_u32 *off_set, hi_u32 first_elem_flag)
5449 {
5450     hi_u32 ret;
5451     hi_u32 check_offset = (first_elem_flag == 0) ? 0 : 1;
5452 
5453     if ((*(pc_param + check_offset)) == ' ') {
5454         oam_warning_log0(0, OAM_SF_ANY, "{wal_hipriv_get_value::cmd error}");
5455         return HI_FAIL;
5456     }
5457 
5458     ret = wal_get_cmd_one_arg(pc_param, ac_arg, WAL_HIPRIV_CMD_NAME_MAX_LEN, off_set);
5459     if (ret != HI_SUCCESS) {
5460         oam_warning_log1(0, OAM_SF_ANY, "{wal_hipriv_get_value::wal_get_cmd_one_arg return err_code[%u]}", ret);
5461         return ret;
5462     }
5463 
5464     return HI_SUCCESS;
5465 }
5466 
wal_hipriv_check_switch(const hi_char * ac_arg,const hi_char * pc_param,hi_bool is_tx)5467 hi_u32 wal_hipriv_check_switch(const hi_char *ac_arg, const hi_char *pc_param, hi_bool is_tx)
5468 {
5469     /* 如果是关闭常收,则直接关闭,无需解析后面的参数 */
5470     if (strcmp("0", ac_arg) == 0) {
5471         /* 判断命令长度是否有问题 */
5472         if (*pc_param != '\0') {
5473             oam_warning_log0(0, OAM_SF_ANY, "{wal_hipriv_check_switch::cmd len error}");
5474             return HI_FAIL;
5475         }
5476 
5477 #ifdef CUSTOM_AT_COMMAND
5478         hi_at_printf("OK\r\n");
5479 #endif
5480 #if _PRE_WLAN_FEATURE_MFG_TEST
5481         printk("OK\r\n");
5482 #endif
5483         return HI_SUCCESS;
5484     }
5485 
5486     /* 判断开关字符是否有问题,1:打开长发;2:tx_dc */
5487     if ((strcmp("1", ac_arg) != 0) && !(is_tx && (strcmp("2", ac_arg) == 0))) {
5488         oam_warning_log0(0, OAM_SF_ANY, "{wal_hipriv_check_switch::strcmp err_code}");
5489         return HI_FAIL;
5490     }
5491 
5492     return HI_CONTINUE;
5493 }
5494 
wal_hipriv_set_rate_or_mcs(oal_net_device_stru * netdev,hi_char * ac_arg,hi_s32 protocol_value)5495 hi_u32 wal_hipriv_set_rate_or_mcs(oal_net_device_stru *netdev, hi_char *ac_arg, hi_s32 protocol_value)
5496 {
5497     hi_u32 ret;
5498 
5499     if (protocol_value != WAL_PHY_MODE_11N) {
5500         ret = wal_set_rate(netdev, ac_arg, protocol_value);
5501         if (ret != HI_SUCCESS) {
5502             oam_error_log1(0, OAM_SF_ANY, "wal_hipriv_al_tx::set_rate return err_code [%d]}", ret);
5503             return ret;
5504         }
5505     } else {
5506         ret = wal_hipriv_set_mcs(netdev, ac_arg);
5507         if (ret != HI_SUCCESS) {
5508             oam_error_log1(0, OAM_SF_ANY, "wal_set_always_tx::set_mcs return err_code [%d]}", ret);
5509             return ret;
5510         }
5511     }
5512 
5513     return HI_SUCCESS;
5514 }
5515 
5516 /* ****************************************************************************
5517  功能描述      : 设置常收参数
5518 
5519  修改历史      :
5520   1.日    期   : 2019年5月5日
5521     作    者   : HiSilicon
5522     修改内容   : 新生成函数
5523 **************************************************************************** */
5524 /* 大数组g_ast_hipriv_cmd成员,其中一个成员wal_hipriv_getcountry对pc_param所指向的内容进行了修改,lint_t e818告警屏蔽 */
wal_hipriv_rx_proc(oal_net_device_stru * netdev,hi_char * pc_param)5525 hi_u32 wal_hipriv_rx_proc(oal_net_device_stru *netdev, hi_char *pc_param)
5526 {
5527     hi_u32  off_set = 0;
5528     hi_s32  protocol_value = 0;
5529     hi_char ac_arg[WAL_HIPRIV_CMD_NAME_MAX_LEN];
5530     hi_char *ac_arg_ptr = ac_arg;
5531     hi_u8   mac_filter_flag = 0;
5532     hi_u32  i;
5533 
5534     /* 低功耗状态下不允许执行 */
5535     if (is_under_ps()) {
5536         oam_warning_log0(0, 0, "under ps mode,can not exec cmd");
5537         return HI_FAIL;
5538     }
5539 #if (_PRE_OS_VERSION_LITEOS == _PRE_OS_VERSION)
5540     /* 产测每次常收前,都要关闭无线模式 */
5541     if (wal_stop_vap(netdev) != HI_SUCCESS) {
5542         oam_warning_log0(0, OAM_SF_ANY, "{wal_hipriv_rx_proc::stop vap fail.}");
5543         return HI_FAIL;
5544     }
5545 #endif
5546     /*  产测每次常收前,关常收 */
5547     hi_u32 ret = wal_hipriv_always_rx(netdev, 0, mac_filter_flag);
5548     if (ret != HI_SUCCESS) {
5549         return ret;
5550     }
5551 
5552 #if (_PRE_OS_VERSION_LINUX == _PRE_OS_VERSION)
5553     pc_param++;
5554 #endif
5555 
5556     for (i = 0; i < 5; i++) { /* 常收命令有5个参数 */
5557         ret = wal_hipriv_get_value(pc_param, ac_arg_ptr, &off_set, ((i == 0) ? 0 : 1));
5558         if (ret != HI_SUCCESS) {
5559             return ret;
5560         }
5561 
5562         pc_param += off_set;
5563 
5564         if (i == 0) { /* 0: 常收使能开关 */
5565             ret = wal_hipriv_check_switch(ac_arg_ptr, pc_param, HI_FALSE);
5566             if (ret != HI_CONTINUE) {
5567                 return ret;
5568             }
5569         } else if (i == 1) { /* 1: 设置协议类型 */
5570             ret = wal_set_protocol(netdev, ac_arg_ptr, strlen(ac_arg_ptr), &protocol_value);
5571         } else if (i == 2) {                                             /* 2: 设置带宽 */
5572             if ((protocol_value == 2) && (oal_atoi(ac_arg_ptr) != 20)) { /* 2:protocol_value 20:bw */
5573                 oam_error_log1(0, OAM_SF_ANY, "wal_hipriv_al_tx::set_bw return err_code [%d]}", ret);
5574                 return HI_FAIL;
5575             }
5576             ret = wal_hipriv_set_bw(netdev, ac_arg_ptr);
5577         } else if (i == 3) { /* 3: 设置信道频点 */
5578             ret = wal_ioctl_set_freq(netdev, ac_arg_ptr);
5579             /* 14信道仅支持11b模式 */
5580             if ((ret != HI_SUCCESS) || ((protocol_value != 2) && (oal_atoi(ac_arg_ptr) == 14))) { /* 2: 模式,14: 信道 */
5581                 return HI_FAIL;
5582             }
5583         } else if (i == 4) { /* 4: 获取MAC地址过滤开关 */
5584             if ((strcmp("0", ac_arg_ptr) != 0) && (strcmp("1", ac_arg_ptr) != 0)) {
5585                 oam_warning_log0(0, OAM_SF_ANY, "{wal_hipriv_al_rx::get mac filter flag Error}");
5586                 return HI_FAIL;
5587             }
5588 
5589             mac_filter_flag = (hi_u8)oal_atoi(ac_arg_ptr);
5590         }
5591 
5592         if (((i == 1) || (i == 2) || (i == 3)) && (ret != HI_SUCCESS)) { /* 参数1/2/3的异常分支 */
5593             oam_error_log2(0, OAM_SF_ANY, "wal_hipriv_al_rx::fun[i=%d] return err_code [%d]}", i, ret);
5594             return ret;
5595         }
5596     }
5597 
5598     /* 判断命令长度是否有问题 */
5599     if (*pc_param != '\0') {
5600         oam_warning_log0(0, OAM_SF_ANY, "{wal_hipriv_al_rx::cmd len error}");
5601         return HI_FAIL;
5602     }
5603 
5604     /* 打开常收 */
5605     ret = wal_hipriv_always_rx(netdev, 1, mac_filter_flag);
5606     if (ret != HI_SUCCESS) {
5607         return ret;
5608     }
5609 #if (_PRE_OS_VERSION_LITEOS == _PRE_OS_VERSION)
5610     if (wal_start_vap(netdev) != HI_SUCCESS) {
5611         oam_warning_log0(0, OAM_SF_ANY, "{wal_hipriv_al_rx::start vap fail.}");
5612         return HI_FAIL;
5613     }
5614 #endif
5615     return HI_SUCCESS;
5616 }
5617 
5618 /* ****************************************************************************
5619  功能描述      : 设置常发参数
5620 
5621  修改历史      :
5622   1.日    期   : 2019年5月5日
5623     作    者   : HiSilicon
5624     修改内容   : 新生成函数
5625 **************************************************************************** */
5626 /* 大数组g_ast_hipriv_cmd成员,其中一个成员wal_hipriv_getcountry对pc_param所指向的内容进行了修改,lint_t e818告警屏蔽 */
wal_hipriv_tx_proc(oal_net_device_stru * netdev,hi_char * pc_param)5627 hi_u32 wal_hipriv_tx_proc(oal_net_device_stru *netdev, hi_char *pc_param)
5628 {
5629     hi_u32  off_set = 0;
5630     hi_s32  protocol_value = 0;
5631     hi_char ac_arg[WAL_HIPRIV_CMD_NAME_MAX_LEN];
5632     hi_char *ac_arg_ptr = ac_arg;
5633     hi_u8   tx_flag = 0;
5634     hi_u32  i;
5635 
5636     /* 低功耗状态下不允许执行 */
5637     if (is_under_ps()) {
5638         oam_warning_log0(0, 0, "under ps mode,can not exec cmd");
5639         return HI_FAIL;
5640     }
5641 #if (_PRE_OS_VERSION_LITEOS == _PRE_OS_VERSION)
5642     /* 产测每次常发前,都要关闭无线模式 */
5643     if (wal_stop_vap(netdev) != HI_SUCCESS) {
5644         oam_warning_log0(0, OAM_SF_ANY, "{wal_hipriv_tx_proc::stop vap fail.}");
5645         return HI_FAIL;
5646     }
5647 #endif
5648     /* 产测每次常发前,关常发 */
5649     hi_u32 ret = wal_hipriv_always_tx(netdev, 0);
5650     if (ret != HI_SUCCESS) {
5651         return ret;
5652     }
5653 
5654 #if (_PRE_OS_VERSION_LINUX == _PRE_OS_VERSION)
5655     pc_param++;
5656 #endif
5657 
5658     for (i = 0; i < 5; i++) { /* 常发命令有5个参数 */
5659         if (wal_hipriv_get_value(pc_param, ac_arg_ptr, &off_set, ((i == 0) ? 0 : 1)) != HI_SUCCESS) {
5660             return HI_FAIL;
5661         }
5662 
5663         pc_param += off_set;
5664 
5665         if (i == 0) { /* 0: 常发使能开关 */
5666             ret = wal_hipriv_check_switch(ac_arg_ptr, pc_param, HI_TRUE);
5667             if (ret != HI_CONTINUE) {
5668                 return ret;
5669             }
5670 
5671             tx_flag = (hi_u8)oal_atoi(ac_arg_ptr);
5672             /* AT命令参数映射 */
5673             tx_flag = (tx_flag == 2) ? WAL_ALWAYS_TX_DC : tx_flag; /* 2:AT命令参数,表示tx_dc */
5674         } else if (i == 1) {                                       /* 1: 设置协议类型 */
5675             if (wal_set_protocol(netdev, ac_arg_ptr, strlen(ac_arg_ptr), &protocol_value) != HI_SUCCESS) {
5676                 return HI_FAIL;
5677             }
5678         } else if (i == 2) { /* 2: 设置带宽 */
5679             ret = wal_hipriv_set_bw(netdev, ac_arg_ptr);
5680             if ((ret != HI_SUCCESS) || ((protocol_value == 2) && (oal_atoi(ac_arg_ptr) != 20))) { /* 2:protocol 20:bw */
5681                 oam_error_log1(0, OAM_SF_ANY, "wal_hipriv_al_tx::set_bw return err_code [%d]}", ret);
5682                 return (ret != HI_SUCCESS) ? ret : HI_FAIL;
5683             }
5684         } else if (i == 3) { /* 3: 设置信道频点 */
5685             ret = wal_ioctl_set_freq(netdev, ac_arg_ptr);
5686             /* 14信道仅支持11b模式 */
5687             if ((ret != HI_SUCCESS) || ((protocol_value != 2) && (oal_atoi(ac_arg_ptr) == 14))) { /* 2:模式,14: 信道 */
5688                 return HI_FAIL;
5689             }
5690         } else if (i == 4) { /* 4: 设置速率MCS */
5691             if (wal_hipriv_set_rate_or_mcs(netdev, ac_arg_ptr, protocol_value) != HI_SUCCESS) {
5692                 return HI_FAIL;
5693             }
5694         }
5695     }
5696 
5697     /* 判断命令长度是否有问题 */
5698     if (*pc_param != '\0') {
5699         oam_warning_log0(0, OAM_SF_ANY, "{wal_hipriv_al_tx::cmd len error}");
5700         return HI_FAIL;
5701     }
5702 
5703     /* 打开常发 */
5704     ret = wal_hipriv_always_tx(netdev, tx_flag);
5705     if (ret != HI_SUCCESS) {
5706         return ret;
5707     }
5708 #if (_PRE_OS_VERSION_LITEOS == _PRE_OS_VERSION)
5709     if (wal_start_vap(netdev) != HI_SUCCESS) {
5710         oam_warning_log0(0, OAM_SF_ANY, "{wal_hipriv_al_tx::start vap fail.}");
5711         return HI_FAIL;
5712     }
5713 #endif
5714     return HI_SUCCESS;
5715 }
5716 
5717 #ifdef _PRE_WLAN_FEATURE_BTCOEX
5718 #ifdef _PRE_WLAN_FEATURE_HIPRIV
5719 /* ****************************************************************************
5720  功能描述      : 设置BT共存使能
5721  修改历史      :
5722   1.日    期   : 2019年5月5日
5723     作    者   : HiSilicon
5724     修改内容   : 新生成函数
5725 **************************************************************************** */
5726 /* 大数组g_ast_hipriv_cmd的成员,其中wal_hipriv_getcountry修改了对应变量,lint_t e818告警屏蔽 */
wal_hipriv_btcoex_enable(oal_net_device_stru * netdev,hi_char * pc_param)5727 static hi_u32 wal_hipriv_btcoex_enable(oal_net_device_stru *netdev, hi_char *pc_param)
5728 {
5729     wal_msg_write_stru          write_msg;
5730     hi_u32                      ret, off_set;
5731     hi_u16                      us_len;
5732     hi_char                     ac_name[WAL_HIPRIV_CMD_NAME_MAX_LEN] = {0};
5733     hi_u8                       btcoex_enable, mode, share_ant;
5734 
5735     ret = wal_get_cmd_one_arg(pc_param, ac_name, WAL_HIPRIV_CMD_NAME_MAX_LEN, &off_set);
5736     if (ret != HI_SUCCESS) {
5737         oam_warning_log1(0, OAM_SF_COEX, "{wal_hipriv_btcoex_enable::wal_get_cmd_one_arg return err_code[%u]}", ret);
5738         return ret;
5739     }
5740     pc_param += off_set;
5741     btcoex_enable = (hi_u8)oal_atoi(ac_name);
5742     if (btcoex_enable == 0) {
5743         *(hi_u8 *)(write_msg.auc_value) = btcoex_enable;
5744         us_len = sizeof(hi_u8);
5745     } else if (btcoex_enable == 1) {
5746         ret = wal_get_cmd_one_arg(pc_param, ac_name, WAL_HIPRIV_CMD_NAME_MAX_LEN, &off_set);
5747         if (ret != HI_SUCCESS) {
5748             oam_warning_log1(0, OAM_SF_COEX, "{wal_hipriv_btcoex_enable::wal_get_cmd_one_arg return errCode[%u]}", ret);
5749             return ret;
5750         }
5751         pc_param += off_set;
5752         mode = (hi_u8)oal_atoi(ac_name);
5753 
5754         ret = wal_get_cmd_one_arg(pc_param, ac_name, WAL_HIPRIV_CMD_NAME_MAX_LEN, &off_set);
5755         if (ret != HI_SUCCESS) {
5756             oam_warning_log1(0, OAM_SF_COEX, "{wal_hipriv_btcoex_enable::wal_get_cmd_one_arg return errCode[%u]}", ret);
5757             return ret;
5758         }
5759         share_ant = (hi_u8)oal_atoi(ac_name);
5760 
5761         write_msg.auc_value[0] = btcoex_enable;
5762         write_msg.auc_value[1] = mode;
5763         write_msg.auc_value[2] = share_ant; /* 2: 第3位 */
5764         us_len = sizeof(hi_u8) * 3;         /* 个数为3 */
5765     } else {
5766         oam_warning_log0(0, OAM_SF_COEX, "{wal_hipriv_btcoex_enable::input parameter error!}\r\n");
5767         return HI_SUCCESS;
5768     }
5769 
5770     /* **************************************************************************
5771                               抛事件到wal层处理
5772     ************************************************************************** */
5773     wal_write_msg_hdr_init(&write_msg, WLAN_CFGID_BTCOEX_ENABLE, us_len);
5774     ret = wal_send_cfg_event(netdev, WAL_MSG_TYPE_WRITE, WAL_MSG_WRITE_MSG_HDR_LENGTH + us_len, (hi_u8 *)&write_msg,
5775         HI_FALSE, HI_NULL);
5776     if (oal_unlikely(ret != HI_SUCCESS)) {
5777         oam_warning_log1(0, OAM_SF_COEX, "{wal_hipriv_btcoex_enable::return err code [%u]!}\r\n", ret);
5778         return ret;
5779     }
5780     return HI_SUCCESS;
5781 }
5782 #endif /* _PRE_WLAN_FEATURE_BTCOEX */
5783 #endif
5784 
5785 #ifdef _PRE_DEBUG_MODE
5786 #ifdef _PRE_WLAN_FEATURE_HIPRIV
5787 
wal_hipriv_add_vap_get_mode(wal_hipriv_two_param_stru * cmd_param,wlan_vap_mode_enum_uint8 * mode,wlan_p2p_mode_enum_uint8 * p2p_mode)5788 hi_u32 wal_hipriv_add_vap_get_mode(wal_hipriv_two_param_stru *cmd_param, wlan_vap_mode_enum_uint8 *mode,
5789     wlan_p2p_mode_enum_uint8 *p2p_mode)
5790 {
5791     if (strcmp("ap", cmd_param->cmd_param2) == 0) {
5792         *mode = WLAN_VAP_MODE_BSS_AP;
5793     } else if (strcmp("sta", cmd_param->cmd_param2) == 0) {
5794         *mode = WLAN_VAP_MODE_BSS_STA;
5795 #ifdef _PRE_WLAN_FEATURE_MESH
5796     } else if ((strcmp("mesh", cmd_param->cmd_param2)) == 0) {
5797         *mode = WLAN_VAP_MODE_MESH;
5798 #endif
5799 #ifdef _PRE_WLAN_FEATURE_P2P
5800         /* 创建P2P 相关VAP */
5801     } else if (0 == (strcmp("p2p_device", cmd_param->cmd_param2))) {
5802         *mode = WLAN_VAP_MODE_BSS_STA;
5803         *p2p_mode = WLAN_P2P_DEV_MODE;
5804     } else if (0 == (strcmp("p2p_cl", cmd_param->cmd_param2))) {
5805         *mode = WLAN_VAP_MODE_BSS_STA;
5806         *p2p_mode = WLAN_P2P_CL_MODE;
5807     } else if (0 == (strcmp("p2p_go", cmd_param->cmd_param2))) {
5808         *mode = WLAN_VAP_MODE_BSS_AP;
5809         *p2p_mode = WLAN_P2P_GO_MODE;
5810 #endif /* _PRE_WLAN_FEATURE_P2P */
5811     } else {
5812         oam_warning_log0(0, OAM_SF_ANY, "{wal_hipriv_add_vap::the mode param is invalid!}");
5813         return HI_ERR_CODE_INVALID_CONFIG;
5814     }
5815 
5816     return HI_SUCCESS;
5817 }
5818 
wal_hipriv_add_vap_wireless_dev_set(oal_net_device_stru * netdev_tmp,mac_device_stru * mac_dev,oal_wireless_dev * wdev,wlan_vap_mode_enum_uint8 mode,wlan_p2p_mode_enum_uint8 p2p_mode)5819 hi_u32 wal_hipriv_add_vap_wireless_dev_set(oal_net_device_stru *netdev_tmp, mac_device_stru *mac_dev,
5820     oal_wireless_dev *wdev, wlan_vap_mode_enum_uint8 mode, wlan_p2p_mode_enum_uint8 p2p_mode)
5821 {
5822     /* 对netdevice进行赋值 */
5823 #if (_PRE_OS_VERSION_LINUX == _PRE_OS_VERSION)
5824     netdev_tmp->wireless_handlers             = wal_get_g_iw_handler_def();
5825 #endif
5826     netdev_tmp->netdev_ops                    = wal_get_net_dev_ops();
5827 
5828     oal_netdevice_destructor(netdev_tmp)      = oal_net_free_netdev;
5829     oal_netdevice_ifalias(netdev_tmp)         = HI_NULL;
5830     oal_netdevice_watchdog_timeo(netdev_tmp)  = 5; /* 固定设置为 5 */
5831     oal_netdevice_wdev(netdev_tmp)            = wdev;
5832     oal_netdevice_qdisc(netdev_tmp, HI_NULL);
5833 
5834     wdev->netdev = netdev_tmp;
5835 
5836     if (mode == WLAN_VAP_MODE_BSS_AP) {
5837         wdev->iftype = NL80211_IFTYPE_AP;
5838     } else if (mode == WLAN_VAP_MODE_BSS_STA) {
5839         wdev->iftype = NL80211_IFTYPE_STATION;
5840     }
5841 #ifdef _PRE_WLAN_FEATURE_MESH
5842     if (mode == WLAN_VAP_MODE_MESH) {
5843         wdev->iftype = NL80211_IFTYPE_MESH_POINT;
5844     }
5845 #endif
5846 #ifdef _PRE_WLAN_FEATURE_P2P
5847     if (p2p_mode == WLAN_P2P_DEV_MODE) {
5848         wdev->iftype = NL80211_IFTYPE_P2P_DEVICE;
5849     } else if (p2p_mode == WLAN_P2P_CL_MODE) {
5850         wdev->iftype = NL80211_IFTYPE_P2P_CLIENT;
5851     } else if (p2p_mode == WLAN_P2P_GO_MODE) {
5852         wdev->iftype = NL80211_IFTYPE_P2P_GO;
5853     }
5854 #endif /* _PRE_WLAN_FEATURE_P2P */
5855 
5856     wdev->wiphy = mac_dev->wiphy;
5857 
5858     oal_netdevice_flags(netdev_tmp) &= ~OAL_IFF_RUNNING; /* 将net device的flag设为down */
5859     if (wal_get_dev_addr(netdev_tmp->dev_addr, ETH_ADDR_LEN, wdev->iftype) != HI_SUCCESS) {
5860         oam_warning_log0(0, OAM_SF_ANY, "{wal_hipriv_add_vap::wal_get_dev_addr failed!}");
5861         oal_net_free_netdev(netdev_tmp);
5862         return HI_FAIL;
5863     }
5864 
5865     /* 注册net_device */
5866     hi_u32 ret = (hi_u32)oal_net_register_netdev(netdev_tmp);
5867     if (oal_unlikely(ret != HI_SUCCESS)) {
5868         oam_warning_log1(0, OAM_SF_ANY, "{wal_hipriv_add_vap::oal_net_register_netdev return error code %d!}\r\n", ret);
5869         oal_net_free_netdev(netdev_tmp);
5870         return ret;
5871     }
5872 
5873     return HI_SUCCESS;
5874 }
5875 
5876 /* ****************************************************************************
5877  功能描述  : 私有命令,创建VAP
5878 **************************************************************************** */
wal_hipriv_add_vap(oal_net_device_stru * netdev,hi_char * pc_param)5879 static hi_u32 wal_hipriv_add_vap(oal_net_device_stru *netdev, hi_char *pc_param)
5880 {
5881     wal_hipriv_two_param_stru cmd_param;
5882     wlan_vap_mode_enum_uint8  mode;
5883     wlan_p2p_mode_enum_uint8  p2p_mode = WLAN_LEGACY_VAP_MODE;
5884 
5885     hi_unref_param(p2p_mode);
5886 
5887     hi_u32 ret = wal_hipriv_two_param_parse(pc_param, &cmd_param);
5888     if (ret != HI_SUCCESS) {
5889         oam_warning_log0(0, OAM_SF_ANY, "{wal_hipriv_add_vap::parse cmd param failed!}");
5890         return ret;
5891     }
5892 
5893     hi_char *cmd_param1_ptr = cmd_param.cmd_param1;
5894     /* 第一个参数为vap_name length不应超过OAL_IF_NAME_SIZE */
5895     if (strlen(cmd_param.cmd_param1) >= OAL_IF_NAME_SIZE) {
5896         oam_warning_log1(0, OAM_SF_ANY, "{wal_hipriv_add_vap:vap name len[%d]over flow}", strlen(cmd_param.cmd_param1));
5897         return HI_FAIL;
5898     }
5899 
5900     ret = wal_hipriv_add_vap_get_mode(&cmd_param, &mode, &p2p_mode);
5901     if (ret != HI_SUCCESS) {
5902         return ret;
5903     }
5904 
5905     /* 如果创建的net device已经存在,直接返回 */
5906     oal_net_device_stru *netdev_tmp = oal_get_netdev_by_name(cmd_param1_ptr);
5907     if (netdev_tmp != HI_NULL) {
5908         /* 调用oal_dev_get_by_name后,必须调用oal_dev_put使net_dev的引用计数减一 */
5909         oal_dev_put(netdev_tmp);
5910         oam_warning_log0(0, OAM_SF_ANY, "{wal_hipriv_add_vap::the net_device is already exist!}");
5911         return HI_ERR_CODE_PTR_NULL;
5912     }
5913 
5914     mac_device_stru *mac_dev = mac_res_get_dev();
5915 #if defined(_PRE_WLAN_FEATURE_FLOWCTL)
5916     netdev_tmp = oal_net_alloc_netdev_mqs(cmd_param1_ptr);
5917 #elif defined(_PRE_WLAN_FEATURE_OFFLOAD_FLOWCTL)
5918     netdev_tmp = oal_net_alloc_netdev_mqs(cmd_param1_ptr);
5919 #else
5920     netdev_tmp = oal_net_alloc_netdev(cmd_param1_ptr, OAL_IF_NAME_SIZE);
5921 #endif
5922     if (oal_unlikely(netdev_tmp == HI_NULL)) {
5923         oam_warning_log0(0, OAM_SF_ANY, "{wal_hipriv_add_vap::pst_net_dev null ptr error!}");
5924         return HI_ERR_CODE_PTR_NULL;
5925     }
5926 
5927     oal_wireless_dev *wdev = (oal_wireless_dev *)oal_mem_alloc(OAL_MEM_POOL_ID_LOCAL, sizeof(oal_wireless_dev));
5928     if (oal_unlikely(wdev == HI_NULL)) {
5929         oam_error_log0(0, OAM_SF_ANY, "{wal_hipriv_add_vap::alloc mem, pst_wdev is null ptr!}");
5930         oal_net_free_netdev(netdev_tmp);
5931         return HI_ERR_CODE_PTR_NULL;
5932     }
5933     /* 安全编程规则6.6例外(3)从堆中分配内存后,赋予初值 */
5934     memset_s(wdev, sizeof(oal_wireless_dev), 0, sizeof(oal_wireless_dev));
5935 
5936     ret = wal_hipriv_add_vap_wireless_dev_set(netdev_tmp, mac_dev, wdev, mode, p2p_mode);
5937     return ret;
5938 }
5939 
5940 /* ****************************************************************************
5941  功能描述  : 设置添加用户的配置命令
5942 **************************************************************************** */
wal_hipriv_add_user(oal_net_device_stru * netdev,hi_char * pc_param)5943 static hi_u32 wal_hipriv_add_user(oal_net_device_stru *netdev, hi_char *pc_param)
5944 {
5945     wal_msg_write_stru          write_msg;
5946     hi_u32                      ret;
5947     mac_cfg_add_user_param_stru add_user_param_info;  /* 临时保存获取的use的信息 */
5948     wal_hipriv_two_param_stru   cmd_param;
5949     hi_char*                    cmd_param1_ptr = HI_NULL;
5950 
5951     /* 设置添加用户的配置命令: hipriv vap0 add_user xx xx xx xx xx xx(mac地址) 0 | 1(HT能力位) */
5952     /* 获取配置命令参数 */
5953     ret = wal_hipriv_two_param_parse(pc_param, &cmd_param);
5954     if (ret != HI_SUCCESS) {
5955         oam_warning_log0(0, OAM_SF_ANY, "{wal_hipriv_add_user::parse cmd param failed!}");
5956         return ret;
5957     }
5958     cmd_param1_ptr = cmd_param.cmd_param1;
5959     /* 获取用户MAC地址 */
5960     oal_strtoaddr(cmd_param1_ptr, add_user_param_info.auc_mac_addr, WLAN_MAC_ADDR_LEN);
5961     /* 获取用户的HT标识 */
5962     /* 针对解析出的不同命令,对user的HT字段进行不同的设置 非0即为1 */
5963     if (0 == (strcmp("0", cmd_param.cmd_param2))) {
5964         add_user_param_info.ht_cap = 0;
5965     } else {
5966         add_user_param_info.ht_cap = 1;
5967     }
5968     /* **************************************************************************
5969                                 抛事件到wal层处理
5970     ************************************************************************** */
5971     wal_write_msg_hdr_init(&write_msg, WLAN_CFGID_ADD_USER, sizeof(mac_cfg_add_user_param_stru));
5972     /* 设置配置命令参数 */
5973     if (memcpy_s(write_msg.auc_value, sizeof(mac_cfg_add_user_param_stru), &add_user_param_info,
5974         sizeof(mac_cfg_add_user_param_stru)) != EOK) {
5975         oam_warning_log0(0, OAM_SF_ANY, "{wal_hipriv_add_user::memcpy_s event param failed!}");
5976         return HI_FAIL;
5977     }
5978     ret = wal_send_cfg_event(netdev, WAL_MSG_TYPE_WRITE,
5979         WAL_MSG_WRITE_MSG_HDR_LENGTH + sizeof(mac_cfg_add_user_param_stru), (hi_u8 *)&write_msg, HI_FALSE, HI_NULL);
5980     if (oal_unlikely(ret != HI_SUCCESS)) {
5981         oam_warning_log1(0, OAM_SF_ANY, "{wal_hipriv_add_user::return err code[%u]!}", ret);
5982     }
5983     return ret;
5984 }
5985 
5986 /* ****************************************************************************
5987  功能描述  : 打印共存维测信息
5988 **************************************************************************** */
wal_hipriv_btcoex_status_print(oal_net_device_stru * netdev,hi_char * pc_param)5989 static hi_u32 wal_hipriv_btcoex_status_print(oal_net_device_stru *netdev, hi_char *pc_param)
5990 {
5991     hi_u32                       ret;
5992     wal_msg_write_stru           write_msg;
5993 
5994     hi_unref_param(pc_param);
5995     /* hipriv vap_name coex_print */
5996     if (memset_s((hi_u8 *)&write_msg, sizeof(write_msg), 0, sizeof(write_msg)) != EOK) {
5997         return HI_FAIL;
5998     }
5999     /* **************************************************************************
6000                                 抛事件到wal层处理
6001     ************************************************************************** */
6002     wal_write_msg_hdr_init(&write_msg, WLAN_CFGID_BTCOEX_INFO, sizeof(hi_s32));
6003     ret = wal_send_cfg_event(netdev, WAL_MSG_TYPE_WRITE, WAL_MSG_WRITE_MSG_HDR_LENGTH + sizeof(hi_s32),
6004         (hi_u8 *)&write_msg, HI_FALSE, HI_NULL);
6005     if (oal_unlikely(ret != HI_SUCCESS)) {
6006         oam_warning_log1(0, OAM_SF_TXOP, "{wal_hipriv_btcoex_status_print::return err code[%u]!}", ret);
6007     }
6008     return ret;
6009 }
6010 
6011 /* ****************************************************************************
6012  功能描述  : 获取device和每一个tid下当前mpdu数目
6013 **************************************************************************** */
wal_hipriv_get_mpdu_num(oal_net_device_stru * netdev,hi_char * pc_param)6014 static hi_u32 wal_hipriv_get_mpdu_num(oal_net_device_stru *netdev, hi_char *pc_param)
6015 {
6016     wal_msg_write_stru          write_msg;
6017     hi_u32                      off_set;
6018     hi_u32                      ret;
6019 
6020     /* sh hipriv.sh "vap_name mpdu_num user_macaddr" */
6021     /* **************************************************************************
6022                                 抛事件到wal层处理
6023     ************************************************************************** */
6024     wal_write_msg_hdr_init(&write_msg, WLAN_CFGID_GET_MPDU_NUM, sizeof(param));
6025     /* 获取用户mac地址 */
6026     ret = wal_hipriv_get_mac_addr(pc_param, write_msg.auc_value, WLAN_MAC_ADDR_LEN, &off_set);
6027     if (ret != HI_SUCCESS) {
6028         return ret;
6029     }
6030     ret = wal_send_cfg_event(netdev, WAL_MSG_TYPE_WRITE,
6031         WAL_MSG_WRITE_MSG_HDR_LENGTH + sizeof(mac_cfg_get_mpdu_num_stru), (hi_u8 *)&write_msg, HI_FALSE, HI_NULL);
6032     if (oal_unlikely(ret != HI_SUCCESS)) {
6033         oam_warning_log1(0, OAM_SF_ANY, "{wal_hipriv_get_mpdu_num::return err code[%u]!}", ret);
6034     }
6035     return ret;
6036 }
6037 #endif
6038 #endif /* #ifdef _PRE_DEBUG_MODE */
6039 
6040 #if defined(_PRE_WLAN_FEATURE_HIPRIV) && defined(_PRE_WLAN_FEATURE_INTRF_MODE)
wal_hipriv_set_intrf_mode(oal_net_device_stru * netdev,hi_char * pc_param)6041 static hi_u32 wal_hipriv_set_intrf_mode(oal_net_device_stru *netdev, hi_char *pc_param)
6042 {
6043     wal_msg_write_stru                      write_msg;
6044     hi_u32                                  off_set;
6045     hi_char                                 ac_name[WAL_HIPRIV_CMD_NAME_MAX_LEN] = {'\0'};
6046 
6047     /* 解析参数 */
6048     hi_u32 ret = wal_get_cmd_one_arg(pc_param, ac_name, WAL_HIPRIV_CMD_NAME_MAX_LEN, &off_set);
6049     if (ret != HI_SUCCESS) {
6050         oam_warning_log1(0, OAM_SF_ANY, "{wal_hipriv_set_intrf_mode::wal_get_cmd_one_arg return err_code [%u]!}", ret);
6051         return ret;
6052     }
6053 
6054     hi_s32 mode = oal_atoi(ac_name);
6055     if ((mode != 0) && (mode != 1)) {
6056         oam_error_log1(0, 0, "wal_hipriv_set_intrf_mode:: invalid mode [%d]", mode);
6057         return HI_FAIL;
6058     }
6059     hi_bool *param = (hi_bool *)write_msg.auc_value;
6060     *param = (mode == 1);
6061 
6062     /* **************************************************************************
6063                              抛事件到wal层处理
6064     ************************************************************************** */
6065     wal_write_msg_hdr_init(&write_msg, WLAN_CFGID_INTRF_MODE_ON, sizeof(hi_bool));
6066 
6067     ret = wal_send_cfg_event(netdev, WAL_MSG_TYPE_WRITE, WAL_MSG_WRITE_MSG_HDR_LENGTH + sizeof(hi_bool),
6068         (hi_u8 *)&write_msg, HI_FALSE, HI_NULL);
6069     if (oal_unlikely(ret != HI_SUCCESS)) {
6070         oam_warning_log1(0, OAM_SF_ANY, "{wal_hipriv_set_intrf_mode::return err code [%u]!}\r\n", ret);
6071         return ret;
6072     }
6073 
6074     return HI_SUCCESS;
6075 }
6076 #endif
6077 
wal_hipriv_get_tx_params(oal_net_device_stru * netdev,hi_char * pc_param)6078 static hi_u32 wal_hipriv_get_tx_params(oal_net_device_stru *netdev, hi_char *pc_param)
6079 {
6080     hi_unref_param(netdev);
6081     hi_unref_param(pc_param);
6082 
6083     hi_wifi_get_tx_params("wlan0", strlen("wlan0"));
6084     return HI_ERR_SUCCESS;
6085 }
6086 
wal_hipriv_set_dev_soft_reset(oal_net_device_stru * netdev,hi_char * pc_param)6087 static hi_u32 wal_hipriv_set_dev_soft_reset(oal_net_device_stru *netdev, hi_char *pc_param)
6088 {
6089     hi_unref_param(netdev);
6090     hi_unref_param(pc_param);
6091 
6092     hi_s32 ret = hi_wifi_soft_reset_device();
6093     if (ret != HI_SUCCESS) {
6094         oam_warning_log1(0, 0, "wal_hipriv_set_dev_soft_reset fail ret[%d]", ret);
6095         return HI_FAIL;
6096     }
6097     return HI_ERR_SUCCESS;
6098 }
6099 
6100 #if defined(_PRE_WLAN_FEATURE_HIPRIV) || defined(_PRE_DEBUG_MODE) || defined(_PRE_WLAN_FEATURE_SIGMA)
6101 /* hipriv命令统一格式:  hipriv [vap_name] [cmd_name] [param1] [...] */
6102 static const wal_hipriv_cmd_entry_stru  g_ast_hipriv_cmd[] = {
6103 #if defined(_PRE_WLAN_FEATURE_HIPRIV) || defined(_PRE_WLAN_FEATURE_SIGMA)
6104     {"ampdu_tx_on",     wal_hipriv_ampdu_tx_on},    /* 开关ampdu: ampdu_tx_on [0\1] */
6105     {"freq",            wal_ioctl_set_freq},        /* 设置AP 信道 */
6106     {"uapsd_en_cap",    wal_hipriv_set_uapsd_cap},  /* 开关uapsd: uapsd_en_cap [0\1] */
6107     {"frag_threshold",  wal_hipriv_frag_threshold}, /* 设置分片门限: frag_threshold [len] */
6108     {"setcountry",      wal_hipriv_setcountry},     /* 设置国家码: setcountry [cn_code] */
6109     {"set_netdev_state", wal_hipriv_set_vap_state}, /* 设置驱动netdev状态 [0\1] */
6110 #endif
6111 #ifdef _PRE_WLAN_FEATURE_HIPRIV
6112     {"info",            wal_hipriv_vap_info},       /* 打印vap的所有参数信息: info */
6113     {"set_tx_dscr",     wal_hipriv_set_tx_dscr_param},  /* 设置描述符信息: set_tx_dscr [type] [param_name] [value] */
6114     {"ampdu_start",     wal_hipriv_ampdu_start},    /* 开启AMPDU: ampdu_start [mac地址] [tidno] */
6115     {"ampdu_amsdu",     wal_hipriv_ampdu_amsdu_switch}, /* 开关amsdu ampdu联合聚合: ampdu_amsdu [0|1] */
6116     {"delba_req",       wal_hipriv_delba_req},      /* 删除BA会话: delba_req [mac地址] [tidno] [direction] */
6117     {"userinfo",        wal_hipriv_user_info},      /* 打印user信息: userinfo [user_mac_addr] */
6118     {"bw",              wal_hipriv_set_bw},         /* 设置带宽: bw [value] */
6119     {"regwrite",        wal_hipriv_reg_write},      /* 写寄存器: regwrite [32/16] [addr] [val]" addr val都是16进制 */
6120     {"mode",            wal_ioctl_set_mode},        /* 设置AP 协议模式: mode [mode_type] */
6121     {"set_mib",         wal_hipriv_set_mib},        /* 设置VAP mib值 */
6122     {"get_mib",         wal_hipriv_get_mib},        /* 获取VAP mib值 */
6123     {"rx_info",         wal_hipriv_rx_fcs_info},    /* 打印接收帧的FCS正确与错误信息: rx_info */
6124     {"al_rx",           wal_hipriv_rx_proc},          /* 设置常收模式: al_rx enable [mode] [bw] [freq] */
6125     {"al_tx",           wal_hipriv_tx_proc},          /* 设置常收模式: al_tx enable [mode] [bw] [freq] [rate] */
6126     {"alg_cfg",         wal_hipriv_alg_cfg},           /* 算法参数配置: hipriv "vap0 alg_cfg sch_vi_limit 10" */
6127 #ifdef _PRE_WLAN_FEATURE_MFG_TEST
6128     {"set_cal_bpwr",    wal_hipriv_set_cal_band_power},         /* 对各band做平均功率补偿 */
6129     {"set_cal_rpwr",    wal_hipriv_set_cal_rate_power},         /* 对各速率做功率补偿 */
6130     {"set_cal_freq",    wal_hipriv_set_cal_freq_power},         /* 设置频偏补偿 */
6131     {"w_cal_data",      wal_hipriv_set_dataefuse},              /* 将校准值写入efuse */
6132     {"get_caldata_info",   wal_hipriv_get_cal_data},            /* 读取校准数据 */
6133     {"set_efuse_mac",   wal_hipriv_set_customer_mac},           /* 设置mac地址 */
6134     {"get_efuse_mac",   wal_hipriv_get_customer_mac},           /* 查询mac地址 */
6135     {"set_rate_pwr",    wal_hipriv_set_rate_power},             /* 对各速率做功率调试 */
6136 #endif
6137     {"set_tx_pwr_offset",  hi_hipriv_set_tx_pwr_offset},        /* 设置功率偏移 */
6138     {"set_retry_limit", wal_hipriv_set_retry_limit},            /* 设置重传配置 */
6139     {"kick_user",       wal_hipriv_kick_user},      /* 删除用户: kick_user [user_mac_addr] */
6140     {"list_channel",    wal_hipriv_list_channel},   /* 查询支持信道列表 list_channel */
6141     {"wmm_switch",      wal_hipriv_wmm_switch},     /* 动态开启或者关闭wmm: wmm_switch [0|1] */
6142     {"send_bar",        wal_hipriv_send_bar},       /* 发送bar: send_bar [mac_addr)] [tid_num]" */
6143     {"getcountry",      wal_hipriv_getcountry},     /* 查询国家码: getcountry */
6144 #ifdef _PRE_DEBUG_MODE
6145     {"print_config",    wal_print_init_params},
6146 #endif
6147     {"ampdu_aggr_num",  wal_hipriv_set_ampdu_aggr_num}, /* 设置AMPDU聚合个数: ampdu_aggr_num [0|1] [num] */
6148     {"random_mac_scan", wal_hipriv_set_random_mac_addr_scan},   /* 随机mac扫描开关 random_mac_addr_scan [0|1] */
6149 #ifdef _PRE_WLAN_RF_110X_CALI_DPD
6150     {"start_dpd",       wal_hipriv_start_dpd},      /* Start DPD Calibration */
6151 #endif
6152 #if (_PRE_MULTI_CORE_MODE_OFFLOAD_DMAC == _PRE_MULTI_CORE_MODE)
6153     {"report_vap_info", wal_hipriv_report_vap_info}, /* 上报 vap的信息: report_vap_info [flag] */
6154     {"reginfo",         wal_hipriv_reg_info},       /* 读寄存器: reginfo [16|32] [startaddr] [endaddr] */
6155 #endif
6156 #ifdef _PRE_WLAN_FEATURE_WOW
6157     {"wow_sleep",       wal_hipriv_host_sleep_switch},  /* 配置host睡眠开关: host_sleep [0|1] */
6158     {"wow_event",       wal_hipriv_set_wow},            /* wow事件配置: wow_event_set [value] */
6159     {"wow_pattern",     wal_hipriv_set_wow_pattern},    /* 设置wow模式: wow_pattern [clr|add|del] [index] */
6160 #endif
6161 #ifdef _PRE_WLAN_FEATURE_PROMIS
6162     {"set_monitor",     wal_hipriv_set_monitor_switch}, /* 开关monitor模式:  set_monitor [0|1|2|3|4] */
6163 #endif
6164     {"set_device_rst",  wal_hipriv_set_dev_soft_reset}, /* 使能device侧软复位 */
6165 #endif
6166 #if defined(_PRE_WLAN_FEATURE_STA_PM) || defined(_PRE_WLAN_FEATURE_SIGMA) || defined(_PRE_WLAN_FEATURE_HIPRIV)
6167     {"set_uapsd_para",  wal_hipriv_set_uapsd_para},     /* 设置uapsd的参数信息: set_uapsd_para 3 1 1 1 1 */
6168     {"set_ps_mode",     wal_hipriv_sta_ps_mode},        /* 设置PSPOLL能力: set_ps_mode [3] [0] */
6169     {"set_sta_pm_on",   wal_hipriv_set_pm_switch},      /* 开启低功耗: set_sta_pm_on xx xx xx xx */
6170     {"set_wlan_pf_pm_enable",   wal_hipriv_set_wlan_pm_enable},  /* 设置device platform 睡眠使能 [1] [0] */
6171     {"set_host_sleep_status",   wal_hipriv_set_host_sleep_status},  /* 设置host睡眠状态 [1] [0] */
6172     {"set_wk_fail_process_pid",  wal_hipriv_setwk_fail_process},  /* 设置处理唤醒device失败时的任务ID */
6173     {"get_pm_info",  wal_hipriv_dump_pm_info},  /* 获取pm info, 1: host, 0: device */
6174 #endif
6175 #ifdef _PRE_WLAN_FEATURE_HIPRIV
6176     {"set_cca_threshold", wal_hipriv_set_cca_threshold},       /* 设置CCA门限: */
6177 #ifdef _PRE_WLAN_FEATURE_STA_PM
6178     {"set_psm_offset",  wal_hipriv_sta_set_psm_offset}, /* 配置tbtt、ext tbtt 提前量和beacon超时时间 */
6179     {"set_hw_ps_mode",  wal_hipriv_sta_set_hw_ps_mode}, /* 可配置硬件深睡和浅睡模式 */
6180     {"set_offload_param", wal_hipriv_sta_set_offload_param}, /* 配置offload 参数 */
6181 #endif
6182 #ifdef _PRE_WLAN_FEATURE_ALG_CFG
6183     {"alg_ar_log",      wal_hipriv_ar_log},            /* autorate算法日志参数配置: */
6184     {"alg_tpc_log",     wal_hipriv_tpc_log},           /* tpc算法日志参数配置: */
6185 #ifdef _PRE_WLAN_FEATURE_ALG_CFG_TEST
6186     {"alg_ar_test",     wal_hipriv_ar_test},           /* autorate算法系统测试命令 */
6187 #endif
6188 #endif
6189 #ifdef _PRE_WLAN_FEATURE_EDCA_OPT_AP_DEBUG
6190     {"edca_switch_sta", wal_hipriv_set_edca_opt_switch_sta},    /* STA是否开启私有edca参数优化机制 */
6191     {"edca_switch_ap",  wal_hipriv_set_edca_opt_switch_ap},     /* 是否开启edca优化机制 */
6192     {"edca_cycle_ap",   wal_hipriv_set_edca_opt_cycle_ap},      /* 设置edca参数调整的周期 */
6193 #endif
6194 #ifdef _PRE_WLAN_FEATURE_MESH
6195     {"set_times_limit", wal_hipriv_set_report_times_limit},     /* 设置发送次数上报相关参数(联调调试使用) */
6196     {"set_cnt_limit",   wal_hipriv_set_report_cnt_limit},       /* 设置发送上报相关参数(联调调试使用) */
6197     {"set_en_mbr",      wal_hipriv_set_en_mbr},                 /* 设置vap是否为MBR节点 */
6198     {"set_mnid",        wal_hipriv_set_mnid},                   /* 设置mesh vap的mnid */
6199     {"set_bcn_prio",    wal_hipriv_set_beacon_priority},        /* 设置beacon priority */
6200     {"set_accept_sta",  wal_hipriv_set_mesh_accept_sta},        /* 设置支持sta关联 */
6201 #endif
6202 #ifdef _PRE_WLAN_FEATURE_BTCOEX
6203     {"btcoex_enable",   wal_hipriv_btcoex_enable},
6204 #endif
6205 #ifdef _PRE_WLAN_FEATURE_BW_HIEX
6206     {"selfcts",         wal_hipriv_hiex_config_selfcts}, /* 设置selfcts发送参数: selfcts [enable] [duration] [per] */
6207 #endif
6208 #ifdef _PRE_WLAN_FEATURE_ARP_OFFLOAD
6209     {"arp_offload", wal_hipriv_arp_offload_setting},          /* 设置 ARP offload 功能 */
6210     {"arp_offload_info",   wal_hipriv_arp_offload_show_info}, /* 显示 ARP offload 信息 */
6211 #endif
6212 #ifdef _PRE_WLAN_FEATURE_DHCP_OFFLOAD
6213     {"dhcp_offload", wal_hipriv_dhcp_offload_setting},        /* 设置 DHCP offload 功能 */
6214 #endif
6215 #ifdef _PRE_WLAN_FEATURE_OFFLOAD_FLOWCTL
6216     {"set_flowctl_param",  wal_hipriv_set_flowctl_param},     /* 设置流控相关参数 */
6217     {"get_flowctl_stat",   wal_hipriv_get_flowctl_stat},      /* 获取流控相关状态信息 */
6218 #endif
6219 #endif
6220 #ifdef _PRE_DEBUG_MODE
6221     {"wmm",             wal_hipriv_set_wmm_param},  /* 设置wmm参数: wmm [param_ac_nimber] */
6222     {"vap_pkt_stat",    wal_hipriv_show_vap_pkt_stat},          /* 获取vap的收发包统计信息: vap_pkt_stat */
6223     {"start_scan",      wal_hipriv_start_scan},     /* 触发sta扫描: start_scan */
6224     {"start_join",      wal_hipriv_start_join},     /* 触发sta加入并认证关联: start_join [num] num:扫描到的AP序号 */
6225     {"start_deauth",    wal_hipriv_start_deauth},   /* 触发sta去认证: hipriv "vap0 start_deauth" */
6226     {"packet_xmit",     wal_hipriv_packet_xmit},    /* 发送数据帧: packet_xmit [tid_no] [num] [len] [ra_mac]" */
6227     {"hide_ssid",       wal_hipriv_hide_ssid},      /* 开关隐藏ssid: hide_ssid [0|1] */
6228     {"bgscan_enable",   wal_hipriv_bgscan_enable},  /* 背景扫描测试命令: bgscan_enable [0|1] */
6229     {"essid",           wal_ioctl_set_essid},       /* 设置AP ssid */
6230     {"set_regd_pwr",    wal_hipriv_set_regdomain_pwr},  /* 设置管制域最大发送功率: set_regdomain_pwr [value] 单位dBm */
6231     {"auto_protection", wal_hipriv_set_auto_protection},    /* 设置自动保护开关 */
6232     /* 设置管制域最大发送功率(可以突破限制): set_regdomain_pwr_p [value] 单位dBm */
6233     {"set_regd_pwr_p",  wal_hipriv_set_regdomain_pwr_priv},
6234     {"create",          wal_hipriv_add_vap},        /* 创建vap: Hisilicon0 create [vap0] [ap|sta] */
6235     {"destroy",         wal_hipriv_del_vap},        /* 删除vap: destroy */
6236     {"add_user",        wal_hipriv_add_user},       /* 添加用户: add_user [mac地址] [0|1(HT能力位)] */
6237     {"btcoex_print",    wal_hipriv_btcoex_status_print},    /* 打印共存维测信息: coex_print */
6238     {"mpdu_num",        wal_hipriv_get_mpdu_num},   /* 获取tid的mpdu个数: mpdu_num [user_macaddr] */
6239 #endif
6240 #if defined(_PRE_DEBUG_MODE) || defined(_PRE_WLAN_FEATURE_SIGMA)
6241     /* sigma相关 */
6242     {"addba_req",       wal_hipriv_addba_req},      /* 建立BA: addba_req [mac] [tidno] [buffsize] [timeout] */
6243     {"rate",            wal_hipriv_set_rate},       /* 设置non-HT模式下的速率: rate [value] */
6244     {"mcs",             wal_hipriv_set_mcs},        /* 设置HT模式下的速率: mcs [value] */
6245     {"rts_threshold",   wal_hipriv_rts_threshold},  /* 设置RTS门限:  rts_threshold [len] */
6246     {"set_stbc_cap",    wal_hipriv_set_stbc_cap},   /* 设置STBC能力 */
6247     {"txpower",         wal_ioctl_set_txpower},
6248     {"set_shortgi20",   wal_hipriv_set_shortgi20},  /* 设置20M short GI: set_shortgi20 [1/0] */
6249 #endif
6250 #if defined(_PRE_WLAN_FEATURE_HIPRIV) && defined(_PRE_WLAN_FEATURE_INTRF_MODE)
6251     {"intrf_mode",      wal_hipriv_set_intrf_mode}, /* 设置干扰模式: intrf_mode [1/0],为1则进入,启动一系列抗干扰措施 */
6252 #endif
6253     {"get_tx_params",   wal_hipriv_get_tx_params}
6254 };
6255 #endif
6256 
6257 /* ****************************************************************************
6258  功能描述  : 获取命令对应的net_dev
6259  输入参数  : pc_cmd: 命令字符串
6260  输出参数  : ppst_net_dev: 得到net_device
6261             pul_off_set: 取net_device偏移的字节
6262  返 回 值  : 错误码
6263 **************************************************************************** */
wal_hipriv_get_netdev(const hi_char * pc_cmd,oal_net_device_stru ** netdev,hi_u32 * pul_off_set)6264 hi_u32 wal_hipriv_get_netdev(const hi_char *pc_cmd, oal_net_device_stru **netdev, hi_u32 *pul_off_set)
6265 {
6266     hi_char              ac_dev_name[WAL_HIPRIV_CMD_NAME_MAX_LEN] = {0};
6267 
6268     if (oal_unlikely((pc_cmd == HI_NULL) || (netdev == HI_NULL) || (pul_off_set == HI_NULL))) {
6269         oam_error_log0(0, OAM_SF_ANY, "{wal_hipriv_get_netdev::pc_cmd/ppst_net_dev/pul_off_set null ptr!}");
6270         return HI_ERR_CODE_PTR_NULL;
6271     }
6272     if (wal_get_cmd_one_arg(pc_cmd, ac_dev_name, WAL_HIPRIV_CMD_NAME_MAX_LEN, pul_off_set) != HI_SUCCESS) {
6273         oam_warning_log0(0, OAM_SF_ANY, "{wal_hipriv_get_netdev::wal_get_cmd_one_arg return err_code!}");
6274         return HI_FAIL;
6275     }
6276     /* 根据dev_name找到dev */
6277     oal_net_device_stru *netdev_temp = oal_get_netdev_by_name(ac_dev_name);
6278     if (netdev_temp == HI_NULL) {
6279         oam_warning_log0(0, OAM_SF_ANY, "{wal_hipriv_get_netdev::oal_get_netdev_by_name return null ptr!}");
6280         return HI_ERR_CODE_PTR_NULL;
6281     }
6282     /* 调用oal_dev_get_by_name后,必须调用oal_dev_put使net_dev的引用计数减一 */
6283     oal_dev_put(netdev_temp);
6284     *netdev = netdev_temp;
6285     return HI_SUCCESS;
6286 }
6287 
6288 #if defined(_PRE_WLAN_FEATURE_HIPRIV) || defined(_PRE_WLAN_FEATURE_SIGMA)
6289 /* ****************************************************************************
6290  功能描述  : 处理私有配置命令
6291  输入参数  : pc_cmd: 命令
6292  返 回 值  : 错误码
6293 **************************************************************************** */
wal_hipriv_process_cmd(oal_net_device_stru * netdev,hi_char * pc_cmd)6294 static hi_u32 wal_hipriv_process_cmd(oal_net_device_stru *netdev, hi_char *pc_cmd)
6295 {
6296     hi_u8    cmd;
6297     hi_u32   off_set = 0;
6298     hi_u32   ret;
6299     hi_char  ac_cmd_name[WAL_HIPRIV_CMD_NAME_MAX_LEN] = {'\0'};
6300 
6301     /* **************************************************************************
6302         cmd格式约束
6303         网络设备名 命令      参数   eg. Hisilicon0 create vap0
6304         1~15Byte   1~15Byte
6305     **************************** ********************************************** */
6306     if (wal_get_cmd_one_arg(pc_cmd, ac_cmd_name, WAL_HIPRIV_CMD_NAME_MAX_LEN, &off_set) != HI_SUCCESS) {
6307         oam_warning_log0(0, OAM_SF_ANY, "{wal_get_cmd_one_arg return err_code!}");
6308         return HI_FAIL;
6309     }
6310 
6311     /* 根据命令名找到命令枚举 */
6312     for (cmd = 0; cmd < hi_array_size(g_ast_hipriv_cmd); cmd++) {
6313         if (strcmp(g_ast_hipriv_cmd[cmd].pc_cmd_name, ac_cmd_name) == 0) {
6314             pc_cmd += off_set;
6315             ret = g_ast_hipriv_cmd[cmd].func(netdev, pc_cmd);
6316             if (ret != HI_SUCCESS) {
6317                 oam_warning_log1(0, OAM_SF_ANY, "{cmd func process failed, ret=%u}", ret);
6318 #ifdef _PRE_WLAN_FEATURE_MFG_TEST
6319                 printk("ERROR\r\n");
6320 #endif
6321             }
6322             return ret;
6323         }
6324     }
6325 
6326     if (strcmp(ac_cmd_name, "help") == 0) {
6327         oam_print("hipriv commands:\n");
6328         for (cmd = 0; cmd < hi_array_size(g_ast_hipriv_cmd); cmd++) {
6329             oam_print(" %s\n", g_ast_hipriv_cmd[cmd].pc_cmd_name);
6330         }
6331         return HI_SUCCESS;
6332     }
6333 
6334     return HI_FAIL;
6335 }
6336 
6337 /* ****************************************************************************
6338  功能描述  : hipriv命令入口
6339  输入参数  : *pc_buffer 命令参数
6340             count 命令长度
6341  返 回 值  : 字节数,0表示hipriv失败
6342 **************************************************************************** */
wal_hipriv_entry(const hi_char * pc_buffer,hi_u32 count)6343 hi_u32 wal_hipriv_entry(const hi_char *pc_buffer, hi_u32 count)
6344 {
6345     hi_char             *pc_cmd = HI_NULL;
6346     hi_char             *pc_cmd_tmp = HI_NULL;
6347     oal_net_device_stru *netdev = HI_NULL;
6348     hi_u32              ret;
6349     hi_u32              len = count;
6350     hi_u32              off_set = 0;
6351 
6352     if (len > WAL_HIPRIV_CMD_MAX_LEN) {
6353         oam_error_log1(0, OAM_SF_ANY, "{wal_hipriv_entry::param len overflow, ul_len[%u]!}", len);
6354         return 0;
6355     }
6356 
6357     pc_cmd = oal_mem_alloc(OAL_MEM_POOL_ID_LOCAL, WAL_HIPRIV_CMD_MAX_LEN);
6358     if (oal_unlikely(pc_cmd == HI_NULL)) {
6359         oam_warning_log0(0, OAM_SF_ANY, "{wal_hipriv_entry::alloc mem return null ptr!}\r\n");
6360         return 0;
6361     }
6362 
6363     if (pc_buffer != HI_NULL) {
6364         if (memcpy_s(pc_cmd, len, pc_buffer, len) != EOK) {
6365             oam_error_log0(0, OAM_SF_ANY, "{wal_hipriv_entry::mem safe function err!}");
6366             oal_mem_free(pc_cmd);
6367             return 0;
6368         }
6369     }
6370     pc_cmd[len - 1] = '\0';
6371     pc_cmd_tmp = pc_cmd;
6372     ret = wal_hipriv_get_netdev(pc_cmd_tmp, &netdev, &off_set);
6373     if (ret != HI_SUCCESS) {
6374         oam_warning_log1(0, OAM_SF_ANY, "{wal_hipriv_entry::wal_hipriv_get_netdev return error code [%d]!}\r\n", ret);
6375         oal_mem_free(pc_cmd);
6376         return 0;
6377     }
6378 
6379     pc_cmd_tmp += off_set;
6380     ret = wal_hipriv_process_cmd(netdev, pc_cmd_tmp);
6381     if (ret != HI_SUCCESS) {
6382         oam_warning_log1(0, OAM_SF_ANY, "{wal_hipriv_entry::parse cmd return err code[%d]!}\r\n", ret);
6383         oal_mem_free(pc_cmd);
6384         return 0;
6385     }
6386     oal_mem_free(pc_cmd);
6387 
6388     return len;
6389 }
6390 #endif
6391 
6392 #ifdef _PRE_CONFIG_CONN_HISI_SYSFS_SUPPORT
6393 /* ****************************************************************************
6394  函 数 名  : wal_hipriv_sys_write
6395  功能描述  : sys write函数
6396 
6397  修改历史      :
6398   1.日    期   : 2014年10月17日
6399     作    者   : HiSilicon
6400     修改内容   : 新生成函数
6401 
6402 **************************************************************************** */
wal_hipriv_sys_write(oal_device_stru * dev,oal_device_attribute_stru * attr,const char * pc_buffer,hi_size_t count)6403 static hi_ssize_t wal_hipriv_sys_write(oal_device_stru *dev, oal_device_attribute_stru *attr, const char *pc_buffer,
6404     hi_size_t count)
6405 {
6406     hi_u32 len = (hi_u32)count;
6407 
6408     if (len > WAL_HIPRIV_CMD_MAX_LEN) {
6409         oam_warning_log1(0, OAM_SF_ANY, "{wal_hipriv_sys_write::len>WAL_HIPRIV_CMD_MAX_LEN, len [%d]!}\r\n", len);
6410         return -OAL_EINVAL;
6411     }
6412 
6413     if (wal_hipriv_entry(pc_buffer, len) != len) {
6414         oam_warning_log0(0, OAM_SF_ANY, "{wal_hipriv_proc_write::parse cmd return err code!}\r\n");
6415     }
6416 
6417     return (hi_s32)len;
6418 }
6419 
6420 /* ****************************************************************************
6421  函 数 名  : wal_hipriv_sys_read
6422  功能描述  : sys read函数 空函数;防止编译警告
6423 
6424  修改历史      :
6425   1.日    期   : 2014年10月17日
6426     作    者   : HiSilicon
6427     修改内容   : 新生成函数
6428 
6429 **************************************************************************** */
6430 #define SYS_READ_MAX_STRING_LEN (4096 - 40) /* 当前命令字符长度20字节内,预留40保证不会超出 */
wal_hipriv_sys_read(oal_device_stru * dev,oal_device_attribute_stru * attr,char * pc_buffer)6431 static hi_ssize_t wal_hipriv_sys_read(oal_device_stru *dev, oal_device_attribute_stru *attr, char *pc_buffer)
6432 {
6433     hi_u32              cmd_idx;
6434     hi_u32              buff_index = 0;
6435 
6436     for (cmd_idx = 0; cmd_idx < hi_array_count(g_ast_hipriv_cmd); cmd_idx++) {
6437         buff_index += snprintf_s(pc_buffer + buff_index, (SYS_READ_MAX_STRING_LEN - buff_index),
6438             strlen(g_ast_hipriv_cmd[cmd_idx].pc_cmd_name) + 3, /* 多3字节 */
6439             "\t%s\n", g_ast_hipriv_cmd[cmd_idx].pc_cmd_name);
6440         if (buff_index > SYS_READ_MAX_STRING_LEN) {
6441             buff_index += snprintf_s(pc_buffer + buff_index, (SYS_READ_MAX_STRING_LEN - buff_index), 50,
6442                 "\tmore...\n"); /* count is 50 */
6443             break;
6444         }
6445     }
6446     return buff_index;
6447 }
6448 
6449 #endif
6450 
6451 
6452 #ifdef _PRE_WLAN_FEATURE_HIPRIV
6453 #ifdef AT_DEBUG_CMD_SUPPORT
wal_at_set_tpc(oal_net_device_stru * netdev,const hi_char * pc_param)6454 static hi_u32 wal_at_set_tpc(oal_net_device_stru *netdev, const hi_char *pc_param)
6455 {
6456     wal_msg_write_stru        write_msg;
6457     hi_u32                    off_set = 0;
6458     hi_char                   tpc_value[WAL_HIPRIV_CMD_NAME_MAX_LEN] = {'\0'};
6459     mac_ioctl_alg_param_stru *alg_param = (mac_ioctl_alg_param_stru *)(write_msg.auc_value);
6460 
6461     /* 低功耗状态下不允许执行 */
6462     if (is_under_ps()) {
6463         oam_warning_log0(0, 0, "under ps mode,can not exec cmd");
6464         return HI_FAIL;
6465     }
6466     /* 获取TPC配置开关 */
6467     if (*pc_param == ' ') {
6468         oam_warning_log0(0, OAM_SF_ANY, "{wal_at_set_tpc::cmd error!}");
6469         return HI_FAIL;
6470     }
6471 
6472     hi_u32 ret = wal_get_cmd_one_arg(pc_param, tpc_value, WAL_HIPRIV_CMD_NAME_MAX_LEN, &off_set);
6473     if (ret != HI_SUCCESS) {
6474         oam_warning_log1(0, OAM_SF_ANY, "{wal_at_set_tpc::wal_get_cmd_one_arg return err_code [%u]!}", ret);
6475         return ret;
6476     }
6477 
6478     if ((strcmp("0", tpc_value) != 0) && (strcmp("1", tpc_value) != 0)) {
6479         oam_warning_log0(0, OAM_SF_ANY, "{wal_at_set_tpc::get tpc switch err}");
6480         return HI_FAIL;
6481     }
6482 
6483     /* 判断命令长度是否有问题 */
6484     pc_param += off_set;
6485     if (*pc_param != '\0') {
6486         oam_warning_log0(0, OAM_SF_ANY, "{wal_hipriv_al_tx::cmd len error!}");
6487         return HI_FAIL;
6488     }
6489 
6490     alg_param->alg_cfg = MAC_ALG_CFG_TPC_MODE;
6491     alg_param->is_negtive = HI_FALSE;
6492     alg_param->value = (strcmp("0", tpc_value) == 0) ? ALG_TPC_MODE_DISABLE : ALG_TPC_MODE_ADAPT_POWER;
6493 
6494     /* 抛事件到wal层处理 */
6495     wal_write_msg_hdr_init(&write_msg, WLAN_CFGID_ALG_PARAM, sizeof(mac_ioctl_alg_param_stru));
6496 
6497     ret = wal_send_cfg_event(netdev, WAL_MSG_TYPE_WRITE,
6498         WAL_MSG_WRITE_MSG_HDR_LENGTH + sizeof(mac_ioctl_alg_param_stru), (hi_u8 *)&write_msg, HI_FALSE, HI_NULL);
6499     if (oal_unlikely(ret != HI_SUCCESS)) {
6500         oam_warning_log1(0, OAM_SF_ANY, "{wal_at_set_tpc::wal_send_cfg_event return err code [%u]!}", ret);
6501         return ret;
6502     }
6503 
6504     hi_at_printf("OK\r\n");
6505     return HI_SUCCESS;
6506 }
6507 
wal_at_setcountry(oal_net_device_stru * netdev,hi_char * pc_param)6508 hi_u32 wal_at_setcountry(oal_net_device_stru *netdev, hi_char *pc_param)
6509 {
6510     hi_u32 ret = wal_hipriv_setcountry(netdev, pc_param);
6511     if (ret == HI_SUCCESS) {
6512         hi_at_printf("OK\r\n");
6513     }
6514 
6515     return ret;
6516 }
6517 
wal_at_set_trc(oal_net_device_stru * netdev,const hi_char * pc_param)6518 static hi_u32 wal_at_set_trc(oal_net_device_stru *netdev, const hi_char *pc_param)
6519 {
6520     wal_msg_write_stru        write_msg;
6521     hi_u32                    off_set = 0;
6522     hi_char                   trc_value[WAL_HIPRIV_CMD_NAME_MAX_LEN] = {'\0'};
6523     mac_ioctl_alg_param_stru *alg_param = (mac_ioctl_alg_param_stru *)(write_msg.auc_value);
6524 
6525     /* 低功耗状态下不允许执行 */
6526     if (is_under_ps()) {
6527         oam_warning_log0(0, 0, "under ps mode,can not exec cmd");
6528         return HI_FAIL;
6529     }
6530     /* 获取TRC配置开关 */
6531     if (*pc_param == ' ') {
6532         oam_warning_log0(0, OAM_SF_ANY, "{wal_at_set_trc::cmd error!}");
6533         return HI_FAIL;
6534     }
6535 
6536     hi_u32 ret = wal_get_cmd_one_arg(pc_param, trc_value, WAL_HIPRIV_CMD_NAME_MAX_LEN, &off_set);
6537     if (ret != HI_SUCCESS) {
6538         oam_warning_log1(0, OAM_SF_ANY, "{wal_at_set_trc::wal_get_cmd_one_arg return err_code [%u]!}", ret);
6539         return HI_FAIL;
6540     }
6541 
6542     if ((strcmp("0", trc_value) != 0) && (strcmp("1", trc_value) != 0)) {
6543         oam_warning_log0(0, OAM_SF_ANY, "{wal_at_set_trc::param err}");
6544         return HI_FAIL;
6545     }
6546 
6547     /* 判断命令长度是否有问题 */
6548     pc_param += off_set;
6549     if (*pc_param != '\0') {
6550         oam_warning_log0(0, OAM_SF_ANY, "{wal_at_set_trc::cmd len error!}");
6551         return HI_FAIL;
6552     }
6553 
6554     alg_param->alg_cfg = MAC_ALG_CFG_AUTORATE_ENABLE;
6555     alg_param->is_negtive = HI_FALSE;
6556     alg_param->value = (strcmp("0", trc_value) == 0) ? 0 : 1; /* 0:禁止速率调节,1: 使能速率调节 */
6557     /* 抛事件到wal层处理 */
6558     wal_write_msg_hdr_init(&write_msg, WLAN_CFGID_ALG_PARAM, sizeof(mac_ioctl_alg_param_stru));
6559 
6560     ret = wal_send_cfg_event(netdev, WAL_MSG_TYPE_WRITE,
6561         WAL_MSG_WRITE_MSG_HDR_LENGTH + sizeof(mac_ioctl_alg_param_stru), (hi_u8 *)&write_msg, HI_FALSE, HI_NULL);
6562     if (oal_unlikely(ret != HI_SUCCESS)) {
6563         oam_warning_log1(0, OAM_SF_ANY, "{wal_at_set_trc::wal_send_cfg_event return err code [%u]!}", ret);
6564         return ret;
6565     }
6566     g_auto_rate_flag = alg_param->value;
6567 
6568     hi_at_printf("OK\r\n");
6569     return HI_SUCCESS;
6570 }
6571 
wal_get_protocol_mode(const oal_net_device_stru * netdev,hi_s32 * protocol_mode)6572 static hi_s32 wal_get_protocol_mode(const oal_net_device_stru *netdev, hi_s32 *protocol_mode)
6573 {
6574     hi_s32                   phy_mode = -1;
6575     mac_vap_stru             *mac_vap = HI_NULL;
6576 
6577     if ((netdev == HI_NULL) || (GET_NET_DEV_PRIV(netdev) == HI_NULL)) {
6578         oam_warning_log0(0, OAM_SF_ANY, "{wal_get_protocol_mode::netdev or netdev->ml_priv null param!}");
6579         return HI_FAIL;
6580     }
6581     mac_vap = (mac_vap_stru *)GET_NET_DEV_PRIV(netdev);
6582     /* rate参数校验,要区分当前协议模式 */
6583     if (mac_vap->vap_mode == WLAN_VAP_MODE_BSS_STA) {
6584         phy_mode = hi_wifi_sta_get_protocol_mode();
6585         if (phy_mode == HISI_FAIL) {
6586             oam_warning_log0(0, OAM_SF_ANY, "{wal_get_protocol_mode::hi_wifi_sta_get_protocol_mode fail!}");
6587             return HI_FAIL;
6588         }
6589     } else if (mac_vap->vap_mode == WLAN_VAP_MODE_BSS_AP) {
6590         phy_mode = hi_wifi_softap_get_protocol_mode();
6591         if (phy_mode == HISI_FAIL) {
6592             oam_warning_log0(0, OAM_SF_ANY, "{wal_get_protocol_mode::hi_wifi_sta_get_protocol_mode fail!}");
6593             return HI_FAIL;
6594         }
6595     } else if (mac_vap->vap_mode == WLAN_VAP_MODE_MESH) {
6596         phy_mode = HI_WIFI_PHY_MODE_11BGN;
6597     } else {
6598         oam_warning_log0(0, OAM_SF_ANY, "{wal_get_protocol_mode::ifname err!}");
6599         return HI_FAIL;
6600     }
6601 
6602     *protocol_mode = phy_mode;
6603     return HI_SUCCESS;
6604 }
6605 
wal_is_set_rate_valid(hi_s32 protocol_mode,hi_s32 rate)6606 static hi_u32 wal_is_set_rate_valid(hi_s32 protocol_mode, hi_s32 rate)
6607 {
6608     if (protocol_mode == HI_WIFI_PHY_MODE_11B) {
6609         if (rate < 0 || rate > 3) { /* 0 3:11b 参数取值范围 */
6610             oam_warning_log0(0, OAM_SF_ANY, "{wal_is_set_rate_valid::protocol_mode 11b, rate or short gi err!}");
6611             return HI_FAIL;
6612         }
6613     } else if (protocol_mode == HI_WIFI_PHY_MODE_11BG) {
6614         if (!((rate >= 24 && rate <= 31) || (rate >= 0 && rate <= 3))) { /* 0 3 24 31:11bg 参数范围 */
6615             oam_warning_log0(0, OAM_SF_ANY, "{wal_is_set_rate_valid::protocol_mode 11bg, rate or short gi err!}");
6616             return HI_FAIL;
6617         }
6618     } else if (protocol_mode == HI_WIFI_PHY_MODE_11BGN) {
6619         if (!((rate >= 32 && rate <= 39) || (rate >= 24 && rate <= 31) || /* 32 39 24 31 参数范围 */
6620             (rate >= 0 && rate <= 3))) {                                  /* 0 3 参数范围 */
6621             oam_warning_log0(0, OAM_SF_ANY, "{wal_is_set_rate_valid::protocol_mode 11bgn, rate err!}");
6622             return HI_FAIL;
6623         }
6624     } else {
6625         oam_warning_log0(0, OAM_SF_ANY, "{wal_is_set_rate_valid::protocol mode err!}");
6626         return HI_FAIL;
6627     }
6628     return HI_SUCCESS;
6629 }
6630 
wal_set_rate_sgi(oal_net_device_stru * netdev,hi_u8 frame_type,hi_s32 protocol_mode,hi_s32 rate_value,hi_s8 sgi_val)6631 static hi_u32 wal_set_rate_sgi(oal_net_device_stru *netdev, hi_u8 frame_type, hi_s32 protocol_mode, hi_s32 rate_value,
6632     hi_s8 sgi_val)
6633 {
6634     wal_msg_write_stru write_msg;
6635 
6636     if (wal_is_set_rate_valid(protocol_mode, rate_value) != HI_SUCCESS) {
6637         return HI_FAIL;
6638     }
6639     /* **************************************************************************
6640                                 抛事件到wal层处理
6641     ************************************************************************** */
6642     wal_write_msg_hdr_init(&write_msg, WLAN_CFGID_SET_DSCR, sizeof(mac_cfg_set_dscr_param_stru));
6643     /* 解析并设置配置命令参数 */
6644     mac_cfg_set_dscr_param_stru *set_dscr_param = (mac_cfg_set_dscr_param_stru *)(write_msg.auc_value);
6645     set_dscr_param->type = frame_type;
6646     set_dscr_param->function_index = MAC_SET_DSCR_PARAM_RATE;
6647     set_dscr_param->l_value = rate_value;
6648     if (wal_send_cfg_event(netdev, WAL_MSG_TYPE_WRITE,
6649         WAL_MSG_WRITE_MSG_HDR_LENGTH + sizeof(mac_cfg_set_dscr_param_stru), (hi_u8 *)&write_msg, HI_FALSE,
6650         HI_NULL) != HI_SUCCESS) {
6651         oam_warning_log0(0, OAM_SF_ANY, "{wal_set_rate_sgi:: set rate return err!}");
6652         return HI_FAIL;
6653     }
6654 
6655     /* 设置short gi参数值 */
6656     if (protocol_mode == HI_WIFI_PHY_MODE_11BGN) {
6657         /* **************************************************************************
6658                                 抛事件到wal层处理
6659         ************************************************************************** */
6660         set_dscr_param->type = frame_type;
6661         set_dscr_param->function_index = MAC_SET_DSCR_PARAM_SHORTGI;
6662         set_dscr_param->l_value = (hi_s32)sgi_val;
6663         if (wal_send_cfg_event(netdev, WAL_MSG_TYPE_WRITE,
6664             WAL_MSG_WRITE_MSG_HDR_LENGTH + sizeof(mac_cfg_set_dscr_param_stru), (hi_u8 *)&write_msg, HI_FALSE,
6665             HI_NULL) != HI_SUCCESS) {
6666             oam_warning_log0(0, OAM_SF_ANY, "{wal_set_rate_sgi::set sgi return err!}");
6667             return HI_FAIL;
6668         }
6669     }
6670     return HI_SUCCESS;
6671 }
6672 
wal_at_set_rate(oal_net_device_stru * netdev,const hi_char * pc_param)6673 static hi_u32 wal_at_set_rate(oal_net_device_stru *netdev, const hi_char *pc_param)
6674 {
6675     hi_char                             ac_arg[WAL_HIPRIV_CMD_NAME_MAX_LEN];
6676     hi_char                             *ac_arg_ptr = ac_arg;
6677     hi_u32                              off_set = 0;
6678     mac_set_dscr_frame_type_enum_uint8  frame_type = MAC_SET_DSCR_TYPE_UCAST_DATA; /* 仅支持配置单播数据帧 */
6679     hi_s32                              rate_value = -1;
6680     hi_s8                               sgi_val = 0; /* short gi 控制 */
6681     hi_s32                              protocol_mode = -1;
6682 
6683     if (g_auto_rate_flag == 1) {
6684         oam_warning_log0(0, OAM_SF_ANY, "{wal_at_set_rate::auto rate is on!}");
6685         return HI_FAIL;
6686     }
6687 
6688     if (wal_get_protocol_mode(netdev, &protocol_mode) != HI_SUCCESS) {
6689         return HI_FAIL;
6690     }
6691 #if (_PRE_OS_VERSION_LINUX == _PRE_OS_VERSION)
6692     pc_param++;
6693 #endif
6694     for (hi_u32 i = 0; i < 3; i++) { /* 3: 分别取出3个参数 */
6695         if (wal_hipriv_get_value(pc_param, ac_arg_ptr, &off_set, 1) != HI_SUCCESS) {
6696             return HI_FAIL;
6697         }
6698         pc_param += off_set;
6699         if (i == 0) {
6700             if (strcmp("0", ac_arg_ptr) == 0) {
6701                 frame_type = MAC_SET_DSCR_TYPE_UCAST_DATA; /* 第一个参数取值0,帧类型为单播数据帧 */
6702             } else {
6703                 return HI_FAIL;
6704             }
6705         } else if (i == 1) {
6706             rate_value = oal_strtol(ac_arg_ptr, HI_NULL, 0);
6707             if ((protocol_mode == HI_WIFI_PHY_MODE_11B) || (protocol_mode == HI_WIFI_PHY_MODE_11BG)) {
6708                 break;
6709             }
6710         } else if (i == 2) { /* 2: 第三个参数 short gi */
6711             if ((strcmp("0", ac_arg_ptr) == 0) || (strcmp("1", ac_arg_ptr) == 0)) {
6712                 sgi_val = (hi_s8)oal_atoi(ac_arg_ptr);
6713             } else {
6714                 return HI_FAIL;
6715             }
6716         }
6717     }
6718     /* 判断命令长度是否有问题 */
6719     if (*pc_param != '\0') {
6720         oam_warning_log0(0, OAM_SF_ANY, "{wal_at_set_rate::cmd len error}");
6721         return HI_FAIL;
6722     }
6723     /* 设置rate 和short gi参数值 */
6724     if (wal_set_rate_sgi(netdev, frame_type, protocol_mode, rate_value, sgi_val) != HI_SUCCESS) {
6725         return HI_FAIL;
6726     }
6727 #ifdef AT_DEBUG_CMD_SUPPORT
6728     hi_at_printf("OK\r\n");
6729 #endif
6730     return HI_SUCCESS;
6731 }
6732 
6733 /* ****************************************************************************
6734  功能描述  : 处理私有配置命令
6735  输入参数  : pc_cmd: 命令
6736  返 回 值  : 错误码
6737 **************************************************************************** */
wal_at_cmd(oal_net_device_stru * netdev,hi_char * cmd,hi_u32 cmd_type)6738 static hi_u32 wal_at_cmd(oal_net_device_stru *netdev, hi_char *cmd, hi_u32 cmd_type)
6739 {
6740     hi_u32 ret = HI_SUCCESS;
6741 
6742     if (cmd_type == HISI_AT_AL_TX) {
6743         ret = wal_hipriv_tx_proc(netdev, cmd);
6744     } else if (cmd_type == HISI_AT_AL_RX) {
6745         ret = wal_hipriv_rx_proc(netdev, cmd);
6746     } else if (cmd_type == HISI_AT_RX_INFO) {
6747         ret = wal_hipriv_rx_fcs_info(netdev, cmd);
6748     } else if (cmd_type == HISI_AT_SET_COUNTRY) {
6749         ret = wal_at_setcountry(netdev, cmd);
6750     } else if (cmd_type == HISI_AT_GET_COUNTRY) {
6751         ret = wal_hipriv_getcountry(netdev, cmd);
6752     } else if (cmd_type == HISI_AT_SET_WLAN0_BW) {
6753         ret = wal_hipriv_set_bw(netdev, cmd);
6754     } else if (cmd_type == HISI_AT_SET_AP0_BW) {
6755         ret = wal_hipriv_set_bw(netdev, cmd);
6756     } else if (cmd_type == HISI_AT_SET_MESH0_BW) {
6757         ret = wal_hipriv_set_bw(netdev, cmd);
6758 #ifdef _PRE_WLAN_FEATURE_MESH
6759     } else if ((cmd_type == HISI_AT_GET_WLAN0_MESHINFO) || (cmd_type == HISI_AT_GET_MESH0_MESHINFO)) {
6760         ret = wal_hipriv_get_mesh_node_info(netdev, cmd);
6761 #endif
6762     } else if (cmd_type == HISI_AT_SET_TPC) {
6763         ret = wal_at_set_tpc(netdev, cmd);
6764     } else if (cmd_type == HISI_AT_SET_TRC) {
6765         ret = wal_at_set_trc(netdev, cmd);
6766     } else if (cmd_type == HISI_AT_SET_RATE) {
6767         ret = wal_at_set_rate(netdev, cmd);
6768     } else {
6769         return HI_FAIL;
6770     }
6771 
6772     return ret;
6773 }
6774 
6775 /* ****************************************************************************
6776  功能描述  : 根据业务vap类型查询网口
6777  输入参数  : vap_mode VAP类型
6778  返 回 值  :网口名字,HI_NULL表示查找失败
6779 **************************************************************************** */
wal_at_find_netif_by_mode(wlan_vap_mode_enum vap_mode)6780 hi_char *wal_at_find_netif_by_mode(wlan_vap_mode_enum vap_mode)
6781 {
6782     oal_net_device_stru            *netdev = HI_NULL;
6783     mac_vap_stru                   *mac_vap = HI_NULL;
6784     mac_device_stru *mac_dev = mac_res_get_dev();
6785     hi_u8 vap_idx;
6786 
6787     for (vap_idx = 0; vap_idx < mac_dev->vap_num; vap_idx++) {
6788         mac_vap = mac_vap_get_vap_stru(mac_dev->auc_vap_id[vap_idx]);
6789         if (mac_vap == HI_NULL) {
6790             continue;
6791         }
6792         if (mac_vap->vap_mode == vap_mode) {
6793             break;
6794         }
6795     }
6796     if (mac_vap == HI_NULL) {
6797         return HI_NULL;
6798     }
6799     netdev = hmac_vap_get_net_device(mac_vap->vap_id);
6800     if (netdev == HI_NULL) {
6801         oam_error_log1(0, 0, "wal_at_find_netif_by_mode cannot find netdevice,vap_mode[%d].", vap_mode);
6802         return HI_NULL;
6803     }
6804 
6805     return netdev->name;
6806 }
6807 
6808 /* ****************************************************************************
6809  功能描述  : hipriv命令入口
6810  输入参数  : *pc_buffer 命令参数
6811             count 命令长度
6812  返 回 值  : 字节数,0表示hipriv失败
6813 **************************************************************************** */
wal_at_entry(hi_char * buffer,hi_u32 cmd_type)6814 hi_u32 wal_at_entry(hi_char *buffer, hi_u32 cmd_type)
6815 {
6816     hi_u32               ret;
6817     oal_net_device_stru *netdev = HI_NULL;
6818     hi_char             *dev_name        = HI_NULL;
6819     hi_char              net_hisilicon[] = "Hisilicon0";
6820     hi_char              ac_arg[WAL_HIPRIV_CMD_NAME_MAX_LEN];
6821     hi_char              *ac_arg_ptr = ac_arg;
6822     hi_u32               off_set = 0;
6823     hi_char              *cmd_buff = buffer;
6824 
6825     if ((cmd_type == HISI_AT_SET_COUNTRY) || (cmd_type == HISI_AT_GET_COUNTRY) || (cmd_type == HISI_AT_SET_TPC) ||
6826         (cmd_type == HISI_AT_SET_TRC)) {
6827         dev_name = net_hisilicon;
6828     } else if (cmd_type == HISI_AT_SET_AP0_BW) {
6829         dev_name = wal_at_find_netif_by_mode(WLAN_VAP_MODE_BSS_AP);
6830     } else if ((cmd_type == HISI_AT_SET_MESH0_BW) || (cmd_type == HISI_AT_GET_MESH0_MESHINFO)) {
6831         dev_name = wal_at_find_netif_by_mode(WLAN_VAP_MODE_MESH);
6832     } else if (cmd_type == HISI_AT_SET_RATE) {
6833         /* 第一个参数为 wlan0 或者 ap0 */
6834         if (wal_hipriv_get_value(cmd_buff, ac_arg_ptr, &off_set, 0) != HI_SUCCESS) {
6835             return HI_FAIL;
6836         }
6837         dev_name = ac_arg_ptr;
6838         cmd_buff += off_set;
6839     } else {
6840         dev_name = wal_at_find_netif_by_mode(WLAN_VAP_MODE_BSS_STA);
6841     }
6842 
6843     /* 根据dev_name找到dev */
6844     netdev = oal_get_netdev_by_name(dev_name);
6845     if (netdev == HI_NULL) {
6846         oam_warning_log0(0, OAM_SF_ANY, "{wal_at_entry::get netdev by name return null!}");
6847         return HI_ERR_CODE_PTR_NULL;
6848     }
6849 
6850     ret = wal_at_cmd(netdev, cmd_buff, cmd_type);
6851     return ret;
6852 }
6853 
hi_wifi_at_start(hi_s32 argc,const hi_char * argv[],hi_u32 cmd_type)6854 hi_u32 hi_wifi_at_start(hi_s32 argc, const hi_char *argv[], hi_u32 cmd_type)
6855 {
6856     hi_u32      total_len = 0;
6857     hi_s32      index;
6858     hi_char     temp_buffer[3]; /* 3 存储buffer */
6859     hi_char    *buffer = NULL;
6860     hi_char    *buffer_temp = NULL;
6861     hi_char    *buffer_index = NULL;
6862 
6863     if (argv == HI_NULL) {
6864         oam_error_log0(0, OAM_SF_ANY, "hi_wifi_at_start: argv null!");
6865         return HI_ERR_FAILURE;
6866     }
6867     /* HISI_AT_RX_INFO和HISI_AT_GET_COUNTRY场景 */
6868     if (argc == 0) {
6869         temp_buffer[0] = '\0';
6870         buffer_temp = temp_buffer;
6871     } else {
6872         for (index = 0; index < argc; index++) {
6873             total_len += strlen((hi_char *)argv[index]) + 1;
6874         }
6875 
6876         buffer = oal_memalloc(total_len);
6877         if (buffer == NULL) {
6878             oam_error_log0(0, OAM_SF_ANY, "hi_wifi_at_start: malloc failed!");
6879             return HI_ERR_FAILURE;
6880         }
6881 
6882         buffer_index = buffer;
6883         for (index = 0; index < argc; index++) {
6884             hi_u32 len = strlen((hi_char *)argv[index]);
6885             if (memcpy_s(buffer_index, len, argv[index], len) != EOK) {
6886                 oam_error_log0(0, 0, "{hi_wifi_at_start::mem safe function err!}");
6887                 oal_free(buffer);
6888                 return HI_ERR_FAILURE;
6889             }
6890             buffer_index[len] = ' ';
6891             buffer_index += (len + 1);
6892         }
6893         buffer[total_len - 1] = '\0';
6894         buffer_temp = buffer;
6895     }
6896 
6897     if (wal_at_entry(buffer_temp, cmd_type) != HI_SUCCESS) {
6898         if (buffer != NULL) {
6899             oal_free(buffer);
6900         }
6901         return HI_ERR_FAILURE;
6902     }
6903 
6904     if (buffer != NULL) {
6905         oal_free(buffer);
6906     }
6907     return HI_ERR_SUCCESS;
6908 }
6909 #endif
6910 
6911 #ifdef _PRE_WLAN_FEATURE_MFG_TEST
6912 /* ****************************************************************************
6913  功能描述  : 对各band做平均功率补偿,传递补偿事件给hmac
6914  输入参数  : [1]band_num band序号
6915              [2]offset 功率补偿值
6916  输出参数  : 无
6917  返 回 值  : 对各band做平均功率补偿,传递补偿事件给hmac 是否成功的结果
6918 **************************************************************************** */
wal_set_cal_band_power(hi_u8 band_num,hi_s32 offset)6919 hi_u32 wal_set_cal_band_power(hi_u8 band_num, hi_s32 offset)
6920 {
6921     wal_msg_write_stru write_msg;
6922     mac_cfg_cal_bpower *cal_bpower = HI_NULL;
6923 
6924     oal_net_device_stru *netdev = oal_get_netdev_by_name(WLAN_CFG_VAP_NAME);
6925     if (netdev == HI_NULL) {
6926         oam_error_log0(0, 0, "wal_set_cal_band_power:Hisilicon0 device not found.");
6927         return HI_FAIL;
6928     }
6929     /* 低功耗状态下不允许执行 */
6930     if (is_under_ps()) {
6931         oam_warning_log0(0, 0, "under ps mode,can not exec cmd");
6932         return HI_FAIL;
6933     }
6934 #if (_PRE_OS_VERSION_LINUX == _PRE_OS_VERSION)
6935     oal_dev_put(netdev);
6936 #endif
6937     if ((offset > CAL_BAND_POWER_OFFSET_MAX) || (offset < CAL_BAND_POWER_OFFSET_MIN)) {
6938         return HI_FAIL;
6939     }
6940 
6941     /* **************************************************************************
6942                              抛事件到wal层处理
6943     ************************************************************************** */
6944     wal_write_msg_hdr_init(&write_msg, WLAN_CFGID_CAL_BAND_POWER, sizeof(mac_cfg_cal_bpower));
6945 
6946     /* 解析并设置配置命令参数 */
6947     cal_bpower = (mac_cfg_cal_bpower *)(write_msg.auc_value);
6948     cal_bpower->band_num = band_num;
6949     cal_bpower->offset   = offset;
6950 
6951     hi_u32 ret = wal_send_cfg_event(netdev, WAL_MSG_TYPE_WRITE,
6952         WAL_MSG_WRITE_MSG_HDR_LENGTH + sizeof(mac_cfg_cal_bpower), (hi_u8 *)&write_msg, HI_FALSE, HI_NULL);
6953     if (ret != HI_SUCCESS) {
6954         oam_warning_log1(0, OAM_SF_ANY, "{wal_set_cal_band_power:: wal_send_cfg_event return Err=%u}", ret);
6955     }
6956     return ret;
6957 }
6958 
wal_hipriv_set_cal_band_power(oal_net_device_stru * netdev,hi_char * pc_param)6959 hi_u32 wal_hipriv_set_cal_band_power(oal_net_device_stru *netdev, hi_char *pc_param)
6960 {
6961     hi_unref_param(netdev);
6962     hi_u32             ret;
6963     hi_char            ac_name[WAL_HIPRIV_CMD_NAME_MAX_LEN] = {0};
6964     hi_u32             off_set;
6965     hi_u8              band_num;
6966     hi_s32             offset;
6967 
6968     ret = wal_get_cmd_one_arg(pc_param, ac_name, WAL_HIPRIV_CMD_NAME_MAX_LEN, &off_set);
6969     if (ret != HI_SUCCESS) {
6970         oam_warning_log1(0, OAM_SF_CFG, "{wal_hipriv_set_cal_band_power::wal_get_cmd_one_arg return err_code %d!}\r\n",
6971             ret);
6972         return ret;
6973     }
6974     pc_param += off_set;
6975 
6976     band_num = (hi_u8)oal_atoi(ac_name);
6977     ret = wal_get_cmd_one_arg(pc_param, ac_name, WAL_HIPRIV_CMD_NAME_MAX_LEN, &off_set);
6978     if (ret != HI_SUCCESS) {
6979         oam_warning_log1(0, OAM_SF_CFG, "{wal_hipriv_set_cal_band_power::wal_get_cmd_one_arg return err_code %d!}\r\n",
6980             ret);
6981         return ret;
6982     }
6983 
6984     offset = (hi_s32)oal_atoi(ac_name);
6985     ret = wal_set_cal_band_power(band_num, offset);
6986     if (ret != HI_SUCCESS) {
6987         return HI_FAIL;
6988     }
6989     return HI_SUCCESS;
6990 }
6991 
6992 /* ****************************************************************************
6993  功能描述  : 对不同协议场景、不用速率分别做功率补偿,传递补偿事件给hmac
6994  输入参数  : [1]protol 协议序号
6995              [2]rate 速率
6996              [3]val 补偿值
6997  输出参数  : 无
6998  返 回 值  : 对不同协议场景、不用速率分别做功率补偿,传递补偿事件给hmac 是否成功的结果
6999 **************************************************************************** */
wal_set_cal_rate_power(hi_u8 protol,hi_u8 rate,hi_s32 val)7000 hi_u32 wal_set_cal_rate_power(hi_u8 protol, hi_u8 rate, hi_s32 val)
7001 {
7002     wal_msg_write_stru write_msg;
7003     mac_cfg_cal_rpower *cal_rpower = HI_NULL;
7004 
7005     oal_net_device_stru *netdev = oal_get_netdev_by_name(WLAN_CFG_VAP_NAME);
7006     if (netdev == HI_NULL) {
7007         oam_error_log0(0, 0, "wal_set_cal_rate_power:Hisilicon0 device not found.");
7008         return HI_FAIL;
7009     }
7010 #if (_PRE_OS_VERSION_LINUX == _PRE_OS_VERSION)
7011     oal_dev_put(netdev);
7012 #endif
7013 
7014     /* 低功耗状态下不允许执行 */
7015     if (is_under_ps()) {
7016         oam_warning_log0(0, 0, "under ps mode,can not exec cmd");
7017         return HI_FAIL;
7018     }
7019     /* **************************************************************************
7020                              抛事件到wal层处理
7021     ************************************************************************** */
7022     wal_write_msg_hdr_init(&write_msg, WLAN_CFGID_CAL_RATE_POWER, sizeof(mac_cfg_cal_rpower));
7023 
7024     /* 解析并设置配置命令参数 */
7025     cal_rpower = (mac_cfg_cal_rpower *)(write_msg.auc_value);
7026     cal_rpower->protol = protol;
7027     cal_rpower->rate   = rate;
7028     cal_rpower->val    = val;
7029 
7030     hi_u32 ret = wal_send_cfg_event(netdev, WAL_MSG_TYPE_WRITE,
7031         WAL_MSG_WRITE_MSG_HDR_LENGTH + sizeof(mac_cfg_cal_rpower), (hi_u8 *)&write_msg, HI_FALSE, HI_NULL);
7032     if (ret != HI_SUCCESS) {
7033         oam_warning_log1(0, OAM_SF_ANY, "{wal_set_cal_rate_power:: wal_send_cfg_event return Err=%u}", ret);
7034     }
7035     return ret;
7036 }
7037 
7038 /* ****************************************************************************
7039  功能描述  : 对不同协议场景、不用速率分别做功率补偿,at命令进行补偿参数校验.供产测用
7040  输入参数  : [1]argc 命令参数个数
7041              [2]argv 参数指针
7042  输出参数  : 无
7043  返 回 值  : 对不同协议场景、不用速率分别做功率补偿,at命令进行补偿参数校验 是否成功的结果
7044 **************************************************************************** */
wal_hipriv_set_cal_rate_power(oal_net_device_stru * netdev,hi_char * pc_param)7045 hi_u32 wal_hipriv_set_cal_rate_power(oal_net_device_stru *netdev, hi_char *pc_param)
7046 {
7047     hi_unref_param(netdev);
7048     hi_u32             ret;
7049     hi_char            ac_name[WAL_HIPRIV_CMD_NAME_MAX_LEN] = {0};
7050     hi_u32             off_set;
7051     hi_u8              protol;
7052     hi_u8              rate;
7053     hi_s32             val;
7054     hi_u8  ofs = 0;
7055     hi_u8  protol_ofs = 0;
7056     hi_s32 low_limit = -8;    /* -8:产测命令下限 */
7057     hi_s32 up_limit =  7;     /* 7:产测命令上限 */
7058 
7059     ret = wal_get_cmd_one_arg(pc_param, ac_name, WAL_HIPRIV_CMD_NAME_MAX_LEN, &off_set);
7060     if (ret != HI_SUCCESS) {
7061         oam_warning_log1(0, OAM_SF_CFG, "{wal_hipriv_set_cal_rate_power::wal_get_cmd_one_arg return err_code %d!}\r\n",
7062             ret);
7063         return ret;
7064     }
7065     pc_param += off_set;
7066     protol = (hi_u8)oal_atoi(ac_name);
7067     ret = wal_get_cmd_one_arg(pc_param, ac_name, WAL_HIPRIV_CMD_NAME_MAX_LEN, &off_set);
7068     if (ret != HI_SUCCESS) {
7069         oam_warning_log1(0, OAM_SF_CFG, "{wal_hipriv_set_cal_rate_power::wal_get_cmd_one_arg return err_code %d!}\r\n",
7070             ret);
7071         return ret;
7072     }
7073     pc_param += off_set;
7074     rate = (hi_u8)oal_atoi(ac_name);
7075     ret = wal_get_cmd_one_arg(pc_param, ac_name, WAL_HIPRIV_CMD_NAME_MAX_LEN, &off_set);
7076     if (ret != HI_SUCCESS) {
7077         oam_warning_log1(0, OAM_SF_CFG, "{wal_hipriv_set_cal_rate_power::wal_get_cmd_one_arg return err_code %d!}\r\n",
7078             ret);
7079         return ret;
7080     }
7081     pc_param += off_set;
7082     val = (hi_s32)oal_atoi(ac_name);
7083     if (protol > 2) { /* 范围0~2 */
7084         return HI_FAIL;
7085     }
7086 
7087     if (((protol == HI_WIFI_MODE_11BGN) && (rate > 7 + ofs)) || /* 11n范围0~7 */
7088         ((protol == HI_WIFI_MODE_11BG) && (rate > 7 + ofs)) ||  /* 11g范围0~7 */
7089         ((protol == HI_WIFI_MODE_11B) && (rate > 3 + ofs))) { /* 11b范围0~3 */
7090         return HI_ERR_FAILURE;
7091     }
7092 
7093     if ((val < low_limit) || (val > up_limit)) {
7094         return HI_FAIL;
7095     }
7096 
7097     protol += protol_ofs; /* 协议增加偏移区分是研发调试还是产测命令 */
7098     ret = wal_set_cal_rate_power(protol, rate, val);
7099     if (ret != HI_SUCCESS) {
7100         return HI_FAIL;
7101     }
7102     return HI_SUCCESS;
7103 }
7104 
7105 /* ****************************************************************************
7106  功能描述  : 对不同协议场景、不用速率分别做功率补偿,供客户研发调试用,不写efuse
7107  输入参数  : [1]argc 命令参数个数
7108              [2]argv 参数指针
7109  输出参数  : 无
7110  返 回 值  : 对不同协议场景、不用速率分别做功率补偿,at命令进行补偿参数校验 是否成功的结果
7111 **************************************************************************** */
wal_hipriv_set_rate_power(oal_net_device_stru * netdev,hi_char * pc_param)7112 hi_u32 wal_hipriv_set_rate_power(oal_net_device_stru *netdev, hi_char *pc_param)
7113 {
7114     hi_unref_param(netdev);
7115     hi_u32             ret;
7116     hi_char            ac_name[WAL_HIPRIV_CMD_NAME_MAX_LEN] = {0};
7117     hi_u32             off_set;
7118     hi_u8              protol;
7119     hi_u8              rate;
7120     hi_s32             val;
7121     hi_u8  ofs = 1;
7122     hi_u8  protol_ofs = 10;   /* 10:本命令的偏移,以便与产测的at_hi_wifi_set_rate_power做区分 */
7123     hi_s32 low_limit = -100;  /* -100:调试命令下限 */
7124     hi_s32 up_limit = 40;     /* 40:调试命令上限 */
7125 
7126     /* 低功耗状态下不允许执行 */
7127     if (is_under_ps()) {
7128         oam_warning_log0(0, 0, "under ps mode,can not exec cmd");
7129         return HI_FAIL;
7130     }
7131     ret = wal_get_cmd_one_arg(pc_param, ac_name, WAL_HIPRIV_CMD_NAME_MAX_LEN, &off_set);
7132     if (ret != HI_SUCCESS) {
7133         oam_warning_log1(0, OAM_SF_CFG, "{wal_hipriv_set_rate_power::wal_get_cmd_one_arg return err_code %d!}\r\n",
7134             ret);
7135         return ret;
7136     }
7137     pc_param += off_set;
7138     protol = (hi_u8)oal_atoi(ac_name);
7139     ret = wal_get_cmd_one_arg(pc_param, ac_name, WAL_HIPRIV_CMD_NAME_MAX_LEN, &off_set);
7140     if (ret != HI_SUCCESS) {
7141         oam_warning_log1(0, OAM_SF_CFG, "{wal_hipriv_set_rate_power::wal_get_cmd_one_arg return err_code %d!}\r\n",
7142             ret);
7143         return ret;
7144     }
7145     pc_param += off_set;
7146     rate = (hi_u8)oal_atoi(ac_name);
7147     ret = wal_get_cmd_one_arg(pc_param, ac_name, WAL_HIPRIV_CMD_NAME_MAX_LEN, &off_set);
7148     if (ret != HI_SUCCESS) {
7149         oam_warning_log1(0, OAM_SF_CFG, "{wal_hipriv_set_rate_power::wal_get_cmd_one_arg return err_code %d!}\r\n",
7150             ret);
7151         return ret;
7152     }
7153     pc_param += off_set;
7154     val = (hi_s32)oal_atoi(ac_name);
7155     if (protol > 2) { /* 范围0~2 */
7156         return HI_FAIL;
7157     }
7158 
7159     if (((protol == HI_WIFI_MODE_11BGN) && (rate > 7 + ofs)) || /* 11n范围0~7 */
7160         ((protol == HI_WIFI_MODE_11BG) && (rate > 7 + ofs)) ||  /* 11g范围0~7 */
7161         ((protol == HI_WIFI_MODE_11B) && (rate > 3 + ofs))) { /* 11b范围0~3 */
7162         return HI_ERR_FAILURE;
7163     }
7164 
7165     if ((val < low_limit) || (val > up_limit)) {
7166         return HI_FAIL;
7167     }
7168 
7169     protol += protol_ofs; /* 协议增加偏移区分是研发调试还是产测命令 */
7170     ret = wal_set_cal_rate_power(protol, rate, val);
7171     if (ret != HI_SUCCESS) {
7172         return HI_FAIL;
7173     }
7174     return HI_SUCCESS;
7175 }
7176 
7177 /* ****************************************************************************
7178  功能描述  : 进行常温频偏功率补偿,传递补偿事件给hmac
7179  输入参数  : [1]freq_offset 补偿值
7180  输出参数  : 无
7181  返 回 值  : 进行常温频偏功率补偿,传递补偿事件给hmac 是否成功的结果
7182 **************************************************************************** */
wal_set_cal_freq(hi_s32 freq_offset)7183 hi_u32 wal_set_cal_freq(hi_s32 freq_offset)
7184 {
7185     wal_msg_write_stru write_msg;
7186     hi_s32            *param = HI_NULL;
7187 
7188     /* 低功耗状态下不允许执行 */
7189     if (is_under_ps()) {
7190         oam_warning_log0(0, 0, "under ps mode,can not exec cmd");
7191         return HI_FAIL;
7192     }
7193     oal_net_device_stru *netdev = oal_get_netdev_by_name(WLAN_CFG_VAP_NAME);
7194     if (netdev == HI_NULL) {
7195         oam_error_log0(0, 0, "wal_set_cal_freq:Hisilicon0 device not found.");
7196         return HI_FAIL;
7197     }
7198 #if (_PRE_OS_VERSION_LINUX == _PRE_OS_VERSION)
7199     oal_dev_put(netdev);
7200 #endif
7201     if ((freq_offset > CAL_FREP_OFFSET_MAX) || (freq_offset < CAL_FREP_OFFSET_MIN)) {
7202         return HI_FAIL;
7203     }
7204 
7205     /* **************************************************************************
7206                              抛事件到wal层处理
7207     ************************************************************************** */
7208     wal_write_msg_hdr_init(&write_msg, WLAN_CFGID_CAL_FREQ, sizeof(hi_s32));
7209     /* 解析并设置配置命令参数 */
7210     param = (hi_s32 *)(write_msg.auc_value);
7211     *param = freq_offset;
7212 
7213     hi_u32 ret = wal_send_cfg_event(netdev, WAL_MSG_TYPE_WRITE, WAL_MSG_WRITE_MSG_HDR_LENGTH + sizeof(hi_s32),
7214         (hi_u8 *)&write_msg, HI_FALSE, HI_NULL);
7215     if (ret != HI_SUCCESS) {
7216         oam_warning_log1(0, OAM_SF_ANY, "{wal_set_cal_freq:: wal_send_cfg_event return Err=%u}", ret);
7217     }
7218     return ret;
7219 }
7220 
wal_hipriv_set_cal_freq_power(oal_net_device_stru * netdev,hi_char * pc_param)7221 hi_u32 wal_hipriv_set_cal_freq_power(oal_net_device_stru *netdev, hi_char *pc_param)
7222 {
7223     hi_unref_param(netdev);
7224     hi_u32             ret;
7225     hi_char            ac_name[WAL_HIPRIV_CMD_NAME_MAX_LEN] = {0};
7226     hi_s32             freq_offset;
7227     hi_u32             off_set;
7228 
7229     /* 低功耗状态下不允许执行 */
7230     if (is_under_ps()) {
7231         oam_warning_log0(0, 0, "under ps mode,can not exec cmd");
7232         return HI_FAIL;
7233     }
7234     ret = wal_get_cmd_one_arg(pc_param, ac_name, WAL_HIPRIV_CMD_NAME_MAX_LEN, &off_set);
7235     if (ret != HI_SUCCESS) {
7236         oam_warning_log1(0, OAM_SF_CFG, "{wal_hipriv_set_cal_freq_power::wal_get_cmd_one_arg return err_code %d!}\r\n",
7237             ret);
7238         return ret;
7239     }
7240 
7241     freq_offset = (hi_s32)oal_atoi(ac_name);
7242     ret = wal_set_cal_freq(freq_offset);
7243     if (ret != HI_SUCCESS) {
7244         return HI_FAIL;
7245     }
7246     return HI_SUCCESS;
7247 }
7248 
7249 /* ****************************************************************************
7250  功能描述  : 读取efuse的MAC
7251  返 回 值  : 错误码
7252 **************************************************************************** */
wal_get_efuse_mac(hi_void)7253 hi_u32 wal_get_efuse_mac(hi_void)
7254 {
7255     oal_net_device_stru *netdev;
7256     wal_msg_write_stru  write_msg = {0};
7257 
7258     netdev = oal_get_netdev_by_name(WLAN_CFG_VAP_NAME);
7259     if (netdev == HI_NULL) {
7260         oam_error_log0(0, 0, "wal_get_efuse_mac::sta device not found.");
7261         return HI_FAIL;
7262     }
7263 #if (_PRE_OS_VERSION_LINUX == _PRE_OS_VERSION)
7264     oal_dev_put(netdev);
7265 #endif
7266     /* **************************************************************************
7267                                 抛事件到wal层处理
7268     ************************************************************************** */
7269     wal_write_msg_hdr_init(&write_msg, WLAN_CFGID_GET_EFUSE_MAC, sizeof(hi_s32));
7270 
7271     hi_u32 ret = wal_send_cfg_event(netdev, WAL_MSG_TYPE_WRITE, WAL_MSG_WRITE_MSG_HDR_LENGTH + sizeof(hi_s32),
7272         (hi_u8 *)(&write_msg), HI_FALSE, HI_NULL);
7273     if (oal_unlikely(ret != HI_SUCCESS)) {
7274         oam_warning_log1(0, OAM_SF_ANY, "{wal_get_efuse_mac::return err code [%u]!}\r\n", ret);
7275     }
7276 
7277     return ret;
7278 }
7279 
wal_hipriv_get_customer_mac(oal_net_device_stru * netdev,hi_char * pc_param)7280 hi_u32 wal_hipriv_get_customer_mac(oal_net_device_stru *netdev, hi_char *pc_param)
7281 {
7282     hi_unref_param(pc_param);
7283     hi_unref_param(netdev);
7284     hi_u32             ret;
7285     hi_uchar           mac_addr[WLAN_MAC_ADDR_LEN] = {0};
7286 
7287     /* 优先检查返回wifi_cfg中的mac地址 */
7288     if (cfg_get_mac(mac_addr, WLAN_MAC_ADDR_LEN) && (wal_macaddr_check(&mac_addr[0]) == HI_SUCCESS)) {
7289         printk("+EFUSEMAC:XX:XX:XX:%02x:%02x:%02x\r\nOK\r\n", mac_addr[3], mac_addr[4], mac_addr[5]); /* 0:1:2:3:4:5 */
7290         return HI_SUCCESS;
7291     }
7292     /* 从efuse读 */
7293     ret = wal_get_efuse_mac();
7294     if (ret != HI_SUCCESS) {
7295         return HI_FAIL;
7296     }
7297     return HI_SUCCESS;
7298 }
7299 
7300 /* ****************************************************************************
7301  功能描述  : 将MAC写入efuse
7302  返 回 值  : 错误码
7303 **************************************************************************** */
wal_set_efuse_mac(const hi_char * mac_addr,hi_u32 type)7304 hi_u32 wal_set_efuse_mac(const hi_char *mac_addr, hi_u32 type)
7305 {
7306     hi_unref_param(type);
7307     wal_msg_write_stru  write_msg;
7308     oal_net_device_stru *netdev;
7309 
7310     netdev = oal_get_netdev_by_name(WLAN_CFG_VAP_NAME);
7311     if (netdev == HI_NULL) {
7312         oam_error_log0(0, 0, "wal_set_efuse_mac::sta device not found.");
7313         return HI_FAIL;
7314     }
7315 #if (_PRE_OS_VERSION_LINUX == _PRE_OS_VERSION)
7316     oal_dev_put(netdev);
7317 #endif
7318     if (mac_addr == HI_NULL) {
7319         oam_error_log0(0, OAM_SF_ANY, "wal_set_efuse_mac:: macaddr is NULL!");
7320         return HI_FAIL;
7321     }
7322     /* 设置配置命令参数 */
7323     if (memcpy_s(write_msg.auc_value, ETHER_ADDR_LEN, mac_addr, ETHER_ADDR_LEN) != EOK) {
7324         oam_error_log0(0, 0, "{wal_set_efuse_mac::mem safe function err!}");
7325         return HI_FAIL;
7326     }
7327     /* **************************************************************************
7328                                 抛事件到wal层处理
7329     ************************************************************************** */
7330     wal_write_msg_hdr_init(&write_msg, WLAN_CFGID_SET_EFUSE_MAC, ETHER_ADDR_LEN);
7331 
7332     hi_u32 ret = wal_send_cfg_event(netdev, WAL_MSG_TYPE_WRITE, WAL_MSG_WRITE_MSG_HDR_LENGTH + ETHER_ADDR_LEN,
7333         (hi_u8 *)(&write_msg), HI_FALSE, HI_NULL);
7334     if (oal_unlikely(ret != HI_SUCCESS)) {
7335         oam_warning_log1(0, OAM_SF_ANY, "{wal_set_efuse_mac::return err code [%u]!}\r\n", ret);
7336     }
7337     return ret;
7338 }
7339 
wal_hipriv_set_customer_mac(oal_net_device_stru * netdev,hi_char * pc_param)7340 hi_u32 wal_hipriv_set_customer_mac(oal_net_device_stru *netdev, hi_char *pc_param)
7341 {
7342     hi_unref_param(netdev);
7343     hi_u32             ret;
7344     hi_uchar           mac_addr[WLAN_MAC_ADDR_LEN];
7345     hi_char            ac_name[WAL_HIPRIV_CMD_NAME_MAX_LEN] = {0};
7346     hi_char            mac_str[WAL_HIPRIV_CMD_NAME_MAX_LEN] = {0};
7347     hi_u32             off_set;
7348     hi_u32             type = 0;
7349 
7350     /* 获取mac地址 */
7351     ret = wal_get_cmd_one_arg(pc_param, mac_str, WAL_HIPRIV_CMD_NAME_MAX_LEN, &off_set);
7352     if (ret != HI_SUCCESS) {
7353         oam_warning_log1(0, OAM_SF_ANY, "{wal_hipriv_set_customer_mac::wal_get_cmd_one_arg return err_code [%d]!}\r\n",
7354             ret);
7355         return ret;
7356     }
7357     pc_param += off_set;
7358     if (!parse_mac_addr((hi_u8 *)mac_str, strlen((const hi_char *)mac_str), mac_addr, WLAN_MAC_ADDR_LEN) ||
7359         (wal_macaddr_check(mac_addr) != HI_SUCCESS)) {
7360         printk("Mac addr is invalid.\r\n");
7361         return HI_FAIL;
7362     };
7363     hi_u8 mac_str_len = off_set;
7364     ret = wal_get_cmd_one_arg(pc_param, ac_name, WAL_HIPRIV_CMD_NAME_MAX_LEN, &off_set);
7365     if (ret == HI_SUCCESS) {
7366         type = (hi_u32)oal_atoi(ac_name);
7367     }
7368     pc_param += off_set;
7369     /* 配置为写入到wifi_cfg */
7370     if (type == 1) {
7371         if (firmware_write_cfg((hi_u8 *)WIFI_CFG_MAC, (hi_u8 *)mac_str, mac_str_len - 1) != HI_SUCCESS) { /* 减1 */
7372             oam_error_log0(0, OAM_SF_ANY, "wal_hipriv_set_customer_mac:: save to wifi_cfg failed!");
7373             return HI_FAIL;
7374         }
7375         printk("OK\r\n");
7376         return HI_SUCCESS;
7377     } else if (type == 0) { /* 配置为写入到efuse */
7378         ret = wal_set_efuse_mac((hi_char *)mac_addr, type);
7379         if (ret != HI_SUCCESS) {
7380             return HI_FAIL;
7381         }
7382     } else {
7383         oam_error_log0(0, OAM_SF_ANY, "wal_hipriv_set_customer_mac:: cmd para invalid!");
7384         return HI_FAIL;
7385     }
7386 
7387     return HI_SUCCESS;
7388 }
7389 
7390 /* ****************************************************************************
7391  功能描述  : 将校准值写入efuse
7392  返 回 值  : 错误码
7393 **************************************************************************** */
wal_set_dataefuse(hi_u32 type)7394 hi_u32 wal_set_dataefuse(hi_u32 type)
7395 {
7396     oal_net_device_stru *netdev;
7397     wal_msg_write_stru  write_msg = {0};
7398     hi_s32            *param = HI_NULL;
7399 
7400     netdev = oal_get_netdev_by_name(WLAN_CFG_VAP_NAME);
7401     if (netdev == HI_NULL) {
7402         oam_error_log0(0, 0, "wal_set_dataefuse::sta device not found.");
7403         return HI_FAIL;
7404     }
7405 #if (_PRE_OS_VERSION_LINUX == _PRE_OS_VERSION)
7406     oal_dev_put(netdev);
7407 #endif
7408     /* 解析并设置配置命令参数 */
7409     param = (hi_s32 *)(write_msg.auc_value);
7410     *param = type;
7411 
7412     /* **************************************************************************
7413                                 抛事件到wal层处理
7414     ************************************************************************** */
7415     wal_write_msg_hdr_init(&write_msg, WLAN_CFGID_SET_DATAEFUSE, sizeof(hi_s32));
7416 
7417     hi_u32 ret = wal_send_cfg_event(netdev, WAL_MSG_TYPE_WRITE, WAL_MSG_WRITE_MSG_HDR_LENGTH + sizeof(hi_s32),
7418         (hi_u8 *)(&write_msg), HI_FALSE, HI_NULL);
7419     if (oal_unlikely(ret != HI_SUCCESS)) {
7420         oam_warning_log1(0, OAM_SF_ANY, "{hi_wifi_set_dataefuse::return err code [%u]!}\r\n", ret);
7421     }
7422     return ret;
7423 }
7424 
wal_hipriv_set_dataefuse(oal_net_device_stru * netdev,hi_char * pc_param)7425 hi_u32 wal_hipriv_set_dataefuse(oal_net_device_stru *netdev, hi_char *pc_param)
7426 {
7427     hi_unref_param(netdev);
7428     hi_unref_param(pc_param);
7429     hi_u32              ret;
7430     hi_u32             off_set;
7431     hi_u32             type = 0;
7432     hi_char            ac_name[WAL_HIPRIV_CMD_NAME_MAX_LEN] = {0};
7433 
7434     ret = wal_get_cmd_one_arg(pc_param, ac_name, WAL_HIPRIV_CMD_NAME_MAX_LEN, &off_set);
7435     if (ret == HI_SUCCESS) {
7436         type = (hi_u32)oal_atoi(ac_name);
7437     }
7438 
7439     ret = wal_set_dataefuse(type);
7440     if (ret != HI_SUCCESS) {
7441         return HI_FAIL;
7442     }
7443     return HI_SUCCESS;
7444 }
7445 
7446 /* ****************************************************************************
7447  功能描述  : 读取校准数据
7448  返 回 值  : 错误码
7449 **************************************************************************** */
wal_get_cal_data(hi_void)7450 hi_u32 wal_get_cal_data(hi_void)
7451 {
7452     oal_net_device_stru *netdev;
7453     wal_msg_write_stru  write_msg = {0};
7454     hi_u32              ret;
7455     netdev = oal_get_netdev_by_name(WLAN_CFG_VAP_NAME);
7456     if (netdev == HI_NULL) {
7457         oam_error_log0(0, 0, "wal_get_cal_data::sta device not found.");
7458         return HI_FAIL;
7459     }
7460 #if (_PRE_OS_VERSION_LINUX == _PRE_OS_VERSION)
7461     oal_dev_put(netdev);
7462 #endif
7463     /* **************************************************************************
7464                                 抛事件到wal层处理
7465     ************************************************************************** */
7466     wal_write_msg_hdr_init(&write_msg, WLAN_CFGID_GET_CAL_DATA, sizeof(hi_s32));
7467     ret = wal_send_cfg_event(netdev, WAL_MSG_TYPE_WRITE, WAL_MSG_WRITE_MSG_HDR_LENGTH + sizeof(hi_s32),
7468         (hi_u8 *)(&write_msg), HI_FALSE, HI_NULL);
7469     if (oal_unlikely(ret != HI_SUCCESS)) {
7470         oam_warning_log1(0, OAM_SF_ANY, "{wal_get_cal_data::return err code [%u]!}\r\n", ret);
7471         return ret;
7472     }
7473     return HI_SUCCESS;
7474 }
7475 
wal_hipriv_get_cal_data(oal_net_device_stru * netdev,hi_char * pc_param)7476 hi_u32 wal_hipriv_get_cal_data(oal_net_device_stru *netdev, hi_char *pc_param)
7477 {
7478     hi_unref_param(netdev);
7479     hi_u32 ret;
7480 
7481     /* 判断命令长度是否有问题 */
7482     if (*pc_param != '\0') {
7483         oam_warning_log0(0, OAM_SF_ANY, "{wal_hipriv_get_cal_data::cmd len error}");
7484         return HI_FAIL;
7485     }
7486     ret = wal_get_cal_data();
7487     if (ret != HI_SUCCESS) {
7488         return HI_FAIL;
7489     }
7490     return HI_SUCCESS;
7491 }
7492 #endif /* _PRE_WLAN_FEATURE_MFG_TEST */
7493 
hi_hipriv_set_tx_pwr_offset(oal_net_device_stru * netdev,hi_char * pc_param)7494 hi_u32 hi_hipriv_set_tx_pwr_offset(oal_net_device_stru *netdev, hi_char *pc_param)
7495 {
7496     wal_msg_write_stru          write_msg = {0};
7497     hi_s32                     *param = HI_NULL;
7498     hi_u32                      ret;
7499     hi_s16                      offset;
7500     hi_char                     ac_name[WAL_HIPRIV_CMD_NAME_MAX_LEN] = {0};
7501     hi_u32                  off_set;
7502     if (netdev == HI_NULL) {
7503         oam_error_log0(0, 0, "hi_wifi_set_tx_pwr_offset:: device not found.");
7504         return HI_FAIL;
7505     }
7506     /* 低功耗状态下不允许执行 */
7507     if (is_under_ps()) {
7508         oam_warning_log0(0, 0, "under ps mode,can not exec cmd");
7509         return HI_FAIL;
7510     }
7511 #if (_PRE_OS_VERSION_LINUX == _PRE_OS_VERSION)
7512     oal_dev_put(netdev);
7513 #endif
7514     ret = wal_get_cmd_one_arg(pc_param, ac_name, WAL_HIPRIV_CMD_NAME_MAX_LEN, &off_set);
7515     if (ret != HI_SUCCESS) {
7516         oam_warning_log1(0, OAM_SF_CFG, "{hi_hipriv_set_tx_pwr_offset::wal_get_cmd_one_arg return err_code %d!}\r\n",
7517             ret);
7518         return ret;
7519     }
7520 
7521 #if (_PRE_OS_VERSION_LITEOS == _PRE_OS_VERSION)
7522     offset = (hi_s16)atoi(ac_name);
7523 #elif (_PRE_OS_VERSION_LINUX == _PRE_OS_VERSION)
7524     offset = (hi_s16)oal_atoi(ac_name);
7525 #endif
7526     offset = (offset > 30) ? 30 : offset;     /* 30:上限 */
7527     offset = (offset < -150) ? -150 : offset; /* -150:下限 */
7528     /* 解析并设置配置命令参数 */
7529     param = (hi_s32 *)(write_msg.auc_value);
7530     *param = offset;
7531 
7532     /* **************************************************************************
7533                              抛事件到wal层处理
7534     ************************************************************************** */
7535     wal_write_msg_hdr_init(&write_msg, WLAN_CFGID_SET_TX_PWR_OFFSET, sizeof(hi_s32));
7536     ret = wal_send_cfg_event(netdev, WAL_MSG_TYPE_WRITE, WAL_MSG_WRITE_MSG_HDR_LENGTH + sizeof(hi_s32),
7537         (hi_u8 *)&write_msg, HI_FALSE, HI_NULL);
7538     if (oal_unlikely(ret != HI_SUCCESS)) {
7539         oam_warning_log1(0, OAM_SF_ANY, "{hi_wifi_set_tx_pwr_offset::return err code [%u]!}\r\n", ret);
7540         return ret;
7541     }
7542     return HI_SUCCESS;
7543 }
7544 
7545 #endif /* #ifdef _PRE_WLAN_FEATURE_HIPRIV */
7546 
7547 #ifdef __cplusplus
7548 #if __cplusplus
7549 }
7550 #endif
7551 #endif
7552