mbed library sources. Supersedes mbed-src.

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

Committer:
AnnaBridge
Date:
Wed Jun 21 17:46:44 2017 +0100
Revision:
167:e84263d55307
Child:
169:e3b6fe271b81
This updates the lib to the mbed lib v 145

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