• 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_ioctl.h"
27 #include "wal_event_msg.h"
28 #include "wal_hipriv.h"
29 #include "net_adpater.h"
30 #include "wal_11d.h"
31 
32 #include "wal_customize.h"
33 
34 #if (_PRE_MULTI_CORE_MODE_OFFLOAD_DMAC == _PRE_MULTI_CORE_MODE)
35 #endif
36 
37 #if (_PRE_OS_VERSION_LITEOS == _PRE_OS_VERSION)
38 #include "lwip/netifapi.h"
39 #endif
40 #ifdef _PRE_WLAN_FEATURE_ANY
41 #include "hi_any_api.h"
42 #endif
43 
44 #ifdef __cplusplus
45 #if __cplusplus
46 extern "C" {
47 #endif
48 #endif
49 
50 #define MAX_PRIV_CMD_SIZE 4096
51 
52 /* ****************************************************************************
53   私有命令函数表. 私有命令格式:
54          设备名 命令名 参数
55   hipriv "Hisilicon0 create vap0"
56 **************************************************************************** */
57 #define CMD_SET_AP_WPS_P2P_IE   "SET_AP_WPS_P2P_IE"
58 #define CMD_P2P_SET_NOA         "P2P_SET_NOA"
59 #define CMD_P2P_SET_PS          "P2P_SET_PS"
60 #define CMD_SET_POWER_ON        "SET_POWER_ON"
61 #define CMD_SET_POWER_MGMT_ON   "SET_POWER_MGMT_ON"
62 #define CMD_COUNTRY             "COUNTRY"
63 #define CMD_SET_QOS_MAP         "SET_QOS_MAP"
64 #define CMD_TX_POWER            "TX_POWER"
65 #define CMD_WPAS_GET_CUST       "WPAS_GET_CUST"
66 #define CMD_SET_SSID            "SET_SSID"
67 
68 /* ****************************************************************************
69   结构体定义
70 **************************************************************************** */
71 #if (_PRE_OS_VERSION_LINUX == _PRE_OS_VERSION)
72 typedef struct {
73     hi_u32   ap_max_user;                      /* ap最大用户数 */
74     hi_char  ac_ap_mac_filter_mode[257];          /* AP mac地址过滤命令参数,最长257 */
75     hi_s32   ap_power_flag;                     /* AP上电标志 */
76 } wal_ap_config_stru;
77 #endif /* #if (_PRE_OS_VERSION_LINUX == _PRE_OS_VERSION) */
78 
79 /* ****************************************************************************
80   2 函数声明
81 **************************************************************************** */
82 /* 静态函数声明 */
83 #if (_PRE_OS_VERSION_LINUX == _PRE_OS_VERSION)
84 static hi_u32 wal_ioctl_get_mode(oal_net_device_stru *netdev, hi_s8 *pc_param);
85 static hi_u32 wal_ioctl_get_essid(oal_net_device_stru *netdev, hi_s8 *pc_param);
86 static hi_u32 wal_ioctl_get_bss_type(oal_net_device_stru *netdev, hi_s8 *pc_param);
87 static hi_u32 wal_ioctl_set_bss_type(oal_net_device_stru *netdev, hi_s8 *pc_param);
88 static hi_u32 wal_ioctl_get_freq(oal_net_device_stru *netdev, hi_s8 *pc_param);
89 static hi_u32 wal_ioctl_get_txpower(oal_net_device_stru *netdev, hi_s8 *pc_param);
90 static hi_u32 wal_ioctl_get_apaddr(oal_net_device_stru *netdev, oal_iw_request_info_stru *info,
91                                    oal_sockaddr_stru *addr, hi_s8 *pc_extra);
92 static hi_u32 wal_ioctl_get_iwrate(oal_net_device_stru *netdev, oal_iw_request_info_stru *info,
93     oal_iw_param_stru *param, hi_s8 *pc_extra);
94 static hi_u32 wal_ioctl_get_iwsense(oal_net_device_stru *netdev, oal_iw_request_info_stru *info,
95     oal_iw_param_stru *param, hi_s8 *pc_extra);
96 static hi_u32 wal_ioctl_get_rtsthres(oal_net_device_stru *netdev, oal_iw_request_info_stru *info,
97     oal_iw_param_stru *param, hi_s8 *pc_extra);
98 static hi_u32 wal_ioctl_get_fragthres(oal_net_device_stru *netdev, oal_iw_request_info_stru *info,
99     oal_iw_param_stru *param, hi_s8 *pc_extra);
100 static hi_u32 wal_ioctl_get_iwencode(oal_net_device_stru *netdev, oal_iw_request_info_stru *info,
101     oal_iw_point_stru *param, hi_s8 *pc_extra);
102 static hi_u32 wal_ioctl_get_iwrange(oal_net_device_stru *netdev, oal_iw_request_info_stru *info,
103     oal_iw_point_stru *param, hi_s8 *pc_extra);
104 static hi_u32 wal_ioctl_get_param(oal_net_device_stru *netdev, oal_iw_request_info_stru *info, hi_void *iw,
105     hi_s8 *pc_extra);
106 static hi_u32 wal_ioctl_set_param(oal_net_device_stru *netdev, oal_iw_request_info_stru *info, hi_void *iw,
107     hi_s8 *pc_extra);
108 static hi_u32 wal_ioctl_get_iwname(oal_net_device_stru *netdev, oal_iw_request_info_stru *info, hi_s8 *pc_name,
109     hi_s8 *pc_extra);
110 static hi_s32 wal_ioctl_set_wme_params(oal_net_device_stru *netdev, oal_iw_request_info_stru *info, hi_void *iw,
111     hi_s8 *pc_extra);
112 static hi_u32 wal_ioctl_get_wme_params(oal_net_device_stru *netdev, oal_iw_request_info_stru *info, hi_void *iw,
113     hi_s8 *pc_extra);
114 static hi_u32 wal_ioctl_setcountry(oal_net_device_stru *netdev, oal_iw_request_info_stru *info, hi_void *w,
115     hi_s8 *pc_extra);
116 static hi_u32 wal_ioctl_getcountry(oal_net_device_stru *netdev, oal_iw_request_info_stru *info, hi_void *w,
117     hi_s8 *pc_extra);
118 static hi_u32 wal_ioctl_reduce_sar(oal_net_device_stru *netdev, hi_u8 tx_power);
119 static hi_s32 wal_ioctl_set_ap_config(oal_net_device_stru *netdev, oal_iw_request_info_stru *info,
120     oal_iwreq_data_union *wrqu, hi_s8 *pc_extra);
121 static hi_s32 wal_ioctl_get_assoc_list(oal_net_device_stru *netdev, oal_iw_request_info_stru *info,
122     oal_iwreq_data_union *wrqu, hi_s8 *pc_extra);
123 static hi_s32 wal_ioctl_set_mac_filters(oal_net_device_stru *netdev, oal_iw_request_info_stru *info,
124     oal_iwreq_data_union *wrqu, hi_s8 *pc_extra);
125 static hi_s32 wal_ioctl_set_ap_sta_disassoc(oal_net_device_stru *netdev, oal_iw_request_info_stru *info,
126     oal_iwreq_data_union *wrqu, hi_s8 *pc_extra);
127 #endif
128 
129 /* ****************************************************************************
130   2 全局变量定义
131 **************************************************************************** */
132 #if (_PRE_MULTI_CORE_MODE_OFFLOAD_DMAC == _PRE_MULTI_CORE_MODE) && (_PRE_OS_VERSION_LINUX == _PRE_OS_VERSION)
133 oal_ethtool_ops_stru g_wal_ethtool_ops = { 0 };
134 #endif
135 
136 #if (_PRE_OS_VERSION_LINUX == _PRE_OS_VERSION)
137 static wal_ap_config_stru g_st_ap_config_info = { 0 }; /* AP配置信息,需要在vap 创建后下发的 */
138 
139 /* ****************************************************************************
140   标准ioctl命令函数表.
141 **************************************************************************** */
142 static const oal_iw_handler g_ast_iw_handlers[] = {
143     HI_NULL,                                 /* SIOCSIWCOMMIT, */
144     (oal_iw_handler)wal_ioctl_get_iwname,    /* SIOCGIWNAME, */
145     HI_NULL,                                 /* SIOCSIWNWID, */
146     HI_NULL,                                 /* SIOCGIWNWID, */
147     (oal_iw_handler)wal_ioctl_set_freq,      /* SIOCSIWFREQ, 设置频点/信道 */
148     (oal_iw_handler)wal_ioctl_get_freq,      /* SIOCGIWFREQ, 获取频点/信道 */
149     (oal_iw_handler)wal_ioctl_set_bss_type,  /* SIOCSIWMODE, 设置bss type */
150     (oal_iw_handler)wal_ioctl_get_bss_type,  /* SIOCGIWMODE, 获取bss type */
151     HI_NULL,                                 /* SIOCSIWSENS, */
152     (oal_iw_handler)wal_ioctl_get_iwsense,   /* SIOCGIWSENS, */
153     HI_NULL, /* SIOCSIWRANGE, */             /* not used */
154     (oal_iw_handler)wal_ioctl_get_iwrange,   /* SIOCGIWRANGE, */
155     HI_NULL, /* SIOCSIWPRIV, */              /* not used */
156     HI_NULL, /* SIOCGIWPRIV, */              /* kernel code */
157     HI_NULL, /* SIOCSIWSTATS, */             /* not used */
158     HI_NULL,                                 /* SIOCGIWSTATS, */
159     HI_NULL,                                 /* SIOCSIWSPY, */
160     HI_NULL,                                 /* SIOCGIWSPY, */
161     HI_NULL,                                 /* -- hole -- */
162     HI_NULL,                                 /* -- hole -- */
163     HI_NULL,                                 /* SIOCSIWAP, */
164     (oal_iw_handler)wal_ioctl_get_apaddr,    /* SIOCGIWAP, */
165     HI_NULL,                                 /* SIOCSIWMLME, */
166     HI_NULL,                                 /* SIOCGIWAPLIST, */
167     HI_NULL,                                 /* SIOCSIWSCAN, */
168     HI_NULL,                                 /* SIOCGIWSCAN, */
169     (oal_iw_handler)wal_ioctl_set_essid,     /* SIOCSIWESSID, 设置ssid */
170     (oal_iw_handler)wal_ioctl_get_essid,     /* SIOCGIWESSID, 读取ssid */
171     HI_NULL,                                 /* SIOCSIWNICKN */
172     HI_NULL,                                 /* SIOCGIWNICKN */
173     HI_NULL,                                 /* -- hole -- */
174     HI_NULL,                                 /* -- hole -- */
175     HI_NULL,                                 /* SIOCSIWRATE */
176     (oal_iw_handler)wal_ioctl_get_iwrate,    /* SIOCGIWRATE */
177     HI_NULL,                                 /* SIOCSIWRTS */
178     (oal_iw_handler)wal_ioctl_get_rtsthres,  /* SIOCGIWRTS */
179     HI_NULL,                                 /* SIOCSIWFRAG */
180     (oal_iw_handler)wal_ioctl_get_fragthres, /* SIOCGIWFRAG */
181     (oal_iw_handler)wal_ioctl_set_txpower,   /* SIOCSIWTXPOW, 设置传输功率限制 */
182     (oal_iw_handler)wal_ioctl_get_txpower,   /* SIOCGIWTXPOW, 设置传输功率限制 */
183     HI_NULL,                                 /* SIOCSIWRETRY */
184     HI_NULL,                                 /* SIOCGIWRETRY */
185     HI_NULL,                                 /* SIOCSIWENCODE */
186     (oal_iw_handler)wal_ioctl_get_iwencode,  /* SIOCGIWENCODE */
187     HI_NULL,                                 /* SIOCSIWPOWER */
188     HI_NULL,                                 /* SIOCGIWPOWER */
189     HI_NULL,                                 /* -- hole -- */
190     HI_NULL,                                 /* -- hole -- */
191     HI_NULL,                                 /* SIOCSIWGENIE */
192     HI_NULL,                                 /* SIOCGIWGENIE */
193     HI_NULL,                                 /* SIOCSIWAUTH */
194     HI_NULL,                                 /* SIOCGIWAUTH */
195     HI_NULL,                                 /* SIOCSIWENCODEEXT */
196     HI_NULL                                  /* SIOCGIWENCODEEXT */
197 };
198 
199 /* ****************************************************************************
200   私有ioctl命令参数定义定义
201 **************************************************************************** */
202 #ifndef _PRE_HDF_LINUX
203 static const oal_iw_priv_args_stru g_ast_iw_priv_args[] = {
204     { WAL_IOCTL_PRIV_SET_MODE,       OAL_IW_PRIV_TYPE_CHAR | 24, 0, "mode" },         /* 参数类型是char, 个数为24 */
205     { WAL_IOCTL_PRIV_GET_MODE,       0, OAL_IW_PRIV_TYPE_CHAR | 24, "get_mode" },     /* 参数类型是char, 个数为24 */
206     { WAL_IOCTL_PRIV_SET_COUNTRY,    OAL_IW_PRIV_TYPE_CHAR | 3, 0,  "setcountry" }, /* 参数类型是char, 个数为3 */
207     { WAL_IOCTL_PRIV_GET_COUNTRY,    0, OAL_IW_PRIV_TYPE_CHAR | 3,  "getcountry" }, /* 参数类型是char, 个数为3 */
208 
209     { WAL_IOCTL_PRIV_SET_AP_CFG, OAL_IW_PRIV_TYPE_CHAR |  256, 0, "AP_SET_CFG" }, /* 参数类型是char, 个数为256 */
210     { WAL_IOCTL_PRIV_AP_MAC_FLTR, OAL_IW_PRIV_TYPE_CHAR | 256,                   /* 参数类型是char, 个数为256 */
211       OAL_IW_PRIV_TYPE_CHAR | OAL_IW_PRIV_SIZE_FIXED | 0, "AP_SET_MAC_FLTR"},
212     { WAL_IOCTL_PRIV_AP_GET_STA_LIST, 0, OAL_IW_PRIV_TYPE_CHAR | 1024, "AP_GET_STA_LIST" }, /* 个数为1024 */
213     { WAL_IOCTL_PRIV_AP_STA_DISASSOC, OAL_IW_PRIV_TYPE_CHAR | 256,                          /* 个数为256 */
214       OAL_IW_PRIV_TYPE_CHAR | 0, "AP_STA_DISASSOC"},
215 
216     /* sub-ioctl函数入口 */
217     { WAL_IOCTL_PRIV_SETPARAM,       OAL_IW_PRIV_TYPE_INT | OAL_IW_PRIV_SIZE_FIXED | 2, /* 个数为2 */
218       0, "setparam"},
219     {WAL_IOCTL_PRIV_GETPARAM,       OAL_IW_PRIV_TYPE_INT | OAL_IW_PRIV_SIZE_FIXED | 1,
220      OAL_IW_PRIV_TYPE_INT | OAL_IW_PRIV_SIZE_FIXED | 1, "getparam"},
221 
222     /* sub-ioctl标志,name为'\0', 数字1表示set命令后面跟1个参数, get命令得到1个值 */
223     {WAL_IOCTL_PRIV_SETPARAM,       OAL_IW_PRIV_TYPE_INT | OAL_IW_PRIV_SIZE_FIXED | 1, 0, ""},
224     {WAL_IOCTL_PRIV_SETPARAM,       OAL_IW_PRIV_TYPE_BYTE | OAL_IW_PRIV_SIZE_FIXED | OAL_IW_PRIV_TYPE_ADDR, 0, ""},
225     {WAL_IOCTL_PRIV_GETPARAM,       0, OAL_IW_PRIV_TYPE_INT | OAL_IW_PRIV_SIZE_FIXED | 1, "" },
226     {WAL_IOCTL_PRIV_GETPARAM,       0, OAL_IW_PRIV_TYPE_BYTE | OAL_IW_PRIV_SIZE_FIXED | OAL_IW_PRIV_TYPE_ADDR, ""},
227     {WLAN_CFGID_SHORTGI,            OAL_IW_PRIV_TYPE_INT | OAL_IW_PRIV_SIZE_FIXED | 1, 0, "shortgi20"},
228     {WLAN_CFGID_SHORTGI,            0, OAL_IW_PRIV_TYPE_INT | OAL_IW_PRIV_SIZE_FIXED | 1, "get_shortgi20"},
229     {WLAN_CFGID_SHORT_PREAMBLE,     OAL_IW_PRIV_TYPE_INT | OAL_IW_PRIV_SIZE_FIXED | 1, 0, "shpreamble"},
230     {WLAN_CFGID_SHORT_PREAMBLE,     0, OAL_IW_PRIV_TYPE_INT | OAL_IW_PRIV_SIZE_FIXED | 1, "get_shpreamble"},
231     {WLAN_CFGID_PROT_MODE,          OAL_IW_PRIV_TYPE_INT | OAL_IW_PRIV_SIZE_FIXED | 1, 0, "protmode"},
232     {WLAN_CFGID_PROT_MODE,          0, OAL_IW_PRIV_TYPE_INT | OAL_IW_PRIV_SIZE_FIXED | 1, "get_protmode"},
233     {WLAN_CFGID_AUTH_MODE,          OAL_IW_PRIV_TYPE_INT | OAL_IW_PRIV_SIZE_FIXED | 1, 0, "authmode"},
234     {WLAN_CFGID_AUTH_MODE,          0, OAL_IW_PRIV_TYPE_INT | OAL_IW_PRIV_SIZE_FIXED | 1, "get_authmode"},
235     {WLAN_CFGID_BEACON_INTERVAL,    OAL_IW_PRIV_TYPE_INT | OAL_IW_PRIV_SIZE_FIXED | 1, 0, "bintval"},
236     {WLAN_CFGID_BEACON_INTERVAL,    0, OAL_IW_PRIV_TYPE_INT | OAL_IW_PRIV_SIZE_FIXED | 1, "get_bintval"},
237     {WLAN_CFGID_TID,                0, OAL_IW_PRIV_TYPE_INT | OAL_IW_PRIV_SIZE_FIXED | 1, "get_tid"},
238     /* U-APSD命令 */
239     {WLAN_CFGID_UAPSD_EN,          OAL_IW_PRIV_TYPE_INT | OAL_IW_PRIV_SIZE_FIXED | 1, 0, "uapsden"},
240     {WLAN_CFGID_UAPSD_EN,           0, OAL_IW_PRIV_TYPE_INT | OAL_IW_PRIV_SIZE_FIXED | 1, "get_uapsden"},
241     {WLAN_CFGID_DTIM_PERIOD,        OAL_IW_PRIV_TYPE_INT | OAL_IW_PRIV_SIZE_FIXED | 1, 0, "dtim_period"},
242     {WLAN_CFGID_DTIM_PERIOD,        0, OAL_IW_PRIV_TYPE_INT | OAL_IW_PRIV_SIZE_FIXED | 1, "get_dtim_period"},
243 
244     /* EDCA参数配置命令 sub-ioctl入口 */
245     {WAL_IOCTL_PRIV_SET_WMM_PARAM, OAL_IW_PRIV_TYPE_INT | OAL_IW_PRIV_SIZE_FIXED | 3, 0, "setwmmparam"}, /* 个数为3 */
246     {WAL_IOCTL_PRIV_GET_WMM_PARAM, OAL_IW_PRIV_TYPE_INT | OAL_IW_PRIV_SIZE_FIXED | 2,                    /* 个数为2 */
247                                    OAL_IW_PRIV_TYPE_INT | OAL_IW_PRIV_SIZE_FIXED | 2, "getwmmparam"},   /* 个数为2 */
248 
249     /* sub-ioctl标志,name为'\0', 2表示set命令后跟两个参数 */
250     {WAL_IOCTL_PRIV_SET_WMM_PARAM,       OAL_IW_PRIV_TYPE_INT | OAL_IW_PRIV_SIZE_FIXED | 2, 0, ""},    /* 个数为2 */
251     {WAL_IOCTL_PRIV_GET_WMM_PARAM,       OAL_IW_PRIV_TYPE_INT | OAL_IW_PRIV_SIZE_FIXED | 1,
252                                          OAL_IW_PRIV_TYPE_INT | OAL_IW_PRIV_SIZE_FIXED | 1, "" },
253     {WLAN_CFGID_EDCA_TABLE_CWMIN,        OAL_IW_PRIV_TYPE_INT | OAL_IW_PRIV_SIZE_FIXED | 2, 0, "cwmin"}, /* 个数为2 */
254     {WLAN_CFGID_EDCA_TABLE_CWMIN,        OAL_IW_PRIV_TYPE_INT | OAL_IW_PRIV_SIZE_FIXED | 1,
255         OAL_IW_PRIV_TYPE_INT | OAL_IW_PRIV_SIZE_FIXED | 1, "get_cwmin"},
256     {WLAN_CFGID_EDCA_TABLE_CWMAX,        OAL_IW_PRIV_TYPE_INT | OAL_IW_PRIV_SIZE_FIXED | 2, 0, "cwmax"}, /* 个数为2 */
257     {WLAN_CFGID_EDCA_TABLE_CWMAX,        OAL_IW_PRIV_TYPE_INT | OAL_IW_PRIV_SIZE_FIXED | 1,
258         OAL_IW_PRIV_TYPE_INT | OAL_IW_PRIV_SIZE_FIXED | 1, "get_cwmax"},
259     {WLAN_CFGID_EDCA_TABLE_AIFSN,        OAL_IW_PRIV_TYPE_INT | OAL_IW_PRIV_SIZE_FIXED | 2, 0, "aifsn"}, /* 个数为2 */
260     {WLAN_CFGID_EDCA_TABLE_AIFSN,        OAL_IW_PRIV_TYPE_INT | OAL_IW_PRIV_SIZE_FIXED | 1,
261         OAL_IW_PRIV_TYPE_INT | OAL_IW_PRIV_SIZE_FIXED | 1, "get_aifsn"},
262     {WLAN_CFGID_EDCA_TABLE_TXOP_LIMIT, OAL_IW_PRIV_TYPE_INT | OAL_IW_PRIV_SIZE_FIXED | 2, 0, "txoplimit"}, /* 个数为2 */
263     {WLAN_CFGID_EDCA_TABLE_TXOP_LIMIT,       OAL_IW_PRIV_TYPE_INT | OAL_IW_PRIV_SIZE_FIXED | 1,
264         OAL_IW_PRIV_TYPE_INT | OAL_IW_PRIV_SIZE_FIXED | 1, "get_txoplimit"},
265     {WLAN_CFGID_EDCA_TABLE_MSDU_LIFETIME, OAL_IW_PRIV_TYPE_INT | OAL_IW_PRIV_SIZE_FIXED | 2,             /* 个数为2 */
266         0, "lifetime"},
267     {WLAN_CFGID_EDCA_TABLE_MSDU_LIFETIME,    OAL_IW_PRIV_TYPE_INT | OAL_IW_PRIV_SIZE_FIXED | 1,
268         OAL_IW_PRIV_TYPE_INT | OAL_IW_PRIV_SIZE_FIXED | 1, "get_lifetime"},
269     {WLAN_CFGID_EDCA_TABLE_MANDATORY, OAL_IW_PRIV_TYPE_INT | OAL_IW_PRIV_SIZE_FIXED | 2, 0, "mandatory"}, /* 个数为2 */
270     {WLAN_CFGID_EDCA_TABLE_MANDATORY, OAL_IW_PRIV_TYPE_INT | OAL_IW_PRIV_SIZE_FIXED | 1,
271         OAL_IW_PRIV_TYPE_INT | OAL_IW_PRIV_SIZE_FIXED | 1, "get_mandatory"},
272 
273     {WLAN_CFGID_QEDCA_TABLE_CWMIN, OAL_IW_PRIV_TYPE_INT | OAL_IW_PRIV_SIZE_FIXED | 2, 0, "qcwmin"},   /* 个数为2 */
274     {WLAN_CFGID_QEDCA_TABLE_CWMIN, OAL_IW_PRIV_TYPE_INT | OAL_IW_PRIV_SIZE_FIXED | 1,
275         OAL_IW_PRIV_TYPE_INT | OAL_IW_PRIV_SIZE_FIXED | 1, "get_qcwmin"},
276     {WLAN_CFGID_QEDCA_TABLE_CWMAX, OAL_IW_PRIV_TYPE_INT | OAL_IW_PRIV_SIZE_FIXED | 2, 0, "qcwmax"},  /* 个数为2 */
277     {WLAN_CFGID_QEDCA_TABLE_CWMAX, OAL_IW_PRIV_TYPE_INT | OAL_IW_PRIV_SIZE_FIXED | 1,
278         OAL_IW_PRIV_TYPE_INT | OAL_IW_PRIV_SIZE_FIXED | 1, "get_qcwmax"},
279     {WLAN_CFGID_QEDCA_TABLE_AIFSN, OAL_IW_PRIV_TYPE_INT | OAL_IW_PRIV_SIZE_FIXED | 2, 0, "qaifsn"},   /* 个数为2 */
280     {WLAN_CFGID_QEDCA_TABLE_AIFSN, OAL_IW_PRIV_TYPE_INT | OAL_IW_PRIV_SIZE_FIXED | 1,
281         OAL_IW_PRIV_TYPE_INT | OAL_IW_PRIV_SIZE_FIXED | 1, "get_qaifsn"},
282     {WLAN_CFGID_QEDCA_TABLE_TXOP_LIMIT, OAL_IW_PRIV_TYPE_INT | OAL_IW_PRIV_SIZE_FIXED | 2,            /* 个数为2 */
283         0, "qtxoplimit"},
284     {WLAN_CFGID_QEDCA_TABLE_TXOP_LIMIT, OAL_IW_PRIV_TYPE_INT | OAL_IW_PRIV_SIZE_FIXED | 1,
285         OAL_IW_PRIV_TYPE_INT | OAL_IW_PRIV_SIZE_FIXED | 1, "get_qtxoplimit"},
286     {WLAN_CFGID_QEDCA_TABLE_MSDU_LIFETIME, OAL_IW_PRIV_TYPE_INT | OAL_IW_PRIV_SIZE_FIXED | 2,         /* 个数为2 */
287         0, "qlifetime"},
288     {WLAN_CFGID_QEDCA_TABLE_MSDU_LIFETIME,    OAL_IW_PRIV_TYPE_INT | OAL_IW_PRIV_SIZE_FIXED | 1,
289         OAL_IW_PRIV_TYPE_INT | OAL_IW_PRIV_SIZE_FIXED | 1, "get_qlifetime"},
290     {WLAN_CFGID_QEDCA_TABLE_MANDATORY, OAL_IW_PRIV_TYPE_INT | OAL_IW_PRIV_SIZE_FIXED | 2,            /* 个数为2 */
291         0, "qmandatory"},
292     {WLAN_CFGID_QEDCA_TABLE_MANDATORY, OAL_IW_PRIV_TYPE_INT | OAL_IW_PRIV_SIZE_FIXED | 1,
293         OAL_IW_PRIV_TYPE_INT | OAL_IW_PRIV_SIZE_FIXED | 1, "get_qmandatory"},
294 
295 };
296 #endif /* ifndef _PRE_HDF_LINUX */
297 
298 /* ****************************************************************************
299   私有ioctl命令函数表.
300 **************************************************************************** */
301 static const oal_iw_handler g_ast_iw_priv_handlers[] = {
302     (oal_iw_handler)wal_ioctl_set_param, /* SIOCWFIRSTPRIV+0 */            /* sub-ioctl set 入口 */
303     (oal_iw_handler)wal_ioctl_get_param, /* SIOCWFIRSTPRIV+1 */            /* sub-ioctl get 入口 */
304     HI_NULL, /* SIOCWFIRSTPRIV+2 */                                        /* setkey */
305     (oal_iw_handler)wal_ioctl_set_wme_params, /* SIOCWFIRSTPRIV+3 */       /* setwmmparams */
306     HI_NULL, /* SIOCWFIRSTPRIV+4 */                                        /* delkey */
307     (oal_iw_handler)wal_ioctl_get_wme_params, /* SIOCWFIRSTPRIV+5 */       /* getwmmparams */
308     HI_NULL, /* SIOCWFIRSTPRIV+6 */                                        /* setmlme */
309     HI_NULL, /* SIOCWFIRSTPRIV+7 */                                        /* getchaninfo */
310     (oal_iw_handler)wal_ioctl_setcountry, /* SIOCWFIRSTPRIV+8 */           /* setcountry */
311     (oal_iw_handler)wal_ioctl_getcountry, /* SIOCWFIRSTPRIV+9 */           /* getcountry */
312     HI_NULL, /* SIOCWFIRSTPRIV+10 */                                       /* addmac */
313     HI_NULL, /* SIOCWFIRSTPRIV+11 */                                       /* getscanresults */
314     HI_NULL, /* SIOCWFIRSTPRIV+12 */                                       /* delmac */
315     HI_NULL, /* SIOCWFIRSTPRIV+13 */                                       /* getchanlist */
316     HI_NULL, /* SIOCWFIRSTPRIV+14 */                                       /* setchanlist */
317     HI_NULL, /* SIOCWFIRSTPRIV+15 */                                       /* kickmac */
318     HI_NULL, /* SIOCWFIRSTPRIV+16 */                                       /* chanswitch */
319     (oal_iw_handler)wal_ioctl_get_mode, /* SIOCWFIRSTPRIV+17 */            /* 获取模式, 例: iwpriv vapN get_mode */
320     (oal_iw_handler)wal_ioctl_set_mode, /* SIOCWFIRSTPRIV+18 */            /* 设置模式, 例: iwpriv vapN mode 11g */
321     HI_NULL, /* SIOCWFIRSTPRIV+19 */                                       /* getappiebuf */
322     HI_NULL, /* SIOCWFIRSTPRIV+20 */                                       /* null */
323     (oal_iw_handler)wal_ioctl_get_assoc_list, /* SIOCWFIRSTPRIV+21 */      /* APUT取得关联STA列表 */
324     (oal_iw_handler)wal_ioctl_set_mac_filters, /* SIOCWFIRSTPRIV+22 */     /* APUT设置STA过滤 */
325     (oal_iw_handler)wal_ioctl_set_ap_config, /* SIOCWFIRSTPRIV+23 */       /* 设置APUT参数 */
326     (oal_iw_handler)wal_ioctl_set_ap_sta_disassoc, /* SIOCWFIRSTPRIV+24 */ /* APUT去关联STA */
327     HI_NULL, /* SIOCWFIRSTPRIV+25 */                                       /* getStatistics */
328     HI_NULL, /* SIOCWFIRSTPRIV+26 */                                       /* sendmgmt */
329     HI_NULL, /* SIOCWFIRSTPRIV+27 */                                       /* null  */
330     HI_NULL, /* SIOCWFIRSTPRIV+28 */                                       /* null */
331     HI_NULL, /* SIOCWFIRSTPRIV+29 */                                       /* getaclmac */
332     HI_NULL, /* SIOCWFIRSTPRIV+30 */                                       /* sethbrparams */
333     HI_NULL, /* SIOCWFIRSTPRIV+29 */                                       /* getaclmac */
334     HI_NULL, /* SIOCWFIRSTPRIV+30 */                                       /* sethbrparams */
335     HI_NULL, /* SIOCWFIRSTPRIV+31 */                                       /* setrxtimeout */
336 };
337 
338 /* ****************************************************************************
339   无线配置iw_handler_def定义
340 **************************************************************************** */
341 #ifndef _PRE_HDF_LINUX
342 oal_iw_handler_def_stru g_iw_handler_def =
343 {
344     .standard           = g_ast_iw_handlers,
345     .num_standard       = hi_array_size(g_ast_iw_handlers),
346     .private            = g_ast_iw_priv_handlers,
347     .num_private        = hi_array_size(g_ast_iw_priv_handlers),
348     .private_args       = g_ast_iw_priv_args,
349     .num_private_args   = hi_array_size(g_ast_iw_priv_args),
350     .get_wireless_stats = HI_NULL
351 };
352 #endif
353 #endif /* #if (_PRE_OS_VERSION_LINUX == _PRE_OS_VERSION) */
354 
355 /* ****************************************************************************
356   协议模式字符串定义
357 **************************************************************************** */
358 const wal_ioctl_mode_map_stru g_ast_mode_map[] = {
359     {"11b",         WLAN_LEGACY_11B_MODE,       WLAN_BAND_2G,   WLAN_BAND_WIDTH_20M, {0}},
360     {"11bg",        WLAN_MIXED_ONE_11G_MODE,    WLAN_BAND_2G,   WLAN_BAND_WIDTH_20M, {0}},
361     {"11bgn",       WLAN_HT_MODE,               WLAN_BAND_2G,   WLAN_BAND_WIDTH_20M, {0}},
362     { HI_NULL, 0, 0, 0, { 0 } }
363 };
364 
365 /* ****************************************************************************
366   3 函数实现
367 **************************************************************************** */
368 #if (_PRE_OS_VERSION_LINUX == _PRE_OS_VERSION)
wal_get_g_iw_handler_def(hi_void)369 oal_iw_handler_def_stru *wal_get_g_iw_handler_def(hi_void)
370 {
371 #ifndef _PRE_HDF_LINUX
372     return &g_iw_handler_def;
373 #else
374     return NULL;
375 #endif
376 }
377 #endif
378 /* ****************************************************************************
379  函 数 名  : wal_get_cmd_one_arg
380  功能描述  : 获取字符串第一个参数 以空格为参数区分标识
381  输入参数  : pc_cmd         : 传入的字符串
382  输出参数  : pc_arg         : 第一个参数
383              pul_cmd_offset : 第一个参数的长度
384  返 回 值  : 错误码
385  调用函数  :
386  被调函数  :
387 
388  修改历史      :
389   1.日    期   : 2012年12月13日
390     作    者   : HiSilicon
391     修改内容   : 新生成函数
392 
393 **************************************************************************** */
wal_get_cmd_one_arg(const hi_char * pc_cmd,hi_char * pc_arg,hi_u32 pc_arg_len,hi_u32 * pul_cmd_offset)394 hi_u32 wal_get_cmd_one_arg(const hi_char *pc_cmd, hi_char *pc_arg, hi_u32 pc_arg_len, hi_u32 *pul_cmd_offset)
395 {
396     const hi_char *pc_cmd_copy = HI_NULL;
397     hi_u32 pos = 0;
398 
399     if (oal_unlikely((pc_cmd == HI_NULL) || (pc_arg == HI_NULL) || (pul_cmd_offset == HI_NULL))) {
400         oam_error_log3(0, 0,
401             "{wal_get_cmd_one_arg::pc_cmd/pc_arg/pul_cmd_offset null ptr error %p, %p, %p!}\r\n",
402             (uintptr_t)pc_cmd, (uintptr_t)pc_arg, (uintptr_t)pul_cmd_offset);
403         return HI_ERR_CODE_PTR_NULL;
404     }
405 
406     pc_cmd_copy = pc_cmd;
407 
408     /* 去掉字符串开始的空格 */
409     while (*pc_cmd_copy == ' ') {
410         ++pc_cmd_copy;
411     }
412 
413     while ((*pc_cmd_copy != ' ') && (*pc_cmd_copy != '\0')) {
414         pc_arg[pos] = *pc_cmd_copy;
415         ++pos;
416         ++pc_cmd_copy;
417 
418         if (oal_unlikely(pos >= pc_arg_len)) {
419             oam_warning_log1(0, 0, "{wal_get_cmd_one_arg::ul_pos >= WAL_HIPRIV_CMD_NAME_MAX_LEN, ul_pos %d!}\r\n", pos);
420             return HI_ERR_CODE_ARRAY_OVERFLOW;
421         }
422     }
423 
424     pc_arg[pos] = '\0';
425 
426     /* 字符串到结尾,返回错误码 */
427     if (0 == pos) {
428         oam_info_log0(0, 0, "{wal_get_cmd_one_arg::return param pc_arg is null!}\r\n");
429         return HI_ERR_CODE_PTR_NULL;
430     }
431 
432     *pul_cmd_offset = (hi_u32)(pc_cmd_copy - pc_cmd);
433 
434     return HI_SUCCESS;
435 }
436 
437 #ifdef _PRE_WLAN_FEATURE_P2P
438 /* ****************************************************************************
439  函 数 名  : wal_wireless_iftype_to_mac_p2p_mode
440  输入参数  : enum nl80211_iftype en_iftype
441  输出参数  : 无
442  返 回 值  : wlan_p2p_mode_enum_uint8
443  调用函数  :
444  被调函数  :
445 
446  修改历史      :
447   1.日    期   : 2014年12月31日
448     作    者   : HiSilicon
449     修改内容   : 新生成函数
450 
451 **************************************************************************** */
wal_wireless_iftype_to_mac_p2p_mode(nl80211_iftype_uint8 iftype)452 wlan_p2p_mode_enum_uint8 wal_wireless_iftype_to_mac_p2p_mode(nl80211_iftype_uint8 iftype)
453 {
454     wlan_p2p_mode_enum_uint8 p2p_mode = WLAN_LEGACY_VAP_MODE;
455 
456     switch (iftype) {
457         case NL80211_IFTYPE_P2P_CLIENT:
458             p2p_mode = WLAN_P2P_CL_MODE;
459             break;
460         case NL80211_IFTYPE_P2P_GO:
461             p2p_mode = WLAN_P2P_GO_MODE;
462             break;
463         case NL80211_IFTYPE_P2P_DEVICE:
464             p2p_mode = WLAN_P2P_DEV_MODE;
465             break;
466 #ifdef _PRE_WLAN_FEATURE_MESH
467         case NL80211_IFTYPE_MESH_POINT:
468 #endif
469         case NL80211_IFTYPE_AP:
470         case NL80211_IFTYPE_STATION:
471             p2p_mode = WLAN_LEGACY_VAP_MODE;
472             break;
473         default:
474             p2p_mode = WLAN_P2P_BUTT;
475     }
476     return p2p_mode;
477 }
478 #endif
479 
480 /* ****************************************************************************
481  功能描述  : cfg vap h2d
482  输入参数  : pst_net_dev: net_device
483  修改历史      :
484   1.日    期   : 2015年6月10日
485     作    者   : HiSilicon
486     修改内容   : 新生成函数
487 **************************************************************************** */
wal_cfg_vap_h2d_event(oal_net_device_stru * netdev)488 hi_u32 wal_cfg_vap_h2d_event(oal_net_device_stru *netdev)
489 {
490     hi_unref_param(netdev);
491     oal_net_device_stru         *netdev_cfg = HI_NULL;
492     hi_u32                       ret;
493     wal_msg_stru                *rsp_msg = HI_NULL;
494     wal_msg_write_stru           write_msg;
495 
496     netdev_cfg = oal_get_netdev_by_name(WLAN_CFG_VAP_NAME);
497     if (netdev_cfg == HI_NULL) {
498         oam_warning_log0(0, 0, "{wal_init_wlan_vap::pst_cfg_net_dev is null!}\r\n");
499         return HI_ERR_CODE_PTR_NULL;
500     }
501 #if (_PRE_OS_VERSION_LINUX == _PRE_OS_VERSION)
502     oal_dev_put(netdev_cfg);
503 #endif
504     /* **************************************************************************
505     抛事件到wal层处理
506     ************************************************************************** */
507     /* 填写消息 */
508     wal_write_msg_hdr_init(&write_msg, WLAN_CFGID_CFG_VAP_H2D, sizeof(mac_cfg_vap_h2d_stru));
509     ((mac_cfg_vap_h2d_stru *)write_msg.auc_value)->net_dev = netdev_cfg;
510 
511     /* 发送消息 */
512     ret = wal_send_cfg_event(netdev_cfg, WAL_MSG_TYPE_WRITE,
513         WAL_MSG_WRITE_MSG_HDR_LENGTH + sizeof(mac_cfg_vap_h2d_stru), (hi_u8 *)&write_msg, HI_TRUE, &rsp_msg);
514     if (oal_unlikely(ret != HI_SUCCESS)) {
515         oam_warning_log1(0, 0, "{wal_cfg_vap_h2d_event::wal_alloc_cfg_event return err code %u!}\r\n", ret);
516         return ret;
517     }
518 
519     /* 处理返回消息 */
520     ret = wal_check_and_release_msg_resp(rsp_msg);
521     if (ret != HI_SUCCESS) {
522         oam_warning_log1(0, 0, "{wal_cfg_vap_h2d_event::hmac cfg vap h2d fail,err code[%u]\r\n", ret);
523         return ret;
524     }
525 
526     return HI_SUCCESS;
527 }
528 #if (_PRE_MULTI_CORE_MODE_OFFLOAD_DMAC == _PRE_MULTI_CORE_MODE)
529 /* ****************************************************************************
530  函 数 名  : wal_host_dev_config
531  功能描述  : 02 host device_sruc配置接口,目前用于上下电流程
532  输入参数  : 无
533  输出参数  : 无
534  返 回 值  :
535  调用函数  :
536  被调函数  :
537 
538  修改历史      :
539   1.日    期   : 2015年11月24日
540     作    者   : HiSilicon
541     修改内容   : 新生成函数
542 **************************************************************************** */
wal_host_dev_config(const oal_net_device_stru * netdev,wlan_cfgid_enum_uint16 wid)543 static hi_u32 wal_host_dev_config(const oal_net_device_stru *netdev, wlan_cfgid_enum_uint16 wid)
544 {
545     oal_wireless_dev           *wdev = HI_NULL;
546     mac_wiphy_priv_stru        *wiphy_priv = HI_NULL;
547     hmac_vap_stru              *hmac_vap = HI_NULL;
548     mac_device_stru            *mac_dev = HI_NULL;
549     oal_net_device_stru        *netdev_cfg = HI_NULL;
550     hi_u32                      ret;
551     wal_msg_stru               *rsp_msg = HI_NULL;
552     wal_msg_write_stru          write_msg;
553 
554     wdev = (oal_wireless_dev *)oal_netdevice_wdev(netdev);
555     if ((wdev == HI_NULL) || (wdev->wiphy == HI_NULL)) {
556         oam_warning_log0(0, 0, "{wal_init_wlan_vap::pst_wdev is null!}\r\n");
557         return HI_ERR_CODE_PTR_NULL;
558     }
559 
560     wiphy_priv = (mac_wiphy_priv_stru *)oal_wiphy_priv(wdev->wiphy);
561     mac_dev = wiphy_priv->mac_device;
562     hmac_vap = hmac_vap_get_vap_stru(WLAN_CFG_VAP_ID);
563     if (mac_dev == HI_NULL || hmac_vap == HI_NULL || hmac_vap->net_device == HI_NULL) {
564         oam_warning_log2(0, 0, "{wal_init_wlan_vap::mac_dev/hmac_vap is null! mac_dev=%p,hmac_vap=%p}",
565             (uintptr_t)mac_dev, (uintptr_t)hmac_vap);
566         return HI_ERR_CODE_PTR_NULL;
567     }
568     netdev_cfg = hmac_vap->net_device;
569 
570     /* **************************************************************************
571     抛事件到wal层处理
572     ************************************************************************** */
573     /* 填写消息 */
574     wal_write_msg_hdr_init(&write_msg, wid, 0);
575 
576     /* 发送消息 */
577     ret = wal_send_cfg_event(netdev_cfg, WAL_MSG_TYPE_WRITE, WAL_MSG_WRITE_MSG_HDR_LENGTH, (hi_u8 *)&write_msg, HI_TRUE,
578         &rsp_msg);
579     if (oal_unlikely(ret != HI_SUCCESS)) {
580         oam_warning_log1(0, 0, "{wal_cfg_vap_h2d_event::wal_alloc_cfg_event return err code %u!}\r\n", ret);
581         return ret;
582     }
583 
584     /* 处理返回消息 */
585     ret = wal_check_and_release_msg_resp(rsp_msg);
586     if (ret != HI_SUCCESS) {
587         oam_warning_log1(0, 0, "{wal_cfg_vap_h2d_event::hmac cfg vap h2d fail,err code[%u]\r\n", ret);
588         return ret;
589     }
590 
591     return HI_SUCCESS;
592 }
593 
594 /* ****************************************************************************
595  函 数 名  : wal_host_dev_init
596  功能描述  : 02 host device_sruc的初始化接口,目前用于上下电流程
597  输入参数  : 无
598  输出参数  : 无
599  返 回 值  :
600  调用函数  :
601  被调函数  :
602 
603  修改历史      :
604   1.日    期   : 2015年11月24日
605     作    者   : HiSilicon
606     修改内容   : 新生成函数
607 
608 **************************************************************************** */
wal_host_dev_init(const oal_net_device_stru * netdev)609 hi_u32 wal_host_dev_init(const oal_net_device_stru *netdev)
610 {
611     return wal_host_dev_config(netdev, WLAN_CFGID_HOST_DEV_INIT);
612 }
613 
614 /* ****************************************************************************
615  函 数 名  : wal_host_dev_init
616  功能描述  : 02 host device_sruc的去初始化接口,目前用于上下电流程
617  输入参数  : 无
618  输出参数  : 无
619  返 回 值  :
620  调用函数  :
621  被调函数  :
622 
623  修改历史      :
624   1.日    期   : 2015年11月26日
625     作    者   : HiSilicon
626     修改内容   : 新生成函数
627 
628 **************************************************************************** */
wal_host_dev_exit(const oal_net_device_stru * netdev)629 hi_u32 wal_host_dev_exit(const oal_net_device_stru *netdev)
630 {
631     return wal_host_dev_config(netdev, WLAN_CFGID_HOST_DEV_EXIT);
632 }
633 #endif
634 
635 #if (_PRE_OS_VERSION_LINUX == _PRE_OS_VERSION)
wal_ioctl_get_mode(oal_net_device_stru * netdev,hi_s8 * pc_param)636 static hi_u32 wal_ioctl_get_mode(oal_net_device_stru *netdev, hi_s8 *pc_param)
637 {
638     return HI_FAIL;
639 }
640 #endif
641 
642 /* ****************************************************************************
643  函 数 名  : wal_ioctl_set_mode
644  功能描述  : 设置模式: 包括协议、频段、带宽
645  输入参数  : pst_net_dev: net device
646              pc_param    : 参数
647  输出参数  : 无
648  返 回 值  : 错误码
649  调用函数  :
650  被调函数  :
651 
652  修改历史      :
653   1.日    期   : 2014年12月12日
654     作    者   : HiSilicon
655     修改内容   : 新生成函数
656 
657 **************************************************************************** */
wal_ioctl_set_mode(oal_net_device_stru * netdev,hi_char * pc_param)658 hi_u32 wal_ioctl_set_mode(oal_net_device_stru *netdev, hi_char *pc_param)
659 {
660     hi_char            ac_mode_str[WAL_HIPRIV_CMD_NAME_MAX_LEN] = {0};     /* 预留协议模式字符串空间 */
661     hi_u8              prot_idx;
662     wal_msg_write_stru write_msg;
663     hi_u32             off_set = 0;
664 
665     if (oal_unlikely((netdev == HI_NULL) || (pc_param == HI_NULL))) {
666         oam_error_log2(0, 0, "{wal_ioctl_set_mode::pst_net_dev/p_param null ptr error %p %p!}\r\n", (uintptr_t)netdev,
667             (uintptr_t)pc_param);
668         return HI_ERR_WIFI_WAL_FAILURE;
669     }
670 
671     /* 设备在up状态不允许配置,必须先down */
672     if (0 != (OAL_IFF_RUNNING & oal_netdevice_flags(netdev))) {
673         oam_error_log1(0, 0, "{wal_ioctl_set_mode::device busy %d!}\r\n", oal_netdevice_flags(netdev));
674         return HI_ERR_WIFI_WAL_BUSY;
675     }
676 
677     /* pc_param指向传入模式参数, 将其取出存放到ac_mode_str中 */
678     hi_u32 ret = wal_get_cmd_one_arg(pc_param, ac_mode_str, WAL_HIPRIV_CMD_NAME_MAX_LEN, &off_set);
679     if (ret != HI_SUCCESS) {
680         oam_warning_log1(0, 0, "{wal_ioctl_set_mode::mode get failed [%d]!}\r\n", ret);
681         return ret;
682     }
683     ac_mode_str[sizeof(ac_mode_str) - 1] = '\0'; /* 确保以null结尾 */
684 
685     for (prot_idx = 0; HI_NULL != g_ast_mode_map[prot_idx].pc_name; prot_idx++) {
686         if (0 == strcmp(g_ast_mode_map[prot_idx].pc_name, ac_mode_str)) {
687             break;
688         }
689     }
690 
691     if (HI_NULL == g_ast_mode_map[prot_idx].pc_name) {
692         oam_warning_log0(0, 0, "{wal_ioctl_set_mode::unrecognized protocol string!}\r\n");
693         return HI_FAIL;
694     }
695 
696     /* **************************************************************************
697         抛事件到wal层处理
698     ************************************************************************** */
699     wal_write_msg_hdr_init(&write_msg, WLAN_CFGID_MODE, sizeof(mac_cfg_mode_param_stru));
700 
701     mac_cfg_mode_param_stru *mode_param = (mac_cfg_mode_param_stru *)(write_msg.auc_value);
702     mode_param->protocol     = g_ast_mode_map[prot_idx].mode;
703     mode_param->band         = g_ast_mode_map[prot_idx].band;
704     mode_param->en_bandwidth = g_ast_mode_map[prot_idx].en_bandwidth;
705 
706     oam_info_log3(0, OAM_SF_CFG, "{wal_ioctl_set_mode::protocol[%d],band[%d],bandwidth[%d]!}", mode_param->protocol,
707         mode_param->band, mode_param->en_bandwidth);
708 
709     /* 发送消息 */
710     ret = wal_send_cfg_event(netdev, WAL_MSG_TYPE_WRITE, WAL_MSG_WRITE_MSG_HDR_LENGTH + sizeof(mac_cfg_mode_param_stru),
711         (hi_u8 *)&write_msg, HI_FALSE, HI_NULL);
712     if (oal_unlikely(ret != HI_SUCCESS)) {
713         oam_warning_log1(0, 0, "{wal_ioctl_set_mode::wal_alloc_cfg_event return err code %u!}\r\n", ret);
714         return ret;
715     }
716 
717     return HI_SUCCESS;
718 }
719 
720 #if (_PRE_OS_VERSION_LINUX == _PRE_OS_VERSION)
wal_ioctl_get_essid(oal_net_device_stru * netdev,hi_s8 * pc_param)721 static hi_u32 wal_ioctl_get_essid(oal_net_device_stru *netdev, hi_s8 *pc_param)
722 {
723     return HI_FAIL;
724 }
725 #endif
726 
727 /* ****************************************************************************
728  函 数 名  : oal_strim
729  功能描述  : 去掉字符串开始与结尾的空格
730  输入参数  : 无
731  输出参数  : 无
732  返 回 值  :
733  调用函数  :
734  被调函数  :
735 
736  修改历史      :
737   1.日    期   : 2013年8月12日
738     作    者   : HiSilicon
739     修改内容   : 新生成函数
740 
741 **************************************************************************** */
oal_strim(hi_char * str,hi_u8 max_cmd_len)742 static hi_char *oal_strim(hi_char *str, hi_u8 max_cmd_len)
743 {
744     hi_u32   size;
745     hi_char* str_end = HI_NULL;
746 
747     hi_unref_param(max_cmd_len);
748     while (*str == ' ') {
749         ++str;
750     }
751 
752     size = strlen((const hi_char *)str);
753     if (!size) {
754         return str;
755     }
756 
757     str_end = str + size - 1;
758     while ((str_end >= str) && (*str_end == ' ')) {
759         str_end--;
760     }
761 
762     *(str_end + 1) = '\0';
763 
764     return str;
765 }
766 
767 /* ****************************************************************************
768  函 数 名  : wal_ioctl_set_essid
769  功能描述  : 设置ssid
770  输入参数  : [1]net_dev
771              [2]pc_param
772  输出参数  : 无
773  返 回 值  : static hi_u32
774 **************************************************************************** */
775 /* 结构体数组g_ast_hipriv_cmd的成员,其中wal_hipriv_getcountry修改了对应变量,lint_t e818告警屏蔽 */
wal_ioctl_set_essid(oal_net_device_stru * netdev,hi_char * pc_param)776 hi_u32 wal_ioctl_set_essid(oal_net_device_stru *netdev, hi_char *pc_param)
777 {
778     wal_msg_write_stru  write_msg;
779     hi_u32              off_set;
780     hi_char             ac_ssid[WAL_HIPRIV_CMD_NAME_MAX_LEN] = {0};
781     mac_vap_stru       *mac_vap = oal_net_dev_priv(netdev);
782 
783     if (mac_vap == NULL) {
784         oam_warning_log0(0, 0, "{wal_ioctl_set_essid::pst_mac_vap is null!}");
785         return HI_ERR_CODE_PTR_NULL;
786     }
787 
788     if (mac_vap->vap_mode == WLAN_VAP_MODE_BSS_AP
789 #ifdef _PRE_WLAN_FEATURE_MESH
790         || (mac_vap->vap_mode == WLAN_VAP_MODE_MESH)
791 #endif
792     ) {
793         /* 设备在up状态且是AP时,不允许配置,必须先down */
794         if (0 != (OAL_IFF_RUNNING & oal_netdevice_flags(netdev))) {
795             oam_error_log1(mac_vap->vap_id, 0, "{wal_ioctl_set_essid::device is busy, please down it firste %d!}",
796                 oal_netdevice_flags(netdev));
797             return HI_FAIL;
798         }
799     }
800 
801     /* pc_param指向传入模式参数, 将其取出存放到ac_mode_str中 */
802     hi_u32 ret = wal_get_cmd_one_arg(pc_param, ac_ssid, WAL_HIPRIV_CMD_NAME_MAX_LEN, &off_set);
803     if (ret != HI_SUCCESS) {
804         oam_warning_log1(0, 0, "{wal_ioctl_set_essid::wal_get_cmd_one_arg vap name return err_code %d!}", ret);
805         return ret;
806     }
807 
808     hi_char *pc_ssid  = oal_strim(ac_ssid, WAL_HIPRIV_CMD_NAME_MAX_LEN); /* 去掉字符串开始结尾的空格 */
809     hi_u8    ssid_len = (hi_u8)strlen(pc_ssid);
810     oam_info_log1(mac_vap->vap_id, 0, "{wal_ioctl_set_essid:: ssid length %d!}", ssid_len);
811     ssid_len = (ssid_len > WLAN_SSID_MAX_LEN - 1) ? (WLAN_SSID_MAX_LEN - 1) : ssid_len; /* -1为\0预留空间 */
812     oam_info_log1(mac_vap->vap_id, 0, "{wal_ioctl_set_essid:: ssid length is %d!}", ssid_len);
813 
814     /* **************************************************************************
815         抛事件到wal层处理
816     ************************************************************************** */
817     wal_write_msg_hdr_init(&write_msg, WLAN_CFGID_SSID, sizeof(mac_cfg_ssid_param_stru));
818 
819     /* 填写WID对应的参数 */
820     mac_cfg_ssid_param_stru *param = (mac_cfg_ssid_param_stru *)(write_msg.auc_value);
821     param->ssid_len = ssid_len;
822     if (memcpy_s(param->ac_ssid, WLAN_SSID_MAX_LEN, pc_ssid, ssid_len) != EOK) {
823         oam_error_log0(0, 0, "{wal_ioctl_set_essid::mem safe function err!}");
824         return HI_FAIL;
825     }
826 
827     /* 发送消息 */
828     ret = wal_send_cfg_event(netdev, WAL_MSG_TYPE_WRITE, WAL_MSG_WRITE_MSG_HDR_LENGTH + sizeof(mac_cfg_ssid_param_stru),
829         (hi_u8 *)&write_msg, HI_FALSE, HI_NULL);
830     if (oal_unlikely(ret != HI_SUCCESS)) {
831         oam_warning_log1(mac_vap->vap_id, 0, "{wal_ioctl_set_essid:: wal_alloc_cfg_event Err=%u}", ret);
832         return ret;
833     }
834 
835     return HI_SUCCESS;
836 }
837 
838 #if (_PRE_OS_VERSION_LINUX == _PRE_OS_VERSION)
wal_ioctl_get_bss_type(oal_net_device_stru * netdev,hi_s8 * pc_param)839 static hi_u32 wal_ioctl_get_bss_type(oal_net_device_stru *netdev, hi_s8 *pc_param)
840 {
841     return HI_FAIL;
842 }
wal_ioctl_set_bss_type(oal_net_device_stru * netdev,hi_s8 * pc_param)843 static hi_u32 wal_ioctl_set_bss_type(oal_net_device_stru *netdev, hi_s8 *pc_param)
844 {
845     return HI_FAIL;
846 }
wal_ioctl_get_freq(oal_net_device_stru * netdev,hi_s8 * pc_param)847 static hi_u32 wal_ioctl_get_freq(oal_net_device_stru *netdev, hi_s8 *pc_param)
848 {
849     return HI_FAIL;
850 }
851 #endif
852 
853 /* ****************************************************************************
854  函 数 名  : wal_ioctl_set_freq
855  功能描述  : 设置频点/信道
856  输入参数  : 无
857  输出参数  : 无
858  返 回 值  :
859  调用函数  :
860  被调函数  :
861 
862  修改历史      :
863   1.日    期   : 2014年12月12日
864     作    者   : HiSilicon
865     修改内容   : 新生成函数
866 
867 **************************************************************************** */
868 /* 结构体数组g_ast_hipriv_cmd的成员,其中wal_hipriv_getcountry修改了对应变量,lint_t e818告警屏蔽 */
wal_ioctl_set_freq(oal_net_device_stru * netdev,hi_char * pc_param)869 hi_u32 wal_ioctl_set_freq(oal_net_device_stru *netdev, hi_char *pc_param)
870 {
871     wal_msg_write_stru      write_msg;
872     hi_s32                  channel;
873     hi_u32                  off_set;
874     hi_char                 ac_freq[WAL_HIPRIV_CMD_NAME_MAX_LEN] = {0};
875     hi_u32                  ret;
876 
877     /* 设备在up状态不允许配置,必须先down */
878     if (0 != (OAL_IFF_RUNNING & oal_netdevice_flags(netdev))) {
879         oam_error_log1(0, 0, "{wal_ioctl_set_freq::device is busy, please down it first %d!}\r\n",
880             oal_netdevice_flags(netdev));
881         return HI_ERR_WIFI_WAL_BUSY;
882     }
883 
884     /* pc_param指向新创建的net_device 的name, 将其取出存放到ac_name中 */
885     ret = wal_get_cmd_one_arg(pc_param, ac_freq, WAL_HIPRIV_CMD_NAME_MAX_LEN, &off_set);
886     if (ret != HI_SUCCESS) {
887         oam_warning_log1(0, 0, "{wal_ioctl_set_freq::wal_get_cmd_one_arg vap name return err_code %u!}\r\n", ret);
888         return ret;
889     }
890 
891     channel = oal_atoi(ac_freq);
892     if ((channel < 1) || (channel > 14)) { /* 信道号最大为14 */
893         oam_warning_log1(0, 0, "{wal_ioctl_set_freq::channel set fail = %d!}\r\n", channel);
894         return HI_FAIL;
895     }
896     oam_info_log1(0, 0, "{wal_ioctl_set_freq::channel = %d!}\r\n", channel);
897     ret = mac_is_channel_num_valid(WLAN_BAND_2G, channel);
898     if (ret != HI_SUCCESS) {
899         oam_error_log2(0, OAM_SF_CFG, "{wal_ioctl_set_freq::channel=%d,Err=%d}", channel, ret);
900         return HI_FAIL;
901     }
902     /* **************************************************************************
903         抛事件到wal层处理
904     ************************************************************************** */
905     /* 填写消息 */
906     wal_write_msg_hdr_init(&write_msg, WLAN_CFGID_CURRENT_CHANEL, sizeof(hi_s32));
907     *((hi_s32 *)(write_msg.auc_value)) = channel;
908 
909     /* 发送消息 */
910     ret = wal_send_cfg_event(netdev, WAL_MSG_TYPE_WRITE, WAL_MSG_WRITE_MSG_HDR_LENGTH + sizeof(hi_s32),
911         (hi_u8 *)&write_msg, HI_FALSE, HI_NULL);
912     if (oal_unlikely(ret != HI_SUCCESS)) {
913         oam_warning_log1(0, 0, "{wal_ioctl_set_freq::return err code %d!}\r\n", ret);
914         return ret;
915     }
916 
917     return HI_SUCCESS;
918 }
919 
920 #if (_PRE_OS_VERSION_LINUX == _PRE_OS_VERSION)
wal_ioctl_get_txpower(oal_net_device_stru * netdev,hi_s8 * pc_param)921 static hi_u32 wal_ioctl_get_txpower(oal_net_device_stru *netdev, hi_s8 *pc_param)
922 {
923     return HI_FAIL;
924 }
925 #endif
926 
927 /* 结构体数组g_ast_hipriv_cmd的成员,其中wal_hipriv_getcountry修改了对应变量,lint_t e818告警屏蔽 */
wal_ioctl_set_txpower(oal_net_device_stru * netdev,hi_char * pc_param)928 hi_u32 wal_ioctl_set_txpower(oal_net_device_stru *netdev, hi_char *pc_param)
929 {
930     wal_msg_write_stru       write_msg;
931     hi_s32                   l_pwer;
932     hi_u32                   off_set;
933     hi_char                  ac_val[WAL_HIPRIV_CMD_NAME_MAX_LEN] = {0};
934     hi_u32                   ret;
935 
936     ret = wal_get_cmd_one_arg(pc_param, ac_val, WAL_HIPRIV_CMD_NAME_MAX_LEN, &off_set);
937     if (ret != HI_SUCCESS) {
938         oam_warning_log1(0, 0, "{wal_ioctl_set_txpower::wal_get_cmd_one_arg vap name return err_code %d!}\r\n", ret);
939         return ret;
940     }
941 
942     l_pwer = oal_atoi(ac_val);
943 
944     wal_write_msg_hdr_init(&write_msg, WLAN_CFGID_TX_POWER, sizeof(hi_s32));
945     *((hi_s32 *)(write_msg.auc_value)) = l_pwer;
946 
947     ret = wal_send_cfg_event(netdev, WAL_MSG_TYPE_WRITE, WAL_MSG_WRITE_MSG_HDR_LENGTH + sizeof(hi_s32),
948         (hi_u8 *)&write_msg, HI_FALSE, HI_NULL);
949     if (oal_unlikely(ret != HI_SUCCESS)) {
950         oam_warning_log1(0, 0, "{wal_ioctl_set_txpower::return err code %u!}", ret);
951         return ret;
952     }
953 
954     return HI_SUCCESS;
955 }
956 
957 #if (_PRE_OS_VERSION_LINUX == _PRE_OS_VERSION)
958 /* ****************************************************************************
959  功能描述  : 获取字符串第一个参数,以逗号为命令区分标识,并扣除命令前置字符
960  输入参数  : pc_cmd         : 传入的字符串
961              puc_token      : 命令前置字串
962  输出参数  : pc_arg         : 扣掉命令前置字串后的参数
963              pul_cmd_offset : 第一个参数的长度 调用函数  :
964 **************************************************************************** */
wal_get_parameter_from_cmd(hi_char * pc_cmd,hi_char * pc_arg,const hi_char * puc_token,hi_char * pul_cmd_offset,hi_u32 ul_param_max_len)965 static hi_u32 wal_get_parameter_from_cmd(hi_char *pc_cmd, hi_char *pc_arg, const hi_char *puc_token,
966     hi_char *pul_cmd_offset, hi_u32 ul_param_max_len)
967 {
968     hi_char   *pc_cmd_copy = HI_NULL;
969     hi_char    ac_cmd_copy[WAL_IOCTL_PRIV_SUBCMD_MAX_LEN];
970     hi_u32     pos = 0;
971     hi_u32     arg_len;
972 
973     if (oal_unlikely((pc_cmd == HI_NULL) || (pc_arg == HI_NULL) || (pul_cmd_offset == HI_NULL))) {
974         oam_error_log3(0, 0,
975             "{wal_get_parameter_from_cmd::pc_cmd/pc_arg/pul_cmd_offset null ptr error %d, %d, %d, %d!}\r\n", pc_cmd,
976             pc_arg, pul_cmd_offset);
977         return HI_FAIL;
978     }
979 
980     pc_cmd_copy = pc_cmd;
981 
982     /* 去掉字符串开始的逗号 */
983     while (*pc_cmd_copy == ',') {
984         ++pc_cmd_copy;
985     }
986     /* 取得逗号前的字符串 */
987     while ((*pc_cmd_copy != ',') && (*pc_cmd_copy != '\0')) {
988         ac_cmd_copy[pos] = *pc_cmd_copy;
989         ++pos;
990         ++pc_cmd_copy;
991 
992         if (oal_unlikely(pos >= ul_param_max_len)) {
993             oam_warning_log1(0, 0,
994                 "{wal_get_parameter_from_cmd::ul_pos >= WAL_HIPRIV_CMD_NAME_MAX_LEN, ul_pos %d!}\r\n", pos);
995             return HI_FAIL;
996         }
997     }
998     ac_cmd_copy[pos] = '\0';
999     /* 字符串到结尾,返回错误码 */
1000     if (0 == pos) {
1001         oam_info_log0(0, 0, "{wal_get_parameter_from_cmd::return param pc_arg is null!}\r\n");
1002         return HI_FAIL;
1003     }
1004     *pul_cmd_offset = (hi_u32)(pc_cmd_copy - pc_cmd);
1005 
1006     /* 检查字符串是否包含期望的前置命令字符 */
1007     if (0 != memcmp(ac_cmd_copy, puc_token, strlen(puc_token))) {
1008         return HI_FAIL;
1009     } else {
1010         /* 扣除前置命令字符,回传参数 */
1011         arg_len = strlen(ac_cmd_copy) - strlen(puc_token);
1012         memcpy_s(pc_arg, arg_len, ac_cmd_copy + strlen(puc_token), arg_len);
1013         pc_arg[arg_len] = '\0';
1014     }
1015     return HI_SUCCESS;
1016 }
1017 
1018 /* ****************************************************************************
1019  函 数 名  : wal_ioctl_get_apaddr
1020  功能描述  : 获取BSSID
1021  输入参数  : 无
1022  输出参数  : 无
1023  返 回 值  :
1024  调用函数  :
1025  被调函数  :
1026 
1027  修改历史      :
1028   1.日    期   : 2014年4月21日
1029     作    者   : HiSilicon
1030     修改内容   : 新生成函数
1031 
1032 **************************************************************************** */
wal_ioctl_get_apaddr(oal_net_device_stru * netdev,oal_iw_request_info_stru * info,oal_sockaddr_stru * addr,hi_s8 * pc_extra)1033 static hi_u32 wal_ioctl_get_apaddr(oal_net_device_stru *netdev, oal_iw_request_info_stru *info, oal_sockaddr_stru *addr,
1034     hi_s8 *pc_extra)
1035 {
1036     mac_vap_stru *mac_vap = HI_NULL;
1037     hi_u8          mac_addr[WLAN_MAC_ADDR_LEN] = {0};
1038 
1039     mac_vap = oal_net_dev_priv(netdev);
1040     if (mac_vap == HI_NULL) {
1041         oam_warning_log0(0, 0, "{wal_ioctl_get_apaddr::pst_mac_vap is null!}\r\n");
1042         return HI_FAIL;
1043     }
1044 
1045     if (mac_vap->vap_state == MAC_VAP_STATE_UP) {
1046         if (memcpy_s(addr->sa_data, WLAN_MAC_ADDR_LEN, mac_vap->auc_bssid, WLAN_MAC_ADDR_LEN) != EOK) {
1047             oam_error_log0(0, 0, "{wal_ioctl_get_apaddr::mem safe function err!}");
1048             return HI_FAIL;
1049         }
1050     } else {
1051         if (memcpy_s(addr->sa_data, WLAN_MAC_ADDR_LEN, mac_addr, WLAN_MAC_ADDR_LEN) != EOK) {
1052             oam_error_log0(0, 0, "{wal_ioctl_get_apaddr::mem safe function err!}");
1053             return HI_FAIL;
1054         }
1055     }
1056 
1057     return HI_SUCCESS;
1058 }
1059 
1060 /* ****************************************************************************
1061  函 数 名  : wal_ioctl_get_iwrate
1062  功能描述  : iwconfig获取rate,不支持,返回-1
1063  输入参数  : 无
1064  输出参数  : 无
1065  返 回 值  :
1066  调用函数  :
1067  被调函数  :
1068 
1069  修改历史      :
1070   1.日    期   : 2014年4月21日
1071     作    者   : HiSilicon
1072     修改内容   : 新生成函数
1073 
1074 **************************************************************************** */
wal_ioctl_get_iwrate(oal_net_device_stru * netdev,oal_iw_request_info_stru * info,oal_iw_param_stru * param,hi_s8 * pc_extra)1075 static hi_u32 wal_ioctl_get_iwrate(oal_net_device_stru *netdev, oal_iw_request_info_stru *info,
1076     oal_iw_param_stru *param, hi_s8 *pc_extra)
1077 {
1078     /* iwconfig获取rate,不支持此命令,则返回-1 */
1079     return HI_FAIL;
1080 }
1081 
1082 /* ****************************************************************************
1083  函 数 名  : wal_ioctl_get_iwrate
1084  功能描述  : iwconfig获取sense,不支持,返回-1
1085  输入参数  : 无
1086  输出参数  : 无
1087  返 回 值  :
1088  调用函数  :
1089  被调函数  :
1090 
1091  修改历史      :
1092   1.日    期   : 2014年4月21日
1093     作    者   : HiSilicon
1094     修改内容   : 新生成函数
1095 
1096 **************************************************************************** */
wal_ioctl_get_iwsense(oal_net_device_stru * netdev,oal_iw_request_info_stru * info,oal_iw_param_stru * param,hi_s8 * pc_extra)1097 static hi_u32 wal_ioctl_get_iwsense(oal_net_device_stru *netdev, oal_iw_request_info_stru *info,
1098     oal_iw_param_stru *param, hi_s8 *pc_extra)
1099 {
1100     /* iwconfig获取sense,不支持此命令,则返回-1 */
1101     return HI_FAIL;
1102 }
1103 
1104 /* ****************************************************************************
1105  函 数 名  : wal_ioctl_get_rtsthres
1106  功能描述  : iwconfig获取rtsthres
1107  输入参数  : 无
1108  输出参数  : 无
1109  返 回 值  :
1110  调用函数  :
1111  被调函数  :
1112 
1113  修改历史      :
1114   1.日    期   : 2014年4月21日
1115     作    者   : HiSilicon
1116     修改内容   : 新生成函数
1117 
1118 **************************************************************************** */
wal_ioctl_get_rtsthres(oal_net_device_stru * netdev,oal_iw_request_info_stru * info,oal_iw_param_stru * param,hi_s8 * pc_extra)1119 static hi_u32 wal_ioctl_get_rtsthres(oal_net_device_stru *netdev, oal_iw_request_info_stru *info,
1120     oal_iw_param_stru *param, hi_s8 *pc_extra)
1121 {
1122     mac_vap_stru *mac_vap = HI_NULL;
1123 
1124     mac_vap = oal_net_dev_priv(netdev);
1125     if (mac_vap == HI_NULL) {
1126         oam_warning_log0(0, 0, "{wal_ioctl_get_rtsthres::pst_mac_vap is null!}\r\n");
1127         return HI_FAIL;
1128     }
1129 
1130     param->value    = (hi_s32)mac_vap->mib_info->wlan_mib_operation.dot11_rts_threshold;
1131     param->disabled = (WLAN_RTS_MAX == param->value);
1132     param->fixed    = 1;
1133 
1134     return HI_SUCCESS;
1135 }
1136 
1137 /* ****************************************************************************
1138  函 数 名  : wal_ioctl_get_fragthres
1139  功能描述  : iwconfig获取fragthres
1140  输入参数  : 无
1141  输出参数  : 无
1142  返 回 值  :
1143  调用函数  :
1144  被调函数  :
1145 
1146  修改历史      :
1147   1.日    期   : 2014年4月21日
1148     作    者   : HiSilicon
1149     修改内容   : 新生成函数
1150 
1151 **************************************************************************** */
wal_ioctl_get_fragthres(oal_net_device_stru * netdev,oal_iw_request_info_stru * info,oal_iw_param_stru * param,hi_s8 * pc_extra)1152 static hi_u32 wal_ioctl_get_fragthres(oal_net_device_stru *netdev, oal_iw_request_info_stru *info,
1153     oal_iw_param_stru *param, hi_s8 *pc_extra)
1154 {
1155     mac_vap_stru *mac_vap = HI_NULL;
1156 
1157     mac_vap = oal_net_dev_priv(netdev);
1158     if (mac_vap == HI_NULL) {
1159         oam_warning_log0(0, 0, "{wal_ioctl_get_fragthres::pst_mac_vap is null!}\r\n");
1160         return HI_FAIL;
1161     }
1162 
1163     param->value    = (hi_s32)mac_vap->mib_info->wlan_mib_operation.dot11_fragmentation_threshold;
1164     param->disabled = (WLAN_FRAG_THRESHOLD_MAX == param->value);
1165     param->fixed    = 1;
1166 
1167     return HI_SUCCESS;
1168 }
1169 
1170 /* ****************************************************************************
1171  函 数 名  : wal_ioctl_get_iwencode
1172  功能描述  : iwconfig获取encode, 不支持
1173  输入参数  : 无
1174  输出参数  : 无
1175  返 回 值  :
1176  调用函数  :
1177  被调函数  :
1178 
1179  修改历史      :
1180   1.日    期   : 2014年4月22日
1181     作    者   : HiSilicon
1182     修改内容   : 新生成函数
1183 
1184 **************************************************************************** */
wal_ioctl_get_iwencode(oal_net_device_stru * netdev,oal_iw_request_info_stru * info,oal_iw_point_stru * param,hi_s8 * pc_extra)1185 static hi_u32 wal_ioctl_get_iwencode(oal_net_device_stru *netdev, oal_iw_request_info_stru *info,
1186     oal_iw_point_stru *param, hi_s8 *pc_extra)
1187 {
1188     /* 不支持iwconfig获取encode,直接返回-1 */
1189     return HI_FAIL;
1190 }
1191 
1192 /* ****************************************************************************
1193  函 数 名  : wal_ioctl_get_iwrange
1194  功能描述  : iwconfig获取iwrange, 不支持
1195  输入参数  : 无
1196  输出参数  : 无
1197  返 回 值  :
1198  调用函数  :
1199  被调函数  :
1200 
1201  修改历史      :
1202   1.日    期   : 2014年4月21日
1203     作    者   : HiSilicon
1204     修改内容   : 新生成函数
1205 
1206 **************************************************************************** */
wal_ioctl_get_iwrange(oal_net_device_stru * netdev,oal_iw_request_info_stru * info,oal_iw_point_stru * param,hi_s8 * pc_extra)1207 static hi_u32 wal_ioctl_get_iwrange(oal_net_device_stru *netdev, oal_iw_request_info_stru *info,
1208     oal_iw_point_stru *param, hi_s8 *pc_extra)
1209 {
1210     return HI_FAIL;
1211 }
1212 
1213 /* ****************************************************************************
1214  函 数 名  : wal_ioctl_get_param
1215  功能描述  : iwpriv私有获取参数命令入口
1216  输入参数  : 无
1217  输出参数  : 无
1218  返 回 值  :
1219  调用函数  :
1220  被调函数  :
1221 
1222  修改历史      :
1223   1.日    期   : 2013年1月17日
1224     作    者   : HiSilicon
1225     修改内容   : 新生成函数
1226 
1227 **************************************************************************** */
wal_ioctl_get_param(oal_net_device_stru * netdev,oal_iw_request_info_stru * info,hi_void * iw,hi_s8 * pc_extra)1228 static hi_u32 wal_ioctl_get_param(oal_net_device_stru *netdev, oal_iw_request_info_stru *info, hi_void *iw,
1229     hi_s8 *pc_extra)
1230 {
1231     hi_u32                       ret;
1232     wal_msg_stru                *rsp_msg = HI_NULL;
1233     wal_msg_query_stru           query_msg;
1234     wal_msg_rsp_stru            *query_rsp_msg = HI_NULL;
1235     hi_s32                      *pl_param = HI_NULL;
1236 
1237     pl_param = (hi_s32 *)pc_extra;
1238     oam_info_log1(0, 0, "{wal_ioctl_get_param::return err code %d!}\r\n", pl_param[0]);
1239 
1240     /* **************************************************************************
1241         抛事件到wal层处理
1242     ************************************************************************** */
1243     query_msg.wid = (hi_u16)pl_param[0];
1244 
1245     ret = wal_send_cfg_event(netdev, WAL_MSG_TYPE_QUERY, WAL_MSG_WID_LENGTH, (hi_u8 *)&query_msg, HI_TRUE, &rsp_msg);
1246     if ((ret != HI_SUCCESS) || (rsp_msg == HI_NULL)) {
1247         oam_warning_log1(0, 0, "{wal_ioctl_get_param::return err code %u!}\r\n", ret);
1248         return ret;
1249     }
1250 
1251     /* 处理返回消息 */
1252     query_rsp_msg = (wal_msg_rsp_stru *)(rsp_msg->auc_msg_data);
1253 
1254     /* 业务处理 */
1255     pl_param[0] = *((hi_s32 *)(query_rsp_msg->auc_value));
1256 
1257     oal_free(rsp_msg);
1258     return HI_SUCCESS;
1259 }
1260 
1261 /* ****************************************************************************
1262  函 数 名  : wal_ioctl_set_param
1263  功能描述  : iwpriv私有设置参数命令入口
1264  输入参数  : 无
1265  输出参数  : 无
1266  返 回 值  :
1267  调用函数  :
1268  被调函数  :
1269 
1270  修改历史      :
1271   1.日    期   : 2013年1月17日
1272     作    者   : HiSilicon
1273     修改内容   : 新生成函数
1274 
1275 **************************************************************************** */
wal_ioctl_set_param(oal_net_device_stru * netdev,oal_iw_request_info_stru * info,hi_void * iw,hi_s8 * pc_extra)1276 static hi_u32 wal_ioctl_set_param(oal_net_device_stru *netdev, oal_iw_request_info_stru *info, hi_void *iw,
1277     hi_s8 *pc_extra)
1278 {
1279     hi_s32 l_error = 0;
1280     wal_msg_write_stru write_msg;
1281     hi_u32 ret;
1282 
1283     /* 设备在up状态不允许配置,必须先down */
1284     if ((OAL_IFF_RUNNING & oal_netdevice_flags(netdev)) != 0) {
1285         oam_error_log1(0, 0, "{wal_ioctl_set_param::device is busy, please down it first %d!}\r\n",
1286             oal_netdevice_flags(netdev));
1287         return HI_FAIL;
1288     }
1289 
1290     hi_s32 *pl_param      = (hi_s32 *)pc_extra;
1291     hi_s32 l_subioctl_id  = pl_param[0];    /* 获取sub-ioctl的ID */
1292     hi_s32 l_value        = pl_param[1];    /* 获取要设置的值 */
1293     oam_info_log2(0, 0,  "{wal_ioctl_set_param::subioctl_id, value is %d, %d!}\r\n", l_subioctl_id, l_value);
1294 
1295     if (l_value < 0) {
1296         oam_warning_log1(0, 0, "{wal_ioctl_set_param::input value is negative %d!}\r\n", l_value);
1297         return HI_FAIL;
1298     }
1299 
1300     /* **************************************************************************
1301         抛事件到wal层处理
1302     ************************************************************************** */
1303     wal_write_msg_hdr_init(&write_msg, (hi_u16)l_subioctl_id, sizeof(hi_s32));
1304     if (l_subioctl_id == WLAN_CFGID_PROT_MODE) {
1305         if (l_value >= WLAN_PROT_BUTT) { /* 参数检查 */
1306             l_error = HI_ERR_WIFI_WAL_INVALID_PARAMETER;
1307         }
1308     } else if (l_subioctl_id == WLAN_CFGID_AUTH_MODE) {
1309         if (l_value >= WLAN_WITP_ALG_AUTH_BUTT) { /* 参数检查 */
1310             l_error = HI_ERR_WIFI_WAL_INVALID_PARAMETER;
1311         }
1312     } else if (l_subioctl_id == WLAN_CFGID_BEACON_INTERVAL) {
1313         if (l_value > WLAN_BEACON_INTVAL_MAX || l_value < WLAN_BEACON_INTVAL_MIN) {
1314             l_error = HI_ERR_WIFI_WAL_INVALID_PARAMETER;
1315         }
1316     } else if (l_subioctl_id == WLAN_CFGID_DTIM_PERIOD) {
1317         if (l_value > WLAN_DTIM_PERIOD_MAX || l_value < WLAN_DTIM_PERIOD_MIN) {
1318             oam_error_log1(0, 0, "{wal_ioctl_set_param::input dtim_period invalid %d!}\r\n", l_value);
1319             l_error = HI_ERR_WIFI_WAL_INVALID_PARAMETER;
1320         }
1321     }
1322 
1323     if (l_error != 0) { /* 参数异常 */
1324         return l_error;
1325     }
1326 
1327     *((hi_s32 *)(write_msg.auc_value)) = l_value; /* 填写set消息的payload */
1328 
1329     /* 发送消息 */
1330     ret = wal_send_cfg_event(netdev, WAL_MSG_TYPE_WRITE, WAL_MSG_WRITE_MSG_HDR_LENGTH + sizeof(hi_s32),
1331         (hi_u8 *)&write_msg, HI_FALSE, HI_NULL);
1332     if (oal_unlikely(ret != HI_SUCCESS)) {
1333         oam_warning_log1(0, 0, "{wal_ioctl_set_param::return err code %u!}\r\n", ret);
1334         return ret;
1335     }
1336 
1337     return HI_SUCCESS;
1338 }
1339 
1340 /* 编程规范规则5.1 避免函数过长,函数不超过50行(非空非注释),申请例外: 参数有效性判断,逻辑简单,功能聚合性不拆分 */
wal_ioctl_check_wme_params(hi_s32 l_subioctl_id,hi_s32 l_value)1341 static hi_u32 wal_ioctl_check_wme_params(hi_s32 l_subioctl_id, hi_s32 l_value)
1342 {
1343     hi_s32 l_error = 0;
1344     switch (l_subioctl_id) { /* 根据sub-ioctl id填写WID */
1345         case WLAN_CFGID_EDCA_TABLE_CWMIN:
1346             if ((l_value > WLAN_QEDCA_TABLE_CWMIN_MAX) || (l_value < WLAN_QEDCA_TABLE_CWMIN_MIN)) {
1347                 l_error = HI_ERR_WIFI_WAL_INVALID_PARAMETER;
1348             }
1349             break;
1350 
1351         case WLAN_CFGID_EDCA_TABLE_CWMAX:
1352             if ((l_value > WLAN_QEDCA_TABLE_CWMAX_MAX) || (l_value < WLAN_QEDCA_TABLE_CWMAX_MIN)) {
1353                 l_error = HI_ERR_WIFI_WAL_INVALID_PARAMETER;
1354             }
1355             break;
1356 
1357         case WLAN_CFGID_EDCA_TABLE_AIFSN:
1358             if ((l_value < WLAN_QEDCA_TABLE_AIFSN_MIN) || (l_value > WLAN_QEDCA_TABLE_AIFSN_MAX)) {
1359                 l_error = HI_ERR_WIFI_WAL_INVALID_PARAMETER;
1360             }
1361             break;
1362 
1363         case WLAN_CFGID_EDCA_TABLE_TXOP_LIMIT:
1364             if ((l_value > WLAN_QEDCA_TABLE_TXOP_LIMIT_MAX) || (l_value < WLAN_QEDCA_TABLE_TXOP_LIMIT_MIN)) {
1365                 l_error = HI_ERR_WIFI_WAL_INVALID_PARAMETER;
1366             }
1367             break;
1368 
1369         case WLAN_CFGID_EDCA_TABLE_MSDU_LIFETIME:
1370             if (l_value > WLAN_QEDCA_TABLE_MSDU_LIFETIME_MAX) {
1371                 l_error = HI_ERR_WIFI_WAL_INVALID_PARAMETER;
1372             }
1373             break;
1374 
1375         case WLAN_CFGID_EDCA_TABLE_MANDATORY:
1376             if ((l_value != HI_TRUE) && (l_value != HI_FALSE)) {
1377                 l_error = HI_ERR_WIFI_WAL_INVALID_PARAMETER;
1378             }
1379             break;
1380 
1381         case WLAN_CFGID_QEDCA_TABLE_CWMIN:
1382             if ((l_value > WLAN_QEDCA_TABLE_CWMIN_MAX) || (l_value < WLAN_QEDCA_TABLE_CWMIN_MIN)) {
1383                 l_error = HI_ERR_WIFI_WAL_INVALID_PARAMETER;
1384             }
1385             break;
1386 
1387         case WLAN_CFGID_QEDCA_TABLE_CWMAX:
1388             if ((l_value > WLAN_QEDCA_TABLE_CWMAX_MAX) || (l_value < WLAN_QEDCA_TABLE_CWMAX_MIN)) {
1389                 l_error = HI_ERR_WIFI_WAL_INVALID_PARAMETER;
1390             }
1391             break;
1392 
1393         case WLAN_CFGID_QEDCA_TABLE_AIFSN:
1394             if ((l_value < WLAN_QEDCA_TABLE_AIFSN_MIN) || (l_value > WLAN_QEDCA_TABLE_AIFSN_MAX)) {
1395                 l_error = HI_ERR_WIFI_WAL_INVALID_PARAMETER;
1396             }
1397             break;
1398 
1399         case WLAN_CFGID_QEDCA_TABLE_TXOP_LIMIT:
1400             if (l_value > WLAN_QEDCA_TABLE_TXOP_LIMIT_MAX) {
1401                 l_error = HI_ERR_WIFI_WAL_INVALID_PARAMETER;
1402             }
1403             break;
1404 
1405         case WLAN_CFGID_QEDCA_TABLE_MSDU_LIFETIME:
1406             if (l_value > WLAN_QEDCA_TABLE_MSDU_LIFETIME_MAX) {
1407                 l_error = HI_ERR_WIFI_WAL_INVALID_PARAMETER;
1408             }
1409             break;
1410 
1411         case WLAN_CFGID_QEDCA_TABLE_MANDATORY:
1412             if ((l_value != HI_TRUE) && (l_value != HI_FALSE)) {
1413                 l_error = HI_ERR_WIFI_WAL_INVALID_PARAMETER;
1414             }
1415 
1416             break;
1417 
1418         default:
1419             break;
1420     }
1421 
1422     if (l_error != 0) { /* 参数异常 */
1423         return HI_FAIL;
1424     }
1425 
1426     return HI_SUCCESS;
1427 }
1428 
1429 /* ****************************************************************************
1430  函 数 名  : wal_ioctl_set_wme_params
1431  功能描述  : iwpriv私有设置参数命令入口
1432  输入参数  : 无
1433  输出参数  : 无
1434  返 回 值  :
1435  调用函数  :
1436  被调函数  :
1437 
1438  修改历史      :
1439   1.日    期   : 2013年5月9日
1440     作    者   : HiSilicon
1441     修改内容   : 新生成函数
1442 
1443 **************************************************************************** */
wal_ioctl_set_wme_params(oal_net_device_stru * netdev,oal_iw_request_info_stru * info,hi_void * iw,hi_s8 * pc_extra)1444 static hi_s32 wal_ioctl_set_wme_params(oal_net_device_stru *netdev, oal_iw_request_info_stru *info, hi_void *iw,
1445     hi_s8 *pc_extra)
1446 {
1447     hi_u32                       ret;
1448     hi_s32                      *pl_param = HI_NULL;
1449     hi_s32                       l_subioctl_id;
1450     hi_s32                       l_ac;
1451     hi_s32                       l_value;
1452     wal_msg_write_stru           write_msg;
1453     wal_msg_wmm_stru            *wmm_params = HI_NULL;
1454 
1455     /* 设备在up状态不允许配置,必须先down */
1456     if (0 != (OAL_IFF_RUNNING & oal_netdevice_flags(netdev))) {
1457         oam_error_log1(0, 0, "{wal_ioctl_set_wme_params::device is busy, please down it first %d!}\r\n",
1458             oal_netdevice_flags(netdev));
1459         return HI_FAIL;
1460     }
1461 
1462     pl_param      = (hi_s32 *)pc_extra;
1463     l_subioctl_id = pl_param[0];    /* 获取sub-ioctl的ID */
1464     l_ac          = pl_param[1];
1465     l_value       = pl_param[2];    /* 2: 获取要设置的值 */
1466 
1467     oam_info_log3(0, 0, "{wal_ioctl_set_wme_params::the subioctl_id,l_ac,value is %d, %d, %d!}\r\n", l_subioctl_id,
1468         l_ac, l_value);
1469 
1470     /* ac取值0~3, value不能为负值 */
1471     if ((l_value < 0) || (l_ac < 0) || (l_ac >= WLAN_WME_AC_BUTT)) {
1472         oam_warning_log2(0, 0, "{wal_ioctl_set_wme_params::input value is negative %d, %d!}\r\n", l_value, l_ac);
1473         return HI_FAIL;
1474     }
1475 
1476     /* **************************************************************************
1477         抛事件到wal层处理
1478     ************************************************************************** */
1479     if (wal_ioctl_check_wme_params(l_subioctl_id, l_value) != HI_SUCCESS) { /* 参数异常 */
1480         return HI_FAIL;
1481     }
1482 
1483     wal_write_msg_hdr_init(&write_msg, (hi_u16)l_subioctl_id, sizeof(wal_msg_wmm_stru));
1484 
1485     wmm_params               = (wal_msg_wmm_stru *)(write_msg.auc_value);
1486     wmm_params->cfg_id    = (hi_u16)l_subioctl_id;
1487     wmm_params->ac        = (hi_u32)l_ac;                     /* 填写set消息的payload */
1488     wmm_params->value     = (hi_u32)l_value;                  /* 填写set消息的payload */
1489 
1490     ret = wal_send_cfg_event(netdev, WAL_MSG_TYPE_WRITE, WAL_MSG_WRITE_MSG_HDR_LENGTH + sizeof(wal_msg_wmm_stru),
1491         (hi_u8 *)&write_msg, HI_FALSE, HI_NULL);
1492     if (oal_unlikely(ret != HI_SUCCESS)) {
1493         oam_warning_log1(0, 0, "{wal_ioctl_set_wme_params::return err code %u!}\r\n", ret);
1494         return ret;
1495     }
1496 
1497     return HI_SUCCESS;
1498 }
1499 
1500 /* ****************************************************************************
1501  函 数 名  : wal_ioctl_get_wme_params
1502  功能描述  : iwpriv私有获取参数命令入口
1503  输入参数  : 无
1504  输出参数  : 无
1505  返 回 值  :
1506  调用函数  :
1507  被调函数  :
1508 
1509  修改历史      :
1510   1.日    期   : 2013年5月9日
1511     作    者   : HiSilicon
1512     修改内容   : 新生成函数
1513 
1514 **************************************************************************** */
wal_ioctl_get_wme_params(oal_net_device_stru * netdev,oal_iw_request_info_stru * info,hi_void * iw,hi_s8 * pc_extra)1515 static hi_u32 wal_ioctl_get_wme_params(oal_net_device_stru *netdev, oal_iw_request_info_stru *info, hi_void *iw,
1516     hi_s8 *pc_extra)
1517 {
1518     hi_s32                     *param = HI_NULL;
1519     mac_vap_stru               *mac_vap = HI_NULL;
1520     wal_msg_query_stru          query_msg;
1521     wal_msg_stru               *rsp_msg = HI_NULL;
1522     wal_msg_rsp_stru           *query_rsp_msg = HI_NULL;
1523     hmac_config_wmm_para_stru  *wmm_para = HI_NULL;
1524     hi_u32                      ret;
1525     hi_s32                     *pl_param = HI_NULL;
1526 
1527     param = (hi_s32 *)pc_extra;
1528     mac_vap = oal_net_dev_priv(netdev);
1529     if (oal_unlikely(mac_vap == HI_NULL)) {
1530         oam_error_log0(0, 0, "{wal_ioctl_get_wme_params::oal_net_dev_priv(pst_net_dev) is null ptr.}\r\n");
1531         return HI_ERR_CODE_PTR_NULL;
1532     }
1533     pl_param = (hi_s32 *)pc_extra;
1534     oam_info_log1(0, OAM_SF_WMM, "{wal_ioctl_get_wme_params::return err code %d!}\r\n", pl_param[0]);
1535     /* **************************************************************************
1536         抛事件到wal层处理
1537     ************************************************************************** */
1538     query_msg.wid = (hi_u16)pl_param[0];
1539 
1540     /* 发送消息 */
1541     ret = wal_send_cfg_event(netdev, WAL_MSG_TYPE_QUERY, WAL_MSG_WID_LENGTH, (hi_u8 *)&query_msg, HI_TRUE, &rsp_msg);
1542     if (ret != HI_SUCCESS) {
1543         oam_warning_log1(0, 0, "{wal_ioctl_get_wme_params::fail to get wmm params, error[%u]}", ret);
1544         return ret;
1545     }
1546 
1547     /* 处理返回消息 */
1548     query_rsp_msg = (wal_msg_rsp_stru *)(rsp_msg->auc_msg_data);
1549 
1550     /* 业务处理 */
1551     wmm_para = (hmac_config_wmm_para_stru*)(query_rsp_msg->auc_value);
1552     param[0] = wmm_para->value;
1553 
1554     oal_free(rsp_msg);
1555 
1556     return HI_SUCCESS;
1557 }
1558 
1559 /* ****************************************************************************
1560  函 数 名  : wal_ioctl_setcountry
1561  功能描述  : 设置管制域国家码
1562  输入参数  : pst_net_dev: net device
1563              pst_info   : 请求的信息
1564              p_w        : 请求的信息
1565              pc_extra   : 国家字符串
1566  输出参数  : 无
1567  返 回 值  : 错误码
1568  调用函数  :
1569  被调函数  :
1570 
1571  修改历史      :
1572   1.日    期   : 2013年10月16日
1573     作    者   : HiSilicon
1574     修改内容   : 新生成函数
1575 
1576 **************************************************************************** */
wal_ioctl_setcountry(oal_net_device_stru * netdev,oal_iw_request_info_stru * info,hi_void * w,hi_s8 * pc_extra)1577 static hi_u32 wal_ioctl_setcountry(oal_net_device_stru *netdev, oal_iw_request_info_stru *info, hi_void *w,
1578     hi_s8 *pc_extra)
1579 {
1580     hi_u32 ret;
1581 
1582     /* 设备在up状态不允许配置,必须先down */
1583     if (0 != (OAL_IFF_RUNNING & oal_netdevice_flags(netdev))) {
1584         oam_info_log1(0, 0, "{wal_ioctl_setcountry::country is %d, %d!}\r\n", oal_netdevice_flags(netdev));
1585         return HI_FAIL;
1586     }
1587 
1588     ret = wal_regdomain_update(netdev, pc_extra, MAC_CONTRY_CODE_LEN);
1589     if (ret != HI_SUCCESS) {
1590         oam_warning_log1(0, 0, "{wal_ioctl_setcountry::regdomain_update return err code %u!}\r\n", ret);
1591         return ret;
1592     }
1593 
1594     return HI_SUCCESS;
1595 }
1596 
1597 /* ****************************************************************************
1598  函 数 名  : wal_ioctl_getcountry
1599  功能描述  : 读取国家码
1600  输入参数  : pst_net_dev: net device
1601              pst_info   : 请求的信息
1602              p_w        : 请求的信息
1603  输出参数  : pc_extra   : 读取到的国家码
1604  返 回 值  : 错误码
1605  调用函数  :
1606  被调函数  :
1607 
1608  修改历史      :
1609   1.日    期   : 2013年10月16日
1610     作    者   : HiSilicon
1611     修改内容   : 新生成函数
1612 
1613 **************************************************************************** */
wal_ioctl_getcountry(oal_net_device_stru * netdev,oal_iw_request_info_stru * info,hi_void * w,hi_s8 * pc_extra)1614 static hi_u32 wal_ioctl_getcountry(oal_net_device_stru *netdev, oal_iw_request_info_stru *info, hi_void *w,
1615     hi_s8 *pc_extra)
1616 {
1617     hi_u32                          ret;
1618     wal_msg_query_stru              query_msg;
1619     wal_msg_stru                   *rsp_msg = HI_NULL;
1620     wal_msg_rsp_stru               *query_rsp_msg = HI_NULL;
1621     mac_cfg_get_country_stru       *get_country = HI_NULL;
1622     oal_iw_point_stru              *iw_point = (oal_iw_point_stru *)w;
1623 
1624     /* **************************************************************************
1625        抛事件到wal层处理
1626     ************************************************************************** */
1627     query_msg.wid = WLAN_CFGID_COUNTRY;
1628 
1629     /* 发送消息 */
1630     ret = wal_send_cfg_event(netdev, WAL_MSG_TYPE_QUERY, WAL_MSG_WID_LENGTH, (hi_u8 *)&query_msg, HI_TRUE, &rsp_msg);
1631     if ((ret != HI_SUCCESS) || (rsp_msg == HI_NULL)) {
1632         oam_error_log1(0, 0, "{wal_ioctl_getcountry:: wal_alloc_cfg_event return err code %u!}\r\n", ret);
1633         return ret;
1634     }
1635     /* 处理返回消息 */
1636     query_rsp_msg = (wal_msg_rsp_stru *)(rsp_msg->auc_msg_data);
1637     /* 业务处理 */
1638     get_country = (mac_cfg_get_country_stru *)(query_rsp_msg->auc_value);
1639     if (get_country->ac_country != HI_NULL) {
1640         if (memcpy_s(pc_extra, WLAN_COUNTRY_STR_LEN, get_country->ac_country, WLAN_COUNTRY_STR_LEN) != EOK) {
1641             oam_error_log0(0, 0, "{wal_ioctl_getcountry::mem safe function err!}");
1642             oal_free(rsp_msg);
1643             return HI_FAIL;
1644         }
1645     }
1646     iw_point->length = WLAN_COUNTRY_STR_LEN;
1647     oal_free(rsp_msg);
1648 
1649     return HI_SUCCESS;
1650 }
1651 
1652 /* ****************************************************************************
1653  功能描述  : netd下发命令取得关联设备列表
1654  输入参数  : oal_iw_request_info_stru *pst_info
1655              oal_iwreq_data_union *pst_wrqu
1656 **************************************************************************** */
wal_ioctl_get_assoc_list(oal_net_device_stru * net_dev,oal_iw_request_info_stru * info,oal_iwreq_data_union * wrqu,hi_s8 * pc_extra)1657 static hi_s32 wal_ioctl_get_assoc_list(oal_net_device_stru *net_dev, oal_iw_request_info_stru *info,
1658     oal_iwreq_data_union *wrqu, hi_s8 *pc_extra)
1659 {
1660     hi_s32                       l_ret;
1661     wal_msg_query_stru              st_query_msg;
1662     wal_msg_stru                   *pst_rsp_msg = HI_NULL;
1663     wal_msg_rsp_stru               *pst_query_rsp_msg = HI_NULL;
1664     hi_char                       *pc_sta_list = HI_NULL;
1665     oal_netbuf_stru                *pst_response_netbuf = HI_NULL;
1666 
1667     if (oal_unlikely(info == HI_NULL || wrqu == HI_NULL || pc_extra == HI_NULL)) {
1668         oam_warning_log3(0, 0,
1669             "{wal_ioctl_get_assoc_list:: param is HI_NULL , pst_info = %p , pst_wrqu = %p , pc_extra = %p}\n", info,
1670             wrqu, pc_extra);
1671         return -OAL_EFAIL;
1672     }
1673 
1674     /* 上层在任何时候都可能下发此命令,需要先判断当前netdev的状态并及时返回 */
1675     if (oal_unlikely(oal_net_dev_priv(net_dev) == HI_NULL)) {
1676         return -OAL_EFAIL;
1677     }
1678 
1679     /* **************************************************************************
1680         抛事件到wal层处理
1681     ************************************************************************** */
1682     st_query_msg.wid = WLAN_CFGID_GET_STA_LIST;
1683 
1684     /* 发送消息 */
1685     l_ret = wal_send_cfg_event(net_dev, WAL_MSG_TYPE_QUERY, WAL_MSG_WID_LENGTH, (hi_u8 *)&st_query_msg, HI_TRUE,
1686         &pst_rsp_msg);
1687     if ((l_ret != HI_SUCCESS) || (pst_rsp_msg == HI_NULL)) {
1688         oam_error_log1(0, 0, "{wal_ioctl_get_assoc_list:: wal_alloc_cfg_event return err code %d!}\r\n", l_ret);
1689         return l_ret;
1690     }
1691 
1692     /* 处理返回消息 */
1693     pst_query_rsp_msg = (wal_msg_rsp_stru *)(pst_rsp_msg->auc_msg_data);
1694     /* 业务处理 */
1695     if (pst_query_rsp_msg->us_len >= sizeof(oal_netbuf_stru)) {
1696         /* 获取hmac保存的netbuf指针 */
1697         memcpy_s(&pst_response_netbuf, sizeof(oal_netbuf_stru), pst_query_rsp_msg->auc_value, sizeof(oal_netbuf_stru));
1698         if (pst_response_netbuf != HI_NULL) {
1699             /* 保存ap保存的sta地址信息 */
1700             pc_sta_list = (hi_char *)oal_netbuf_data(pst_response_netbuf);
1701             wrqu->data.length = (hi_u16)(oal_netbuf_len(pst_response_netbuf) + 1);
1702             memcpy_s(pc_extra, wrqu->data.length, pc_sta_list, wrqu->data.length);
1703             pc_extra[oal_netbuf_len(pst_response_netbuf)] = '\0';
1704             oal_netbuf_free(pst_response_netbuf);
1705         } else {
1706             l_ret = -OAL_ENOMEM;
1707         }
1708     } else {
1709         oal_print_hex_dump((hi_u8 *)pst_rsp_msg->auc_msg_data, pst_query_rsp_msg->us_len, 32,
1710             "query msg: "); /* group size 32 */
1711         l_ret = -OAL_EINVAL;
1712     }
1713 
1714     if (l_ret != HI_SUCCESS) {
1715         oam_error_log1(0, 0, "{wal_ioctl_get_assoc_list::process failed,ret=%d}", l_ret);
1716     } else {
1717         oal_io_print2("wal_ioctl_get_assoc_list,pc_sta_list is:%s,len:%d\n", pc_extra, wrqu->data.length);
1718     }
1719 
1720     oal_free(pst_rsp_msg);
1721     return l_ret;
1722 }
1723 
1724 /* ****************************************************************************
1725  功能描述  : set ap mac filter mode to hmac
1726 **************************************************************************** */
wal_config_mac_filter(oal_net_device_stru * net_dev,hi_char * pc_command)1727 static hi_s32 wal_config_mac_filter(oal_net_device_stru *net_dev, hi_char *pc_command)
1728 {
1729     hi_char                    parsed_command[WAL_IOCTL_PRIV_SUBCMD_MAX_LEN];
1730     hi_char                   *pc_parse_command = HI_NULL;
1731     hi_u32                     ul_mac_mode;
1732     hi_u32                     ul_mac_cnt;
1733     hi_u32                     ul_i;
1734 #ifdef _PRE_WLAN_FEATURE_CUSTOM_SECURITY
1735     wal_msg_write_stru         st_write_msg;
1736     hi_u16                     us_len;
1737     wal_msg_stru              *pst_rsp_msg = HI_NULL;
1738     hi_u32                     ul_err_code;
1739     hi_s32                     l_ret = 0;
1740 #endif
1741     hi_u32                     ul_ret;
1742     hi_char                    off_set;
1743 
1744     if (pc_command == HI_NULL) {
1745         return -OAL_EINVAL;
1746     }
1747     pc_parse_command = pc_command;
1748 
1749     /* 解析MAC_MODE */
1750     ul_ret = wal_get_parameter_from_cmd(pc_parse_command, parsed_command, "MAC_MODE=", &off_set,
1751         WAL_IOCTL_PRIV_SUBCMD_MAX_LEN);
1752     if (ul_ret != HI_SUCCESS) {
1753         oam_warning_log1(0, 0, "{wal_config_mac_filter::wal_get_parameter_from_cmd return err_code %u.}\r\n", ul_ret);
1754         return -OAL_EINVAL;
1755     }
1756     /* 检查参数是否合法 0,1,2 */
1757     ul_mac_mode = (hi_u32)oal_atoi(parsed_command);
1758     if (ul_mac_mode > 2) { /* mac mode 2 */
1759         oam_warning_log4(0, 0, "{wal_config_mac_filter::invalid MAC_MODE[%c%c%c%c]!}\r\n", (hi_u8)parsed_command[0],
1760             (hi_u8)parsed_command[1],                            /* command 0/1 */
1761             (hi_u8)parsed_command[2], (hi_u8)parsed_command[3]); /* command 2/3 */
1762         return -OAL_EINVAL;
1763     }
1764 
1765     /* 设置过滤模式 */
1766 #ifdef _PRE_WLAN_FEATURE_CUSTOM_SECURITY
1767     ul_ret = wal_hipriv_send_cfg_uint32_data(net_dev, parsed_command, WLAN_CFGID_BLACKLIST_MODE);
1768     if (ul_ret != HI_SUCCESS) {
1769         return (hi_s32)ul_ret;
1770     }
1771 #endif
1772     /* 解析MAC_CNT */
1773     pc_parse_command += off_set;
1774     ul_ret = wal_get_parameter_from_cmd(pc_parse_command, parsed_command, "MAC_CNT=", &off_set,
1775         WAL_IOCTL_PRIV_SUBCMD_MAX_LEN);
1776     if (ul_ret != HI_SUCCESS) {
1777         oam_warning_log1(0, 0, "{wal_config_mac_filter::wal_get_parameter_from_cmd return err_code [%u]!}\r\n", ul_ret);
1778         return -OAL_EINVAL;
1779     }
1780     ul_mac_cnt = (hi_u32)oal_atoi(parsed_command);
1781 
1782     for (ul_i = 0; ul_i < ul_mac_cnt; ul_i++) {
1783         pc_parse_command += off_set;
1784         ul_ret = wal_get_parameter_from_cmd(pc_parse_command, parsed_command, "MAC=", &off_set,
1785             WAL_IOCTL_PRIV_SUBCMD_MAX_LEN);
1786         if (ul_ret != HI_SUCCESS) {
1787             oam_warning_log1(0, 0, "{wal_config_mac_filter::wal_get_parameter_from_cmd return err_code [%u]!}\r\n",
1788                 ul_ret);
1789             return -OAL_EINVAL;
1790         }
1791         /* 5.1  检查参数是否符合MAC长度 */
1792         if (WLAN_MAC_ADDR_LEN * 2 != strlen(parsed_command)) { /* mac len mul 2 */
1793             oam_warning_log0(0, 0, "{wal_config_mac_filter::invalid MAC format}\r\n");
1794             return -OAL_EINVAL;
1795         }
1796         /* 6. 添加过滤设备 */
1797 #ifdef _PRE_WLAN_FEATURE_CUSTOM_SECURITY
1798         /* **************************************************************************
1799                              抛事件到wal层处理
1800         ************************************************************************** */
1801         memset_s((hi_u8 *)&st_write_msg, sizeof(st_write_msg), 0, sizeof(st_write_msg));
1802         oal_strtoaddr(parsed_command, st_write_msg.auc_value); /* 将字符 ac_name 转换成数组 mac_add[6] */
1803 
1804         us_len = OAL_MAC_ADDR_LEN; /* OAL_SIZEOF(hi_u8); */
1805 
1806         if (ul_i == (ul_mac_cnt - 1)) {
1807             /* 等所有的mac地址都添加完成后,才进行关联用户确认,是否需要删除 */
1808             wal_write_msg_hdr_init(&st_write_msg, WLAN_CFGID_ADD_BLACK_LIST, us_len);
1809         } else {
1810             wal_write_msg_hdr_init(&st_write_msg, WLAN_CFGID_ADD_BLACK_LIST_ONLY, us_len);
1811         }
1812 
1813         /* 6.1  发送消息 */
1814         l_ret = wal_send_cfg_event(net_dev, WAL_MSG_TYPE_WRITE, WAL_MSG_WRITE_MSG_HDR_LENGTH + us_len,
1815             (hi_u8 *)&st_write_msg, HI_TRUE, &pst_rsp_msg);
1816         if ((l_ret != HI_SUCCESS) || (pst_rsp_msg == HI_NULL)) {
1817             oam_error_log1(0, 0, "{wal_config_mac_filter:: wal_send_cfg_event return err code %d!}\r\n", l_ret);
1818             return l_ret;
1819         }
1820 
1821         /* 6.2  读取返回的错误码 */
1822         ul_err_code = wal_check_and_release_msg_resp(pst_rsp_msg);
1823         if (ul_err_code != HI_SUCCESS) {
1824             oam_error_log1(0, OAM_SF_CFG, "{wal_config_mac_filter::wal_send_cfg_event return err code:[%x]!}\r\n",
1825                 ul_err_code);
1826             return -OAL_EFAIL;
1827         }
1828 #endif
1829     }
1830 
1831     /* 每次设置完成mac地址过滤后,清空此中间变量 */
1832     memset_s(g_st_ap_config_info.ac_ap_mac_filter_mode, sizeof(g_st_ap_config_info.ac_ap_mac_filter_mode), 0,
1833         sizeof(g_st_ap_config_info.ac_ap_mac_filter_mode));
1834 
1835     return HI_SUCCESS;
1836 }
1837 
1838 /* ****************************************************************************
1839  功能描述  : deauth auc_mac_addr in ap mode
1840 **************************************************************************** */
wal_kick_sta(oal_net_device_stru * net_dev,hi_u8 * mac_addr,hi_u8 addr_len)1841 static hi_s32 wal_kick_sta(oal_net_device_stru *net_dev, hi_u8 *mac_addr, hi_u8 addr_len)
1842 {
1843 #ifdef _PRE_WLAN_FEATURE_CUSTOM_SECURITY
1844     wal_msg_write_stru          st_write_msg;
1845     wal_msg_stru               *pst_rsp_msg = HI_NULL;
1846     hi_u32                  ul_err_code;
1847     mac_cfg_kick_user_param_stru   *pst_kick_user_param;
1848     hi_s32                       l_ret;
1849 #endif
1850 
1851     if (mac_addr == NULL) {
1852         oam_error_log0(0, 0, "{wal_kick_sta::argument auc_mac_addr is null.\n");
1853         return -OAL_EFAIL;
1854     }
1855     hi_unref_param(addr_len);
1856 
1857 #ifdef _PRE_WLAN_FEATURE_CUSTOM_SECURITY
1858 
1859     WAL_WRITE_MSG_HDR_INIT(&st_write_msg, WLAN_CFGID_KICK_USER, sizeof(mac_cfg_kick_user_param_stru));
1860 
1861     pst_kick_user_param = (mac_cfg_kick_user_param_stru *)(st_write_msg.auc_value);
1862     oal_set_mac_addr(pst_kick_user_param->auc_mac_addr, mac_addr);
1863 
1864     pst_kick_user_param->us_reason_code = MAC_AUTH_NOT_VALID;
1865 
1866     l_ret = wal_send_cfg_event(net_dev, WAL_MSG_TYPE_WRITE,
1867         WAL_MSG_WRITE_MSG_HDR_LENGTH + sizeof(mac_cfg_kick_user_param_stru), (hi_u8 *)&st_write_msg, HI_TRUE,
1868         &pst_rsp_msg);
1869     if ((l_ret != HI_SUCCESS) || (pst_rsp_msg == HI_NULL)) {
1870         oam_error_log1(0, 0, "{wal_kick_sta:: wal_send_cfg_event return err code %d!}\r\n", l_ret);
1871         return l_ret;
1872     }
1873 
1874     /* 4.4  读取返回的错误码 */
1875     ul_err_code = wal_check_and_release_msg_resp(pst_rsp_msg);
1876     if (ul_err_code != HI_SUCCESS) {
1877         oam_error_log1(0, OAM_SF_CFG, "{wal_kick_sta::wal_send_cfg_event return err code: [%x]!}\r\n", ul_err_code);
1878         return -OAL_EFAIL;
1879     }
1880 #endif
1881 
1882     return HI_SUCCESS;
1883 }
1884 
1885 /* ****************************************************************************
1886  功能描述  : netd下发命令设置黑名单或白名单
1887  输入参数  : oal_iw_request_info_stru *pst_info
1888              oal_iwreq_data_union *pst_wrqu
1889 **************************************************************************** */
wal_ioctl_set_mac_filters(oal_net_device_stru * net_dev,oal_iw_request_info_stru * info,oal_iwreq_data_union * wrqu,hi_s8 * pc_extra)1890 static hi_s32 wal_ioctl_set_mac_filters(oal_net_device_stru *net_dev, oal_iw_request_info_stru *info,
1891     oal_iwreq_data_union *wrqu, hi_s8 *pc_extra)
1892 {
1893     mac_vap_stru           *pst_vap           = HI_NULL;
1894     hi_char                *pc_command        = HI_NULL;
1895     hi_s32                  l_ret;
1896     hi_u32                  ul_ret;
1897     hi_char                 parsed_command[WAL_IOCTL_PRIV_SUBCMD_MAX_LEN];
1898     hi_char                *pc_parse_command = HI_NULL;
1899     hi_u32                  ul_mac_mode;
1900     hi_u32                  ul_mac_cnt;
1901     hi_u8                   mac_addr[WLAN_MAC_ADDR_LEN];
1902     hi_char                 off_set;
1903 
1904     if (oal_unlikely(info == HI_NULL || wrqu == HI_NULL || pc_extra == HI_NULL)) {
1905         oam_warning_log3(0, 0,
1906             "{wal_ioctl_set_mac_filters:: param is HI_NULL , pst_info = %p , pst_wrqu = %p , pc_extra = %p}\n", info,
1907             wrqu, pc_extra);
1908         return -OAL_EFAIL;
1909     }
1910 
1911     /* 1. 申请内存保存netd 下发的命令和数据 */
1912     pc_command = oal_memalloc((hi_s32)(wrqu->data.length + 1));
1913     if (pc_command == HI_NULL) {
1914         return -OAL_ENOMEM;
1915     }
1916 
1917     /* 2. 拷贝netd 命令到内核态中 */
1918     memset_s(pc_command, (hi_u32)(wrqu->data.length + 1), 0, (hi_u32)(wrqu->data.length + 1));
1919     ul_ret =
1920         oal_copy_from_user(pc_command, (hi_u32)(wrqu->data.length), wrqu->data.pointer, (hi_u32)(wrqu->data.length));
1921     if (ul_ret != HI_SUCCESS) {
1922         oam_error_log0(0, 0, "{wal_ioctl_set_mac_filters::oal_copy_from_user: -OAL_EFAIL }\r\n");
1923         oal_free(pc_command);
1924         return -OAL_EFAIL;
1925     }
1926     pc_command[wrqu->data.length] = '\0';
1927 
1928     oal_io_print2("wal_ioctl_set_mac_filters,data len:%d, command is:%s\n", wrqu->data.length, pc_command);
1929 
1930     pc_parse_command = pc_command;
1931 
1932     memset_s(g_st_ap_config_info.ac_ap_mac_filter_mode, sizeof(g_st_ap_config_info.ac_ap_mac_filter_mode), 0,
1933         sizeof(g_st_ap_config_info.ac_ap_mac_filter_mode));
1934     l_ret = strcpy_s(g_st_ap_config_info.ac_ap_mac_filter_mode, sizeof(g_st_ap_config_info.ac_ap_mac_filter_mode),
1935         pc_command);
1936     if (l_ret != EOK) {
1937         oam_error_log0(0, 0, "{wal_ioctl_set_mac_filters::strcpy_s fail }\r\n");
1938     }
1939 
1940     pst_vap = oal_net_dev_priv(net_dev);
1941     if (pst_vap == HI_NULL) {
1942         oam_warning_log0(0, 0, "{wal_ioctl_set_mac_filters::netdevice vap is null,just save it.}\r\n");
1943         oal_free(pc_command);
1944         return HI_SUCCESS;
1945     }
1946 
1947     /* 3  解析MAC_MODE */
1948     ul_ret = wal_get_parameter_from_cmd(pc_parse_command, parsed_command, "MAC_MODE=", &off_set,
1949         WAL_IOCTL_PRIV_SUBCMD_MAX_LEN);
1950     if (ul_ret != HI_SUCCESS) {
1951         oam_warning_log1(0, 0, "{wal_ioctl_set_mac_filters::wal_get_parameter_from_cmd return err_code [%u]!}\r\n",
1952             ul_ret);
1953         oal_free(pc_command);
1954         return -OAL_EINVAL;
1955     }
1956     /* 3.1 检查参数是否合法 0,1,2 */
1957     ul_mac_mode = (hi_u32)oal_atoi(parsed_command);
1958     if (ul_mac_mode > 2) { /* mac mode 2 */
1959         oam_warning_log4(0, 0, "{wal_ioctl_set_mac_filters::invalid MAC_MODE[%c%c%c%c]!}", (hi_u8)parsed_command[0],
1960             (hi_u8)parsed_command[1],                            /* command 0/1 */
1961             (hi_u8)parsed_command[2], (hi_u8)parsed_command[3]); /* command 2/3 */
1962         oal_free(pc_command);
1963         return -OAL_EINVAL;
1964     }
1965 
1966     /* 5 解析MAC_CNT */
1967     pc_parse_command += off_set;
1968     ul_ret = wal_get_parameter_from_cmd(pc_parse_command, parsed_command, "MAC_CNT=", &off_set,
1969         WAL_IOCTL_PRIV_SUBCMD_MAX_LEN);
1970     if (ul_ret != HI_SUCCESS) {
1971         oam_warning_log1(0, 0, "{wal_ioctl_set_mac_filters::wal_get_parameter_from_cmd return err_code [%u]!}\r\n",
1972             ul_ret);
1973         oal_free(pc_command);
1974         return -OAL_EINVAL;
1975     }
1976     ul_mac_cnt = (hi_u32)oal_atoi(parsed_command);
1977 
1978     l_ret = wal_config_mac_filter(net_dev, pc_command);
1979     if (l_ret != HI_SUCCESS) {
1980         oam_warning_log1(0, 0, "{wal_ioctl_set_mac_filters::wal_config_mac_filter return err_code [%u]!}\r\n", l_ret);
1981     }
1982 
1983     /* 如果是白名单模式,且下发允许MAC地址为空,即不允许任何设备关联,需要去关联所有已经关联的STA */
1984     if ((ul_mac_cnt == 0) && (ul_mac_mode == 2)) { /* mac mode equal 2 */
1985         oam_warning_log0(0, 0, "{wal_ioctl_set_mac_filters::delete all user!}");
1986 
1987         memset_s(mac_addr, WLAN_MAC_ADDR_LEN, 0xff, WLAN_MAC_ADDR_LEN);
1988         l_ret = wal_kick_sta(net_dev, mac_addr, WLAN_MAC_ADDR_LEN);
1989     }
1990 
1991     oal_free(pc_command);
1992     return l_ret;
1993 }
1994 
1995 /* ****************************************************************************
1996  功能描述  : set ap max user count to hmac
1997  输入参数  : oal_net_device_stru *pst_net_dev
1998                          : hi_u32 ul_ap_max_user
1999 **************************************************************************** */
wal_set_ap_max_user(oal_net_device_stru * net_dev,hi_u32 ap_max_user)2000 static hi_s32 wal_set_ap_max_user(oal_net_device_stru *net_dev, hi_u32 ap_max_user)
2001 {
2002     wal_msg_write_stru          st_write_msg;
2003     wal_msg_stru               *pst_rsp_msg = HI_NULL;
2004     hi_u32                  ul_err_code;
2005     hi_s32                   l_ret;
2006 
2007     oam_warning_log1(0, 0, "{wal_set_ap_max_user:: ap_max_user is : %u.}\r\n", ap_max_user);
2008 
2009     if (ap_max_user == 0) {
2010         oam_warning_log1(0, 0, "{wal_set_ap_max_user::invalid ap max user(%u),ignore this set.}\r\n", ap_max_user);
2011         return HI_SUCCESS;
2012     }
2013 
2014     wal_write_msg_hdr_init(&st_write_msg, WLAN_CFGID_SET_MAX_USER, sizeof(ap_max_user));
2015     *((hi_u32 *)st_write_msg.auc_value) = ap_max_user;
2016     l_ret = wal_send_cfg_event(net_dev, WAL_MSG_TYPE_WRITE, WAL_MSG_WRITE_MSG_HDR_LENGTH + sizeof(ap_max_user),
2017         (hi_u8 *)&st_write_msg, HI_TRUE, &pst_rsp_msg);
2018     if ((l_ret != HI_SUCCESS) || (pst_rsp_msg == HI_NULL)) {
2019         oam_error_log1(0, 0, "{wal_set_ap_max_user:: wal_send_cfg_event return err code %d!}\r\n", l_ret);
2020 
2021         return l_ret;
2022     }
2023 
2024     /* 读取返回的错误码 */
2025     ul_err_code = wal_check_and_release_msg_resp(pst_rsp_msg);
2026     if (ul_err_code != HI_SUCCESS) {
2027         oam_error_log1(0, OAM_SF_CFG, "{wal_set_ap_max_user::wal_send_cfg_event return err code: [%d]!}\r\n",
2028             ul_err_code);
2029         return -OAL_EFAIL;
2030     }
2031 
2032     /* 每次设置最大用户数完成后,都清空为非法值0 */
2033     g_st_ap_config_info.ap_max_user = 0;
2034 
2035     return l_ret;
2036 }
2037 
2038 /* ****************************************************************************
2039  功能描述  : 设置netd下发APUT config参数 (最大用户数)
2040  输入参数  : oal_iw_request_info_stru *pst_info
2041              oal_iwreq_data_union *pst_wrqu
2042 **************************************************************************** */
wal_ioctl_set_ap_config(oal_net_device_stru * net_dev,oal_iw_request_info_stru * info,oal_iwreq_data_union * wrqu,hi_s8 * pc_extra)2043 static hi_s32 wal_ioctl_set_ap_config(oal_net_device_stru *net_dev, oal_iw_request_info_stru *info,
2044     oal_iwreq_data_union *wrqu, hi_s8 *pc_extra)
2045 {
2046     hi_char                *pc_command        = HI_NULL;
2047     hi_char                *pc_parse_command  = HI_NULL;
2048     hi_s32                  l_ret             = HI_SUCCESS;
2049     hi_u32                  ul_ret;
2050     hi_char                 ac_parse_command[WAL_IOCTL_PRIV_SUBCMD_MAX_LEN];
2051     hi_char                 off_set;
2052 
2053     /* 1. 申请内存保存netd 下发的命令和数据 */
2054     pc_command = oal_memalloc((hi_s32)(wrqu->data.length + 1));
2055     if (pc_command == HI_NULL) {
2056         return -OAL_ENOMEM;
2057     }
2058     /* 2. 拷贝netd 命令到内核态中 */
2059     memset_s(pc_command, (hi_u32)(wrqu->data.length + 1), 0, (hi_u32)(wrqu->data.length + 1));
2060     ul_ret = oal_copy_from_user(pc_command, (hi_u32)(wrqu->data.length),
2061                                 wrqu->data.pointer, (hi_u32)(wrqu->data.length));
2062     if (ul_ret != HI_SUCCESS) {
2063         oam_error_log0(0, 0, "{wal_ioctl_set_ap_config::oal_copy_from_user: -OAL_EFAIL }\r\n");
2064         oal_free(pc_command);
2065         return -OAL_EFAIL;
2066     }
2067     pc_command[wrqu->data.length] = '\0';
2068 
2069     oal_io_print2("wal_ioctl_set_ap_config,data len:%u,command is:%s\n", (hi_u32)wrqu->data.length, pc_command);
2070 
2071     pc_parse_command = pc_command;
2072     /* 3.   解析参数 */
2073     /* 3.1  解析ASCII_CMD */
2074     ul_ret = wal_get_parameter_from_cmd(pc_parse_command, ac_parse_command, "ASCII_CMD=", &off_set,
2075         WAL_IOCTL_PRIV_SUBCMD_MAX_LEN);
2076     if (ul_ret != HI_SUCCESS) {
2077         oam_warning_log1(0, 0,
2078             "{wal_ioctl_set_ap_config::wal_get_parameter_from_cmd ASCII_CMD return err_code [%u]!}\r\n", ul_ret);
2079         oal_free(pc_command);
2080         return -OAL_EINVAL;
2081     }
2082 
2083     if ((0 != strcmp("AP_CFG", ac_parse_command))) {
2084         oam_warning_log0(0, 0, "{wal_ioctl_set_ap_config::sub_command != 'AP_CFG' }");
2085         oal_io_print1("{wal_ioctl_set_ap_config::sub_command %6s...!= 'AP_CFG' }", ac_parse_command);
2086         oal_free(pc_command);
2087         return -OAL_EINVAL;
2088     }
2089 
2090     /* 3.2  解析CHANNEL,目前不处理netd下发的channel信息 */
2091     pc_parse_command += off_set;
2092     ul_ret = wal_get_parameter_from_cmd(pc_parse_command, ac_parse_command, "CHANNEL=", &off_set,
2093         WAL_IOCTL_PRIV_SUBCMD_MAX_LEN);
2094     if (ul_ret != HI_SUCCESS) {
2095         oam_warning_log1(0, 0,
2096             "{wal_ioctl_set_ap_config::wal_get_parameter_from_cmd CHANNEL return err_code [%u]!}\r\n", ul_ret);
2097         oal_free(pc_command);
2098         return -OAL_EINVAL;
2099     }
2100 
2101     /* 3.3  解析MAX_SCB */
2102     pc_parse_command += off_set;
2103     ul_ret = wal_get_parameter_from_cmd(pc_parse_command, ac_parse_command, "MAX_SCB=", &off_set,
2104         WAL_IOCTL_PRIV_SUBCMD_MAX_LEN);
2105     if (ul_ret != HI_SUCCESS) {
2106         oam_warning_log1(0, 0,
2107             "{wal_ioctl_set_ap_config::wal_get_parameter_from_cmd MAX_SCB return err_code [%u]!}\r\n", ul_ret);
2108         oal_free(pc_command);
2109         return -OAL_EINVAL;
2110     }
2111 
2112     g_st_ap_config_info.ap_max_user = (hi_u32)oal_atoi(ac_parse_command);
2113 
2114     oam_warning_log1(0, 0, "{wal_ioctl_set_ap_config:: 1131_debug:: ul_ap_max_user = [%d]!}\r\n",
2115         g_st_ap_config_info.ap_max_user);
2116 
2117     if (oal_net_dev_priv(net_dev) != HI_NULL) {
2118         l_ret = wal_set_ap_max_user(net_dev, (hi_u32)oal_atoi(ac_parse_command));
2119     }
2120 
2121     /* 5. 结束释放内存 */
2122     oal_free(pc_command);
2123     return l_ret;
2124 }
2125 
2126 /* ****************************************************************************
2127  功能描述  : netd下发命令去关联STA
2128  输入参数  : oal_iw_request_info_stru *pst_info
2129              oal_iwreq_data_union *pst_wrqu
2130 **************************************************************************** */
wal_ioctl_set_ap_sta_disassoc(oal_net_device_stru * net_dev,oal_iw_request_info_stru * info,oal_iwreq_data_union * wrqu,hi_s8 * pc_extra)2131 static hi_s32 wal_ioctl_set_ap_sta_disassoc(oal_net_device_stru *net_dev, oal_iw_request_info_stru *info,
2132     oal_iwreq_data_union *wrqu, hi_s8 *pc_extra)
2133 {
2134     hi_char                       *pc_command        = HI_NULL;
2135     hi_s32                       l_ret;
2136     hi_u32                      ul_ret;
2137     hi_char                        parsed_command[WAL_IOCTL_PRIV_SUBCMD_MAX_LEN] = {0};
2138     hi_u8                       mac_addr[WLAN_MAC_ADDR_LEN] = {0};
2139     hi_char                      off_set;
2140 
2141     /* 1. 申请内存保存netd 下发的命令和数据 */
2142     pc_command = oal_memalloc((hi_s32)(wrqu->data.length + 1));
2143     if (pc_command == HI_NULL) {
2144         return -OAL_ENOMEM;
2145     }
2146 
2147     /* 2. 拷贝netd 命令到内核态中 */
2148     memset_s(pc_command, (hi_u32)(wrqu->data.length + 1), 0, (hi_u32)(wrqu->data.length + 1));
2149     ul_ret = oal_copy_from_user(pc_command, (hi_u32)(wrqu->data.length),
2150                                 wrqu->data.pointer, (hi_u32)(wrqu->data.length));
2151     if (ul_ret != HI_SUCCESS) {
2152         oam_error_log0(0, 0, "{wal_ioctl_set_ap_sta_disassoc::oal_copy_from_user: -OAL_EFAIL }\r\n");
2153         oal_free(pc_command);
2154         return -OAL_EFAIL;
2155     }
2156     pc_command[wrqu->data.length] = '\0';
2157 
2158     oal_io_print1("wal_ioctl_set_ap_sta_disassoc,command is:%s\n", pc_command);
2159 
2160     /* 3. 解析命令获取MAC */
2161     ul_ret = wal_get_parameter_from_cmd(pc_command, parsed_command, "MAC=", &off_set, WAL_IOCTL_PRIV_SUBCMD_MAX_LEN);
2162     if (ul_ret != HI_SUCCESS) {
2163         oam_warning_log1(0, 0,
2164             "{wal_ioctl_set_ap_sta_disassoc::wal_get_parameter_from_cmd MAC return err_code [%u]!}\r\n", ul_ret);
2165         oal_free(pc_command);
2166         return -OAL_EINVAL;
2167     }
2168     /* 3.1  检查参数是否符合MAC长度 */
2169     if (WLAN_MAC_ADDR_LEN * 2 != strlen(parsed_command)) { /* 返回值不等于mac地址的2倍  */
2170         oam_warning_log0(0, 0, "{wal_ioctl_set_ap_sta_disassoc::invalid MAC format}\r\n");
2171         oal_free(pc_command);
2172         return -OAL_EINVAL;
2173     }
2174     oal_strtoaddr(parsed_command, mac_addr, WLAN_MAC_ADDR_LEN); /* 将字符 ac_name 转换成数组 mac_add[6] */
2175 
2176     oam_warning_log0(0, 0, "{wal_ioctl_set_ap_sta_disassoc::Geting CMD from APP to DISASSOC!!}");
2177     l_ret = wal_kick_sta(net_dev, mac_addr, WLAN_MAC_ADDR_LEN);
2178 
2179     /* 5. 结束释放内存 */
2180     oal_free(pc_command);
2181     return l_ret;
2182 }
2183 #endif /* #if (_PRE_OS_VERSION_LINUX == _PRE_OS_VERSION) */
2184 
2185 /* ****************************************************************************
2186  函 数 名  : wal_set_mac_to_mib
2187  功能描述  : 设置wlan接口mac地址
2188  输入参数  : oal_net_device_stru *pst_net_dev
2189  输出参数  : 无
2190  返 回 值  : 错误码
2191  调用函数  :
2192  被调函数  :
2193 **************************************************************************** */
wal_set_mac_to_mib(oal_net_device_stru * netdev)2194 hi_u32 wal_set_mac_to_mib(oal_net_device_stru *netdev)
2195 {
2196     hi_u32                        ret;
2197     wal_msg_write_stru            write_msg;
2198     mac_cfg_staion_id_param_stru *param = HI_NULL;
2199 
2200     /* 填写WID消息 */
2201     wal_write_msg_hdr_init(&write_msg, WLAN_CFGID_STATION_ID, sizeof(mac_cfg_staion_id_param_stru));
2202 
2203     /* 设置配置命令参数 */
2204     param = (mac_cfg_staion_id_param_stru *)write_msg.auc_value;
2205     if (memcpy_s(param->auc_station_id, WLAN_MAC_ADDR_LEN, netdev->macAddr, WLAN_MAC_ADDR_LEN) != EOK) {
2206         oam_error_log0(0, 0, "{wal_set_mac_to_mib::mem safe function err!}");
2207         return HI_FAIL;
2208     }
2209 
2210     if (strcmp("p2p0", netdev->name) == 0) {
2211         param->p2p_mode = WLAN_P2P_DEV_MODE;
2212     }
2213 
2214     ret = wal_send_cfg_event(netdev, WAL_MSG_TYPE_WRITE,
2215         WAL_MSG_WRITE_MSG_HDR_LENGTH + sizeof(mac_cfg_staion_id_param_stru), (hi_u8 *)&write_msg, HI_FALSE, HI_NULL);
2216     if (oal_unlikely(ret != HI_SUCCESS)) {
2217         oam_warning_log1(0, 0, "{wal_set_mac_to_mib::return err code [%u]!}\r\n", ret);
2218         return ret;
2219     }
2220 
2221     return HI_SUCCESS;
2222 }
2223 
2224 #if (_PRE_OS_VERSION_LINUX == _PRE_OS_VERSION)
2225 /* ****************************************************************************
2226  函 数 名  : wal_ioctl_get_iwname
2227  功能描述  : 获得无线的名字, 用来确认无限扩展的存在.
2228  输入参数  : pst_net_dev: 指向net_device的指针
2229  输出参数  : 无
2230  返 回 值  :
2231  调用函数  :
2232  被调函数  :
2233 
2234  修改历史      :
2235   1.日    期   : 2013年2月21日
2236     作    者   : HiSilicon
2237     修改内容   : 新生成函数
2238 
2239 **************************************************************************** */
wal_ioctl_get_iwname(oal_net_device_stru * netdev,oal_iw_request_info_stru * info,hi_s8 * pc_name,hi_s8 * pc_extra)2240 static hi_u32 wal_ioctl_get_iwname(oal_net_device_stru *netdev, oal_iw_request_info_stru *info, hi_s8 *pc_name,
2241     hi_s8 *pc_extra)
2242 {
2243     hi_s8 ac_iwname[] = "IEEE 802.11";
2244 
2245     if (memcpy_s(pc_name, sizeof(ac_iwname), ac_iwname, sizeof(ac_iwname)) != EOK) {
2246         oam_error_log0(0, 0, "{wal_ioctl_get_iwname::mem safe function err!}");
2247         return HI_FAIL;
2248     }
2249     return HI_SUCCESS;
2250 }
2251 #endif
2252 
2253 #ifdef _PRE_WLAN_FEATURE_P2P
2254 /* ****************************************************************************
2255  功能描述  : 设置WPS p2p信息元素
2256 
2257  修改历史      :
2258   1.日    期   : 2014年11月26日
2259     作    者   : HiSilicon
2260     修改内容   : 新生成函数
2261 
2262 **************************************************************************** */
wal_ioctl_set_wps_p2p_ie(oal_net_device_stru * netdev,const hi_u8 * puc_buf,hi_u32 len,en_app_ie_type_uint8 type)2263 hi_u32 wal_ioctl_set_wps_p2p_ie(oal_net_device_stru *netdev, const hi_u8 *puc_buf, hi_u32 len,
2264     en_app_ie_type_uint8 type)
2265 {
2266     wal_msg_write_stru              write_msg;
2267     wal_msg_stru                   *rsp_msg = HI_NULL;
2268     oal_app_ie_stru                 wps_p2p_ie;
2269 
2270     if (len > WLAN_WPS_IE_MAX_SIZE) {
2271         oam_error_log1(0, OAM_SF_CFG, "{wal_ioctl_set_wps_p2p_ie:: wrong ul_len: [%u]!}\r\n", len);
2272         return HI_FAIL;
2273     }
2274 
2275     /* 安全编程规则6.6例外(1) 固定长度的结构体进行内存初始化 */
2276     memset_s(&wps_p2p_ie, sizeof(oal_app_ie_stru), 0, sizeof(oal_app_ie_stru));
2277 
2278     switch (type) {
2279         case OAL_APP_BEACON_IE:
2280         case OAL_APP_PROBE_RSP_IE:
2281         case OAL_APP_ASSOC_RSP_IE:
2282             wps_p2p_ie.app_ie_type = type;
2283             wps_p2p_ie.ie_len = len;
2284             if (memcpy_s(wps_p2p_ie.auc_ie, sizeof(wps_p2p_ie.auc_ie), puc_buf, len) != EOK) {
2285                 oam_error_log0(0, OAM_SF_CFG, "{wal_ioctl_set_wps_p2p_ie::mem safe function err!}");
2286                 return HI_FAIL;
2287             }
2288             break;
2289         default:
2290             oam_error_log1(0, OAM_SF_CFG, "{wal_ioctl_set_wps_p2p_ie:: wrong type: [%x]!}\r\n", type);
2291             return HI_FAIL;
2292     }
2293 
2294     if (memcpy_s(write_msg.auc_value, sizeof(write_msg.auc_value), &wps_p2p_ie, sizeof(wps_p2p_ie)) != EOK) {
2295         oam_error_log0(0, OAM_SF_CFG, "{wal_ioctl_set_wps_p2p_ie::mem safe function err!}");
2296         return HI_FAIL;
2297     }
2298 
2299     /* **************************************************************************
2300         抛事件到wal层处理
2301     ************************************************************************** */
2302     wal_write_msg_hdr_init(&write_msg, WLAN_CFGID_SET_WPS_P2P_IE, sizeof(wps_p2p_ie));
2303 
2304     /* 发送消息 */
2305     hi_u32 ret = wal_send_cfg_event(netdev, WAL_MSG_TYPE_WRITE, WAL_MSG_WRITE_MSG_HDR_LENGTH + sizeof(wps_p2p_ie),
2306         (hi_u8 *)&write_msg, HI_TRUE, &rsp_msg);
2307     if ((ret != HI_SUCCESS) || (rsp_msg == HI_NULL)) {
2308         oam_error_log1(0, OAM_SF_P2P, "{wal_ioctl_set_wps_p2p_ie:: wal_alloc_cfg_event return err code %u!}\r\n", ret);
2309         return ret;
2310     }
2311 
2312     /* 读取返回的错误码 */
2313     ret = wal_check_and_release_msg_resp(rsp_msg);
2314     if (ret != HI_SUCCESS) {
2315         oam_error_log1(0, OAM_SF_P2P, "{wal_ioctl_set_wps_p2p_ie::wal_send_cfg_event return err code: [%u]!}\r\n", ret);
2316         return ret;
2317     }
2318 
2319     return HI_SUCCESS;
2320 }
2321 
2322 /* ****************************************************************************
2323  函 数 名  : wal_ioctl_set_p2p_noa
2324  功能描述  : 设置p2p noa节能参数
2325  输入参数  : oal_net_device_stru *pst_net_dev
2326              hi_s8 *pc_paramm
2327  输出参数  : 无
2328  返 回 值  : static hi_u32
2329  调用函数  :
2330  被调函数  :
2331 
2332  修改历史      :
2333   1.日    期   : 2015年1月22日
2334     作    者   : HiSilicon
2335     修改内容   : 新生成函数
2336 
2337 *************************************************************************** */
wal_ioctl_set_p2p_noa(oal_net_device_stru * netdev,const mac_cfg_p2p_noa_param_stru * p2p_noa_param)2338 hi_u32 wal_ioctl_set_p2p_noa(oal_net_device_stru *netdev, const mac_cfg_p2p_noa_param_stru *p2p_noa_param)
2339 {
2340     wal_msg_write_stru write_msg;
2341     wal_msg_stru *rsp_msg = HI_NULL;
2342     hi_u32 ret;
2343 
2344     if (p2p_noa_param != HI_NULL) {
2345         if (memcpy_s(write_msg.auc_value, sizeof(write_msg.auc_value), p2p_noa_param,
2346             sizeof(mac_cfg_p2p_noa_param_stru)) != EOK) {
2347             oam_error_log0(0, OAM_SF_P2P, "{wal_ioctl_set_p2p_noa::mem safe function err!}");
2348             return HI_FAIL;
2349         }
2350     }
2351     /* **************************************************************************
2352         抛事件到wal层处理
2353     ************************************************************************** */
2354     wal_write_msg_hdr_init(&write_msg, WLAN_CFGID_SET_P2P_PS_NOA, sizeof(mac_cfg_p2p_noa_param_stru));
2355 
2356     /* 发送消息 */
2357     ret = wal_send_cfg_event(netdev, WAL_MSG_TYPE_WRITE,
2358         WAL_MSG_WRITE_MSG_HDR_LENGTH + sizeof(mac_cfg_p2p_noa_param_stru), (hi_u8 *)&write_msg, HI_TRUE, &rsp_msg);
2359     if ((ret != HI_SUCCESS) || (rsp_msg == HI_NULL)) {
2360         oam_error_log1(0, OAM_SF_P2P, "{wal_ioctl_set_p2p_noa:: wal_alloc_cfg_event return err code %u!}\r\n", ret);
2361         return ret;
2362     }
2363 
2364     /* 读取返回的错误码 */
2365     ret = wal_check_and_release_msg_resp(rsp_msg);
2366     if (ret != HI_SUCCESS) {
2367         oam_error_log1(0, OAM_SF_P2P, "{wal_ioctl_set_p2p_noa::wal_send_cfg_event return err code:  [%d]!}\r\n", ret);
2368         return ret;
2369     }
2370 
2371     return HI_SUCCESS;
2372 }
2373 
2374 /* ****************************************************************************
2375  函 数 名  : wal_ioctl_set_p2p_ops
2376  功能描述  : 设置p2p ops节能参数
2377  输入参数  : oal_net_device_stru *pst_net_dev
2378              hi_s8 *pc_paramm
2379  输出参数  : 无
2380  返 回 值  : static hi_u32
2381  调用函数  :
2382  被调函数  :
2383 
2384  修改历史      :
2385   1.日    期   : 2015年1月22日
2386     作    者   : HiSilicon
2387     修改内容   : 新生成函数
2388 
2389 *************************************************************************** */
wal_ioctl_set_p2p_ops(oal_net_device_stru * netdev,const mac_cfg_p2p_ops_param_stru * p2p_ops_param)2390 hi_u32 wal_ioctl_set_p2p_ops(oal_net_device_stru *netdev, const mac_cfg_p2p_ops_param_stru *p2p_ops_param)
2391 {
2392     wal_msg_write_stru write_msg;
2393     wal_msg_stru      *rsp_msg = HI_NULL;
2394     hi_u32             ret;
2395 
2396     if (p2p_ops_param != HI_NULL) {
2397         if (memcpy_s(write_msg.auc_value, sizeof(write_msg.auc_value), p2p_ops_param,
2398             sizeof(mac_cfg_p2p_ops_param_stru)) != EOK) {
2399             oam_error_log0(0, OAM_SF_P2P, "{wal_ioctl_set_p2p_ops::mem safe function err!}");
2400             return HI_FAIL;
2401         }
2402     }
2403     /* **************************************************************************
2404         抛事件到wal层处理
2405     ************************************************************************** */
2406     wal_write_msg_hdr_init(&write_msg, WLAN_CFGID_SET_P2P_PS_OPS, sizeof(mac_cfg_p2p_ops_param_stru));
2407 
2408     /* 发送消息 */
2409     ret = wal_send_cfg_event(netdev, WAL_MSG_TYPE_WRITE,
2410         WAL_MSG_WRITE_MSG_HDR_LENGTH + sizeof(mac_cfg_p2p_ops_param_stru), (hi_u8 *)&write_msg, HI_TRUE, &rsp_msg);
2411     if ((ret != HI_SUCCESS) || (rsp_msg == HI_NULL)) {
2412         oam_error_log1(0, OAM_SF_P2P, "{wal_ioctl_set_p2p_ops:: wal_alloc_cfg_event return err code %u!}\r\n", ret);
2413         return ret;
2414     }
2415 
2416     /* 读取返回的错误码 */
2417     ret = wal_check_and_release_msg_resp(rsp_msg);
2418     if (ret != HI_SUCCESS) {
2419         oam_error_log1(0, OAM_SF_P2P, "{wal_ioctl_set_p2p_ops::wal_send_cfg_event return err code:[%u]!}\r\n", ret);
2420         return ret;
2421     }
2422 
2423     return HI_SUCCESS;
2424 }
2425 #endif
2426 
2427 #if (_PRE_OS_VERSION_LINUX == _PRE_OS_VERSION)
2428 /* ****************************************************************************
2429  函 数 名  : wal_ioctl_reduce_sar
2430  功能描述  : 设置RTS 门限值
2431  输入参数  :
2432  输出参数  : 无
2433  返 回 值  : hi_s32
2434  调用函数  :
2435  被调函数  :
2436 
2437  修改历史      :
2438   1.日    期   : 2015年12月17日
2439     作    者   : HiSilicon
2440     修改内容   : 新生成函数
2441 
2442 **************************************************************************** */
wal_ioctl_reduce_sar(oal_net_device_stru * netdev,hi_u8 tx_power)2443 static hi_u32 wal_ioctl_reduce_sar(oal_net_device_stru *netdev, hi_u8 tx_power)
2444 {
2445     hi_u32                      ret;
2446     wal_msg_write_stru          write_msg;
2447 
2448     oam_warning_log1(0, 0, "wal_ioctl_reduce_sar::supplicant set tx_power[%d] for reduce SAR purpose.\r\n", tx_power);
2449     if (tx_power > 100) { /* 大于100无效 */
2450         oam_warning_log1(0, OAM_SF_CFG,
2451             "wal_ioctl_reduce_sar::reduce sar failed, reason:invalid tx_power[%d] set by supplicant!", tx_power);
2452         return HI_ERR_CODE_INVALID_CONFIG;
2453     }
2454     /* vap未创建时,不处理supplicant命令 */
2455     if (oal_net_dev_priv(netdev) == NULL) {
2456         oam_warning_log0(0, OAM_SF_CFG, "wal_ioctl_reduce_sar::vap not created yet, ignore the cmd!");
2457         return HI_ERR_WIFI_WAL_INVALID_PARAMETER;
2458     }
2459     /* **************************************************************************
2460                                 抛事件到wal层处理
2461     ************************************************************************** */
2462     wal_write_msg_hdr_init(&write_msg, WLAN_CFGID_REDUCE_SAR, sizeof(hi_u8));
2463     *((hi_u8 *)write_msg.auc_value) = tx_power;
2464     ret = wal_send_cfg_event(netdev, WAL_MSG_TYPE_WRITE, WAL_MSG_WRITE_MSG_HDR_LENGTH + sizeof(hi_u8),
2465         (hi_u8 *)&write_msg, HI_FALSE, HI_NULL);
2466     if (oal_unlikely(ret != HI_SUCCESS)) {
2467         oam_error_log1(0, 0, "wal_ioctl_reduce_sar::wal_send_cfg_event failed, error no[%u]!\r\n", ret);
2468         return ret;
2469     }
2470     return HI_SUCCESS;
2471 }
2472 #endif
2473 
2474 /* ****************************************************************************
2475  函 数 名  : wal_start_vap
2476  功能描述  :
2477  输入参数  : oal_net_device_stru *pst_net_dev
2478  输出参数  : 无
2479  返 回 值  : static hi_u32
2480  调用函数  :
2481  被调函数  :
2482 
2483  修改历史      :
2484   1.日    期   : 2015年5月22日
2485     作    者   : HiSilicon
2486     修改内容   : 新生成函数
2487 
2488 **************************************************************************** */
wal_start_vap(oal_net_device_stru * netdev)2489 hi_u32 wal_start_vap(oal_net_device_stru *netdev)
2490 {
2491     wal_msg_write_stru      write_msg;
2492     hi_u32                  ret;
2493     wal_msg_stru           *rsp_msg = HI_NULL;
2494 #ifdef _PRE_WLAN_FEATURE_P2P
2495     wlan_p2p_mode_enum_uint8 p2p_mode;
2496     oal_wireless_dev       *wdev = HI_NULL;
2497 #endif
2498 
2499     if (oal_unlikely(netdev == HI_NULL)) {
2500         oam_error_log0(0, 0, "{wal_start_vap::pst_net_dev is null ptr!}\r\n");
2501         return HI_ERR_CODE_PTR_NULL;
2502     }
2503 
2504     /* **************************************************************************
2505         抛事件到wal层处理
2506     ************************************************************************** */
2507     /* 填写消息 */
2508     wal_write_msg_hdr_init(&write_msg, WLAN_CFGID_START_VAP, sizeof(mac_cfg_start_vap_param_stru));
2509     ((mac_cfg_start_vap_param_stru *)write_msg.auc_value)->net_dev = netdev;
2510 #ifdef _PRE_WLAN_FEATURE_P2P
2511     wdev = netdev->ieee80211Ptr;
2512     p2p_mode = wal_wireless_iftype_to_mac_p2p_mode(wdev->iftype);
2513     if (WLAN_P2P_BUTT == p2p_mode) {
2514         oam_error_log0(0, 0, "{wal_start_vap::wal_wireless_iftype_to_mac_p2p_mode return BUFF}\r\n");
2515         return HI_FAIL;
2516     }
2517     ((mac_cfg_start_vap_param_stru *)write_msg.auc_value)->p2p_mode = p2p_mode;
2518 
2519     oam_warning_log1(0, 0, "{wal_start_vap::en_p2p_mode:%d}\r\n", p2p_mode);
2520 #endif
2521     ((mac_cfg_start_vap_param_stru *)write_msg.auc_value)->mgmt_rate_init_flag = HI_TRUE;
2522 
2523     /* 发送消息 */
2524     ret = wal_send_cfg_event(netdev, WAL_MSG_TYPE_WRITE,
2525         WAL_MSG_WRITE_MSG_HDR_LENGTH + sizeof(mac_cfg_start_vap_param_stru), (hi_u8 *)&write_msg, HI_TRUE, &rsp_msg);
2526     if (oal_unlikely(ret != HI_SUCCESS)) {
2527         oam_warning_log1(0, 0, "{wal_start_vap::wal_alloc_cfg_event return err code %u!}\r\n", ret);
2528         return ret;
2529     }
2530 
2531     /* 处理返回消息 */
2532     ret = wal_check_and_release_msg_resp(rsp_msg);
2533     if (ret != HI_SUCCESS) {
2534         oam_warning_log1(0, 0, "{wal_start_vap::hmac start vap fail, err code[%u]!}\r\n", ret);
2535         return ret;
2536     }
2537 
2538     if ((oal_netdevice_flags(netdev) & OAL_IFF_RUNNING) == 0) {
2539         oal_netdevice_flags(netdev) |= OAL_IFF_RUNNING;
2540     }
2541 
2542     /* AP/Mesh模式,启动VAP后,启动发送队列 */
2543     oal_net_tx_wake_all_queues(); /* 启动发送队列 */
2544 
2545     return HI_SUCCESS;
2546 }
2547 
2548 /* ****************************************************************************
2549  函 数 名  : wal_stop_vap
2550  功能描述  : 停用vap
2551  输入参数  : oal_net_device_stru: net_device
2552  输出参数  : 无
2553  返 回 值  : 错误码
2554  调用函数  :
2555  被调函数  :
2556 
2557  修改历史      :
2558   1.日    期   : 2015年5月25日
2559     作    者   : HiSilicon
2560     修改内容   : 新生成函数
2561 
2562 **************************************************************************** */
wal_stop_vap(oal_net_device_stru * netdev)2563 hi_u32 wal_stop_vap(oal_net_device_stru *netdev)
2564 {
2565     wal_msg_write_stru      write_msg;
2566     wal_msg_stru           *rsp_msg = HI_NULL;
2567     hi_u32                  ret;
2568 #ifdef _PRE_WLAN_FEATURE_P2P
2569     wlan_p2p_mode_enum_uint8 p2p_mode;
2570     oal_wireless_dev   *wdev = HI_NULL;
2571 #endif
2572 
2573     if (netdev == HI_NULL) {
2574         oam_error_log0(0, 0, "{wal_stop_vap::pst_net_dev is null ptr!}\r\n");
2575         return HI_ERR_CODE_PTR_NULL;
2576     }
2577 
2578     /* 如果不是up状态,不能直接返回成功,防止netdevice状态与VAP状态不一致的情况 */
2579     if ((oal_netdevice_flags(netdev) & OAL_IFF_RUNNING) == 0) {
2580         oam_warning_log0(0, 0, "{wal_stop_vap::vap is already down,continue to reset hmac vap state.}\r\n");
2581     }
2582 
2583     /* **************************************************************************
2584                            抛事件到wal层处理
2585     ************************************************************************** */
2586     /* 填写WID消息 */
2587     wal_write_msg_hdr_init(&write_msg, WLAN_CFGID_DOWN_VAP, sizeof(mac_cfg_down_vap_param_stru));
2588     ((mac_cfg_down_vap_param_stru *)write_msg.auc_value)->net_dev = netdev;
2589 #ifdef _PRE_WLAN_FEATURE_P2P
2590     wdev = netdev->ieee80211Ptr;
2591     p2p_mode = wal_wireless_iftype_to_mac_p2p_mode(wdev->iftype);
2592     if (WLAN_P2P_BUTT == p2p_mode) {
2593         oam_error_log0(0, 0, "{wal_stop_vap::wal_wireless_iftype_to_mac_p2p_mode return BUFF}\r\n");
2594         return HI_FAIL;
2595     }
2596     ((mac_cfg_start_vap_param_stru *)write_msg.auc_value)->p2p_mode = p2p_mode;
2597 
2598     oam_warning_log1(0, 0, "{wal_stop_vap::en_p2p_mode:%d}\r\n", p2p_mode);
2599 #endif
2600 
2601     /* 发送消息 */
2602     ret = wal_send_cfg_event(netdev, WAL_MSG_TYPE_WRITE,
2603         WAL_MSG_WRITE_MSG_HDR_LENGTH + sizeof(mac_cfg_down_vap_param_stru), (hi_u8 *)&write_msg, HI_TRUE, &rsp_msg);
2604 
2605     if (HI_SUCCESS != wal_check_and_release_msg_resp(rsp_msg)) {
2606         oam_warning_log0(0, 0, "wal_stop_vap::wal_check_and_release_msg_resp fail");
2607     }
2608 
2609     if (oal_unlikely(ret != HI_SUCCESS)) {
2610         oam_warning_log1(0, 0, "{wal_stop_vap::wal_alloc_cfg_event return err code %d!}\r\n", ret);
2611         return ret;
2612     }
2613 
2614     return HI_SUCCESS;
2615 }
2616 
wal_get_vap_p2p_mode(const oal_wireless_dev * wdev,wlan_vap_mode_enum_uint8 * vap_mode,wlan_p2p_mode_enum_uint8 * p2p_mode)2617 hi_u32 wal_get_vap_p2p_mode(const oal_wireless_dev *wdev, wlan_vap_mode_enum_uint8 *vap_mode,
2618     wlan_p2p_mode_enum_uint8 *p2p_mode)
2619 {
2620     hi_unref_param(p2p_mode);
2621 
2622     switch (wdev->iftype) {
2623         case NL80211_IFTYPE_STATION:
2624             *vap_mode = WLAN_VAP_MODE_BSS_STA;
2625             break;
2626         case NL80211_IFTYPE_AP:
2627             *vap_mode = WLAN_VAP_MODE_BSS_AP;
2628             break;
2629 #ifdef _PRE_WLAN_FEATURE_P2P
2630         case NL80211_IFTYPE_P2P_CLIENT:
2631             *vap_mode = WLAN_VAP_MODE_BSS_STA;
2632             *p2p_mode = WLAN_P2P_CL_MODE;
2633             break;
2634         case NL80211_IFTYPE_P2P_GO:
2635             *vap_mode = WLAN_VAP_MODE_BSS_AP;
2636             *p2p_mode = WLAN_P2P_GO_MODE;
2637             break;
2638         case NL80211_IFTYPE_P2P_DEVICE:
2639             *vap_mode = WLAN_VAP_MODE_BSS_STA;
2640             *p2p_mode = WLAN_P2P_DEV_MODE;
2641             break;
2642 #endif
2643 #ifdef _PRE_WLAN_FEATURE_MESH
2644         case NL80211_IFTYPE_MESH_POINT:
2645             *vap_mode = WLAN_VAP_MODE_MESH;
2646             break;
2647 #endif
2648         default:
2649             oam_warning_log1(0, 0, "{wal_get_vap_p2p_mode::iftype[%d] is not supported!}", wdev->iftype);
2650             return HI_ERR_SUCCESS;
2651     }
2652 
2653     return HI_CONTINUE;
2654 }
2655 
2656 /* ****************************************************************************
2657  函 数 名  : wal_init_wlan_vap
2658  功能描述  : 初始化wlan0,p2p0的vap
2659  输入参数  : oal_net_device_stru *pst_cfg_net_dev
2660  输出参数  : 无
2661  返 回 值  : hi_u32
2662  调用函数  :
2663  被调函数  :
2664 
2665  修改历史      :
2666   1.日    期   : 2015年5月22日
2667     作    者   : HiSilicon
2668     修改内容   : 新生成函数
2669 
2670 **************************************************************************** */
wal_init_wlan_vap(oal_net_device_stru * netdev)2671 hi_u32 wal_init_wlan_vap(oal_net_device_stru *netdev)
2672 {
2673     wal_msg_stru             *rsp_msg = HI_NULL;
2674     wal_msg_write_stru        write_msg = {0};
2675     wlan_vap_mode_enum_uint8  vap_mode = 0;
2676     wlan_p2p_mode_enum_uint8  p2p_mode = WLAN_LEGACY_VAP_MODE;
2677     mac_vap_stru             *mac_vap = oal_net_dev_priv(netdev);
2678 
2679     if (mac_vap != HI_NULL) {
2680         oam_warning_log0(0, 0, "{wal_init_wlan_vap::pst_mac_vap is already exist}\r\n");
2681         return HI_SUCCESS;
2682     }
2683 
2684     oal_wireless_dev      *wdev       = (oal_wireless_dev *)oal_netdevice_wdev(netdev);
2685     oal_net_device_stru   *netdev_cfg = oal_get_netdev_by_name(WLAN_CFG_VAP_NAME);
2686     if ((wdev == HI_NULL) || (netdev_cfg == HI_NULL)) {
2687         oam_warning_log2(0, 0, "{wal_init_wlan_vap::wdev[%p]/netdev_cfg[%p] is null}", (uintptr_t)wdev,
2688             (uintptr_t)netdev_cfg);
2689         return HI_ERR_CODE_PTR_NULL;
2690     }
2691 
2692 #if (_PRE_OS_VERSION_LINUX == _PRE_OS_VERSION)
2693     oal_dev_put(netdev_cfg);
2694 #endif
2695 
2696     /* 仅用于WIFI和AP打开时创建VAP */
2697     if (wal_get_vap_p2p_mode(wdev, &vap_mode, &p2p_mode) == HI_ERR_SUCCESS) {
2698         return HI_ERR_SUCCESS;
2699     }
2700 
2701     /* **************************************************************************
2702         抛事件到wal层处理
2703     ************************************************************************** */
2704     /* 填写消息 */
2705     wal_write_msg_hdr_init(&write_msg, WLAN_CFGID_ADD_VAP, sizeof(mac_cfg_add_vap_param_stru));
2706     ((mac_cfg_add_vap_param_stru *)write_msg.auc_value)->net_dev      = netdev;
2707     ((mac_cfg_add_vap_param_stru *)write_msg.auc_value)->vap_mode     = vap_mode;
2708     ((mac_cfg_add_vap_param_stru *)write_msg.auc_value)->cfg_vap_indx = WLAN_CFG_VAP_ID;
2709     ((mac_cfg_add_vap_param_stru *)write_msg.auc_value)->p2p_mode     = p2p_mode;
2710 
2711     hi_u32 ret = wal_send_cfg_event(netdev_cfg, WAL_MSG_TYPE_WRITE,
2712         WAL_MSG_WRITE_MSG_HDR_LENGTH + sizeof(mac_cfg_add_vap_param_stru), (hi_u8 *)&write_msg, HI_TRUE, &rsp_msg);
2713     if (oal_unlikely(ret != HI_SUCCESS)) {
2714         oam_warning_log1(WLAN_CFG_VAP_ID, 0, "{wal_init_wlan_vap::return err code %u!}\r\n", ret);
2715         return ret;
2716     }
2717 
2718     /* 读取返回的错误码 */
2719     ret = wal_check_and_release_msg_resp(rsp_msg);
2720     if (ret != HI_SUCCESS) {
2721         oam_warning_log1(WLAN_CFG_VAP_ID, 0, "{wal_init_wlan_vap::hmac add vap fail, err code[%u]!}\r\n", ret);
2722         return ret;
2723     }
2724 
2725 #ifdef _PRE_WLAN_FEATURE_P2P
2726     mac_device_stru *mac_dev = mac_res_get_dev();
2727     mac_vap = oal_net_dev_priv(netdev);
2728     if (mac_vap == HI_NULL) {
2729         oam_error_log0(0, 0, "{wal_init_wlan_vap::oal_net_dev_priv(pst_net_dev) is null ptr.}");
2730         return HI_ERR_CODE_PTR_NULL;
2731     }
2732 
2733     if (p2p_mode == WLAN_P2P_DEV_MODE) {
2734         mac_dev->p2p_info.p2p0_vap_idx = mac_vap->vap_id;
2735     }
2736 #endif
2737 
2738     return HI_SUCCESS;
2739 }
2740 
2741 /* ****************************************************************************
2742  函 数 名  : wal_deinit_wlan_vap
2743  功能描述  : 仅用于WIFI和AP关闭时删除VAP
2744  输入参数  : oal_net_device_stru *pst_net_dev
2745  输出参数  : 无
2746  返 回 值  : hi_u32
2747  调用函数  :
2748  被调函数  :
2749 
2750  修改历史      :
2751   1.日    期   : 2015年1月3日
2752     作    者   : HiSilicon
2753     修改内容   : 新生成函数
2754 
2755 **************************************************************************** */
wal_deinit_wlan_vap(oal_net_device_stru * netdev)2756 hi_u32 wal_deinit_wlan_vap(oal_net_device_stru *netdev)
2757 {
2758     wal_msg_write_stru           write_msg;
2759     wal_msg_stru                *rsp_msg = HI_NULL;
2760     mac_vap_stru                *mac_vap = HI_NULL;
2761     hi_u32                       ret;
2762 
2763 #ifdef _PRE_WLAN_FEATURE_P2P
2764     oal_wireless_dev *wdev = GET_NET_DEV_CFG80211_WIRELESS(netdev);
2765     wlan_p2p_mode_enum_uint8    p2p_mode = wal_wireless_iftype_to_mac_p2p_mode(wdev->iftype);
2766 #endif
2767 
2768     if (oal_unlikely(netdev == HI_NULL)) {
2769         oam_error_log0(0, 0, "{wal_deinit_wlan_vap::pst_del_vap_param null ptr !}\r\n");
2770         return HI_ERR_CODE_PTR_NULL;
2771     }
2772 
2773     mac_vap = oal_net_dev_priv(netdev);
2774     if (mac_vap == HI_NULL) {
2775         oam_warning_log0(0, 0, "{wal_deinit_wlan_vap::pst_mac_vap is already null}\r\n");
2776         return HI_SUCCESS;
2777     }
2778 
2779 #ifdef _PRE_WLAN_FEATURE_P2P
2780     if (0 == strcmp("p2p0", netdev->name)) {
2781         p2p_mode = WLAN_P2P_DEV_MODE;
2782     }
2783     oam_warning_log1(mac_vap->vap_id, 0, "{wal_deinit_wlan_vap::en_p2p_mode:%d}\r\n", p2p_mode);
2784 #endif
2785 
2786 #ifdef _PRE_WLAN_FEATURE_ANY
2787     if (mac_vap->support_any == HI_TRUE) {
2788         hi_wifi_any_deinit();
2789     }
2790 #endif
2791     /* **************************************************************************
2792                                 抛事件到wal层处理
2793     ************************************************************************** */
2794     /* 删除vap 时需要将参数赋值 */
2795     ((mac_cfg_del_vap_param_stru *)write_msg.auc_value)->net_dev = netdev;
2796 #ifdef _PRE_WLAN_FEATURE_P2P
2797     ((mac_cfg_del_vap_param_stru *)write_msg.auc_value)->p2p_mode = p2p_mode;
2798 #endif
2799 
2800     wal_write_msg_hdr_init(&write_msg, WLAN_CFGID_DEL_VAP, sizeof(mac_cfg_del_vap_param_stru));
2801     ret = wal_send_cfg_event(netdev, WAL_MSG_TYPE_WRITE,
2802         WAL_MSG_WRITE_MSG_HDR_LENGTH + sizeof(mac_cfg_del_vap_param_stru), (hi_u8 *)&write_msg, HI_TRUE, &rsp_msg);
2803 
2804     if (HI_SUCCESS != wal_check_and_release_msg_resp(rsp_msg)) {
2805         oam_warning_log0(0, 0, "wal_deinit_wlan_vap::wal_check_and_release_msg_resp fail.");
2806     } else {
2807         oal_net_dev_priv(netdev) = NULL;
2808     }
2809 
2810     if (oal_unlikely(ret != HI_SUCCESS)) {
2811         oam_error_log1(mac_vap->vap_id, 0, "{wal_deinit_wlan_vap::return error code %d}\r\n", ret);
2812     }
2813 
2814     return ret;
2815 }
2816 
2817 /* ****************************************************************************
2818  函 数 名  : wal_get_mac_addr
2819  功能描述  : 判断mac地址是否合法
2820  输入参数  : 无
2821  输出参数  : hi_u8 *buf
2822  返 回 值  : hi_u32
2823  调用函数  :
2824  被调函数  :
2825 
2826  修改历史      :
2827   1.日    期   : 2017年1月18日
2828     作    者   : HiSilicon
2829     修改内容   : 新生成函数
2830 
2831 **************************************************************************** */
wal_macaddr_check(const hi_u8 * mac_addr)2832 hi_u32 wal_macaddr_check(const hi_u8 *mac_addr)
2833 {
2834     if ((HI_TRUE == mac_addr_is_zero(mac_addr)) || ((mac_addr[0] & 0x1) == 0x1)) {
2835         return HI_FAIL;
2836     }
2837 
2838     return HI_SUCCESS;
2839 }
2840 
2841 
2842 /* ****************************************************************************
2843  功能描述  : wal侧通过change virtual iftype创建vap的接口
2844  修改历史      :
2845   1.日    期   : 2015年12月2日
2846     作    者   : HiSilicon
2847     修改内容   : 新生成函数
2848   2.    日    期   : 2019年2月12日
2849     作    者   : HiSilicon
2850     修改内容   : 修改函数名为wal_setup_vap,将iftype赋值移到函数外
2851 
2852 **************************************************************************** */
2853 #if (_PRE_OS_VERSION_LITEOS == _PRE_OS_VERSION)
wal_setup_vap(oal_net_device_stru * netdev)2854 hi_u32 wal_setup_vap(oal_net_device_stru *netdev)
2855 {
2856     hi_u32 ret = HI_FAIL;
2857     struct netif *netif = HI_NULL;
2858 
2859     if (oal_netdevice_flags(netdev) & OAL_IFF_RUNNING) {
2860         /* 切换到Mesh前如果网络设备处于UP状态,需要先down 网络设备 */
2861         hi_diag_log_msg_i0(0, "wal_setup_vap:stop netdevice.");
2862         wal_netdev_stop(netdev);
2863 
2864         ret = wal_deinit_wlan_vap(netdev);
2865         if (ret != HI_SUCCESS) {
2866             hi_diag_log_msg_i0(0, "wal_setup_vap:wlan_deinit_wlan_vap failed");
2867             return ret;
2868         }
2869     }
2870 
2871     netif = netif_find((const hi_char *)netdev->name);
2872     if (netif != HI_NULL) {
2873         /* 设置IPv6 linklocal address(SLAAC) */
2874         if ((GET_NET_DEV_CFG80211_WIRELESS(netdev)->iftype == NL80211_IFTYPE_AP) ||
2875             (GET_NET_DEV_CFG80211_WIRELESS(netdev)->iftype == NL80211_IFTYPE_MESH_POINT)) {
2876 #ifdef _PRE_WLAN_FEATURE_LWIP_IPV6_AUTOCONFIG
2877             (hi_void)netifapi_set_ip6_autoconfig_disabled(netdev->lwip_netif);
2878             (hi_void)netifapi_set_accept_ra(netif, HI_FALSE);
2879             (hi_void)netifapi_set_ipv6_forwarding(netif, HI_TRUE);
2880             (hi_void)netifapi_set_ra_enable(netif, HI_TRUE);
2881 #endif
2882             oam_warning_log0(0, 0, "[ERR]wal_setup_vap:netifapi_netif_add_ip6_linklocal_address failed");
2883         }
2884     }
2885 
2886     ret = wal_init_wlan_vap(netdev);
2887 
2888     return ret;
2889 }
2890 #elif (_PRE_OS_VERSION_LINUX == _PRE_OS_VERSION)
wal_setup_vap(oal_net_device_stru * net_dev)2891 hi_u32 wal_setup_vap(oal_net_device_stru *net_dev)
2892 {
2893     hi_u32 ret = HI_FAIL;
2894 
2895     if (oal_netdevice_flags(net_dev) & OAL_IFF_RUNNING) {
2896         /* 切换到Mesh前如果网络设备处于UP状态,需要先down 网络设备 */
2897         hi_diag_log_msg_i0(0, "wal_setup_vap:stop netdevice.");
2898         wal_netdev_stop(net_dev);
2899 
2900         ret = wal_deinit_wlan_vap(net_dev);
2901         if (ret != HI_SUCCESS) {
2902             hi_diag_log_msg_i0(0, "wal_setup_vap:wlan_deinit_wlan_vap failed");
2903             return ret;
2904         }
2905     }
2906 
2907     ret = wal_init_wlan_vap(net_dev);
2908 
2909     return ret;
2910 }
2911 #endif
2912 
2913 #if (_PRE_OS_VERSION_LINUX == _PRE_OS_VERSION)
2914 /* ****************************************************************************
2915  功能描述  : P2P命令字执行
2916  返 回 值  : 统计结果指针
2917 **************************************************************************** */
2918 #ifdef _PRE_WLAN_FEATURE_P2P
wal_p2p_cmd_exec(oal_net_device_stru * netdev,hi_u8 * puc_command,hi_u32 len)2919 hi_u32 wal_p2p_cmd_exec(oal_net_device_stru *netdev, hi_u8 *puc_command, hi_u32 len)
2920 {
2921     if (memcmp(puc_command, CMD_P2P_SET_NOA, strlen(CMD_P2P_SET_NOA)) == 0) {
2922         hi_u32 skip = strlen(CMD_P2P_SET_NOA) + 1;
2923         mac_cfg_p2p_noa_param_stru p2p_noa_param;
2924         if ((skip + sizeof(p2p_noa_param)) > len) {
2925             oam_error_log2(0, 0, "{wal_priv_cmd_exec::CMD_P2P_SET_NOA param len is [%d], need %d.}", len,
2926                 skip + sizeof(p2p_noa_param));
2927             return HI_FAIL;
2928         }
2929         if (memcpy_s(&p2p_noa_param, sizeof(mac_cfg_p2p_noa_param_stru), puc_command + skip,
2930             sizeof(mac_cfg_p2p_noa_param_stru)) != EOK) {
2931             oam_error_log0(0, 0, "wal_priv_cmd_exec: copy noa param failed!");
2932             return HI_FAIL;
2933         }
2934         return wal_ioctl_set_p2p_noa(netdev, &p2p_noa_param);
2935     } else if (memcmp(puc_command, CMD_P2P_SET_PS, strlen(CMD_P2P_SET_PS)) == 0) {
2936         hi_u32 skip = strlen(CMD_P2P_SET_PS) + 1;
2937         mac_cfg_p2p_ops_param_stru p2p_ops_param;
2938         if ((skip + sizeof(p2p_ops_param)) > len) {
2939             oam_error_log2(0, 0, "{wal_priv_cmd_exec::CMD_P2P_SET_PS param len is %d, need %d.}", len,
2940                 skip + sizeof(p2p_ops_param));
2941             return HI_FAIL;
2942         }
2943         if (memcpy_s(&p2p_ops_param, sizeof(mac_cfg_p2p_ops_param_stru), puc_command + skip,
2944             sizeof(mac_cfg_p2p_ops_param_stru)) != EOK) {
2945             oam_error_log0(0, 0, "wal_priv_cmd_exec: copy ops param failed!");
2946             return HI_FAIL;
2947         }
2948         return wal_ioctl_set_p2p_ops(netdev, &p2p_ops_param);
2949     }
2950     return HI_SUCCESS;
2951 }
2952 #endif
2953 
2954 /* ****************************************************************************
2955  功能描述  : 根据命令字执行对应的命令
2956  输入参数  : net device指针
2957  返 回 值  : 统计结果指针
2958 **************************************************************************** */
wal_priv_cmd_exec(oal_net_device_stru * netdev,hi_u8 * puc_command,hi_u32 len)2959 hi_u32 wal_priv_cmd_exec(oal_net_device_stru *netdev, hi_u8 *puc_command, hi_u32 len)
2960 {
2961     if (0 == memcmp(puc_command, CMD_COUNTRY, strlen(CMD_COUNTRY))) {
2962         const hi_s8 *country_code = HI_NULL;
2963         hi_s8        auc_country_code[MAC_CONTRY_CODE_LEN] = {0}; /* 3: 元素个数 */
2964 
2965         /* 格式:COUNTRY CN */
2966         if (len < (strlen((hi_s8 *)CMD_COUNTRY) + 3)) { /* 3: 偏移量 */
2967             oam_warning_log0(0, 0, "{wal_priv_cmd_exec::country cn len error.}");
2968             return HI_FAIL;
2969         }
2970         country_code = (hi_char *)puc_command + strlen((hi_char *)CMD_COUNTRY) + 1;
2971         if (memcpy_s(auc_country_code, sizeof(auc_country_code), country_code, 2) != EOK) { /* 复制长度为2 */
2972             oam_error_log0(0, 0, "wal_priv_cmd_exec: copy country code failed!");
2973             return HI_FAIL;
2974         }
2975         return wal_regdomain_update(netdev, auc_country_code, MAC_CONTRY_CODE_LEN);
2976 #ifdef _PRE_WLAN_FEATURE_P2P
2977     } else if (memcmp(puc_command, CMD_SET_AP_WPS_P2P_IE, strlen(CMD_SET_AP_WPS_P2P_IE)) == 0) {
2978         hi_u32 skip = strlen(CMD_SET_AP_WPS_P2P_IE) + 1;
2979         /* 结构体类型 */
2980         oal_app_ie_stru *wps_p2p_ie = (oal_app_ie_stru *)(puc_command + skip);
2981         return wal_ioctl_set_wps_p2p_ie(netdev, wps_p2p_ie->auc_ie, wps_p2p_ie->ie_len, wps_p2p_ie->app_ie_type);
2982 #endif
2983     } else if (memcmp(puc_command, CMD_TX_POWER, strlen(CMD_TX_POWER)) == 0) {
2984         hi_u32 skip_length = strlen((hi_char *)CMD_TX_POWER) + 1;
2985         hi_u8 txpwr = (hi_u8)oal_atoi((hi_char *)puc_command + skip_length);
2986         if (wal_ioctl_reduce_sar(netdev, txpwr) != HI_SUCCESS) {
2987             oam_warning_log0(0, 0, "{wal_priv_cmd_exec::return err code [%u]!}");
2988             /* 驱动打印错误码,返回成功,防止supplicant 累计4次 ioctl失败导致wifi异常重启 */
2989             return HI_SUCCESS;
2990         }
2991     }
2992 #ifdef _PRE_WLAN_FEATURE_P2P
2993     /* p2p相关配置命令执行 */
2994     return wal_p2p_cmd_exec(netdev, puc_command, len);
2995 #endif
2996     return HI_SUCCESS;
2997 }
2998 /* ****************************************************************************
2999  功能描述  : 私有接口函数
3000  输入参数  : net device指针
3001  返 回 值  : 统计结果指针
3002 **************************************************************************** */
wal_priv_cmd(oal_net_device_stru * netdev,oal_ifreq_stru * ifr,hi_s32 cmd)3003 hi_u32 wal_priv_cmd(oal_net_device_stru *netdev, oal_ifreq_stru *ifr, hi_s32 cmd)
3004 {
3005     wal_wifi_priv_cmd_stru  priv_cmd    = {0};
3006     hi_u8                          *puc_command    = HI_NULL;
3007     hi_u32                          ret;
3008 
3009 #ifndef _PRE_HDF_LINUX
3010     if (ifr->ifr_data == HI_NULL) {
3011         return HI_FAIL;
3012     }
3013     if (oal_copy_from_user((hi_u8 *)&priv_cmd, sizeof(wal_wifi_priv_cmd_stru), ifr->ifr_data,
3014         sizeof(wal_wifi_priv_cmd_stru)) != 0) {
3015         return HI_FAIL;
3016     }
3017 
3018     if ((priv_cmd.l_total_len > MAX_PRIV_CMD_SIZE) || (priv_cmd.l_total_len < 0)) {
3019         oam_error_log1(0, 0, "{wal_priv_cmd::priavte command len:%d too long}", priv_cmd.l_total_len);
3020         return HI_FAIL;
3021     }
3022 #endif
3023 
3024     /* 申请内存保存wpa_supplicant 下发的命令和数据 */
3025     puc_command = oal_memalloc((hi_u32)(priv_cmd.l_total_len + 1)); /* total len 为priv cmd 后面buffer 长度 */
3026     if (puc_command == HI_NULL) {
3027         oam_error_log0(0, 0, "{wal_priv_cmd::mem alloc failed.}");
3028         return HI_FAIL;
3029     }
3030     /* 拷贝wpa_supplicant 命令到内核态中 */
3031     if (memset_s(puc_command, (hi_u32)(priv_cmd.l_total_len + 1), 0, (hi_u32)(priv_cmd.l_total_len + 1)) != EOK) {
3032         oam_error_log0(0, 0, "wal_priv_cmd: mem safe function err!");
3033         oal_free(puc_command);
3034         return HI_FAIL;
3035     }
3036 #ifndef _PRE_HDF_LINUX
3037     ret = oal_copy_from_user(puc_command, (hi_u32)(priv_cmd.l_total_len), ((hi_u8 *)ifr->ifr_data) + 8, /* 数据偏移量8 */
3038         (hi_u32)(priv_cmd.l_total_len));
3039 #endif
3040     if (ret != HI_SUCCESS) {
3041         oam_error_log1(0, 0, "{wal_priv_cmd::oal_copy_from_user: err code [%u] }", ret);
3042         oal_free(puc_command);
3043         return ret;
3044     }
3045     puc_command[priv_cmd.l_total_len] = '\0';
3046     oam_info_log2(0, 0, "{wal_priv_cmd:: private cmd total_len:%d, used_len:%d}",
3047         priv_cmd.l_total_len, priv_cmd.l_used_len);
3048 
3049     /* 执行命令字 */
3050     ret = wal_priv_cmd_exec(netdev, puc_command, (hi_u32)priv_cmd.l_total_len);
3051     oal_free(puc_command);
3052     return ret;
3053 }
3054 #endif
3055 
3056 #ifdef __cplusplus
3057 #if __cplusplus
3058 }
3059 #endif
3060 #endif
3061