rndis_wlan.c (101816B)
1// SPDX-License-Identifier: GPL-2.0-or-later 2/* 3 * Driver for RNDIS based wireless USB devices. 4 * 5 * Copyright (C) 2007 by Bjorge Dijkstra <bjd@jooz.net> 6 * Copyright (C) 2008-2009 by Jussi Kivilinna <jussi.kivilinna@iki.fi> 7 * 8 * Portions of this file are based on NDISwrapper project, 9 * Copyright (C) 2003-2005 Pontus Fuchs, Giridhar Pemmasani 10 * http://ndiswrapper.sourceforge.net/ 11 */ 12 13// #define DEBUG // error path messages, extra info 14// #define VERBOSE // more; success messages 15 16#include <linux/module.h> 17#include <linux/netdevice.h> 18#include <linux/etherdevice.h> 19#include <linux/ethtool.h> 20#include <linux/workqueue.h> 21#include <linux/mutex.h> 22#include <linux/mii.h> 23#include <linux/usb.h> 24#include <linux/usb/cdc.h> 25#include <linux/ieee80211.h> 26#include <linux/if_arp.h> 27#include <linux/ctype.h> 28#include <linux/spinlock.h> 29#include <linux/slab.h> 30#include <net/cfg80211.h> 31#include <linux/usb/usbnet.h> 32#include <linux/usb/rndis_host.h> 33 34 35/* NOTE: All these are settings for Broadcom chipset */ 36static char modparam_country[4] = "EU"; 37module_param_string(country, modparam_country, 4, 0444); 38MODULE_PARM_DESC(country, "Country code (ISO 3166-1 alpha-2), default: EU"); 39 40static int modparam_frameburst = 1; 41module_param_named(frameburst, modparam_frameburst, int, 0444); 42MODULE_PARM_DESC(frameburst, "enable frame bursting (default: on)"); 43 44static int modparam_afterburner = 0; 45module_param_named(afterburner, modparam_afterburner, int, 0444); 46MODULE_PARM_DESC(afterburner, 47 "enable afterburner aka '125 High Speed Mode' (default: off)"); 48 49static int modparam_power_save = 0; 50module_param_named(power_save, modparam_power_save, int, 0444); 51MODULE_PARM_DESC(power_save, 52 "set power save mode: 0=off, 1=on, 2=fast (default: off)"); 53 54static int modparam_power_output = 3; 55module_param_named(power_output, modparam_power_output, int, 0444); 56MODULE_PARM_DESC(power_output, 57 "set power output: 0=25%, 1=50%, 2=75%, 3=100% (default: 100%)"); 58 59static int modparam_roamtrigger = -70; 60module_param_named(roamtrigger, modparam_roamtrigger, int, 0444); 61MODULE_PARM_DESC(roamtrigger, 62 "set roaming dBm trigger: -80=optimize for distance, " 63 "-60=bandwidth (default: -70)"); 64 65static int modparam_roamdelta = 1; 66module_param_named(roamdelta, modparam_roamdelta, int, 0444); 67MODULE_PARM_DESC(roamdelta, 68 "set roaming tendency: 0=aggressive, 1=moderate, " 69 "2=conservative (default: moderate)"); 70 71static int modparam_workaround_interval; 72module_param_named(workaround_interval, modparam_workaround_interval, 73 int, 0444); 74MODULE_PARM_DESC(workaround_interval, 75 "set stall workaround interval in msecs (0=disabled) (default: 0)"); 76 77/* Typical noise/maximum signal level values taken from ndiswrapper iw_ndis.h */ 78#define WL_NOISE -96 /* typical noise level in dBm */ 79#define WL_SIGMAX -32 /* typical maximum signal level in dBm */ 80 81 82/* Assume that Broadcom 4320 (only chipset at time of writing known to be 83 * based on wireless rndis) has default txpower of 13dBm. 84 * This value is from Linksys WUSB54GSC User Guide, Appendix F: Specifications. 85 * 100% : 20 mW ~ 13dBm 86 * 75% : 15 mW ~ 12dBm 87 * 50% : 10 mW ~ 10dBm 88 * 25% : 5 mW ~ 7dBm 89 */ 90#define BCM4320_DEFAULT_TXPOWER_DBM_100 13 91#define BCM4320_DEFAULT_TXPOWER_DBM_75 12 92#define BCM4320_DEFAULT_TXPOWER_DBM_50 10 93#define BCM4320_DEFAULT_TXPOWER_DBM_25 7 94 95/* Known device types */ 96#define RNDIS_UNKNOWN 0 97#define RNDIS_BCM4320A 1 98#define RNDIS_BCM4320B 2 99 100 101/* NDIS data structures. Taken from wpa_supplicant driver_ndis.c 102 * slightly modified for datatype endianess, etc 103 */ 104#define NDIS_802_11_LENGTH_SSID 32 105#define NDIS_802_11_LENGTH_RATES 8 106#define NDIS_802_11_LENGTH_RATES_EX 16 107 108enum ndis_80211_net_type { 109 NDIS_80211_TYPE_FREQ_HOP, 110 NDIS_80211_TYPE_DIRECT_SEQ, 111 NDIS_80211_TYPE_OFDM_A, 112 NDIS_80211_TYPE_OFDM_G 113}; 114 115enum ndis_80211_net_infra { 116 NDIS_80211_INFRA_ADHOC, 117 NDIS_80211_INFRA_INFRA, 118 NDIS_80211_INFRA_AUTO_UNKNOWN 119}; 120 121enum ndis_80211_auth_mode { 122 NDIS_80211_AUTH_OPEN, 123 NDIS_80211_AUTH_SHARED, 124 NDIS_80211_AUTH_AUTO_SWITCH, 125 NDIS_80211_AUTH_WPA, 126 NDIS_80211_AUTH_WPA_PSK, 127 NDIS_80211_AUTH_WPA_NONE, 128 NDIS_80211_AUTH_WPA2, 129 NDIS_80211_AUTH_WPA2_PSK 130}; 131 132enum ndis_80211_encr_status { 133 NDIS_80211_ENCR_WEP_ENABLED, 134 NDIS_80211_ENCR_DISABLED, 135 NDIS_80211_ENCR_WEP_KEY_ABSENT, 136 NDIS_80211_ENCR_NOT_SUPPORTED, 137 NDIS_80211_ENCR_TKIP_ENABLED, 138 NDIS_80211_ENCR_TKIP_KEY_ABSENT, 139 NDIS_80211_ENCR_CCMP_ENABLED, 140 NDIS_80211_ENCR_CCMP_KEY_ABSENT 141}; 142 143enum ndis_80211_priv_filter { 144 NDIS_80211_PRIV_ACCEPT_ALL, 145 NDIS_80211_PRIV_8021X_WEP 146}; 147 148enum ndis_80211_status_type { 149 NDIS_80211_STATUSTYPE_AUTHENTICATION, 150 NDIS_80211_STATUSTYPE_MEDIASTREAMMODE, 151 NDIS_80211_STATUSTYPE_PMKID_CANDIDATELIST, 152 NDIS_80211_STATUSTYPE_RADIOSTATE, 153}; 154 155enum ndis_80211_media_stream_mode { 156 NDIS_80211_MEDIA_STREAM_OFF, 157 NDIS_80211_MEDIA_STREAM_ON 158}; 159 160enum ndis_80211_radio_status { 161 NDIS_80211_RADIO_STATUS_ON, 162 NDIS_80211_RADIO_STATUS_HARDWARE_OFF, 163 NDIS_80211_RADIO_STATUS_SOFTWARE_OFF, 164}; 165 166enum ndis_80211_addkey_bits { 167 NDIS_80211_ADDKEY_8021X_AUTH = cpu_to_le32(1 << 28), 168 NDIS_80211_ADDKEY_SET_INIT_RECV_SEQ = cpu_to_le32(1 << 29), 169 NDIS_80211_ADDKEY_PAIRWISE_KEY = cpu_to_le32(1 << 30), 170 NDIS_80211_ADDKEY_TRANSMIT_KEY = cpu_to_le32(1 << 31) 171}; 172 173enum ndis_80211_addwep_bits { 174 NDIS_80211_ADDWEP_PERCLIENT_KEY = cpu_to_le32(1 << 30), 175 NDIS_80211_ADDWEP_TRANSMIT_KEY = cpu_to_le32(1 << 31) 176}; 177 178enum ndis_80211_power_mode { 179 NDIS_80211_POWER_MODE_CAM, 180 NDIS_80211_POWER_MODE_MAX_PSP, 181 NDIS_80211_POWER_MODE_FAST_PSP, 182}; 183 184enum ndis_80211_pmkid_cand_list_flag_bits { 185 NDIS_80211_PMKID_CAND_PREAUTH = cpu_to_le32(1 << 0) 186}; 187 188struct ndis_80211_auth_request { 189 __le32 length; 190 u8 bssid[ETH_ALEN]; 191 u8 padding[2]; 192 __le32 flags; 193} __packed; 194 195struct ndis_80211_pmkid_candidate { 196 u8 bssid[ETH_ALEN]; 197 u8 padding[2]; 198 __le32 flags; 199} __packed; 200 201struct ndis_80211_pmkid_cand_list { 202 __le32 version; 203 __le32 num_candidates; 204 struct ndis_80211_pmkid_candidate candidate_list[]; 205} __packed; 206 207struct ndis_80211_status_indication { 208 __le32 status_type; 209 union { 210 __le32 media_stream_mode; 211 __le32 radio_status; 212 struct ndis_80211_auth_request auth_request[0]; 213 struct ndis_80211_pmkid_cand_list cand_list; 214 } u; 215} __packed; 216 217struct ndis_80211_ssid { 218 __le32 length; 219 u8 essid[NDIS_802_11_LENGTH_SSID]; 220} __packed; 221 222struct ndis_80211_conf_freq_hop { 223 __le32 length; 224 __le32 hop_pattern; 225 __le32 hop_set; 226 __le32 dwell_time; 227} __packed; 228 229struct ndis_80211_conf { 230 __le32 length; 231 __le32 beacon_period; 232 __le32 atim_window; 233 __le32 ds_config; 234 struct ndis_80211_conf_freq_hop fh_config; 235} __packed; 236 237struct ndis_80211_bssid_ex { 238 __le32 length; 239 u8 mac[ETH_ALEN]; 240 u8 padding[2]; 241 struct ndis_80211_ssid ssid; 242 __le32 privacy; 243 __le32 rssi; 244 __le32 net_type; 245 struct ndis_80211_conf config; 246 __le32 net_infra; 247 u8 rates[NDIS_802_11_LENGTH_RATES_EX]; 248 __le32 ie_length; 249 u8 ies[]; 250} __packed; 251 252struct ndis_80211_bssid_list_ex { 253 __le32 num_items; 254 struct ndis_80211_bssid_ex bssid[]; 255} __packed; 256 257struct ndis_80211_fixed_ies { 258 u8 timestamp[8]; 259 __le16 beacon_interval; 260 __le16 capabilities; 261} __packed; 262 263struct ndis_80211_wep_key { 264 __le32 size; 265 __le32 index; 266 __le32 length; 267 u8 material[32]; 268} __packed; 269 270struct ndis_80211_key { 271 __le32 size; 272 __le32 index; 273 __le32 length; 274 u8 bssid[ETH_ALEN]; 275 u8 padding[6]; 276 u8 rsc[8]; 277 u8 material[32]; 278} __packed; 279 280struct ndis_80211_remove_key { 281 __le32 size; 282 __le32 index; 283 u8 bssid[ETH_ALEN]; 284 u8 padding[2]; 285} __packed; 286 287struct ndis_config_param { 288 __le32 name_offs; 289 __le32 name_length; 290 __le32 type; 291 __le32 value_offs; 292 __le32 value_length; 293} __packed; 294 295struct ndis_80211_assoc_info { 296 __le32 length; 297 __le16 req_ies; 298 struct req_ie { 299 __le16 capa; 300 __le16 listen_interval; 301 u8 cur_ap_address[ETH_ALEN]; 302 } req_ie; 303 __le32 req_ie_length; 304 __le32 offset_req_ies; 305 __le16 resp_ies; 306 struct resp_ie { 307 __le16 capa; 308 __le16 status_code; 309 __le16 assoc_id; 310 } resp_ie; 311 __le32 resp_ie_length; 312 __le32 offset_resp_ies; 313} __packed; 314 315struct ndis_80211_capability { 316 __le32 length; 317 __le32 version; 318 __le32 num_pmkids; 319 __le32 num_auth_encr_pair; 320} __packed; 321 322struct ndis_80211_bssid_info { 323 u8 bssid[ETH_ALEN]; 324 u8 pmkid[16]; 325} __packed; 326 327struct ndis_80211_pmkid { 328 __le32 length; 329 __le32 bssid_info_count; 330 struct ndis_80211_bssid_info bssid_info[]; 331} __packed; 332 333/* 334 * private data 335 */ 336#define CAP_MODE_80211A 1 337#define CAP_MODE_80211B 2 338#define CAP_MODE_80211G 4 339#define CAP_MODE_MASK 7 340 341#define WORK_LINK_UP 0 342#define WORK_LINK_DOWN 1 343#define WORK_SET_MULTICAST_LIST 2 344 345#define RNDIS_WLAN_ALG_NONE 0 346#define RNDIS_WLAN_ALG_WEP (1<<0) 347#define RNDIS_WLAN_ALG_TKIP (1<<1) 348#define RNDIS_WLAN_ALG_CCMP (1<<2) 349 350#define RNDIS_WLAN_NUM_KEYS 4 351#define RNDIS_WLAN_KEY_MGMT_NONE 0 352#define RNDIS_WLAN_KEY_MGMT_802_1X (1<<0) 353#define RNDIS_WLAN_KEY_MGMT_PSK (1<<1) 354 355#define COMMAND_BUFFER_SIZE (CONTROL_BUFFER_SIZE + sizeof(struct rndis_set)) 356 357static const struct ieee80211_channel rndis_channels[] = { 358 { .center_freq = 2412 }, 359 { .center_freq = 2417 }, 360 { .center_freq = 2422 }, 361 { .center_freq = 2427 }, 362 { .center_freq = 2432 }, 363 { .center_freq = 2437 }, 364 { .center_freq = 2442 }, 365 { .center_freq = 2447 }, 366 { .center_freq = 2452 }, 367 { .center_freq = 2457 }, 368 { .center_freq = 2462 }, 369 { .center_freq = 2467 }, 370 { .center_freq = 2472 }, 371 { .center_freq = 2484 }, 372}; 373 374static const struct ieee80211_rate rndis_rates[] = { 375 { .bitrate = 10 }, 376 { .bitrate = 20, .flags = IEEE80211_RATE_SHORT_PREAMBLE }, 377 { .bitrate = 55, .flags = IEEE80211_RATE_SHORT_PREAMBLE }, 378 { .bitrate = 110, .flags = IEEE80211_RATE_SHORT_PREAMBLE }, 379 { .bitrate = 60 }, 380 { .bitrate = 90 }, 381 { .bitrate = 120 }, 382 { .bitrate = 180 }, 383 { .bitrate = 240 }, 384 { .bitrate = 360 }, 385 { .bitrate = 480 }, 386 { .bitrate = 540 } 387}; 388 389static const u32 rndis_cipher_suites[] = { 390 WLAN_CIPHER_SUITE_WEP40, 391 WLAN_CIPHER_SUITE_WEP104, 392 WLAN_CIPHER_SUITE_TKIP, 393 WLAN_CIPHER_SUITE_CCMP, 394}; 395 396struct rndis_wlan_encr_key { 397 int len; 398 u32 cipher; 399 u8 material[32]; 400 u8 bssid[ETH_ALEN]; 401 bool pairwise; 402 bool tx_key; 403}; 404 405/* RNDIS device private data */ 406struct rndis_wlan_private { 407 struct usbnet *usbdev; 408 409 struct wireless_dev wdev; 410 411 struct cfg80211_scan_request *scan_request; 412 413 struct workqueue_struct *workqueue; 414 struct delayed_work dev_poller_work; 415 struct delayed_work scan_work; 416 struct work_struct work; 417 struct mutex command_lock; 418 unsigned long work_pending; 419 int last_qual; 420 s32 cqm_rssi_thold; 421 u32 cqm_rssi_hyst; 422 int last_cqm_event_rssi; 423 424 struct ieee80211_supported_band band; 425 struct ieee80211_channel channels[ARRAY_SIZE(rndis_channels)]; 426 struct ieee80211_rate rates[ARRAY_SIZE(rndis_rates)]; 427 u32 cipher_suites[ARRAY_SIZE(rndis_cipher_suites)]; 428 429 int device_type; 430 int caps; 431 int multicast_size; 432 433 /* module parameters */ 434 char param_country[4]; 435 int param_frameburst; 436 int param_afterburner; 437 int param_power_save; 438 int param_power_output; 439 int param_roamtrigger; 440 int param_roamdelta; 441 u32 param_workaround_interval; 442 443 /* hardware state */ 444 bool radio_on; 445 int power_mode; 446 int infra_mode; 447 bool connected; 448 u8 bssid[ETH_ALEN]; 449 u32 current_command_oid; 450 451 /* encryption stuff */ 452 u8 encr_tx_key_index; 453 struct rndis_wlan_encr_key encr_keys[RNDIS_WLAN_NUM_KEYS]; 454 int wpa_version; 455 456 u8 command_buffer[COMMAND_BUFFER_SIZE]; 457}; 458 459/* 460 * cfg80211 ops 461 */ 462static int rndis_change_virtual_intf(struct wiphy *wiphy, 463 struct net_device *dev, 464 enum nl80211_iftype type, 465 struct vif_params *params); 466 467static int rndis_scan(struct wiphy *wiphy, 468 struct cfg80211_scan_request *request); 469 470static int rndis_set_wiphy_params(struct wiphy *wiphy, u32 changed); 471 472static int rndis_set_tx_power(struct wiphy *wiphy, 473 struct wireless_dev *wdev, 474 enum nl80211_tx_power_setting type, 475 int mbm); 476static int rndis_get_tx_power(struct wiphy *wiphy, 477 struct wireless_dev *wdev, 478 int *dbm); 479 480static int rndis_connect(struct wiphy *wiphy, struct net_device *dev, 481 struct cfg80211_connect_params *sme); 482 483static int rndis_disconnect(struct wiphy *wiphy, struct net_device *dev, 484 u16 reason_code); 485 486static int rndis_join_ibss(struct wiphy *wiphy, struct net_device *dev, 487 struct cfg80211_ibss_params *params); 488 489static int rndis_leave_ibss(struct wiphy *wiphy, struct net_device *dev); 490 491static int rndis_add_key(struct wiphy *wiphy, struct net_device *netdev, 492 u8 key_index, bool pairwise, const u8 *mac_addr, 493 struct key_params *params); 494 495static int rndis_del_key(struct wiphy *wiphy, struct net_device *netdev, 496 u8 key_index, bool pairwise, const u8 *mac_addr); 497 498static int rndis_set_default_key(struct wiphy *wiphy, struct net_device *netdev, 499 u8 key_index, bool unicast, bool multicast); 500 501static int rndis_get_station(struct wiphy *wiphy, struct net_device *dev, 502 const u8 *mac, struct station_info *sinfo); 503 504static int rndis_dump_station(struct wiphy *wiphy, struct net_device *dev, 505 int idx, u8 *mac, struct station_info *sinfo); 506 507static int rndis_set_pmksa(struct wiphy *wiphy, struct net_device *netdev, 508 struct cfg80211_pmksa *pmksa); 509 510static int rndis_del_pmksa(struct wiphy *wiphy, struct net_device *netdev, 511 struct cfg80211_pmksa *pmksa); 512 513static int rndis_flush_pmksa(struct wiphy *wiphy, struct net_device *netdev); 514 515static int rndis_set_power_mgmt(struct wiphy *wiphy, struct net_device *dev, 516 bool enabled, int timeout); 517 518static int rndis_set_cqm_rssi_config(struct wiphy *wiphy, 519 struct net_device *dev, 520 s32 rssi_thold, u32 rssi_hyst); 521 522static const struct cfg80211_ops rndis_config_ops = { 523 .change_virtual_intf = rndis_change_virtual_intf, 524 .scan = rndis_scan, 525 .set_wiphy_params = rndis_set_wiphy_params, 526 .set_tx_power = rndis_set_tx_power, 527 .get_tx_power = rndis_get_tx_power, 528 .connect = rndis_connect, 529 .disconnect = rndis_disconnect, 530 .join_ibss = rndis_join_ibss, 531 .leave_ibss = rndis_leave_ibss, 532 .add_key = rndis_add_key, 533 .del_key = rndis_del_key, 534 .set_default_key = rndis_set_default_key, 535 .get_station = rndis_get_station, 536 .dump_station = rndis_dump_station, 537 .set_pmksa = rndis_set_pmksa, 538 .del_pmksa = rndis_del_pmksa, 539 .flush_pmksa = rndis_flush_pmksa, 540 .set_power_mgmt = rndis_set_power_mgmt, 541 .set_cqm_rssi_config = rndis_set_cqm_rssi_config, 542}; 543 544static void *rndis_wiphy_privid = &rndis_wiphy_privid; 545 546 547static struct rndis_wlan_private *get_rndis_wlan_priv(struct usbnet *dev) 548{ 549 return (struct rndis_wlan_private *)dev->driver_priv; 550} 551 552static u32 get_bcm4320_power_dbm(struct rndis_wlan_private *priv) 553{ 554 switch (priv->param_power_output) { 555 default: 556 case 3: 557 return BCM4320_DEFAULT_TXPOWER_DBM_100; 558 case 2: 559 return BCM4320_DEFAULT_TXPOWER_DBM_75; 560 case 1: 561 return BCM4320_DEFAULT_TXPOWER_DBM_50; 562 case 0: 563 return BCM4320_DEFAULT_TXPOWER_DBM_25; 564 } 565} 566 567static bool is_wpa_key(struct rndis_wlan_private *priv, u8 idx) 568{ 569 int cipher = priv->encr_keys[idx].cipher; 570 571 return (cipher == WLAN_CIPHER_SUITE_CCMP || 572 cipher == WLAN_CIPHER_SUITE_TKIP); 573} 574 575static int rndis_cipher_to_alg(u32 cipher) 576{ 577 switch (cipher) { 578 default: 579 return RNDIS_WLAN_ALG_NONE; 580 case WLAN_CIPHER_SUITE_WEP40: 581 case WLAN_CIPHER_SUITE_WEP104: 582 return RNDIS_WLAN_ALG_WEP; 583 case WLAN_CIPHER_SUITE_TKIP: 584 return RNDIS_WLAN_ALG_TKIP; 585 case WLAN_CIPHER_SUITE_CCMP: 586 return RNDIS_WLAN_ALG_CCMP; 587 } 588} 589 590static int rndis_akm_suite_to_key_mgmt(u32 akm_suite) 591{ 592 switch (akm_suite) { 593 default: 594 return RNDIS_WLAN_KEY_MGMT_NONE; 595 case WLAN_AKM_SUITE_8021X: 596 return RNDIS_WLAN_KEY_MGMT_802_1X; 597 case WLAN_AKM_SUITE_PSK: 598 return RNDIS_WLAN_KEY_MGMT_PSK; 599 } 600} 601 602#ifdef DEBUG 603static const char *oid_to_string(u32 oid) 604{ 605 switch (oid) { 606#define OID_STR(oid) case oid: return(#oid) 607 /* from rndis_host.h */ 608 OID_STR(RNDIS_OID_802_3_PERMANENT_ADDRESS); 609 OID_STR(RNDIS_OID_GEN_MAXIMUM_FRAME_SIZE); 610 OID_STR(RNDIS_OID_GEN_CURRENT_PACKET_FILTER); 611 OID_STR(RNDIS_OID_GEN_PHYSICAL_MEDIUM); 612 613 /* from rndis_wlan.c */ 614 OID_STR(RNDIS_OID_GEN_LINK_SPEED); 615 OID_STR(RNDIS_OID_GEN_RNDIS_CONFIG_PARAMETER); 616 617 OID_STR(RNDIS_OID_GEN_XMIT_OK); 618 OID_STR(RNDIS_OID_GEN_RCV_OK); 619 OID_STR(RNDIS_OID_GEN_XMIT_ERROR); 620 OID_STR(RNDIS_OID_GEN_RCV_ERROR); 621 OID_STR(RNDIS_OID_GEN_RCV_NO_BUFFER); 622 623 OID_STR(RNDIS_OID_802_3_CURRENT_ADDRESS); 624 OID_STR(RNDIS_OID_802_3_MULTICAST_LIST); 625 OID_STR(RNDIS_OID_802_3_MAXIMUM_LIST_SIZE); 626 627 OID_STR(RNDIS_OID_802_11_BSSID); 628 OID_STR(RNDIS_OID_802_11_SSID); 629 OID_STR(RNDIS_OID_802_11_INFRASTRUCTURE_MODE); 630 OID_STR(RNDIS_OID_802_11_ADD_WEP); 631 OID_STR(RNDIS_OID_802_11_REMOVE_WEP); 632 OID_STR(RNDIS_OID_802_11_DISASSOCIATE); 633 OID_STR(RNDIS_OID_802_11_AUTHENTICATION_MODE); 634 OID_STR(RNDIS_OID_802_11_PRIVACY_FILTER); 635 OID_STR(RNDIS_OID_802_11_BSSID_LIST_SCAN); 636 OID_STR(RNDIS_OID_802_11_ENCRYPTION_STATUS); 637 OID_STR(RNDIS_OID_802_11_ADD_KEY); 638 OID_STR(RNDIS_OID_802_11_REMOVE_KEY); 639 OID_STR(RNDIS_OID_802_11_ASSOCIATION_INFORMATION); 640 OID_STR(RNDIS_OID_802_11_CAPABILITY); 641 OID_STR(RNDIS_OID_802_11_PMKID); 642 OID_STR(RNDIS_OID_802_11_NETWORK_TYPES_SUPPORTED); 643 OID_STR(RNDIS_OID_802_11_NETWORK_TYPE_IN_USE); 644 OID_STR(RNDIS_OID_802_11_TX_POWER_LEVEL); 645 OID_STR(RNDIS_OID_802_11_RSSI); 646 OID_STR(RNDIS_OID_802_11_RSSI_TRIGGER); 647 OID_STR(RNDIS_OID_802_11_FRAGMENTATION_THRESHOLD); 648 OID_STR(RNDIS_OID_802_11_RTS_THRESHOLD); 649 OID_STR(RNDIS_OID_802_11_SUPPORTED_RATES); 650 OID_STR(RNDIS_OID_802_11_CONFIGURATION); 651 OID_STR(RNDIS_OID_802_11_POWER_MODE); 652 OID_STR(RNDIS_OID_802_11_BSSID_LIST); 653#undef OID_STR 654 } 655 656 return "?"; 657} 658#else 659static const char *oid_to_string(u32 oid) 660{ 661 return "?"; 662} 663#endif 664 665/* translate error code */ 666static int rndis_error_status(__le32 rndis_status) 667{ 668 int ret = -EINVAL; 669 switch (le32_to_cpu(rndis_status)) { 670 case RNDIS_STATUS_SUCCESS: 671 ret = 0; 672 break; 673 case RNDIS_STATUS_FAILURE: 674 case RNDIS_STATUS_INVALID_DATA: 675 ret = -EINVAL; 676 break; 677 case RNDIS_STATUS_NOT_SUPPORTED: 678 ret = -EOPNOTSUPP; 679 break; 680 case RNDIS_STATUS_ADAPTER_NOT_READY: 681 case RNDIS_STATUS_ADAPTER_NOT_OPEN: 682 ret = -EBUSY; 683 break; 684 } 685 return ret; 686} 687 688static int rndis_query_oid(struct usbnet *dev, u32 oid, void *data, int *len) 689{ 690 struct rndis_wlan_private *priv = get_rndis_wlan_priv(dev); 691 union { 692 void *buf; 693 struct rndis_msg_hdr *header; 694 struct rndis_query *get; 695 struct rndis_query_c *get_c; 696 } u; 697 int ret, buflen; 698 int resplen, respoffs, copylen; 699 700 buflen = *len + sizeof(*u.get); 701 if (buflen < CONTROL_BUFFER_SIZE) 702 buflen = CONTROL_BUFFER_SIZE; 703 704 if (buflen > COMMAND_BUFFER_SIZE) { 705 u.buf = kmalloc(buflen, GFP_KERNEL); 706 if (!u.buf) 707 return -ENOMEM; 708 } else { 709 u.buf = priv->command_buffer; 710 } 711 712 mutex_lock(&priv->command_lock); 713 714 memset(u.get, 0, sizeof *u.get); 715 u.get->msg_type = cpu_to_le32(RNDIS_MSG_QUERY); 716 u.get->msg_len = cpu_to_le32(sizeof *u.get); 717 u.get->oid = cpu_to_le32(oid); 718 719 priv->current_command_oid = oid; 720 ret = rndis_command(dev, u.header, buflen); 721 priv->current_command_oid = 0; 722 if (ret < 0) 723 netdev_dbg(dev->net, "%s(%s): rndis_command() failed, %d (%08x)\n", 724 __func__, oid_to_string(oid), ret, 725 le32_to_cpu(u.get_c->status)); 726 727 if (ret == 0) { 728 resplen = le32_to_cpu(u.get_c->len); 729 respoffs = le32_to_cpu(u.get_c->offset) + 8; 730 731 if (respoffs > buflen) { 732 /* Device returned data offset outside buffer, error. */ 733 netdev_dbg(dev->net, "%s(%s): received invalid " 734 "data offset: %d > %d\n", __func__, 735 oid_to_string(oid), respoffs, buflen); 736 737 ret = -EINVAL; 738 goto exit_unlock; 739 } 740 741 if ((resplen + respoffs) > buflen) { 742 /* Device would have returned more data if buffer would 743 * have been big enough. Copy just the bits that we got. 744 */ 745 copylen = buflen - respoffs; 746 } else { 747 copylen = resplen; 748 } 749 750 if (copylen > *len) 751 copylen = *len; 752 753 memcpy(data, u.buf + respoffs, copylen); 754 755 *len = resplen; 756 757 ret = rndis_error_status(u.get_c->status); 758 if (ret < 0) 759 netdev_dbg(dev->net, "%s(%s): device returned error, 0x%08x (%d)\n", 760 __func__, oid_to_string(oid), 761 le32_to_cpu(u.get_c->status), ret); 762 } 763 764exit_unlock: 765 mutex_unlock(&priv->command_lock); 766 767 if (u.buf != priv->command_buffer) 768 kfree(u.buf); 769 return ret; 770} 771 772static int rndis_set_oid(struct usbnet *dev, u32 oid, const void *data, 773 int len) 774{ 775 struct rndis_wlan_private *priv = get_rndis_wlan_priv(dev); 776 union { 777 void *buf; 778 struct rndis_msg_hdr *header; 779 struct rndis_set *set; 780 struct rndis_set_c *set_c; 781 } u; 782 int ret, buflen; 783 784 buflen = len + sizeof(*u.set); 785 if (buflen < CONTROL_BUFFER_SIZE) 786 buflen = CONTROL_BUFFER_SIZE; 787 788 if (buflen > COMMAND_BUFFER_SIZE) { 789 u.buf = kmalloc(buflen, GFP_KERNEL); 790 if (!u.buf) 791 return -ENOMEM; 792 } else { 793 u.buf = priv->command_buffer; 794 } 795 796 mutex_lock(&priv->command_lock); 797 798 memset(u.set, 0, sizeof *u.set); 799 u.set->msg_type = cpu_to_le32(RNDIS_MSG_SET); 800 u.set->msg_len = cpu_to_le32(sizeof(*u.set) + len); 801 u.set->oid = cpu_to_le32(oid); 802 u.set->len = cpu_to_le32(len); 803 u.set->offset = cpu_to_le32(sizeof(*u.set) - 8); 804 u.set->handle = cpu_to_le32(0); 805 memcpy(u.buf + sizeof(*u.set), data, len); 806 807 priv->current_command_oid = oid; 808 ret = rndis_command(dev, u.header, buflen); 809 priv->current_command_oid = 0; 810 if (ret < 0) 811 netdev_dbg(dev->net, "%s(%s): rndis_command() failed, %d (%08x)\n", 812 __func__, oid_to_string(oid), ret, 813 le32_to_cpu(u.set_c->status)); 814 815 if (ret == 0) { 816 ret = rndis_error_status(u.set_c->status); 817 818 if (ret < 0) 819 netdev_dbg(dev->net, "%s(%s): device returned error, 0x%08x (%d)\n", 820 __func__, oid_to_string(oid), 821 le32_to_cpu(u.set_c->status), ret); 822 } 823 824 mutex_unlock(&priv->command_lock); 825 826 if (u.buf != priv->command_buffer) 827 kfree(u.buf); 828 return ret; 829} 830 831static int rndis_reset(struct usbnet *usbdev) 832{ 833 struct rndis_wlan_private *priv = get_rndis_wlan_priv(usbdev); 834 struct rndis_reset *reset; 835 int ret; 836 837 mutex_lock(&priv->command_lock); 838 839 reset = (void *)priv->command_buffer; 840 memset(reset, 0, sizeof(*reset)); 841 reset->msg_type = cpu_to_le32(RNDIS_MSG_RESET); 842 reset->msg_len = cpu_to_le32(sizeof(*reset)); 843 priv->current_command_oid = 0; 844 ret = rndis_command(usbdev, (void *)reset, CONTROL_BUFFER_SIZE); 845 846 mutex_unlock(&priv->command_lock); 847 848 if (ret < 0) 849 return ret; 850 return 0; 851} 852 853/* 854 * Specs say that we can only set config parameters only soon after device 855 * initialization. 856 * value_type: 0 = u32, 2 = unicode string 857 */ 858static int rndis_set_config_parameter(struct usbnet *dev, char *param, 859 int value_type, void *value) 860{ 861 struct ndis_config_param *infobuf; 862 int value_len, info_len, param_len, ret, i; 863 __le16 *unibuf; 864 __le32 *dst_value; 865 866 if (value_type == 0) 867 value_len = sizeof(__le32); 868 else if (value_type == 2) 869 value_len = strlen(value) * sizeof(__le16); 870 else 871 return -EINVAL; 872 873 param_len = strlen(param) * sizeof(__le16); 874 info_len = sizeof(*infobuf) + param_len + value_len; 875 876#ifdef DEBUG 877 info_len += 12; 878#endif 879 infobuf = kmalloc(info_len, GFP_KERNEL); 880 if (!infobuf) 881 return -ENOMEM; 882 883#ifdef DEBUG 884 info_len -= 12; 885 /* extra 12 bytes are for padding (debug output) */ 886 memset(infobuf, 0xCC, info_len + 12); 887#endif 888 889 if (value_type == 2) 890 netdev_dbg(dev->net, "setting config parameter: %s, value: %s\n", 891 param, (u8 *)value); 892 else 893 netdev_dbg(dev->net, "setting config parameter: %s, value: %d\n", 894 param, *(u32 *)value); 895 896 infobuf->name_offs = cpu_to_le32(sizeof(*infobuf)); 897 infobuf->name_length = cpu_to_le32(param_len); 898 infobuf->type = cpu_to_le32(value_type); 899 infobuf->value_offs = cpu_to_le32(sizeof(*infobuf) + param_len); 900 infobuf->value_length = cpu_to_le32(value_len); 901 902 /* simple string to unicode string conversion */ 903 unibuf = (void *)infobuf + sizeof(*infobuf); 904 for (i = 0; i < param_len / sizeof(__le16); i++) 905 unibuf[i] = cpu_to_le16(param[i]); 906 907 if (value_type == 2) { 908 unibuf = (void *)infobuf + sizeof(*infobuf) + param_len; 909 for (i = 0; i < value_len / sizeof(__le16); i++) 910 unibuf[i] = cpu_to_le16(((u8 *)value)[i]); 911 } else { 912 dst_value = (void *)infobuf + sizeof(*infobuf) + param_len; 913 *dst_value = cpu_to_le32(*(u32 *)value); 914 } 915 916#ifdef DEBUG 917 netdev_dbg(dev->net, "info buffer (len: %d)\n", info_len); 918 for (i = 0; i < info_len; i += 12) { 919 u32 *tmp = (u32 *)((u8 *)infobuf + i); 920 netdev_dbg(dev->net, "%08X:%08X:%08X\n", 921 cpu_to_be32(tmp[0]), 922 cpu_to_be32(tmp[1]), 923 cpu_to_be32(tmp[2])); 924 } 925#endif 926 927 ret = rndis_set_oid(dev, RNDIS_OID_GEN_RNDIS_CONFIG_PARAMETER, 928 infobuf, info_len); 929 if (ret != 0) 930 netdev_dbg(dev->net, "setting rndis config parameter failed, %d\n", 931 ret); 932 933 kfree(infobuf); 934 return ret; 935} 936 937static int rndis_set_config_parameter_str(struct usbnet *dev, 938 char *param, char *value) 939{ 940 return rndis_set_config_parameter(dev, param, 2, value); 941} 942 943/* 944 * data conversion functions 945 */ 946static int level_to_qual(int level) 947{ 948 int qual = 100 * (level - WL_NOISE) / (WL_SIGMAX - WL_NOISE); 949 return qual >= 0 ? (qual <= 100 ? qual : 100) : 0; 950} 951 952/* 953 * common functions 954 */ 955static int set_infra_mode(struct usbnet *usbdev, int mode); 956static void restore_keys(struct usbnet *usbdev); 957static int rndis_check_bssid_list(struct usbnet *usbdev, u8 *match_bssid, 958 bool *matched); 959 960static int rndis_start_bssid_list_scan(struct usbnet *usbdev) 961{ 962 __le32 tmp; 963 964 /* Note: RNDIS_OID_802_11_BSSID_LIST_SCAN clears internal BSS list. */ 965 tmp = cpu_to_le32(1); 966 return rndis_set_oid(usbdev, RNDIS_OID_802_11_BSSID_LIST_SCAN, &tmp, 967 sizeof(tmp)); 968} 969 970static int set_essid(struct usbnet *usbdev, struct ndis_80211_ssid *ssid) 971{ 972 struct rndis_wlan_private *priv = get_rndis_wlan_priv(usbdev); 973 int ret; 974 975 ret = rndis_set_oid(usbdev, RNDIS_OID_802_11_SSID, 976 ssid, sizeof(*ssid)); 977 if (ret < 0) { 978 netdev_warn(usbdev->net, "setting SSID failed (%08X)\n", ret); 979 return ret; 980 } 981 if (ret == 0) { 982 priv->radio_on = true; 983 netdev_dbg(usbdev->net, "%s(): radio_on = true\n", __func__); 984 } 985 986 return ret; 987} 988 989static int set_bssid(struct usbnet *usbdev, const u8 *bssid) 990{ 991 int ret; 992 993 ret = rndis_set_oid(usbdev, RNDIS_OID_802_11_BSSID, 994 bssid, ETH_ALEN); 995 if (ret < 0) { 996 netdev_warn(usbdev->net, "setting BSSID[%pM] failed (%08X)\n", 997 bssid, ret); 998 return ret; 999 } 1000 1001 return ret; 1002} 1003 1004static int clear_bssid(struct usbnet *usbdev) 1005{ 1006 static const u8 broadcast_mac[ETH_ALEN] = { 1007 0xff, 0xff, 0xff, 0xff, 0xff, 0xff 1008 }; 1009 1010 return set_bssid(usbdev, broadcast_mac); 1011} 1012 1013static int get_bssid(struct usbnet *usbdev, u8 bssid[ETH_ALEN]) 1014{ 1015 int ret, len; 1016 1017 len = ETH_ALEN; 1018 ret = rndis_query_oid(usbdev, RNDIS_OID_802_11_BSSID, 1019 bssid, &len); 1020 1021 if (ret != 0) 1022 eth_zero_addr(bssid); 1023 1024 return ret; 1025} 1026 1027static int get_association_info(struct usbnet *usbdev, 1028 struct ndis_80211_assoc_info *info, int len) 1029{ 1030 return rndis_query_oid(usbdev, 1031 RNDIS_OID_802_11_ASSOCIATION_INFORMATION, 1032 info, &len); 1033} 1034 1035static bool is_associated(struct usbnet *usbdev) 1036{ 1037 struct rndis_wlan_private *priv = get_rndis_wlan_priv(usbdev); 1038 u8 bssid[ETH_ALEN]; 1039 1040 if (!priv->radio_on) 1041 return false; 1042 1043 return (get_bssid(usbdev, bssid) == 0 && !is_zero_ether_addr(bssid)); 1044} 1045 1046static int disassociate(struct usbnet *usbdev, bool reset_ssid) 1047{ 1048 struct rndis_wlan_private *priv = get_rndis_wlan_priv(usbdev); 1049 struct ndis_80211_ssid ssid; 1050 int i, ret = 0; 1051 1052 if (priv->radio_on) { 1053 ret = rndis_set_oid(usbdev, 1054 RNDIS_OID_802_11_DISASSOCIATE, 1055 NULL, 0); 1056 if (ret == 0) { 1057 priv->radio_on = false; 1058 netdev_dbg(usbdev->net, "%s(): radio_on = false\n", 1059 __func__); 1060 1061 if (reset_ssid) 1062 msleep(100); 1063 } 1064 } 1065 1066 /* disassociate causes radio to be turned off; if reset_ssid 1067 * is given, set random ssid to enable radio */ 1068 if (reset_ssid) { 1069 /* Set device to infrastructure mode so we don't get ad-hoc 1070 * 'media connect' indications with the random ssid. 1071 */ 1072 set_infra_mode(usbdev, NDIS_80211_INFRA_INFRA); 1073 1074 ssid.length = cpu_to_le32(sizeof(ssid.essid)); 1075 get_random_bytes(&ssid.essid[2], sizeof(ssid.essid)-2); 1076 ssid.essid[0] = 0x1; 1077 ssid.essid[1] = 0xff; 1078 for (i = 2; i < sizeof(ssid.essid); i++) 1079 ssid.essid[i] = 0x1 + (ssid.essid[i] * 0xfe / 0xff); 1080 ret = set_essid(usbdev, &ssid); 1081 } 1082 return ret; 1083} 1084 1085static int set_auth_mode(struct usbnet *usbdev, u32 wpa_version, 1086 enum nl80211_auth_type auth_type, int keymgmt) 1087{ 1088 struct rndis_wlan_private *priv = get_rndis_wlan_priv(usbdev); 1089 __le32 tmp; 1090 int auth_mode, ret; 1091 1092 netdev_dbg(usbdev->net, "%s(): wpa_version=0x%x authalg=0x%x keymgmt=0x%x\n", 1093 __func__, wpa_version, auth_type, keymgmt); 1094 1095 if (wpa_version & NL80211_WPA_VERSION_2) { 1096 if (keymgmt & RNDIS_WLAN_KEY_MGMT_802_1X) 1097 auth_mode = NDIS_80211_AUTH_WPA2; 1098 else 1099 auth_mode = NDIS_80211_AUTH_WPA2_PSK; 1100 } else if (wpa_version & NL80211_WPA_VERSION_1) { 1101 if (keymgmt & RNDIS_WLAN_KEY_MGMT_802_1X) 1102 auth_mode = NDIS_80211_AUTH_WPA; 1103 else if (keymgmt & RNDIS_WLAN_KEY_MGMT_PSK) 1104 auth_mode = NDIS_80211_AUTH_WPA_PSK; 1105 else 1106 auth_mode = NDIS_80211_AUTH_WPA_NONE; 1107 } else if (auth_type == NL80211_AUTHTYPE_SHARED_KEY) 1108 auth_mode = NDIS_80211_AUTH_SHARED; 1109 else if (auth_type == NL80211_AUTHTYPE_OPEN_SYSTEM) 1110 auth_mode = NDIS_80211_AUTH_OPEN; 1111 else if (auth_type == NL80211_AUTHTYPE_AUTOMATIC) 1112 auth_mode = NDIS_80211_AUTH_AUTO_SWITCH; 1113 else 1114 return -ENOTSUPP; 1115 1116 tmp = cpu_to_le32(auth_mode); 1117 ret = rndis_set_oid(usbdev, 1118 RNDIS_OID_802_11_AUTHENTICATION_MODE, 1119 &tmp, sizeof(tmp)); 1120 if (ret != 0) { 1121 netdev_warn(usbdev->net, "setting auth mode failed (%08X)\n", 1122 ret); 1123 return ret; 1124 } 1125 1126 priv->wpa_version = wpa_version; 1127 1128 return 0; 1129} 1130 1131static int set_priv_filter(struct usbnet *usbdev) 1132{ 1133 struct rndis_wlan_private *priv = get_rndis_wlan_priv(usbdev); 1134 __le32 tmp; 1135 1136 netdev_dbg(usbdev->net, "%s(): wpa_version=0x%x\n", 1137 __func__, priv->wpa_version); 1138 1139 if (priv->wpa_version & NL80211_WPA_VERSION_2 || 1140 priv->wpa_version & NL80211_WPA_VERSION_1) 1141 tmp = cpu_to_le32(NDIS_80211_PRIV_8021X_WEP); 1142 else 1143 tmp = cpu_to_le32(NDIS_80211_PRIV_ACCEPT_ALL); 1144 1145 return rndis_set_oid(usbdev, 1146 RNDIS_OID_802_11_PRIVACY_FILTER, &tmp, 1147 sizeof(tmp)); 1148} 1149 1150static int set_encr_mode(struct usbnet *usbdev, int pairwise, int groupwise) 1151{ 1152 __le32 tmp; 1153 int encr_mode, ret; 1154 1155 netdev_dbg(usbdev->net, "%s(): cipher_pair=0x%x cipher_group=0x%x\n", 1156 __func__, pairwise, groupwise); 1157 1158 if (pairwise & RNDIS_WLAN_ALG_CCMP) 1159 encr_mode = NDIS_80211_ENCR_CCMP_ENABLED; 1160 else if (pairwise & RNDIS_WLAN_ALG_TKIP) 1161 encr_mode = NDIS_80211_ENCR_TKIP_ENABLED; 1162 else if (pairwise & RNDIS_WLAN_ALG_WEP) 1163 encr_mode = NDIS_80211_ENCR_WEP_ENABLED; 1164 else if (groupwise & RNDIS_WLAN_ALG_CCMP) 1165 encr_mode = NDIS_80211_ENCR_CCMP_ENABLED; 1166 else if (groupwise & RNDIS_WLAN_ALG_TKIP) 1167 encr_mode = NDIS_80211_ENCR_TKIP_ENABLED; 1168 else 1169 encr_mode = NDIS_80211_ENCR_DISABLED; 1170 1171 tmp = cpu_to_le32(encr_mode); 1172 ret = rndis_set_oid(usbdev, 1173 RNDIS_OID_802_11_ENCRYPTION_STATUS, &tmp, 1174 sizeof(tmp)); 1175 if (ret != 0) { 1176 netdev_warn(usbdev->net, "setting encr mode failed (%08X)\n", 1177 ret); 1178 return ret; 1179 } 1180 1181 return 0; 1182} 1183 1184static int set_infra_mode(struct usbnet *usbdev, int mode) 1185{ 1186 struct rndis_wlan_private *priv = get_rndis_wlan_priv(usbdev); 1187 __le32 tmp; 1188 int ret; 1189 1190 netdev_dbg(usbdev->net, "%s(): infra_mode=0x%x\n", 1191 __func__, priv->infra_mode); 1192 1193 tmp = cpu_to_le32(mode); 1194 ret = rndis_set_oid(usbdev, 1195 RNDIS_OID_802_11_INFRASTRUCTURE_MODE, 1196 &tmp, sizeof(tmp)); 1197 if (ret != 0) { 1198 netdev_warn(usbdev->net, "setting infra mode failed (%08X)\n", 1199 ret); 1200 return ret; 1201 } 1202 1203 /* NDIS drivers clear keys when infrastructure mode is 1204 * changed. But Linux tools assume otherwise. So set the 1205 * keys */ 1206 restore_keys(usbdev); 1207 1208 priv->infra_mode = mode; 1209 return 0; 1210} 1211 1212static int set_rts_threshold(struct usbnet *usbdev, u32 rts_threshold) 1213{ 1214 __le32 tmp; 1215 1216 netdev_dbg(usbdev->net, "%s(): %i\n", __func__, rts_threshold); 1217 1218 if (rts_threshold == -1 || rts_threshold > 2347) 1219 rts_threshold = 2347; 1220 1221 tmp = cpu_to_le32(rts_threshold); 1222 return rndis_set_oid(usbdev, 1223 RNDIS_OID_802_11_RTS_THRESHOLD, 1224 &tmp, sizeof(tmp)); 1225} 1226 1227static int set_frag_threshold(struct usbnet *usbdev, u32 frag_threshold) 1228{ 1229 __le32 tmp; 1230 1231 netdev_dbg(usbdev->net, "%s(): %i\n", __func__, frag_threshold); 1232 1233 if (frag_threshold < 256 || frag_threshold > 2346) 1234 frag_threshold = 2346; 1235 1236 tmp = cpu_to_le32(frag_threshold); 1237 return rndis_set_oid(usbdev, 1238 RNDIS_OID_802_11_FRAGMENTATION_THRESHOLD, 1239 &tmp, sizeof(tmp)); 1240} 1241 1242static void set_default_iw_params(struct usbnet *usbdev) 1243{ 1244 set_infra_mode(usbdev, NDIS_80211_INFRA_INFRA); 1245 set_auth_mode(usbdev, 0, NL80211_AUTHTYPE_OPEN_SYSTEM, 1246 RNDIS_WLAN_KEY_MGMT_NONE); 1247 set_priv_filter(usbdev); 1248 set_encr_mode(usbdev, RNDIS_WLAN_ALG_NONE, RNDIS_WLAN_ALG_NONE); 1249} 1250 1251static int deauthenticate(struct usbnet *usbdev) 1252{ 1253 int ret; 1254 1255 ret = disassociate(usbdev, true); 1256 set_default_iw_params(usbdev); 1257 return ret; 1258} 1259 1260static int set_channel(struct usbnet *usbdev, int channel) 1261{ 1262 struct ndis_80211_conf config; 1263 unsigned int dsconfig; 1264 int len, ret; 1265 1266 netdev_dbg(usbdev->net, "%s(%d)\n", __func__, channel); 1267 1268 /* this OID is valid only when not associated */ 1269 if (is_associated(usbdev)) 1270 return 0; 1271 1272 dsconfig = 1000 * 1273 ieee80211_channel_to_frequency(channel, NL80211_BAND_2GHZ); 1274 1275 len = sizeof(config); 1276 ret = rndis_query_oid(usbdev, 1277 RNDIS_OID_802_11_CONFIGURATION, 1278 &config, &len); 1279 if (ret < 0) { 1280 netdev_dbg(usbdev->net, "%s(): querying configuration failed\n", 1281 __func__); 1282 return ret; 1283 } 1284 1285 config.ds_config = cpu_to_le32(dsconfig); 1286 ret = rndis_set_oid(usbdev, 1287 RNDIS_OID_802_11_CONFIGURATION, 1288 &config, sizeof(config)); 1289 1290 netdev_dbg(usbdev->net, "%s(): %d -> %d\n", __func__, channel, ret); 1291 1292 return ret; 1293} 1294 1295static struct ieee80211_channel *get_current_channel(struct usbnet *usbdev, 1296 u32 *beacon_period) 1297{ 1298 struct rndis_wlan_private *priv = get_rndis_wlan_priv(usbdev); 1299 struct ieee80211_channel *channel; 1300 struct ndis_80211_conf config; 1301 int len, ret; 1302 1303 /* Get channel and beacon interval */ 1304 len = sizeof(config); 1305 ret = rndis_query_oid(usbdev, 1306 RNDIS_OID_802_11_CONFIGURATION, 1307 &config, &len); 1308 netdev_dbg(usbdev->net, "%s(): RNDIS_OID_802_11_CONFIGURATION -> %d\n", 1309 __func__, ret); 1310 if (ret < 0) 1311 return NULL; 1312 1313 channel = ieee80211_get_channel(priv->wdev.wiphy, 1314 KHZ_TO_MHZ(le32_to_cpu(config.ds_config))); 1315 if (!channel) 1316 return NULL; 1317 1318 if (beacon_period) 1319 *beacon_period = le32_to_cpu(config.beacon_period); 1320 return channel; 1321} 1322 1323/* index must be 0 - N, as per NDIS */ 1324static int add_wep_key(struct usbnet *usbdev, const u8 *key, int key_len, 1325 u8 index) 1326{ 1327 struct rndis_wlan_private *priv = get_rndis_wlan_priv(usbdev); 1328 struct ndis_80211_wep_key ndis_key; 1329 u32 cipher; 1330 int ret; 1331 1332 netdev_dbg(usbdev->net, "%s(idx: %d, len: %d)\n", 1333 __func__, index, key_len); 1334 1335 if (index >= RNDIS_WLAN_NUM_KEYS) 1336 return -EINVAL; 1337 1338 if (key_len == 5) 1339 cipher = WLAN_CIPHER_SUITE_WEP40; 1340 else if (key_len == 13) 1341 cipher = WLAN_CIPHER_SUITE_WEP104; 1342 else 1343 return -EINVAL; 1344 1345 memset(&ndis_key, 0, sizeof(ndis_key)); 1346 1347 ndis_key.size = cpu_to_le32(sizeof(ndis_key)); 1348 ndis_key.length = cpu_to_le32(key_len); 1349 ndis_key.index = cpu_to_le32(index); 1350 memcpy(&ndis_key.material, key, key_len); 1351 1352 if (index == priv->encr_tx_key_index) { 1353 ndis_key.index |= NDIS_80211_ADDWEP_TRANSMIT_KEY; 1354 ret = set_encr_mode(usbdev, RNDIS_WLAN_ALG_WEP, 1355 RNDIS_WLAN_ALG_NONE); 1356 if (ret) 1357 netdev_warn(usbdev->net, "encryption couldn't be enabled (%08X)\n", 1358 ret); 1359 } 1360 1361 ret = rndis_set_oid(usbdev, 1362 RNDIS_OID_802_11_ADD_WEP, &ndis_key, 1363 sizeof(ndis_key)); 1364 if (ret != 0) { 1365 netdev_warn(usbdev->net, "adding encryption key %d failed (%08X)\n", 1366 index + 1, ret); 1367 return ret; 1368 } 1369 1370 priv->encr_keys[index].len = key_len; 1371 priv->encr_keys[index].cipher = cipher; 1372 memcpy(&priv->encr_keys[index].material, key, key_len); 1373 eth_broadcast_addr(priv->encr_keys[index].bssid); 1374 1375 return 0; 1376} 1377 1378static int add_wpa_key(struct usbnet *usbdev, const u8 *key, int key_len, 1379 u8 index, const u8 *addr, const u8 *rx_seq, 1380 int seq_len, u32 cipher, __le32 flags) 1381{ 1382 struct rndis_wlan_private *priv = get_rndis_wlan_priv(usbdev); 1383 struct ndis_80211_key ndis_key; 1384 bool is_addr_ok; 1385 int ret; 1386 1387 if (index >= RNDIS_WLAN_NUM_KEYS) { 1388 netdev_dbg(usbdev->net, "%s(): index out of range (%i)\n", 1389 __func__, index); 1390 return -EINVAL; 1391 } 1392 if (key_len > sizeof(ndis_key.material) || key_len < 0) { 1393 netdev_dbg(usbdev->net, "%s(): key length out of range (%i)\n", 1394 __func__, key_len); 1395 return -EINVAL; 1396 } 1397 if (flags & NDIS_80211_ADDKEY_SET_INIT_RECV_SEQ) { 1398 if (!rx_seq || seq_len <= 0) { 1399 netdev_dbg(usbdev->net, "%s(): recv seq flag without buffer\n", 1400 __func__); 1401 return -EINVAL; 1402 } 1403 if (rx_seq && seq_len > sizeof(ndis_key.rsc)) { 1404 netdev_dbg(usbdev->net, "%s(): too big recv seq buffer\n", __func__); 1405 return -EINVAL; 1406 } 1407 } 1408 1409 is_addr_ok = addr && !is_zero_ether_addr(addr) && 1410 !is_broadcast_ether_addr(addr); 1411 if ((flags & NDIS_80211_ADDKEY_PAIRWISE_KEY) && !is_addr_ok) { 1412 netdev_dbg(usbdev->net, "%s(): pairwise but bssid invalid (%pM)\n", 1413 __func__, addr); 1414 return -EINVAL; 1415 } 1416 1417 netdev_dbg(usbdev->net, "%s(%i): flags:%i%i%i\n", 1418 __func__, index, 1419 !!(flags & NDIS_80211_ADDKEY_TRANSMIT_KEY), 1420 !!(flags & NDIS_80211_ADDKEY_PAIRWISE_KEY), 1421 !!(flags & NDIS_80211_ADDKEY_SET_INIT_RECV_SEQ)); 1422 1423 memset(&ndis_key, 0, sizeof(ndis_key)); 1424 1425 ndis_key.size = cpu_to_le32(sizeof(ndis_key) - 1426 sizeof(ndis_key.material) + key_len); 1427 ndis_key.length = cpu_to_le32(key_len); 1428 ndis_key.index = cpu_to_le32(index) | flags; 1429 1430 if (cipher == WLAN_CIPHER_SUITE_TKIP && key_len == 32) { 1431 /* wpa_supplicant gives us the Michael MIC RX/TX keys in 1432 * different order than NDIS spec, so swap the order here. */ 1433 memcpy(ndis_key.material, key, 16); 1434 memcpy(ndis_key.material + 16, key + 24, 8); 1435 memcpy(ndis_key.material + 24, key + 16, 8); 1436 } else 1437 memcpy(ndis_key.material, key, key_len); 1438 1439 if (flags & NDIS_80211_ADDKEY_SET_INIT_RECV_SEQ) 1440 memcpy(ndis_key.rsc, rx_seq, seq_len); 1441 1442 if (flags & NDIS_80211_ADDKEY_PAIRWISE_KEY) { 1443 /* pairwise key */ 1444 memcpy(ndis_key.bssid, addr, ETH_ALEN); 1445 } else { 1446 /* group key */ 1447 if (priv->infra_mode == NDIS_80211_INFRA_ADHOC) 1448 eth_broadcast_addr(ndis_key.bssid); 1449 else 1450 get_bssid(usbdev, ndis_key.bssid); 1451 } 1452 1453 ret = rndis_set_oid(usbdev, 1454 RNDIS_OID_802_11_ADD_KEY, &ndis_key, 1455 le32_to_cpu(ndis_key.size)); 1456 netdev_dbg(usbdev->net, "%s(): RNDIS_OID_802_11_ADD_KEY -> %08X\n", 1457 __func__, ret); 1458 if (ret != 0) 1459 return ret; 1460 1461 memset(&priv->encr_keys[index], 0, sizeof(priv->encr_keys[index])); 1462 priv->encr_keys[index].len = key_len; 1463 priv->encr_keys[index].cipher = cipher; 1464 memcpy(&priv->encr_keys[index].material, key, key_len); 1465 if (flags & NDIS_80211_ADDKEY_PAIRWISE_KEY) 1466 memcpy(&priv->encr_keys[index].bssid, ndis_key.bssid, ETH_ALEN); 1467 else 1468 eth_broadcast_addr(priv->encr_keys[index].bssid); 1469 1470 if (flags & NDIS_80211_ADDKEY_TRANSMIT_KEY) 1471 priv->encr_tx_key_index = index; 1472 1473 return 0; 1474} 1475 1476static int restore_key(struct usbnet *usbdev, u8 key_idx) 1477{ 1478 struct rndis_wlan_private *priv = get_rndis_wlan_priv(usbdev); 1479 struct rndis_wlan_encr_key key; 1480 1481 if (is_wpa_key(priv, key_idx)) 1482 return 0; 1483 1484 key = priv->encr_keys[key_idx]; 1485 1486 netdev_dbg(usbdev->net, "%s(): %i:%i\n", __func__, key_idx, key.len); 1487 1488 if (key.len == 0) 1489 return 0; 1490 1491 return add_wep_key(usbdev, key.material, key.len, key_idx); 1492} 1493 1494static void restore_keys(struct usbnet *usbdev) 1495{ 1496 int i; 1497 1498 for (i = 0; i < 4; i++) 1499 restore_key(usbdev, i); 1500} 1501 1502static void clear_key(struct rndis_wlan_private *priv, u8 idx) 1503{ 1504 memset(&priv->encr_keys[idx], 0, sizeof(priv->encr_keys[idx])); 1505} 1506 1507/* remove_key is for both wep and wpa */ 1508static int remove_key(struct usbnet *usbdev, u8 index, const u8 *bssid) 1509{ 1510 struct rndis_wlan_private *priv = get_rndis_wlan_priv(usbdev); 1511 struct ndis_80211_remove_key remove_key; 1512 __le32 keyindex; 1513 bool is_wpa; 1514 int ret; 1515 1516 if (index >= RNDIS_WLAN_NUM_KEYS) 1517 return -ENOENT; 1518 1519 if (priv->encr_keys[index].len == 0) 1520 return 0; 1521 1522 is_wpa = is_wpa_key(priv, index); 1523 1524 netdev_dbg(usbdev->net, "%s(): %i:%s:%i\n", 1525 __func__, index, is_wpa ? "wpa" : "wep", 1526 priv->encr_keys[index].len); 1527 1528 clear_key(priv, index); 1529 1530 if (is_wpa) { 1531 remove_key.size = cpu_to_le32(sizeof(remove_key)); 1532 remove_key.index = cpu_to_le32(index); 1533 if (bssid) { 1534 /* pairwise key */ 1535 if (!is_broadcast_ether_addr(bssid)) 1536 remove_key.index |= 1537 NDIS_80211_ADDKEY_PAIRWISE_KEY; 1538 memcpy(remove_key.bssid, bssid, 1539 sizeof(remove_key.bssid)); 1540 } else 1541 memset(remove_key.bssid, 0xff, 1542 sizeof(remove_key.bssid)); 1543 1544 ret = rndis_set_oid(usbdev, 1545 RNDIS_OID_802_11_REMOVE_KEY, 1546 &remove_key, sizeof(remove_key)); 1547 if (ret != 0) 1548 return ret; 1549 } else { 1550 keyindex = cpu_to_le32(index); 1551 ret = rndis_set_oid(usbdev, 1552 RNDIS_OID_802_11_REMOVE_WEP, 1553 &keyindex, sizeof(keyindex)); 1554 if (ret != 0) { 1555 netdev_warn(usbdev->net, 1556 "removing encryption key %d failed (%08X)\n", 1557 index, ret); 1558 return ret; 1559 } 1560 } 1561 1562 /* if it is transmit key, disable encryption */ 1563 if (index == priv->encr_tx_key_index) 1564 set_encr_mode(usbdev, RNDIS_WLAN_ALG_NONE, RNDIS_WLAN_ALG_NONE); 1565 1566 return 0; 1567} 1568 1569static void set_multicast_list(struct usbnet *usbdev) 1570{ 1571 struct rndis_wlan_private *priv = get_rndis_wlan_priv(usbdev); 1572 struct netdev_hw_addr *ha; 1573 __le32 filter, basefilter; 1574 int ret; 1575 char *mc_addrs = NULL; 1576 int mc_count; 1577 1578 basefilter = filter = cpu_to_le32(RNDIS_PACKET_TYPE_DIRECTED | 1579 RNDIS_PACKET_TYPE_BROADCAST); 1580 1581 if (usbdev->net->flags & IFF_PROMISC) { 1582 filter |= cpu_to_le32(RNDIS_PACKET_TYPE_PROMISCUOUS | 1583 RNDIS_PACKET_TYPE_ALL_LOCAL); 1584 } else if (usbdev->net->flags & IFF_ALLMULTI) { 1585 filter |= cpu_to_le32(RNDIS_PACKET_TYPE_ALL_MULTICAST); 1586 } 1587 1588 if (filter != basefilter) 1589 goto set_filter; 1590 1591 /* 1592 * mc_list should be accessed holding the lock, so copy addresses to 1593 * local buffer first. 1594 */ 1595 netif_addr_lock_bh(usbdev->net); 1596 mc_count = netdev_mc_count(usbdev->net); 1597 if (mc_count > priv->multicast_size) { 1598 filter |= cpu_to_le32(RNDIS_PACKET_TYPE_ALL_MULTICAST); 1599 } else if (mc_count) { 1600 int i = 0; 1601 1602 mc_addrs = kmalloc_array(mc_count, ETH_ALEN, GFP_ATOMIC); 1603 if (!mc_addrs) { 1604 netif_addr_unlock_bh(usbdev->net); 1605 return; 1606 } 1607 1608 netdev_for_each_mc_addr(ha, usbdev->net) 1609 memcpy(mc_addrs + i++ * ETH_ALEN, 1610 ha->addr, ETH_ALEN); 1611 } 1612 netif_addr_unlock_bh(usbdev->net); 1613 1614 if (filter != basefilter) 1615 goto set_filter; 1616 1617 if (mc_count) { 1618 ret = rndis_set_oid(usbdev, 1619 RNDIS_OID_802_3_MULTICAST_LIST, 1620 mc_addrs, mc_count * ETH_ALEN); 1621 kfree(mc_addrs); 1622 if (ret == 0) 1623 filter |= cpu_to_le32(RNDIS_PACKET_TYPE_MULTICAST); 1624 else 1625 filter |= cpu_to_le32(RNDIS_PACKET_TYPE_ALL_MULTICAST); 1626 1627 netdev_dbg(usbdev->net, "RNDIS_OID_802_3_MULTICAST_LIST(%d, max: %d) -> %d\n", 1628 mc_count, priv->multicast_size, ret); 1629 } 1630 1631set_filter: 1632 ret = rndis_set_oid(usbdev, RNDIS_OID_GEN_CURRENT_PACKET_FILTER, &filter, 1633 sizeof(filter)); 1634 if (ret < 0) { 1635 netdev_warn(usbdev->net, "couldn't set packet filter: %08x\n", 1636 le32_to_cpu(filter)); 1637 } 1638 1639 netdev_dbg(usbdev->net, "RNDIS_OID_GEN_CURRENT_PACKET_FILTER(%08x) -> %d\n", 1640 le32_to_cpu(filter), ret); 1641} 1642 1643#ifdef DEBUG 1644static void debug_print_pmkids(struct usbnet *usbdev, 1645 struct ndis_80211_pmkid *pmkids, 1646 const char *func_str) 1647{ 1648 struct rndis_wlan_private *priv = get_rndis_wlan_priv(usbdev); 1649 int i, len, count, max_pmkids, entry_len; 1650 1651 max_pmkids = priv->wdev.wiphy->max_num_pmkids; 1652 len = le32_to_cpu(pmkids->length); 1653 count = le32_to_cpu(pmkids->bssid_info_count); 1654 1655 entry_len = (count > 0) ? (len - sizeof(*pmkids)) / count : -1; 1656 1657 netdev_dbg(usbdev->net, "%s(): %d PMKIDs (data len: %d, entry len: " 1658 "%d)\n", func_str, count, len, entry_len); 1659 1660 if (count > max_pmkids) 1661 count = max_pmkids; 1662 1663 for (i = 0; i < count; i++) { 1664 u32 *tmp = (u32 *)pmkids->bssid_info[i].pmkid; 1665 1666 netdev_dbg(usbdev->net, "%s(): bssid: %pM, " 1667 "pmkid: %08X:%08X:%08X:%08X\n", 1668 func_str, pmkids->bssid_info[i].bssid, 1669 cpu_to_be32(tmp[0]), cpu_to_be32(tmp[1]), 1670 cpu_to_be32(tmp[2]), cpu_to_be32(tmp[3])); 1671 } 1672} 1673#else 1674static void debug_print_pmkids(struct usbnet *usbdev, 1675 struct ndis_80211_pmkid *pmkids, 1676 const char *func_str) 1677{ 1678 return; 1679} 1680#endif 1681 1682static struct ndis_80211_pmkid *get_device_pmkids(struct usbnet *usbdev) 1683{ 1684 struct rndis_wlan_private *priv = get_rndis_wlan_priv(usbdev); 1685 struct ndis_80211_pmkid *pmkids; 1686 int len, ret, max_pmkids; 1687 1688 max_pmkids = priv->wdev.wiphy->max_num_pmkids; 1689 len = struct_size(pmkids, bssid_info, max_pmkids); 1690 1691 pmkids = kzalloc(len, GFP_KERNEL); 1692 if (!pmkids) 1693 return ERR_PTR(-ENOMEM); 1694 1695 pmkids->length = cpu_to_le32(len); 1696 pmkids->bssid_info_count = cpu_to_le32(max_pmkids); 1697 1698 ret = rndis_query_oid(usbdev, RNDIS_OID_802_11_PMKID, 1699 pmkids, &len); 1700 if (ret < 0) { 1701 netdev_dbg(usbdev->net, "%s(): RNDIS_OID_802_11_PMKID(%d, %d)" 1702 " -> %d\n", __func__, len, max_pmkids, ret); 1703 1704 kfree(pmkids); 1705 return ERR_PTR(ret); 1706 } 1707 1708 if (le32_to_cpu(pmkids->bssid_info_count) > max_pmkids) 1709 pmkids->bssid_info_count = cpu_to_le32(max_pmkids); 1710 1711 debug_print_pmkids(usbdev, pmkids, __func__); 1712 1713 return pmkids; 1714} 1715 1716static int set_device_pmkids(struct usbnet *usbdev, 1717 struct ndis_80211_pmkid *pmkids) 1718{ 1719 int ret, len, num_pmkids; 1720 1721 num_pmkids = le32_to_cpu(pmkids->bssid_info_count); 1722 len = struct_size(pmkids, bssid_info, num_pmkids); 1723 pmkids->length = cpu_to_le32(len); 1724 1725 debug_print_pmkids(usbdev, pmkids, __func__); 1726 1727 ret = rndis_set_oid(usbdev, RNDIS_OID_802_11_PMKID, pmkids, 1728 le32_to_cpu(pmkids->length)); 1729 if (ret < 0) { 1730 netdev_dbg(usbdev->net, "%s(): RNDIS_OID_802_11_PMKID(%d, %d) -> %d" 1731 "\n", __func__, len, num_pmkids, ret); 1732 } 1733 1734 kfree(pmkids); 1735 return ret; 1736} 1737 1738static struct ndis_80211_pmkid *remove_pmkid(struct usbnet *usbdev, 1739 struct ndis_80211_pmkid *pmkids, 1740 struct cfg80211_pmksa *pmksa, 1741 int max_pmkids) 1742{ 1743 int i, err; 1744 unsigned int count; 1745 1746 count = le32_to_cpu(pmkids->bssid_info_count); 1747 1748 if (count > max_pmkids) 1749 count = max_pmkids; 1750 1751 for (i = 0; i < count; i++) 1752 if (ether_addr_equal(pmkids->bssid_info[i].bssid, 1753 pmksa->bssid)) 1754 break; 1755 1756 /* pmkid not found */ 1757 if (i == count) { 1758 netdev_dbg(usbdev->net, "%s(): bssid not found (%pM)\n", 1759 __func__, pmksa->bssid); 1760 err = -ENOENT; 1761 goto error; 1762 } 1763 1764 for (; i + 1 < count; i++) 1765 pmkids->bssid_info[i] = pmkids->bssid_info[i + 1]; 1766 1767 count--; 1768 pmkids->length = cpu_to_le32(struct_size(pmkids, bssid_info, count)); 1769 pmkids->bssid_info_count = cpu_to_le32(count); 1770 1771 return pmkids; 1772error: 1773 kfree(pmkids); 1774 return ERR_PTR(err); 1775} 1776 1777static struct ndis_80211_pmkid *update_pmkid(struct usbnet *usbdev, 1778 struct ndis_80211_pmkid *pmkids, 1779 struct cfg80211_pmksa *pmksa, 1780 int max_pmkids) 1781{ 1782 struct ndis_80211_pmkid *new_pmkids; 1783 int i, err, newlen; 1784 unsigned int count; 1785 1786 count = le32_to_cpu(pmkids->bssid_info_count); 1787 1788 if (count > max_pmkids) 1789 count = max_pmkids; 1790 1791 /* update with new pmkid */ 1792 for (i = 0; i < count; i++) { 1793 if (!ether_addr_equal(pmkids->bssid_info[i].bssid, 1794 pmksa->bssid)) 1795 continue; 1796 1797 memcpy(pmkids->bssid_info[i].pmkid, pmksa->pmkid, 1798 WLAN_PMKID_LEN); 1799 1800 return pmkids; 1801 } 1802 1803 /* out of space, return error */ 1804 if (i == max_pmkids) { 1805 netdev_dbg(usbdev->net, "%s(): out of space\n", __func__); 1806 err = -ENOSPC; 1807 goto error; 1808 } 1809 1810 /* add new pmkid */ 1811 newlen = struct_size(pmkids, bssid_info, count + 1); 1812 1813 new_pmkids = krealloc(pmkids, newlen, GFP_KERNEL); 1814 if (!new_pmkids) { 1815 err = -ENOMEM; 1816 goto error; 1817 } 1818 pmkids = new_pmkids; 1819 1820 pmkids->length = cpu_to_le32(newlen); 1821 pmkids->bssid_info_count = cpu_to_le32(count + 1); 1822 1823 memcpy(pmkids->bssid_info[count].bssid, pmksa->bssid, ETH_ALEN); 1824 memcpy(pmkids->bssid_info[count].pmkid, pmksa->pmkid, WLAN_PMKID_LEN); 1825 1826 return pmkids; 1827error: 1828 kfree(pmkids); 1829 return ERR_PTR(err); 1830} 1831 1832/* 1833 * cfg80211 ops 1834 */ 1835static int rndis_change_virtual_intf(struct wiphy *wiphy, 1836 struct net_device *dev, 1837 enum nl80211_iftype type, 1838 struct vif_params *params) 1839{ 1840 struct rndis_wlan_private *priv = wiphy_priv(wiphy); 1841 struct usbnet *usbdev = priv->usbdev; 1842 int mode; 1843 1844 switch (type) { 1845 case NL80211_IFTYPE_ADHOC: 1846 mode = NDIS_80211_INFRA_ADHOC; 1847 break; 1848 case NL80211_IFTYPE_STATION: 1849 mode = NDIS_80211_INFRA_INFRA; 1850 break; 1851 default: 1852 return -EINVAL; 1853 } 1854 1855 priv->wdev.iftype = type; 1856 1857 return set_infra_mode(usbdev, mode); 1858} 1859 1860static int rndis_set_wiphy_params(struct wiphy *wiphy, u32 changed) 1861{ 1862 struct rndis_wlan_private *priv = wiphy_priv(wiphy); 1863 struct usbnet *usbdev = priv->usbdev; 1864 int err; 1865 1866 if (changed & WIPHY_PARAM_FRAG_THRESHOLD) { 1867 err = set_frag_threshold(usbdev, wiphy->frag_threshold); 1868 if (err < 0) 1869 return err; 1870 } 1871 1872 if (changed & WIPHY_PARAM_RTS_THRESHOLD) { 1873 err = set_rts_threshold(usbdev, wiphy->rts_threshold); 1874 if (err < 0) 1875 return err; 1876 } 1877 1878 return 0; 1879} 1880 1881static int rndis_set_tx_power(struct wiphy *wiphy, 1882 struct wireless_dev *wdev, 1883 enum nl80211_tx_power_setting type, 1884 int mbm) 1885{ 1886 struct rndis_wlan_private *priv = wiphy_priv(wiphy); 1887 struct usbnet *usbdev = priv->usbdev; 1888 1889 netdev_dbg(usbdev->net, "%s(): type:0x%x mbm:%i\n", 1890 __func__, type, mbm); 1891 1892 if (mbm < 0 || (mbm % 100)) 1893 return -ENOTSUPP; 1894 1895 /* Device doesn't support changing txpower after initialization, only 1896 * turn off/on radio. Support 'auto' mode and setting same dBm that is 1897 * currently used. 1898 */ 1899 if (type == NL80211_TX_POWER_AUTOMATIC || 1900 MBM_TO_DBM(mbm) == get_bcm4320_power_dbm(priv)) { 1901 if (!priv->radio_on) 1902 disassociate(usbdev, true); /* turn on radio */ 1903 1904 return 0; 1905 } 1906 1907 return -ENOTSUPP; 1908} 1909 1910static int rndis_get_tx_power(struct wiphy *wiphy, 1911 struct wireless_dev *wdev, 1912 int *dbm) 1913{ 1914 struct rndis_wlan_private *priv = wiphy_priv(wiphy); 1915 struct usbnet *usbdev = priv->usbdev; 1916 1917 *dbm = get_bcm4320_power_dbm(priv); 1918 1919 netdev_dbg(usbdev->net, "%s(): dbm:%i\n", __func__, *dbm); 1920 1921 return 0; 1922} 1923 1924#define SCAN_DELAY_JIFFIES (6 * HZ) 1925static int rndis_scan(struct wiphy *wiphy, 1926 struct cfg80211_scan_request *request) 1927{ 1928 struct net_device *dev = request->wdev->netdev; 1929 struct usbnet *usbdev = netdev_priv(dev); 1930 struct rndis_wlan_private *priv = get_rndis_wlan_priv(usbdev); 1931 int ret; 1932 int delay = SCAN_DELAY_JIFFIES; 1933 1934 netdev_dbg(usbdev->net, "cfg80211.scan\n"); 1935 1936 /* Get current bssid list from device before new scan, as new scan 1937 * clears internal bssid list. 1938 */ 1939 rndis_check_bssid_list(usbdev, NULL, NULL); 1940 1941 if (priv->scan_request && priv->scan_request != request) 1942 return -EBUSY; 1943 1944 priv->scan_request = request; 1945 1946 ret = rndis_start_bssid_list_scan(usbdev); 1947 if (ret == 0) { 1948 if (priv->device_type == RNDIS_BCM4320A) 1949 delay = HZ; 1950 1951 /* Wait before retrieving scan results from device */ 1952 queue_delayed_work(priv->workqueue, &priv->scan_work, delay); 1953 } 1954 1955 return ret; 1956} 1957 1958static bool rndis_bss_info_update(struct usbnet *usbdev, 1959 struct ndis_80211_bssid_ex *bssid) 1960{ 1961 struct rndis_wlan_private *priv = get_rndis_wlan_priv(usbdev); 1962 struct ieee80211_channel *channel; 1963 struct cfg80211_bss *bss; 1964 s32 signal; 1965 u64 timestamp; 1966 u16 capability; 1967 u16 beacon_interval; 1968 struct ndis_80211_fixed_ies *fixed; 1969 int ie_len, bssid_len; 1970 u8 *ie; 1971 1972 netdev_dbg(usbdev->net, " found bssid: '%.32s' [%pM], len: %d\n", 1973 bssid->ssid.essid, bssid->mac, le32_to_cpu(bssid->length)); 1974 1975 /* parse bssid structure */ 1976 bssid_len = le32_to_cpu(bssid->length); 1977 1978 if (bssid_len < sizeof(struct ndis_80211_bssid_ex) + 1979 sizeof(struct ndis_80211_fixed_ies)) 1980 return NULL; 1981 1982 fixed = (struct ndis_80211_fixed_ies *)bssid->ies; 1983 1984 ie = (void *)(bssid->ies + sizeof(struct ndis_80211_fixed_ies)); 1985 ie_len = min(bssid_len - (int)sizeof(*bssid), 1986 (int)le32_to_cpu(bssid->ie_length)); 1987 ie_len -= sizeof(struct ndis_80211_fixed_ies); 1988 if (ie_len < 0) 1989 return NULL; 1990 1991 /* extract data for cfg80211_inform_bss */ 1992 channel = ieee80211_get_channel(priv->wdev.wiphy, 1993 KHZ_TO_MHZ(le32_to_cpu(bssid->config.ds_config))); 1994 if (!channel) 1995 return NULL; 1996 1997 signal = level_to_qual(le32_to_cpu(bssid->rssi)); 1998 timestamp = le64_to_cpu(*(__le64 *)fixed->timestamp); 1999 capability = le16_to_cpu(fixed->capabilities); 2000 beacon_interval = le16_to_cpu(fixed->beacon_interval); 2001 2002 bss = cfg80211_inform_bss(priv->wdev.wiphy, channel, 2003 CFG80211_BSS_FTYPE_UNKNOWN, bssid->mac, 2004 timestamp, capability, beacon_interval, 2005 ie, ie_len, signal, GFP_KERNEL); 2006 cfg80211_put_bss(priv->wdev.wiphy, bss); 2007 2008 return (bss != NULL); 2009} 2010 2011static struct ndis_80211_bssid_ex *next_bssid_list_item( 2012 struct ndis_80211_bssid_ex *bssid, 2013 int *bssid_len, void *buf, int len) 2014{ 2015 void *buf_end, *bssid_end; 2016 2017 buf_end = (char *)buf + len; 2018 bssid_end = (char *)bssid + *bssid_len; 2019 2020 if ((int)(buf_end - bssid_end) < sizeof(bssid->length)) { 2021 *bssid_len = 0; 2022 return NULL; 2023 } else { 2024 bssid = (void *)((char *)bssid + *bssid_len); 2025 *bssid_len = le32_to_cpu(bssid->length); 2026 return bssid; 2027 } 2028} 2029 2030static bool check_bssid_list_item(struct ndis_80211_bssid_ex *bssid, 2031 int bssid_len, void *buf, int len) 2032{ 2033 void *buf_end, *bssid_end; 2034 2035 if (!bssid || bssid_len <= 0 || bssid_len > len) 2036 return false; 2037 2038 buf_end = (char *)buf + len; 2039 bssid_end = (char *)bssid + bssid_len; 2040 2041 return (int)(buf_end - bssid_end) >= 0 && (int)(bssid_end - buf) >= 0; 2042} 2043 2044static int rndis_check_bssid_list(struct usbnet *usbdev, u8 *match_bssid, 2045 bool *matched) 2046{ 2047 void *buf = NULL; 2048 struct ndis_80211_bssid_list_ex *bssid_list; 2049 struct ndis_80211_bssid_ex *bssid; 2050 int ret = -EINVAL, len, count, bssid_len, real_count, new_len; 2051 2052 netdev_dbg(usbdev->net, "%s()\n", __func__); 2053 2054 len = CONTROL_BUFFER_SIZE; 2055resize_buf: 2056 buf = kzalloc(len, GFP_KERNEL); 2057 if (!buf) { 2058 ret = -ENOMEM; 2059 goto out; 2060 } 2061 2062 /* BSSID-list might have got bigger last time we checked, keep 2063 * resizing until it won't get any bigger. 2064 */ 2065 new_len = len; 2066 ret = rndis_query_oid(usbdev, RNDIS_OID_802_11_BSSID_LIST, 2067 buf, &new_len); 2068 if (ret != 0 || new_len < sizeof(struct ndis_80211_bssid_list_ex)) 2069 goto out; 2070 2071 if (new_len > len) { 2072 len = new_len; 2073 kfree(buf); 2074 goto resize_buf; 2075 } 2076 2077 len = new_len; 2078 2079 bssid_list = buf; 2080 count = le32_to_cpu(bssid_list->num_items); 2081 real_count = 0; 2082 netdev_dbg(usbdev->net, "%s(): buflen: %d\n", __func__, len); 2083 2084 bssid_len = 0; 2085 bssid = next_bssid_list_item(bssid_list->bssid, &bssid_len, buf, len); 2086 2087 /* Device returns incorrect 'num_items'. Workaround by ignoring the 2088 * received 'num_items' and walking through full bssid buffer instead. 2089 */ 2090 while (check_bssid_list_item(bssid, bssid_len, buf, len)) { 2091 if (rndis_bss_info_update(usbdev, bssid) && match_bssid && 2092 matched) { 2093 if (ether_addr_equal(bssid->mac, match_bssid)) 2094 *matched = true; 2095 } 2096 2097 real_count++; 2098 bssid = next_bssid_list_item(bssid, &bssid_len, buf, len); 2099 } 2100 2101 netdev_dbg(usbdev->net, "%s(): num_items from device: %d, really found:" 2102 " %d\n", __func__, count, real_count); 2103 2104out: 2105 kfree(buf); 2106 return ret; 2107} 2108 2109static void rndis_get_scan_results(struct work_struct *work) 2110{ 2111 struct rndis_wlan_private *priv = 2112 container_of(work, struct rndis_wlan_private, scan_work.work); 2113 struct usbnet *usbdev = priv->usbdev; 2114 struct cfg80211_scan_info info = {}; 2115 int ret; 2116 2117 netdev_dbg(usbdev->net, "get_scan_results\n"); 2118 2119 if (!priv->scan_request) 2120 return; 2121 2122 ret = rndis_check_bssid_list(usbdev, NULL, NULL); 2123 2124 info.aborted = ret < 0; 2125 cfg80211_scan_done(priv->scan_request, &info); 2126 2127 priv->scan_request = NULL; 2128} 2129 2130static int rndis_connect(struct wiphy *wiphy, struct net_device *dev, 2131 struct cfg80211_connect_params *sme) 2132{ 2133 struct rndis_wlan_private *priv = wiphy_priv(wiphy); 2134 struct usbnet *usbdev = priv->usbdev; 2135 struct ieee80211_channel *channel = sme->channel; 2136 struct ndis_80211_ssid ssid; 2137 int pairwise = RNDIS_WLAN_ALG_NONE; 2138 int groupwise = RNDIS_WLAN_ALG_NONE; 2139 int keymgmt = RNDIS_WLAN_KEY_MGMT_NONE; 2140 int length, i, ret, chan = -1; 2141 2142 if (channel) 2143 chan = ieee80211_frequency_to_channel(channel->center_freq); 2144 2145 groupwise = rndis_cipher_to_alg(sme->crypto.cipher_group); 2146 for (i = 0; i < sme->crypto.n_ciphers_pairwise; i++) 2147 pairwise |= 2148 rndis_cipher_to_alg(sme->crypto.ciphers_pairwise[i]); 2149 2150 if (sme->crypto.n_ciphers_pairwise > 0 && 2151 pairwise == RNDIS_WLAN_ALG_NONE) { 2152 netdev_err(usbdev->net, "Unsupported pairwise cipher\n"); 2153 return -ENOTSUPP; 2154 } 2155 2156 for (i = 0; i < sme->crypto.n_akm_suites; i++) 2157 keymgmt |= 2158 rndis_akm_suite_to_key_mgmt(sme->crypto.akm_suites[i]); 2159 2160 if (sme->crypto.n_akm_suites > 0 && 2161 keymgmt == RNDIS_WLAN_KEY_MGMT_NONE) { 2162 netdev_err(usbdev->net, "Invalid keymgmt\n"); 2163 return -ENOTSUPP; 2164 } 2165 2166 netdev_dbg(usbdev->net, "cfg80211.connect('%.32s':[%pM]:%d:[%d,0x%x:0x%x]:[0x%x:0x%x]:0x%x)\n", 2167 sme->ssid, sme->bssid, chan, 2168 sme->privacy, sme->crypto.wpa_versions, sme->auth_type, 2169 groupwise, pairwise, keymgmt); 2170 2171 if (is_associated(usbdev)) 2172 disassociate(usbdev, false); 2173 2174 ret = set_infra_mode(usbdev, NDIS_80211_INFRA_INFRA); 2175 if (ret < 0) { 2176 netdev_dbg(usbdev->net, "connect: set_infra_mode failed, %d\n", 2177 ret); 2178 goto err_turn_radio_on; 2179 } 2180 2181 ret = set_auth_mode(usbdev, sme->crypto.wpa_versions, sme->auth_type, 2182 keymgmt); 2183 if (ret < 0) { 2184 netdev_dbg(usbdev->net, "connect: set_auth_mode failed, %d\n", 2185 ret); 2186 goto err_turn_radio_on; 2187 } 2188 2189 set_priv_filter(usbdev); 2190 2191 ret = set_encr_mode(usbdev, pairwise, groupwise); 2192 if (ret < 0) { 2193 netdev_dbg(usbdev->net, "connect: set_encr_mode failed, %d\n", 2194 ret); 2195 goto err_turn_radio_on; 2196 } 2197 2198 if (channel) { 2199 ret = set_channel(usbdev, chan); 2200 if (ret < 0) { 2201 netdev_dbg(usbdev->net, "connect: set_channel failed, %d\n", 2202 ret); 2203 goto err_turn_radio_on; 2204 } 2205 } 2206 2207 if (sme->key && ((groupwise | pairwise) & RNDIS_WLAN_ALG_WEP)) { 2208 priv->encr_tx_key_index = sme->key_idx; 2209 ret = add_wep_key(usbdev, sme->key, sme->key_len, sme->key_idx); 2210 if (ret < 0) { 2211 netdev_dbg(usbdev->net, "connect: add_wep_key failed, %d (%d, %d)\n", 2212 ret, sme->key_len, sme->key_idx); 2213 goto err_turn_radio_on; 2214 } 2215 } 2216 2217 if (sme->bssid && !is_zero_ether_addr(sme->bssid) && 2218 !is_broadcast_ether_addr(sme->bssid)) { 2219 ret = set_bssid(usbdev, sme->bssid); 2220 if (ret < 0) { 2221 netdev_dbg(usbdev->net, "connect: set_bssid failed, %d\n", 2222 ret); 2223 goto err_turn_radio_on; 2224 } 2225 } else 2226 clear_bssid(usbdev); 2227 2228 length = sme->ssid_len; 2229 if (length > NDIS_802_11_LENGTH_SSID) 2230 length = NDIS_802_11_LENGTH_SSID; 2231 2232 memset(&ssid, 0, sizeof(ssid)); 2233 ssid.length = cpu_to_le32(length); 2234 memcpy(ssid.essid, sme->ssid, length); 2235 2236 /* Pause and purge rx queue, so we don't pass packets before 2237 * 'media connect'-indication. 2238 */ 2239 usbnet_pause_rx(usbdev); 2240 usbnet_purge_paused_rxq(usbdev); 2241 2242 ret = set_essid(usbdev, &ssid); 2243 if (ret < 0) 2244 netdev_dbg(usbdev->net, "connect: set_essid failed, %d\n", ret); 2245 return ret; 2246 2247err_turn_radio_on: 2248 disassociate(usbdev, true); 2249 2250 return ret; 2251} 2252 2253static int rndis_disconnect(struct wiphy *wiphy, struct net_device *dev, 2254 u16 reason_code) 2255{ 2256 struct rndis_wlan_private *priv = wiphy_priv(wiphy); 2257 struct usbnet *usbdev = priv->usbdev; 2258 2259 netdev_dbg(usbdev->net, "cfg80211.disconnect(%d)\n", reason_code); 2260 2261 priv->connected = false; 2262 eth_zero_addr(priv->bssid); 2263 2264 return deauthenticate(usbdev); 2265} 2266 2267static int rndis_join_ibss(struct wiphy *wiphy, struct net_device *dev, 2268 struct cfg80211_ibss_params *params) 2269{ 2270 struct rndis_wlan_private *priv = wiphy_priv(wiphy); 2271 struct usbnet *usbdev = priv->usbdev; 2272 struct ieee80211_channel *channel = params->chandef.chan; 2273 struct ndis_80211_ssid ssid; 2274 enum nl80211_auth_type auth_type; 2275 int ret, alg, length, chan = -1; 2276 2277 if (channel) 2278 chan = ieee80211_frequency_to_channel(channel->center_freq); 2279 2280 /* TODO: How to handle ad-hoc encryption? 2281 * connect() has *key, join_ibss() doesn't. RNDIS requires key to be 2282 * pre-shared for encryption (open/shared/wpa), is key set before 2283 * join_ibss? Which auth_type to use (not in params)? What about WPA? 2284 */ 2285 if (params->privacy) { 2286 auth_type = NL80211_AUTHTYPE_SHARED_KEY; 2287 alg = RNDIS_WLAN_ALG_WEP; 2288 } else { 2289 auth_type = NL80211_AUTHTYPE_OPEN_SYSTEM; 2290 alg = RNDIS_WLAN_ALG_NONE; 2291 } 2292 2293 netdev_dbg(usbdev->net, "cfg80211.join_ibss('%.32s':[%pM]:%d:%d)\n", 2294 params->ssid, params->bssid, chan, params->privacy); 2295 2296 if (is_associated(usbdev)) 2297 disassociate(usbdev, false); 2298 2299 ret = set_infra_mode(usbdev, NDIS_80211_INFRA_ADHOC); 2300 if (ret < 0) { 2301 netdev_dbg(usbdev->net, "join_ibss: set_infra_mode failed, %d\n", 2302 ret); 2303 goto err_turn_radio_on; 2304 } 2305 2306 ret = set_auth_mode(usbdev, 0, auth_type, RNDIS_WLAN_KEY_MGMT_NONE); 2307 if (ret < 0) { 2308 netdev_dbg(usbdev->net, "join_ibss: set_auth_mode failed, %d\n", 2309 ret); 2310 goto err_turn_radio_on; 2311 } 2312 2313 set_priv_filter(usbdev); 2314 2315 ret = set_encr_mode(usbdev, alg, RNDIS_WLAN_ALG_NONE); 2316 if (ret < 0) { 2317 netdev_dbg(usbdev->net, "join_ibss: set_encr_mode failed, %d\n", 2318 ret); 2319 goto err_turn_radio_on; 2320 } 2321 2322 if (channel) { 2323 ret = set_channel(usbdev, chan); 2324 if (ret < 0) { 2325 netdev_dbg(usbdev->net, "join_ibss: set_channel failed, %d\n", 2326 ret); 2327 goto err_turn_radio_on; 2328 } 2329 } 2330 2331 if (params->bssid && !is_zero_ether_addr(params->bssid) && 2332 !is_broadcast_ether_addr(params->bssid)) { 2333 ret = set_bssid(usbdev, params->bssid); 2334 if (ret < 0) { 2335 netdev_dbg(usbdev->net, "join_ibss: set_bssid failed, %d\n", 2336 ret); 2337 goto err_turn_radio_on; 2338 } 2339 } else 2340 clear_bssid(usbdev); 2341 2342 length = params->ssid_len; 2343 if (length > NDIS_802_11_LENGTH_SSID) 2344 length = NDIS_802_11_LENGTH_SSID; 2345 2346 memset(&ssid, 0, sizeof(ssid)); 2347 ssid.length = cpu_to_le32(length); 2348 memcpy(ssid.essid, params->ssid, length); 2349 2350 /* Don't need to pause rx queue for ad-hoc. */ 2351 usbnet_purge_paused_rxq(usbdev); 2352 usbnet_resume_rx(usbdev); 2353 2354 ret = set_essid(usbdev, &ssid); 2355 if (ret < 0) 2356 netdev_dbg(usbdev->net, "join_ibss: set_essid failed, %d\n", 2357 ret); 2358 return ret; 2359 2360err_turn_radio_on: 2361 disassociate(usbdev, true); 2362 2363 return ret; 2364} 2365 2366static int rndis_leave_ibss(struct wiphy *wiphy, struct net_device *dev) 2367{ 2368 struct rndis_wlan_private *priv = wiphy_priv(wiphy); 2369 struct usbnet *usbdev = priv->usbdev; 2370 2371 netdev_dbg(usbdev->net, "cfg80211.leave_ibss()\n"); 2372 2373 priv->connected = false; 2374 eth_zero_addr(priv->bssid); 2375 2376 return deauthenticate(usbdev); 2377} 2378 2379static int rndis_add_key(struct wiphy *wiphy, struct net_device *netdev, 2380 u8 key_index, bool pairwise, const u8 *mac_addr, 2381 struct key_params *params) 2382{ 2383 struct rndis_wlan_private *priv = wiphy_priv(wiphy); 2384 struct usbnet *usbdev = priv->usbdev; 2385 __le32 flags; 2386 2387 netdev_dbg(usbdev->net, "%s(%i, %pM, %08x)\n", 2388 __func__, key_index, mac_addr, params->cipher); 2389 2390 switch (params->cipher) { 2391 case WLAN_CIPHER_SUITE_WEP40: 2392 case WLAN_CIPHER_SUITE_WEP104: 2393 return add_wep_key(usbdev, params->key, params->key_len, 2394 key_index); 2395 case WLAN_CIPHER_SUITE_TKIP: 2396 case WLAN_CIPHER_SUITE_CCMP: 2397 flags = 0; 2398 2399 if (params->seq && params->seq_len > 0) 2400 flags |= NDIS_80211_ADDKEY_SET_INIT_RECV_SEQ; 2401 if (mac_addr) 2402 flags |= NDIS_80211_ADDKEY_PAIRWISE_KEY | 2403 NDIS_80211_ADDKEY_TRANSMIT_KEY; 2404 2405 return add_wpa_key(usbdev, params->key, params->key_len, 2406 key_index, mac_addr, params->seq, 2407 params->seq_len, params->cipher, flags); 2408 default: 2409 netdev_dbg(usbdev->net, "%s(): unsupported cipher %08x\n", 2410 __func__, params->cipher); 2411 return -ENOTSUPP; 2412 } 2413} 2414 2415static int rndis_del_key(struct wiphy *wiphy, struct net_device *netdev, 2416 u8 key_index, bool pairwise, const u8 *mac_addr) 2417{ 2418 struct rndis_wlan_private *priv = wiphy_priv(wiphy); 2419 struct usbnet *usbdev = priv->usbdev; 2420 2421 netdev_dbg(usbdev->net, "%s(%i, %pM)\n", __func__, key_index, mac_addr); 2422 2423 return remove_key(usbdev, key_index, mac_addr); 2424} 2425 2426static int rndis_set_default_key(struct wiphy *wiphy, struct net_device *netdev, 2427 u8 key_index, bool unicast, bool multicast) 2428{ 2429 struct rndis_wlan_private *priv = wiphy_priv(wiphy); 2430 struct usbnet *usbdev = priv->usbdev; 2431 struct rndis_wlan_encr_key key; 2432 2433 netdev_dbg(usbdev->net, "%s(%i)\n", __func__, key_index); 2434 2435 if (key_index >= RNDIS_WLAN_NUM_KEYS) 2436 return -ENOENT; 2437 2438 priv->encr_tx_key_index = key_index; 2439 2440 if (is_wpa_key(priv, key_index)) 2441 return 0; 2442 2443 key = priv->encr_keys[key_index]; 2444 2445 return add_wep_key(usbdev, key.material, key.len, key_index); 2446} 2447 2448static void rndis_fill_station_info(struct usbnet *usbdev, 2449 struct station_info *sinfo) 2450{ 2451 __le32 linkspeed, rssi; 2452 int ret, len; 2453 2454 memset(sinfo, 0, sizeof(*sinfo)); 2455 2456 len = sizeof(linkspeed); 2457 ret = rndis_query_oid(usbdev, RNDIS_OID_GEN_LINK_SPEED, &linkspeed, &len); 2458 if (ret == 0) { 2459 sinfo->txrate.legacy = le32_to_cpu(linkspeed) / 1000; 2460 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_BITRATE); 2461 } 2462 2463 len = sizeof(rssi); 2464 ret = rndis_query_oid(usbdev, RNDIS_OID_802_11_RSSI, 2465 &rssi, &len); 2466 if (ret == 0) { 2467 sinfo->signal = level_to_qual(le32_to_cpu(rssi)); 2468 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_SIGNAL); 2469 } 2470} 2471 2472static int rndis_get_station(struct wiphy *wiphy, struct net_device *dev, 2473 const u8 *mac, struct station_info *sinfo) 2474{ 2475 struct rndis_wlan_private *priv = wiphy_priv(wiphy); 2476 struct usbnet *usbdev = priv->usbdev; 2477 2478 if (!ether_addr_equal(priv->bssid, mac)) 2479 return -ENOENT; 2480 2481 rndis_fill_station_info(usbdev, sinfo); 2482 2483 return 0; 2484} 2485 2486static int rndis_dump_station(struct wiphy *wiphy, struct net_device *dev, 2487 int idx, u8 *mac, struct station_info *sinfo) 2488{ 2489 struct rndis_wlan_private *priv = wiphy_priv(wiphy); 2490 struct usbnet *usbdev = priv->usbdev; 2491 2492 if (idx != 0) 2493 return -ENOENT; 2494 2495 memcpy(mac, priv->bssid, ETH_ALEN); 2496 2497 rndis_fill_station_info(usbdev, sinfo); 2498 2499 return 0; 2500} 2501 2502static int rndis_set_pmksa(struct wiphy *wiphy, struct net_device *netdev, 2503 struct cfg80211_pmksa *pmksa) 2504{ 2505 struct rndis_wlan_private *priv = wiphy_priv(wiphy); 2506 struct usbnet *usbdev = priv->usbdev; 2507 struct ndis_80211_pmkid *pmkids; 2508 u32 *tmp = (u32 *)pmksa->pmkid; 2509 2510 netdev_dbg(usbdev->net, "%s(%pM, %08X:%08X:%08X:%08X)\n", __func__, 2511 pmksa->bssid, 2512 cpu_to_be32(tmp[0]), cpu_to_be32(tmp[1]), 2513 cpu_to_be32(tmp[2]), cpu_to_be32(tmp[3])); 2514 2515 pmkids = get_device_pmkids(usbdev); 2516 if (IS_ERR(pmkids)) { 2517 /* couldn't read PMKID cache from device */ 2518 return PTR_ERR(pmkids); 2519 } 2520 2521 pmkids = update_pmkid(usbdev, pmkids, pmksa, wiphy->max_num_pmkids); 2522 if (IS_ERR(pmkids)) { 2523 /* not found, list full, etc */ 2524 return PTR_ERR(pmkids); 2525 } 2526 2527 return set_device_pmkids(usbdev, pmkids); 2528} 2529 2530static int rndis_del_pmksa(struct wiphy *wiphy, struct net_device *netdev, 2531 struct cfg80211_pmksa *pmksa) 2532{ 2533 struct rndis_wlan_private *priv = wiphy_priv(wiphy); 2534 struct usbnet *usbdev = priv->usbdev; 2535 struct ndis_80211_pmkid *pmkids; 2536 u32 *tmp = (u32 *)pmksa->pmkid; 2537 2538 netdev_dbg(usbdev->net, "%s(%pM, %08X:%08X:%08X:%08X)\n", __func__, 2539 pmksa->bssid, 2540 cpu_to_be32(tmp[0]), cpu_to_be32(tmp[1]), 2541 cpu_to_be32(tmp[2]), cpu_to_be32(tmp[3])); 2542 2543 pmkids = get_device_pmkids(usbdev); 2544 if (IS_ERR(pmkids)) { 2545 /* Couldn't read PMKID cache from device */ 2546 return PTR_ERR(pmkids); 2547 } 2548 2549 pmkids = remove_pmkid(usbdev, pmkids, pmksa, wiphy->max_num_pmkids); 2550 if (IS_ERR(pmkids)) { 2551 /* not found, etc */ 2552 return PTR_ERR(pmkids); 2553 } 2554 2555 return set_device_pmkids(usbdev, pmkids); 2556} 2557 2558static int rndis_flush_pmksa(struct wiphy *wiphy, struct net_device *netdev) 2559{ 2560 struct rndis_wlan_private *priv = wiphy_priv(wiphy); 2561 struct usbnet *usbdev = priv->usbdev; 2562 struct ndis_80211_pmkid pmkid; 2563 2564 netdev_dbg(usbdev->net, "%s()\n", __func__); 2565 2566 memset(&pmkid, 0, sizeof(pmkid)); 2567 2568 pmkid.length = cpu_to_le32(sizeof(pmkid)); 2569 pmkid.bssid_info_count = cpu_to_le32(0); 2570 2571 return rndis_set_oid(usbdev, RNDIS_OID_802_11_PMKID, 2572 &pmkid, sizeof(pmkid)); 2573} 2574 2575static int rndis_set_power_mgmt(struct wiphy *wiphy, struct net_device *dev, 2576 bool enabled, int timeout) 2577{ 2578 struct rndis_wlan_private *priv = wiphy_priv(wiphy); 2579 struct usbnet *usbdev = priv->usbdev; 2580 int power_mode; 2581 __le32 mode; 2582 int ret; 2583 2584 if (priv->device_type != RNDIS_BCM4320B) 2585 return -ENOTSUPP; 2586 2587 netdev_dbg(usbdev->net, "%s(): %s, %d\n", __func__, 2588 enabled ? "enabled" : "disabled", 2589 timeout); 2590 2591 if (enabled) 2592 power_mode = NDIS_80211_POWER_MODE_FAST_PSP; 2593 else 2594 power_mode = NDIS_80211_POWER_MODE_CAM; 2595 2596 if (power_mode == priv->power_mode) 2597 return 0; 2598 2599 priv->power_mode = power_mode; 2600 2601 mode = cpu_to_le32(power_mode); 2602 ret = rndis_set_oid(usbdev, RNDIS_OID_802_11_POWER_MODE, 2603 &mode, sizeof(mode)); 2604 2605 netdev_dbg(usbdev->net, "%s(): RNDIS_OID_802_11_POWER_MODE -> %d\n", 2606 __func__, ret); 2607 2608 return ret; 2609} 2610 2611static int rndis_set_cqm_rssi_config(struct wiphy *wiphy, 2612 struct net_device *dev, 2613 s32 rssi_thold, u32 rssi_hyst) 2614{ 2615 struct rndis_wlan_private *priv = wiphy_priv(wiphy); 2616 2617 priv->cqm_rssi_thold = rssi_thold; 2618 priv->cqm_rssi_hyst = rssi_hyst; 2619 priv->last_cqm_event_rssi = 0; 2620 2621 return 0; 2622} 2623 2624static void rndis_wlan_craft_connected_bss(struct usbnet *usbdev, u8 *bssid, 2625 struct ndis_80211_assoc_info *info) 2626{ 2627 struct rndis_wlan_private *priv = get_rndis_wlan_priv(usbdev); 2628 struct ieee80211_channel *channel; 2629 struct ndis_80211_ssid ssid; 2630 struct cfg80211_bss *bss; 2631 s32 signal; 2632 u64 timestamp; 2633 u16 capability; 2634 u32 beacon_period = 0; 2635 __le32 rssi; 2636 u8 ie_buf[34]; 2637 int len, ret, ie_len; 2638 2639 /* Get signal quality, in case of error use rssi=0 and ignore error. */ 2640 len = sizeof(rssi); 2641 rssi = 0; 2642 ret = rndis_query_oid(usbdev, RNDIS_OID_802_11_RSSI, 2643 &rssi, &len); 2644 signal = level_to_qual(le32_to_cpu(rssi)); 2645 2646 netdev_dbg(usbdev->net, "%s(): RNDIS_OID_802_11_RSSI -> %d, " 2647 "rssi:%d, qual: %d\n", __func__, ret, le32_to_cpu(rssi), 2648 level_to_qual(le32_to_cpu(rssi))); 2649 2650 /* Get AP capabilities */ 2651 if (info) { 2652 capability = le16_to_cpu(info->resp_ie.capa); 2653 } else { 2654 /* Set atleast ESS/IBSS capability */ 2655 capability = (priv->infra_mode == NDIS_80211_INFRA_INFRA) ? 2656 WLAN_CAPABILITY_ESS : WLAN_CAPABILITY_IBSS; 2657 } 2658 2659 /* Get channel and beacon interval */ 2660 channel = get_current_channel(usbdev, &beacon_period); 2661 if (!channel) { 2662 netdev_warn(usbdev->net, "%s(): could not get channel.\n", 2663 __func__); 2664 return; 2665 } 2666 2667 /* Get SSID, in case of error, use zero length SSID and ignore error. */ 2668 len = sizeof(ssid); 2669 memset(&ssid, 0, sizeof(ssid)); 2670 ret = rndis_query_oid(usbdev, RNDIS_OID_802_11_SSID, 2671 &ssid, &len); 2672 netdev_dbg(usbdev->net, "%s(): RNDIS_OID_802_11_SSID -> %d, len: %d, ssid: " 2673 "'%.32s'\n", __func__, ret, 2674 le32_to_cpu(ssid.length), ssid.essid); 2675 2676 if (le32_to_cpu(ssid.length) > 32) 2677 ssid.length = cpu_to_le32(32); 2678 2679 ie_buf[0] = WLAN_EID_SSID; 2680 ie_buf[1] = le32_to_cpu(ssid.length); 2681 memcpy(&ie_buf[2], ssid.essid, le32_to_cpu(ssid.length)); 2682 2683 ie_len = le32_to_cpu(ssid.length) + 2; 2684 2685 /* no tsf */ 2686 timestamp = 0; 2687 2688 netdev_dbg(usbdev->net, "%s(): channel:%d(freq), bssid:[%pM], tsf:%d, " 2689 "capa:%x, beacon int:%d, resp_ie(len:%d, essid:'%.32s'), " 2690 "signal:%d\n", __func__, (channel ? channel->center_freq : -1), 2691 bssid, (u32)timestamp, capability, beacon_period, ie_len, 2692 ssid.essid, signal); 2693 2694 bss = cfg80211_inform_bss(priv->wdev.wiphy, channel, 2695 CFG80211_BSS_FTYPE_UNKNOWN, bssid, 2696 timestamp, capability, beacon_period, 2697 ie_buf, ie_len, signal, GFP_KERNEL); 2698 cfg80211_put_bss(priv->wdev.wiphy, bss); 2699} 2700 2701/* 2702 * workers, indication handlers, device poller 2703 */ 2704static void rndis_wlan_do_link_up_work(struct usbnet *usbdev) 2705{ 2706 struct rndis_wlan_private *priv = get_rndis_wlan_priv(usbdev); 2707 struct ndis_80211_assoc_info *info = NULL; 2708 u8 bssid[ETH_ALEN]; 2709 unsigned int resp_ie_len, req_ie_len; 2710 unsigned int offset; 2711 u8 *req_ie, *resp_ie; 2712 int ret; 2713 bool roamed = false; 2714 bool match_bss; 2715 2716 if (priv->infra_mode == NDIS_80211_INFRA_INFRA && priv->connected) { 2717 /* received media connect indication while connected, either 2718 * device reassociated with same AP or roamed to new. */ 2719 roamed = true; 2720 } 2721 2722 req_ie_len = 0; 2723 resp_ie_len = 0; 2724 req_ie = NULL; 2725 resp_ie = NULL; 2726 2727 if (priv->infra_mode == NDIS_80211_INFRA_INFRA) { 2728 info = kzalloc(CONTROL_BUFFER_SIZE, GFP_KERNEL); 2729 if (!info) { 2730 /* No memory? Try resume work later */ 2731 set_bit(WORK_LINK_UP, &priv->work_pending); 2732 queue_work(priv->workqueue, &priv->work); 2733 return; 2734 } 2735 2736 /* Get association info IEs from device. */ 2737 ret = get_association_info(usbdev, info, CONTROL_BUFFER_SIZE); 2738 if (!ret) { 2739 req_ie_len = le32_to_cpu(info->req_ie_length); 2740 if (req_ie_len > CONTROL_BUFFER_SIZE) 2741 req_ie_len = CONTROL_BUFFER_SIZE; 2742 if (req_ie_len != 0) { 2743 offset = le32_to_cpu(info->offset_req_ies); 2744 2745 if (offset > CONTROL_BUFFER_SIZE) 2746 offset = CONTROL_BUFFER_SIZE; 2747 2748 req_ie = (u8 *)info + offset; 2749 2750 if (offset + req_ie_len > CONTROL_BUFFER_SIZE) 2751 req_ie_len = 2752 CONTROL_BUFFER_SIZE - offset; 2753 } 2754 2755 resp_ie_len = le32_to_cpu(info->resp_ie_length); 2756 if (resp_ie_len > CONTROL_BUFFER_SIZE) 2757 resp_ie_len = CONTROL_BUFFER_SIZE; 2758 if (resp_ie_len != 0) { 2759 offset = le32_to_cpu(info->offset_resp_ies); 2760 2761 if (offset > CONTROL_BUFFER_SIZE) 2762 offset = CONTROL_BUFFER_SIZE; 2763 2764 resp_ie = (u8 *)info + offset; 2765 2766 if (offset + resp_ie_len > CONTROL_BUFFER_SIZE) 2767 resp_ie_len = 2768 CONTROL_BUFFER_SIZE - offset; 2769 } 2770 } else { 2771 /* Since rndis_wlan_craft_connected_bss() might use info 2772 * later and expects info to contain valid data if 2773 * non-null, free info and set NULL here. 2774 */ 2775 kfree(info); 2776 info = NULL; 2777 } 2778 } else if (WARN_ON(priv->infra_mode != NDIS_80211_INFRA_ADHOC)) 2779 return; 2780 2781 ret = get_bssid(usbdev, bssid); 2782 if (ret < 0) 2783 memset(bssid, 0, sizeof(bssid)); 2784 2785 netdev_dbg(usbdev->net, "link up work: [%pM]%s\n", 2786 bssid, roamed ? " roamed" : ""); 2787 2788 /* Internal bss list in device should contain at least the currently 2789 * connected bss and we can get it to cfg80211 with 2790 * rndis_check_bssid_list(). 2791 * 2792 * NDIS spec says: "If the device is associated, but the associated 2793 * BSSID is not in its BSSID scan list, then the driver must add an 2794 * entry for the BSSID at the end of the data that it returns in 2795 * response to query of RNDIS_OID_802_11_BSSID_LIST." 2796 * 2797 * NOTE: Seems to be true for BCM4320b variant, but not BCM4320a. 2798 */ 2799 match_bss = false; 2800 rndis_check_bssid_list(usbdev, bssid, &match_bss); 2801 2802 if (!is_zero_ether_addr(bssid) && !match_bss) { 2803 /* Couldn't get bss from device, we need to manually craft bss 2804 * for cfg80211. 2805 */ 2806 rndis_wlan_craft_connected_bss(usbdev, bssid, info); 2807 } 2808 2809 if (priv->infra_mode == NDIS_80211_INFRA_INFRA) { 2810 if (!roamed) { 2811 cfg80211_connect_result(usbdev->net, bssid, req_ie, 2812 req_ie_len, resp_ie, 2813 resp_ie_len, 0, GFP_KERNEL); 2814 } else { 2815 struct cfg80211_roam_info roam_info = { 2816 .channel = get_current_channel(usbdev, NULL), 2817 .bssid = bssid, 2818 .req_ie = req_ie, 2819 .req_ie_len = req_ie_len, 2820 .resp_ie = resp_ie, 2821 .resp_ie_len = resp_ie_len, 2822 }; 2823 2824 cfg80211_roamed(usbdev->net, &roam_info, GFP_KERNEL); 2825 } 2826 } else if (priv->infra_mode == NDIS_80211_INFRA_ADHOC) 2827 cfg80211_ibss_joined(usbdev->net, bssid, 2828 get_current_channel(usbdev, NULL), 2829 GFP_KERNEL); 2830 2831 kfree(info); 2832 2833 priv->connected = true; 2834 memcpy(priv->bssid, bssid, ETH_ALEN); 2835 2836 usbnet_resume_rx(usbdev); 2837 netif_carrier_on(usbdev->net); 2838} 2839 2840static void rndis_wlan_do_link_down_work(struct usbnet *usbdev) 2841{ 2842 struct rndis_wlan_private *priv = get_rndis_wlan_priv(usbdev); 2843 2844 if (priv->connected) { 2845 priv->connected = false; 2846 eth_zero_addr(priv->bssid); 2847 2848 deauthenticate(usbdev); 2849 2850 cfg80211_disconnected(usbdev->net, 0, NULL, 0, true, GFP_KERNEL); 2851 } 2852 2853 netif_carrier_off(usbdev->net); 2854} 2855 2856static void rndis_wlan_worker(struct work_struct *work) 2857{ 2858 struct rndis_wlan_private *priv = 2859 container_of(work, struct rndis_wlan_private, work); 2860 struct usbnet *usbdev = priv->usbdev; 2861 2862 if (test_and_clear_bit(WORK_LINK_UP, &priv->work_pending)) 2863 rndis_wlan_do_link_up_work(usbdev); 2864 2865 if (test_and_clear_bit(WORK_LINK_DOWN, &priv->work_pending)) 2866 rndis_wlan_do_link_down_work(usbdev); 2867 2868 if (test_and_clear_bit(WORK_SET_MULTICAST_LIST, &priv->work_pending)) 2869 set_multicast_list(usbdev); 2870} 2871 2872static void rndis_wlan_set_multicast_list(struct net_device *dev) 2873{ 2874 struct usbnet *usbdev = netdev_priv(dev); 2875 struct rndis_wlan_private *priv = get_rndis_wlan_priv(usbdev); 2876 2877 if (test_bit(WORK_SET_MULTICAST_LIST, &priv->work_pending)) 2878 return; 2879 2880 set_bit(WORK_SET_MULTICAST_LIST, &priv->work_pending); 2881 queue_work(priv->workqueue, &priv->work); 2882} 2883 2884static void rndis_wlan_auth_indication(struct usbnet *usbdev, 2885 struct ndis_80211_status_indication *indication, 2886 int len) 2887{ 2888 u8 *buf; 2889 const char *type; 2890 int flags, buflen, key_id; 2891 bool pairwise_error, group_error; 2892 struct ndis_80211_auth_request *auth_req; 2893 enum nl80211_key_type key_type; 2894 2895 /* must have at least one array entry */ 2896 if (len < offsetof(struct ndis_80211_status_indication, u) + 2897 sizeof(struct ndis_80211_auth_request)) { 2898 netdev_info(usbdev->net, "authentication indication: too short message (%i)\n", 2899 len); 2900 return; 2901 } 2902 2903 buf = (void *)&indication->u.auth_request[0]; 2904 buflen = len - offsetof(struct ndis_80211_status_indication, u); 2905 2906 while (buflen >= sizeof(*auth_req)) { 2907 auth_req = (void *)buf; 2908 if (buflen < le32_to_cpu(auth_req->length)) 2909 return; 2910 type = "unknown"; 2911 flags = le32_to_cpu(auth_req->flags); 2912 pairwise_error = false; 2913 group_error = false; 2914 2915 if (flags & 0x1) 2916 type = "reauth request"; 2917 if (flags & 0x2) 2918 type = "key update request"; 2919 if (flags & 0x6) { 2920 pairwise_error = true; 2921 type = "pairwise_error"; 2922 } 2923 if (flags & 0xe) { 2924 group_error = true; 2925 type = "group_error"; 2926 } 2927 2928 netdev_info(usbdev->net, "authentication indication: %s (0x%08x)\n", 2929 type, le32_to_cpu(auth_req->flags)); 2930 2931 if (pairwise_error) { 2932 key_type = NL80211_KEYTYPE_PAIRWISE; 2933 key_id = -1; 2934 2935 cfg80211_michael_mic_failure(usbdev->net, 2936 auth_req->bssid, 2937 key_type, key_id, NULL, 2938 GFP_KERNEL); 2939 } 2940 2941 if (group_error) { 2942 key_type = NL80211_KEYTYPE_GROUP; 2943 key_id = -1; 2944 2945 cfg80211_michael_mic_failure(usbdev->net, 2946 auth_req->bssid, 2947 key_type, key_id, NULL, 2948 GFP_KERNEL); 2949 } 2950 2951 buflen -= le32_to_cpu(auth_req->length); 2952 buf += le32_to_cpu(auth_req->length); 2953 } 2954} 2955 2956static void rndis_wlan_pmkid_cand_list_indication(struct usbnet *usbdev, 2957 struct ndis_80211_status_indication *indication, 2958 int len) 2959{ 2960 struct ndis_80211_pmkid_cand_list *cand_list; 2961 int list_len, expected_len, i; 2962 2963 if (len < offsetof(struct ndis_80211_status_indication, u) + 2964 sizeof(struct ndis_80211_pmkid_cand_list)) { 2965 netdev_info(usbdev->net, "pmkid candidate list indication: too short message (%i)\n", 2966 len); 2967 return; 2968 } 2969 2970 list_len = le32_to_cpu(indication->u.cand_list.num_candidates) * 2971 sizeof(struct ndis_80211_pmkid_candidate); 2972 expected_len = sizeof(struct ndis_80211_pmkid_cand_list) + list_len + 2973 offsetof(struct ndis_80211_status_indication, u); 2974 2975 if (len < expected_len) { 2976 netdev_info(usbdev->net, "pmkid candidate list indication: list larger than buffer (%i < %i)\n", 2977 len, expected_len); 2978 return; 2979 } 2980 2981 cand_list = &indication->u.cand_list; 2982 2983 netdev_info(usbdev->net, "pmkid candidate list indication: version %i, candidates %i\n", 2984 le32_to_cpu(cand_list->version), 2985 le32_to_cpu(cand_list->num_candidates)); 2986 2987 if (le32_to_cpu(cand_list->version) != 1) 2988 return; 2989 2990 for (i = 0; i < le32_to_cpu(cand_list->num_candidates); i++) { 2991 struct ndis_80211_pmkid_candidate *cand = 2992 &cand_list->candidate_list[i]; 2993 bool preauth = !!(cand->flags & NDIS_80211_PMKID_CAND_PREAUTH); 2994 2995 netdev_dbg(usbdev->net, "cand[%i]: flags: 0x%08x, preauth: %d, bssid: %pM\n", 2996 i, le32_to_cpu(cand->flags), preauth, cand->bssid); 2997 2998 cfg80211_pmksa_candidate_notify(usbdev->net, i, cand->bssid, 2999 preauth, GFP_ATOMIC); 3000 } 3001} 3002 3003static void rndis_wlan_media_specific_indication(struct usbnet *usbdev, 3004 struct rndis_indicate *msg, int buflen) 3005{ 3006 struct ndis_80211_status_indication *indication; 3007 unsigned int len, offset; 3008 3009 offset = offsetof(struct rndis_indicate, status) + 3010 le32_to_cpu(msg->offset); 3011 len = le32_to_cpu(msg->length); 3012 3013 if (len < 8) { 3014 netdev_info(usbdev->net, "media specific indication, ignore too short message (%i < 8)\n", 3015 len); 3016 return; 3017 } 3018 3019 if (len > buflen || offset > buflen || offset + len > buflen) { 3020 netdev_info(usbdev->net, "media specific indication, too large to fit to buffer (%i > %i)\n", 3021 offset + len, buflen); 3022 return; 3023 } 3024 3025 indication = (void *)((u8 *)msg + offset); 3026 3027 switch (le32_to_cpu(indication->status_type)) { 3028 case NDIS_80211_STATUSTYPE_RADIOSTATE: 3029 netdev_info(usbdev->net, "radio state indication: %i\n", 3030 le32_to_cpu(indication->u.radio_status)); 3031 return; 3032 3033 case NDIS_80211_STATUSTYPE_MEDIASTREAMMODE: 3034 netdev_info(usbdev->net, "media stream mode indication: %i\n", 3035 le32_to_cpu(indication->u.media_stream_mode)); 3036 return; 3037 3038 case NDIS_80211_STATUSTYPE_AUTHENTICATION: 3039 rndis_wlan_auth_indication(usbdev, indication, len); 3040 return; 3041 3042 case NDIS_80211_STATUSTYPE_PMKID_CANDIDATELIST: 3043 rndis_wlan_pmkid_cand_list_indication(usbdev, indication, len); 3044 return; 3045 3046 default: 3047 netdev_info(usbdev->net, "media specific indication: unknown status type 0x%08x\n", 3048 le32_to_cpu(indication->status_type)); 3049 } 3050} 3051 3052static void rndis_wlan_indication(struct usbnet *usbdev, void *ind, int buflen) 3053{ 3054 struct rndis_wlan_private *priv = get_rndis_wlan_priv(usbdev); 3055 struct rndis_indicate *msg = ind; 3056 3057 switch (le32_to_cpu(msg->status)) { 3058 case RNDIS_STATUS_MEDIA_CONNECT: 3059 if (priv->current_command_oid == RNDIS_OID_802_11_ADD_KEY) { 3060 /* RNDIS_OID_802_11_ADD_KEY causes sometimes extra 3061 * "media connect" indications which confuses driver 3062 * and userspace to think that device is 3063 * roaming/reassociating when it isn't. 3064 */ 3065 netdev_dbg(usbdev->net, "ignored RNDIS_OID_802_11_ADD_KEY triggered 'media connect'\n"); 3066 return; 3067 } 3068 3069 usbnet_pause_rx(usbdev); 3070 3071 netdev_info(usbdev->net, "media connect\n"); 3072 3073 /* queue work to avoid recursive calls into rndis_command */ 3074 set_bit(WORK_LINK_UP, &priv->work_pending); 3075 queue_work(priv->workqueue, &priv->work); 3076 break; 3077 3078 case RNDIS_STATUS_MEDIA_DISCONNECT: 3079 netdev_info(usbdev->net, "media disconnect\n"); 3080 3081 /* queue work to avoid recursive calls into rndis_command */ 3082 set_bit(WORK_LINK_DOWN, &priv->work_pending); 3083 queue_work(priv->workqueue, &priv->work); 3084 break; 3085 3086 case RNDIS_STATUS_MEDIA_SPECIFIC_INDICATION: 3087 rndis_wlan_media_specific_indication(usbdev, msg, buflen); 3088 break; 3089 3090 default: 3091 netdev_info(usbdev->net, "indication: 0x%08x\n", 3092 le32_to_cpu(msg->status)); 3093 break; 3094 } 3095} 3096 3097static int rndis_wlan_get_caps(struct usbnet *usbdev, struct wiphy *wiphy) 3098{ 3099 struct { 3100 __le32 num_items; 3101 __le32 items[8]; 3102 } networks_supported; 3103 struct ndis_80211_capability caps; 3104 int len, retval, i, n; 3105 struct rndis_wlan_private *priv = get_rndis_wlan_priv(usbdev); 3106 3107 /* determine supported modes */ 3108 len = sizeof(networks_supported); 3109 retval = rndis_query_oid(usbdev, 3110 RNDIS_OID_802_11_NETWORK_TYPES_SUPPORTED, 3111 &networks_supported, &len); 3112 if (!retval) { 3113 n = le32_to_cpu(networks_supported.num_items); 3114 if (n > 8) 3115 n = 8; 3116 for (i = 0; i < n; i++) { 3117 switch (le32_to_cpu(networks_supported.items[i])) { 3118 case NDIS_80211_TYPE_FREQ_HOP: 3119 case NDIS_80211_TYPE_DIRECT_SEQ: 3120 priv->caps |= CAP_MODE_80211B; 3121 break; 3122 case NDIS_80211_TYPE_OFDM_A: 3123 priv->caps |= CAP_MODE_80211A; 3124 break; 3125 case NDIS_80211_TYPE_OFDM_G: 3126 priv->caps |= CAP_MODE_80211G; 3127 break; 3128 } 3129 } 3130 } 3131 3132 /* get device 802.11 capabilities, number of PMKIDs */ 3133 len = sizeof(caps); 3134 retval = rndis_query_oid(usbdev, 3135 RNDIS_OID_802_11_CAPABILITY, 3136 &caps, &len); 3137 if (!retval) { 3138 netdev_dbg(usbdev->net, "RNDIS_OID_802_11_CAPABILITY -> len %d, " 3139 "ver %d, pmkids %d, auth-encr-pairs %d\n", 3140 le32_to_cpu(caps.length), 3141 le32_to_cpu(caps.version), 3142 le32_to_cpu(caps.num_pmkids), 3143 le32_to_cpu(caps.num_auth_encr_pair)); 3144 wiphy->max_num_pmkids = le32_to_cpu(caps.num_pmkids); 3145 } else 3146 wiphy->max_num_pmkids = 0; 3147 3148 return retval; 3149} 3150 3151static void rndis_do_cqm(struct usbnet *usbdev, s32 rssi) 3152{ 3153 struct rndis_wlan_private *priv = get_rndis_wlan_priv(usbdev); 3154 enum nl80211_cqm_rssi_threshold_event event; 3155 int thold, hyst, last_event; 3156 3157 if (priv->cqm_rssi_thold >= 0 || rssi >= 0) 3158 return; 3159 if (priv->infra_mode != NDIS_80211_INFRA_INFRA) 3160 return; 3161 3162 last_event = priv->last_cqm_event_rssi; 3163 thold = priv->cqm_rssi_thold; 3164 hyst = priv->cqm_rssi_hyst; 3165 3166 if (rssi < thold && (last_event == 0 || rssi < last_event - hyst)) 3167 event = NL80211_CQM_RSSI_THRESHOLD_EVENT_LOW; 3168 else if (rssi > thold && (last_event == 0 || rssi > last_event + hyst)) 3169 event = NL80211_CQM_RSSI_THRESHOLD_EVENT_HIGH; 3170 else 3171 return; 3172 3173 priv->last_cqm_event_rssi = rssi; 3174 cfg80211_cqm_rssi_notify(usbdev->net, event, rssi, GFP_KERNEL); 3175} 3176 3177#define DEVICE_POLLER_JIFFIES (HZ) 3178static void rndis_device_poller(struct work_struct *work) 3179{ 3180 struct rndis_wlan_private *priv = 3181 container_of(work, struct rndis_wlan_private, 3182 dev_poller_work.work); 3183 struct usbnet *usbdev = priv->usbdev; 3184 __le32 rssi, tmp; 3185 int len, ret, j; 3186 int update_jiffies = DEVICE_POLLER_JIFFIES; 3187 void *buf; 3188 3189 /* Only check/do workaround when connected. Calling is_associated() 3190 * also polls device with rndis_command() and catches for media link 3191 * indications. 3192 */ 3193 if (!is_associated(usbdev)) { 3194 /* Workaround bad scanning in BCM4320a devices with active 3195 * background scanning when not associated. 3196 */ 3197 if (priv->device_type == RNDIS_BCM4320A && priv->radio_on && 3198 !priv->scan_request) { 3199 /* Get previous scan results */ 3200 rndis_check_bssid_list(usbdev, NULL, NULL); 3201 3202 /* Initiate new scan */ 3203 rndis_start_bssid_list_scan(usbdev); 3204 } 3205 3206 goto end; 3207 } 3208 3209 len = sizeof(rssi); 3210 ret = rndis_query_oid(usbdev, RNDIS_OID_802_11_RSSI, 3211 &rssi, &len); 3212 if (ret == 0) { 3213 priv->last_qual = level_to_qual(le32_to_cpu(rssi)); 3214 rndis_do_cqm(usbdev, le32_to_cpu(rssi)); 3215 } 3216 3217 netdev_dbg(usbdev->net, "dev-poller: RNDIS_OID_802_11_RSSI -> %d, rssi:%d, qual: %d\n", 3218 ret, le32_to_cpu(rssi), level_to_qual(le32_to_cpu(rssi))); 3219 3220 /* Workaround transfer stalls on poor quality links. 3221 * TODO: find right way to fix these stalls (as stalls do not happen 3222 * with ndiswrapper/windows driver). */ 3223 if (priv->param_workaround_interval > 0 && priv->last_qual <= 25) { 3224 /* Decrease stats worker interval to catch stalls. 3225 * faster. Faster than 400-500ms causes packet loss, 3226 * Slower doesn't catch stalls fast enough. 3227 */ 3228 j = msecs_to_jiffies(priv->param_workaround_interval); 3229 if (j > DEVICE_POLLER_JIFFIES) 3230 j = DEVICE_POLLER_JIFFIES; 3231 else if (j <= 0) 3232 j = 1; 3233 update_jiffies = j; 3234 3235 /* Send scan OID. Use of both OIDs is required to get device 3236 * working. 3237 */ 3238 tmp = cpu_to_le32(1); 3239 rndis_set_oid(usbdev, 3240 RNDIS_OID_802_11_BSSID_LIST_SCAN, 3241 &tmp, sizeof(tmp)); 3242 3243 len = CONTROL_BUFFER_SIZE; 3244 buf = kmalloc(len, GFP_KERNEL); 3245 if (!buf) 3246 goto end; 3247 3248 rndis_query_oid(usbdev, 3249 RNDIS_OID_802_11_BSSID_LIST, 3250 buf, &len); 3251 kfree(buf); 3252 } 3253 3254end: 3255 if (update_jiffies >= HZ) 3256 update_jiffies = round_jiffies_relative(update_jiffies); 3257 else { 3258 j = round_jiffies_relative(update_jiffies); 3259 if (abs(j - update_jiffies) <= 10) 3260 update_jiffies = j; 3261 } 3262 3263 queue_delayed_work(priv->workqueue, &priv->dev_poller_work, 3264 update_jiffies); 3265} 3266 3267/* 3268 * driver/device initialization 3269 */ 3270static void rndis_copy_module_params(struct usbnet *usbdev, int device_type) 3271{ 3272 struct rndis_wlan_private *priv = get_rndis_wlan_priv(usbdev); 3273 3274 priv->device_type = device_type; 3275 3276 priv->param_country[0] = modparam_country[0]; 3277 priv->param_country[1] = modparam_country[1]; 3278 priv->param_country[2] = 0; 3279 priv->param_frameburst = modparam_frameburst; 3280 priv->param_afterburner = modparam_afterburner; 3281 priv->param_power_save = modparam_power_save; 3282 priv->param_power_output = modparam_power_output; 3283 priv->param_roamtrigger = modparam_roamtrigger; 3284 priv->param_roamdelta = modparam_roamdelta; 3285 3286 priv->param_country[0] = toupper(priv->param_country[0]); 3287 priv->param_country[1] = toupper(priv->param_country[1]); 3288 /* doesn't support EU as country code, use FI instead */ 3289 if (!strcmp(priv->param_country, "EU")) 3290 strcpy(priv->param_country, "FI"); 3291 3292 if (priv->param_power_save < 0) 3293 priv->param_power_save = 0; 3294 else if (priv->param_power_save > 2) 3295 priv->param_power_save = 2; 3296 3297 if (priv->param_power_output < 0) 3298 priv->param_power_output = 0; 3299 else if (priv->param_power_output > 3) 3300 priv->param_power_output = 3; 3301 3302 if (priv->param_roamtrigger < -80) 3303 priv->param_roamtrigger = -80; 3304 else if (priv->param_roamtrigger > -60) 3305 priv->param_roamtrigger = -60; 3306 3307 if (priv->param_roamdelta < 0) 3308 priv->param_roamdelta = 0; 3309 else if (priv->param_roamdelta > 2) 3310 priv->param_roamdelta = 2; 3311 3312 if (modparam_workaround_interval < 0) 3313 priv->param_workaround_interval = 500; 3314 else 3315 priv->param_workaround_interval = modparam_workaround_interval; 3316} 3317 3318static int unknown_early_init(struct usbnet *usbdev) 3319{ 3320 /* copy module parameters for unknown so that iwconfig reports txpower 3321 * and workaround parameter is copied to private structure correctly. 3322 */ 3323 rndis_copy_module_params(usbdev, RNDIS_UNKNOWN); 3324 3325 /* This is unknown device, so do not try set configuration parameters. 3326 */ 3327 3328 return 0; 3329} 3330 3331static int bcm4320a_early_init(struct usbnet *usbdev) 3332{ 3333 /* copy module parameters for bcm4320a so that iwconfig reports txpower 3334 * and workaround parameter is copied to private structure correctly. 3335 */ 3336 rndis_copy_module_params(usbdev, RNDIS_BCM4320A); 3337 3338 /* bcm4320a doesn't handle configuration parameters well. Try 3339 * set any and you get partially zeroed mac and broken device. 3340 */ 3341 3342 return 0; 3343} 3344 3345static int bcm4320b_early_init(struct usbnet *usbdev) 3346{ 3347 struct rndis_wlan_private *priv = get_rndis_wlan_priv(usbdev); 3348 char buf[8]; 3349 3350 rndis_copy_module_params(usbdev, RNDIS_BCM4320B); 3351 3352 /* Early initialization settings, setting these won't have effect 3353 * if called after generic_rndis_bind(). 3354 */ 3355 3356 rndis_set_config_parameter_str(usbdev, "Country", priv->param_country); 3357 rndis_set_config_parameter_str(usbdev, "FrameBursting", 3358 priv->param_frameburst ? "1" : "0"); 3359 rndis_set_config_parameter_str(usbdev, "Afterburner", 3360 priv->param_afterburner ? "1" : "0"); 3361 sprintf(buf, "%d", priv->param_power_save); 3362 rndis_set_config_parameter_str(usbdev, "PowerSaveMode", buf); 3363 sprintf(buf, "%d", priv->param_power_output); 3364 rndis_set_config_parameter_str(usbdev, "PwrOut", buf); 3365 sprintf(buf, "%d", priv->param_roamtrigger); 3366 rndis_set_config_parameter_str(usbdev, "RoamTrigger", buf); 3367 sprintf(buf, "%d", priv->param_roamdelta); 3368 rndis_set_config_parameter_str(usbdev, "RoamDelta", buf); 3369 3370 return 0; 3371} 3372 3373/* same as rndis_netdev_ops but with local multicast handler */ 3374static const struct net_device_ops rndis_wlan_netdev_ops = { 3375 .ndo_open = usbnet_open, 3376 .ndo_stop = usbnet_stop, 3377 .ndo_start_xmit = usbnet_start_xmit, 3378 .ndo_tx_timeout = usbnet_tx_timeout, 3379 .ndo_get_stats64 = dev_get_tstats64, 3380 .ndo_set_mac_address = eth_mac_addr, 3381 .ndo_validate_addr = eth_validate_addr, 3382 .ndo_set_rx_mode = rndis_wlan_set_multicast_list, 3383}; 3384 3385static int rndis_wlan_bind(struct usbnet *usbdev, struct usb_interface *intf) 3386{ 3387 struct wiphy *wiphy; 3388 struct rndis_wlan_private *priv; 3389 int retval, len; 3390 __le32 tmp; 3391 3392 /* allocate wiphy and rndis private data 3393 * NOTE: We only support a single virtual interface, so wiphy 3394 * and wireless_dev are somewhat synonymous for this device. 3395 */ 3396 wiphy = wiphy_new(&rndis_config_ops, sizeof(struct rndis_wlan_private)); 3397 if (!wiphy) 3398 return -ENOMEM; 3399 3400 priv = wiphy_priv(wiphy); 3401 usbdev->net->ieee80211_ptr = &priv->wdev; 3402 priv->wdev.wiphy = wiphy; 3403 priv->wdev.iftype = NL80211_IFTYPE_STATION; 3404 3405 /* These have to be initialized before calling generic_rndis_bind(). 3406 * Otherwise we'll be in big trouble in rndis_wlan_early_init(). 3407 */ 3408 usbdev->driver_priv = priv; 3409 priv->usbdev = usbdev; 3410 3411 mutex_init(&priv->command_lock); 3412 3413 /* because rndis_command() sleeps we need to use workqueue */ 3414 priv->workqueue = create_singlethread_workqueue("rndis_wlan"); 3415 if (!priv->workqueue) { 3416 wiphy_free(wiphy); 3417 return -ENOMEM; 3418 } 3419 INIT_WORK(&priv->work, rndis_wlan_worker); 3420 INIT_DELAYED_WORK(&priv->dev_poller_work, rndis_device_poller); 3421 INIT_DELAYED_WORK(&priv->scan_work, rndis_get_scan_results); 3422 3423 /* try bind rndis_host */ 3424 retval = generic_rndis_bind(usbdev, intf, FLAG_RNDIS_PHYM_WIRELESS); 3425 if (retval < 0) 3426 goto fail; 3427 3428 /* generic_rndis_bind set packet filter to multicast_all+ 3429 * promisc mode which doesn't work well for our devices (device 3430 * picks up rssi to closest station instead of to access point). 3431 * 3432 * rndis_host wants to avoid all OID as much as possible 3433 * so do promisc/multicast handling in rndis_wlan. 3434 */ 3435 usbdev->net->netdev_ops = &rndis_wlan_netdev_ops; 3436 3437 tmp = cpu_to_le32(RNDIS_PACKET_TYPE_DIRECTED | RNDIS_PACKET_TYPE_BROADCAST); 3438 retval = rndis_set_oid(usbdev, 3439 RNDIS_OID_GEN_CURRENT_PACKET_FILTER, 3440 &tmp, sizeof(tmp)); 3441 3442 len = sizeof(tmp); 3443 retval = rndis_query_oid(usbdev, 3444 RNDIS_OID_802_3_MAXIMUM_LIST_SIZE, 3445 &tmp, &len); 3446 priv->multicast_size = le32_to_cpu(tmp); 3447 if (retval < 0 || priv->multicast_size < 0) 3448 priv->multicast_size = 0; 3449 if (priv->multicast_size > 0) 3450 usbdev->net->flags |= IFF_MULTICAST; 3451 else 3452 usbdev->net->flags &= ~IFF_MULTICAST; 3453 3454 /* fill-out wiphy structure and register w/ cfg80211 */ 3455 memcpy(wiphy->perm_addr, usbdev->net->dev_addr, ETH_ALEN); 3456 wiphy->privid = rndis_wiphy_privid; 3457 wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) 3458 | BIT(NL80211_IFTYPE_ADHOC); 3459 wiphy->max_scan_ssids = 1; 3460 3461 /* TODO: fill-out band/encr information based on priv->caps */ 3462 rndis_wlan_get_caps(usbdev, wiphy); 3463 3464 memcpy(priv->channels, rndis_channels, sizeof(rndis_channels)); 3465 memcpy(priv->rates, rndis_rates, sizeof(rndis_rates)); 3466 priv->band.channels = priv->channels; 3467 priv->band.n_channels = ARRAY_SIZE(rndis_channels); 3468 priv->band.bitrates = priv->rates; 3469 priv->band.n_bitrates = ARRAY_SIZE(rndis_rates); 3470 wiphy->bands[NL80211_BAND_2GHZ] = &priv->band; 3471 wiphy->signal_type = CFG80211_SIGNAL_TYPE_UNSPEC; 3472 3473 memcpy(priv->cipher_suites, rndis_cipher_suites, 3474 sizeof(rndis_cipher_suites)); 3475 wiphy->cipher_suites = priv->cipher_suites; 3476 wiphy->n_cipher_suites = ARRAY_SIZE(rndis_cipher_suites); 3477 3478 set_wiphy_dev(wiphy, &usbdev->udev->dev); 3479 3480 if (wiphy_register(wiphy)) { 3481 retval = -ENODEV; 3482 goto fail; 3483 } 3484 3485 set_default_iw_params(usbdev); 3486 3487 priv->power_mode = -1; 3488 3489 /* set default rts/frag */ 3490 rndis_set_wiphy_params(wiphy, 3491 WIPHY_PARAM_FRAG_THRESHOLD | WIPHY_PARAM_RTS_THRESHOLD); 3492 3493 /* turn radio off on init */ 3494 priv->radio_on = false; 3495 disassociate(usbdev, false); 3496 netif_carrier_off(usbdev->net); 3497 3498 return 0; 3499 3500fail: 3501 cancel_delayed_work_sync(&priv->dev_poller_work); 3502 cancel_delayed_work_sync(&priv->scan_work); 3503 cancel_work_sync(&priv->work); 3504 destroy_workqueue(priv->workqueue); 3505 3506 wiphy_free(wiphy); 3507 return retval; 3508} 3509 3510static void rndis_wlan_unbind(struct usbnet *usbdev, struct usb_interface *intf) 3511{ 3512 struct rndis_wlan_private *priv = get_rndis_wlan_priv(usbdev); 3513 3514 /* turn radio off */ 3515 disassociate(usbdev, false); 3516 3517 cancel_delayed_work_sync(&priv->dev_poller_work); 3518 cancel_delayed_work_sync(&priv->scan_work); 3519 cancel_work_sync(&priv->work); 3520 destroy_workqueue(priv->workqueue); 3521 3522 rndis_unbind(usbdev, intf); 3523 3524 wiphy_unregister(priv->wdev.wiphy); 3525 wiphy_free(priv->wdev.wiphy); 3526} 3527 3528static int rndis_wlan_reset(struct usbnet *usbdev) 3529{ 3530 struct rndis_wlan_private *priv = get_rndis_wlan_priv(usbdev); 3531 int retval; 3532 3533 netdev_dbg(usbdev->net, "%s()\n", __func__); 3534 3535 retval = rndis_reset(usbdev); 3536 if (retval) 3537 netdev_warn(usbdev->net, "rndis_reset failed: %d\n", retval); 3538 3539 /* rndis_reset cleared multicast list, so restore here. 3540 (set_multicast_list() also turns on current packet filter) */ 3541 set_multicast_list(usbdev); 3542 3543 queue_delayed_work(priv->workqueue, &priv->dev_poller_work, 3544 round_jiffies_relative(DEVICE_POLLER_JIFFIES)); 3545 3546 return deauthenticate(usbdev); 3547} 3548 3549static int rndis_wlan_stop(struct usbnet *usbdev) 3550{ 3551 struct rndis_wlan_private *priv = get_rndis_wlan_priv(usbdev); 3552 int retval; 3553 __le32 filter; 3554 3555 netdev_dbg(usbdev->net, "%s()\n", __func__); 3556 3557 retval = disassociate(usbdev, false); 3558 3559 priv->work_pending = 0; 3560 cancel_delayed_work_sync(&priv->dev_poller_work); 3561 cancel_delayed_work_sync(&priv->scan_work); 3562 cancel_work_sync(&priv->work); 3563 flush_workqueue(priv->workqueue); 3564 3565 if (priv->scan_request) { 3566 struct cfg80211_scan_info info = { 3567 .aborted = true, 3568 }; 3569 3570 cfg80211_scan_done(priv->scan_request, &info); 3571 priv->scan_request = NULL; 3572 } 3573 3574 /* Set current packet filter zero to block receiving data packets from 3575 device. */ 3576 filter = 0; 3577 rndis_set_oid(usbdev, RNDIS_OID_GEN_CURRENT_PACKET_FILTER, &filter, 3578 sizeof(filter)); 3579 3580 return retval; 3581} 3582 3583static const struct driver_info bcm4320b_info = { 3584 .description = "Wireless RNDIS device, BCM4320b based", 3585 .flags = FLAG_WLAN | FLAG_FRAMING_RN | FLAG_NO_SETINT | 3586 FLAG_AVOID_UNLINK_URBS, 3587 .bind = rndis_wlan_bind, 3588 .unbind = rndis_wlan_unbind, 3589 .status = rndis_status, 3590 .rx_fixup = rndis_rx_fixup, 3591 .tx_fixup = rndis_tx_fixup, 3592 .reset = rndis_wlan_reset, 3593 .stop = rndis_wlan_stop, 3594 .early_init = bcm4320b_early_init, 3595 .indication = rndis_wlan_indication, 3596}; 3597 3598static const struct driver_info bcm4320a_info = { 3599 .description = "Wireless RNDIS device, BCM4320a based", 3600 .flags = FLAG_WLAN | FLAG_FRAMING_RN | FLAG_NO_SETINT | 3601 FLAG_AVOID_UNLINK_URBS, 3602 .bind = rndis_wlan_bind, 3603 .unbind = rndis_wlan_unbind, 3604 .status = rndis_status, 3605 .rx_fixup = rndis_rx_fixup, 3606 .tx_fixup = rndis_tx_fixup, 3607 .reset = rndis_wlan_reset, 3608 .stop = rndis_wlan_stop, 3609 .early_init = bcm4320a_early_init, 3610 .indication = rndis_wlan_indication, 3611}; 3612 3613static const struct driver_info rndis_wlan_info = { 3614 .description = "Wireless RNDIS device", 3615 .flags = FLAG_WLAN | FLAG_FRAMING_RN | FLAG_NO_SETINT | 3616 FLAG_AVOID_UNLINK_URBS, 3617 .bind = rndis_wlan_bind, 3618 .unbind = rndis_wlan_unbind, 3619 .status = rndis_status, 3620 .rx_fixup = rndis_rx_fixup, 3621 .tx_fixup = rndis_tx_fixup, 3622 .reset = rndis_wlan_reset, 3623 .stop = rndis_wlan_stop, 3624 .early_init = unknown_early_init, 3625 .indication = rndis_wlan_indication, 3626}; 3627 3628/*-------------------------------------------------------------------------*/ 3629 3630static const struct usb_device_id products [] = { 3631#define RNDIS_MASTER_INTERFACE \ 3632 .bInterfaceClass = USB_CLASS_COMM, \ 3633 .bInterfaceSubClass = 2 /* ACM */, \ 3634 .bInterfaceProtocol = 0x0ff 3635 3636/* INF driver for these devices have DriverVer >= 4.xx.xx.xx and many custom 3637 * parameters available. Chipset marked as 'BCM4320SKFBG' in NDISwrapper-wiki. 3638 */ 3639{ 3640 .match_flags = USB_DEVICE_ID_MATCH_INT_INFO 3641 | USB_DEVICE_ID_MATCH_DEVICE, 3642 .idVendor = 0x0411, 3643 .idProduct = 0x00bc, /* Buffalo WLI-U2-KG125S */ 3644 RNDIS_MASTER_INTERFACE, 3645 .driver_info = (unsigned long) &bcm4320b_info, 3646}, { 3647 .match_flags = USB_DEVICE_ID_MATCH_INT_INFO 3648 | USB_DEVICE_ID_MATCH_DEVICE, 3649 .idVendor = 0x0baf, 3650 .idProduct = 0x011b, /* U.S. Robotics USR5421 */ 3651 RNDIS_MASTER_INTERFACE, 3652 .driver_info = (unsigned long) &bcm4320b_info, 3653}, { 3654 .match_flags = USB_DEVICE_ID_MATCH_INT_INFO 3655 | USB_DEVICE_ID_MATCH_DEVICE, 3656 .idVendor = 0x050d, 3657 .idProduct = 0x011b, /* Belkin F5D7051 */ 3658 RNDIS_MASTER_INTERFACE, 3659 .driver_info = (unsigned long) &bcm4320b_info, 3660}, { 3661 .match_flags = USB_DEVICE_ID_MATCH_INT_INFO 3662 | USB_DEVICE_ID_MATCH_DEVICE, 3663 .idVendor = 0x1799, /* Belkin has two vendor ids */ 3664 .idProduct = 0x011b, /* Belkin F5D7051 */ 3665 RNDIS_MASTER_INTERFACE, 3666 .driver_info = (unsigned long) &bcm4320b_info, 3667}, { 3668 .match_flags = USB_DEVICE_ID_MATCH_INT_INFO 3669 | USB_DEVICE_ID_MATCH_DEVICE, 3670 .idVendor = 0x13b1, 3671 .idProduct = 0x0014, /* Linksys WUSB54GSv2 */ 3672 RNDIS_MASTER_INTERFACE, 3673 .driver_info = (unsigned long) &bcm4320b_info, 3674}, { 3675 .match_flags = USB_DEVICE_ID_MATCH_INT_INFO 3676 | USB_DEVICE_ID_MATCH_DEVICE, 3677 .idVendor = 0x13b1, 3678 .idProduct = 0x0026, /* Linksys WUSB54GSC */ 3679 RNDIS_MASTER_INTERFACE, 3680 .driver_info = (unsigned long) &bcm4320b_info, 3681}, { 3682 .match_flags = USB_DEVICE_ID_MATCH_INT_INFO 3683 | USB_DEVICE_ID_MATCH_DEVICE, 3684 .idVendor = 0x0b05, 3685 .idProduct = 0x1717, /* Asus WL169gE */ 3686 RNDIS_MASTER_INTERFACE, 3687 .driver_info = (unsigned long) &bcm4320b_info, 3688}, { 3689 .match_flags = USB_DEVICE_ID_MATCH_INT_INFO 3690 | USB_DEVICE_ID_MATCH_DEVICE, 3691 .idVendor = 0x0a5c, 3692 .idProduct = 0xd11b, /* Eminent EM4045 */ 3693 RNDIS_MASTER_INTERFACE, 3694 .driver_info = (unsigned long) &bcm4320b_info, 3695}, { 3696 .match_flags = USB_DEVICE_ID_MATCH_INT_INFO 3697 | USB_DEVICE_ID_MATCH_DEVICE, 3698 .idVendor = 0x1690, 3699 .idProduct = 0x0715, /* BT Voyager 1055 */ 3700 RNDIS_MASTER_INTERFACE, 3701 .driver_info = (unsigned long) &bcm4320b_info, 3702}, 3703/* These devices have DriverVer < 4.xx.xx.xx and do not have any custom 3704 * parameters available, hardware probably contain older firmware version with 3705 * no way of updating. Chipset marked as 'BCM4320????' in NDISwrapper-wiki. 3706 */ 3707{ 3708 .match_flags = USB_DEVICE_ID_MATCH_INT_INFO 3709 | USB_DEVICE_ID_MATCH_DEVICE, 3710 .idVendor = 0x13b1, 3711 .idProduct = 0x000e, /* Linksys WUSB54GSv1 */ 3712 RNDIS_MASTER_INTERFACE, 3713 .driver_info = (unsigned long) &bcm4320a_info, 3714}, { 3715 .match_flags = USB_DEVICE_ID_MATCH_INT_INFO 3716 | USB_DEVICE_ID_MATCH_DEVICE, 3717 .idVendor = 0x0baf, 3718 .idProduct = 0x0111, /* U.S. Robotics USR5420 */ 3719 RNDIS_MASTER_INTERFACE, 3720 .driver_info = (unsigned long) &bcm4320a_info, 3721}, { 3722 .match_flags = USB_DEVICE_ID_MATCH_INT_INFO 3723 | USB_DEVICE_ID_MATCH_DEVICE, 3724 .idVendor = 0x0411, 3725 .idProduct = 0x004b, /* BUFFALO WLI-USB-G54 */ 3726 RNDIS_MASTER_INTERFACE, 3727 .driver_info = (unsigned long) &bcm4320a_info, 3728}, 3729/* Generic Wireless RNDIS devices that we don't have exact 3730 * idVendor/idProduct/chip yet. 3731 */ 3732{ 3733 /* RNDIS is MSFT's un-official variant of CDC ACM */ 3734 USB_INTERFACE_INFO(USB_CLASS_COMM, 2 /* ACM */, 0x0ff), 3735 .driver_info = (unsigned long) &rndis_wlan_info, 3736}, { 3737 /* "ActiveSync" is an undocumented variant of RNDIS, used in WM5 */ 3738 USB_INTERFACE_INFO(USB_CLASS_MISC, 1, 1), 3739 .driver_info = (unsigned long) &rndis_wlan_info, 3740}, 3741 { }, // END 3742}; 3743MODULE_DEVICE_TABLE(usb, products); 3744 3745static struct usb_driver rndis_wlan_driver = { 3746 .name = "rndis_wlan", 3747 .id_table = products, 3748 .probe = usbnet_probe, 3749 .disconnect = usbnet_disconnect, 3750 .suspend = usbnet_suspend, 3751 .resume = usbnet_resume, 3752 .disable_hub_initiated_lpm = 1, 3753}; 3754 3755module_usb_driver(rndis_wlan_driver); 3756 3757MODULE_AUTHOR("Bjorge Dijkstra"); 3758MODULE_AUTHOR("Jussi Kivilinna"); 3759MODULE_DESCRIPTION("Driver for RNDIS based USB Wireless adapters"); 3760MODULE_LICENSE("GPL"); 3761