2
2
* Linux Wireless Extensions support
4
* Copyright (C) 2010, Broadcom Corporation
7
* THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO WARRANTIES OF ANY
8
* KIND, EXPRESS OR IMPLIED, BY STATUTE, COMMUNICATION OR OTHERWISE. BROADCOM
9
* SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS
10
* FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS SOFTWARE.
4
* Copyright (C) 2011, Broadcom Corporation. All Rights Reserved.
6
* Permission to use, copy, modify, and/or distribute this software for any
7
* purpose with or without fee is hereby granted, provided that the above
8
* copyright notice and this permission notice appear in all copies.
10
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
13
* SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
15
* OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
16
* CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
12
* $Id: wl_iw.c,v 1.133.2.1.28.9 2011-01-26 22:23:18 Exp $
18
* $Id: wl_iw.c 277746 2011-08-16 18:18:43Z $
15
21
#if defined(USE_IW)
19
24
#include <typedefs.h>
494
499
dwrq->length = sizeof(struct iw_range);
495
memset(range, 0, sizeof(range));
500
memset(range, 0, sizeof(*range));
497
502
range->min_nwid = range->max_nwid = 0;
539
544
dev_wlc_intvar_get(dev, "nmode", &nmode);
540
545
dev_wlc_ioctl(dev, WLC_GET_PHYTYPE, &phytype, sizeof(phytype));
542
if (nmode == 1 && ((phytype == WLC_PHY_TYPE_SSN) || (phytype == WLC_PHY_TYPE_LCN))) {
547
if (nmode == 1 && ((phytype == WLC_PHY_TYPE_SSN) || (phytype == WLC_PHY_TYPE_LCN) ||
548
(phytype == WLC_PHY_TYPE_LCN40))) {
543
549
dev_wlc_intvar_get(dev, "mimo_bw_cap", &bw_cap);
544
550
dev_wlc_intvar_get(dev, "sgi_tx", &sgi_tx);
545
551
dev_wlc_ioctl(dev, WLC_GET_CHANNEL, &ci, sizeof(channel_info_t));
1011
1017
struct iw_event iwe;
1012
1018
wl_bss_info_t *bi = NULL;
1013
1019
int error, i, j;
1014
char *event = extra, *end = extra + IW_SCAN_MAX_DATA, *value;
1020
char *event = extra, *end = extra + dwrq->length, *value;
1015
1021
uint buflen = dwrq->length;
1017
1023
WL_TRACE(("%s: SIOCGIWSCAN\n", dev->name));
1868
1876
struct iw_pmksa *iwpmksa;
1870
1878
char eabuf[ETHER_ADDR_STR_LEN];
1871
1880
WL_TRACE(("%s: SIOCSIWPMKSA\n", dev->name));
1872
1881
iwpmksa = (struct iw_pmksa *)extra;
1873
1882
bzero((char *)eabuf, ETHER_ADDR_STR_LEN);
2010
2019
if (cipher_combined & IW_AUTH_CIPHER_CCMP)
2011
2020
val |= AES_ENABLED;
2022
if (iw->privacy_invoked && !val) {
2023
WL_WSEC(("%s: %s: 'Privacy invoked' TRUE but clearing wsec, assuming "
2024
"we're a WPS enrollee\n", dev->name, __FUNCTION__));
2025
if ((error = dev_wlc_intvar_set(dev, "is_WPS_enrollee", TRUE))) {
2026
WL_WSEC(("Failed to set iovar is_WPS_enrollee\n"));
2030
if ((error = dev_wlc_intvar_set(dev, "is_WPS_enrollee", FALSE))) {
2031
WL_WSEC(("Failed to clear iovar is_WPS_enrollee\n"));
2013
2036
if ((error = dev_wlc_intvar_set(dev, "wsec", val)))
2082
case IW_AUTH_PRIVACY_INVOKED:
2083
WL_TRACE(("%s: IW_AUTH_PRIVACY_INVOKED\n", __FUNCTION__));
2105
case IW_AUTH_PRIVACY_INVOKED: {
2108
if (paramval == 0) {
2109
iw->privacy_invoked = FALSE;
2110
if ((error = dev_wlc_intvar_set(dev, "is_WPS_enrollee", FALSE))) {
2111
WL_WSEC(("Failed to clear iovar is_WPS_enrollee\n"));
2115
iw->privacy_invoked = TRUE;
2116
if ((error = dev_wlc_intvar_get(dev, "wsec", &wsec)))
2119
if (!WSEC_ENABLED(wsec)) {
2121
if ((error = dev_wlc_intvar_set(dev, "is_WPS_enrollee", TRUE))) {
2122
WL_WSEC(("Failed to set iovar is_WPS_enrollee\n"));
2126
if ((error = dev_wlc_intvar_set(dev, "is_WPS_enrollee", FALSE))) {
2127
WL_WSEC(("Failed to clear iovar is_WPS_enrollee\n"));
2170
2220
paramval = FALSE;
2172
2223
#if WIRELESS_EXT > 17
2173
2225
case IW_AUTH_ROAMING_CONTROL:
2174
2226
WL_ERROR(("%s: IW_AUTH_ROAMING_CONTROL\n", __FUNCTION__));
2177
2230
case IW_AUTH_PRIVACY_INVOKED:
2178
WL_ERROR(("%s: IW_AUTH_PRIVACY_INVOKED\n", __FUNCTION__));
2231
paramval = iw->privacy_invoked;
2182
2236
vwrq->value = paramval;
2315
2369
struct iw_request_info info;
2316
2370
iw_handler handler;
2317
2371
char *extra = NULL;
2318
int token_size = 1, max_tokens = 0, ret = 0;
2372
size_t token_size = 1;
2373
int max_tokens = 0, ret = 0;
2320
2375
if (cmd < SIOCIWFIRST ||
2321
2376
IW_IOCTL_IDX(cmd) >= ARRAYSIZE(wl_iw_handler) ||