Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v2.6.34-rc2 2137 lines 59 kB view raw
1/* 2 * BSS client mode implementation 3 * Copyright 2003-2008, Jouni Malinen <j@w1.fi> 4 * Copyright 2004, Instant802 Networks, Inc. 5 * Copyright 2005, Devicescape Software, Inc. 6 * Copyright 2006-2007 Jiri Benc <jbenc@suse.cz> 7 * Copyright 2007, Michael Wu <flamingice@sourmilk.net> 8 * 9 * This program is free software; you can redistribute it and/or modify 10 * it under the terms of the GNU General Public License version 2 as 11 * published by the Free Software Foundation. 12 */ 13 14#include <linux/delay.h> 15#include <linux/if_ether.h> 16#include <linux/skbuff.h> 17#include <linux/if_arp.h> 18#include <linux/etherdevice.h> 19#include <linux/rtnetlink.h> 20#include <linux/pm_qos_params.h> 21#include <linux/crc32.h> 22#include <net/mac80211.h> 23#include <asm/unaligned.h> 24 25#include "ieee80211_i.h" 26#include "driver-ops.h" 27#include "rate.h" 28#include "led.h" 29 30#define IEEE80211_MAX_PROBE_TRIES 5 31 32/* 33 * beacon loss detection timeout 34 * XXX: should depend on beacon interval 35 */ 36#define IEEE80211_BEACON_LOSS_TIME (2 * HZ) 37/* 38 * Time the connection can be idle before we probe 39 * it to see if we can still talk to the AP. 40 */ 41#define IEEE80211_CONNECTION_IDLE_TIME (30 * HZ) 42/* 43 * Time we wait for a probe response after sending 44 * a probe request because of beacon loss or for 45 * checking the connection still works. 46 */ 47#define IEEE80211_PROBE_WAIT (HZ / 2) 48 49#define TMR_RUNNING_TIMER 0 50#define TMR_RUNNING_CHANSW 1 51 52/* 53 * All cfg80211 functions have to be called outside a locked 54 * section so that they can acquire a lock themselves... This 55 * is much simpler than queuing up things in cfg80211, but we 56 * do need some indirection for that here. 57 */ 58enum rx_mgmt_action { 59 /* no action required */ 60 RX_MGMT_NONE, 61 62 /* caller must call cfg80211_send_rx_auth() */ 63 RX_MGMT_CFG80211_AUTH, 64 65 /* caller must call cfg80211_send_rx_assoc() */ 66 RX_MGMT_CFG80211_ASSOC, 67 68 /* caller must call cfg80211_send_deauth() */ 69 RX_MGMT_CFG80211_DEAUTH, 70 71 /* caller must call cfg80211_send_disassoc() */ 72 RX_MGMT_CFG80211_DISASSOC, 73 74 /* caller must tell cfg80211 about internal error */ 75 RX_MGMT_CFG80211_ASSOC_ERROR, 76}; 77 78/* utils */ 79static inline void ASSERT_MGD_MTX(struct ieee80211_if_managed *ifmgd) 80{ 81 WARN_ON(!mutex_is_locked(&ifmgd->mtx)); 82} 83 84/* 85 * We can have multiple work items (and connection probing) 86 * scheduling this timer, but we need to take care to only 87 * reschedule it when it should fire _earlier_ than it was 88 * asked for before, or if it's not pending right now. This 89 * function ensures that. Note that it then is required to 90 * run this function for all timeouts after the first one 91 * has happened -- the work that runs from this timer will 92 * do that. 93 */ 94static void run_again(struct ieee80211_if_managed *ifmgd, 95 unsigned long timeout) 96{ 97 ASSERT_MGD_MTX(ifmgd); 98 99 if (!timer_pending(&ifmgd->timer) || 100 time_before(timeout, ifmgd->timer.expires)) 101 mod_timer(&ifmgd->timer, timeout); 102} 103 104static void mod_beacon_timer(struct ieee80211_sub_if_data *sdata) 105{ 106 if (sdata->local->hw.flags & IEEE80211_HW_BEACON_FILTER) 107 return; 108 109 mod_timer(&sdata->u.mgd.bcn_mon_timer, 110 round_jiffies_up(jiffies + IEEE80211_BEACON_LOSS_TIME)); 111} 112 113static int ecw2cw(int ecw) 114{ 115 return (1 << ecw) - 1; 116} 117 118/* 119 * ieee80211_enable_ht should be called only after the operating band 120 * has been determined as ht configuration depends on the hw's 121 * HT abilities for a specific band. 122 */ 123static u32 ieee80211_enable_ht(struct ieee80211_sub_if_data *sdata, 124 struct ieee80211_ht_info *hti, 125 const u8 *bssid, u16 ap_ht_cap_flags) 126{ 127 struct ieee80211_local *local = sdata->local; 128 struct ieee80211_supported_band *sband; 129 struct sta_info *sta; 130 u32 changed = 0; 131 u16 ht_opmode; 132 bool enable_ht = true, ht_changed; 133 enum nl80211_channel_type channel_type = NL80211_CHAN_NO_HT; 134 135 sband = local->hw.wiphy->bands[local->hw.conf.channel->band]; 136 137 /* HT is not supported */ 138 if (!sband->ht_cap.ht_supported) 139 enable_ht = false; 140 141 /* check that channel matches the right operating channel */ 142 if (local->hw.conf.channel->center_freq != 143 ieee80211_channel_to_frequency(hti->control_chan)) 144 enable_ht = false; 145 146 if (enable_ht) { 147 channel_type = NL80211_CHAN_HT20; 148 149 if (!(ap_ht_cap_flags & IEEE80211_HT_CAP_40MHZ_INTOLERANT) && 150 (sband->ht_cap.cap & IEEE80211_HT_CAP_SUP_WIDTH_20_40) && 151 (hti->ht_param & IEEE80211_HT_PARAM_CHAN_WIDTH_ANY)) { 152 switch(hti->ht_param & IEEE80211_HT_PARAM_CHA_SEC_OFFSET) { 153 case IEEE80211_HT_PARAM_CHA_SEC_ABOVE: 154 if (!(local->hw.conf.channel->flags & 155 IEEE80211_CHAN_NO_HT40PLUS)) 156 channel_type = NL80211_CHAN_HT40PLUS; 157 break; 158 case IEEE80211_HT_PARAM_CHA_SEC_BELOW: 159 if (!(local->hw.conf.channel->flags & 160 IEEE80211_CHAN_NO_HT40MINUS)) 161 channel_type = NL80211_CHAN_HT40MINUS; 162 break; 163 } 164 } 165 } 166 167 ht_changed = conf_is_ht(&local->hw.conf) != enable_ht || 168 channel_type != local->hw.conf.channel_type; 169 170 local->oper_channel_type = channel_type; 171 172 if (ht_changed) { 173 /* channel_type change automatically detected */ 174 ieee80211_hw_config(local, 0); 175 176 rcu_read_lock(); 177 sta = sta_info_get(sdata, bssid); 178 if (sta) 179 rate_control_rate_update(local, sband, sta, 180 IEEE80211_RC_HT_CHANGED, 181 local->oper_channel_type); 182 rcu_read_unlock(); 183 } 184 185 /* disable HT */ 186 if (!enable_ht) 187 return 0; 188 189 ht_opmode = le16_to_cpu(hti->operation_mode); 190 191 /* if bss configuration changed store the new one */ 192 if (!sdata->ht_opmode_valid || 193 sdata->vif.bss_conf.ht_operation_mode != ht_opmode) { 194 changed |= BSS_CHANGED_HT; 195 sdata->vif.bss_conf.ht_operation_mode = ht_opmode; 196 sdata->ht_opmode_valid = true; 197 } 198 199 return changed; 200} 201 202/* frame sending functions */ 203 204static void ieee80211_send_deauth_disassoc(struct ieee80211_sub_if_data *sdata, 205 const u8 *bssid, u16 stype, u16 reason, 206 void *cookie) 207{ 208 struct ieee80211_local *local = sdata->local; 209 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; 210 struct sk_buff *skb; 211 struct ieee80211_mgmt *mgmt; 212 213 skb = dev_alloc_skb(local->hw.extra_tx_headroom + sizeof(*mgmt)); 214 if (!skb) { 215 printk(KERN_DEBUG "%s: failed to allocate buffer for " 216 "deauth/disassoc frame\n", sdata->name); 217 return; 218 } 219 skb_reserve(skb, local->hw.extra_tx_headroom); 220 221 mgmt = (struct ieee80211_mgmt *) skb_put(skb, 24); 222 memset(mgmt, 0, 24); 223 memcpy(mgmt->da, bssid, ETH_ALEN); 224 memcpy(mgmt->sa, sdata->vif.addr, ETH_ALEN); 225 memcpy(mgmt->bssid, bssid, ETH_ALEN); 226 mgmt->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT | stype); 227 skb_put(skb, 2); 228 /* u.deauth.reason_code == u.disassoc.reason_code */ 229 mgmt->u.deauth.reason_code = cpu_to_le16(reason); 230 231 if (stype == IEEE80211_STYPE_DEAUTH) 232 if (cookie) 233 __cfg80211_send_deauth(sdata->dev, (u8 *)mgmt, skb->len); 234 else 235 cfg80211_send_deauth(sdata->dev, (u8 *)mgmt, skb->len); 236 else 237 if (cookie) 238 __cfg80211_send_disassoc(sdata->dev, (u8 *)mgmt, skb->len); 239 else 240 cfg80211_send_disassoc(sdata->dev, (u8 *)mgmt, skb->len); 241 if (!(ifmgd->flags & IEEE80211_STA_MFP_ENABLED)) 242 IEEE80211_SKB_CB(skb)->flags |= IEEE80211_TX_INTFL_DONT_ENCRYPT; 243 ieee80211_tx_skb(sdata, skb); 244} 245 246void ieee80211_send_pspoll(struct ieee80211_local *local, 247 struct ieee80211_sub_if_data *sdata) 248{ 249 struct ieee80211_pspoll *pspoll; 250 struct sk_buff *skb; 251 252 skb = ieee80211_pspoll_get(&local->hw, &sdata->vif); 253 if (!skb) 254 return; 255 256 pspoll = (struct ieee80211_pspoll *) skb->data; 257 pspoll->frame_control |= cpu_to_le16(IEEE80211_FCTL_PM); 258 259 IEEE80211_SKB_CB(skb)->flags |= IEEE80211_TX_INTFL_DONT_ENCRYPT; 260 ieee80211_tx_skb(sdata, skb); 261} 262 263void ieee80211_send_nullfunc(struct ieee80211_local *local, 264 struct ieee80211_sub_if_data *sdata, 265 int powersave) 266{ 267 struct sk_buff *skb; 268 struct ieee80211_hdr_3addr *nullfunc; 269 270 skb = ieee80211_nullfunc_get(&local->hw, &sdata->vif); 271 if (!skb) 272 return; 273 274 nullfunc = (struct ieee80211_hdr_3addr *) skb->data; 275 if (powersave) 276 nullfunc->frame_control |= cpu_to_le16(IEEE80211_FCTL_PM); 277 278 IEEE80211_SKB_CB(skb)->flags |= IEEE80211_TX_INTFL_DONT_ENCRYPT; 279 ieee80211_tx_skb(sdata, skb); 280} 281 282static void ieee80211_send_4addr_nullfunc(struct ieee80211_local *local, 283 struct ieee80211_sub_if_data *sdata) 284{ 285 struct sk_buff *skb; 286 struct ieee80211_hdr *nullfunc; 287 __le16 fc; 288 289 if (WARN_ON(sdata->vif.type != NL80211_IFTYPE_STATION)) 290 return; 291 292 skb = dev_alloc_skb(local->hw.extra_tx_headroom + 30); 293 if (!skb) { 294 printk(KERN_DEBUG "%s: failed to allocate buffer for 4addr " 295 "nullfunc frame\n", sdata->name); 296 return; 297 } 298 skb_reserve(skb, local->hw.extra_tx_headroom); 299 300 nullfunc = (struct ieee80211_hdr *) skb_put(skb, 30); 301 memset(nullfunc, 0, 30); 302 fc = cpu_to_le16(IEEE80211_FTYPE_DATA | IEEE80211_STYPE_NULLFUNC | 303 IEEE80211_FCTL_FROMDS | IEEE80211_FCTL_TODS); 304 nullfunc->frame_control = fc; 305 memcpy(nullfunc->addr1, sdata->u.mgd.bssid, ETH_ALEN); 306 memcpy(nullfunc->addr2, sdata->vif.addr, ETH_ALEN); 307 memcpy(nullfunc->addr3, sdata->u.mgd.bssid, ETH_ALEN); 308 memcpy(nullfunc->addr4, sdata->vif.addr, ETH_ALEN); 309 310 IEEE80211_SKB_CB(skb)->flags |= IEEE80211_TX_INTFL_DONT_ENCRYPT; 311 ieee80211_tx_skb(sdata, skb); 312} 313 314/* spectrum management related things */ 315static void ieee80211_chswitch_work(struct work_struct *work) 316{ 317 struct ieee80211_sub_if_data *sdata = 318 container_of(work, struct ieee80211_sub_if_data, u.mgd.chswitch_work); 319 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; 320 321 if (!ieee80211_sdata_running(sdata)) 322 return; 323 324 mutex_lock(&ifmgd->mtx); 325 if (!ifmgd->associated) 326 goto out; 327 328 sdata->local->oper_channel = sdata->local->csa_channel; 329 ieee80211_hw_config(sdata->local, IEEE80211_CONF_CHANGE_CHANNEL); 330 331 /* XXX: shouldn't really modify cfg80211-owned data! */ 332 ifmgd->associated->channel = sdata->local->oper_channel; 333 334 ieee80211_wake_queues_by_reason(&sdata->local->hw, 335 IEEE80211_QUEUE_STOP_REASON_CSA); 336 out: 337 ifmgd->flags &= ~IEEE80211_STA_CSA_RECEIVED; 338 mutex_unlock(&ifmgd->mtx); 339} 340 341static void ieee80211_chswitch_timer(unsigned long data) 342{ 343 struct ieee80211_sub_if_data *sdata = 344 (struct ieee80211_sub_if_data *) data; 345 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; 346 347 if (sdata->local->quiescing) { 348 set_bit(TMR_RUNNING_CHANSW, &ifmgd->timers_running); 349 return; 350 } 351 352 ieee80211_queue_work(&sdata->local->hw, &ifmgd->chswitch_work); 353} 354 355void ieee80211_sta_process_chanswitch(struct ieee80211_sub_if_data *sdata, 356 struct ieee80211_channel_sw_ie *sw_elem, 357 struct ieee80211_bss *bss) 358{ 359 struct cfg80211_bss *cbss = 360 container_of((void *)bss, struct cfg80211_bss, priv); 361 struct ieee80211_channel *new_ch; 362 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; 363 int new_freq = ieee80211_channel_to_frequency(sw_elem->new_ch_num); 364 365 ASSERT_MGD_MTX(ifmgd); 366 367 if (!ifmgd->associated) 368 return; 369 370 if (sdata->local->scanning) 371 return; 372 373 /* Disregard subsequent beacons if we are already running a timer 374 processing a CSA */ 375 376 if (ifmgd->flags & IEEE80211_STA_CSA_RECEIVED) 377 return; 378 379 new_ch = ieee80211_get_channel(sdata->local->hw.wiphy, new_freq); 380 if (!new_ch || new_ch->flags & IEEE80211_CHAN_DISABLED) 381 return; 382 383 sdata->local->csa_channel = new_ch; 384 385 if (sw_elem->count <= 1) { 386 ieee80211_queue_work(&sdata->local->hw, &ifmgd->chswitch_work); 387 } else { 388 ieee80211_stop_queues_by_reason(&sdata->local->hw, 389 IEEE80211_QUEUE_STOP_REASON_CSA); 390 ifmgd->flags |= IEEE80211_STA_CSA_RECEIVED; 391 mod_timer(&ifmgd->chswitch_timer, 392 jiffies + 393 msecs_to_jiffies(sw_elem->count * 394 cbss->beacon_interval)); 395 } 396} 397 398static void ieee80211_handle_pwr_constr(struct ieee80211_sub_if_data *sdata, 399 u16 capab_info, u8 *pwr_constr_elem, 400 u8 pwr_constr_elem_len) 401{ 402 struct ieee80211_conf *conf = &sdata->local->hw.conf; 403 404 if (!(capab_info & WLAN_CAPABILITY_SPECTRUM_MGMT)) 405 return; 406 407 /* Power constraint IE length should be 1 octet */ 408 if (pwr_constr_elem_len != 1) 409 return; 410 411 if ((*pwr_constr_elem <= conf->channel->max_power) && 412 (*pwr_constr_elem != sdata->local->power_constr_level)) { 413 sdata->local->power_constr_level = *pwr_constr_elem; 414 ieee80211_hw_config(sdata->local, 0); 415 } 416} 417 418/* powersave */ 419static void ieee80211_enable_ps(struct ieee80211_local *local, 420 struct ieee80211_sub_if_data *sdata) 421{ 422 struct ieee80211_conf *conf = &local->hw.conf; 423 424 /* 425 * If we are scanning right now then the parameters will 426 * take effect when scan finishes. 427 */ 428 if (local->scanning) 429 return; 430 431 if (conf->dynamic_ps_timeout > 0 && 432 !(local->hw.flags & IEEE80211_HW_SUPPORTS_DYNAMIC_PS)) { 433 mod_timer(&local->dynamic_ps_timer, jiffies + 434 msecs_to_jiffies(conf->dynamic_ps_timeout)); 435 } else { 436 if (local->hw.flags & IEEE80211_HW_PS_NULLFUNC_STACK) 437 ieee80211_send_nullfunc(local, sdata, 1); 438 439 if ((local->hw.flags & IEEE80211_HW_PS_NULLFUNC_STACK) && 440 (local->hw.flags & IEEE80211_HW_REPORTS_TX_ACK_STATUS)) 441 return; 442 443 conf->flags |= IEEE80211_CONF_PS; 444 ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_PS); 445 } 446} 447 448static void ieee80211_change_ps(struct ieee80211_local *local) 449{ 450 struct ieee80211_conf *conf = &local->hw.conf; 451 452 if (local->ps_sdata) { 453 ieee80211_enable_ps(local, local->ps_sdata); 454 } else if (conf->flags & IEEE80211_CONF_PS) { 455 conf->flags &= ~IEEE80211_CONF_PS; 456 ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_PS); 457 del_timer_sync(&local->dynamic_ps_timer); 458 cancel_work_sync(&local->dynamic_ps_enable_work); 459 } 460} 461 462/* need to hold RTNL or interface lock */ 463void ieee80211_recalc_ps(struct ieee80211_local *local, s32 latency) 464{ 465 struct ieee80211_sub_if_data *sdata, *found = NULL; 466 int count = 0; 467 468 if (!(local->hw.flags & IEEE80211_HW_SUPPORTS_PS)) { 469 local->ps_sdata = NULL; 470 return; 471 } 472 473 if (!list_empty(&local->work_list)) { 474 local->ps_sdata = NULL; 475 goto change; 476 } 477 478 list_for_each_entry(sdata, &local->interfaces, list) { 479 if (!ieee80211_sdata_running(sdata)) 480 continue; 481 if (sdata->vif.type != NL80211_IFTYPE_STATION) 482 continue; 483 found = sdata; 484 count++; 485 } 486 487 if (count == 1 && found->u.mgd.powersave && 488 found->u.mgd.associated && 489 found->u.mgd.associated->beacon_ies && 490 !(found->u.mgd.flags & (IEEE80211_STA_BEACON_POLL | 491 IEEE80211_STA_CONNECTION_POLL))) { 492 s32 beaconint_us; 493 494 if (latency < 0) 495 latency = pm_qos_requirement(PM_QOS_NETWORK_LATENCY); 496 497 beaconint_us = ieee80211_tu_to_usec( 498 found->vif.bss_conf.beacon_int); 499 500 if (beaconint_us > latency) { 501 local->ps_sdata = NULL; 502 } else { 503 struct ieee80211_bss *bss; 504 int maxslp = 1; 505 u8 dtimper; 506 507 bss = (void *)found->u.mgd.associated->priv; 508 dtimper = bss->dtim_period; 509 510 /* If the TIM IE is invalid, pretend the value is 1 */ 511 if (!dtimper) 512 dtimper = 1; 513 else if (dtimper > 1) 514 maxslp = min_t(int, dtimper, 515 latency / beaconint_us); 516 517 local->hw.conf.max_sleep_period = maxslp; 518 local->hw.conf.ps_dtim_period = dtimper; 519 local->ps_sdata = found; 520 } 521 } else { 522 local->ps_sdata = NULL; 523 } 524 525 change: 526 ieee80211_change_ps(local); 527} 528 529void ieee80211_dynamic_ps_disable_work(struct work_struct *work) 530{ 531 struct ieee80211_local *local = 532 container_of(work, struct ieee80211_local, 533 dynamic_ps_disable_work); 534 535 if (local->hw.conf.flags & IEEE80211_CONF_PS) { 536 local->hw.conf.flags &= ~IEEE80211_CONF_PS; 537 ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_PS); 538 } 539 540 ieee80211_wake_queues_by_reason(&local->hw, 541 IEEE80211_QUEUE_STOP_REASON_PS); 542} 543 544void ieee80211_dynamic_ps_enable_work(struct work_struct *work) 545{ 546 struct ieee80211_local *local = 547 container_of(work, struct ieee80211_local, 548 dynamic_ps_enable_work); 549 struct ieee80211_sub_if_data *sdata = local->ps_sdata; 550 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; 551 552 /* can only happen when PS was just disabled anyway */ 553 if (!sdata) 554 return; 555 556 if (local->hw.conf.flags & IEEE80211_CONF_PS) 557 return; 558 559 if ((local->hw.flags & IEEE80211_HW_PS_NULLFUNC_STACK) && 560 (!(ifmgd->flags & IEEE80211_STA_NULLFUNC_ACKED))) 561 ieee80211_send_nullfunc(local, sdata, 1); 562 563 if (!((local->hw.flags & IEEE80211_HW_REPORTS_TX_ACK_STATUS) && 564 (local->hw.flags & IEEE80211_HW_PS_NULLFUNC_STACK)) || 565 (ifmgd->flags & IEEE80211_STA_NULLFUNC_ACKED)) { 566 ifmgd->flags &= ~IEEE80211_STA_NULLFUNC_ACKED; 567 local->hw.conf.flags |= IEEE80211_CONF_PS; 568 ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_PS); 569 } 570} 571 572void ieee80211_dynamic_ps_timer(unsigned long data) 573{ 574 struct ieee80211_local *local = (void *) data; 575 576 if (local->quiescing || local->suspended) 577 return; 578 579 ieee80211_queue_work(&local->hw, &local->dynamic_ps_enable_work); 580} 581 582/* MLME */ 583static void ieee80211_sta_wmm_params(struct ieee80211_local *local, 584 struct ieee80211_if_managed *ifmgd, 585 u8 *wmm_param, size_t wmm_param_len) 586{ 587 struct ieee80211_tx_queue_params params; 588 size_t left; 589 int count; 590 u8 *pos, uapsd_queues = 0; 591 592 if (local->hw.queues < 4) 593 return; 594 595 if (!wmm_param) 596 return; 597 598 if (wmm_param_len < 8 || wmm_param[5] /* version */ != 1) 599 return; 600 601 if (ifmgd->flags & IEEE80211_STA_UAPSD_ENABLED) 602 uapsd_queues = local->uapsd_queues; 603 604 count = wmm_param[6] & 0x0f; 605 if (count == ifmgd->wmm_last_param_set) 606 return; 607 ifmgd->wmm_last_param_set = count; 608 609 pos = wmm_param + 8; 610 left = wmm_param_len - 8; 611 612 memset(&params, 0, sizeof(params)); 613 614 local->wmm_acm = 0; 615 for (; left >= 4; left -= 4, pos += 4) { 616 int aci = (pos[0] >> 5) & 0x03; 617 int acm = (pos[0] >> 4) & 0x01; 618 bool uapsd = false; 619 int queue; 620 621 switch (aci) { 622 case 1: /* AC_BK */ 623 queue = 3; 624 if (acm) 625 local->wmm_acm |= BIT(1) | BIT(2); /* BK/- */ 626 if (uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BK) 627 uapsd = true; 628 break; 629 case 2: /* AC_VI */ 630 queue = 1; 631 if (acm) 632 local->wmm_acm |= BIT(4) | BIT(5); /* CL/VI */ 633 if (uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VI) 634 uapsd = true; 635 break; 636 case 3: /* AC_VO */ 637 queue = 0; 638 if (acm) 639 local->wmm_acm |= BIT(6) | BIT(7); /* VO/NC */ 640 if (uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VO) 641 uapsd = true; 642 break; 643 case 0: /* AC_BE */ 644 default: 645 queue = 2; 646 if (acm) 647 local->wmm_acm |= BIT(0) | BIT(3); /* BE/EE */ 648 if (uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BE) 649 uapsd = true; 650 break; 651 } 652 653 params.aifs = pos[0] & 0x0f; 654 params.cw_max = ecw2cw((pos[1] & 0xf0) >> 4); 655 params.cw_min = ecw2cw(pos[1] & 0x0f); 656 params.txop = get_unaligned_le16(pos + 2); 657 params.uapsd = uapsd; 658 659#ifdef CONFIG_MAC80211_VERBOSE_DEBUG 660 printk(KERN_DEBUG "%s: WMM queue=%d aci=%d acm=%d aifs=%d " 661 "cWmin=%d cWmax=%d txop=%d uapsd=%d\n", 662 wiphy_name(local->hw.wiphy), queue, aci, acm, 663 params.aifs, params.cw_min, params.cw_max, params.txop, 664 params.uapsd); 665#endif 666 if (drv_conf_tx(local, queue, &params) && local->ops->conf_tx) 667 printk(KERN_DEBUG "%s: failed to set TX queue " 668 "parameters for queue %d\n", 669 wiphy_name(local->hw.wiphy), queue); 670 } 671} 672 673static u32 ieee80211_handle_bss_capability(struct ieee80211_sub_if_data *sdata, 674 u16 capab, bool erp_valid, u8 erp) 675{ 676 struct ieee80211_bss_conf *bss_conf = &sdata->vif.bss_conf; 677 u32 changed = 0; 678 bool use_protection; 679 bool use_short_preamble; 680 bool use_short_slot; 681 682 if (erp_valid) { 683 use_protection = (erp & WLAN_ERP_USE_PROTECTION) != 0; 684 use_short_preamble = (erp & WLAN_ERP_BARKER_PREAMBLE) == 0; 685 } else { 686 use_protection = false; 687 use_short_preamble = !!(capab & WLAN_CAPABILITY_SHORT_PREAMBLE); 688 } 689 690 use_short_slot = !!(capab & WLAN_CAPABILITY_SHORT_SLOT_TIME); 691 if (sdata->local->hw.conf.channel->band == IEEE80211_BAND_5GHZ) 692 use_short_slot = true; 693 694 if (use_protection != bss_conf->use_cts_prot) { 695 bss_conf->use_cts_prot = use_protection; 696 changed |= BSS_CHANGED_ERP_CTS_PROT; 697 } 698 699 if (use_short_preamble != bss_conf->use_short_preamble) { 700 bss_conf->use_short_preamble = use_short_preamble; 701 changed |= BSS_CHANGED_ERP_PREAMBLE; 702 } 703 704 if (use_short_slot != bss_conf->use_short_slot) { 705 bss_conf->use_short_slot = use_short_slot; 706 changed |= BSS_CHANGED_ERP_SLOT; 707 } 708 709 return changed; 710} 711 712static void ieee80211_set_associated(struct ieee80211_sub_if_data *sdata, 713 struct cfg80211_bss *cbss, 714 u32 bss_info_changed) 715{ 716 struct ieee80211_bss *bss = (void *)cbss->priv; 717 struct ieee80211_local *local = sdata->local; 718 719 bss_info_changed |= BSS_CHANGED_ASSOC; 720 /* set timing information */ 721 sdata->vif.bss_conf.beacon_int = cbss->beacon_interval; 722 sdata->vif.bss_conf.timestamp = cbss->tsf; 723 724 bss_info_changed |= BSS_CHANGED_BEACON_INT; 725 bss_info_changed |= ieee80211_handle_bss_capability(sdata, 726 cbss->capability, bss->has_erp_value, bss->erp_value); 727 728 sdata->u.mgd.associated = cbss; 729 memcpy(sdata->u.mgd.bssid, cbss->bssid, ETH_ALEN); 730 731 /* just to be sure */ 732 sdata->u.mgd.flags &= ~(IEEE80211_STA_CONNECTION_POLL | 733 IEEE80211_STA_BEACON_POLL); 734 735 /* 736 * Always handle WMM once after association regardless 737 * of the first value the AP uses. Setting -1 here has 738 * that effect because the AP values is an unsigned 739 * 4-bit value. 740 */ 741 sdata->u.mgd.wmm_last_param_set = -1; 742 743 ieee80211_led_assoc(local, 1); 744 745 sdata->vif.bss_conf.assoc = 1; 746 /* 747 * For now just always ask the driver to update the basic rateset 748 * when we have associated, we aren't checking whether it actually 749 * changed or not. 750 */ 751 bss_info_changed |= BSS_CHANGED_BASIC_RATES; 752 753 /* And the BSSID changed - we're associated now */ 754 bss_info_changed |= BSS_CHANGED_BSSID; 755 756 ieee80211_bss_info_change_notify(sdata, bss_info_changed); 757 758 mutex_lock(&local->iflist_mtx); 759 ieee80211_recalc_ps(local, -1); 760 ieee80211_recalc_smps(local, sdata); 761 mutex_unlock(&local->iflist_mtx); 762 763 netif_tx_start_all_queues(sdata->dev); 764 netif_carrier_on(sdata->dev); 765} 766 767static void ieee80211_set_disassoc(struct ieee80211_sub_if_data *sdata) 768{ 769 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; 770 struct ieee80211_local *local = sdata->local; 771 struct sta_info *sta; 772 u32 changed = 0, config_changed = 0; 773 u8 bssid[ETH_ALEN]; 774 775 ASSERT_MGD_MTX(ifmgd); 776 777 if (WARN_ON(!ifmgd->associated)) 778 return; 779 780 memcpy(bssid, ifmgd->associated->bssid, ETH_ALEN); 781 782 ifmgd->associated = NULL; 783 memset(ifmgd->bssid, 0, ETH_ALEN); 784 785 /* 786 * we need to commit the associated = NULL change because the 787 * scan code uses that to determine whether this iface should 788 * go to/wake up from powersave or not -- and could otherwise 789 * wake the queues erroneously. 790 */ 791 smp_mb(); 792 793 /* 794 * Thus, we can only afterwards stop the queues -- to account 795 * for the case where another CPU is finishing a scan at this 796 * time -- we don't want the scan code to enable queues. 797 */ 798 799 netif_tx_stop_all_queues(sdata->dev); 800 netif_carrier_off(sdata->dev); 801 802 rcu_read_lock(); 803 sta = sta_info_get(sdata, bssid); 804 if (sta) { 805 set_sta_flags(sta, WLAN_STA_DISASSOC); 806 ieee80211_sta_tear_down_BA_sessions(sta); 807 } 808 rcu_read_unlock(); 809 810 changed |= ieee80211_reset_erp_info(sdata); 811 812 ieee80211_led_assoc(local, 0); 813 changed |= BSS_CHANGED_ASSOC; 814 sdata->vif.bss_conf.assoc = false; 815 816 ieee80211_set_wmm_default(sdata); 817 818 /* channel(_type) changes are handled by ieee80211_hw_config */ 819 local->oper_channel_type = NL80211_CHAN_NO_HT; 820 821 /* on the next assoc, re-program HT parameters */ 822 sdata->ht_opmode_valid = false; 823 824 local->power_constr_level = 0; 825 826 del_timer_sync(&local->dynamic_ps_timer); 827 cancel_work_sync(&local->dynamic_ps_enable_work); 828 829 if (local->hw.conf.flags & IEEE80211_CONF_PS) { 830 local->hw.conf.flags &= ~IEEE80211_CONF_PS; 831 config_changed |= IEEE80211_CONF_CHANGE_PS; 832 } 833 834 ieee80211_hw_config(local, config_changed); 835 836 /* And the BSSID changed -- not very interesting here */ 837 changed |= BSS_CHANGED_BSSID; 838 ieee80211_bss_info_change_notify(sdata, changed); 839 840 sta_info_destroy_addr(sdata, bssid); 841} 842 843void ieee80211_sta_rx_notify(struct ieee80211_sub_if_data *sdata, 844 struct ieee80211_hdr *hdr) 845{ 846 /* 847 * We can postpone the mgd.timer whenever receiving unicast frames 848 * from AP because we know that the connection is working both ways 849 * at that time. But multicast frames (and hence also beacons) must 850 * be ignored here, because we need to trigger the timer during 851 * data idle periods for sending the periodic probe request to the 852 * AP we're connected to. 853 */ 854 if (is_multicast_ether_addr(hdr->addr1)) 855 return; 856 857 mod_timer(&sdata->u.mgd.conn_mon_timer, 858 round_jiffies_up(jiffies + IEEE80211_CONNECTION_IDLE_TIME)); 859} 860 861static void ieee80211_mgd_probe_ap_send(struct ieee80211_sub_if_data *sdata) 862{ 863 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; 864 const u8 *ssid; 865 866 ssid = ieee80211_bss_get_ie(ifmgd->associated, WLAN_EID_SSID); 867 ieee80211_send_probe_req(sdata, ifmgd->associated->bssid, 868 ssid + 2, ssid[1], NULL, 0); 869 870 ifmgd->probe_send_count++; 871 ifmgd->probe_timeout = jiffies + IEEE80211_PROBE_WAIT; 872 run_again(ifmgd, ifmgd->probe_timeout); 873} 874 875static void ieee80211_mgd_probe_ap(struct ieee80211_sub_if_data *sdata, 876 bool beacon) 877{ 878 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; 879 bool already = false; 880 881 if (!ieee80211_sdata_running(sdata)) 882 return; 883 884 if (sdata->local->scanning) 885 return; 886 887 if (sdata->local->tmp_channel) 888 return; 889 890 mutex_lock(&ifmgd->mtx); 891 892 if (!ifmgd->associated) 893 goto out; 894 895#ifdef CONFIG_MAC80211_VERBOSE_DEBUG 896 if (beacon && net_ratelimit()) 897 printk(KERN_DEBUG "%s: detected beacon loss from AP " 898 "- sending probe request\n", sdata->name); 899#endif 900 901 /* 902 * The driver/our work has already reported this event or the 903 * connection monitoring has kicked in and we have already sent 904 * a probe request. Or maybe the AP died and the driver keeps 905 * reporting until we disassociate... 906 * 907 * In either case we have to ignore the current call to this 908 * function (except for setting the correct probe reason bit) 909 * because otherwise we would reset the timer every time and 910 * never check whether we received a probe response! 911 */ 912 if (ifmgd->flags & (IEEE80211_STA_BEACON_POLL | 913 IEEE80211_STA_CONNECTION_POLL)) 914 already = true; 915 916 if (beacon) 917 ifmgd->flags |= IEEE80211_STA_BEACON_POLL; 918 else 919 ifmgd->flags |= IEEE80211_STA_CONNECTION_POLL; 920 921 if (already) 922 goto out; 923 924 mutex_lock(&sdata->local->iflist_mtx); 925 ieee80211_recalc_ps(sdata->local, -1); 926 mutex_unlock(&sdata->local->iflist_mtx); 927 928 ifmgd->probe_send_count = 0; 929 ieee80211_mgd_probe_ap_send(sdata); 930 out: 931 mutex_unlock(&ifmgd->mtx); 932} 933 934void ieee80211_beacon_loss_work(struct work_struct *work) 935{ 936 struct ieee80211_sub_if_data *sdata = 937 container_of(work, struct ieee80211_sub_if_data, 938 u.mgd.beacon_loss_work); 939 940 ieee80211_mgd_probe_ap(sdata, true); 941} 942 943void ieee80211_beacon_loss(struct ieee80211_vif *vif) 944{ 945 struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif); 946 947 ieee80211_queue_work(&sdata->local->hw, &sdata->u.mgd.beacon_loss_work); 948} 949EXPORT_SYMBOL(ieee80211_beacon_loss); 950 951static enum rx_mgmt_action __must_check 952ieee80211_rx_mgmt_deauth(struct ieee80211_sub_if_data *sdata, 953 struct ieee80211_mgmt *mgmt, size_t len) 954{ 955 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; 956 const u8 *bssid = NULL; 957 u16 reason_code; 958 959 if (len < 24 + 2) 960 return RX_MGMT_NONE; 961 962 ASSERT_MGD_MTX(ifmgd); 963 964 bssid = ifmgd->associated->bssid; 965 966 reason_code = le16_to_cpu(mgmt->u.deauth.reason_code); 967 968 printk(KERN_DEBUG "%s: deauthenticated from %pM (Reason: %u)\n", 969 sdata->name, bssid, reason_code); 970 971 ieee80211_set_disassoc(sdata); 972 ieee80211_recalc_idle(sdata->local); 973 974 return RX_MGMT_CFG80211_DEAUTH; 975} 976 977 978static enum rx_mgmt_action __must_check 979ieee80211_rx_mgmt_disassoc(struct ieee80211_sub_if_data *sdata, 980 struct ieee80211_mgmt *mgmt, size_t len) 981{ 982 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; 983 u16 reason_code; 984 985 if (len < 24 + 2) 986 return RX_MGMT_NONE; 987 988 ASSERT_MGD_MTX(ifmgd); 989 990 if (WARN_ON(!ifmgd->associated)) 991 return RX_MGMT_NONE; 992 993 if (WARN_ON(memcmp(ifmgd->associated->bssid, mgmt->sa, ETH_ALEN))) 994 return RX_MGMT_NONE; 995 996 reason_code = le16_to_cpu(mgmt->u.disassoc.reason_code); 997 998 printk(KERN_DEBUG "%s: disassociated from %pM (Reason: %u)\n", 999 sdata->name, mgmt->sa, reason_code); 1000 1001 ieee80211_set_disassoc(sdata); 1002 ieee80211_recalc_idle(sdata->local); 1003 return RX_MGMT_CFG80211_DISASSOC; 1004} 1005 1006 1007static bool ieee80211_assoc_success(struct ieee80211_work *wk, 1008 struct ieee80211_mgmt *mgmt, size_t len) 1009{ 1010 struct ieee80211_sub_if_data *sdata = wk->sdata; 1011 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; 1012 struct ieee80211_local *local = sdata->local; 1013 struct ieee80211_supported_band *sband; 1014 struct sta_info *sta; 1015 struct cfg80211_bss *cbss = wk->assoc.bss; 1016 u8 *pos; 1017 u32 rates, basic_rates; 1018 u16 capab_info, aid; 1019 struct ieee802_11_elems elems; 1020 struct ieee80211_bss_conf *bss_conf = &sdata->vif.bss_conf; 1021 u32 changed = 0; 1022 int i, j, err; 1023 bool have_higher_than_11mbit = false; 1024 u16 ap_ht_cap_flags; 1025 1026 /* AssocResp and ReassocResp have identical structure */ 1027 1028 aid = le16_to_cpu(mgmt->u.assoc_resp.aid); 1029 capab_info = le16_to_cpu(mgmt->u.assoc_resp.capab_info); 1030 1031 if ((aid & (BIT(15) | BIT(14))) != (BIT(15) | BIT(14))) 1032 printk(KERN_DEBUG "%s: invalid aid value %d; bits 15:14 not " 1033 "set\n", sdata->name, aid); 1034 aid &= ~(BIT(15) | BIT(14)); 1035 1036 pos = mgmt->u.assoc_resp.variable; 1037 ieee802_11_parse_elems(pos, len - (pos - (u8 *) mgmt), &elems); 1038 1039 if (!elems.supp_rates) { 1040 printk(KERN_DEBUG "%s: no SuppRates element in AssocResp\n", 1041 sdata->name); 1042 return false; 1043 } 1044 1045 ifmgd->aid = aid; 1046 1047 sta = sta_info_alloc(sdata, cbss->bssid, GFP_KERNEL); 1048 if (!sta) { 1049 printk(KERN_DEBUG "%s: failed to alloc STA entry for" 1050 " the AP\n", sdata->name); 1051 return false; 1052 } 1053 1054 set_sta_flags(sta, WLAN_STA_AUTH | WLAN_STA_ASSOC | 1055 WLAN_STA_ASSOC_AP); 1056 if (!(ifmgd->flags & IEEE80211_STA_CONTROL_PORT)) 1057 set_sta_flags(sta, WLAN_STA_AUTHORIZED); 1058 1059 rates = 0; 1060 basic_rates = 0; 1061 sband = local->hw.wiphy->bands[local->hw.conf.channel->band]; 1062 1063 for (i = 0; i < elems.supp_rates_len; i++) { 1064 int rate = (elems.supp_rates[i] & 0x7f) * 5; 1065 bool is_basic = !!(elems.supp_rates[i] & 0x80); 1066 1067 if (rate > 110) 1068 have_higher_than_11mbit = true; 1069 1070 for (j = 0; j < sband->n_bitrates; j++) { 1071 if (sband->bitrates[j].bitrate == rate) { 1072 rates |= BIT(j); 1073 if (is_basic) 1074 basic_rates |= BIT(j); 1075 break; 1076 } 1077 } 1078 } 1079 1080 for (i = 0; i < elems.ext_supp_rates_len; i++) { 1081 int rate = (elems.ext_supp_rates[i] & 0x7f) * 5; 1082 bool is_basic = !!(elems.ext_supp_rates[i] & 0x80); 1083 1084 if (rate > 110) 1085 have_higher_than_11mbit = true; 1086 1087 for (j = 0; j < sband->n_bitrates; j++) { 1088 if (sband->bitrates[j].bitrate == rate) { 1089 rates |= BIT(j); 1090 if (is_basic) 1091 basic_rates |= BIT(j); 1092 break; 1093 } 1094 } 1095 } 1096 1097 sta->sta.supp_rates[local->hw.conf.channel->band] = rates; 1098 sdata->vif.bss_conf.basic_rates = basic_rates; 1099 1100 /* cf. IEEE 802.11 9.2.12 */ 1101 if (local->hw.conf.channel->band == IEEE80211_BAND_2GHZ && 1102 have_higher_than_11mbit) 1103 sdata->flags |= IEEE80211_SDATA_OPERATING_GMODE; 1104 else 1105 sdata->flags &= ~IEEE80211_SDATA_OPERATING_GMODE; 1106 1107 if (elems.ht_cap_elem && !(ifmgd->flags & IEEE80211_STA_DISABLE_11N)) 1108 ieee80211_ht_cap_ie_to_sta_ht_cap(sband, 1109 elems.ht_cap_elem, &sta->sta.ht_cap); 1110 1111 ap_ht_cap_flags = sta->sta.ht_cap.cap; 1112 1113 rate_control_rate_init(sta); 1114 1115 if (ifmgd->flags & IEEE80211_STA_MFP_ENABLED) 1116 set_sta_flags(sta, WLAN_STA_MFP); 1117 1118 if (elems.wmm_param) 1119 set_sta_flags(sta, WLAN_STA_WME); 1120 1121 err = sta_info_insert(sta); 1122 sta = NULL; 1123 if (err) { 1124 printk(KERN_DEBUG "%s: failed to insert STA entry for" 1125 " the AP (error %d)\n", sdata->name, err); 1126 return false; 1127 } 1128 1129 if (elems.wmm_param) 1130 ieee80211_sta_wmm_params(local, ifmgd, elems.wmm_param, 1131 elems.wmm_param_len); 1132 else 1133 ieee80211_set_wmm_default(sdata); 1134 1135 local->oper_channel = wk->chan; 1136 1137 if (elems.ht_info_elem && elems.wmm_param && 1138 (sdata->local->hw.queues >= 4) && 1139 !(ifmgd->flags & IEEE80211_STA_DISABLE_11N)) 1140 changed |= ieee80211_enable_ht(sdata, elems.ht_info_elem, 1141 cbss->bssid, ap_ht_cap_flags); 1142 1143 /* set AID and assoc capability, 1144 * ieee80211_set_associated() will tell the driver */ 1145 bss_conf->aid = aid; 1146 bss_conf->assoc_capability = capab_info; 1147 ieee80211_set_associated(sdata, cbss, changed); 1148 1149 /* 1150 * If we're using 4-addr mode, let the AP know that we're 1151 * doing so, so that it can create the STA VLAN on its side 1152 */ 1153 if (ifmgd->use_4addr) 1154 ieee80211_send_4addr_nullfunc(local, sdata); 1155 1156 /* 1157 * Start timer to probe the connection to the AP now. 1158 * Also start the timer that will detect beacon loss. 1159 */ 1160 ieee80211_sta_rx_notify(sdata, (struct ieee80211_hdr *)mgmt); 1161 mod_beacon_timer(sdata); 1162 1163 return true; 1164} 1165 1166 1167static void ieee80211_rx_bss_info(struct ieee80211_sub_if_data *sdata, 1168 struct ieee80211_mgmt *mgmt, 1169 size_t len, 1170 struct ieee80211_rx_status *rx_status, 1171 struct ieee802_11_elems *elems, 1172 bool beacon) 1173{ 1174 struct ieee80211_local *local = sdata->local; 1175 int freq; 1176 struct ieee80211_bss *bss; 1177 struct ieee80211_channel *channel; 1178 bool need_ps = false; 1179 1180 if (sdata->u.mgd.associated) { 1181 bss = (void *)sdata->u.mgd.associated->priv; 1182 /* not previously set so we may need to recalc */ 1183 need_ps = !bss->dtim_period; 1184 } 1185 1186 if (elems->ds_params && elems->ds_params_len == 1) 1187 freq = ieee80211_channel_to_frequency(elems->ds_params[0]); 1188 else 1189 freq = rx_status->freq; 1190 1191 channel = ieee80211_get_channel(local->hw.wiphy, freq); 1192 1193 if (!channel || channel->flags & IEEE80211_CHAN_DISABLED) 1194 return; 1195 1196 bss = ieee80211_bss_info_update(local, rx_status, mgmt, len, elems, 1197 channel, beacon); 1198 if (bss) 1199 ieee80211_rx_bss_put(local, bss); 1200 1201 if (!sdata->u.mgd.associated) 1202 return; 1203 1204 if (need_ps) { 1205 mutex_lock(&local->iflist_mtx); 1206 ieee80211_recalc_ps(local, -1); 1207 mutex_unlock(&local->iflist_mtx); 1208 } 1209 1210 if (elems->ch_switch_elem && (elems->ch_switch_elem_len == 3) && 1211 (memcmp(mgmt->bssid, sdata->u.mgd.associated->bssid, 1212 ETH_ALEN) == 0)) { 1213 struct ieee80211_channel_sw_ie *sw_elem = 1214 (struct ieee80211_channel_sw_ie *)elems->ch_switch_elem; 1215 ieee80211_sta_process_chanswitch(sdata, sw_elem, bss); 1216 } 1217} 1218 1219 1220static void ieee80211_rx_mgmt_probe_resp(struct ieee80211_sub_if_data *sdata, 1221 struct sk_buff *skb) 1222{ 1223 struct ieee80211_mgmt *mgmt = (void *)skb->data; 1224 struct ieee80211_if_managed *ifmgd; 1225 struct ieee80211_rx_status *rx_status = (void *) skb->cb; 1226 size_t baselen, len = skb->len; 1227 struct ieee802_11_elems elems; 1228 1229 ifmgd = &sdata->u.mgd; 1230 1231 ASSERT_MGD_MTX(ifmgd); 1232 1233 if (memcmp(mgmt->da, sdata->vif.addr, ETH_ALEN)) 1234 return; /* ignore ProbeResp to foreign address */ 1235 1236 baselen = (u8 *) mgmt->u.probe_resp.variable - (u8 *) mgmt; 1237 if (baselen > len) 1238 return; 1239 1240 ieee802_11_parse_elems(mgmt->u.probe_resp.variable, len - baselen, 1241 &elems); 1242 1243 ieee80211_rx_bss_info(sdata, mgmt, len, rx_status, &elems, false); 1244 1245 if (ifmgd->associated && 1246 memcmp(mgmt->bssid, ifmgd->associated->bssid, ETH_ALEN) == 0 && 1247 ifmgd->flags & (IEEE80211_STA_BEACON_POLL | 1248 IEEE80211_STA_CONNECTION_POLL)) { 1249 ifmgd->flags &= ~(IEEE80211_STA_CONNECTION_POLL | 1250 IEEE80211_STA_BEACON_POLL); 1251 mutex_lock(&sdata->local->iflist_mtx); 1252 ieee80211_recalc_ps(sdata->local, -1); 1253 mutex_unlock(&sdata->local->iflist_mtx); 1254 /* 1255 * We've received a probe response, but are not sure whether 1256 * we have or will be receiving any beacons or data, so let's 1257 * schedule the timers again, just in case. 1258 */ 1259 mod_beacon_timer(sdata); 1260 mod_timer(&ifmgd->conn_mon_timer, 1261 round_jiffies_up(jiffies + 1262 IEEE80211_CONNECTION_IDLE_TIME)); 1263 } 1264} 1265 1266/* 1267 * This is the canonical list of information elements we care about, 1268 * the filter code also gives us all changes to the Microsoft OUI 1269 * (00:50:F2) vendor IE which is used for WMM which we need to track. 1270 * 1271 * We implement beacon filtering in software since that means we can 1272 * avoid processing the frame here and in cfg80211, and userspace 1273 * will not be able to tell whether the hardware supports it or not. 1274 * 1275 * XXX: This list needs to be dynamic -- userspace needs to be able to 1276 * add items it requires. It also needs to be able to tell us to 1277 * look out for other vendor IEs. 1278 */ 1279static const u64 care_about_ies = 1280 (1ULL << WLAN_EID_COUNTRY) | 1281 (1ULL << WLAN_EID_ERP_INFO) | 1282 (1ULL << WLAN_EID_CHANNEL_SWITCH) | 1283 (1ULL << WLAN_EID_PWR_CONSTRAINT) | 1284 (1ULL << WLAN_EID_HT_CAPABILITY) | 1285 (1ULL << WLAN_EID_HT_INFORMATION); 1286 1287static void ieee80211_rx_mgmt_beacon(struct ieee80211_sub_if_data *sdata, 1288 struct ieee80211_mgmt *mgmt, 1289 size_t len, 1290 struct ieee80211_rx_status *rx_status) 1291{ 1292 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; 1293 size_t baselen; 1294 struct ieee802_11_elems elems; 1295 struct ieee80211_local *local = sdata->local; 1296 u32 changed = 0; 1297 bool erp_valid, directed_tim = false; 1298 u8 erp_value = 0; 1299 u32 ncrc; 1300 u8 *bssid; 1301 1302 ASSERT_MGD_MTX(ifmgd); 1303 1304 /* Process beacon from the current BSS */ 1305 baselen = (u8 *) mgmt->u.beacon.variable - (u8 *) mgmt; 1306 if (baselen > len) 1307 return; 1308 1309 if (rx_status->freq != local->hw.conf.channel->center_freq) 1310 return; 1311 1312 /* 1313 * We might have received a number of frames, among them a 1314 * disassoc frame and a beacon... 1315 */ 1316 if (!ifmgd->associated) 1317 return; 1318 1319 bssid = ifmgd->associated->bssid; 1320 1321 /* 1322 * And in theory even frames from a different AP we were just 1323 * associated to a split-second ago! 1324 */ 1325 if (memcmp(bssid, mgmt->bssid, ETH_ALEN) != 0) 1326 return; 1327 1328 if (ifmgd->flags & IEEE80211_STA_BEACON_POLL) { 1329#ifdef CONFIG_MAC80211_VERBOSE_DEBUG 1330 if (net_ratelimit()) { 1331 printk(KERN_DEBUG "%s: cancelling probereq poll due " 1332 "to a received beacon\n", sdata->name); 1333 } 1334#endif 1335 ifmgd->flags &= ~IEEE80211_STA_BEACON_POLL; 1336 mutex_lock(&local->iflist_mtx); 1337 ieee80211_recalc_ps(local, -1); 1338 mutex_unlock(&local->iflist_mtx); 1339 } 1340 1341 /* 1342 * Push the beacon loss detection into the future since 1343 * we are processing a beacon from the AP just now. 1344 */ 1345 mod_beacon_timer(sdata); 1346 1347 ncrc = crc32_be(0, (void *)&mgmt->u.beacon.beacon_int, 4); 1348 ncrc = ieee802_11_parse_elems_crc(mgmt->u.beacon.variable, 1349 len - baselen, &elems, 1350 care_about_ies, ncrc); 1351 1352 if (local->hw.flags & IEEE80211_HW_PS_NULLFUNC_STACK) 1353 directed_tim = ieee80211_check_tim(elems.tim, elems.tim_len, 1354 ifmgd->aid); 1355 1356 if (ncrc != ifmgd->beacon_crc) { 1357 ieee80211_rx_bss_info(sdata, mgmt, len, rx_status, &elems, 1358 true); 1359 1360 ieee80211_sta_wmm_params(local, ifmgd, elems.wmm_param, 1361 elems.wmm_param_len); 1362 } 1363 1364 if (local->hw.flags & IEEE80211_HW_PS_NULLFUNC_STACK) { 1365 if (directed_tim) { 1366 if (local->hw.conf.dynamic_ps_timeout > 0) { 1367 local->hw.conf.flags &= ~IEEE80211_CONF_PS; 1368 ieee80211_hw_config(local, 1369 IEEE80211_CONF_CHANGE_PS); 1370 ieee80211_send_nullfunc(local, sdata, 0); 1371 } else { 1372 local->pspolling = true; 1373 1374 /* 1375 * Here is assumed that the driver will be 1376 * able to send ps-poll frame and receive a 1377 * response even though power save mode is 1378 * enabled, but some drivers might require 1379 * to disable power save here. This needs 1380 * to be investigated. 1381 */ 1382 ieee80211_send_pspoll(local, sdata); 1383 } 1384 } 1385 } 1386 1387 if (ncrc == ifmgd->beacon_crc) 1388 return; 1389 ifmgd->beacon_crc = ncrc; 1390 1391 if (elems.erp_info && elems.erp_info_len >= 1) { 1392 erp_valid = true; 1393 erp_value = elems.erp_info[0]; 1394 } else { 1395 erp_valid = false; 1396 } 1397 changed |= ieee80211_handle_bss_capability(sdata, 1398 le16_to_cpu(mgmt->u.beacon.capab_info), 1399 erp_valid, erp_value); 1400 1401 1402 if (elems.ht_cap_elem && elems.ht_info_elem && elems.wmm_param && 1403 !(ifmgd->flags & IEEE80211_STA_DISABLE_11N)) { 1404 struct sta_info *sta; 1405 struct ieee80211_supported_band *sband; 1406 u16 ap_ht_cap_flags; 1407 1408 rcu_read_lock(); 1409 1410 sta = sta_info_get(sdata, bssid); 1411 if (WARN_ON(!sta)) { 1412 rcu_read_unlock(); 1413 return; 1414 } 1415 1416 sband = local->hw.wiphy->bands[local->hw.conf.channel->band]; 1417 1418 ieee80211_ht_cap_ie_to_sta_ht_cap(sband, 1419 elems.ht_cap_elem, &sta->sta.ht_cap); 1420 1421 ap_ht_cap_flags = sta->sta.ht_cap.cap; 1422 1423 rcu_read_unlock(); 1424 1425 changed |= ieee80211_enable_ht(sdata, elems.ht_info_elem, 1426 bssid, ap_ht_cap_flags); 1427 } 1428 1429 /* Note: country IE parsing is done for us by cfg80211 */ 1430 if (elems.country_elem) { 1431 /* TODO: IBSS also needs this */ 1432 if (elems.pwr_constr_elem) 1433 ieee80211_handle_pwr_constr(sdata, 1434 le16_to_cpu(mgmt->u.probe_resp.capab_info), 1435 elems.pwr_constr_elem, 1436 elems.pwr_constr_elem_len); 1437 } 1438 1439 ieee80211_bss_info_change_notify(sdata, changed); 1440} 1441 1442ieee80211_rx_result ieee80211_sta_rx_mgmt(struct ieee80211_sub_if_data *sdata, 1443 struct sk_buff *skb) 1444{ 1445 struct ieee80211_local *local = sdata->local; 1446 struct ieee80211_mgmt *mgmt; 1447 u16 fc; 1448 1449 if (skb->len < 24) 1450 return RX_DROP_MONITOR; 1451 1452 mgmt = (struct ieee80211_mgmt *) skb->data; 1453 fc = le16_to_cpu(mgmt->frame_control); 1454 1455 switch (fc & IEEE80211_FCTL_STYPE) { 1456 case IEEE80211_STYPE_PROBE_RESP: 1457 case IEEE80211_STYPE_BEACON: 1458 case IEEE80211_STYPE_DEAUTH: 1459 case IEEE80211_STYPE_DISASSOC: 1460 case IEEE80211_STYPE_ACTION: 1461 skb_queue_tail(&sdata->u.mgd.skb_queue, skb); 1462 ieee80211_queue_work(&local->hw, &sdata->u.mgd.work); 1463 return RX_QUEUED; 1464 } 1465 1466 return RX_DROP_MONITOR; 1467} 1468 1469static void ieee80211_sta_rx_queued_mgmt(struct ieee80211_sub_if_data *sdata, 1470 struct sk_buff *skb) 1471{ 1472 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; 1473 struct ieee80211_rx_status *rx_status; 1474 struct ieee80211_mgmt *mgmt; 1475 enum rx_mgmt_action rma = RX_MGMT_NONE; 1476 u16 fc; 1477 1478 rx_status = (struct ieee80211_rx_status *) skb->cb; 1479 mgmt = (struct ieee80211_mgmt *) skb->data; 1480 fc = le16_to_cpu(mgmt->frame_control); 1481 1482 mutex_lock(&ifmgd->mtx); 1483 1484 if (ifmgd->associated && 1485 memcmp(ifmgd->associated->bssid, mgmt->bssid, ETH_ALEN) == 0) { 1486 switch (fc & IEEE80211_FCTL_STYPE) { 1487 case IEEE80211_STYPE_BEACON: 1488 ieee80211_rx_mgmt_beacon(sdata, mgmt, skb->len, 1489 rx_status); 1490 break; 1491 case IEEE80211_STYPE_PROBE_RESP: 1492 ieee80211_rx_mgmt_probe_resp(sdata, skb); 1493 break; 1494 case IEEE80211_STYPE_DEAUTH: 1495 rma = ieee80211_rx_mgmt_deauth(sdata, mgmt, skb->len); 1496 break; 1497 case IEEE80211_STYPE_DISASSOC: 1498 rma = ieee80211_rx_mgmt_disassoc(sdata, mgmt, skb->len); 1499 break; 1500 case IEEE80211_STYPE_ACTION: 1501 if (mgmt->u.action.category != WLAN_CATEGORY_SPECTRUM_MGMT) 1502 break; 1503 1504 ieee80211_sta_process_chanswitch(sdata, 1505 &mgmt->u.action.u.chan_switch.sw_elem, 1506 (void *)ifmgd->associated->priv); 1507 break; 1508 } 1509 mutex_unlock(&ifmgd->mtx); 1510 1511 switch (rma) { 1512 case RX_MGMT_NONE: 1513 /* no action */ 1514 break; 1515 case RX_MGMT_CFG80211_DEAUTH: 1516 cfg80211_send_deauth(sdata->dev, (u8 *)mgmt, skb->len); 1517 break; 1518 case RX_MGMT_CFG80211_DISASSOC: 1519 cfg80211_send_disassoc(sdata->dev, (u8 *)mgmt, skb->len); 1520 break; 1521 default: 1522 WARN(1, "unexpected: %d", rma); 1523 } 1524 goto out; 1525 } 1526 1527 mutex_unlock(&ifmgd->mtx); 1528 1529 if (skb->len >= 24 + 2 /* mgmt + deauth reason */ && 1530 (fc & IEEE80211_FCTL_STYPE) == IEEE80211_STYPE_DEAUTH) 1531 cfg80211_send_deauth(sdata->dev, (u8 *)mgmt, skb->len); 1532 1533 out: 1534 kfree_skb(skb); 1535} 1536 1537static void ieee80211_sta_timer(unsigned long data) 1538{ 1539 struct ieee80211_sub_if_data *sdata = 1540 (struct ieee80211_sub_if_data *) data; 1541 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; 1542 struct ieee80211_local *local = sdata->local; 1543 1544 if (local->quiescing) { 1545 set_bit(TMR_RUNNING_TIMER, &ifmgd->timers_running); 1546 return; 1547 } 1548 1549 ieee80211_queue_work(&local->hw, &ifmgd->work); 1550} 1551 1552static void ieee80211_sta_work(struct work_struct *work) 1553{ 1554 struct ieee80211_sub_if_data *sdata = 1555 container_of(work, struct ieee80211_sub_if_data, u.mgd.work); 1556 struct ieee80211_local *local = sdata->local; 1557 struct ieee80211_if_managed *ifmgd; 1558 struct sk_buff *skb; 1559 1560 if (!ieee80211_sdata_running(sdata)) 1561 return; 1562 1563 if (local->scanning) 1564 return; 1565 1566 if (WARN_ON(sdata->vif.type != NL80211_IFTYPE_STATION)) 1567 return; 1568 1569 /* 1570 * ieee80211_queue_work() should have picked up most cases, 1571 * here we'll pick the the rest. 1572 */ 1573 if (WARN(local->suspended, "STA MLME work scheduled while " 1574 "going to suspend\n")) 1575 return; 1576 1577 ifmgd = &sdata->u.mgd; 1578 1579 /* first process frames to avoid timing out while a frame is pending */ 1580 while ((skb = skb_dequeue(&ifmgd->skb_queue))) 1581 ieee80211_sta_rx_queued_mgmt(sdata, skb); 1582 1583 /* then process the rest of the work */ 1584 mutex_lock(&ifmgd->mtx); 1585 1586 if (ifmgd->flags & (IEEE80211_STA_BEACON_POLL | 1587 IEEE80211_STA_CONNECTION_POLL) && 1588 ifmgd->associated) { 1589 u8 bssid[ETH_ALEN]; 1590 1591 memcpy(bssid, ifmgd->associated->bssid, ETH_ALEN); 1592 if (time_is_after_jiffies(ifmgd->probe_timeout)) 1593 run_again(ifmgd, ifmgd->probe_timeout); 1594 1595 else if (ifmgd->probe_send_count < IEEE80211_MAX_PROBE_TRIES) { 1596#ifdef CONFIG_MAC80211_VERBOSE_DEBUG 1597 printk(KERN_DEBUG "No probe response from AP %pM" 1598 " after %dms, try %d\n", bssid, 1599 (1000 * IEEE80211_PROBE_WAIT)/HZ, 1600 ifmgd->probe_send_count); 1601#endif 1602 ieee80211_mgd_probe_ap_send(sdata); 1603 } else { 1604 /* 1605 * We actually lost the connection ... or did we? 1606 * Let's make sure! 1607 */ 1608 ifmgd->flags &= ~(IEEE80211_STA_CONNECTION_POLL | 1609 IEEE80211_STA_BEACON_POLL); 1610 printk(KERN_DEBUG "No probe response from AP %pM" 1611 " after %dms, disconnecting.\n", 1612 bssid, (1000 * IEEE80211_PROBE_WAIT)/HZ); 1613 ieee80211_set_disassoc(sdata); 1614 ieee80211_recalc_idle(local); 1615 mutex_unlock(&ifmgd->mtx); 1616 /* 1617 * must be outside lock due to cfg80211, 1618 * but that's not a problem. 1619 */ 1620 ieee80211_send_deauth_disassoc(sdata, bssid, 1621 IEEE80211_STYPE_DEAUTH, 1622 WLAN_REASON_DISASSOC_DUE_TO_INACTIVITY, 1623 NULL); 1624 mutex_lock(&ifmgd->mtx); 1625 } 1626 } 1627 1628 mutex_unlock(&ifmgd->mtx); 1629} 1630 1631static void ieee80211_sta_bcn_mon_timer(unsigned long data) 1632{ 1633 struct ieee80211_sub_if_data *sdata = 1634 (struct ieee80211_sub_if_data *) data; 1635 struct ieee80211_local *local = sdata->local; 1636 1637 if (local->quiescing) 1638 return; 1639 1640 ieee80211_queue_work(&sdata->local->hw, &sdata->u.mgd.beacon_loss_work); 1641} 1642 1643static void ieee80211_sta_conn_mon_timer(unsigned long data) 1644{ 1645 struct ieee80211_sub_if_data *sdata = 1646 (struct ieee80211_sub_if_data *) data; 1647 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; 1648 struct ieee80211_local *local = sdata->local; 1649 1650 if (local->quiescing) 1651 return; 1652 1653 ieee80211_queue_work(&local->hw, &ifmgd->monitor_work); 1654} 1655 1656static void ieee80211_sta_monitor_work(struct work_struct *work) 1657{ 1658 struct ieee80211_sub_if_data *sdata = 1659 container_of(work, struct ieee80211_sub_if_data, 1660 u.mgd.monitor_work); 1661 1662 ieee80211_mgd_probe_ap(sdata, false); 1663} 1664 1665static void ieee80211_restart_sta_timer(struct ieee80211_sub_if_data *sdata) 1666{ 1667 if (sdata->vif.type == NL80211_IFTYPE_STATION) { 1668 sdata->u.mgd.flags &= ~(IEEE80211_STA_BEACON_POLL | 1669 IEEE80211_STA_CONNECTION_POLL); 1670 1671 /* let's probe the connection once */ 1672 ieee80211_queue_work(&sdata->local->hw, 1673 &sdata->u.mgd.monitor_work); 1674 /* and do all the other regular work too */ 1675 ieee80211_queue_work(&sdata->local->hw, 1676 &sdata->u.mgd.work); 1677 } 1678} 1679 1680#ifdef CONFIG_PM 1681void ieee80211_sta_quiesce(struct ieee80211_sub_if_data *sdata) 1682{ 1683 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; 1684 1685 /* 1686 * we need to use atomic bitops for the running bits 1687 * only because both timers might fire at the same 1688 * time -- the code here is properly synchronised. 1689 */ 1690 1691 cancel_work_sync(&ifmgd->work); 1692 cancel_work_sync(&ifmgd->beacon_loss_work); 1693 if (del_timer_sync(&ifmgd->timer)) 1694 set_bit(TMR_RUNNING_TIMER, &ifmgd->timers_running); 1695 1696 cancel_work_sync(&ifmgd->chswitch_work); 1697 if (del_timer_sync(&ifmgd->chswitch_timer)) 1698 set_bit(TMR_RUNNING_CHANSW, &ifmgd->timers_running); 1699 1700 cancel_work_sync(&ifmgd->monitor_work); 1701 /* these will just be re-established on connection */ 1702 del_timer_sync(&ifmgd->conn_mon_timer); 1703 del_timer_sync(&ifmgd->bcn_mon_timer); 1704} 1705 1706void ieee80211_sta_restart(struct ieee80211_sub_if_data *sdata) 1707{ 1708 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; 1709 1710 if (test_and_clear_bit(TMR_RUNNING_TIMER, &ifmgd->timers_running)) 1711 add_timer(&ifmgd->timer); 1712 if (test_and_clear_bit(TMR_RUNNING_CHANSW, &ifmgd->timers_running)) 1713 add_timer(&ifmgd->chswitch_timer); 1714} 1715#endif 1716 1717/* interface setup */ 1718void ieee80211_sta_setup_sdata(struct ieee80211_sub_if_data *sdata) 1719{ 1720 struct ieee80211_if_managed *ifmgd; 1721 1722 ifmgd = &sdata->u.mgd; 1723 INIT_WORK(&ifmgd->work, ieee80211_sta_work); 1724 INIT_WORK(&ifmgd->monitor_work, ieee80211_sta_monitor_work); 1725 INIT_WORK(&ifmgd->chswitch_work, ieee80211_chswitch_work); 1726 INIT_WORK(&ifmgd->beacon_loss_work, ieee80211_beacon_loss_work); 1727 setup_timer(&ifmgd->timer, ieee80211_sta_timer, 1728 (unsigned long) sdata); 1729 setup_timer(&ifmgd->bcn_mon_timer, ieee80211_sta_bcn_mon_timer, 1730 (unsigned long) sdata); 1731 setup_timer(&ifmgd->conn_mon_timer, ieee80211_sta_conn_mon_timer, 1732 (unsigned long) sdata); 1733 setup_timer(&ifmgd->chswitch_timer, ieee80211_chswitch_timer, 1734 (unsigned long) sdata); 1735 skb_queue_head_init(&ifmgd->skb_queue); 1736 1737 ifmgd->flags = 0; 1738 1739 mutex_init(&ifmgd->mtx); 1740 1741 if (sdata->local->hw.flags & IEEE80211_HW_SUPPORTS_DYNAMIC_SMPS) 1742 ifmgd->req_smps = IEEE80211_SMPS_AUTOMATIC; 1743 else 1744 ifmgd->req_smps = IEEE80211_SMPS_OFF; 1745} 1746 1747/* scan finished notification */ 1748void ieee80211_mlme_notify_scan_completed(struct ieee80211_local *local) 1749{ 1750 struct ieee80211_sub_if_data *sdata = local->scan_sdata; 1751 1752 /* Restart STA timers */ 1753 rcu_read_lock(); 1754 list_for_each_entry_rcu(sdata, &local->interfaces, list) 1755 ieee80211_restart_sta_timer(sdata); 1756 rcu_read_unlock(); 1757} 1758 1759int ieee80211_max_network_latency(struct notifier_block *nb, 1760 unsigned long data, void *dummy) 1761{ 1762 s32 latency_usec = (s32) data; 1763 struct ieee80211_local *local = 1764 container_of(nb, struct ieee80211_local, 1765 network_latency_notifier); 1766 1767 mutex_lock(&local->iflist_mtx); 1768 ieee80211_recalc_ps(local, latency_usec); 1769 mutex_unlock(&local->iflist_mtx); 1770 1771 return 0; 1772} 1773 1774/* config hooks */ 1775static enum work_done_result 1776ieee80211_probe_auth_done(struct ieee80211_work *wk, 1777 struct sk_buff *skb) 1778{ 1779 if (!skb) { 1780 cfg80211_send_auth_timeout(wk->sdata->dev, wk->filter_ta); 1781 return WORK_DONE_DESTROY; 1782 } 1783 1784 if (wk->type == IEEE80211_WORK_AUTH) { 1785 cfg80211_send_rx_auth(wk->sdata->dev, skb->data, skb->len); 1786 return WORK_DONE_DESTROY; 1787 } 1788 1789 mutex_lock(&wk->sdata->u.mgd.mtx); 1790 ieee80211_rx_mgmt_probe_resp(wk->sdata, skb); 1791 mutex_unlock(&wk->sdata->u.mgd.mtx); 1792 1793 wk->type = IEEE80211_WORK_AUTH; 1794 wk->probe_auth.tries = 0; 1795 return WORK_DONE_REQUEUE; 1796} 1797 1798int ieee80211_mgd_auth(struct ieee80211_sub_if_data *sdata, 1799 struct cfg80211_auth_request *req) 1800{ 1801 const u8 *ssid; 1802 struct ieee80211_work *wk; 1803 u16 auth_alg; 1804 1805 switch (req->auth_type) { 1806 case NL80211_AUTHTYPE_OPEN_SYSTEM: 1807 auth_alg = WLAN_AUTH_OPEN; 1808 break; 1809 case NL80211_AUTHTYPE_SHARED_KEY: 1810 auth_alg = WLAN_AUTH_SHARED_KEY; 1811 break; 1812 case NL80211_AUTHTYPE_FT: 1813 auth_alg = WLAN_AUTH_FT; 1814 break; 1815 case NL80211_AUTHTYPE_NETWORK_EAP: 1816 auth_alg = WLAN_AUTH_LEAP; 1817 break; 1818 default: 1819 return -EOPNOTSUPP; 1820 } 1821 1822 wk = kzalloc(sizeof(*wk) + req->ie_len, GFP_KERNEL); 1823 if (!wk) 1824 return -ENOMEM; 1825 1826 memcpy(wk->filter_ta, req->bss->bssid, ETH_ALEN); 1827 1828 if (req->ie && req->ie_len) { 1829 memcpy(wk->ie, req->ie, req->ie_len); 1830 wk->ie_len = req->ie_len; 1831 } 1832 1833 if (req->key && req->key_len) { 1834 wk->probe_auth.key_len = req->key_len; 1835 wk->probe_auth.key_idx = req->key_idx; 1836 memcpy(wk->probe_auth.key, req->key, req->key_len); 1837 } 1838 1839 ssid = ieee80211_bss_get_ie(req->bss, WLAN_EID_SSID); 1840 memcpy(wk->probe_auth.ssid, ssid + 2, ssid[1]); 1841 wk->probe_auth.ssid_len = ssid[1]; 1842 1843 wk->probe_auth.algorithm = auth_alg; 1844 wk->probe_auth.privacy = req->bss->capability & WLAN_CAPABILITY_PRIVACY; 1845 1846 /* if we already have a probe, don't probe again */ 1847 if (req->bss->proberesp_ies) 1848 wk->type = IEEE80211_WORK_AUTH; 1849 else 1850 wk->type = IEEE80211_WORK_DIRECT_PROBE; 1851 wk->chan = req->bss->channel; 1852 wk->sdata = sdata; 1853 wk->done = ieee80211_probe_auth_done; 1854 1855 ieee80211_add_work(wk); 1856 return 0; 1857} 1858 1859static enum work_done_result ieee80211_assoc_done(struct ieee80211_work *wk, 1860 struct sk_buff *skb) 1861{ 1862 struct ieee80211_mgmt *mgmt; 1863 u16 status; 1864 1865 if (!skb) { 1866 cfg80211_send_assoc_timeout(wk->sdata->dev, wk->filter_ta); 1867 return WORK_DONE_DESTROY; 1868 } 1869 1870 mgmt = (void *)skb->data; 1871 status = le16_to_cpu(mgmt->u.assoc_resp.status_code); 1872 1873 if (status == WLAN_STATUS_SUCCESS) { 1874 mutex_lock(&wk->sdata->u.mgd.mtx); 1875 if (!ieee80211_assoc_success(wk, mgmt, skb->len)) { 1876 mutex_unlock(&wk->sdata->u.mgd.mtx); 1877 /* oops -- internal error -- send timeout for now */ 1878 cfg80211_send_assoc_timeout(wk->sdata->dev, 1879 wk->filter_ta); 1880 return WORK_DONE_DESTROY; 1881 } 1882 mutex_unlock(&wk->sdata->u.mgd.mtx); 1883 } 1884 1885 cfg80211_send_rx_assoc(wk->sdata->dev, skb->data, skb->len); 1886 return WORK_DONE_DESTROY; 1887} 1888 1889int ieee80211_mgd_assoc(struct ieee80211_sub_if_data *sdata, 1890 struct cfg80211_assoc_request *req) 1891{ 1892 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; 1893 struct ieee80211_bss *bss = (void *)req->bss->priv; 1894 struct ieee80211_work *wk; 1895 const u8 *ssid; 1896 int i; 1897 1898 mutex_lock(&ifmgd->mtx); 1899 if (ifmgd->associated) { 1900 if (!req->prev_bssid || 1901 memcmp(req->prev_bssid, ifmgd->associated->bssid, 1902 ETH_ALEN)) { 1903 /* 1904 * We are already associated and the request was not a 1905 * reassociation request from the current BSS, so 1906 * reject it. 1907 */ 1908 mutex_unlock(&ifmgd->mtx); 1909 return -EALREADY; 1910 } 1911 1912 /* Trying to reassociate - clear previous association state */ 1913 ieee80211_set_disassoc(sdata); 1914 } 1915 mutex_unlock(&ifmgd->mtx); 1916 1917 wk = kzalloc(sizeof(*wk) + req->ie_len, GFP_KERNEL); 1918 if (!wk) 1919 return -ENOMEM; 1920 1921 ifmgd->flags &= ~IEEE80211_STA_DISABLE_11N; 1922 ifmgd->flags &= ~IEEE80211_STA_NULLFUNC_ACKED; 1923 1924 for (i = 0; i < req->crypto.n_ciphers_pairwise; i++) 1925 if (req->crypto.ciphers_pairwise[i] == WLAN_CIPHER_SUITE_WEP40 || 1926 req->crypto.ciphers_pairwise[i] == WLAN_CIPHER_SUITE_TKIP || 1927 req->crypto.ciphers_pairwise[i] == WLAN_CIPHER_SUITE_WEP104) 1928 ifmgd->flags |= IEEE80211_STA_DISABLE_11N; 1929 1930 1931 if (req->ie && req->ie_len) { 1932 memcpy(wk->ie, req->ie, req->ie_len); 1933 wk->ie_len = req->ie_len; 1934 } else 1935 wk->ie_len = 0; 1936 1937 wk->assoc.bss = req->bss; 1938 1939 memcpy(wk->filter_ta, req->bss->bssid, ETH_ALEN); 1940 1941 /* new association always uses requested smps mode */ 1942 if (ifmgd->req_smps == IEEE80211_SMPS_AUTOMATIC) { 1943 if (ifmgd->powersave) 1944 ifmgd->ap_smps = IEEE80211_SMPS_DYNAMIC; 1945 else 1946 ifmgd->ap_smps = IEEE80211_SMPS_OFF; 1947 } else 1948 ifmgd->ap_smps = ifmgd->req_smps; 1949 1950 wk->assoc.smps = ifmgd->ap_smps; 1951 /* 1952 * IEEE802.11n does not allow TKIP/WEP as pairwise ciphers in HT mode. 1953 * We still associate in non-HT mode (11a/b/g) if any one of these 1954 * ciphers is configured as pairwise. 1955 * We can set this to true for non-11n hardware, that'll be checked 1956 * separately along with the peer capabilities. 1957 */ 1958 wk->assoc.use_11n = !(ifmgd->flags & IEEE80211_STA_DISABLE_11N); 1959 wk->assoc.capability = req->bss->capability; 1960 wk->assoc.wmm_used = bss->wmm_used; 1961 wk->assoc.supp_rates = bss->supp_rates; 1962 wk->assoc.supp_rates_len = bss->supp_rates_len; 1963 wk->assoc.ht_information_ie = 1964 ieee80211_bss_get_ie(req->bss, WLAN_EID_HT_INFORMATION); 1965 1966 if (bss->wmm_used && bss->uapsd_supported && 1967 (sdata->local->hw.flags & IEEE80211_HW_SUPPORTS_UAPSD)) { 1968 wk->assoc.uapsd_used = true; 1969 ifmgd->flags |= IEEE80211_STA_UAPSD_ENABLED; 1970 } else { 1971 wk->assoc.uapsd_used = false; 1972 ifmgd->flags &= ~IEEE80211_STA_UAPSD_ENABLED; 1973 } 1974 1975 ssid = ieee80211_bss_get_ie(req->bss, WLAN_EID_SSID); 1976 memcpy(wk->assoc.ssid, ssid + 2, ssid[1]); 1977 wk->assoc.ssid_len = ssid[1]; 1978 1979 if (req->prev_bssid) 1980 memcpy(wk->assoc.prev_bssid, req->prev_bssid, ETH_ALEN); 1981 1982 wk->type = IEEE80211_WORK_ASSOC; 1983 wk->chan = req->bss->channel; 1984 wk->sdata = sdata; 1985 wk->done = ieee80211_assoc_done; 1986 1987 if (req->use_mfp) { 1988 ifmgd->mfp = IEEE80211_MFP_REQUIRED; 1989 ifmgd->flags |= IEEE80211_STA_MFP_ENABLED; 1990 } else { 1991 ifmgd->mfp = IEEE80211_MFP_DISABLED; 1992 ifmgd->flags &= ~IEEE80211_STA_MFP_ENABLED; 1993 } 1994 1995 if (req->crypto.control_port) 1996 ifmgd->flags |= IEEE80211_STA_CONTROL_PORT; 1997 else 1998 ifmgd->flags &= ~IEEE80211_STA_CONTROL_PORT; 1999 2000 ieee80211_add_work(wk); 2001 return 0; 2002} 2003 2004int ieee80211_mgd_deauth(struct ieee80211_sub_if_data *sdata, 2005 struct cfg80211_deauth_request *req, 2006 void *cookie) 2007{ 2008 struct ieee80211_local *local = sdata->local; 2009 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; 2010 struct ieee80211_work *wk; 2011 const u8 *bssid = req->bss->bssid; 2012 2013 mutex_lock(&ifmgd->mtx); 2014 2015 if (ifmgd->associated == req->bss) { 2016 bssid = req->bss->bssid; 2017 ieee80211_set_disassoc(sdata); 2018 mutex_unlock(&ifmgd->mtx); 2019 } else { 2020 bool not_auth_yet = false; 2021 2022 mutex_unlock(&ifmgd->mtx); 2023 2024 mutex_lock(&local->work_mtx); 2025 list_for_each_entry(wk, &local->work_list, list) { 2026 if (wk->sdata != sdata) 2027 continue; 2028 2029 if (wk->type != IEEE80211_WORK_DIRECT_PROBE && 2030 wk->type != IEEE80211_WORK_AUTH) 2031 continue; 2032 2033 if (memcmp(req->bss->bssid, wk->filter_ta, ETH_ALEN)) 2034 continue; 2035 2036 not_auth_yet = wk->type == IEEE80211_WORK_DIRECT_PROBE; 2037 list_del_rcu(&wk->list); 2038 free_work(wk); 2039 break; 2040 } 2041 mutex_unlock(&local->work_mtx); 2042 2043 /* 2044 * If somebody requests authentication and we haven't 2045 * sent out an auth frame yet there's no need to send 2046 * out a deauth frame either. If the state was PROBE, 2047 * then this is the case. If it's AUTH we have sent a 2048 * frame, and if it's IDLE we have completed the auth 2049 * process already. 2050 */ 2051 if (not_auth_yet) { 2052 __cfg80211_auth_canceled(sdata->dev, bssid); 2053 return 0; 2054 } 2055 } 2056 2057 printk(KERN_DEBUG "%s: deauthenticating from %pM by local choice (reason=%d)\n", 2058 sdata->name, bssid, req->reason_code); 2059 2060 ieee80211_send_deauth_disassoc(sdata, bssid, 2061 IEEE80211_STYPE_DEAUTH, req->reason_code, 2062 cookie); 2063 2064 ieee80211_recalc_idle(sdata->local); 2065 2066 return 0; 2067} 2068 2069int ieee80211_mgd_disassoc(struct ieee80211_sub_if_data *sdata, 2070 struct cfg80211_disassoc_request *req, 2071 void *cookie) 2072{ 2073 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; 2074 2075 mutex_lock(&ifmgd->mtx); 2076 2077 /* 2078 * cfg80211 should catch this ... but it's racy since 2079 * we can receive a disassoc frame, process it, hand it 2080 * to cfg80211 while that's in a locked section already 2081 * trying to tell us that the user wants to disconnect. 2082 */ 2083 if (ifmgd->associated != req->bss) { 2084 mutex_unlock(&ifmgd->mtx); 2085 return -ENOLINK; 2086 } 2087 2088 printk(KERN_DEBUG "%s: disassociating from %pM by local choice (reason=%d)\n", 2089 sdata->name, req->bss->bssid, req->reason_code); 2090 2091 ieee80211_set_disassoc(sdata); 2092 2093 mutex_unlock(&ifmgd->mtx); 2094 2095 ieee80211_send_deauth_disassoc(sdata, req->bss->bssid, 2096 IEEE80211_STYPE_DISASSOC, req->reason_code, 2097 cookie); 2098 2099 ieee80211_recalc_idle(sdata->local); 2100 2101 return 0; 2102} 2103 2104int ieee80211_mgd_action(struct ieee80211_sub_if_data *sdata, 2105 struct ieee80211_channel *chan, 2106 enum nl80211_channel_type channel_type, 2107 const u8 *buf, size_t len, u64 *cookie) 2108{ 2109 struct ieee80211_local *local = sdata->local; 2110 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; 2111 struct sk_buff *skb; 2112 2113 /* Check that we are on the requested channel for transmission */ 2114 if ((chan != local->tmp_channel || 2115 channel_type != local->tmp_channel_type) && 2116 (chan != local->oper_channel || 2117 channel_type != local->oper_channel_type)) 2118 return -EBUSY; 2119 2120 skb = dev_alloc_skb(local->hw.extra_tx_headroom + len); 2121 if (!skb) 2122 return -ENOMEM; 2123 skb_reserve(skb, local->hw.extra_tx_headroom); 2124 2125 memcpy(skb_put(skb, len), buf, len); 2126 2127 if (!(ifmgd->flags & IEEE80211_STA_MFP_ENABLED)) 2128 IEEE80211_SKB_CB(skb)->flags |= 2129 IEEE80211_TX_INTFL_DONT_ENCRYPT; 2130 IEEE80211_SKB_CB(skb)->flags |= IEEE80211_TX_INTFL_NL80211_FRAME_TX | 2131 IEEE80211_TX_CTL_REQ_TX_STATUS; 2132 skb->dev = sdata->dev; 2133 ieee80211_tx_skb(sdata, skb); 2134 2135 *cookie = (unsigned long) skb; 2136 return 0; 2137}