1 /* 2 * Copyright 2002-2005, Instant802 Networks, Inc. 3 * Copyright 2005-2006, Devicescape Software, Inc. 4 * Copyright 2006-2007 Jiri Benc <jbenc@suse.cz> 5 * Copyright 2007 Johannes Berg <johannes@sipsolutions.net> 6 * 7 * This program is free software; you can redistribute it and/or modify 8 * it under the terms of the GNU General Public License version 2 as 9 * published by the Free Software Foundation. 10 * 11 * utilities for mac80211 12 */ 13 14 #include <net/mac80211.h> 15 #include <linux/netdevice.h> 16 #include <linux/export.h> 17 #include <linux/types.h> 18 #include <linux/slab.h> 19 #include <linux/skbuff.h> 20 #include <linux/etherdevice.h> 21 #include <linux/if_arp.h> 22 #include <linux/bitmap.h> 23 #include <linux/crc32.h> 24 #include <net/net_namespace.h> 25 #include <net/cfg80211.h> 26 #include <net/rtnetlink.h> 27 28 #include "ieee80211_i.h" 29 #include "driver-ops.h" 30 #include "rate.h" 31 #include "mesh.h" 32 #include "wme.h" 33 #include "led.h" 34 #include "wep.h" 35 36 /* privid for wiphys to determine whether they belong to us or not */ 37 void *mac80211_wiphy_privid = &mac80211_wiphy_privid; 38 39 struct ieee80211_hw *wiphy_to_ieee80211_hw(struct wiphy *wiphy) 40 { 41 struct ieee80211_local *local; 42 BUG_ON(!wiphy); 43 44 local = wiphy_priv(wiphy); 45 return &local->hw; 46 } 47 EXPORT_SYMBOL(wiphy_to_ieee80211_hw); 48 49 u8 *ieee80211_get_bssid(struct ieee80211_hdr *hdr, size_t len, 50 enum nl80211_iftype type) 51 { 52 __le16 fc = hdr->frame_control; 53 54 /* drop ACK/CTS frames and incorrect hdr len (ctrl) */ 55 if (len < 16) 56 return NULL; 57 58 if (ieee80211_is_data(fc)) { 59 if (len < 24) /* drop incorrect hdr len (data) */ 60 return NULL; 61 62 if (ieee80211_has_a4(fc)) 63 return NULL; 64 if (ieee80211_has_tods(fc)) 65 return hdr->addr1; 66 if (ieee80211_has_fromds(fc)) 67 return hdr->addr2; 68 69 return hdr->addr3; 70 } 71 72 if (ieee80211_is_mgmt(fc)) { 73 if (len < 24) /* drop incorrect hdr len (mgmt) */ 74 return NULL; 75 return hdr->addr3; 76 } 77 78 if (ieee80211_is_ctl(fc)) { 79 if(ieee80211_is_pspoll(fc)) 80 return hdr->addr1; 81 82 if (ieee80211_is_back_req(fc)) { 83 switch (type) { 84 case NL80211_IFTYPE_STATION: 85 return hdr->addr2; 86 case NL80211_IFTYPE_AP: 87 case NL80211_IFTYPE_AP_VLAN: 88 return hdr->addr1; 89 default: 90 break; /* fall through to the return */ 91 } 92 } 93 } 94 95 return NULL; 96 } 97 98 void ieee80211_tx_set_protected(struct ieee80211_tx_data *tx) 99 { 100 struct sk_buff *skb; 101 struct ieee80211_hdr *hdr; 102 103 skb_queue_walk(&tx->skbs, skb) { 104 hdr = (struct ieee80211_hdr *) skb->data; 105 hdr->frame_control |= cpu_to_le16(IEEE80211_FCTL_PROTECTED); 106 } 107 } 108 109 int ieee80211_frame_duration(struct ieee80211_local *local, size_t len, 110 int rate, int erp, int short_preamble) 111 { 112 int dur; 113 114 /* calculate duration (in microseconds, rounded up to next higher 115 * integer if it includes a fractional microsecond) to send frame of 116 * len bytes (does not include FCS) at the given rate. Duration will 117 * also include SIFS. 118 * 119 * rate is in 100 kbps, so divident is multiplied by 10 in the 120 * DIV_ROUND_UP() operations. 121 */ 122 123 if (local->hw.conf.channel->band == IEEE80211_BAND_5GHZ || erp) { 124 /* 125 * OFDM: 126 * 127 * N_DBPS = DATARATE x 4 128 * N_SYM = Ceiling((16+8xLENGTH+6) / N_DBPS) 129 * (16 = SIGNAL time, 6 = tail bits) 130 * TXTIME = T_PREAMBLE + T_SIGNAL + T_SYM x N_SYM + Signal Ext 131 * 132 * T_SYM = 4 usec 133 * 802.11a - 17.5.2: aSIFSTime = 16 usec 134 * 802.11g - 19.8.4: aSIFSTime = 10 usec + 135 * signal ext = 6 usec 136 */ 137 dur = 16; /* SIFS + signal ext */ 138 dur += 16; /* 17.3.2.3: T_PREAMBLE = 16 usec */ 139 dur += 4; /* 17.3.2.3: T_SIGNAL = 4 usec */ 140 dur += 4 * DIV_ROUND_UP((16 + 8 * (len + 4) + 6) * 10, 141 4 * rate); /* T_SYM x N_SYM */ 142 } else { 143 /* 144 * 802.11b or 802.11g with 802.11b compatibility: 145 * 18.3.4: TXTIME = PreambleLength + PLCPHeaderTime + 146 * Ceiling(((LENGTH+PBCC)x8)/DATARATE). PBCC=0. 147 * 148 * 802.11 (DS): 15.3.3, 802.11b: 18.3.4 149 * aSIFSTime = 10 usec 150 * aPreambleLength = 144 usec or 72 usec with short preamble 151 * aPLCPHeaderLength = 48 usec or 24 usec with short preamble 152 */ 153 dur = 10; /* aSIFSTime = 10 usec */ 154 dur += short_preamble ? (72 + 24) : (144 + 48); 155 156 dur += DIV_ROUND_UP(8 * (len + 4) * 10, rate); 157 } 158 159 return dur; 160 } 161 162 /* Exported duration function for driver use */ 163 __le16 ieee80211_generic_frame_duration(struct ieee80211_hw *hw, 164 struct ieee80211_vif *vif, 165 size_t frame_len, 166 struct ieee80211_rate *rate) 167 { 168 struct ieee80211_local *local = hw_to_local(hw); 169 struct ieee80211_sub_if_data *sdata; 170 u16 dur; 171 int erp; 172 bool short_preamble = false; 173 174 erp = 0; 175 if (vif) { 176 sdata = vif_to_sdata(vif); 177 short_preamble = sdata->vif.bss_conf.use_short_preamble; 178 if (sdata->flags & IEEE80211_SDATA_OPERATING_GMODE) 179 erp = rate->flags & IEEE80211_RATE_ERP_G; 180 } 181 182 dur = ieee80211_frame_duration(local, frame_len, rate->bitrate, erp, 183 short_preamble); 184 185 return cpu_to_le16(dur); 186 } 187 EXPORT_SYMBOL(ieee80211_generic_frame_duration); 188 189 __le16 ieee80211_rts_duration(struct ieee80211_hw *hw, 190 struct ieee80211_vif *vif, size_t frame_len, 191 const struct ieee80211_tx_info *frame_txctl) 192 { 193 struct ieee80211_local *local = hw_to_local(hw); 194 struct ieee80211_rate *rate; 195 struct ieee80211_sub_if_data *sdata; 196 bool short_preamble; 197 int erp; 198 u16 dur; 199 struct ieee80211_supported_band *sband; 200 201 sband = local->hw.wiphy->bands[local->hw.conf.channel->band]; 202 203 short_preamble = false; 204 205 rate = &sband->bitrates[frame_txctl->control.rts_cts_rate_idx]; 206 207 erp = 0; 208 if (vif) { 209 sdata = vif_to_sdata(vif); 210 short_preamble = sdata->vif.bss_conf.use_short_preamble; 211 if (sdata->flags & IEEE80211_SDATA_OPERATING_GMODE) 212 erp = rate->flags & IEEE80211_RATE_ERP_G; 213 } 214 215 /* CTS duration */ 216 dur = ieee80211_frame_duration(local, 10, rate->bitrate, 217 erp, short_preamble); 218 /* Data frame duration */ 219 dur += ieee80211_frame_duration(local, frame_len, rate->bitrate, 220 erp, short_preamble); 221 /* ACK duration */ 222 dur += ieee80211_frame_duration(local, 10, rate->bitrate, 223 erp, short_preamble); 224 225 return cpu_to_le16(dur); 226 } 227 EXPORT_SYMBOL(ieee80211_rts_duration); 228 229 __le16 ieee80211_ctstoself_duration(struct ieee80211_hw *hw, 230 struct ieee80211_vif *vif, 231 size_t frame_len, 232 const struct ieee80211_tx_info *frame_txctl) 233 { 234 struct ieee80211_local *local = hw_to_local(hw); 235 struct ieee80211_rate *rate; 236 struct ieee80211_sub_if_data *sdata; 237 bool short_preamble; 238 int erp; 239 u16 dur; 240 struct ieee80211_supported_band *sband; 241 242 sband = local->hw.wiphy->bands[local->hw.conf.channel->band]; 243 244 short_preamble = false; 245 246 rate = &sband->bitrates[frame_txctl->control.rts_cts_rate_idx]; 247 erp = 0; 248 if (vif) { 249 sdata = vif_to_sdata(vif); 250 short_preamble = sdata->vif.bss_conf.use_short_preamble; 251 if (sdata->flags & IEEE80211_SDATA_OPERATING_GMODE) 252 erp = rate->flags & IEEE80211_RATE_ERP_G; 253 } 254 255 /* Data frame duration */ 256 dur = ieee80211_frame_duration(local, frame_len, rate->bitrate, 257 erp, short_preamble); 258 if (!(frame_txctl->flags & IEEE80211_TX_CTL_NO_ACK)) { 259 /* ACK duration */ 260 dur += ieee80211_frame_duration(local, 10, rate->bitrate, 261 erp, short_preamble); 262 } 263 264 return cpu_to_le16(dur); 265 } 266 EXPORT_SYMBOL(ieee80211_ctstoself_duration); 267 268 static void __ieee80211_wake_queue(struct ieee80211_hw *hw, int queue, 269 enum queue_stop_reason reason) 270 { 271 struct ieee80211_local *local = hw_to_local(hw); 272 struct ieee80211_sub_if_data *sdata; 273 274 trace_wake_queue(local, queue, reason); 275 276 if (WARN_ON(queue >= hw->queues)) 277 return; 278 279 __clear_bit(reason, &local->queue_stop_reasons[queue]); 280 281 if (local->queue_stop_reasons[queue] != 0) 282 /* someone still has this queue stopped */ 283 return; 284 285 if (skb_queue_empty(&local->pending[queue])) { 286 rcu_read_lock(); 287 list_for_each_entry_rcu(sdata, &local->interfaces, list) { 288 if (test_bit(SDATA_STATE_OFFCHANNEL, &sdata->state)) 289 continue; 290 netif_wake_subqueue(sdata->dev, queue); 291 } 292 rcu_read_unlock(); 293 } else 294 tasklet_schedule(&local->tx_pending_tasklet); 295 } 296 297 void ieee80211_wake_queue_by_reason(struct ieee80211_hw *hw, int queue, 298 enum queue_stop_reason reason) 299 { 300 struct ieee80211_local *local = hw_to_local(hw); 301 unsigned long flags; 302 303 spin_lock_irqsave(&local->queue_stop_reason_lock, flags); 304 __ieee80211_wake_queue(hw, queue, reason); 305 spin_unlock_irqrestore(&local->queue_stop_reason_lock, flags); 306 } 307 308 void ieee80211_wake_queue(struct ieee80211_hw *hw, int queue) 309 { 310 ieee80211_wake_queue_by_reason(hw, queue, 311 IEEE80211_QUEUE_STOP_REASON_DRIVER); 312 } 313 EXPORT_SYMBOL(ieee80211_wake_queue); 314 315 static void __ieee80211_stop_queue(struct ieee80211_hw *hw, int queue, 316 enum queue_stop_reason reason) 317 { 318 struct ieee80211_local *local = hw_to_local(hw); 319 struct ieee80211_sub_if_data *sdata; 320 321 trace_stop_queue(local, queue, reason); 322 323 if (WARN_ON(queue >= hw->queues)) 324 return; 325 326 __set_bit(reason, &local->queue_stop_reasons[queue]); 327 328 rcu_read_lock(); 329 list_for_each_entry_rcu(sdata, &local->interfaces, list) 330 netif_stop_subqueue(sdata->dev, queue); 331 rcu_read_unlock(); 332 } 333 334 void ieee80211_stop_queue_by_reason(struct ieee80211_hw *hw, int queue, 335 enum queue_stop_reason reason) 336 { 337 struct ieee80211_local *local = hw_to_local(hw); 338 unsigned long flags; 339 340 spin_lock_irqsave(&local->queue_stop_reason_lock, flags); 341 __ieee80211_stop_queue(hw, queue, reason); 342 spin_unlock_irqrestore(&local->queue_stop_reason_lock, flags); 343 } 344 345 void ieee80211_stop_queue(struct ieee80211_hw *hw, int queue) 346 { 347 ieee80211_stop_queue_by_reason(hw, queue, 348 IEEE80211_QUEUE_STOP_REASON_DRIVER); 349 } 350 EXPORT_SYMBOL(ieee80211_stop_queue); 351 352 void ieee80211_add_pending_skb(struct ieee80211_local *local, 353 struct sk_buff *skb) 354 { 355 struct ieee80211_hw *hw = &local->hw; 356 unsigned long flags; 357 int queue = skb_get_queue_mapping(skb); 358 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); 359 360 if (WARN_ON(!info->control.vif)) { 361 kfree_skb(skb); 362 return; 363 } 364 365 spin_lock_irqsave(&local->queue_stop_reason_lock, flags); 366 __ieee80211_stop_queue(hw, queue, IEEE80211_QUEUE_STOP_REASON_SKB_ADD); 367 __skb_queue_tail(&local->pending[queue], skb); 368 __ieee80211_wake_queue(hw, queue, IEEE80211_QUEUE_STOP_REASON_SKB_ADD); 369 spin_unlock_irqrestore(&local->queue_stop_reason_lock, flags); 370 } 371 372 void ieee80211_add_pending_skbs_fn(struct ieee80211_local *local, 373 struct sk_buff_head *skbs, 374 void (*fn)(void *data), void *data) 375 { 376 struct ieee80211_hw *hw = &local->hw; 377 struct sk_buff *skb; 378 unsigned long flags; 379 int queue, i; 380 381 spin_lock_irqsave(&local->queue_stop_reason_lock, flags); 382 for (i = 0; i < hw->queues; i++) 383 __ieee80211_stop_queue(hw, i, 384 IEEE80211_QUEUE_STOP_REASON_SKB_ADD); 385 386 while ((skb = skb_dequeue(skbs))) { 387 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); 388 389 if (WARN_ON(!info->control.vif)) { 390 kfree_skb(skb); 391 continue; 392 } 393 394 queue = skb_get_queue_mapping(skb); 395 __skb_queue_tail(&local->pending[queue], skb); 396 } 397 398 if (fn) 399 fn(data); 400 401 for (i = 0; i < hw->queues; i++) 402 __ieee80211_wake_queue(hw, i, 403 IEEE80211_QUEUE_STOP_REASON_SKB_ADD); 404 spin_unlock_irqrestore(&local->queue_stop_reason_lock, flags); 405 } 406 407 void ieee80211_add_pending_skbs(struct ieee80211_local *local, 408 struct sk_buff_head *skbs) 409 { 410 ieee80211_add_pending_skbs_fn(local, skbs, NULL, NULL); 411 } 412 413 void ieee80211_stop_queues_by_reason(struct ieee80211_hw *hw, 414 enum queue_stop_reason reason) 415 { 416 struct ieee80211_local *local = hw_to_local(hw); 417 unsigned long flags; 418 int i; 419 420 spin_lock_irqsave(&local->queue_stop_reason_lock, flags); 421 422 for (i = 0; i < hw->queues; i++) 423 __ieee80211_stop_queue(hw, i, reason); 424 425 spin_unlock_irqrestore(&local->queue_stop_reason_lock, flags); 426 } 427 428 void ieee80211_stop_queues(struct ieee80211_hw *hw) 429 { 430 ieee80211_stop_queues_by_reason(hw, 431 IEEE80211_QUEUE_STOP_REASON_DRIVER); 432 } 433 EXPORT_SYMBOL(ieee80211_stop_queues); 434 435 int ieee80211_queue_stopped(struct ieee80211_hw *hw, int queue) 436 { 437 struct ieee80211_local *local = hw_to_local(hw); 438 unsigned long flags; 439 int ret; 440 441 if (WARN_ON(queue >= hw->queues)) 442 return true; 443 444 spin_lock_irqsave(&local->queue_stop_reason_lock, flags); 445 ret = !!local->queue_stop_reasons[queue]; 446 spin_unlock_irqrestore(&local->queue_stop_reason_lock, flags); 447 return ret; 448 } 449 EXPORT_SYMBOL(ieee80211_queue_stopped); 450 451 void ieee80211_wake_queues_by_reason(struct ieee80211_hw *hw, 452 enum queue_stop_reason reason) 453 { 454 struct ieee80211_local *local = hw_to_local(hw); 455 unsigned long flags; 456 int i; 457 458 spin_lock_irqsave(&local->queue_stop_reason_lock, flags); 459 460 for (i = 0; i < hw->queues; i++) 461 __ieee80211_wake_queue(hw, i, reason); 462 463 spin_unlock_irqrestore(&local->queue_stop_reason_lock, flags); 464 } 465 466 void ieee80211_wake_queues(struct ieee80211_hw *hw) 467 { 468 ieee80211_wake_queues_by_reason(hw, IEEE80211_QUEUE_STOP_REASON_DRIVER); 469 } 470 EXPORT_SYMBOL(ieee80211_wake_queues); 471 472 void ieee80211_iterate_active_interfaces( 473 struct ieee80211_hw *hw, 474 void (*iterator)(void *data, u8 *mac, 475 struct ieee80211_vif *vif), 476 void *data) 477 { 478 struct ieee80211_local *local = hw_to_local(hw); 479 struct ieee80211_sub_if_data *sdata; 480 481 mutex_lock(&local->iflist_mtx); 482 483 list_for_each_entry(sdata, &local->interfaces, list) { 484 switch (sdata->vif.type) { 485 case NL80211_IFTYPE_MONITOR: 486 case NL80211_IFTYPE_AP_VLAN: 487 continue; 488 default: 489 break; 490 } 491 if (ieee80211_sdata_running(sdata)) 492 iterator(data, sdata->vif.addr, 493 &sdata->vif); 494 } 495 496 mutex_unlock(&local->iflist_mtx); 497 } 498 EXPORT_SYMBOL_GPL(ieee80211_iterate_active_interfaces); 499 500 void ieee80211_iterate_active_interfaces_atomic( 501 struct ieee80211_hw *hw, 502 void (*iterator)(void *data, u8 *mac, 503 struct ieee80211_vif *vif), 504 void *data) 505 { 506 struct ieee80211_local *local = hw_to_local(hw); 507 struct ieee80211_sub_if_data *sdata; 508 509 rcu_read_lock(); 510 511 list_for_each_entry_rcu(sdata, &local->interfaces, list) { 512 switch (sdata->vif.type) { 513 case NL80211_IFTYPE_MONITOR: 514 case NL80211_IFTYPE_AP_VLAN: 515 continue; 516 default: 517 break; 518 } 519 if (ieee80211_sdata_running(sdata)) 520 iterator(data, sdata->vif.addr, 521 &sdata->vif); 522 } 523 524 rcu_read_unlock(); 525 } 526 EXPORT_SYMBOL_GPL(ieee80211_iterate_active_interfaces_atomic); 527 528 /* 529 * Nothing should have been stuffed into the workqueue during 530 * the suspend->resume cycle. If this WARN is seen then there 531 * is a bug with either the driver suspend or something in 532 * mac80211 stuffing into the workqueue which we haven't yet 533 * cleared during mac80211's suspend cycle. 534 */ 535 static bool ieee80211_can_queue_work(struct ieee80211_local *local) 536 { 537 if (WARN(local->suspended && !local->resuming, 538 "queueing ieee80211 work while going to suspend\n")) 539 return false; 540 541 return true; 542 } 543 544 void ieee80211_queue_work(struct ieee80211_hw *hw, struct work_struct *work) 545 { 546 struct ieee80211_local *local = hw_to_local(hw); 547 548 if (!ieee80211_can_queue_work(local)) 549 return; 550 551 queue_work(local->workqueue, work); 552 } 553 EXPORT_SYMBOL(ieee80211_queue_work); 554 555 void ieee80211_queue_delayed_work(struct ieee80211_hw *hw, 556 struct delayed_work *dwork, 557 unsigned long delay) 558 { 559 struct ieee80211_local *local = hw_to_local(hw); 560 561 if (!ieee80211_can_queue_work(local)) 562 return; 563 564 queue_delayed_work(local->workqueue, dwork, delay); 565 } 566 EXPORT_SYMBOL(ieee80211_queue_delayed_work); 567 568 u32 ieee802_11_parse_elems_crc(u8 *start, size_t len, 569 struct ieee802_11_elems *elems, 570 u64 filter, u32 crc) 571 { 572 size_t left = len; 573 u8 *pos = start; 574 bool calc_crc = filter != 0; 575 DECLARE_BITMAP(seen_elems, 256); 576 577 bitmap_zero(seen_elems, 256); 578 memset(elems, 0, sizeof(*elems)); 579 elems->ie_start = start; 580 elems->total_len = len; 581 582 while (left >= 2) { 583 u8 id, elen; 584 bool elem_parse_failed; 585 586 id = *pos++; 587 elen = *pos++; 588 left -= 2; 589 590 if (elen > left) { 591 elems->parse_error = true; 592 break; 593 } 594 595 if (id != WLAN_EID_VENDOR_SPECIFIC && 596 id != WLAN_EID_QUIET && 597 test_bit(id, seen_elems)) { 598 elems->parse_error = true; 599 left -= elen; 600 pos += elen; 601 continue; 602 } 603 604 if (calc_crc && id < 64 && (filter & (1ULL << id))) 605 crc = crc32_be(crc, pos - 2, elen + 2); 606 607 elem_parse_failed = false; 608 609 switch (id) { 610 case WLAN_EID_SSID: 611 elems->ssid = pos; 612 elems->ssid_len = elen; 613 break; 614 case WLAN_EID_SUPP_RATES: 615 elems->supp_rates = pos; 616 elems->supp_rates_len = elen; 617 break; 618 case WLAN_EID_FH_PARAMS: 619 elems->fh_params = pos; 620 elems->fh_params_len = elen; 621 break; 622 case WLAN_EID_DS_PARAMS: 623 elems->ds_params = pos; 624 elems->ds_params_len = elen; 625 break; 626 case WLAN_EID_CF_PARAMS: 627 elems->cf_params = pos; 628 elems->cf_params_len = elen; 629 break; 630 case WLAN_EID_TIM: 631 if (elen >= sizeof(struct ieee80211_tim_ie)) { 632 elems->tim = (void *)pos; 633 elems->tim_len = elen; 634 } else 635 elem_parse_failed = true; 636 break; 637 case WLAN_EID_IBSS_PARAMS: 638 elems->ibss_params = pos; 639 elems->ibss_params_len = elen; 640 break; 641 case WLAN_EID_CHALLENGE: 642 elems->challenge = pos; 643 elems->challenge_len = elen; 644 break; 645 case WLAN_EID_VENDOR_SPECIFIC: 646 if (elen >= 4 && pos[0] == 0x00 && pos[1] == 0x50 && 647 pos[2] == 0xf2) { 648 /* Microsoft OUI (00:50:F2) */ 649 650 if (calc_crc) 651 crc = crc32_be(crc, pos - 2, elen + 2); 652 653 if (pos[3] == 1) { 654 /* OUI Type 1 - WPA IE */ 655 elems->wpa = pos; 656 elems->wpa_len = elen; 657 } else if (elen >= 5 && pos[3] == 2) { 658 /* OUI Type 2 - WMM IE */ 659 if (pos[4] == 0) { 660 elems->wmm_info = pos; 661 elems->wmm_info_len = elen; 662 } else if (pos[4] == 1) { 663 elems->wmm_param = pos; 664 elems->wmm_param_len = elen; 665 } 666 } 667 } 668 break; 669 case WLAN_EID_RSN: 670 elems->rsn = pos; 671 elems->rsn_len = elen; 672 break; 673 case WLAN_EID_ERP_INFO: 674 elems->erp_info = pos; 675 elems->erp_info_len = elen; 676 break; 677 case WLAN_EID_EXT_SUPP_RATES: 678 elems->ext_supp_rates = pos; 679 elems->ext_supp_rates_len = elen; 680 break; 681 case WLAN_EID_HT_CAPABILITY: 682 if (elen >= sizeof(struct ieee80211_ht_cap)) 683 elems->ht_cap_elem = (void *)pos; 684 else 685 elem_parse_failed = true; 686 break; 687 case WLAN_EID_HT_INFORMATION: 688 if (elen >= sizeof(struct ieee80211_ht_info)) 689 elems->ht_info_elem = (void *)pos; 690 else 691 elem_parse_failed = true; 692 break; 693 case WLAN_EID_MESH_ID: 694 elems->mesh_id = pos; 695 elems->mesh_id_len = elen; 696 break; 697 case WLAN_EID_MESH_CONFIG: 698 if (elen >= sizeof(struct ieee80211_meshconf_ie)) 699 elems->mesh_config = (void *)pos; 700 else 701 elem_parse_failed = true; 702 break; 703 case WLAN_EID_PEER_MGMT: 704 elems->peering = pos; 705 elems->peering_len = elen; 706 break; 707 case WLAN_EID_PREQ: 708 elems->preq = pos; 709 elems->preq_len = elen; 710 break; 711 case WLAN_EID_PREP: 712 elems->prep = pos; 713 elems->prep_len = elen; 714 break; 715 case WLAN_EID_PERR: 716 elems->perr = pos; 717 elems->perr_len = elen; 718 break; 719 case WLAN_EID_RANN: 720 if (elen >= sizeof(struct ieee80211_rann_ie)) 721 elems->rann = (void *)pos; 722 else 723 elem_parse_failed = true; 724 break; 725 case WLAN_EID_CHANNEL_SWITCH: 726 elems->ch_switch_elem = pos; 727 elems->ch_switch_elem_len = elen; 728 break; 729 case WLAN_EID_QUIET: 730 if (!elems->quiet_elem) { 731 elems->quiet_elem = pos; 732 elems->quiet_elem_len = elen; 733 } 734 elems->num_of_quiet_elem++; 735 break; 736 case WLAN_EID_COUNTRY: 737 elems->country_elem = pos; 738 elems->country_elem_len = elen; 739 break; 740 case WLAN_EID_PWR_CONSTRAINT: 741 elems->pwr_constr_elem = pos; 742 elems->pwr_constr_elem_len = elen; 743 break; 744 case WLAN_EID_TIMEOUT_INTERVAL: 745 elems->timeout_int = pos; 746 elems->timeout_int_len = elen; 747 break; 748 default: 749 break; 750 } 751 752 if (elem_parse_failed) 753 elems->parse_error = true; 754 else 755 set_bit(id, seen_elems); 756 757 left -= elen; 758 pos += elen; 759 } 760 761 if (left != 0) 762 elems->parse_error = true; 763 764 return crc; 765 } 766 767 void ieee802_11_parse_elems(u8 *start, size_t len, 768 struct ieee802_11_elems *elems) 769 { 770 ieee802_11_parse_elems_crc(start, len, elems, 0, 0); 771 } 772 773 void ieee80211_set_wmm_default(struct ieee80211_sub_if_data *sdata, 774 bool bss_notify) 775 { 776 struct ieee80211_local *local = sdata->local; 777 struct ieee80211_tx_queue_params qparam; 778 int queue; 779 bool use_11b; 780 int aCWmin, aCWmax; 781 782 if (!local->ops->conf_tx) 783 return; 784 785 memset(&qparam, 0, sizeof(qparam)); 786 787 use_11b = (local->hw.conf.channel->band == IEEE80211_BAND_2GHZ) && 788 !(sdata->flags & IEEE80211_SDATA_OPERATING_GMODE); 789 790 for (queue = 0; queue < local->hw.queues; queue++) { 791 /* Set defaults according to 802.11-2007 Table 7-37 */ 792 aCWmax = 1023; 793 if (use_11b) 794 aCWmin = 31; 795 else 796 aCWmin = 15; 797 798 switch (queue) { 799 case 3: /* AC_BK */ 800 qparam.cw_max = aCWmax; 801 qparam.cw_min = aCWmin; 802 qparam.txop = 0; 803 qparam.aifs = 7; 804 break; 805 default: /* never happens but let's not leave undefined */ 806 case 2: /* AC_BE */ 807 qparam.cw_max = aCWmax; 808 qparam.cw_min = aCWmin; 809 qparam.txop = 0; 810 qparam.aifs = 3; 811 break; 812 case 1: /* AC_VI */ 813 qparam.cw_max = aCWmin; 814 qparam.cw_min = (aCWmin + 1) / 2 - 1; 815 if (use_11b) 816 qparam.txop = 6016/32; 817 else 818 qparam.txop = 3008/32; 819 qparam.aifs = 2; 820 break; 821 case 0: /* AC_VO */ 822 qparam.cw_max = (aCWmin + 1) / 2 - 1; 823 qparam.cw_min = (aCWmin + 1) / 4 - 1; 824 if (use_11b) 825 qparam.txop = 3264/32; 826 else 827 qparam.txop = 1504/32; 828 qparam.aifs = 2; 829 break; 830 } 831 832 qparam.uapsd = false; 833 834 sdata->tx_conf[queue] = qparam; 835 drv_conf_tx(local, sdata, queue, &qparam); 836 } 837 838 /* after reinitialize QoS TX queues setting to default, 839 * disable QoS at all */ 840 841 if (sdata->vif.type != NL80211_IFTYPE_MONITOR) { 842 sdata->vif.bss_conf.qos = 843 sdata->vif.type != NL80211_IFTYPE_STATION; 844 if (bss_notify) 845 ieee80211_bss_info_change_notify(sdata, 846 BSS_CHANGED_QOS); 847 } 848 } 849 850 void ieee80211_sta_def_wmm_params(struct ieee80211_sub_if_data *sdata, 851 const size_t supp_rates_len, 852 const u8 *supp_rates) 853 { 854 struct ieee80211_local *local = sdata->local; 855 int i, have_higher_than_11mbit = 0; 856 857 /* cf. IEEE 802.11 9.2.12 */ 858 for (i = 0; i < supp_rates_len; i++) 859 if ((supp_rates[i] & 0x7f) * 5 > 110) 860 have_higher_than_11mbit = 1; 861 862 if (local->hw.conf.channel->band == IEEE80211_BAND_2GHZ && 863 have_higher_than_11mbit) 864 sdata->flags |= IEEE80211_SDATA_OPERATING_GMODE; 865 else 866 sdata->flags &= ~IEEE80211_SDATA_OPERATING_GMODE; 867 868 ieee80211_set_wmm_default(sdata, true); 869 } 870 871 u32 ieee80211_mandatory_rates(struct ieee80211_local *local, 872 enum ieee80211_band band) 873 { 874 struct ieee80211_supported_band *sband; 875 struct ieee80211_rate *bitrates; 876 u32 mandatory_rates; 877 enum ieee80211_rate_flags mandatory_flag; 878 int i; 879 880 sband = local->hw.wiphy->bands[band]; 881 if (!sband) { 882 WARN_ON(1); 883 sband = local->hw.wiphy->bands[local->hw.conf.channel->band]; 884 } 885 886 if (band == IEEE80211_BAND_2GHZ) 887 mandatory_flag = IEEE80211_RATE_MANDATORY_B; 888 else 889 mandatory_flag = IEEE80211_RATE_MANDATORY_A; 890 891 bitrates = sband->bitrates; 892 mandatory_rates = 0; 893 for (i = 0; i < sband->n_bitrates; i++) 894 if (bitrates[i].flags & mandatory_flag) 895 mandatory_rates |= BIT(i); 896 return mandatory_rates; 897 } 898 899 void ieee80211_send_auth(struct ieee80211_sub_if_data *sdata, 900 u16 transaction, u16 auth_alg, 901 u8 *extra, size_t extra_len, const u8 *da, 902 const u8 *bssid, const u8 *key, u8 key_len, u8 key_idx) 903 { 904 struct ieee80211_local *local = sdata->local; 905 struct sk_buff *skb; 906 struct ieee80211_mgmt *mgmt; 907 int err; 908 909 skb = dev_alloc_skb(local->hw.extra_tx_headroom + 910 sizeof(*mgmt) + 6 + extra_len); 911 if (!skb) 912 return; 913 914 skb_reserve(skb, local->hw.extra_tx_headroom); 915 916 mgmt = (struct ieee80211_mgmt *) skb_put(skb, 24 + 6); 917 memset(mgmt, 0, 24 + 6); 918 mgmt->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT | 919 IEEE80211_STYPE_AUTH); 920 memcpy(mgmt->da, da, ETH_ALEN); 921 memcpy(mgmt->sa, sdata->vif.addr, ETH_ALEN); 922 memcpy(mgmt->bssid, bssid, ETH_ALEN); 923 mgmt->u.auth.auth_alg = cpu_to_le16(auth_alg); 924 mgmt->u.auth.auth_transaction = cpu_to_le16(transaction); 925 mgmt->u.auth.status_code = cpu_to_le16(0); 926 if (extra) 927 memcpy(skb_put(skb, extra_len), extra, extra_len); 928 929 if (auth_alg == WLAN_AUTH_SHARED_KEY && transaction == 3) { 930 mgmt->frame_control |= cpu_to_le16(IEEE80211_FCTL_PROTECTED); 931 err = ieee80211_wep_encrypt(local, skb, key, key_len, key_idx); 932 WARN_ON(err); 933 } 934 935 IEEE80211_SKB_CB(skb)->flags |= IEEE80211_TX_INTFL_DONT_ENCRYPT; 936 ieee80211_tx_skb(sdata, skb); 937 } 938 939 int ieee80211_build_preq_ies(struct ieee80211_local *local, u8 *buffer, 940 const u8 *ie, size_t ie_len, 941 enum ieee80211_band band, u32 rate_mask, 942 u8 channel) 943 { 944 struct ieee80211_supported_band *sband; 945 u8 *pos; 946 size_t offset = 0, noffset; 947 int supp_rates_len, i; 948 u8 rates[32]; 949 int num_rates; 950 int ext_rates_len; 951 952 sband = local->hw.wiphy->bands[band]; 953 954 pos = buffer; 955 956 num_rates = 0; 957 for (i = 0; i < sband->n_bitrates; i++) { 958 if ((BIT(i) & rate_mask) == 0) 959 continue; /* skip rate */ 960 rates[num_rates++] = (u8) (sband->bitrates[i].bitrate / 5); 961 } 962 963 supp_rates_len = min_t(int, num_rates, 8); 964 965 *pos++ = WLAN_EID_SUPP_RATES; 966 *pos++ = supp_rates_len; 967 memcpy(pos, rates, supp_rates_len); 968 pos += supp_rates_len; 969 970 /* insert "request information" if in custom IEs */ 971 if (ie && ie_len) { 972 static const u8 before_extrates[] = { 973 WLAN_EID_SSID, 974 WLAN_EID_SUPP_RATES, 975 WLAN_EID_REQUEST, 976 }; 977 noffset = ieee80211_ie_split(ie, ie_len, 978 before_extrates, 979 ARRAY_SIZE(before_extrates), 980 offset); 981 memcpy(pos, ie + offset, noffset - offset); 982 pos += noffset - offset; 983 offset = noffset; 984 } 985 986 ext_rates_len = num_rates - supp_rates_len; 987 if (ext_rates_len > 0) { 988 *pos++ = WLAN_EID_EXT_SUPP_RATES; 989 *pos++ = ext_rates_len; 990 memcpy(pos, rates + supp_rates_len, ext_rates_len); 991 pos += ext_rates_len; 992 } 993 994 if (channel && sband->band == IEEE80211_BAND_2GHZ) { 995 *pos++ = WLAN_EID_DS_PARAMS; 996 *pos++ = 1; 997 *pos++ = channel; 998 } 999 1000 /* insert custom IEs that go before HT */ 1001 if (ie && ie_len) { 1002 static const u8 before_ht[] = { 1003 WLAN_EID_SSID, 1004 WLAN_EID_SUPP_RATES, 1005 WLAN_EID_REQUEST, 1006 WLAN_EID_EXT_SUPP_RATES, 1007 WLAN_EID_DS_PARAMS, 1008 WLAN_EID_SUPPORTED_REGULATORY_CLASSES, 1009 }; 1010 noffset = ieee80211_ie_split(ie, ie_len, 1011 before_ht, ARRAY_SIZE(before_ht), 1012 offset); 1013 memcpy(pos, ie + offset, noffset - offset); 1014 pos += noffset - offset; 1015 offset = noffset; 1016 } 1017 1018 if (sband->ht_cap.ht_supported) 1019 pos = ieee80211_ie_build_ht_cap(pos, &sband->ht_cap, 1020 sband->ht_cap.cap); 1021 1022 /* 1023 * If adding more here, adjust code in main.c 1024 * that calculates local->scan_ies_len. 1025 */ 1026 1027 /* add any remaining custom IEs */ 1028 if (ie && ie_len) { 1029 noffset = ie_len; 1030 memcpy(pos, ie + offset, noffset - offset); 1031 pos += noffset - offset; 1032 } 1033 1034 return pos - buffer; 1035 } 1036 1037 struct sk_buff *ieee80211_build_probe_req(struct ieee80211_sub_if_data *sdata, 1038 u8 *dst, u32 ratemask, 1039 const u8 *ssid, size_t ssid_len, 1040 const u8 *ie, size_t ie_len, 1041 bool directed) 1042 { 1043 struct ieee80211_local *local = sdata->local; 1044 struct sk_buff *skb; 1045 struct ieee80211_mgmt *mgmt; 1046 size_t buf_len; 1047 u8 *buf; 1048 u8 chan; 1049 1050 /* FIXME: come up with a proper value */ 1051 buf = kmalloc(200 + ie_len, GFP_KERNEL); 1052 if (!buf) 1053 return NULL; 1054 1055 /* 1056 * Do not send DS Channel parameter for directed probe requests 1057 * in order to maximize the chance that we get a response. Some 1058 * badly-behaved APs don't respond when this parameter is included. 1059 */ 1060 if (directed) 1061 chan = 0; 1062 else 1063 chan = ieee80211_frequency_to_channel( 1064 local->hw.conf.channel->center_freq); 1065 1066 buf_len = ieee80211_build_preq_ies(local, buf, ie, ie_len, 1067 local->hw.conf.channel->band, 1068 ratemask, chan); 1069 1070 skb = ieee80211_probereq_get(&local->hw, &sdata->vif, 1071 ssid, ssid_len, 1072 buf, buf_len); 1073 if (!skb) 1074 goto out; 1075 1076 if (dst) { 1077 mgmt = (struct ieee80211_mgmt *) skb->data; 1078 memcpy(mgmt->da, dst, ETH_ALEN); 1079 memcpy(mgmt->bssid, dst, ETH_ALEN); 1080 } 1081 1082 IEEE80211_SKB_CB(skb)->flags |= IEEE80211_TX_INTFL_DONT_ENCRYPT; 1083 1084 out: 1085 kfree(buf); 1086 1087 return skb; 1088 } 1089 1090 void ieee80211_send_probe_req(struct ieee80211_sub_if_data *sdata, u8 *dst, 1091 const u8 *ssid, size_t ssid_len, 1092 const u8 *ie, size_t ie_len, 1093 u32 ratemask, bool directed, bool no_cck) 1094 { 1095 struct sk_buff *skb; 1096 1097 skb = ieee80211_build_probe_req(sdata, dst, ratemask, ssid, ssid_len, 1098 ie, ie_len, directed); 1099 if (skb) { 1100 if (no_cck) 1101 IEEE80211_SKB_CB(skb)->flags |= 1102 IEEE80211_TX_CTL_NO_CCK_RATE; 1103 ieee80211_tx_skb(sdata, skb); 1104 } 1105 } 1106 1107 u32 ieee80211_sta_get_rates(struct ieee80211_local *local, 1108 struct ieee802_11_elems *elems, 1109 enum ieee80211_band band) 1110 { 1111 struct ieee80211_supported_band *sband; 1112 struct ieee80211_rate *bitrates; 1113 size_t num_rates; 1114 u32 supp_rates; 1115 int i, j; 1116 sband = local->hw.wiphy->bands[band]; 1117 1118 if (!sband) { 1119 WARN_ON(1); 1120 sband = local->hw.wiphy->bands[local->hw.conf.channel->band]; 1121 } 1122 1123 bitrates = sband->bitrates; 1124 num_rates = sband->n_bitrates; 1125 supp_rates = 0; 1126 for (i = 0; i < elems->supp_rates_len + 1127 elems->ext_supp_rates_len; i++) { 1128 u8 rate = 0; 1129 int own_rate; 1130 if (i < elems->supp_rates_len) 1131 rate = elems->supp_rates[i]; 1132 else if (elems->ext_supp_rates) 1133 rate = elems->ext_supp_rates 1134 [i - elems->supp_rates_len]; 1135 own_rate = 5 * (rate & 0x7f); 1136 for (j = 0; j < num_rates; j++) 1137 if (bitrates[j].bitrate == own_rate) 1138 supp_rates |= BIT(j); 1139 } 1140 return supp_rates; 1141 } 1142 1143 void ieee80211_stop_device(struct ieee80211_local *local) 1144 { 1145 ieee80211_led_radio(local, false); 1146 ieee80211_mod_tpt_led_trig(local, 0, IEEE80211_TPT_LEDTRIG_FL_RADIO); 1147 1148 cancel_work_sync(&local->reconfig_filter); 1149 1150 flush_workqueue(local->workqueue); 1151 drv_stop(local); 1152 } 1153 1154 int ieee80211_reconfig(struct ieee80211_local *local) 1155 { 1156 struct ieee80211_hw *hw = &local->hw; 1157 struct ieee80211_sub_if_data *sdata; 1158 struct sta_info *sta; 1159 int res, i; 1160 1161 #ifdef CONFIG_PM 1162 if (local->suspended) 1163 local->resuming = true; 1164 1165 if (local->wowlan) { 1166 local->wowlan = false; 1167 res = drv_resume(local); 1168 if (res < 0) { 1169 local->resuming = false; 1170 return res; 1171 } 1172 if (res == 0) 1173 goto wake_up; 1174 WARN_ON(res > 1); 1175 /* 1176 * res is 1, which means the driver requested 1177 * to go through a regular reset on wakeup. 1178 */ 1179 } 1180 #endif 1181 /* everything else happens only if HW was up & running */ 1182 if (!local->open_count) 1183 goto wake_up; 1184 1185 /* 1186 * Upon resume hardware can sometimes be goofy due to 1187 * various platform / driver / bus issues, so restarting 1188 * the device may at times not work immediately. Propagate 1189 * the error. 1190 */ 1191 res = drv_start(local); 1192 if (res) { 1193 WARN(local->suspended, "Hardware became unavailable " 1194 "upon resume. This could be a software issue " 1195 "prior to suspend or a hardware issue.\n"); 1196 return res; 1197 } 1198 1199 /* setup fragmentation threshold */ 1200 drv_set_frag_threshold(local, hw->wiphy->frag_threshold); 1201 1202 /* setup RTS threshold */ 1203 drv_set_rts_threshold(local, hw->wiphy->rts_threshold); 1204 1205 /* reset coverage class */ 1206 drv_set_coverage_class(local, hw->wiphy->coverage_class); 1207 1208 ieee80211_led_radio(local, true); 1209 ieee80211_mod_tpt_led_trig(local, 1210 IEEE80211_TPT_LEDTRIG_FL_RADIO, 0); 1211 1212 /* add interfaces */ 1213 list_for_each_entry(sdata, &local->interfaces, list) { 1214 if (sdata->vif.type != NL80211_IFTYPE_AP_VLAN && 1215 sdata->vif.type != NL80211_IFTYPE_MONITOR && 1216 ieee80211_sdata_running(sdata)) 1217 res = drv_add_interface(local, sdata); 1218 } 1219 1220 /* add STAs back */ 1221 mutex_lock(&local->sta_mtx); 1222 list_for_each_entry(sta, &local->sta_list, list) { 1223 if (sta->uploaded) { 1224 enum ieee80211_sta_state state; 1225 1226 for (state = IEEE80211_STA_NOTEXIST; 1227 state < sta->sta_state - 1; state++) 1228 WARN_ON(drv_sta_state(local, sta->sdata, sta, 1229 state, state + 1)); 1230 } 1231 } 1232 mutex_unlock(&local->sta_mtx); 1233 1234 /* reconfigure tx conf */ 1235 list_for_each_entry(sdata, &local->interfaces, list) { 1236 if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN || 1237 sdata->vif.type == NL80211_IFTYPE_MONITOR || 1238 !ieee80211_sdata_running(sdata)) 1239 continue; 1240 1241 for (i = 0; i < hw->queues; i++) 1242 drv_conf_tx(local, sdata, i, &sdata->tx_conf[i]); 1243 } 1244 1245 /* reconfigure hardware */ 1246 ieee80211_hw_config(local, ~0); 1247 1248 ieee80211_configure_filter(local); 1249 1250 /* Finally also reconfigure all the BSS information */ 1251 list_for_each_entry(sdata, &local->interfaces, list) { 1252 u32 changed; 1253 1254 if (!ieee80211_sdata_running(sdata)) 1255 continue; 1256 1257 /* common change flags for all interface types */ 1258 changed = BSS_CHANGED_ERP_CTS_PROT | 1259 BSS_CHANGED_ERP_PREAMBLE | 1260 BSS_CHANGED_ERP_SLOT | 1261 BSS_CHANGED_HT | 1262 BSS_CHANGED_BASIC_RATES | 1263 BSS_CHANGED_BEACON_INT | 1264 BSS_CHANGED_BSSID | 1265 BSS_CHANGED_CQM | 1266 BSS_CHANGED_QOS | 1267 BSS_CHANGED_IDLE; 1268 1269 switch (sdata->vif.type) { 1270 case NL80211_IFTYPE_STATION: 1271 changed |= BSS_CHANGED_ASSOC | 1272 BSS_CHANGED_ARP_FILTER; 1273 mutex_lock(&sdata->u.mgd.mtx); 1274 ieee80211_bss_info_change_notify(sdata, changed); 1275 mutex_unlock(&sdata->u.mgd.mtx); 1276 break; 1277 case NL80211_IFTYPE_ADHOC: 1278 changed |= BSS_CHANGED_IBSS; 1279 /* fall through */ 1280 case NL80211_IFTYPE_AP: 1281 changed |= BSS_CHANGED_SSID; 1282 1283 if (sdata->vif.type == NL80211_IFTYPE_AP) 1284 changed |= BSS_CHANGED_AP_PROBE_RESP; 1285 1286 /* fall through */ 1287 case NL80211_IFTYPE_MESH_POINT: 1288 changed |= BSS_CHANGED_BEACON | 1289 BSS_CHANGED_BEACON_ENABLED; 1290 ieee80211_bss_info_change_notify(sdata, changed); 1291 break; 1292 case NL80211_IFTYPE_WDS: 1293 break; 1294 case NL80211_IFTYPE_AP_VLAN: 1295 case NL80211_IFTYPE_MONITOR: 1296 /* ignore virtual */ 1297 break; 1298 case NL80211_IFTYPE_UNSPECIFIED: 1299 case NUM_NL80211_IFTYPES: 1300 case NL80211_IFTYPE_P2P_CLIENT: 1301 case NL80211_IFTYPE_P2P_GO: 1302 WARN_ON(1); 1303 break; 1304 } 1305 } 1306 1307 ieee80211_recalc_ps(local, -1); 1308 1309 /* 1310 * The sta might be in psm against the ap (e.g. because 1311 * this was the state before a hw restart), so we 1312 * explicitly send a null packet in order to make sure 1313 * it'll sync against the ap (and get out of psm). 1314 */ 1315 if (!(local->hw.conf.flags & IEEE80211_CONF_PS)) { 1316 list_for_each_entry(sdata, &local->interfaces, list) { 1317 if (sdata->vif.type != NL80211_IFTYPE_STATION) 1318 continue; 1319 1320 ieee80211_send_nullfunc(local, sdata, 0); 1321 } 1322 } 1323 1324 /* 1325 * Clear the WLAN_STA_BLOCK_BA flag so new aggregation 1326 * sessions can be established after a resume. 1327 * 1328 * Also tear down aggregation sessions since reconfiguring 1329 * them in a hardware restart scenario is not easily done 1330 * right now, and the hardware will have lost information 1331 * about the sessions, but we and the AP still think they 1332 * are active. This is really a workaround though. 1333 */ 1334 if (hw->flags & IEEE80211_HW_AMPDU_AGGREGATION) { 1335 mutex_lock(&local->sta_mtx); 1336 1337 list_for_each_entry(sta, &local->sta_list, list) { 1338 ieee80211_sta_tear_down_BA_sessions(sta, true); 1339 clear_sta_flag(sta, WLAN_STA_BLOCK_BA); 1340 } 1341 1342 mutex_unlock(&local->sta_mtx); 1343 } 1344 1345 /* add back keys */ 1346 list_for_each_entry(sdata, &local->interfaces, list) 1347 if (ieee80211_sdata_running(sdata)) 1348 ieee80211_enable_keys(sdata); 1349 1350 wake_up: 1351 ieee80211_wake_queues_by_reason(hw, 1352 IEEE80211_QUEUE_STOP_REASON_SUSPEND); 1353 1354 /* 1355 * If this is for hw restart things are still running. 1356 * We may want to change that later, however. 1357 */ 1358 if (!local->suspended) 1359 return 0; 1360 1361 #ifdef CONFIG_PM 1362 /* first set suspended false, then resuming */ 1363 local->suspended = false; 1364 mb(); 1365 local->resuming = false; 1366 1367 list_for_each_entry(sdata, &local->interfaces, list) { 1368 switch(sdata->vif.type) { 1369 case NL80211_IFTYPE_STATION: 1370 ieee80211_sta_restart(sdata); 1371 break; 1372 case NL80211_IFTYPE_ADHOC: 1373 ieee80211_ibss_restart(sdata); 1374 break; 1375 case NL80211_IFTYPE_MESH_POINT: 1376 ieee80211_mesh_restart(sdata); 1377 break; 1378 default: 1379 break; 1380 } 1381 } 1382 1383 mod_timer(&local->sta_cleanup, jiffies + 1); 1384 1385 mutex_lock(&local->sta_mtx); 1386 list_for_each_entry(sta, &local->sta_list, list) 1387 mesh_plink_restart(sta); 1388 mutex_unlock(&local->sta_mtx); 1389 #else 1390 WARN_ON(1); 1391 #endif 1392 return 0; 1393 } 1394 1395 void ieee80211_resume_disconnect(struct ieee80211_vif *vif) 1396 { 1397 struct ieee80211_sub_if_data *sdata; 1398 struct ieee80211_local *local; 1399 struct ieee80211_key *key; 1400 1401 if (WARN_ON(!vif)) 1402 return; 1403 1404 sdata = vif_to_sdata(vif); 1405 local = sdata->local; 1406 1407 if (WARN_ON(!local->resuming)) 1408 return; 1409 1410 if (WARN_ON(vif->type != NL80211_IFTYPE_STATION)) 1411 return; 1412 1413 sdata->flags |= IEEE80211_SDATA_DISCONNECT_RESUME; 1414 1415 mutex_lock(&local->key_mtx); 1416 list_for_each_entry(key, &sdata->key_list, list) 1417 key->flags |= KEY_FLAG_TAINTED; 1418 mutex_unlock(&local->key_mtx); 1419 } 1420 EXPORT_SYMBOL_GPL(ieee80211_resume_disconnect); 1421 1422 static int check_mgd_smps(struct ieee80211_if_managed *ifmgd, 1423 enum ieee80211_smps_mode *smps_mode) 1424 { 1425 if (ifmgd->associated) { 1426 *smps_mode = ifmgd->ap_smps; 1427 1428 if (*smps_mode == IEEE80211_SMPS_AUTOMATIC) { 1429 if (ifmgd->powersave) 1430 *smps_mode = IEEE80211_SMPS_DYNAMIC; 1431 else 1432 *smps_mode = IEEE80211_SMPS_OFF; 1433 } 1434 1435 return 1; 1436 } 1437 1438 return 0; 1439 } 1440 1441 /* must hold iflist_mtx */ 1442 void ieee80211_recalc_smps(struct ieee80211_local *local) 1443 { 1444 struct ieee80211_sub_if_data *sdata; 1445 enum ieee80211_smps_mode smps_mode = IEEE80211_SMPS_OFF; 1446 int count = 0; 1447 1448 lockdep_assert_held(&local->iflist_mtx); 1449 1450 /* 1451 * This function could be improved to handle multiple 1452 * interfaces better, but right now it makes any 1453 * non-station interfaces force SM PS to be turned 1454 * off. If there are multiple station interfaces it 1455 * could also use the best possible mode, e.g. if 1456 * one is in static and the other in dynamic then 1457 * dynamic is ok. 1458 */ 1459 1460 list_for_each_entry(sdata, &local->interfaces, list) { 1461 if (!ieee80211_sdata_running(sdata)) 1462 continue; 1463 if (sdata->vif.type != NL80211_IFTYPE_STATION) 1464 goto set; 1465 1466 count += check_mgd_smps(&sdata->u.mgd, &smps_mode); 1467 1468 if (count > 1) { 1469 smps_mode = IEEE80211_SMPS_OFF; 1470 break; 1471 } 1472 } 1473 1474 if (smps_mode == local->smps_mode) 1475 return; 1476 1477 set: 1478 local->smps_mode = smps_mode; 1479 /* changed flag is auto-detected for this */ 1480 ieee80211_hw_config(local, 0); 1481 } 1482 1483 static bool ieee80211_id_in_list(const u8 *ids, int n_ids, u8 id) 1484 { 1485 int i; 1486 1487 for (i = 0; i < n_ids; i++) 1488 if (ids[i] == id) 1489 return true; 1490 return false; 1491 } 1492 1493 /** 1494 * ieee80211_ie_split - split an IE buffer according to ordering 1495 * 1496 * @ies: the IE buffer 1497 * @ielen: the length of the IE buffer 1498 * @ids: an array with element IDs that are allowed before 1499 * the split 1500 * @n_ids: the size of the element ID array 1501 * @offset: offset where to start splitting in the buffer 1502 * 1503 * This function splits an IE buffer by updating the @offset 1504 * variable to point to the location where the buffer should be 1505 * split. 1506 * 1507 * It assumes that the given IE buffer is well-formed, this 1508 * has to be guaranteed by the caller! 1509 * 1510 * It also assumes that the IEs in the buffer are ordered 1511 * correctly, if not the result of using this function will not 1512 * be ordered correctly either, i.e. it does no reordering. 1513 * 1514 * The function returns the offset where the next part of the 1515 * buffer starts, which may be @ielen if the entire (remainder) 1516 * of the buffer should be used. 1517 */ 1518 size_t ieee80211_ie_split(const u8 *ies, size_t ielen, 1519 const u8 *ids, int n_ids, size_t offset) 1520 { 1521 size_t pos = offset; 1522 1523 while (pos < ielen && ieee80211_id_in_list(ids, n_ids, ies[pos])) 1524 pos += 2 + ies[pos + 1]; 1525 1526 return pos; 1527 } 1528 1529 size_t ieee80211_ie_split_vendor(const u8 *ies, size_t ielen, size_t offset) 1530 { 1531 size_t pos = offset; 1532 1533 while (pos < ielen && ies[pos] != WLAN_EID_VENDOR_SPECIFIC) 1534 pos += 2 + ies[pos + 1]; 1535 1536 return pos; 1537 } 1538 1539 static void _ieee80211_enable_rssi_reports(struct ieee80211_sub_if_data *sdata, 1540 int rssi_min_thold, 1541 int rssi_max_thold) 1542 { 1543 trace_api_enable_rssi_reports(sdata, rssi_min_thold, rssi_max_thold); 1544 1545 if (WARN_ON(sdata->vif.type != NL80211_IFTYPE_STATION)) 1546 return; 1547 1548 /* 1549 * Scale up threshold values before storing it, as the RSSI averaging 1550 * algorithm uses a scaled up value as well. Change this scaling 1551 * factor if the RSSI averaging algorithm changes. 1552 */ 1553 sdata->u.mgd.rssi_min_thold = rssi_min_thold*16; 1554 sdata->u.mgd.rssi_max_thold = rssi_max_thold*16; 1555 } 1556 1557 void ieee80211_enable_rssi_reports(struct ieee80211_vif *vif, 1558 int rssi_min_thold, 1559 int rssi_max_thold) 1560 { 1561 struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif); 1562 1563 WARN_ON(rssi_min_thold == rssi_max_thold || 1564 rssi_min_thold > rssi_max_thold); 1565 1566 _ieee80211_enable_rssi_reports(sdata, rssi_min_thold, 1567 rssi_max_thold); 1568 } 1569 EXPORT_SYMBOL(ieee80211_enable_rssi_reports); 1570 1571 void ieee80211_disable_rssi_reports(struct ieee80211_vif *vif) 1572 { 1573 struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif); 1574 1575 _ieee80211_enable_rssi_reports(sdata, 0, 0); 1576 } 1577 EXPORT_SYMBOL(ieee80211_disable_rssi_reports); 1578 1579 u8 *ieee80211_ie_build_ht_cap(u8 *pos, struct ieee80211_sta_ht_cap *ht_cap, 1580 u16 cap) 1581 { 1582 __le16 tmp; 1583 1584 *pos++ = WLAN_EID_HT_CAPABILITY; 1585 *pos++ = sizeof(struct ieee80211_ht_cap); 1586 memset(pos, 0, sizeof(struct ieee80211_ht_cap)); 1587 1588 /* capability flags */ 1589 tmp = cpu_to_le16(cap); 1590 memcpy(pos, &tmp, sizeof(u16)); 1591 pos += sizeof(u16); 1592 1593 /* AMPDU parameters */ 1594 *pos++ = ht_cap->ampdu_factor | 1595 (ht_cap->ampdu_density << 1596 IEEE80211_HT_AMPDU_PARM_DENSITY_SHIFT); 1597 1598 /* MCS set */ 1599 memcpy(pos, &ht_cap->mcs, sizeof(ht_cap->mcs)); 1600 pos += sizeof(ht_cap->mcs); 1601 1602 /* extended capabilities */ 1603 pos += sizeof(__le16); 1604 1605 /* BF capabilities */ 1606 pos += sizeof(__le32); 1607 1608 /* antenna selection */ 1609 pos += sizeof(u8); 1610 1611 return pos; 1612 } 1613 1614 u8 *ieee80211_ie_build_ht_info(u8 *pos, 1615 struct ieee80211_sta_ht_cap *ht_cap, 1616 struct ieee80211_channel *channel, 1617 enum nl80211_channel_type channel_type) 1618 { 1619 struct ieee80211_ht_info *ht_info; 1620 /* Build HT Information */ 1621 *pos++ = WLAN_EID_HT_INFORMATION; 1622 *pos++ = sizeof(struct ieee80211_ht_info); 1623 ht_info = (struct ieee80211_ht_info *)pos; 1624 ht_info->control_chan = 1625 ieee80211_frequency_to_channel(channel->center_freq); 1626 switch (channel_type) { 1627 case NL80211_CHAN_HT40MINUS: 1628 ht_info->ht_param = IEEE80211_HT_PARAM_CHA_SEC_BELOW; 1629 break; 1630 case NL80211_CHAN_HT40PLUS: 1631 ht_info->ht_param = IEEE80211_HT_PARAM_CHA_SEC_ABOVE; 1632 break; 1633 case NL80211_CHAN_HT20: 1634 default: 1635 ht_info->ht_param = IEEE80211_HT_PARAM_CHA_SEC_NONE; 1636 break; 1637 } 1638 if (ht_cap->cap & IEEE80211_HT_CAP_SUP_WIDTH_20_40) 1639 ht_info->ht_param |= IEEE80211_HT_PARAM_CHAN_WIDTH_ANY; 1640 1641 /* 1642 * Note: According to 802.11n-2009 9.13.3.1, HT Protection field and 1643 * RIFS Mode are reserved in IBSS mode, therefore keep them at 0 1644 */ 1645 ht_info->operation_mode = 0x0000; 1646 ht_info->stbc_param = 0x0000; 1647 1648 /* It seems that Basic MCS set and Supported MCS set 1649 are identical for the first 10 bytes */ 1650 memset(&ht_info->basic_set, 0, 16); 1651 memcpy(&ht_info->basic_set, &ht_cap->mcs, 10); 1652 1653 return pos + sizeof(struct ieee80211_ht_info); 1654 } 1655 1656 enum nl80211_channel_type 1657 ieee80211_ht_info_to_channel_type(struct ieee80211_ht_info *ht_info) 1658 { 1659 enum nl80211_channel_type channel_type; 1660 1661 if (!ht_info) 1662 return NL80211_CHAN_NO_HT; 1663 1664 switch (ht_info->ht_param & IEEE80211_HT_PARAM_CHA_SEC_OFFSET) { 1665 case IEEE80211_HT_PARAM_CHA_SEC_NONE: 1666 channel_type = NL80211_CHAN_HT20; 1667 break; 1668 case IEEE80211_HT_PARAM_CHA_SEC_ABOVE: 1669 channel_type = NL80211_CHAN_HT40PLUS; 1670 break; 1671 case IEEE80211_HT_PARAM_CHA_SEC_BELOW: 1672 channel_type = NL80211_CHAN_HT40MINUS; 1673 break; 1674 default: 1675 channel_type = NL80211_CHAN_NO_HT; 1676 } 1677 1678 return channel_type; 1679 } 1680 1681 int ieee80211_add_srates_ie(struct ieee80211_vif *vif, struct sk_buff *skb) 1682 { 1683 struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif); 1684 struct ieee80211_local *local = sdata->local; 1685 struct ieee80211_supported_band *sband; 1686 int rate; 1687 u8 i, rates, *pos; 1688 1689 sband = local->hw.wiphy->bands[local->hw.conf.channel->band]; 1690 rates = sband->n_bitrates; 1691 if (rates > 8) 1692 rates = 8; 1693 1694 if (skb_tailroom(skb) < rates + 2) 1695 return -ENOMEM; 1696 1697 pos = skb_put(skb, rates + 2); 1698 *pos++ = WLAN_EID_SUPP_RATES; 1699 *pos++ = rates; 1700 for (i = 0; i < rates; i++) { 1701 rate = sband->bitrates[i].bitrate; 1702 *pos++ = (u8) (rate / 5); 1703 } 1704 1705 return 0; 1706 } 1707 1708 int ieee80211_add_ext_srates_ie(struct ieee80211_vif *vif, struct sk_buff *skb) 1709 { 1710 struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif); 1711 struct ieee80211_local *local = sdata->local; 1712 struct ieee80211_supported_band *sband; 1713 int rate; 1714 u8 i, exrates, *pos; 1715 1716 sband = local->hw.wiphy->bands[local->hw.conf.channel->band]; 1717 exrates = sband->n_bitrates; 1718 if (exrates > 8) 1719 exrates -= 8; 1720 else 1721 exrates = 0; 1722 1723 if (skb_tailroom(skb) < exrates + 2) 1724 return -ENOMEM; 1725 1726 if (exrates) { 1727 pos = skb_put(skb, exrates + 2); 1728 *pos++ = WLAN_EID_EXT_SUPP_RATES; 1729 *pos++ = exrates; 1730 for (i = 8; i < sband->n_bitrates; i++) { 1731 rate = sband->bitrates[i].bitrate; 1732 *pos++ = (u8) (rate / 5); 1733 } 1734 } 1735 return 0; 1736 } 1737