mbed library sources. Supersedes mbed-src.

Dependents:   Nucleo_Hello_Encoder BLE_iBeaconScan AM1805_DEMO DISCO-F429ZI_ExportTemplate1 ... more

Committer:
Kojto
Date:
Wed Jul 19 17:31:21 2017 +0100
Revision:
169:e3b6fe271b81
Parent:
167:e84263d55307
Child:
186:707f6e361f3e
This updates the lib to the mbed lib v 147

Who changed what in which revision?

UserRevisionLine numberNew contents of line
AnnaBridge 167:e84263d55307 1 /******************************************************************************
AnnaBridge 167:e84263d55307 2 * Copyright (c) 2013-2016 Realtek Semiconductor Corp.
AnnaBridge 167:e84263d55307 3 *
AnnaBridge 167:e84263d55307 4 * Licensed under the Apache License, Version 2.0 (the "License");
AnnaBridge 167:e84263d55307 5 * you may not use this file except in compliance with the License.
AnnaBridge 167:e84263d55307 6 * You may obtain a copy of the License at
AnnaBridge 167:e84263d55307 7 *
AnnaBridge 167:e84263d55307 8 * http://www.apache.org/licenses/LICENSE-2.0
AnnaBridge 167:e84263d55307 9 *
AnnaBridge 167:e84263d55307 10 * Unless required by applicable law or agreed to in writing, software
AnnaBridge 167:e84263d55307 11 * distributed under the License is distributed on an "AS IS" BASIS,
AnnaBridge 167:e84263d55307 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
AnnaBridge 167:e84263d55307 13 * See the License for the specific language governing permissions and
AnnaBridge 167:e84263d55307 14 * limitations under the License.
AnnaBridge 167:e84263d55307 15 *
AnnaBridge 167:e84263d55307 16 ******************************************************************************/
AnnaBridge 167:e84263d55307 17 #include <wifi_util.h>
AnnaBridge 167:e84263d55307 18 #include <platform/platform_stdlib.h>
AnnaBridge 167:e84263d55307 19 #include <wifi/wifi_conf.h>
AnnaBridge 167:e84263d55307 20 #include <wifi/wifi_ind.h>
AnnaBridge 167:e84263d55307 21 #include <osdep_service.h>
AnnaBridge 167:e84263d55307 22
Kojto 169:e3b6fe271b81 23 extern u32 GlobalDebugEnable;
Kojto 169:e3b6fe271b81 24 #define WIFI_UTIL_MSG(...) do {\
Kojto 169:e3b6fe271b81 25 if (GlobalDebugEnable) \
Kojto 169:e3b6fe271b81 26 printf("\r" __VA_ARGS__);\
Kojto 169:e3b6fe271b81 27 }while(0)
Kojto 169:e3b6fe271b81 28
AnnaBridge 167:e84263d55307 29 int iw_ioctl(const char *ifname, unsigned long request, struct iwreq *pwrq)
AnnaBridge 167:e84263d55307 30 {
AnnaBridge 167:e84263d55307 31 memcpy(pwrq->ifr_name, ifname, 5);
AnnaBridge 167:e84263d55307 32 return rltk_wlan_control(request, (void *) pwrq);
AnnaBridge 167:e84263d55307 33 }
AnnaBridge 167:e84263d55307 34
AnnaBridge 167:e84263d55307 35 int wext_get_ssid(const char *ifname, __u8 *ssid)
AnnaBridge 167:e84263d55307 36 {
AnnaBridge 167:e84263d55307 37 struct iwreq iwr;
AnnaBridge 167:e84263d55307 38 int ret = 0;
AnnaBridge 167:e84263d55307 39
AnnaBridge 167:e84263d55307 40 memset(&iwr, 0, sizeof(iwr));
AnnaBridge 167:e84263d55307 41 iwr.u.essid.pointer = ssid;
AnnaBridge 167:e84263d55307 42 iwr.u.essid.length = 32;
AnnaBridge 167:e84263d55307 43
AnnaBridge 167:e84263d55307 44 if (iw_ioctl(ifname, SIOCGIWESSID, &iwr) < 0) {
Kojto 169:e3b6fe271b81 45 WIFI_UTIL_MSG("\n\rioctl[SIOCGIWESSID] ssid = NULL, not connected"); //do not use perror
AnnaBridge 167:e84263d55307 46 ret = -1;
AnnaBridge 167:e84263d55307 47 } else {
AnnaBridge 167:e84263d55307 48 ret = iwr.u.essid.length;
AnnaBridge 167:e84263d55307 49 if (ret > 32)
AnnaBridge 167:e84263d55307 50 ret = 32;
AnnaBridge 167:e84263d55307 51 /* Some drivers include nul termination in the SSID, so let's
AnnaBridge 167:e84263d55307 52 * remove it here before further processing. WE-21 changes this
AnnaBridge 167:e84263d55307 53 * to explicitly require the length _not_ to include nul
AnnaBridge 167:e84263d55307 54 * termination. */
AnnaBridge 167:e84263d55307 55 if (ret > 0 && ssid[ret - 1] == '\0')
AnnaBridge 167:e84263d55307 56 ret--;
AnnaBridge 167:e84263d55307 57 ssid[ret] = '\0';
AnnaBridge 167:e84263d55307 58 }
AnnaBridge 167:e84263d55307 59
AnnaBridge 167:e84263d55307 60 return ret;
AnnaBridge 167:e84263d55307 61 }
AnnaBridge 167:e84263d55307 62
AnnaBridge 167:e84263d55307 63 int wext_set_ssid(const char *ifname, const __u8 *ssid, __u16 ssid_len)
AnnaBridge 167:e84263d55307 64 {
AnnaBridge 167:e84263d55307 65 struct iwreq iwr;
AnnaBridge 167:e84263d55307 66 int ret = 0;
AnnaBridge 167:e84263d55307 67
AnnaBridge 167:e84263d55307 68 memset(&iwr, 0, sizeof(iwr));
AnnaBridge 167:e84263d55307 69 iwr.u.essid.pointer = (void *) ssid;
AnnaBridge 167:e84263d55307 70 iwr.u.essid.length = ssid_len;
AnnaBridge 167:e84263d55307 71 iwr.u.essid.flags = (ssid_len != 0);
AnnaBridge 167:e84263d55307 72
AnnaBridge 167:e84263d55307 73 if (iw_ioctl(ifname, SIOCSIWESSID, &iwr) < 0) {
Kojto 169:e3b6fe271b81 74 WIFI_UTIL_MSG("\n\rioctl[SIOCSIWESSID] error");
AnnaBridge 167:e84263d55307 75 ret = -1;
AnnaBridge 167:e84263d55307 76 }
AnnaBridge 167:e84263d55307 77
AnnaBridge 167:e84263d55307 78 return ret;
AnnaBridge 167:e84263d55307 79 }
AnnaBridge 167:e84263d55307 80
AnnaBridge 167:e84263d55307 81 int wext_set_bssid(const char *ifname, const __u8 *bssid)
AnnaBridge 167:e84263d55307 82 {
AnnaBridge 167:e84263d55307 83 struct iwreq iwr;
AnnaBridge 167:e84263d55307 84 int ret = 0;
AnnaBridge 167:e84263d55307 85
AnnaBridge 167:e84263d55307 86 memset(&iwr, 0, sizeof(iwr));
AnnaBridge 167:e84263d55307 87 iwr.u.ap_addr.sa_family = ARPHRD_ETHER;
AnnaBridge 167:e84263d55307 88 memcpy(iwr.u.ap_addr.sa_data, bssid, ETH_ALEN);
AnnaBridge 167:e84263d55307 89
AnnaBridge 167:e84263d55307 90 if(bssid[ETH_ALEN]=='#' && bssid[ETH_ALEN + 1]=='@'){
AnnaBridge 167:e84263d55307 91 memcpy(iwr.u.ap_addr.sa_data + ETH_ALEN, bssid + ETH_ALEN, 6);
AnnaBridge 167:e84263d55307 92 }
AnnaBridge 167:e84263d55307 93
AnnaBridge 167:e84263d55307 94 if (iw_ioctl(ifname, SIOCSIWAP, &iwr) < 0) {
Kojto 169:e3b6fe271b81 95 WIFI_UTIL_MSG("\n\rioctl[SIOCSIWAP] error");
AnnaBridge 167:e84263d55307 96 ret = -1;
AnnaBridge 167:e84263d55307 97 }
AnnaBridge 167:e84263d55307 98
AnnaBridge 167:e84263d55307 99 return ret;
AnnaBridge 167:e84263d55307 100 }
AnnaBridge 167:e84263d55307 101
AnnaBridge 167:e84263d55307 102 int is_broadcast_ether_addr(const unsigned char *addr)
AnnaBridge 167:e84263d55307 103 {
AnnaBridge 167:e84263d55307 104 return (addr[0] & addr[1] & addr[2] & addr[3] & addr[4] & addr[5]) == 0xff;
AnnaBridge 167:e84263d55307 105 }
AnnaBridge 167:e84263d55307 106
AnnaBridge 167:e84263d55307 107 int wext_set_auth_param(const char *ifname, __u16 idx, __u32 value)
AnnaBridge 167:e84263d55307 108 {
AnnaBridge 167:e84263d55307 109 struct iwreq iwr;
AnnaBridge 167:e84263d55307 110 int ret = 0;
AnnaBridge 167:e84263d55307 111
AnnaBridge 167:e84263d55307 112 memset(&iwr, 0, sizeof(iwr));
AnnaBridge 167:e84263d55307 113 iwr.u.param.flags = idx & IW_AUTH_INDEX;
AnnaBridge 167:e84263d55307 114 iwr.u.param.value = value;
AnnaBridge 167:e84263d55307 115
AnnaBridge 167:e84263d55307 116 if (iw_ioctl(ifname, SIOCSIWAUTH, &iwr) < 0) {
Kojto 169:e3b6fe271b81 117 WIFI_UTIL_MSG("\n\rWEXT: SIOCSIWAUTH(param %d value 0x%x) failed)", idx, value);
AnnaBridge 167:e84263d55307 118 }
AnnaBridge 167:e84263d55307 119
AnnaBridge 167:e84263d55307 120 return ret;
AnnaBridge 167:e84263d55307 121 }
AnnaBridge 167:e84263d55307 122
AnnaBridge 167:e84263d55307 123 int wext_set_key_ext(const char *ifname, __u16 alg, const __u8 *addr, int key_idx, int set_tx, const __u8 *seq, __u16 seq_len, __u8 *key, __u16 key_len)
AnnaBridge 167:e84263d55307 124 {
AnnaBridge 167:e84263d55307 125 struct iwreq iwr;
AnnaBridge 167:e84263d55307 126 int ret = 0;
AnnaBridge 167:e84263d55307 127 struct iw_encode_ext *ext;
AnnaBridge 167:e84263d55307 128
AnnaBridge 167:e84263d55307 129 ext = (struct iw_encode_ext *) rtw_malloc(sizeof(struct iw_encode_ext) + key_len);
AnnaBridge 167:e84263d55307 130 if (ext == NULL)
AnnaBridge 167:e84263d55307 131 return -1;
AnnaBridge 167:e84263d55307 132 else
AnnaBridge 167:e84263d55307 133 memset(ext, 0, sizeof(struct iw_encode_ext) + key_len);
AnnaBridge 167:e84263d55307 134
AnnaBridge 167:e84263d55307 135 memset(&iwr, 0, sizeof(iwr));
AnnaBridge 167:e84263d55307 136 iwr.u.encoding.flags = key_idx + 1;
AnnaBridge 167:e84263d55307 137 iwr.u.encoding.flags |= IW_ENCODE_TEMP;
AnnaBridge 167:e84263d55307 138 iwr.u.encoding.pointer = ext;
AnnaBridge 167:e84263d55307 139 iwr.u.encoding.length = sizeof(struct iw_encode_ext) + key_len;
AnnaBridge 167:e84263d55307 140
AnnaBridge 167:e84263d55307 141 if (alg == IW_ENCODE_DISABLED)
AnnaBridge 167:e84263d55307 142 iwr.u.encoding.flags |= IW_ENCODE_DISABLED;
AnnaBridge 167:e84263d55307 143
AnnaBridge 167:e84263d55307 144 if (addr == NULL || is_broadcast_ether_addr(addr))
AnnaBridge 167:e84263d55307 145 ext->ext_flags |= IW_ENCODE_EXT_GROUP_KEY;
AnnaBridge 167:e84263d55307 146
AnnaBridge 167:e84263d55307 147 if (set_tx)
AnnaBridge 167:e84263d55307 148 ext->ext_flags |= IW_ENCODE_EXT_SET_TX_KEY;
AnnaBridge 167:e84263d55307 149
AnnaBridge 167:e84263d55307 150 ext->addr.sa_family = ARPHRD_ETHER;
AnnaBridge 167:e84263d55307 151
AnnaBridge 167:e84263d55307 152 if (addr)
AnnaBridge 167:e84263d55307 153 memcpy(ext->addr.sa_data, addr, ETH_ALEN);
AnnaBridge 167:e84263d55307 154 else
AnnaBridge 167:e84263d55307 155 memset(ext->addr.sa_data, 0xff, ETH_ALEN);
AnnaBridge 167:e84263d55307 156
AnnaBridge 167:e84263d55307 157 if (key && key_len) {
AnnaBridge 167:e84263d55307 158 memcpy(ext->key, key, key_len);
AnnaBridge 167:e84263d55307 159 ext->key_len = key_len;
AnnaBridge 167:e84263d55307 160 }
AnnaBridge 167:e84263d55307 161
AnnaBridge 167:e84263d55307 162 ext->alg = alg;
AnnaBridge 167:e84263d55307 163
AnnaBridge 167:e84263d55307 164 if (seq && seq_len) {
AnnaBridge 167:e84263d55307 165 ext->ext_flags |= IW_ENCODE_EXT_RX_SEQ_VALID;
AnnaBridge 167:e84263d55307 166 memcpy(ext->rx_seq, seq, seq_len);
AnnaBridge 167:e84263d55307 167 }
AnnaBridge 167:e84263d55307 168
AnnaBridge 167:e84263d55307 169 if (iw_ioctl(ifname, SIOCSIWENCODEEXT, &iwr) < 0) {
AnnaBridge 167:e84263d55307 170 ret = -2;
Kojto 169:e3b6fe271b81 171 WIFI_UTIL_MSG("\n\rioctl[SIOCSIWENCODEEXT] set key fail");
AnnaBridge 167:e84263d55307 172 }
AnnaBridge 167:e84263d55307 173
AnnaBridge 167:e84263d55307 174 rtw_free(ext);
AnnaBridge 167:e84263d55307 175 return ret;
AnnaBridge 167:e84263d55307 176 }
AnnaBridge 167:e84263d55307 177
AnnaBridge 167:e84263d55307 178 int wext_get_enc_ext(const char *ifname, __u16 *alg, __u8 *key_idx, __u8 *passphrase)
AnnaBridge 167:e84263d55307 179 {
AnnaBridge 167:e84263d55307 180 struct iwreq iwr;
AnnaBridge 167:e84263d55307 181 int ret = 0;
AnnaBridge 167:e84263d55307 182 struct iw_encode_ext *ext;
AnnaBridge 167:e84263d55307 183
AnnaBridge 167:e84263d55307 184 ext = (struct iw_encode_ext *) rtw_malloc(sizeof(struct iw_encode_ext) + 16);
AnnaBridge 167:e84263d55307 185 if (ext == NULL)
AnnaBridge 167:e84263d55307 186 return -1;
AnnaBridge 167:e84263d55307 187 else
AnnaBridge 167:e84263d55307 188 memset(ext, 0, sizeof(struct iw_encode_ext) + 16);
AnnaBridge 167:e84263d55307 189
AnnaBridge 167:e84263d55307 190 iwr.u.encoding.pointer = ext;
AnnaBridge 167:e84263d55307 191
AnnaBridge 167:e84263d55307 192 if (iw_ioctl(ifname, SIOCGIWENCODEEXT, &iwr) < 0) {
Kojto 169:e3b6fe271b81 193 WIFI_UTIL_MSG("\n\rioctl[SIOCGIWENCODEEXT] error");
AnnaBridge 167:e84263d55307 194 ret = -1;
AnnaBridge 167:e84263d55307 195 }
AnnaBridge 167:e84263d55307 196 else
AnnaBridge 167:e84263d55307 197 {
AnnaBridge 167:e84263d55307 198 *alg = ext->alg;
AnnaBridge 167:e84263d55307 199 if(key_idx)
AnnaBridge 167:e84263d55307 200 *key_idx = (__u8)iwr.u.encoding.flags;
AnnaBridge 167:e84263d55307 201 if(passphrase)
AnnaBridge 167:e84263d55307 202 memcpy(passphrase, ext->key, ext->key_len);
AnnaBridge 167:e84263d55307 203 }
AnnaBridge 167:e84263d55307 204
AnnaBridge 167:e84263d55307 205 if (ext != NULL)
AnnaBridge 167:e84263d55307 206 rtw_free(ext);
AnnaBridge 167:e84263d55307 207
AnnaBridge 167:e84263d55307 208 return ret;
AnnaBridge 167:e84263d55307 209 }
AnnaBridge 167:e84263d55307 210
AnnaBridge 167:e84263d55307 211 int wext_set_passphrase(const char *ifname, const __u8 *passphrase, __u16 passphrase_len)
AnnaBridge 167:e84263d55307 212 {
AnnaBridge 167:e84263d55307 213 struct iwreq iwr;
AnnaBridge 167:e84263d55307 214 int ret = 0;
AnnaBridge 167:e84263d55307 215
AnnaBridge 167:e84263d55307 216 memset(&iwr, 0, sizeof(iwr));
AnnaBridge 167:e84263d55307 217 iwr.u.passphrase.pointer = (void *) passphrase;
AnnaBridge 167:e84263d55307 218 iwr.u.passphrase.length = passphrase_len;
AnnaBridge 167:e84263d55307 219 iwr.u.passphrase.flags = (passphrase_len != 0);
AnnaBridge 167:e84263d55307 220
AnnaBridge 167:e84263d55307 221 if (iw_ioctl(ifname, SIOCSIWPRIVPASSPHRASE, &iwr) < 0) {
Kojto 169:e3b6fe271b81 222 WIFI_UTIL_MSG("\n\rioctl[SIOCSIWESSID+0x1f] error");
AnnaBridge 167:e84263d55307 223 ret = -1;
AnnaBridge 167:e84263d55307 224 }
AnnaBridge 167:e84263d55307 225
AnnaBridge 167:e84263d55307 226 return ret;
AnnaBridge 167:e84263d55307 227 }
AnnaBridge 167:e84263d55307 228
AnnaBridge 167:e84263d55307 229 int wext_get_passphrase(const char *ifname, __u8 *passphrase)
AnnaBridge 167:e84263d55307 230 {
AnnaBridge 167:e84263d55307 231 struct iwreq iwr;
AnnaBridge 167:e84263d55307 232 int ret = 0;
AnnaBridge 167:e84263d55307 233
AnnaBridge 167:e84263d55307 234 memset(&iwr, 0, sizeof(iwr));
AnnaBridge 167:e84263d55307 235 iwr.u.passphrase.pointer = (void *) passphrase;
AnnaBridge 167:e84263d55307 236
AnnaBridge 167:e84263d55307 237 if (iw_ioctl(ifname, SIOCGIWPRIVPASSPHRASE, &iwr) < 0) {
Kojto 169:e3b6fe271b81 238 WIFI_UTIL_MSG("\n\rioctl[SIOCGIWPRIVPASSPHRASE] error");
AnnaBridge 167:e84263d55307 239 ret = -1;
AnnaBridge 167:e84263d55307 240 }
AnnaBridge 167:e84263d55307 241 else {
AnnaBridge 167:e84263d55307 242 ret = iwr.u.passphrase.length;
AnnaBridge 167:e84263d55307 243 passphrase[ret] = '\0';
AnnaBridge 167:e84263d55307 244 }
AnnaBridge 167:e84263d55307 245
AnnaBridge 167:e84263d55307 246 return ret;
AnnaBridge 167:e84263d55307 247 }
AnnaBridge 167:e84263d55307 248
AnnaBridge 167:e84263d55307 249 #if 0
AnnaBridge 167:e84263d55307 250 int wext_set_mac_address(const char *ifname, char * mac)
AnnaBridge 167:e84263d55307 251 {
AnnaBridge 167:e84263d55307 252 char buf[13+17+1];
AnnaBridge 167:e84263d55307 253 rtw_memset(buf, 0, sizeof(buf));
AnnaBridge 167:e84263d55307 254 snprintf(buf, 13+17, "write_mac %s", mac);
AnnaBridge 167:e84263d55307 255 return wext_private_command(ifname, buf, 0);
AnnaBridge 167:e84263d55307 256 }
AnnaBridge 167:e84263d55307 257
AnnaBridge 167:e84263d55307 258 int wext_get_mac_address(const char *ifname, char * mac)
AnnaBridge 167:e84263d55307 259 {
AnnaBridge 167:e84263d55307 260 int ret = 0;
AnnaBridge 167:e84263d55307 261 char buf[32];
AnnaBridge 167:e84263d55307 262
AnnaBridge 167:e84263d55307 263 rtw_memset(buf, 0, sizeof(buf));
AnnaBridge 167:e84263d55307 264 rtw_memcpy(buf, "read_mac", 8);
AnnaBridge 167:e84263d55307 265 ret = wext_private_command_with_retval(ifname, buf, buf, 32);
AnnaBridge 167:e84263d55307 266 strcpy(mac, buf);
AnnaBridge 167:e84263d55307 267 return ret;
AnnaBridge 167:e84263d55307 268 }
AnnaBridge 167:e84263d55307 269 #endif
AnnaBridge 167:e84263d55307 270
AnnaBridge 167:e84263d55307 271 int wext_enable_powersave(const char *ifname, __u8 ips_mode, __u8 lps_mode)
AnnaBridge 167:e84263d55307 272 {
AnnaBridge 167:e84263d55307 273 struct iwreq iwr;
AnnaBridge 167:e84263d55307 274 int ret = 0;
AnnaBridge 167:e84263d55307 275 __u16 pindex = 0;
AnnaBridge 167:e84263d55307 276 __u8 *para = NULL;
AnnaBridge 167:e84263d55307 277 int cmd_len = 0;
AnnaBridge 167:e84263d55307 278
AnnaBridge 167:e84263d55307 279 memset(&iwr, 0, sizeof(iwr));
AnnaBridge 167:e84263d55307 280 cmd_len = sizeof("pm_set");
AnnaBridge 167:e84263d55307 281
AnnaBridge 167:e84263d55307 282 // Encode parameters as TLV (type, length, value) format
AnnaBridge 167:e84263d55307 283 para = rtw_malloc( 7 + (1+1+1) + (1+1+1) );
AnnaBridge 167:e84263d55307 284 if(para == NULL) return -1;
AnnaBridge 167:e84263d55307 285
AnnaBridge 167:e84263d55307 286 snprintf((char*)para, cmd_len, "pm_set");
AnnaBridge 167:e84263d55307 287 pindex = 7;
AnnaBridge 167:e84263d55307 288
AnnaBridge 167:e84263d55307 289 para[pindex++] = 0; // type 0 for ips
AnnaBridge 167:e84263d55307 290 para[pindex++] = 1;
AnnaBridge 167:e84263d55307 291 para[pindex++] = ips_mode;
AnnaBridge 167:e84263d55307 292
AnnaBridge 167:e84263d55307 293 para[pindex++] = 1; // type 1 for lps
AnnaBridge 167:e84263d55307 294 para[pindex++] = 1;
AnnaBridge 167:e84263d55307 295 para[pindex++] = lps_mode;
AnnaBridge 167:e84263d55307 296
AnnaBridge 167:e84263d55307 297 iwr.u.data.pointer = para;
AnnaBridge 167:e84263d55307 298 iwr.u.data.length = pindex;
AnnaBridge 167:e84263d55307 299
AnnaBridge 167:e84263d55307 300 if (iw_ioctl(ifname, SIOCDEVPRIVATE, &iwr) < 0) {
Kojto 169:e3b6fe271b81 301 WIFI_UTIL_MSG("\n\rioctl[SIOCSIWPRIVAPESSID] error");
AnnaBridge 167:e84263d55307 302 ret = -1;
AnnaBridge 167:e84263d55307 303 }
AnnaBridge 167:e84263d55307 304
AnnaBridge 167:e84263d55307 305 rtw_free(para);
AnnaBridge 167:e84263d55307 306 return ret;
AnnaBridge 167:e84263d55307 307 }
AnnaBridge 167:e84263d55307 308
AnnaBridge 167:e84263d55307 309 int wext_disable_powersave(const char *ifname)
AnnaBridge 167:e84263d55307 310 {
AnnaBridge 167:e84263d55307 311 struct iwreq iwr;
AnnaBridge 167:e84263d55307 312 int ret = 0;
AnnaBridge 167:e84263d55307 313 __u16 pindex = 0;
AnnaBridge 167:e84263d55307 314 __u8 *para = NULL;
AnnaBridge 167:e84263d55307 315 int cmd_len = 0;
AnnaBridge 167:e84263d55307 316
AnnaBridge 167:e84263d55307 317 memset(&iwr, 0, sizeof(iwr));
AnnaBridge 167:e84263d55307 318 cmd_len = sizeof("pm_set");
AnnaBridge 167:e84263d55307 319
AnnaBridge 167:e84263d55307 320 // Encode parameters as TLV (type, length, value) format
AnnaBridge 167:e84263d55307 321 para = rtw_malloc( 7 + (1+1+1) + (1+1+1) );
AnnaBridge 167:e84263d55307 322 if(para == NULL) return -1;
AnnaBridge 167:e84263d55307 323
AnnaBridge 167:e84263d55307 324 snprintf((char*)para, cmd_len, "pm_set");
AnnaBridge 167:e84263d55307 325 pindex = 7;
AnnaBridge 167:e84263d55307 326
AnnaBridge 167:e84263d55307 327 para[pindex++] = 0; // type 0 for ips
AnnaBridge 167:e84263d55307 328 para[pindex++] = 1;
AnnaBridge 167:e84263d55307 329 para[pindex++] = 0; // ips = 0
AnnaBridge 167:e84263d55307 330
AnnaBridge 167:e84263d55307 331 para[pindex++] = 1; // type 1 for lps
AnnaBridge 167:e84263d55307 332 para[pindex++] = 1;
AnnaBridge 167:e84263d55307 333 para[pindex++] = 0; // lps = 0
AnnaBridge 167:e84263d55307 334
AnnaBridge 167:e84263d55307 335 iwr.u.data.pointer = para;
AnnaBridge 167:e84263d55307 336 iwr.u.data.length = pindex;
AnnaBridge 167:e84263d55307 337
AnnaBridge 167:e84263d55307 338 if (iw_ioctl(ifname, SIOCDEVPRIVATE, &iwr) < 0) {
Kojto 169:e3b6fe271b81 339 WIFI_UTIL_MSG("\n\rioctl[SIOCSIWPRIVAPESSID] error");
AnnaBridge 167:e84263d55307 340 ret = -1;
AnnaBridge 167:e84263d55307 341 }
AnnaBridge 167:e84263d55307 342
AnnaBridge 167:e84263d55307 343 rtw_free(para);
AnnaBridge 167:e84263d55307 344 return ret;
AnnaBridge 167:e84263d55307 345
AnnaBridge 167:e84263d55307 346 }
AnnaBridge 167:e84263d55307 347
AnnaBridge 167:e84263d55307 348 int wext_set_tdma_param(const char *ifname, __u8 slot_period, __u8 rfon_period_len_1, __u8 rfon_period_len_2, __u8 rfon_period_len_3)
AnnaBridge 167:e84263d55307 349 {
AnnaBridge 167:e84263d55307 350 struct iwreq iwr;
AnnaBridge 167:e84263d55307 351 int ret = 0;
AnnaBridge 167:e84263d55307 352 __u16 pindex = 0;
AnnaBridge 167:e84263d55307 353 __u8 *para = NULL;
AnnaBridge 167:e84263d55307 354 int cmd_len = 0;
AnnaBridge 167:e84263d55307 355
AnnaBridge 167:e84263d55307 356 memset(&iwr, 0, sizeof(iwr));
AnnaBridge 167:e84263d55307 357 cmd_len = sizeof("pm_set");
AnnaBridge 167:e84263d55307 358
AnnaBridge 167:e84263d55307 359 // Encode parameters as TLV (type, length, value) format
AnnaBridge 167:e84263d55307 360 para = rtw_malloc( 7 + (1+1+4) );
AnnaBridge 167:e84263d55307 361
AnnaBridge 167:e84263d55307 362 snprintf((char*)para, cmd_len, "pm_set");
AnnaBridge 167:e84263d55307 363 pindex = 7;
AnnaBridge 167:e84263d55307 364
AnnaBridge 167:e84263d55307 365 para[pindex++] = 2; // type 2 tdma param
AnnaBridge 167:e84263d55307 366 para[pindex++] = 4;
AnnaBridge 167:e84263d55307 367 para[pindex++] = slot_period;
AnnaBridge 167:e84263d55307 368 para[pindex++] = rfon_period_len_1;
AnnaBridge 167:e84263d55307 369 para[pindex++] = rfon_period_len_2;
AnnaBridge 167:e84263d55307 370 para[pindex++] = rfon_period_len_3;
AnnaBridge 167:e84263d55307 371
AnnaBridge 167:e84263d55307 372 iwr.u.data.pointer = para;
AnnaBridge 167:e84263d55307 373 iwr.u.data.length = pindex;
AnnaBridge 167:e84263d55307 374
AnnaBridge 167:e84263d55307 375 if (iw_ioctl(ifname, SIOCDEVPRIVATE, &iwr) < 0) {
Kojto 169:e3b6fe271b81 376 WIFI_UTIL_MSG("\n\rioctl[SIOCSIWPRIVAPESSID] error");
AnnaBridge 167:e84263d55307 377 ret = -1;
AnnaBridge 167:e84263d55307 378 }
AnnaBridge 167:e84263d55307 379
AnnaBridge 167:e84263d55307 380 rtw_free(para);
AnnaBridge 167:e84263d55307 381 return ret;
AnnaBridge 167:e84263d55307 382 }
AnnaBridge 167:e84263d55307 383
AnnaBridge 167:e84263d55307 384 int wext_set_lps_dtim(const char *ifname, __u8 lps_dtim)
AnnaBridge 167:e84263d55307 385 {
AnnaBridge 167:e84263d55307 386 struct iwreq iwr;
AnnaBridge 167:e84263d55307 387 int ret = 0;
AnnaBridge 167:e84263d55307 388 __u16 pindex = 0;
AnnaBridge 167:e84263d55307 389 __u8 *para = NULL;
AnnaBridge 167:e84263d55307 390 int cmd_len = 0;
AnnaBridge 167:e84263d55307 391
AnnaBridge 167:e84263d55307 392 memset(&iwr, 0, sizeof(iwr));
AnnaBridge 167:e84263d55307 393 cmd_len = sizeof("pm_set");
AnnaBridge 167:e84263d55307 394
AnnaBridge 167:e84263d55307 395 // Encode parameters as TLV (type, length, value) format
AnnaBridge 167:e84263d55307 396 para = rtw_malloc( 7 + (1+1+1) );
AnnaBridge 167:e84263d55307 397
AnnaBridge 167:e84263d55307 398 snprintf((char*)para, cmd_len, "pm_set");
AnnaBridge 167:e84263d55307 399 pindex = 7;
AnnaBridge 167:e84263d55307 400
AnnaBridge 167:e84263d55307 401 para[pindex++] = 3; // type 3 lps dtim
AnnaBridge 167:e84263d55307 402 para[pindex++] = 1;
AnnaBridge 167:e84263d55307 403 para[pindex++] = lps_dtim;
AnnaBridge 167:e84263d55307 404
AnnaBridge 167:e84263d55307 405 iwr.u.data.pointer = para;
AnnaBridge 167:e84263d55307 406 iwr.u.data.length = pindex;
AnnaBridge 167:e84263d55307 407
AnnaBridge 167:e84263d55307 408 if (iw_ioctl(ifname, SIOCDEVPRIVATE, &iwr) < 0) {
Kojto 169:e3b6fe271b81 409 WIFI_UTIL_MSG("\n\rioctl[SIOCSIWPRIVAPESSID] error");
AnnaBridge 167:e84263d55307 410 ret = -1;
AnnaBridge 167:e84263d55307 411 }
AnnaBridge 167:e84263d55307 412
AnnaBridge 167:e84263d55307 413 rtw_free(para);
AnnaBridge 167:e84263d55307 414 return ret;
AnnaBridge 167:e84263d55307 415 }
AnnaBridge 167:e84263d55307 416
AnnaBridge 167:e84263d55307 417 int wext_get_lps_dtim(const char *ifname, __u8 *lps_dtim)
AnnaBridge 167:e84263d55307 418 {
AnnaBridge 167:e84263d55307 419
AnnaBridge 167:e84263d55307 420 struct iwreq iwr;
AnnaBridge 167:e84263d55307 421 int ret = 0;
AnnaBridge 167:e84263d55307 422 __u16 pindex = 0;
AnnaBridge 167:e84263d55307 423 __u8 *para = NULL;
AnnaBridge 167:e84263d55307 424 int cmd_len = 0;
AnnaBridge 167:e84263d55307 425
AnnaBridge 167:e84263d55307 426 memset(&iwr, 0, sizeof(iwr));
AnnaBridge 167:e84263d55307 427 cmd_len = sizeof("pm_get");
AnnaBridge 167:e84263d55307 428
AnnaBridge 167:e84263d55307 429 // Encode parameters as TLV (type, length, value) format
AnnaBridge 167:e84263d55307 430 para = rtw_malloc( 7 + (1+1+1) );
AnnaBridge 167:e84263d55307 431
AnnaBridge 167:e84263d55307 432 snprintf((char*)para, cmd_len, "pm_get");
AnnaBridge 167:e84263d55307 433 pindex = 7;
AnnaBridge 167:e84263d55307 434
AnnaBridge 167:e84263d55307 435 para[pindex++] = 3; // type 3 for lps dtim
AnnaBridge 167:e84263d55307 436 para[pindex++] = 1;
AnnaBridge 167:e84263d55307 437 para[pindex++] = 0;
AnnaBridge 167:e84263d55307 438
AnnaBridge 167:e84263d55307 439 iwr.u.data.pointer = para;
AnnaBridge 167:e84263d55307 440 iwr.u.data.length = pindex;
AnnaBridge 167:e84263d55307 441
AnnaBridge 167:e84263d55307 442 if (iw_ioctl(ifname, SIOCDEVPRIVATE, &iwr) < 0) {
Kojto 169:e3b6fe271b81 443 WIFI_UTIL_MSG("\n\rioctl[SIOCSIWPRIVAPESSID] error");
AnnaBridge 167:e84263d55307 444 ret = -1;
AnnaBridge 167:e84263d55307 445 goto exit;
AnnaBridge 167:e84263d55307 446 }
AnnaBridge 167:e84263d55307 447
AnnaBridge 167:e84263d55307 448 //get result at the beginning of iwr.u.data.pointer
AnnaBridge 167:e84263d55307 449 if((para[0]==3)&&(para[1]==1))
AnnaBridge 167:e84263d55307 450 *lps_dtim = para[2];
AnnaBridge 167:e84263d55307 451 else
Kojto 169:e3b6fe271b81 452 WIFI_UTIL_MSG("\n\r%s error", __func__);
AnnaBridge 167:e84263d55307 453
AnnaBridge 167:e84263d55307 454 exit:
AnnaBridge 167:e84263d55307 455 rtw_free(para);
AnnaBridge 167:e84263d55307 456
AnnaBridge 167:e84263d55307 457 return ret;
AnnaBridge 167:e84263d55307 458 }
AnnaBridge 167:e84263d55307 459
AnnaBridge 167:e84263d55307 460 int wext_set_tos_value(const char *ifname, __u8 *tos_value)
AnnaBridge 167:e84263d55307 461 {
AnnaBridge 167:e84263d55307 462 struct iwreq iwr;
AnnaBridge 167:e84263d55307 463 int ret = 0;
AnnaBridge 167:e84263d55307 464 __u8 *para = NULL;
AnnaBridge 167:e84263d55307 465 int cmd_len = sizeof("set_tos_value");
AnnaBridge 167:e84263d55307 466
AnnaBridge 167:e84263d55307 467 memset(&iwr, 0, sizeof(iwr));
AnnaBridge 167:e84263d55307 468
AnnaBridge 167:e84263d55307 469 para = rtw_malloc(cmd_len + 4);
AnnaBridge 167:e84263d55307 470 snprintf((char*)para, cmd_len, "set_tos_value");
AnnaBridge 167:e84263d55307 471
AnnaBridge 167:e84263d55307 472 if (*tos_value >= 0 && *tos_value <=32){
AnnaBridge 167:e84263d55307 473 *(para + cmd_len) = 0x4f;
AnnaBridge 167:e84263d55307 474 *(para + cmd_len+1) = 0xa4;
AnnaBridge 167:e84263d55307 475 *(para + cmd_len+2) = 0;
AnnaBridge 167:e84263d55307 476 *(para + cmd_len+3) = 0;
AnnaBridge 167:e84263d55307 477 }
AnnaBridge 167:e84263d55307 478 else if(*tos_value > 32 && *tos_value <=96){
AnnaBridge 167:e84263d55307 479 *(para + cmd_len) = 0x2b;
AnnaBridge 167:e84263d55307 480 *(para + cmd_len+1) = 0xa4;
AnnaBridge 167:e84263d55307 481 *(para + cmd_len+2) = 0;
AnnaBridge 167:e84263d55307 482 *(para + cmd_len+3) = 0;
AnnaBridge 167:e84263d55307 483 }
AnnaBridge 167:e84263d55307 484 else if(*tos_value > 96 && *tos_value <= 160){
AnnaBridge 167:e84263d55307 485 *(para + cmd_len) = 0x22;
AnnaBridge 167:e84263d55307 486 *(para + cmd_len+1) = 0x43;
AnnaBridge 167:e84263d55307 487 *(para + cmd_len+2) = 0x5e;
AnnaBridge 167:e84263d55307 488 *(para + cmd_len+3) = 0;
AnnaBridge 167:e84263d55307 489 }
AnnaBridge 167:e84263d55307 490 else if(*tos_value > 160){
AnnaBridge 167:e84263d55307 491 *(para + cmd_len) = 0x22;
AnnaBridge 167:e84263d55307 492 *(para + cmd_len+1) = 0x32;
AnnaBridge 167:e84263d55307 493 *(para + cmd_len+2) = 0x2f;
AnnaBridge 167:e84263d55307 494 *(para + cmd_len+3) = 0;
AnnaBridge 167:e84263d55307 495 }
AnnaBridge 167:e84263d55307 496
AnnaBridge 167:e84263d55307 497 iwr.u.data.pointer = para;
AnnaBridge 167:e84263d55307 498 iwr.u.data.length = cmd_len + 4;
AnnaBridge 167:e84263d55307 499
AnnaBridge 167:e84263d55307 500 if (iw_ioctl(ifname, SIOCDEVPRIVATE, &iwr) < 0) {
Kojto 169:e3b6fe271b81 501 WIFI_UTIL_MSG("\n\rwext_set_tos_value():ioctl[SIOCDEVPRIVATE] error");
AnnaBridge 167:e84263d55307 502 ret = -1;
AnnaBridge 167:e84263d55307 503 }
AnnaBridge 167:e84263d55307 504
AnnaBridge 167:e84263d55307 505 rtw_free(para);
AnnaBridge 167:e84263d55307 506 return ret;
AnnaBridge 167:e84263d55307 507 }
AnnaBridge 167:e84263d55307 508
AnnaBridge 167:e84263d55307 509 int wext_get_tx_power(const char *ifname, __u8 *poweridx)
AnnaBridge 167:e84263d55307 510 {
AnnaBridge 167:e84263d55307 511 struct iwreq iwr;
AnnaBridge 167:e84263d55307 512 int ret = 0;
AnnaBridge 167:e84263d55307 513 __u8 *para = NULL;
AnnaBridge 167:e84263d55307 514 int cmd_len = sizeof("get_tx_power");
AnnaBridge 167:e84263d55307 515
AnnaBridge 167:e84263d55307 516 memset(&iwr, 0, sizeof(iwr));
AnnaBridge 167:e84263d55307 517 //Tx power size : 20 Bytes
AnnaBridge 167:e84263d55307 518 //CCK 1M,2M,5.5M,11M : 4 Bytes
AnnaBridge 167:e84263d55307 519 //OFDM 6M, 9M, 12M, 18M, 24M, 36M 48M, 54M : 8 Bytes
AnnaBridge 167:e84263d55307 520 //MCS 0~7 : 8 Bytes
AnnaBridge 167:e84263d55307 521 para = rtw_malloc(cmd_len + 20);
AnnaBridge 167:e84263d55307 522 snprintf((char*)para, cmd_len, "get_tx_power");
AnnaBridge 167:e84263d55307 523
AnnaBridge 167:e84263d55307 524 iwr.u.data.pointer = para;
AnnaBridge 167:e84263d55307 525 iwr.u.data.length = cmd_len + 20;
AnnaBridge 167:e84263d55307 526 if (iw_ioctl(ifname, SIOCDEVPRIVATE, &iwr) < 0) {
Kojto 169:e3b6fe271b81 527 WIFI_UTIL_MSG("\n\rwext_get_tx_power():ioctl[SIOCDEVPRIVATE] error");
AnnaBridge 167:e84263d55307 528 ret = -1;
AnnaBridge 167:e84263d55307 529 }
AnnaBridge 167:e84263d55307 530
AnnaBridge 167:e84263d55307 531 memcpy(poweridx,(__u8 *)(iwr.u.data.pointer),20);
AnnaBridge 167:e84263d55307 532 rtw_free(para);
AnnaBridge 167:e84263d55307 533 return ret;
AnnaBridge 167:e84263d55307 534 }
AnnaBridge 167:e84263d55307 535
AnnaBridge 167:e84263d55307 536 #if 0
AnnaBridge 167:e84263d55307 537 int wext_set_txpower(const char *ifname, int poweridx)
AnnaBridge 167:e84263d55307 538 {
AnnaBridge 167:e84263d55307 539 int ret = 0;
AnnaBridge 167:e84263d55307 540 char buf[24];
AnnaBridge 167:e84263d55307 541
AnnaBridge 167:e84263d55307 542 rtw_memset(buf, 0, sizeof(buf));
AnnaBridge 167:e84263d55307 543 snprintf(buf, 24, "txpower patha=%d", poweridx);
AnnaBridge 167:e84263d55307 544 ret = wext_private_command(ifname, buf, 0);
AnnaBridge 167:e84263d55307 545
AnnaBridge 167:e84263d55307 546 return ret;
AnnaBridge 167:e84263d55307 547 }
AnnaBridge 167:e84263d55307 548
AnnaBridge 167:e84263d55307 549 int wext_get_associated_client_list(const char *ifname, void * client_list_buffer, uint16_t buffer_length)
AnnaBridge 167:e84263d55307 550 {
AnnaBridge 167:e84263d55307 551 int ret = 0;
AnnaBridge 167:e84263d55307 552 char buf[25];
AnnaBridge 167:e84263d55307 553
AnnaBridge 167:e84263d55307 554 rtw_memset(buf, 0, sizeof(buf));
AnnaBridge 167:e84263d55307 555 snprintf(buf, 25, "get_client_list %x", client_list_buffer);
AnnaBridge 167:e84263d55307 556 ret = wext_private_command(ifname, buf, 0);
AnnaBridge 167:e84263d55307 557
AnnaBridge 167:e84263d55307 558 return ret;
AnnaBridge 167:e84263d55307 559 }
AnnaBridge 167:e84263d55307 560
AnnaBridge 167:e84263d55307 561 int wext_get_ap_info(const char *ifname, rtw_bss_info_t * ap_info, rtw_security_t* security)
AnnaBridge 167:e84263d55307 562 {
AnnaBridge 167:e84263d55307 563 int ret = 0;
AnnaBridge 167:e84263d55307 564 char buf[24];
AnnaBridge 167:e84263d55307 565
AnnaBridge 167:e84263d55307 566 rtw_memset(buf, 0, sizeof(buf));
AnnaBridge 167:e84263d55307 567 snprintf(buf, 24, "get_ap_info %x", ap_info);
AnnaBridge 167:e84263d55307 568 ret = wext_private_command(ifname, buf, 0);
AnnaBridge 167:e84263d55307 569
AnnaBridge 167:e84263d55307 570 snprintf(buf, 24, "get_security");
AnnaBridge 167:e84263d55307 571 ret = wext_private_command_with_retval(ifname, buf, buf, 24);
AnnaBridge 167:e84263d55307 572 sscanf(buf, "%d", security);
AnnaBridge 167:e84263d55307 573
AnnaBridge 167:e84263d55307 574 return ret;
AnnaBridge 167:e84263d55307 575 }
AnnaBridge 167:e84263d55307 576 #endif
AnnaBridge 167:e84263d55307 577
AnnaBridge 167:e84263d55307 578 int wext_set_mode(const char *ifname, int mode)
AnnaBridge 167:e84263d55307 579 {
AnnaBridge 167:e84263d55307 580 struct iwreq iwr;
AnnaBridge 167:e84263d55307 581 int ret = 0;
AnnaBridge 167:e84263d55307 582
AnnaBridge 167:e84263d55307 583 memset(&iwr, 0, sizeof(iwr));
AnnaBridge 167:e84263d55307 584 iwr.u.mode = mode;
AnnaBridge 167:e84263d55307 585 if (iw_ioctl(ifname, SIOCSIWMODE, &iwr) < 0) {
Kojto 169:e3b6fe271b81 586 WIFI_UTIL_MSG("\n\rioctl[SIOCSIWMODE] error");
AnnaBridge 167:e84263d55307 587 ret = -1;
AnnaBridge 167:e84263d55307 588 }
AnnaBridge 167:e84263d55307 589
AnnaBridge 167:e84263d55307 590 return ret;
AnnaBridge 167:e84263d55307 591 }
AnnaBridge 167:e84263d55307 592
AnnaBridge 167:e84263d55307 593 int wext_get_mode(const char *ifname, int *mode)
AnnaBridge 167:e84263d55307 594 {
AnnaBridge 167:e84263d55307 595 struct iwreq iwr;
AnnaBridge 167:e84263d55307 596 int ret = 0;
AnnaBridge 167:e84263d55307 597
AnnaBridge 167:e84263d55307 598 memset(&iwr, 0, sizeof(iwr));
AnnaBridge 167:e84263d55307 599
AnnaBridge 167:e84263d55307 600 if (iw_ioctl(ifname, SIOCGIWMODE, &iwr) < 0) {
Kojto 169:e3b6fe271b81 601 WIFI_UTIL_MSG("\n\rioctl[SIOCGIWMODE] error");
AnnaBridge 167:e84263d55307 602 ret = -1;
AnnaBridge 167:e84263d55307 603 }
AnnaBridge 167:e84263d55307 604 else
AnnaBridge 167:e84263d55307 605 *mode = iwr.u.mode;
AnnaBridge 167:e84263d55307 606
AnnaBridge 167:e84263d55307 607 return ret;
AnnaBridge 167:e84263d55307 608 }
AnnaBridge 167:e84263d55307 609
AnnaBridge 167:e84263d55307 610 int wext_set_ap_ssid(const char *ifname, const __u8 *ssid, __u16 ssid_len)
AnnaBridge 167:e84263d55307 611 {
AnnaBridge 167:e84263d55307 612 struct iwreq iwr;
AnnaBridge 167:e84263d55307 613 int ret = 0;
AnnaBridge 167:e84263d55307 614
AnnaBridge 167:e84263d55307 615 memset(&iwr, 0, sizeof(iwr));
AnnaBridge 167:e84263d55307 616 iwr.u.essid.pointer = (void *) ssid;
AnnaBridge 167:e84263d55307 617 iwr.u.essid.length = ssid_len;
AnnaBridge 167:e84263d55307 618 iwr.u.essid.flags = (ssid_len != 0);
AnnaBridge 167:e84263d55307 619
AnnaBridge 167:e84263d55307 620 if (iw_ioctl(ifname, SIOCSIWPRIVAPESSID, &iwr) < 0) {
Kojto 169:e3b6fe271b81 621 WIFI_UTIL_MSG("\n\rioctl[SIOCSIWPRIVAPESSID] error");
AnnaBridge 167:e84263d55307 622 ret = -1;
AnnaBridge 167:e84263d55307 623 }
AnnaBridge 167:e84263d55307 624
AnnaBridge 167:e84263d55307 625 return ret;
AnnaBridge 167:e84263d55307 626 }
AnnaBridge 167:e84263d55307 627
AnnaBridge 167:e84263d55307 628 int wext_set_country(const char *ifname, rtw_country_code_t country_code)
AnnaBridge 167:e84263d55307 629 {
AnnaBridge 167:e84263d55307 630 struct iwreq iwr;
AnnaBridge 167:e84263d55307 631 int ret = 0;
AnnaBridge 167:e84263d55307 632
AnnaBridge 167:e84263d55307 633 memset(&iwr, 0, sizeof(iwr));
AnnaBridge 167:e84263d55307 634
AnnaBridge 167:e84263d55307 635 iwr.u.param.value = country_code;
AnnaBridge 167:e84263d55307 636
AnnaBridge 167:e84263d55307 637 if (iw_ioctl(ifname, SIOCSIWPRIVCOUNTRY, &iwr) < 0) {
Kojto 169:e3b6fe271b81 638 WIFI_UTIL_MSG("\n\rioctl[SIOCSIWPRIVCOUNTRY] error");
AnnaBridge 167:e84263d55307 639 ret = -1;
AnnaBridge 167:e84263d55307 640 }
AnnaBridge 167:e84263d55307 641 return ret;
AnnaBridge 167:e84263d55307 642 }
AnnaBridge 167:e84263d55307 643
AnnaBridge 167:e84263d55307 644 int wext_get_rssi(const char *ifname, int *rssi)
AnnaBridge 167:e84263d55307 645 {
AnnaBridge 167:e84263d55307 646 struct iwreq iwr;
AnnaBridge 167:e84263d55307 647 int ret = 0;
AnnaBridge 167:e84263d55307 648
AnnaBridge 167:e84263d55307 649 memset(&iwr, 0, sizeof(iwr));
AnnaBridge 167:e84263d55307 650
AnnaBridge 167:e84263d55307 651 if (iw_ioctl(ifname, SIOCGIWSENS, &iwr) < 0) {
Kojto 169:e3b6fe271b81 652 WIFI_UTIL_MSG("\n\rioctl[SIOCGIWSENS] error");
AnnaBridge 167:e84263d55307 653 ret = -1;
AnnaBridge 167:e84263d55307 654 } else {
AnnaBridge 167:e84263d55307 655 *rssi = 0 - iwr.u.sens.value;
AnnaBridge 167:e84263d55307 656 }
AnnaBridge 167:e84263d55307 657 return ret;
AnnaBridge 167:e84263d55307 658 }
AnnaBridge 167:e84263d55307 659
AnnaBridge 167:e84263d55307 660 int wext_set_pscan_channel(const char *ifname, __u8 *ch, __u8 *pscan_config, __u8 length)
AnnaBridge 167:e84263d55307 661 {
AnnaBridge 167:e84263d55307 662 struct iwreq iwr;
AnnaBridge 167:e84263d55307 663 int ret = 0;
AnnaBridge 167:e84263d55307 664 __u8 *para = NULL;
AnnaBridge 167:e84263d55307 665 int i =0;
AnnaBridge 167:e84263d55307 666
AnnaBridge 167:e84263d55307 667 memset(&iwr, 0, sizeof(iwr));
AnnaBridge 167:e84263d55307 668 //Format of para:function_name num_channel chan1... pscan_config1 ...
AnnaBridge 167:e84263d55307 669 para = rtw_malloc((length + length + 1) + 12);//size:num_chan + num_time + length + function_name
AnnaBridge 167:e84263d55307 670 if(para == NULL) return -1;
AnnaBridge 167:e84263d55307 671
AnnaBridge 167:e84263d55307 672 //Cmd
AnnaBridge 167:e84263d55307 673 snprintf((char*)para, 12, "PartialScan");
AnnaBridge 167:e84263d55307 674 //length
AnnaBridge 167:e84263d55307 675 *(para+12) = length;
AnnaBridge 167:e84263d55307 676 for(i = 0; i < length; i++){
AnnaBridge 167:e84263d55307 677 *(para + 13 + i)= *(ch + i);
AnnaBridge 167:e84263d55307 678 *((__u16*) (para + 13 + length + i))= *(pscan_config + i);
AnnaBridge 167:e84263d55307 679 }
AnnaBridge 167:e84263d55307 680
AnnaBridge 167:e84263d55307 681 iwr.u.data.pointer = para;
AnnaBridge 167:e84263d55307 682 iwr.u.data.length = (length + length + 1) + 12;
AnnaBridge 167:e84263d55307 683 if (iw_ioctl(ifname, SIOCDEVPRIVATE, &iwr) < 0) {
Kojto 169:e3b6fe271b81 684 WIFI_UTIL_MSG("\n\rwext_set_pscan_channel():ioctl[SIOCDEVPRIVATE] error");
AnnaBridge 167:e84263d55307 685 ret = -1;
AnnaBridge 167:e84263d55307 686 }
AnnaBridge 167:e84263d55307 687 rtw_free(para);
AnnaBridge 167:e84263d55307 688 return ret;
AnnaBridge 167:e84263d55307 689 }
AnnaBridge 167:e84263d55307 690 int wext_set_channel(const char *ifname, __u8 ch)
AnnaBridge 167:e84263d55307 691 {
AnnaBridge 167:e84263d55307 692 struct iwreq iwr;
AnnaBridge 167:e84263d55307 693 int ret = 0;
AnnaBridge 167:e84263d55307 694
AnnaBridge 167:e84263d55307 695 memset(&iwr, 0, sizeof(iwr));
AnnaBridge 167:e84263d55307 696 iwr.u.freq.m = 0;
AnnaBridge 167:e84263d55307 697 iwr.u.freq.e = 0;
AnnaBridge 167:e84263d55307 698 iwr.u.freq.i = ch;
AnnaBridge 167:e84263d55307 699
AnnaBridge 167:e84263d55307 700 if (iw_ioctl(ifname, SIOCSIWFREQ, &iwr) < 0) {
Kojto 169:e3b6fe271b81 701 WIFI_UTIL_MSG("\n\rioctl[SIOCSIWFREQ] error");
AnnaBridge 167:e84263d55307 702 ret = -1;
AnnaBridge 167:e84263d55307 703 }
AnnaBridge 167:e84263d55307 704
AnnaBridge 167:e84263d55307 705 return ret;
AnnaBridge 167:e84263d55307 706 }
AnnaBridge 167:e84263d55307 707
AnnaBridge 167:e84263d55307 708 int wext_get_channel(const char *ifname, __u8 *ch)
AnnaBridge 167:e84263d55307 709 {
AnnaBridge 167:e84263d55307 710 struct iwreq iwr;
AnnaBridge 167:e84263d55307 711 int ret = 0;
AnnaBridge 167:e84263d55307 712
AnnaBridge 167:e84263d55307 713 memset(&iwr, 0, sizeof(iwr));
AnnaBridge 167:e84263d55307 714
AnnaBridge 167:e84263d55307 715 if (iw_ioctl(ifname, SIOCGIWFREQ, &iwr) < 0) {
Kojto 169:e3b6fe271b81 716 WIFI_UTIL_MSG("\n\rioctl[SIOCGIWFREQ] error");
AnnaBridge 167:e84263d55307 717 ret = -1;
AnnaBridge 167:e84263d55307 718 }
AnnaBridge 167:e84263d55307 719 else
AnnaBridge 167:e84263d55307 720 *ch = iwr.u.freq.i;
AnnaBridge 167:e84263d55307 721
AnnaBridge 167:e84263d55307 722 return ret;
AnnaBridge 167:e84263d55307 723 }
AnnaBridge 167:e84263d55307 724
AnnaBridge 167:e84263d55307 725 int wext_register_multicast_address(const char *ifname, rtw_mac_t *mac)
AnnaBridge 167:e84263d55307 726 {
AnnaBridge 167:e84263d55307 727 int ret = 0;
AnnaBridge 167:e84263d55307 728 char buf[32];
AnnaBridge 167:e84263d55307 729
AnnaBridge 167:e84263d55307 730 rtw_memset(buf, 0, sizeof(buf));
AnnaBridge 167:e84263d55307 731 snprintf(buf, 32, "reg_multicast "MAC_FMT, MAC_ARG(mac->octet));
AnnaBridge 167:e84263d55307 732 ret = wext_private_command(ifname, buf, 0);
AnnaBridge 167:e84263d55307 733
AnnaBridge 167:e84263d55307 734 return ret;
AnnaBridge 167:e84263d55307 735 }
AnnaBridge 167:e84263d55307 736
AnnaBridge 167:e84263d55307 737 int wext_unregister_multicast_address(const char *ifname, rtw_mac_t *mac)
AnnaBridge 167:e84263d55307 738 {
AnnaBridge 167:e84263d55307 739 int ret = 0;
AnnaBridge 167:e84263d55307 740 char buf[35];
AnnaBridge 167:e84263d55307 741
AnnaBridge 167:e84263d55307 742 rtw_memset(buf, 0, sizeof(buf));
AnnaBridge 167:e84263d55307 743 snprintf(buf, 35, "reg_multicast -d "MAC_FMT, MAC_ARG(mac->octet));
AnnaBridge 167:e84263d55307 744 ret = wext_private_command(ifname, buf, 0);
AnnaBridge 167:e84263d55307 745
AnnaBridge 167:e84263d55307 746 return ret;
AnnaBridge 167:e84263d55307 747 }
AnnaBridge 167:e84263d55307 748
AnnaBridge 167:e84263d55307 749 int wext_set_scan(const char *ifname, char *buf, __u16 buf_len, __u16 flags)
AnnaBridge 167:e84263d55307 750 {
AnnaBridge 167:e84263d55307 751 struct iwreq iwr;
AnnaBridge 167:e84263d55307 752 int ret = 0;
AnnaBridge 167:e84263d55307 753
AnnaBridge 167:e84263d55307 754 memset(&iwr, 0, sizeof(iwr));
AnnaBridge 167:e84263d55307 755 #if 0 //for scan_with_ssid
AnnaBridge 167:e84263d55307 756 if(buf)
AnnaBridge 167:e84263d55307 757 memset(buf, 0, buf_len);
AnnaBridge 167:e84263d55307 758 #endif
AnnaBridge 167:e84263d55307 759 iwr.u.data.pointer = buf;
AnnaBridge 167:e84263d55307 760 iwr.u.data.flags = flags;
AnnaBridge 167:e84263d55307 761 iwr.u.data.length = buf_len;
AnnaBridge 167:e84263d55307 762 if (iw_ioctl(ifname, SIOCSIWSCAN, &iwr) < 0) {
Kojto 169:e3b6fe271b81 763 WIFI_UTIL_MSG("\n\rioctl[SIOCSIWSCAN] error");
AnnaBridge 167:e84263d55307 764 ret = -1;
AnnaBridge 167:e84263d55307 765 }
AnnaBridge 167:e84263d55307 766 return ret;
AnnaBridge 167:e84263d55307 767 }
AnnaBridge 167:e84263d55307 768
AnnaBridge 167:e84263d55307 769 int wext_get_scan(const char *ifname, char *buf, __u16 buf_len)
AnnaBridge 167:e84263d55307 770 {
AnnaBridge 167:e84263d55307 771 struct iwreq iwr;
AnnaBridge 167:e84263d55307 772 int ret = 0;
AnnaBridge 167:e84263d55307 773
AnnaBridge 167:e84263d55307 774 iwr.u.data.pointer = buf;
AnnaBridge 167:e84263d55307 775 iwr.u.data.length = buf_len;
AnnaBridge 167:e84263d55307 776 if (iw_ioctl(ifname, SIOCGIWSCAN, &iwr) < 0) {
Kojto 169:e3b6fe271b81 777 WIFI_UTIL_MSG("\n\rioctl[SIOCGIWSCAN] error");
AnnaBridge 167:e84263d55307 778 ret = -1;
AnnaBridge 167:e84263d55307 779 }else
AnnaBridge 167:e84263d55307 780 ret = iwr.u.data.flags;
AnnaBridge 167:e84263d55307 781 return ret;
AnnaBridge 167:e84263d55307 782 }
AnnaBridge 167:e84263d55307 783
AnnaBridge 167:e84263d55307 784 int wext_private_command_with_retval(const char *ifname, char *cmd, char *ret_buf, int ret_len)
AnnaBridge 167:e84263d55307 785 {
AnnaBridge 167:e84263d55307 786 struct iwreq iwr;
AnnaBridge 167:e84263d55307 787 int ret = 0, buf_size;
AnnaBridge 167:e84263d55307 788 char *buf;
AnnaBridge 167:e84263d55307 789
AnnaBridge 167:e84263d55307 790 buf_size = 128;
AnnaBridge 167:e84263d55307 791 if(strlen(cmd) >= buf_size)
AnnaBridge 167:e84263d55307 792 buf_size = strlen(cmd) + 1; // 1 : '\0'
AnnaBridge 167:e84263d55307 793 buf = (char*)rtw_malloc(buf_size);
AnnaBridge 167:e84263d55307 794 if(!buf){
Kojto 169:e3b6fe271b81 795 WIFI_UTIL_MSG("\n\rWEXT: Can't malloc memory");
AnnaBridge 167:e84263d55307 796 return -1;
AnnaBridge 167:e84263d55307 797 }
AnnaBridge 167:e84263d55307 798 memset(buf, 0, buf_size);
AnnaBridge 167:e84263d55307 799 strcpy(buf, cmd);
AnnaBridge 167:e84263d55307 800 memset(&iwr, 0, sizeof(iwr));
AnnaBridge 167:e84263d55307 801 iwr.u.data.pointer = buf;
AnnaBridge 167:e84263d55307 802 iwr.u.data.length = buf_size;
AnnaBridge 167:e84263d55307 803 iwr.u.data.flags = 0;
AnnaBridge 167:e84263d55307 804
AnnaBridge 167:e84263d55307 805 if ((ret = iw_ioctl(ifname, SIOCDEVPRIVATE, &iwr)) < 0) {
Kojto 169:e3b6fe271b81 806 WIFI_UTIL_MSG("\n\rioctl[SIOCDEVPRIVATE] error. ret=%d\n", ret);
AnnaBridge 167:e84263d55307 807 }
AnnaBridge 167:e84263d55307 808 if(ret_buf){
AnnaBridge 167:e84263d55307 809 if(ret_len > iwr.u.data.length)
AnnaBridge 167:e84263d55307 810 ret_len = iwr.u.data.length;
AnnaBridge 167:e84263d55307 811 rtw_memcpy(ret_buf, (char *) iwr.u.data.pointer, ret_len);
AnnaBridge 167:e84263d55307 812 }
AnnaBridge 167:e84263d55307 813 rtw_free(buf);
AnnaBridge 167:e84263d55307 814 return ret;
AnnaBridge 167:e84263d55307 815 }
AnnaBridge 167:e84263d55307 816
AnnaBridge 167:e84263d55307 817 int wext_private_command(const char *ifname, char *cmd, int show_msg)
AnnaBridge 167:e84263d55307 818 {
AnnaBridge 167:e84263d55307 819 struct iwreq iwr;
AnnaBridge 167:e84263d55307 820 int ret = 0, buf_size;
AnnaBridge 167:e84263d55307 821 char *buf;
AnnaBridge 167:e84263d55307 822
AnnaBridge 167:e84263d55307 823 u8 cmdname[17] = {0}; // IFNAMSIZ+1
AnnaBridge 167:e84263d55307 824
AnnaBridge 167:e84263d55307 825 sscanf(cmd, "%16s", cmdname);
AnnaBridge 167:e84263d55307 826 if((strcmp((const char *)cmdname, "config_get") == 0)
AnnaBridge 167:e84263d55307 827 || (strcmp((const char *)cmdname, "config_set") == 0)
AnnaBridge 167:e84263d55307 828 || (strcmp((const char *)cmdname, "efuse_get") == 0)
AnnaBridge 167:e84263d55307 829 || (strcmp((const char *)cmdname, "efuse_set") == 0)
AnnaBridge 167:e84263d55307 830 || (strcmp((const char *)cmdname, "mp_psd") == 0))
AnnaBridge 167:e84263d55307 831 buf_size = 2600;//2600 for config_get rmap,0,512 (or realmap)
AnnaBridge 167:e84263d55307 832 else
AnnaBridge 167:e84263d55307 833 buf_size = 512;
AnnaBridge 167:e84263d55307 834
AnnaBridge 167:e84263d55307 835 if (strlen(cmd) >= buf_size)
AnnaBridge 167:e84263d55307 836 buf_size = strlen(cmd) + 1; // 1 : '\0'
AnnaBridge 167:e84263d55307 837 buf = (char*)rtw_malloc(buf_size);
AnnaBridge 167:e84263d55307 838 if (!buf) {
Kojto 169:e3b6fe271b81 839 WIFI_UTIL_MSG("\n\rWEXT: Can't malloc memory");
AnnaBridge 167:e84263d55307 840 return -1;
AnnaBridge 167:e84263d55307 841 }
AnnaBridge 167:e84263d55307 842 memset(buf, 0, buf_size);
AnnaBridge 167:e84263d55307 843 strcpy(buf, cmd);
AnnaBridge 167:e84263d55307 844 memset(&iwr, 0, sizeof(iwr));
AnnaBridge 167:e84263d55307 845 iwr.u.data.pointer = buf;
AnnaBridge 167:e84263d55307 846 iwr.u.data.length = buf_size;
AnnaBridge 167:e84263d55307 847 iwr.u.data.flags = 0;
AnnaBridge 167:e84263d55307 848
AnnaBridge 167:e84263d55307 849 if ((ret = iw_ioctl(ifname, SIOCDEVPRIVATE, &iwr)) < 0) {
Kojto 169:e3b6fe271b81 850 WIFI_UTIL_MSG("\n\rioctl[SIOCDEVPRIVATE] error. ret=%d\n", ret);
AnnaBridge 167:e84263d55307 851 }
AnnaBridge 167:e84263d55307 852 if (show_msg && iwr.u.data.length) {
AnnaBridge 167:e84263d55307 853 if(iwr.u.data.length > buf_size)
Kojto 169:e3b6fe271b81 854 WIFI_UTIL_MSG("\n\rWEXT: Malloc memory is not enough");
Kojto 169:e3b6fe271b81 855 WIFI_UTIL_MSG("\n\rPrivate Message: %s", (char *) iwr.u.data.pointer);
AnnaBridge 167:e84263d55307 856 }
AnnaBridge 167:e84263d55307 857 rtw_free(buf);
AnnaBridge 167:e84263d55307 858 return ret;
AnnaBridge 167:e84263d55307 859 }
AnnaBridge 167:e84263d55307 860
AnnaBridge 167:e84263d55307 861 void wext_wlan_indicate(unsigned int cmd, union iwreq_data *wrqu, char *extra)
AnnaBridge 167:e84263d55307 862 {
AnnaBridge 167:e84263d55307 863 unsigned char null_mac[6] = {0};
AnnaBridge 167:e84263d55307 864
AnnaBridge 167:e84263d55307 865 switch(cmd)
AnnaBridge 167:e84263d55307 866 {
AnnaBridge 167:e84263d55307 867 case SIOCGIWAP:
AnnaBridge 167:e84263d55307 868 if(wrqu->ap_addr.sa_family == ARPHRD_ETHER)
AnnaBridge 167:e84263d55307 869 {
AnnaBridge 167:e84263d55307 870 if(!memcmp(wrqu->ap_addr.sa_data, null_mac, sizeof(null_mac)))
AnnaBridge 167:e84263d55307 871 wifi_indication(WIFI_EVENT_DISCONNECT, NULL, 0, 0);
AnnaBridge 167:e84263d55307 872 else
AnnaBridge 167:e84263d55307 873 wifi_indication(WIFI_EVENT_CONNECT, wrqu->ap_addr.sa_data, sizeof(null_mac), 0);
AnnaBridge 167:e84263d55307 874 }
AnnaBridge 167:e84263d55307 875 break;
AnnaBridge 167:e84263d55307 876
AnnaBridge 167:e84263d55307 877 case IWEVCUSTOM:
AnnaBridge 167:e84263d55307 878 if(extra)
AnnaBridge 167:e84263d55307 879 {
AnnaBridge 167:e84263d55307 880 if(!memcmp(IW_EXT_STR_FOURWAY_DONE, extra, strlen(IW_EXT_STR_FOURWAY_DONE)))
AnnaBridge 167:e84263d55307 881 wifi_indication(WIFI_EVENT_FOURWAY_HANDSHAKE_DONE, extra, strlen(IW_EXT_STR_FOURWAY_DONE), 0);
AnnaBridge 167:e84263d55307 882 else if(!memcmp(IW_EXT_STR_RECONNECTION_FAIL, extra, strlen(IW_EXT_STR_RECONNECTION_FAIL)))
AnnaBridge 167:e84263d55307 883 wifi_indication(WIFI_EVENT_RECONNECTION_FAIL, extra, strlen(IW_EXT_STR_RECONNECTION_FAIL), 0);
AnnaBridge 167:e84263d55307 884 else if(!memcmp(IW_EVT_STR_NO_NETWORK, extra, strlen(IW_EVT_STR_NO_NETWORK)))
AnnaBridge 167:e84263d55307 885 wifi_indication(WIFI_EVENT_NO_NETWORK, extra, strlen(IW_EVT_STR_NO_NETWORK), 0);
AnnaBridge 167:e84263d55307 886 #if CONFIG_ENABLE_P2P || defined(CONFIG_AP_MODE)
AnnaBridge 167:e84263d55307 887 else if(!memcmp(IW_EVT_STR_STA_ASSOC, extra, strlen(IW_EVT_STR_STA_ASSOC)))
AnnaBridge 167:e84263d55307 888 wifi_indication(WIFI_EVENT_STA_ASSOC, wrqu->data.pointer, wrqu->data.length, 0);
AnnaBridge 167:e84263d55307 889 else if(!memcmp(IW_EVT_STR_STA_DISASSOC, extra, strlen(IW_EVT_STR_STA_DISASSOC)))
AnnaBridge 167:e84263d55307 890 wifi_indication(WIFI_EVENT_STA_DISASSOC, wrqu->addr.sa_data, sizeof(null_mac), 0);
AnnaBridge 167:e84263d55307 891 else if(!memcmp(IW_EVT_STR_SEND_ACTION_DONE, extra, strlen(IW_EVT_STR_SEND_ACTION_DONE)))
AnnaBridge 167:e84263d55307 892 wifi_indication(WIFI_EVENT_SEND_ACTION_DONE, NULL, 0, wrqu->data.flags);
AnnaBridge 167:e84263d55307 893 #endif
AnnaBridge 167:e84263d55307 894 }
AnnaBridge 167:e84263d55307 895 break;
AnnaBridge 167:e84263d55307 896 case SIOCGIWSCAN:
AnnaBridge 167:e84263d55307 897 if(wrqu->data.pointer == NULL)
AnnaBridge 167:e84263d55307 898 wifi_indication(WIFI_EVENT_SCAN_DONE, NULL, 0, 0);
AnnaBridge 167:e84263d55307 899 else
AnnaBridge 167:e84263d55307 900 wifi_indication(WIFI_EVENT_SCAN_RESULT_REPORT, wrqu->data.pointer, wrqu->data.length, 0);
AnnaBridge 167:e84263d55307 901 break;
AnnaBridge 167:e84263d55307 902 case IWEVMGNTRECV:
AnnaBridge 167:e84263d55307 903 wifi_indication(WIFI_EVENT_RX_MGNT, wrqu->data.pointer, wrqu->data.length, wrqu->data.flags);
AnnaBridge 167:e84263d55307 904 break;
AnnaBridge 167:e84263d55307 905 #ifdef REPORT_STA_EVENT
AnnaBridge 167:e84263d55307 906 case IWEVREGISTERED:
AnnaBridge 167:e84263d55307 907 if(wrqu->addr.sa_family == ARPHRD_ETHER)
AnnaBridge 167:e84263d55307 908 wifi_indication(WIFI_EVENT_STA_ASSOC, wrqu->addr.sa_data, sizeof(null_mac), 0);
AnnaBridge 167:e84263d55307 909 break;
AnnaBridge 167:e84263d55307 910 case IWEVEXPIRED:
AnnaBridge 167:e84263d55307 911 if(wrqu->addr.sa_family == ARPHRD_ETHER)
AnnaBridge 167:e84263d55307 912 wifi_indication(WIFI_EVENT_STA_DISASSOC, wrqu->addr.sa_data, sizeof(null_mac), 0);
AnnaBridge 167:e84263d55307 913 break;
AnnaBridge 167:e84263d55307 914 #endif
AnnaBridge 167:e84263d55307 915 default:
AnnaBridge 167:e84263d55307 916 break;
AnnaBridge 167:e84263d55307 917
AnnaBridge 167:e84263d55307 918 }
AnnaBridge 167:e84263d55307 919
AnnaBridge 167:e84263d55307 920 }
AnnaBridge 167:e84263d55307 921
AnnaBridge 167:e84263d55307 922
AnnaBridge 167:e84263d55307 923 int wext_send_eapol(const char *ifname, char *buf, __u16 buf_len, __u16 flags)
AnnaBridge 167:e84263d55307 924 {
AnnaBridge 167:e84263d55307 925 struct iwreq iwr;
AnnaBridge 167:e84263d55307 926 int ret = 0;
AnnaBridge 167:e84263d55307 927
AnnaBridge 167:e84263d55307 928 memset(&iwr, 0, sizeof(iwr));
AnnaBridge 167:e84263d55307 929 iwr.u.data.pointer = buf;
AnnaBridge 167:e84263d55307 930 iwr.u.data.length = buf_len;
AnnaBridge 167:e84263d55307 931 iwr.u.data.flags = flags;
AnnaBridge 167:e84263d55307 932 if (iw_ioctl(ifname, SIOCSIWEAPOLSEND, &iwr) < 0) {
Kojto 169:e3b6fe271b81 933 WIFI_UTIL_MSG("\n\rioctl[SIOCSIWEAPOLSEND] error");
AnnaBridge 167:e84263d55307 934 ret = -1;
AnnaBridge 167:e84263d55307 935 }
AnnaBridge 167:e84263d55307 936 return ret;
AnnaBridge 167:e84263d55307 937 }
AnnaBridge 167:e84263d55307 938
AnnaBridge 167:e84263d55307 939 int wext_send_mgnt(const char *ifname, char *buf, __u16 buf_len, __u16 flags)
AnnaBridge 167:e84263d55307 940 {
AnnaBridge 167:e84263d55307 941 struct iwreq iwr;
AnnaBridge 167:e84263d55307 942 int ret = 0;
AnnaBridge 167:e84263d55307 943
AnnaBridge 167:e84263d55307 944 memset(&iwr, 0, sizeof(iwr));
AnnaBridge 167:e84263d55307 945 iwr.u.data.pointer = buf;
AnnaBridge 167:e84263d55307 946 iwr.u.data.length = buf_len;
AnnaBridge 167:e84263d55307 947 iwr.u.data.flags = flags;
AnnaBridge 167:e84263d55307 948 if (iw_ioctl(ifname, SIOCSIWMGNTSEND, &iwr) < 0) {
Kojto 169:e3b6fe271b81 949 WIFI_UTIL_MSG("\n\rioctl[SIOCSIWMGNTSEND] error");
AnnaBridge 167:e84263d55307 950 ret = -1;
AnnaBridge 167:e84263d55307 951 }
AnnaBridge 167:e84263d55307 952 return ret;
AnnaBridge 167:e84263d55307 953 }
AnnaBridge 167:e84263d55307 954
AnnaBridge 167:e84263d55307 955 int wext_set_gen_ie(const char *ifname, char *buf, __u16 buf_len, __u16 flags)
AnnaBridge 167:e84263d55307 956 {
AnnaBridge 167:e84263d55307 957 struct iwreq iwr;
AnnaBridge 167:e84263d55307 958 int ret = 0;
AnnaBridge 167:e84263d55307 959
AnnaBridge 167:e84263d55307 960 memset(&iwr, 0, sizeof(iwr));
AnnaBridge 167:e84263d55307 961 iwr.u.data.pointer = buf;
AnnaBridge 167:e84263d55307 962 iwr.u.data.length = buf_len;
AnnaBridge 167:e84263d55307 963 iwr.u.data.flags = flags;
AnnaBridge 167:e84263d55307 964 if (iw_ioctl(ifname, SIOCSIWGENIE, &iwr) < 0) {
Kojto 169:e3b6fe271b81 965 WIFI_UTIL_MSG("\n\rioctl[SIOCSIWGENIE] error");
AnnaBridge 167:e84263d55307 966 ret = -1;
AnnaBridge 167:e84263d55307 967 }
AnnaBridge 167:e84263d55307 968 return ret;
AnnaBridge 167:e84263d55307 969 }
AnnaBridge 167:e84263d55307 970
AnnaBridge 167:e84263d55307 971 int wext_set_autoreconnect(const char *ifname, __u8 mode, __u8 retry_times, __u16 timeout)
AnnaBridge 167:e84263d55307 972 {
AnnaBridge 167:e84263d55307 973 struct iwreq iwr;
AnnaBridge 167:e84263d55307 974 int ret = 0;
AnnaBridge 167:e84263d55307 975 __u8 *para = NULL;
AnnaBridge 167:e84263d55307 976 int cmd_len = 0;
AnnaBridge 167:e84263d55307 977
AnnaBridge 167:e84263d55307 978 memset(&iwr, 0, sizeof(iwr));
AnnaBridge 167:e84263d55307 979 cmd_len = sizeof("SetAutoRecnt");
AnnaBridge 167:e84263d55307 980 para = rtw_malloc((4) + cmd_len);//size:para_len+cmd_len
AnnaBridge 167:e84263d55307 981 if(para == NULL) return -1;
AnnaBridge 167:e84263d55307 982
AnnaBridge 167:e84263d55307 983 //Cmd
AnnaBridge 167:e84263d55307 984 snprintf((char*)para, cmd_len, "SetAutoRecnt");
AnnaBridge 167:e84263d55307 985 //length
AnnaBridge 167:e84263d55307 986 *(para+cmd_len) = mode; //para1
AnnaBridge 167:e84263d55307 987 *(para+cmd_len+1) = retry_times; //para2
AnnaBridge 167:e84263d55307 988 *(para+cmd_len+2) = timeout; //para3
AnnaBridge 167:e84263d55307 989
AnnaBridge 167:e84263d55307 990 iwr.u.data.pointer = para;
AnnaBridge 167:e84263d55307 991 iwr.u.data.length = (4) + cmd_len;
AnnaBridge 167:e84263d55307 992 if (iw_ioctl(ifname, SIOCDEVPRIVATE, &iwr) < 0) {
Kojto 169:e3b6fe271b81 993 WIFI_UTIL_MSG("\n\rwext_set_autoreconnect():ioctl[SIOCDEVPRIVATE] error");
AnnaBridge 167:e84263d55307 994 ret = -1;
AnnaBridge 167:e84263d55307 995 }
AnnaBridge 167:e84263d55307 996 rtw_free(para);
AnnaBridge 167:e84263d55307 997 return ret;
AnnaBridge 167:e84263d55307 998 }
AnnaBridge 167:e84263d55307 999
AnnaBridge 167:e84263d55307 1000 int wext_get_autoreconnect(const char *ifname, __u8 *mode)
AnnaBridge 167:e84263d55307 1001 {
AnnaBridge 167:e84263d55307 1002 struct iwreq iwr;
AnnaBridge 167:e84263d55307 1003 int ret = 0;
AnnaBridge 167:e84263d55307 1004 __u8 *para = NULL;
AnnaBridge 167:e84263d55307 1005 int cmd_len = 0;
AnnaBridge 167:e84263d55307 1006
AnnaBridge 167:e84263d55307 1007 memset(&iwr, 0, sizeof(iwr));
AnnaBridge 167:e84263d55307 1008 cmd_len = sizeof("GetAutoRecnt");
AnnaBridge 167:e84263d55307 1009 para = rtw_malloc(cmd_len);//size:para_len+cmd_len
AnnaBridge 167:e84263d55307 1010 //Cmd
AnnaBridge 167:e84263d55307 1011 snprintf((char*)para, cmd_len, "GetAutoRecnt");
AnnaBridge 167:e84263d55307 1012 //length
AnnaBridge 167:e84263d55307 1013
AnnaBridge 167:e84263d55307 1014 iwr.u.data.pointer = para;
AnnaBridge 167:e84263d55307 1015 iwr.u.data.length = cmd_len;
AnnaBridge 167:e84263d55307 1016 if (iw_ioctl(ifname, SIOCDEVPRIVATE, &iwr) < 0) {
Kojto 169:e3b6fe271b81 1017 WIFI_UTIL_MSG("\n\rwext_get_autoreconnect():ioctl[SIOCDEVPRIVATE] error");
AnnaBridge 167:e84263d55307 1018 ret = -1;
AnnaBridge 167:e84263d55307 1019 }
AnnaBridge 167:e84263d55307 1020 *mode = *(__u8 *)(iwr.u.data.pointer);
AnnaBridge 167:e84263d55307 1021 rtw_free(para);
AnnaBridge 167:e84263d55307 1022 return ret;
AnnaBridge 167:e84263d55307 1023 }
AnnaBridge 167:e84263d55307 1024
AnnaBridge 167:e84263d55307 1025 int wext_get_drv_ability(const char *ifname, __u32 *ability)
AnnaBridge 167:e84263d55307 1026 {
AnnaBridge 167:e84263d55307 1027 int ret = 0;
AnnaBridge 167:e84263d55307 1028 char * buf = (char *)rtw_zmalloc(33);
AnnaBridge 167:e84263d55307 1029 if(buf == NULL) return -1;
AnnaBridge 167:e84263d55307 1030
AnnaBridge 167:e84263d55307 1031 snprintf(buf, 33, "get_drv_ability %x", (unsigned int)ability);
AnnaBridge 167:e84263d55307 1032 ret = wext_private_command(ifname, buf, 0);
AnnaBridge 167:e84263d55307 1033
AnnaBridge 167:e84263d55307 1034 rtw_free(buf);
AnnaBridge 167:e84263d55307 1035 return ret;
AnnaBridge 167:e84263d55307 1036 }
AnnaBridge 167:e84263d55307 1037
AnnaBridge 167:e84263d55307 1038 #ifdef CONFIG_CUSTOM_IE
AnnaBridge 167:e84263d55307 1039 int wext_add_custom_ie(const char *ifname, void *cus_ie, int ie_num)
AnnaBridge 167:e84263d55307 1040 {
AnnaBridge 167:e84263d55307 1041 struct iwreq iwr;
AnnaBridge 167:e84263d55307 1042 int ret = 0;
AnnaBridge 167:e84263d55307 1043 __u8 *para = NULL;
AnnaBridge 167:e84263d55307 1044 int cmd_len = 0;
AnnaBridge 167:e84263d55307 1045 if(ie_num <= 0 || !cus_ie){
Kojto 169:e3b6fe271b81 1046 WIFI_UTIL_MSG("\n\rwext_add_custom_ie():wrong parameter");
AnnaBridge 167:e84263d55307 1047 ret = -1;
AnnaBridge 167:e84263d55307 1048 return ret;
AnnaBridge 167:e84263d55307 1049 }
AnnaBridge 167:e84263d55307 1050 memset(&iwr, 0, sizeof(iwr));
AnnaBridge 167:e84263d55307 1051 cmd_len = sizeof("SetCusIE");
AnnaBridge 167:e84263d55307 1052 para = rtw_malloc((4)* 2 + cmd_len);//size:addr len+cmd_len
AnnaBridge 167:e84263d55307 1053 if(para == NULL) return -1;
AnnaBridge 167:e84263d55307 1054
AnnaBridge 167:e84263d55307 1055 //Cmd
AnnaBridge 167:e84263d55307 1056 snprintf(para, cmd_len, "SetCusIE");
AnnaBridge 167:e84263d55307 1057 //addr length
AnnaBridge 167:e84263d55307 1058 *(__u32 *)(para + cmd_len) = (__u32)cus_ie; //ie addr
AnnaBridge 167:e84263d55307 1059 //ie_num
AnnaBridge 167:e84263d55307 1060 *(__u32 *)(para + cmd_len + 4) = ie_num; //num of ie
AnnaBridge 167:e84263d55307 1061
AnnaBridge 167:e84263d55307 1062 iwr.u.data.pointer = para;
AnnaBridge 167:e84263d55307 1063 iwr.u.data.length = (4)* 2 + cmd_len;// 2 input
AnnaBridge 167:e84263d55307 1064 if (iw_ioctl(ifname, SIOCDEVPRIVATE, &iwr) < 0) {
Kojto 169:e3b6fe271b81 1065 WIFI_UTIL_MSG("\n\rwext_add_custom_ie():ioctl[SIOCDEVPRIVATE] error");
AnnaBridge 167:e84263d55307 1066 ret = -1;
AnnaBridge 167:e84263d55307 1067 }
AnnaBridge 167:e84263d55307 1068 rtw_free(para);
AnnaBridge 167:e84263d55307 1069
AnnaBridge 167:e84263d55307 1070 return ret;
AnnaBridge 167:e84263d55307 1071 }
AnnaBridge 167:e84263d55307 1072
AnnaBridge 167:e84263d55307 1073 int wext_update_custom_ie(const char *ifname, void * cus_ie, int ie_index)
AnnaBridge 167:e84263d55307 1074 {
AnnaBridge 167:e84263d55307 1075 struct iwreq iwr;
AnnaBridge 167:e84263d55307 1076 int ret = 0;
AnnaBridge 167:e84263d55307 1077 __u8 *para = NULL;
AnnaBridge 167:e84263d55307 1078 int cmd_len = 0;
AnnaBridge 167:e84263d55307 1079 if(ie_index <= 0 || !cus_ie){
Kojto 169:e3b6fe271b81 1080 WIFI_UTIL_MSG("\n\rwext_update_custom_ie():wrong parameter");
AnnaBridge 167:e84263d55307 1081 ret = -1;
AnnaBridge 167:e84263d55307 1082 return ret;
AnnaBridge 167:e84263d55307 1083 }
AnnaBridge 167:e84263d55307 1084 memset(&iwr, 0, sizeof(iwr));
AnnaBridge 167:e84263d55307 1085 cmd_len = sizeof("UpdateIE");
AnnaBridge 167:e84263d55307 1086 para = rtw_malloc((4)* 2 + cmd_len);//size:addr len+cmd_len
AnnaBridge 167:e84263d55307 1087 if(para == NULL) return -1;
AnnaBridge 167:e84263d55307 1088
AnnaBridge 167:e84263d55307 1089 //Cmd
AnnaBridge 167:e84263d55307 1090 snprintf(para, cmd_len, "UpdateIE");
AnnaBridge 167:e84263d55307 1091 //addr length
AnnaBridge 167:e84263d55307 1092 *(__u32 *)(para + cmd_len) = (__u32)cus_ie; //ie addr
AnnaBridge 167:e84263d55307 1093 //ie_index
AnnaBridge 167:e84263d55307 1094 *(__u32 *)(para + cmd_len + 4) = ie_index; //num of ie
AnnaBridge 167:e84263d55307 1095
AnnaBridge 167:e84263d55307 1096 iwr.u.data.pointer = para;
AnnaBridge 167:e84263d55307 1097 iwr.u.data.length = (4)* 2 + cmd_len;// 2 input
AnnaBridge 167:e84263d55307 1098 if (iw_ioctl(ifname, SIOCDEVPRIVATE, &iwr) < 0) {
Kojto 169:e3b6fe271b81 1099 WIFI_UTIL_MSG("\n\rwext_update_custom_ie():ioctl[SIOCDEVPRIVATE] error");
AnnaBridge 167:e84263d55307 1100 ret = -1;
AnnaBridge 167:e84263d55307 1101 }
AnnaBridge 167:e84263d55307 1102 rtw_free(para);
AnnaBridge 167:e84263d55307 1103
AnnaBridge 167:e84263d55307 1104 return ret;
AnnaBridge 167:e84263d55307 1105
AnnaBridge 167:e84263d55307 1106 }
AnnaBridge 167:e84263d55307 1107
AnnaBridge 167:e84263d55307 1108 int wext_del_custom_ie(const char *ifname)
AnnaBridge 167:e84263d55307 1109 {
AnnaBridge 167:e84263d55307 1110 struct iwreq iwr;
AnnaBridge 167:e84263d55307 1111 int ret = 0;
AnnaBridge 167:e84263d55307 1112 __u8 *para = NULL;
AnnaBridge 167:e84263d55307 1113 int cmd_len = 0;
AnnaBridge 167:e84263d55307 1114
AnnaBridge 167:e84263d55307 1115 memset(&iwr, 0, sizeof(iwr));
AnnaBridge 167:e84263d55307 1116 cmd_len = sizeof("DelIE");
AnnaBridge 167:e84263d55307 1117 para = rtw_malloc(cmd_len);//size:addr len+cmd_len
AnnaBridge 167:e84263d55307 1118 //Cmd
AnnaBridge 167:e84263d55307 1119 snprintf(para, cmd_len, "DelIE");
AnnaBridge 167:e84263d55307 1120
AnnaBridge 167:e84263d55307 1121 iwr.u.data.pointer = para;
AnnaBridge 167:e84263d55307 1122 iwr.u.data.length = cmd_len;
AnnaBridge 167:e84263d55307 1123 if (iw_ioctl(ifname, SIOCDEVPRIVATE, &iwr) < 0) {
Kojto 169:e3b6fe271b81 1124 WIFI_UTIL_MSG("\n\rwext_del_custom_ie():ioctl[SIOCDEVPRIVATE] error");
AnnaBridge 167:e84263d55307 1125 ret = -1;
AnnaBridge 167:e84263d55307 1126 }
AnnaBridge 167:e84263d55307 1127 rtw_free(para);
AnnaBridge 167:e84263d55307 1128
AnnaBridge 167:e84263d55307 1129 return ret;
AnnaBridge 167:e84263d55307 1130
AnnaBridge 167:e84263d55307 1131
AnnaBridge 167:e84263d55307 1132 }
AnnaBridge 167:e84263d55307 1133
AnnaBridge 167:e84263d55307 1134 #endif
AnnaBridge 167:e84263d55307 1135
AnnaBridge 167:e84263d55307 1136 #ifdef CONFIG_AP_MODE
AnnaBridge 167:e84263d55307 1137 int wext_enable_forwarding(const char *ifname)
AnnaBridge 167:e84263d55307 1138 {
AnnaBridge 167:e84263d55307 1139 struct iwreq iwr;
AnnaBridge 167:e84263d55307 1140 int ret = 0;
AnnaBridge 167:e84263d55307 1141 __u8 *para = NULL;
AnnaBridge 167:e84263d55307 1142 int cmd_len = 0;
AnnaBridge 167:e84263d55307 1143
AnnaBridge 167:e84263d55307 1144 memset(&iwr, 0, sizeof(iwr));
AnnaBridge 167:e84263d55307 1145 cmd_len = sizeof("forwarding_set");
AnnaBridge 167:e84263d55307 1146 para = rtw_malloc(cmd_len + 1);
AnnaBridge 167:e84263d55307 1147 if(para == NULL) return -1;
AnnaBridge 167:e84263d55307 1148
AnnaBridge 167:e84263d55307 1149 // forwarding_set 1
AnnaBridge 167:e84263d55307 1150 snprintf((char *) para, cmd_len, "forwarding_set");
AnnaBridge 167:e84263d55307 1151 *(para + cmd_len) = '1';
AnnaBridge 167:e84263d55307 1152
AnnaBridge 167:e84263d55307 1153 iwr.u.essid.pointer = para;
AnnaBridge 167:e84263d55307 1154 iwr.u.essid.length = cmd_len + 1;
AnnaBridge 167:e84263d55307 1155
AnnaBridge 167:e84263d55307 1156 if (iw_ioctl(ifname, SIOCDEVPRIVATE, &iwr) < 0) {
Kojto 169:e3b6fe271b81 1157 WIFI_UTIL_MSG("\n\rwext_enable_forwarding(): ioctl[SIOCDEVPRIVATE] error");
AnnaBridge 167:e84263d55307 1158 ret = -1;
AnnaBridge 167:e84263d55307 1159 }
AnnaBridge 167:e84263d55307 1160
AnnaBridge 167:e84263d55307 1161 rtw_free(para);
AnnaBridge 167:e84263d55307 1162 return ret;
AnnaBridge 167:e84263d55307 1163 }
AnnaBridge 167:e84263d55307 1164
AnnaBridge 167:e84263d55307 1165 int wext_disable_forwarding(const char *ifname)
AnnaBridge 167:e84263d55307 1166 {
AnnaBridge 167:e84263d55307 1167 struct iwreq iwr;
AnnaBridge 167:e84263d55307 1168 int ret = 0;
AnnaBridge 167:e84263d55307 1169 __u8 *para = NULL;
AnnaBridge 167:e84263d55307 1170 int cmd_len = 0;
AnnaBridge 167:e84263d55307 1171
AnnaBridge 167:e84263d55307 1172 memset(&iwr, 0, sizeof(iwr));
AnnaBridge 167:e84263d55307 1173 cmd_len = sizeof("forwarding_set");
AnnaBridge 167:e84263d55307 1174 para = rtw_malloc(cmd_len + 1);
AnnaBridge 167:e84263d55307 1175 if(para == NULL) return -1;
AnnaBridge 167:e84263d55307 1176
AnnaBridge 167:e84263d55307 1177 // forwarding_set 0
AnnaBridge 167:e84263d55307 1178 snprintf((char *) para, cmd_len, "forwarding_set");
AnnaBridge 167:e84263d55307 1179 *(para + cmd_len) = '0';
AnnaBridge 167:e84263d55307 1180
AnnaBridge 167:e84263d55307 1181 iwr.u.essid.pointer = para;
AnnaBridge 167:e84263d55307 1182 iwr.u.essid.length = cmd_len + 1;
AnnaBridge 167:e84263d55307 1183
AnnaBridge 167:e84263d55307 1184 if (iw_ioctl(ifname, SIOCDEVPRIVATE, &iwr) < 0) {
Kojto 169:e3b6fe271b81 1185 WIFI_UTIL_MSG("\n\rwext_disable_forwarding(): ioctl[SIOCDEVPRIVATE] error");
AnnaBridge 167:e84263d55307 1186 ret = -1;
AnnaBridge 167:e84263d55307 1187 }
AnnaBridge 167:e84263d55307 1188
AnnaBridge 167:e84263d55307 1189 rtw_free(para);
AnnaBridge 167:e84263d55307 1190 return ret;
AnnaBridge 167:e84263d55307 1191
AnnaBridge 167:e84263d55307 1192 }
AnnaBridge 167:e84263d55307 1193 #endif
AnnaBridge 167:e84263d55307 1194
AnnaBridge 167:e84263d55307 1195 #ifdef CONFIG_CONCURRENT_MODE
AnnaBridge 167:e84263d55307 1196 int wext_set_ch_deauth(const char *ifname, __u8 enable)
AnnaBridge 167:e84263d55307 1197 {
AnnaBridge 167:e84263d55307 1198 int ret = 0;
AnnaBridge 167:e84263d55307 1199 char * buf = (char *)rtw_zmalloc(16);
AnnaBridge 167:e84263d55307 1200 if(buf == NULL) return -1;
AnnaBridge 167:e84263d55307 1201
AnnaBridge 167:e84263d55307 1202 snprintf(buf, 16, "SetChDeauth %d", enable);
AnnaBridge 167:e84263d55307 1203 ret = wext_private_command(ifname, buf, 0);
AnnaBridge 167:e84263d55307 1204
AnnaBridge 167:e84263d55307 1205 rtw_free(buf);
AnnaBridge 167:e84263d55307 1206 return ret;
AnnaBridge 167:e84263d55307 1207 }
AnnaBridge 167:e84263d55307 1208 #endif
AnnaBridge 167:e84263d55307 1209
AnnaBridge 167:e84263d55307 1210 int wext_set_adaptivity(rtw_adaptivity_mode_t adaptivity_mode)
AnnaBridge 167:e84263d55307 1211 {
AnnaBridge 167:e84263d55307 1212 extern u8 rtw_adaptivity_en;
AnnaBridge 167:e84263d55307 1213 extern u8 rtw_adaptivity_mode;
AnnaBridge 167:e84263d55307 1214
AnnaBridge 167:e84263d55307 1215 switch(adaptivity_mode){
AnnaBridge 167:e84263d55307 1216 case RTW_ADAPTIVITY_NORMAL:
AnnaBridge 167:e84263d55307 1217 rtw_adaptivity_en = 1; // enable adaptivity
AnnaBridge 167:e84263d55307 1218 rtw_adaptivity_mode = RTW_ADAPTIVITY_MODE_NORMAL;
AnnaBridge 167:e84263d55307 1219 break;
AnnaBridge 167:e84263d55307 1220 case RTW_ADAPTIVITY_CARRIER_SENSE:
AnnaBridge 167:e84263d55307 1221 rtw_adaptivity_en = 1; // enable adaptivity
AnnaBridge 167:e84263d55307 1222 rtw_adaptivity_mode = RTW_ADAPTIVITY_MODE_CARRIER_SENSE;
AnnaBridge 167:e84263d55307 1223 break;
AnnaBridge 167:e84263d55307 1224 case RTW_ADAPTIVITY_DISABLE:
AnnaBridge 167:e84263d55307 1225 default:
AnnaBridge 167:e84263d55307 1226 rtw_adaptivity_en = 0; //disable adaptivity
AnnaBridge 167:e84263d55307 1227 break;
AnnaBridge 167:e84263d55307 1228 }
AnnaBridge 167:e84263d55307 1229 return 0;
AnnaBridge 167:e84263d55307 1230 }
AnnaBridge 167:e84263d55307 1231
AnnaBridge 167:e84263d55307 1232 int wext_set_adaptivity_th_l2h_ini(__u8 l2h_threshold)
AnnaBridge 167:e84263d55307 1233 {
AnnaBridge 167:e84263d55307 1234 extern s8 rtw_adaptivity_th_l2h_ini;
AnnaBridge 167:e84263d55307 1235 rtw_adaptivity_th_l2h_ini = (__s8)l2h_threshold;
AnnaBridge 167:e84263d55307 1236 return 0;
AnnaBridge 167:e84263d55307 1237 }
AnnaBridge 167:e84263d55307 1238
AnnaBridge 167:e84263d55307 1239 int wext_get_auto_chl(const char *ifname, unsigned char *channel_set, unsigned char channel_num)
AnnaBridge 167:e84263d55307 1240 {
AnnaBridge 167:e84263d55307 1241 int ret = -1;
AnnaBridge 167:e84263d55307 1242 int channel = 0;
AnnaBridge 167:e84263d55307 1243 wext_disable_powersave(ifname);
AnnaBridge 167:e84263d55307 1244 if((channel = rltk_get_auto_chl(ifname,channel_set,channel_num)) != 0 )
AnnaBridge 167:e84263d55307 1245 ret = channel;
AnnaBridge 167:e84263d55307 1246 wext_enable_powersave(ifname, 1, 1);
AnnaBridge 167:e84263d55307 1247 return ret;
AnnaBridge 167:e84263d55307 1248 }
AnnaBridge 167:e84263d55307 1249
AnnaBridge 167:e84263d55307 1250 int wext_set_sta_num(unsigned char ap_sta_num)
AnnaBridge 167:e84263d55307 1251 {
AnnaBridge 167:e84263d55307 1252 return rltk_set_sta_num(ap_sta_num);
AnnaBridge 167:e84263d55307 1253 }
AnnaBridge 167:e84263d55307 1254
AnnaBridge 167:e84263d55307 1255 int wext_del_station(const char *ifname, unsigned char* hwaddr)
AnnaBridge 167:e84263d55307 1256 {
AnnaBridge 167:e84263d55307 1257 return rltk_del_station(ifname, hwaddr);
AnnaBridge 167:e84263d55307 1258 }
AnnaBridge 167:e84263d55307 1259
AnnaBridge 167:e84263d55307 1260 extern struct list_head *mf_list_head;
AnnaBridge 167:e84263d55307 1261 int wext_init_mac_filter(void)
AnnaBridge 167:e84263d55307 1262 {
AnnaBridge 167:e84263d55307 1263 if (mf_list_head != NULL){
AnnaBridge 167:e84263d55307 1264 return -1;
AnnaBridge 167:e84263d55307 1265 }
AnnaBridge 167:e84263d55307 1266
AnnaBridge 167:e84263d55307 1267 mf_list_head = (struct list_head *)rtw_malloc(sizeof(struct list_head));
AnnaBridge 167:e84263d55307 1268 if(mf_list_head == NULL){
Kojto 169:e3b6fe271b81 1269 WIFI_UTIL_MSG("\n\r[ERROR] %s : can't allocate mf_list_head",__func__);
AnnaBridge 167:e84263d55307 1270 return -1;
AnnaBridge 167:e84263d55307 1271 }
AnnaBridge 167:e84263d55307 1272
AnnaBridge 167:e84263d55307 1273 INIT_LIST_HEAD(mf_list_head);
AnnaBridge 167:e84263d55307 1274
AnnaBridge 167:e84263d55307 1275 return 0;
AnnaBridge 167:e84263d55307 1276 }
AnnaBridge 167:e84263d55307 1277
AnnaBridge 167:e84263d55307 1278 int wext_deinit_mac_filter(void)
AnnaBridge 167:e84263d55307 1279 {
AnnaBridge 167:e84263d55307 1280 if (mf_list_head == NULL){
AnnaBridge 167:e84263d55307 1281 return -1;
AnnaBridge 167:e84263d55307 1282 }
AnnaBridge 167:e84263d55307 1283 struct list_head *iterator;
AnnaBridge 167:e84263d55307 1284 rtw_mac_filter_list_t *item;
AnnaBridge 167:e84263d55307 1285 list_for_each(iterator, mf_list_head) {
AnnaBridge 167:e84263d55307 1286 item = list_entry(iterator, rtw_mac_filter_list_t, node);
AnnaBridge 167:e84263d55307 1287 list_del(iterator);
AnnaBridge 167:e84263d55307 1288 rtw_free(item);
AnnaBridge 167:e84263d55307 1289 item = NULL;
AnnaBridge 167:e84263d55307 1290 iterator = mf_list_head;
AnnaBridge 167:e84263d55307 1291 }
AnnaBridge 167:e84263d55307 1292
AnnaBridge 167:e84263d55307 1293 rtw_free(mf_list_head);
AnnaBridge 167:e84263d55307 1294 mf_list_head = NULL;
AnnaBridge 167:e84263d55307 1295 return 0;
AnnaBridge 167:e84263d55307 1296 }
AnnaBridge 167:e84263d55307 1297
AnnaBridge 167:e84263d55307 1298 int wext_add_mac_filter(unsigned char* hwaddr)
AnnaBridge 167:e84263d55307 1299 {
AnnaBridge 167:e84263d55307 1300 if(mf_list_head == NULL){
AnnaBridge 167:e84263d55307 1301 return -1;
AnnaBridge 167:e84263d55307 1302 }
AnnaBridge 167:e84263d55307 1303
AnnaBridge 167:e84263d55307 1304 rtw_mac_filter_list_t *mf_list_new;
AnnaBridge 167:e84263d55307 1305 mf_list_new = (rtw_mac_filter_list_t *)rtw_malloc(sizeof(rtw_mac_filter_list_t));
AnnaBridge 167:e84263d55307 1306 if(mf_list_new == NULL){
Kojto 169:e3b6fe271b81 1307 WIFI_UTIL_MSG("\n\r[ERROR] %s : can't allocate mf_list_new",__func__);
AnnaBridge 167:e84263d55307 1308 return -1;
AnnaBridge 167:e84263d55307 1309 }
AnnaBridge 167:e84263d55307 1310 memcpy(mf_list_new->mac_addr,hwaddr,6);
AnnaBridge 167:e84263d55307 1311 list_add(&(mf_list_new->node), mf_list_head);
AnnaBridge 167:e84263d55307 1312
AnnaBridge 167:e84263d55307 1313 return 0;
AnnaBridge 167:e84263d55307 1314 }
AnnaBridge 167:e84263d55307 1315
AnnaBridge 167:e84263d55307 1316 int wext_del_mac_filter(unsigned char* hwaddr)
AnnaBridge 167:e84263d55307 1317 {
AnnaBridge 167:e84263d55307 1318 if (mf_list_head == NULL){
AnnaBridge 167:e84263d55307 1319 return -1;
AnnaBridge 167:e84263d55307 1320 }
AnnaBridge 167:e84263d55307 1321
AnnaBridge 167:e84263d55307 1322 struct list_head *iterator;
AnnaBridge 167:e84263d55307 1323 rtw_mac_filter_list_t *item;
AnnaBridge 167:e84263d55307 1324 list_for_each(iterator, mf_list_head) {
AnnaBridge 167:e84263d55307 1325 item = list_entry(iterator, rtw_mac_filter_list_t, node);
AnnaBridge 167:e84263d55307 1326 if (memcmp(item->mac_addr, hwaddr, 6) == 0) {
AnnaBridge 167:e84263d55307 1327 list_del(iterator);
AnnaBridge 167:e84263d55307 1328 rtw_free(item);
AnnaBridge 167:e84263d55307 1329 item = NULL;
AnnaBridge 167:e84263d55307 1330 return 0;
AnnaBridge 167:e84263d55307 1331 }
AnnaBridge 167:e84263d55307 1332 }
AnnaBridge 167:e84263d55307 1333 return -1;
AnnaBridge 167:e84263d55307 1334 }
AnnaBridge 167:e84263d55307 1335
AnnaBridge 167:e84263d55307 1336 extern void rtw_set_indicate_mgnt(int enable);
AnnaBridge 167:e84263d55307 1337 void wext_set_indicate_mgnt(int enable)
AnnaBridge 167:e84263d55307 1338 {
AnnaBridge 167:e84263d55307 1339 rtw_set_indicate_mgnt(enable);
AnnaBridge 167:e84263d55307 1340 return;
AnnaBridge 167:e84263d55307 1341 }
AnnaBridge 167:e84263d55307 1342