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