~computersforpeace/ubuntu/utopic/bcmwl/fix-for-1358966

« back to all changes in this revision

Viewing changes to src/src/wl/sys/wl_iw.c

  • Committer: Package Import Robot
  • Author(s): Alberto Milone
  • Date: 2012-12-11 17:06:22 UTC
  • mfrom: (2.1.6)
  • Revision ID: package-import@ubuntu.com-20121211170622-7bd9yp2wm1plhhu1
Tags: 6.20.155.1+bdcom-0ubuntu1
* New upstream release (LP: #923809):
  - Added 43142 support.
  - Added 4331 support.
* debian/control:
  - depend on the different flavours of the linux-headers.
* Refresh 0002-Makefile.patch and 0001-MODULE_LICENSE.patch.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
/*
2
2
 * Linux Wireless Extensions support
3
3
 *
4
 
 * Copyright (C) 2010, Broadcom Corporation
5
 
 * All Rights Reserved.
6
 
 * 
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.
 
5
 * 
 
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.
 
9
 * 
 
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.
11
17
 *
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 $
13
19
 */
14
20
 
15
21
#if defined(USE_IW)
16
 
 
17
22
#define LINUX_PORT
18
23
 
19
24
#include <typedefs.h>
492
497
                return -EINVAL;
493
498
 
494
499
        dwrq->length = sizeof(struct iw_range);
495
 
        memset(range, 0, sizeof(range));
 
500
        memset(range, 0, sizeof(*range));
496
501
 
497
502
        range->min_nwid = range->max_nwid = 0;
498
503
 
539
544
        dev_wlc_intvar_get(dev, "nmode", &nmode);
540
545
        dev_wlc_ioctl(dev, WLC_GET_PHYTYPE, &phytype, sizeof(phytype));
541
546
 
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;
1016
1022
 
1017
1023
        WL_TRACE(("%s: SIOCGIWSCAN\n", dev->name));
1797
1803
                        dev_wlc_ioctl(dev, WLC_SET_KEY, &key, sizeof(key));
1798
1804
                }
1799
1805
        }
 
1806
 
1800
1807
        else {
1801
1808
                if (iwe->key_len > sizeof(key.data))
1802
1809
                        return -EINVAL;
1852
1859
        }
1853
1860
        return 0;
1854
1861
}
 
1862
 
1855
1863
#if WIRELESS_EXT > 17
1856
1864
struct {
1857
1865
        pmkid_list_t pmkids;
1868
1876
        struct iw_pmksa *iwpmksa;
1869
1877
        uint i;
1870
1878
        char eabuf[ETHER_ADDR_STR_LEN];
 
1879
 
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;
2012
2021
 
 
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"));
 
2027
                                return error;
 
2028
                        }
 
2029
                } else if (val) {
 
2030
                        if ((error = dev_wlc_intvar_set(dev, "is_WPS_enrollee", FALSE))) {
 
2031
                                WL_WSEC(("Failed to clear iovar is_WPS_enrollee\n"));
 
2032
                                return error;
 
2033
                        }
 
2034
                }
 
2035
 
2013
2036
                if ((error = dev_wlc_intvar_set(dev, "wsec", val)))
2014
2037
                        return error;
2015
2038
                break;
2079
2102
 
2080
2103
                break;
2081
2104
 
2082
 
        case IW_AUTH_PRIVACY_INVOKED:
2083
 
                WL_TRACE(("%s: IW_AUTH_PRIVACY_INVOKED\n", __FUNCTION__));
 
2105
        case IW_AUTH_PRIVACY_INVOKED: {
 
2106
                int wsec;
 
2107
 
 
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"));
 
2112
                                return error;
 
2113
                        }
 
2114
                } else {
 
2115
                        iw->privacy_invoked = TRUE;
 
2116
                        if ((error = dev_wlc_intvar_get(dev, "wsec", &wsec)))
 
2117
                                return error;
 
2118
 
 
2119
                        if (!WSEC_ENABLED(wsec)) {
 
2120
 
 
2121
                                if ((error = dev_wlc_intvar_set(dev, "is_WPS_enrollee", TRUE))) {
 
2122
                                        WL_WSEC(("Failed to set iovar is_WPS_enrollee\n"));
 
2123
                                        return error;
 
2124
                                }
 
2125
                        } else {
 
2126
                                if ((error = dev_wlc_intvar_set(dev, "is_WPS_enrollee", FALSE))) {
 
2127
                                        WL_WSEC(("Failed to clear iovar is_WPS_enrollee\n"));
 
2128
                                        return error;
 
2129
                                }
 
2130
                        }
 
2131
                }
2084
2132
                break;
 
2133
        }
 
2134
 
2085
2135
#endif 
2086
2136
 
2087
2137
        default:
2169
2219
                else
2170
2220
                        paramval = FALSE;
2171
2221
                break;
 
2222
 
2172
2223
#if WIRELESS_EXT > 17
 
2224
 
2173
2225
        case IW_AUTH_ROAMING_CONTROL:
2174
2226
                WL_ERROR(("%s: IW_AUTH_ROAMING_CONTROL\n", __FUNCTION__));
2175
2227
 
2176
2228
                break;
 
2229
 
2177
2230
        case IW_AUTH_PRIVACY_INVOKED:
2178
 
                WL_ERROR(("%s: IW_AUTH_PRIVACY_INVOKED\n", __FUNCTION__));
 
2231
                paramval = iw->privacy_invoked;
2179
2232
                break;
 
2233
 
2180
2234
#endif 
2181
2235
        }
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;
2319
2374
 
2320
2375
        if (cmd < SIOCIWFIRST ||
2321
2376
                IW_IOCTL_IDX(cmd) >= ARRAYSIZE(wl_iw_handler) ||
2364
2419
                token_size = sizeof(struct sockaddr) + sizeof(struct iw_quality);
2365
2420
                max_tokens = IW_MAX_SPY;
2366
2421
                break;
2367
 
 
 
2422
        default:
 
2423
                break;
2368
2424
        }
2369
2425
 
2370
2426
        if (max_tokens && wrq->u.data.pointer) {
2525
2581
                bzero(wrqu.addr.sa_data, ETHER_ADDR_LEN);
2526
2582
                bzero(&extra, ETHER_ADDR_LEN);
2527
2583
                break;
 
2584
 
2528
2585
        case WLC_E_LINK:
2529
2586
        case WLC_E_NDIS_LINK:
2530
2587
                cmd = SIOCGIWAP;
2600
2657
#if WIRELESS_EXT > 14
2601
2658
                cmd = SIOCGIWSCAN;
2602
2659
#endif
2603
 
        break;
 
2660
                break;
2604
2661
 
2605
2662
        default:
2606
2663