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(enum ieee80211_band band, 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 (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 enum ieee80211_band band, 166 size_t frame_len, 167 struct ieee80211_rate *rate) 168 { 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(band, 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[frame_txctl->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(sband->band, 10, rate->bitrate, 217 erp, short_preamble); 218 /* Data frame duration */ 219 dur += ieee80211_frame_duration(sband->band, frame_len, rate->bitrate, 220 erp, short_preamble); 221 /* ACK duration */ 222 dur += ieee80211_frame_duration(sband->band, 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[frame_txctl->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(sband->band, 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(sband->band, 10, rate->bitrate, 261 erp, short_preamble); 262 } 263 264 return cpu_to_le16(dur); 265 } 266 EXPORT_SYMBOL(ieee80211_ctstoself_duration); 267 268 void ieee80211_propagate_queue_wake(struct ieee80211_local *local, int queue) 269 { 270 struct ieee80211_sub_if_data *sdata; 271 int n_acs = IEEE80211_NUM_ACS; 272 273 if (local->hw.queues < IEEE80211_NUM_ACS) 274 n_acs = 1; 275 276 list_for_each_entry_rcu(sdata, &local->interfaces, list) { 277 int ac; 278 279 if (!sdata->dev) 280 continue; 281 282 if (test_bit(SDATA_STATE_OFFCHANNEL, &sdata->state)) 283 continue; 284 285 if (sdata->vif.cab_queue != IEEE80211_INVAL_HW_QUEUE && 286 local->queue_stop_reasons[sdata->vif.cab_queue] != 0) 287 continue; 288 289 for (ac = 0; ac < n_acs; ac++) { 290 int ac_queue = sdata->vif.hw_queue[ac]; 291 292 if (ac_queue == queue || 293 (sdata->vif.cab_queue == queue && 294 local->queue_stop_reasons[ac_queue] == 0 && 295 skb_queue_empty(&local->pending[ac_queue]))) 296 netif_wake_subqueue(sdata->dev, ac); 297 } 298 } 299 } 300 301 static void __ieee80211_wake_queue(struct ieee80211_hw *hw, int queue, 302 enum queue_stop_reason reason) 303 { 304 struct ieee80211_local *local = hw_to_local(hw); 305 306 trace_wake_queue(local, queue, reason); 307 308 if (WARN_ON(queue >= hw->queues)) 309 return; 310 311 if (!test_bit(reason, &local->queue_stop_reasons[queue])) 312 return; 313 314 __clear_bit(reason, &local->queue_stop_reasons[queue]); 315 316 if (local->queue_stop_reasons[queue] != 0) 317 /* someone still has this queue stopped */ 318 return; 319 320 if (skb_queue_empty(&local->pending[queue])) { 321 rcu_read_lock(); 322 ieee80211_propagate_queue_wake(local, queue); 323 rcu_read_unlock(); 324 } else 325 tasklet_schedule(&local->tx_pending_tasklet); 326 } 327 328 void ieee80211_wake_queue_by_reason(struct ieee80211_hw *hw, int queue, 329 enum queue_stop_reason reason) 330 { 331 struct ieee80211_local *local = hw_to_local(hw); 332 unsigned long flags; 333 334 spin_lock_irqsave(&local->queue_stop_reason_lock, flags); 335 __ieee80211_wake_queue(hw, queue, reason); 336 spin_unlock_irqrestore(&local->queue_stop_reason_lock, flags); 337 } 338 339 void ieee80211_wake_queue(struct ieee80211_hw *hw, int queue) 340 { 341 ieee80211_wake_queue_by_reason(hw, queue, 342 IEEE80211_QUEUE_STOP_REASON_DRIVER); 343 } 344 EXPORT_SYMBOL(ieee80211_wake_queue); 345 346 static void __ieee80211_stop_queue(struct ieee80211_hw *hw, int queue, 347 enum queue_stop_reason reason) 348 { 349 struct ieee80211_local *local = hw_to_local(hw); 350 struct ieee80211_sub_if_data *sdata; 351 int n_acs = IEEE80211_NUM_ACS; 352 353 trace_stop_queue(local, queue, reason); 354 355 if (WARN_ON(queue >= hw->queues)) 356 return; 357 358 if (test_bit(reason, &local->queue_stop_reasons[queue])) 359 return; 360 361 __set_bit(reason, &local->queue_stop_reasons[queue]); 362 363 if (local->hw.queues < IEEE80211_NUM_ACS) 364 n_acs = 1; 365 366 rcu_read_lock(); 367 list_for_each_entry_rcu(sdata, &local->interfaces, list) { 368 int ac; 369 370 if (!sdata->dev) 371 continue; 372 373 for (ac = 0; ac < n_acs; ac++) { 374 if (sdata->vif.hw_queue[ac] == queue || 375 sdata->vif.cab_queue == queue) 376 netif_stop_subqueue(sdata->dev, ac); 377 } 378 } 379 rcu_read_unlock(); 380 } 381 382 void ieee80211_stop_queue_by_reason(struct ieee80211_hw *hw, int queue, 383 enum queue_stop_reason reason) 384 { 385 struct ieee80211_local *local = hw_to_local(hw); 386 unsigned long flags; 387 388 spin_lock_irqsave(&local->queue_stop_reason_lock, flags); 389 __ieee80211_stop_queue(hw, queue, reason); 390 spin_unlock_irqrestore(&local->queue_stop_reason_lock, flags); 391 } 392 393 void ieee80211_stop_queue(struct ieee80211_hw *hw, int queue) 394 { 395 ieee80211_stop_queue_by_reason(hw, queue, 396 IEEE80211_QUEUE_STOP_REASON_DRIVER); 397 } 398 EXPORT_SYMBOL(ieee80211_stop_queue); 399 400 void ieee80211_add_pending_skb(struct ieee80211_local *local, 401 struct sk_buff *skb) 402 { 403 struct ieee80211_hw *hw = &local->hw; 404 unsigned long flags; 405 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); 406 int queue = info->hw_queue; 407 408 if (WARN_ON(!info->control.vif)) { 409 ieee80211_free_txskb(&local->hw, skb); 410 return; 411 } 412 413 spin_lock_irqsave(&local->queue_stop_reason_lock, flags); 414 __ieee80211_stop_queue(hw, queue, IEEE80211_QUEUE_STOP_REASON_SKB_ADD); 415 __skb_queue_tail(&local->pending[queue], skb); 416 __ieee80211_wake_queue(hw, queue, IEEE80211_QUEUE_STOP_REASON_SKB_ADD); 417 spin_unlock_irqrestore(&local->queue_stop_reason_lock, flags); 418 } 419 420 void ieee80211_add_pending_skbs_fn(struct ieee80211_local *local, 421 struct sk_buff_head *skbs, 422 void (*fn)(void *data), void *data) 423 { 424 struct ieee80211_hw *hw = &local->hw; 425 struct sk_buff *skb; 426 unsigned long flags; 427 int queue, i; 428 429 spin_lock_irqsave(&local->queue_stop_reason_lock, flags); 430 while ((skb = skb_dequeue(skbs))) { 431 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); 432 433 if (WARN_ON(!info->control.vif)) { 434 ieee80211_free_txskb(&local->hw, skb); 435 continue; 436 } 437 438 queue = info->hw_queue; 439 440 __ieee80211_stop_queue(hw, queue, 441 IEEE80211_QUEUE_STOP_REASON_SKB_ADD); 442 443 __skb_queue_tail(&local->pending[queue], skb); 444 } 445 446 if (fn) 447 fn(data); 448 449 for (i = 0; i < hw->queues; i++) 450 __ieee80211_wake_queue(hw, i, 451 IEEE80211_QUEUE_STOP_REASON_SKB_ADD); 452 spin_unlock_irqrestore(&local->queue_stop_reason_lock, flags); 453 } 454 455 void ieee80211_stop_queues_by_reason(struct ieee80211_hw *hw, 456 unsigned long queues, 457 enum queue_stop_reason reason) 458 { 459 struct ieee80211_local *local = hw_to_local(hw); 460 unsigned long flags; 461 int i; 462 463 spin_lock_irqsave(&local->queue_stop_reason_lock, flags); 464 465 for_each_set_bit(i, &queues, hw->queues) 466 __ieee80211_stop_queue(hw, i, reason); 467 468 spin_unlock_irqrestore(&local->queue_stop_reason_lock, flags); 469 } 470 471 void ieee80211_stop_queues(struct ieee80211_hw *hw) 472 { 473 ieee80211_stop_queues_by_reason(hw, IEEE80211_MAX_QUEUE_MAP, 474 IEEE80211_QUEUE_STOP_REASON_DRIVER); 475 } 476 EXPORT_SYMBOL(ieee80211_stop_queues); 477 478 int ieee80211_queue_stopped(struct ieee80211_hw *hw, int queue) 479 { 480 struct ieee80211_local *local = hw_to_local(hw); 481 unsigned long flags; 482 int ret; 483 484 if (WARN_ON(queue >= hw->queues)) 485 return true; 486 487 spin_lock_irqsave(&local->queue_stop_reason_lock, flags); 488 ret = test_bit(IEEE80211_QUEUE_STOP_REASON_DRIVER, 489 &local->queue_stop_reasons[queue]); 490 spin_unlock_irqrestore(&local->queue_stop_reason_lock, flags); 491 return ret; 492 } 493 EXPORT_SYMBOL(ieee80211_queue_stopped); 494 495 void ieee80211_wake_queues_by_reason(struct ieee80211_hw *hw, 496 unsigned long queues, 497 enum queue_stop_reason reason) 498 { 499 struct ieee80211_local *local = hw_to_local(hw); 500 unsigned long flags; 501 int i; 502 503 spin_lock_irqsave(&local->queue_stop_reason_lock, flags); 504 505 for_each_set_bit(i, &queues, hw->queues) 506 __ieee80211_wake_queue(hw, i, reason); 507 508 spin_unlock_irqrestore(&local->queue_stop_reason_lock, flags); 509 } 510 511 void ieee80211_wake_queues(struct ieee80211_hw *hw) 512 { 513 ieee80211_wake_queues_by_reason(hw, IEEE80211_MAX_QUEUE_MAP, 514 IEEE80211_QUEUE_STOP_REASON_DRIVER); 515 } 516 EXPORT_SYMBOL(ieee80211_wake_queues); 517 518 void ieee80211_flush_queues(struct ieee80211_local *local, 519 struct ieee80211_sub_if_data *sdata) 520 { 521 u32 queues; 522 523 if (!local->ops->flush) 524 return; 525 526 if (sdata && local->hw.flags & IEEE80211_HW_QUEUE_CONTROL) { 527 int ac; 528 529 queues = 0; 530 531 for (ac = 0; ac < IEEE80211_NUM_ACS; ac++) 532 queues |= BIT(sdata->vif.hw_queue[ac]); 533 if (sdata->vif.cab_queue != IEEE80211_INVAL_HW_QUEUE) 534 queues |= BIT(sdata->vif.cab_queue); 535 } else { 536 /* all queues */ 537 queues = BIT(local->hw.queues) - 1; 538 } 539 540 ieee80211_stop_queues_by_reason(&local->hw, IEEE80211_MAX_QUEUE_MAP, 541 IEEE80211_QUEUE_STOP_REASON_FLUSH); 542 543 drv_flush(local, queues, false); 544 545 ieee80211_wake_queues_by_reason(&local->hw, IEEE80211_MAX_QUEUE_MAP, 546 IEEE80211_QUEUE_STOP_REASON_FLUSH); 547 } 548 549 void ieee80211_iterate_active_interfaces( 550 struct ieee80211_hw *hw, u32 iter_flags, 551 void (*iterator)(void *data, u8 *mac, 552 struct ieee80211_vif *vif), 553 void *data) 554 { 555 struct ieee80211_local *local = hw_to_local(hw); 556 struct ieee80211_sub_if_data *sdata; 557 558 mutex_lock(&local->iflist_mtx); 559 560 list_for_each_entry(sdata, &local->interfaces, list) { 561 switch (sdata->vif.type) { 562 case NL80211_IFTYPE_MONITOR: 563 if (!(sdata->u.mntr_flags & MONITOR_FLAG_ACTIVE)) 564 continue; 565 break; 566 case NL80211_IFTYPE_AP_VLAN: 567 continue; 568 default: 569 break; 570 } 571 if (!(iter_flags & IEEE80211_IFACE_ITER_RESUME_ALL) && 572 !(sdata->flags & IEEE80211_SDATA_IN_DRIVER)) 573 continue; 574 if (ieee80211_sdata_running(sdata)) 575 iterator(data, sdata->vif.addr, 576 &sdata->vif); 577 } 578 579 sdata = rcu_dereference_protected(local->monitor_sdata, 580 lockdep_is_held(&local->iflist_mtx)); 581 if (sdata && 582 (iter_flags & IEEE80211_IFACE_ITER_RESUME_ALL || 583 sdata->flags & IEEE80211_SDATA_IN_DRIVER)) 584 iterator(data, sdata->vif.addr, &sdata->vif); 585 586 mutex_unlock(&local->iflist_mtx); 587 } 588 EXPORT_SYMBOL_GPL(ieee80211_iterate_active_interfaces); 589 590 void ieee80211_iterate_active_interfaces_atomic( 591 struct ieee80211_hw *hw, u32 iter_flags, 592 void (*iterator)(void *data, u8 *mac, 593 struct ieee80211_vif *vif), 594 void *data) 595 { 596 struct ieee80211_local *local = hw_to_local(hw); 597 struct ieee80211_sub_if_data *sdata; 598 599 rcu_read_lock(); 600 601 list_for_each_entry_rcu(sdata, &local->interfaces, list) { 602 switch (sdata->vif.type) { 603 case NL80211_IFTYPE_MONITOR: 604 if (!(sdata->u.mntr_flags & MONITOR_FLAG_ACTIVE)) 605 continue; 606 break; 607 case NL80211_IFTYPE_AP_VLAN: 608 continue; 609 default: 610 break; 611 } 612 if (!(iter_flags & IEEE80211_IFACE_ITER_RESUME_ALL) && 613 !(sdata->flags & IEEE80211_SDATA_IN_DRIVER)) 614 continue; 615 if (ieee80211_sdata_running(sdata)) 616 iterator(data, sdata->vif.addr, 617 &sdata->vif); 618 } 619 620 sdata = rcu_dereference(local->monitor_sdata); 621 if (sdata && 622 (iter_flags & IEEE80211_IFACE_ITER_RESUME_ALL || 623 sdata->flags & IEEE80211_SDATA_IN_DRIVER)) 624 iterator(data, sdata->vif.addr, &sdata->vif); 625 626 rcu_read_unlock(); 627 } 628 EXPORT_SYMBOL_GPL(ieee80211_iterate_active_interfaces_atomic); 629 630 /* 631 * Nothing should have been stuffed into the workqueue during 632 * the suspend->resume cycle. If this WARN is seen then there 633 * is a bug with either the driver suspend or something in 634 * mac80211 stuffing into the workqueue which we haven't yet 635 * cleared during mac80211's suspend cycle. 636 */ 637 static bool ieee80211_can_queue_work(struct ieee80211_local *local) 638 { 639 if (WARN(local->suspended && !local->resuming, 640 "queueing ieee80211 work while going to suspend\n")) 641 return false; 642 643 return true; 644 } 645 646 void ieee80211_queue_work(struct ieee80211_hw *hw, struct work_struct *work) 647 { 648 struct ieee80211_local *local = hw_to_local(hw); 649 650 if (!ieee80211_can_queue_work(local)) 651 return; 652 653 queue_work(local->workqueue, work); 654 } 655 EXPORT_SYMBOL(ieee80211_queue_work); 656 657 void ieee80211_queue_delayed_work(struct ieee80211_hw *hw, 658 struct delayed_work *dwork, 659 unsigned long delay) 660 { 661 struct ieee80211_local *local = hw_to_local(hw); 662 663 if (!ieee80211_can_queue_work(local)) 664 return; 665 666 queue_delayed_work(local->workqueue, dwork, delay); 667 } 668 EXPORT_SYMBOL(ieee80211_queue_delayed_work); 669 670 u32 ieee802_11_parse_elems_crc(const u8 *start, size_t len, bool action, 671 struct ieee802_11_elems *elems, 672 u64 filter, u32 crc) 673 { 674 size_t left = len; 675 const u8 *pos = start; 676 bool calc_crc = filter != 0; 677 DECLARE_BITMAP(seen_elems, 256); 678 const u8 *ie; 679 680 bitmap_zero(seen_elems, 256); 681 memset(elems, 0, sizeof(*elems)); 682 elems->ie_start = start; 683 elems->total_len = len; 684 685 while (left >= 2) { 686 u8 id, elen; 687 bool elem_parse_failed; 688 689 id = *pos++; 690 elen = *pos++; 691 left -= 2; 692 693 if (elen > left) { 694 elems->parse_error = true; 695 break; 696 } 697 698 switch (id) { 699 case WLAN_EID_SSID: 700 case WLAN_EID_SUPP_RATES: 701 case WLAN_EID_FH_PARAMS: 702 case WLAN_EID_DS_PARAMS: 703 case WLAN_EID_CF_PARAMS: 704 case WLAN_EID_TIM: 705 case WLAN_EID_IBSS_PARAMS: 706 case WLAN_EID_CHALLENGE: 707 case WLAN_EID_RSN: 708 case WLAN_EID_ERP_INFO: 709 case WLAN_EID_EXT_SUPP_RATES: 710 case WLAN_EID_HT_CAPABILITY: 711 case WLAN_EID_HT_OPERATION: 712 case WLAN_EID_VHT_CAPABILITY: 713 case WLAN_EID_VHT_OPERATION: 714 case WLAN_EID_MESH_ID: 715 case WLAN_EID_MESH_CONFIG: 716 case WLAN_EID_PEER_MGMT: 717 case WLAN_EID_PREQ: 718 case WLAN_EID_PREP: 719 case WLAN_EID_PERR: 720 case WLAN_EID_RANN: 721 case WLAN_EID_CHANNEL_SWITCH: 722 case WLAN_EID_EXT_CHANSWITCH_ANN: 723 case WLAN_EID_COUNTRY: 724 case WLAN_EID_PWR_CONSTRAINT: 725 case WLAN_EID_TIMEOUT_INTERVAL: 726 case WLAN_EID_SECONDARY_CHANNEL_OFFSET: 727 case WLAN_EID_WIDE_BW_CHANNEL_SWITCH: 728 /* 729 * not listing WLAN_EID_CHANNEL_SWITCH_WRAPPER -- it seems possible 730 * that if the content gets bigger it might be needed more than once 731 */ 732 if (test_bit(id, seen_elems)) { 733 elems->parse_error = true; 734 left -= elen; 735 pos += elen; 736 continue; 737 } 738 break; 739 } 740 741 if (calc_crc && id < 64 && (filter & (1ULL << id))) 742 crc = crc32_be(crc, pos - 2, elen + 2); 743 744 elem_parse_failed = false; 745 746 switch (id) { 747 case WLAN_EID_SSID: 748 elems->ssid = pos; 749 elems->ssid_len = elen; 750 break; 751 case WLAN_EID_SUPP_RATES: 752 elems->supp_rates = pos; 753 elems->supp_rates_len = elen; 754 break; 755 case WLAN_EID_DS_PARAMS: 756 if (elen >= 1) 757 elems->ds_params = pos; 758 else 759 elem_parse_failed = true; 760 break; 761 case WLAN_EID_TIM: 762 if (elen >= sizeof(struct ieee80211_tim_ie)) { 763 elems->tim = (void *)pos; 764 elems->tim_len = elen; 765 } else 766 elem_parse_failed = true; 767 break; 768 case WLAN_EID_CHALLENGE: 769 elems->challenge = pos; 770 elems->challenge_len = elen; 771 break; 772 case WLAN_EID_VENDOR_SPECIFIC: 773 if (elen >= 4 && pos[0] == 0x00 && pos[1] == 0x50 && 774 pos[2] == 0xf2) { 775 /* Microsoft OUI (00:50:F2) */ 776 777 if (calc_crc) 778 crc = crc32_be(crc, pos - 2, elen + 2); 779 780 if (elen >= 5 && pos[3] == 2) { 781 /* OUI Type 2 - WMM IE */ 782 if (pos[4] == 0) { 783 elems->wmm_info = pos; 784 elems->wmm_info_len = elen; 785 } else if (pos[4] == 1) { 786 elems->wmm_param = pos; 787 elems->wmm_param_len = elen; 788 } 789 } 790 } 791 break; 792 case WLAN_EID_RSN: 793 elems->rsn = pos; 794 elems->rsn_len = elen; 795 break; 796 case WLAN_EID_ERP_INFO: 797 if (elen >= 1) 798 elems->erp_info = pos; 799 else 800 elem_parse_failed = true; 801 break; 802 case WLAN_EID_EXT_SUPP_RATES: 803 elems->ext_supp_rates = pos; 804 elems->ext_supp_rates_len = elen; 805 break; 806 case WLAN_EID_HT_CAPABILITY: 807 if (elen >= sizeof(struct ieee80211_ht_cap)) 808 elems->ht_cap_elem = (void *)pos; 809 else 810 elem_parse_failed = true; 811 break; 812 case WLAN_EID_HT_OPERATION: 813 if (elen >= sizeof(struct ieee80211_ht_operation)) 814 elems->ht_operation = (void *)pos; 815 else 816 elem_parse_failed = true; 817 break; 818 case WLAN_EID_VHT_CAPABILITY: 819 if (elen >= sizeof(struct ieee80211_vht_cap)) 820 elems->vht_cap_elem = (void *)pos; 821 else 822 elem_parse_failed = true; 823 break; 824 case WLAN_EID_VHT_OPERATION: 825 if (elen >= sizeof(struct ieee80211_vht_operation)) 826 elems->vht_operation = (void *)pos; 827 else 828 elem_parse_failed = true; 829 break; 830 case WLAN_EID_OPMODE_NOTIF: 831 if (elen > 0) 832 elems->opmode_notif = pos; 833 else 834 elem_parse_failed = true; 835 break; 836 case WLAN_EID_MESH_ID: 837 elems->mesh_id = pos; 838 elems->mesh_id_len = elen; 839 break; 840 case WLAN_EID_MESH_CONFIG: 841 if (elen >= sizeof(struct ieee80211_meshconf_ie)) 842 elems->mesh_config = (void *)pos; 843 else 844 elem_parse_failed = true; 845 break; 846 case WLAN_EID_PEER_MGMT: 847 elems->peering = pos; 848 elems->peering_len = elen; 849 break; 850 case WLAN_EID_MESH_AWAKE_WINDOW: 851 if (elen >= 2) 852 elems->awake_window = (void *)pos; 853 break; 854 case WLAN_EID_PREQ: 855 elems->preq = pos; 856 elems->preq_len = elen; 857 break; 858 case WLAN_EID_PREP: 859 elems->prep = pos; 860 elems->prep_len = elen; 861 break; 862 case WLAN_EID_PERR: 863 elems->perr = pos; 864 elems->perr_len = elen; 865 break; 866 case WLAN_EID_RANN: 867 if (elen >= sizeof(struct ieee80211_rann_ie)) 868 elems->rann = (void *)pos; 869 else 870 elem_parse_failed = true; 871 break; 872 case WLAN_EID_CHANNEL_SWITCH: 873 if (elen != sizeof(struct ieee80211_channel_sw_ie)) { 874 elem_parse_failed = true; 875 break; 876 } 877 elems->ch_switch_ie = (void *)pos; 878 break; 879 case WLAN_EID_EXT_CHANSWITCH_ANN: 880 if (elen != sizeof(struct ieee80211_ext_chansw_ie)) { 881 elem_parse_failed = true; 882 break; 883 } 884 elems->ext_chansw_ie = (void *)pos; 885 break; 886 case WLAN_EID_SECONDARY_CHANNEL_OFFSET: 887 if (elen != sizeof(struct ieee80211_sec_chan_offs_ie)) { 888 elem_parse_failed = true; 889 break; 890 } 891 elems->sec_chan_offs = (void *)pos; 892 break; 893 case WLAN_EID_WIDE_BW_CHANNEL_SWITCH: 894 if (!action || 895 elen != sizeof(*elems->wide_bw_chansw_ie)) { 896 elem_parse_failed = true; 897 break; 898 } 899 elems->wide_bw_chansw_ie = (void *)pos; 900 break; 901 case WLAN_EID_CHANNEL_SWITCH_WRAPPER: 902 if (action) { 903 elem_parse_failed = true; 904 break; 905 } 906 /* 907 * This is a bit tricky, but as we only care about 908 * the wide bandwidth channel switch element, so 909 * just parse it out manually. 910 */ 911 ie = cfg80211_find_ie(WLAN_EID_WIDE_BW_CHANNEL_SWITCH, 912 pos, elen); 913 if (ie) { 914 if (ie[1] == sizeof(*elems->wide_bw_chansw_ie)) 915 elems->wide_bw_chansw_ie = 916 (void *)(ie + 2); 917 else 918 elem_parse_failed = true; 919 } 920 break; 921 case WLAN_EID_COUNTRY: 922 elems->country_elem = pos; 923 elems->country_elem_len = elen; 924 break; 925 case WLAN_EID_PWR_CONSTRAINT: 926 if (elen != 1) { 927 elem_parse_failed = true; 928 break; 929 } 930 elems->pwr_constr_elem = pos; 931 break; 932 case WLAN_EID_TIMEOUT_INTERVAL: 933 if (elen >= sizeof(struct ieee80211_timeout_interval_ie)) 934 elems->timeout_int = (void *)pos; 935 else 936 elem_parse_failed = true; 937 break; 938 default: 939 break; 940 } 941 942 if (elem_parse_failed) 943 elems->parse_error = true; 944 else 945 __set_bit(id, seen_elems); 946 947 left -= elen; 948 pos += elen; 949 } 950 951 if (left != 0) 952 elems->parse_error = true; 953 954 return crc; 955 } 956 957 void ieee80211_set_wmm_default(struct ieee80211_sub_if_data *sdata, 958 bool bss_notify) 959 { 960 struct ieee80211_local *local = sdata->local; 961 struct ieee80211_tx_queue_params qparam; 962 struct ieee80211_chanctx_conf *chanctx_conf; 963 int ac; 964 bool use_11b, enable_qos; 965 int aCWmin, aCWmax; 966 967 if (!local->ops->conf_tx) 968 return; 969 970 if (local->hw.queues < IEEE80211_NUM_ACS) 971 return; 972 973 memset(&qparam, 0, sizeof(qparam)); 974 975 rcu_read_lock(); 976 chanctx_conf = rcu_dereference(sdata->vif.chanctx_conf); 977 use_11b = (chanctx_conf && 978 chanctx_conf->def.chan->band == IEEE80211_BAND_2GHZ) && 979 !(sdata->flags & IEEE80211_SDATA_OPERATING_GMODE); 980 rcu_read_unlock(); 981 982 /* 983 * By default disable QoS in STA mode for old access points, which do 984 * not support 802.11e. New APs will provide proper queue parameters, 985 * that we will configure later. 986 */ 987 enable_qos = (sdata->vif.type != NL80211_IFTYPE_STATION); 988 989 for (ac = 0; ac < IEEE80211_NUM_ACS; ac++) { 990 /* Set defaults according to 802.11-2007 Table 7-37 */ 991 aCWmax = 1023; 992 if (use_11b) 993 aCWmin = 31; 994 else 995 aCWmin = 15; 996 997 if (enable_qos) { 998 switch (ac) { 999 case IEEE80211_AC_BK: 1000 qparam.cw_max = aCWmax; 1001 qparam.cw_min = aCWmin; 1002 qparam.txop = 0; 1003 qparam.aifs = 7; 1004 break; 1005 /* never happens but let's not leave undefined */ 1006 default: 1007 case IEEE80211_AC_BE: 1008 qparam.cw_max = aCWmax; 1009 qparam.cw_min = aCWmin; 1010 qparam.txop = 0; 1011 qparam.aifs = 3; 1012 break; 1013 case IEEE80211_AC_VI: 1014 qparam.cw_max = aCWmin; 1015 qparam.cw_min = (aCWmin + 1) / 2 - 1; 1016 if (use_11b) 1017 qparam.txop = 6016/32; 1018 else 1019 qparam.txop = 3008/32; 1020 qparam.aifs = 2; 1021 break; 1022 case IEEE80211_AC_VO: 1023 qparam.cw_max = (aCWmin + 1) / 2 - 1; 1024 qparam.cw_min = (aCWmin + 1) / 4 - 1; 1025 if (use_11b) 1026 qparam.txop = 3264/32; 1027 else 1028 qparam.txop = 1504/32; 1029 qparam.aifs = 2; 1030 break; 1031 } 1032 } else { 1033 /* Confiure old 802.11b/g medium access rules. */ 1034 qparam.cw_max = aCWmax; 1035 qparam.cw_min = aCWmin; 1036 qparam.txop = 0; 1037 qparam.aifs = 2; 1038 } 1039 1040 qparam.uapsd = false; 1041 1042 sdata->tx_conf[ac] = qparam; 1043 drv_conf_tx(local, sdata, ac, &qparam); 1044 } 1045 1046 if (sdata->vif.type != NL80211_IFTYPE_MONITOR && 1047 sdata->vif.type != NL80211_IFTYPE_P2P_DEVICE) { 1048 sdata->vif.bss_conf.qos = enable_qos; 1049 if (bss_notify) 1050 ieee80211_bss_info_change_notify(sdata, 1051 BSS_CHANGED_QOS); 1052 } 1053 } 1054 1055 void ieee80211_sta_def_wmm_params(struct ieee80211_sub_if_data *sdata, 1056 const size_t supp_rates_len, 1057 const u8 *supp_rates) 1058 { 1059 struct ieee80211_chanctx_conf *chanctx_conf; 1060 int i, have_higher_than_11mbit = 0; 1061 1062 /* cf. IEEE 802.11 9.2.12 */ 1063 for (i = 0; i < supp_rates_len; i++) 1064 if ((supp_rates[i] & 0x7f) * 5 > 110) 1065 have_higher_than_11mbit = 1; 1066 1067 rcu_read_lock(); 1068 chanctx_conf = rcu_dereference(sdata->vif.chanctx_conf); 1069 1070 if (chanctx_conf && 1071 chanctx_conf->def.chan->band == IEEE80211_BAND_2GHZ && 1072 have_higher_than_11mbit) 1073 sdata->flags |= IEEE80211_SDATA_OPERATING_GMODE; 1074 else 1075 sdata->flags &= ~IEEE80211_SDATA_OPERATING_GMODE; 1076 rcu_read_unlock(); 1077 1078 ieee80211_set_wmm_default(sdata, true); 1079 } 1080 1081 void ieee80211_send_auth(struct ieee80211_sub_if_data *sdata, 1082 u16 transaction, u16 auth_alg, u16 status, 1083 const u8 *extra, size_t extra_len, const u8 *da, 1084 const u8 *bssid, const u8 *key, u8 key_len, u8 key_idx, 1085 u32 tx_flags) 1086 { 1087 struct ieee80211_local *local = sdata->local; 1088 struct sk_buff *skb; 1089 struct ieee80211_mgmt *mgmt; 1090 int err; 1091 1092 skb = dev_alloc_skb(local->hw.extra_tx_headroom + 1093 sizeof(*mgmt) + 6 + extra_len); 1094 if (!skb) 1095 return; 1096 1097 skb_reserve(skb, local->hw.extra_tx_headroom); 1098 1099 mgmt = (struct ieee80211_mgmt *) skb_put(skb, 24 + 6); 1100 memset(mgmt, 0, 24 + 6); 1101 mgmt->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT | 1102 IEEE80211_STYPE_AUTH); 1103 memcpy(mgmt->da, da, ETH_ALEN); 1104 memcpy(mgmt->sa, sdata->vif.addr, ETH_ALEN); 1105 memcpy(mgmt->bssid, bssid, ETH_ALEN); 1106 mgmt->u.auth.auth_alg = cpu_to_le16(auth_alg); 1107 mgmt->u.auth.auth_transaction = cpu_to_le16(transaction); 1108 mgmt->u.auth.status_code = cpu_to_le16(status); 1109 if (extra) 1110 memcpy(skb_put(skb, extra_len), extra, extra_len); 1111 1112 if (auth_alg == WLAN_AUTH_SHARED_KEY && transaction == 3) { 1113 mgmt->frame_control |= cpu_to_le16(IEEE80211_FCTL_PROTECTED); 1114 err = ieee80211_wep_encrypt(local, skb, key, key_len, key_idx); 1115 WARN_ON(err); 1116 } 1117 1118 IEEE80211_SKB_CB(skb)->flags |= IEEE80211_TX_INTFL_DONT_ENCRYPT | 1119 tx_flags; 1120 ieee80211_tx_skb(sdata, skb); 1121 } 1122 1123 void ieee80211_send_deauth_disassoc(struct ieee80211_sub_if_data *sdata, 1124 const u8 *bssid, u16 stype, u16 reason, 1125 bool send_frame, u8 *frame_buf) 1126 { 1127 struct ieee80211_local *local = sdata->local; 1128 struct sk_buff *skb; 1129 struct ieee80211_mgmt *mgmt = (void *)frame_buf; 1130 1131 /* build frame */ 1132 mgmt->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT | stype); 1133 mgmt->duration = 0; /* initialize only */ 1134 mgmt->seq_ctrl = 0; /* initialize only */ 1135 memcpy(mgmt->da, bssid, ETH_ALEN); 1136 memcpy(mgmt->sa, sdata->vif.addr, ETH_ALEN); 1137 memcpy(mgmt->bssid, bssid, ETH_ALEN); 1138 /* u.deauth.reason_code == u.disassoc.reason_code */ 1139 mgmt->u.deauth.reason_code = cpu_to_le16(reason); 1140 1141 if (send_frame) { 1142 skb = dev_alloc_skb(local->hw.extra_tx_headroom + 1143 IEEE80211_DEAUTH_FRAME_LEN); 1144 if (!skb) 1145 return; 1146 1147 skb_reserve(skb, local->hw.extra_tx_headroom); 1148 1149 /* copy in frame */ 1150 memcpy(skb_put(skb, IEEE80211_DEAUTH_FRAME_LEN), 1151 mgmt, IEEE80211_DEAUTH_FRAME_LEN); 1152 1153 if (sdata->vif.type != NL80211_IFTYPE_STATION || 1154 !(sdata->u.mgd.flags & IEEE80211_STA_MFP_ENABLED)) 1155 IEEE80211_SKB_CB(skb)->flags |= 1156 IEEE80211_TX_INTFL_DONT_ENCRYPT; 1157 1158 ieee80211_tx_skb(sdata, skb); 1159 } 1160 } 1161 1162 int ieee80211_build_preq_ies(struct ieee80211_local *local, u8 *buffer, 1163 size_t buffer_len, const u8 *ie, size_t ie_len, 1164 enum ieee80211_band band, u32 rate_mask, 1165 u8 channel) 1166 { 1167 struct ieee80211_supported_band *sband; 1168 u8 *pos = buffer, *end = buffer + buffer_len; 1169 size_t offset = 0, noffset; 1170 int supp_rates_len, i; 1171 u8 rates[32]; 1172 int num_rates; 1173 int ext_rates_len; 1174 1175 sband = local->hw.wiphy->bands[band]; 1176 if (WARN_ON_ONCE(!sband)) 1177 return 0; 1178 1179 num_rates = 0; 1180 for (i = 0; i < sband->n_bitrates; i++) { 1181 if ((BIT(i) & rate_mask) == 0) 1182 continue; /* skip rate */ 1183 rates[num_rates++] = (u8) (sband->bitrates[i].bitrate / 5); 1184 } 1185 1186 supp_rates_len = min_t(int, num_rates, 8); 1187 1188 if (end - pos < 2 + supp_rates_len) 1189 goto out_err; 1190 *pos++ = WLAN_EID_SUPP_RATES; 1191 *pos++ = supp_rates_len; 1192 memcpy(pos, rates, supp_rates_len); 1193 pos += supp_rates_len; 1194 1195 /* insert "request information" if in custom IEs */ 1196 if (ie && ie_len) { 1197 static const u8 before_extrates[] = { 1198 WLAN_EID_SSID, 1199 WLAN_EID_SUPP_RATES, 1200 WLAN_EID_REQUEST, 1201 }; 1202 noffset = ieee80211_ie_split(ie, ie_len, 1203 before_extrates, 1204 ARRAY_SIZE(before_extrates), 1205 offset); 1206 if (end - pos < noffset - offset) 1207 goto out_err; 1208 memcpy(pos, ie + offset, noffset - offset); 1209 pos += noffset - offset; 1210 offset = noffset; 1211 } 1212 1213 ext_rates_len = num_rates - supp_rates_len; 1214 if (ext_rates_len > 0) { 1215 if (end - pos < 2 + ext_rates_len) 1216 goto out_err; 1217 *pos++ = WLAN_EID_EXT_SUPP_RATES; 1218 *pos++ = ext_rates_len; 1219 memcpy(pos, rates + supp_rates_len, ext_rates_len); 1220 pos += ext_rates_len; 1221 } 1222 1223 if (channel && sband->band == IEEE80211_BAND_2GHZ) { 1224 if (end - pos < 3) 1225 goto out_err; 1226 *pos++ = WLAN_EID_DS_PARAMS; 1227 *pos++ = 1; 1228 *pos++ = channel; 1229 } 1230 1231 /* insert custom IEs that go before HT */ 1232 if (ie && ie_len) { 1233 static const u8 before_ht[] = { 1234 WLAN_EID_SSID, 1235 WLAN_EID_SUPP_RATES, 1236 WLAN_EID_REQUEST, 1237 WLAN_EID_EXT_SUPP_RATES, 1238 WLAN_EID_DS_PARAMS, 1239 WLAN_EID_SUPPORTED_REGULATORY_CLASSES, 1240 }; 1241 noffset = ieee80211_ie_split(ie, ie_len, 1242 before_ht, ARRAY_SIZE(before_ht), 1243 offset); 1244 if (end - pos < noffset - offset) 1245 goto out_err; 1246 memcpy(pos, ie + offset, noffset - offset); 1247 pos += noffset - offset; 1248 offset = noffset; 1249 } 1250 1251 if (sband->ht_cap.ht_supported) { 1252 if (end - pos < 2 + sizeof(struct ieee80211_ht_cap)) 1253 goto out_err; 1254 pos = ieee80211_ie_build_ht_cap(pos, &sband->ht_cap, 1255 sband->ht_cap.cap); 1256 } 1257 1258 /* 1259 * If adding more here, adjust code in main.c 1260 * that calculates local->scan_ies_len. 1261 */ 1262 1263 /* add any remaining custom IEs */ 1264 if (ie && ie_len) { 1265 noffset = ie_len; 1266 if (end - pos < noffset - offset) 1267 goto out_err; 1268 memcpy(pos, ie + offset, noffset - offset); 1269 pos += noffset - offset; 1270 } 1271 1272 if (sband->vht_cap.vht_supported) { 1273 if (end - pos < 2 + sizeof(struct ieee80211_vht_cap)) 1274 goto out_err; 1275 pos = ieee80211_ie_build_vht_cap(pos, &sband->vht_cap, 1276 sband->vht_cap.cap); 1277 } 1278 1279 return pos - buffer; 1280 out_err: 1281 WARN_ONCE(1, "not enough space for preq IEs\n"); 1282 return pos - buffer; 1283 } 1284 1285 struct sk_buff *ieee80211_build_probe_req(struct ieee80211_sub_if_data *sdata, 1286 u8 *dst, u32 ratemask, 1287 struct ieee80211_channel *chan, 1288 const u8 *ssid, size_t ssid_len, 1289 const u8 *ie, size_t ie_len, 1290 bool directed) 1291 { 1292 struct ieee80211_local *local = sdata->local; 1293 struct sk_buff *skb; 1294 struct ieee80211_mgmt *mgmt; 1295 u8 chan_no; 1296 int ies_len; 1297 1298 /* 1299 * Do not send DS Channel parameter for directed probe requests 1300 * in order to maximize the chance that we get a response. Some 1301 * badly-behaved APs don't respond when this parameter is included. 1302 */ 1303 if (directed) 1304 chan_no = 0; 1305 else 1306 chan_no = ieee80211_frequency_to_channel(chan->center_freq); 1307 1308 skb = ieee80211_probereq_get(&local->hw, &sdata->vif, 1309 ssid, ssid_len, 100 + ie_len); 1310 if (!skb) 1311 return NULL; 1312 1313 ies_len = ieee80211_build_preq_ies(local, skb_tail_pointer(skb), 1314 skb_tailroom(skb), 1315 ie, ie_len, chan->band, 1316 ratemask, chan_no); 1317 skb_put(skb, ies_len); 1318 1319 if (dst) { 1320 mgmt = (struct ieee80211_mgmt *) skb->data; 1321 memcpy(mgmt->da, dst, ETH_ALEN); 1322 memcpy(mgmt->bssid, dst, ETH_ALEN); 1323 } 1324 1325 IEEE80211_SKB_CB(skb)->flags |= IEEE80211_TX_INTFL_DONT_ENCRYPT; 1326 1327 return skb; 1328 } 1329 1330 void ieee80211_send_probe_req(struct ieee80211_sub_if_data *sdata, u8 *dst, 1331 const u8 *ssid, size_t ssid_len, 1332 const u8 *ie, size_t ie_len, 1333 u32 ratemask, bool directed, u32 tx_flags, 1334 struct ieee80211_channel *channel, bool scan) 1335 { 1336 struct sk_buff *skb; 1337 1338 skb = ieee80211_build_probe_req(sdata, dst, ratemask, channel, 1339 ssid, ssid_len, 1340 ie, ie_len, directed); 1341 if (skb) { 1342 IEEE80211_SKB_CB(skb)->flags |= tx_flags; 1343 if (scan) 1344 ieee80211_tx_skb_tid_band(sdata, skb, 7, channel->band); 1345 else 1346 ieee80211_tx_skb(sdata, skb); 1347 } 1348 } 1349 1350 u32 ieee80211_sta_get_rates(struct ieee80211_local *local, 1351 struct ieee802_11_elems *elems, 1352 enum ieee80211_band band, u32 *basic_rates) 1353 { 1354 struct ieee80211_supported_band *sband; 1355 struct ieee80211_rate *bitrates; 1356 size_t num_rates; 1357 u32 supp_rates; 1358 int i, j; 1359 sband = local->hw.wiphy->bands[band]; 1360 1361 if (WARN_ON(!sband)) 1362 return 1; 1363 1364 bitrates = sband->bitrates; 1365 num_rates = sband->n_bitrates; 1366 supp_rates = 0; 1367 for (i = 0; i < elems->supp_rates_len + 1368 elems->ext_supp_rates_len; i++) { 1369 u8 rate = 0; 1370 int own_rate; 1371 bool is_basic; 1372 if (i < elems->supp_rates_len) 1373 rate = elems->supp_rates[i]; 1374 else if (elems->ext_supp_rates) 1375 rate = elems->ext_supp_rates 1376 [i - elems->supp_rates_len]; 1377 own_rate = 5 * (rate & 0x7f); 1378 is_basic = !!(rate & 0x80); 1379 1380 if (is_basic && (rate & 0x7f) == BSS_MEMBERSHIP_SELECTOR_HT_PHY) 1381 continue; 1382 1383 for (j = 0; j < num_rates; j++) { 1384 if (bitrates[j].bitrate == own_rate) { 1385 supp_rates |= BIT(j); 1386 if (basic_rates && is_basic) 1387 *basic_rates |= BIT(j); 1388 } 1389 } 1390 } 1391 return supp_rates; 1392 } 1393 1394 void ieee80211_stop_device(struct ieee80211_local *local) 1395 { 1396 ieee80211_led_radio(local, false); 1397 ieee80211_mod_tpt_led_trig(local, 0, IEEE80211_TPT_LEDTRIG_FL_RADIO); 1398 1399 cancel_work_sync(&local->reconfig_filter); 1400 1401 flush_workqueue(local->workqueue); 1402 drv_stop(local); 1403 } 1404 1405 static void ieee80211_assign_chanctx(struct ieee80211_local *local, 1406 struct ieee80211_sub_if_data *sdata) 1407 { 1408 struct ieee80211_chanctx_conf *conf; 1409 struct ieee80211_chanctx *ctx; 1410 1411 if (!local->use_chanctx) 1412 return; 1413 1414 mutex_lock(&local->chanctx_mtx); 1415 conf = rcu_dereference_protected(sdata->vif.chanctx_conf, 1416 lockdep_is_held(&local->chanctx_mtx)); 1417 if (conf) { 1418 ctx = container_of(conf, struct ieee80211_chanctx, conf); 1419 drv_assign_vif_chanctx(local, sdata, ctx); 1420 } 1421 mutex_unlock(&local->chanctx_mtx); 1422 } 1423 1424 int ieee80211_reconfig(struct ieee80211_local *local) 1425 { 1426 struct ieee80211_hw *hw = &local->hw; 1427 struct ieee80211_sub_if_data *sdata; 1428 struct ieee80211_chanctx *ctx; 1429 struct sta_info *sta; 1430 int res, i; 1431 bool reconfig_due_to_wowlan = false; 1432 1433 #ifdef CONFIG_PM 1434 if (local->suspended) 1435 local->resuming = true; 1436 1437 if (local->wowlan) { 1438 local->wowlan = false; 1439 res = drv_resume(local); 1440 if (res < 0) { 1441 local->resuming = false; 1442 return res; 1443 } 1444 if (res == 0) 1445 goto wake_up; 1446 WARN_ON(res > 1); 1447 /* 1448 * res is 1, which means the driver requested 1449 * to go through a regular reset on wakeup. 1450 */ 1451 reconfig_due_to_wowlan = true; 1452 } 1453 #endif 1454 /* everything else happens only if HW was up & running */ 1455 if (!local->open_count) 1456 goto wake_up; 1457 1458 /* 1459 * Upon resume hardware can sometimes be goofy due to 1460 * various platform / driver / bus issues, so restarting 1461 * the device may at times not work immediately. Propagate 1462 * the error. 1463 */ 1464 res = drv_start(local); 1465 if (res) { 1466 WARN(local->suspended, "Hardware became unavailable " 1467 "upon resume. This could be a software issue " 1468 "prior to suspend or a hardware issue.\n"); 1469 return res; 1470 } 1471 1472 /* setup fragmentation threshold */ 1473 drv_set_frag_threshold(local, hw->wiphy->frag_threshold); 1474 1475 /* setup RTS threshold */ 1476 drv_set_rts_threshold(local, hw->wiphy->rts_threshold); 1477 1478 /* reset coverage class */ 1479 drv_set_coverage_class(local, hw->wiphy->coverage_class); 1480 1481 ieee80211_led_radio(local, true); 1482 ieee80211_mod_tpt_led_trig(local, 1483 IEEE80211_TPT_LEDTRIG_FL_RADIO, 0); 1484 1485 /* add interfaces */ 1486 sdata = rtnl_dereference(local->monitor_sdata); 1487 if (sdata) { 1488 /* in HW restart it exists already */ 1489 WARN_ON(local->resuming); 1490 res = drv_add_interface(local, sdata); 1491 if (WARN_ON(res)) { 1492 rcu_assign_pointer(local->monitor_sdata, NULL); 1493 synchronize_net(); 1494 kfree(sdata); 1495 } 1496 } 1497 1498 list_for_each_entry(sdata, &local->interfaces, list) { 1499 if (sdata->vif.type != NL80211_IFTYPE_AP_VLAN && 1500 sdata->vif.type != NL80211_IFTYPE_MONITOR && 1501 ieee80211_sdata_running(sdata)) 1502 res = drv_add_interface(local, sdata); 1503 } 1504 1505 /* add channel contexts */ 1506 if (local->use_chanctx) { 1507 mutex_lock(&local->chanctx_mtx); 1508 list_for_each_entry(ctx, &local->chanctx_list, list) 1509 WARN_ON(drv_add_chanctx(local, ctx)); 1510 mutex_unlock(&local->chanctx_mtx); 1511 } 1512 1513 list_for_each_entry(sdata, &local->interfaces, list) { 1514 if (!ieee80211_sdata_running(sdata)) 1515 continue; 1516 ieee80211_assign_chanctx(local, sdata); 1517 } 1518 1519 sdata = rtnl_dereference(local->monitor_sdata); 1520 if (sdata && ieee80211_sdata_running(sdata)) 1521 ieee80211_assign_chanctx(local, sdata); 1522 1523 /* add STAs back */ 1524 mutex_lock(&local->sta_mtx); 1525 list_for_each_entry(sta, &local->sta_list, list) { 1526 enum ieee80211_sta_state state; 1527 1528 if (!sta->uploaded) 1529 continue; 1530 1531 /* AP-mode stations will be added later */ 1532 if (sta->sdata->vif.type == NL80211_IFTYPE_AP) 1533 continue; 1534 1535 for (state = IEEE80211_STA_NOTEXIST; 1536 state < sta->sta_state; state++) 1537 WARN_ON(drv_sta_state(local, sta->sdata, sta, state, 1538 state + 1)); 1539 } 1540 mutex_unlock(&local->sta_mtx); 1541 1542 /* reconfigure tx conf */ 1543 if (hw->queues >= IEEE80211_NUM_ACS) { 1544 list_for_each_entry(sdata, &local->interfaces, list) { 1545 if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN || 1546 sdata->vif.type == NL80211_IFTYPE_MONITOR || 1547 !ieee80211_sdata_running(sdata)) 1548 continue; 1549 1550 for (i = 0; i < IEEE80211_NUM_ACS; i++) 1551 drv_conf_tx(local, sdata, i, 1552 &sdata->tx_conf[i]); 1553 } 1554 } 1555 1556 /* reconfigure hardware */ 1557 ieee80211_hw_config(local, ~0); 1558 1559 ieee80211_configure_filter(local); 1560 1561 /* Finally also reconfigure all the BSS information */ 1562 list_for_each_entry(sdata, &local->interfaces, list) { 1563 u32 changed; 1564 1565 if (!ieee80211_sdata_running(sdata)) 1566 continue; 1567 1568 /* common change flags for all interface types */ 1569 changed = BSS_CHANGED_ERP_CTS_PROT | 1570 BSS_CHANGED_ERP_PREAMBLE | 1571 BSS_CHANGED_ERP_SLOT | 1572 BSS_CHANGED_HT | 1573 BSS_CHANGED_BASIC_RATES | 1574 BSS_CHANGED_BEACON_INT | 1575 BSS_CHANGED_BSSID | 1576 BSS_CHANGED_CQM | 1577 BSS_CHANGED_QOS | 1578 BSS_CHANGED_IDLE | 1579 BSS_CHANGED_TXPOWER; 1580 1581 switch (sdata->vif.type) { 1582 case NL80211_IFTYPE_STATION: 1583 changed |= BSS_CHANGED_ASSOC | 1584 BSS_CHANGED_ARP_FILTER | 1585 BSS_CHANGED_PS; 1586 1587 /* Re-send beacon info report to the driver */ 1588 if (sdata->u.mgd.have_beacon) 1589 changed |= BSS_CHANGED_BEACON_INFO; 1590 1591 sdata_lock(sdata); 1592 ieee80211_bss_info_change_notify(sdata, changed); 1593 sdata_unlock(sdata); 1594 break; 1595 case NL80211_IFTYPE_ADHOC: 1596 changed |= BSS_CHANGED_IBSS; 1597 /* fall through */ 1598 case NL80211_IFTYPE_AP: 1599 changed |= BSS_CHANGED_SSID | BSS_CHANGED_P2P_PS; 1600 1601 if (sdata->vif.type == NL80211_IFTYPE_AP) { 1602 changed |= BSS_CHANGED_AP_PROBE_RESP; 1603 1604 if (rcu_access_pointer(sdata->u.ap.beacon)) 1605 drv_start_ap(local, sdata); 1606 } 1607 1608 /* fall through */ 1609 case NL80211_IFTYPE_MESH_POINT: 1610 if (sdata->vif.bss_conf.enable_beacon) { 1611 changed |= BSS_CHANGED_BEACON | 1612 BSS_CHANGED_BEACON_ENABLED; 1613 ieee80211_bss_info_change_notify(sdata, changed); 1614 } 1615 break; 1616 case NL80211_IFTYPE_WDS: 1617 break; 1618 case NL80211_IFTYPE_AP_VLAN: 1619 case NL80211_IFTYPE_MONITOR: 1620 /* ignore virtual */ 1621 break; 1622 case NL80211_IFTYPE_P2P_DEVICE: 1623 changed = BSS_CHANGED_IDLE; 1624 break; 1625 case NL80211_IFTYPE_UNSPECIFIED: 1626 case NUM_NL80211_IFTYPES: 1627 case NL80211_IFTYPE_P2P_CLIENT: 1628 case NL80211_IFTYPE_P2P_GO: 1629 WARN_ON(1); 1630 break; 1631 } 1632 } 1633 1634 ieee80211_recalc_ps(local, -1); 1635 1636 /* 1637 * The sta might be in psm against the ap (e.g. because 1638 * this was the state before a hw restart), so we 1639 * explicitly send a null packet in order to make sure 1640 * it'll sync against the ap (and get out of psm). 1641 */ 1642 if (!(local->hw.conf.flags & IEEE80211_CONF_PS)) { 1643 list_for_each_entry(sdata, &local->interfaces, list) { 1644 if (sdata->vif.type != NL80211_IFTYPE_STATION) 1645 continue; 1646 if (!sdata->u.mgd.associated) 1647 continue; 1648 1649 ieee80211_send_nullfunc(local, sdata, 0); 1650 } 1651 } 1652 1653 /* APs are now beaconing, add back stations */ 1654 mutex_lock(&local->sta_mtx); 1655 list_for_each_entry(sta, &local->sta_list, list) { 1656 enum ieee80211_sta_state state; 1657 1658 if (!sta->uploaded) 1659 continue; 1660 1661 if (sta->sdata->vif.type != NL80211_IFTYPE_AP) 1662 continue; 1663 1664 for (state = IEEE80211_STA_NOTEXIST; 1665 state < sta->sta_state; state++) 1666 WARN_ON(drv_sta_state(local, sta->sdata, sta, state, 1667 state + 1)); 1668 } 1669 mutex_unlock(&local->sta_mtx); 1670 1671 /* add back keys */ 1672 list_for_each_entry(sdata, &local->interfaces, list) 1673 if (ieee80211_sdata_running(sdata)) 1674 ieee80211_enable_keys(sdata); 1675 1676 wake_up: 1677 local->in_reconfig = false; 1678 barrier(); 1679 1680 if (local->monitors == local->open_count && local->monitors > 0) 1681 ieee80211_add_virtual_monitor(local); 1682 1683 /* 1684 * Clear the WLAN_STA_BLOCK_BA flag so new aggregation 1685 * sessions can be established after a resume. 1686 * 1687 * Also tear down aggregation sessions since reconfiguring 1688 * them in a hardware restart scenario is not easily done 1689 * right now, and the hardware will have lost information 1690 * about the sessions, but we and the AP still think they 1691 * are active. This is really a workaround though. 1692 */ 1693 if (hw->flags & IEEE80211_HW_AMPDU_AGGREGATION) { 1694 mutex_lock(&local->sta_mtx); 1695 1696 list_for_each_entry(sta, &local->sta_list, list) { 1697 ieee80211_sta_tear_down_BA_sessions( 1698 sta, AGG_STOP_LOCAL_REQUEST); 1699 clear_sta_flag(sta, WLAN_STA_BLOCK_BA); 1700 } 1701 1702 mutex_unlock(&local->sta_mtx); 1703 } 1704 1705 ieee80211_wake_queues_by_reason(hw, IEEE80211_MAX_QUEUE_MAP, 1706 IEEE80211_QUEUE_STOP_REASON_SUSPEND); 1707 1708 /* 1709 * If this is for hw restart things are still running. 1710 * We may want to change that later, however. 1711 */ 1712 if (!local->suspended || reconfig_due_to_wowlan) 1713 drv_restart_complete(local); 1714 1715 if (!local->suspended) 1716 return 0; 1717 1718 #ifdef CONFIG_PM 1719 /* first set suspended false, then resuming */ 1720 local->suspended = false; 1721 mb(); 1722 local->resuming = false; 1723 1724 list_for_each_entry(sdata, &local->interfaces, list) { 1725 if (!ieee80211_sdata_running(sdata)) 1726 continue; 1727 if (sdata->vif.type == NL80211_IFTYPE_STATION) 1728 ieee80211_sta_restart(sdata); 1729 } 1730 1731 mod_timer(&local->sta_cleanup, jiffies + 1); 1732 #else 1733 WARN_ON(1); 1734 #endif 1735 return 0; 1736 } 1737 1738 void ieee80211_resume_disconnect(struct ieee80211_vif *vif) 1739 { 1740 struct ieee80211_sub_if_data *sdata; 1741 struct ieee80211_local *local; 1742 struct ieee80211_key *key; 1743 1744 if (WARN_ON(!vif)) 1745 return; 1746 1747 sdata = vif_to_sdata(vif); 1748 local = sdata->local; 1749 1750 if (WARN_ON(!local->resuming)) 1751 return; 1752 1753 if (WARN_ON(vif->type != NL80211_IFTYPE_STATION)) 1754 return; 1755 1756 sdata->flags |= IEEE80211_SDATA_DISCONNECT_RESUME; 1757 1758 mutex_lock(&local->key_mtx); 1759 list_for_each_entry(key, &sdata->key_list, list) 1760 key->flags |= KEY_FLAG_TAINTED; 1761 mutex_unlock(&local->key_mtx); 1762 } 1763 EXPORT_SYMBOL_GPL(ieee80211_resume_disconnect); 1764 1765 void ieee80211_recalc_smps(struct ieee80211_sub_if_data *sdata) 1766 { 1767 struct ieee80211_local *local = sdata->local; 1768 struct ieee80211_chanctx_conf *chanctx_conf; 1769 struct ieee80211_chanctx *chanctx; 1770 1771 mutex_lock(&local->chanctx_mtx); 1772 1773 chanctx_conf = rcu_dereference_protected(sdata->vif.chanctx_conf, 1774 lockdep_is_held(&local->chanctx_mtx)); 1775 1776 if (WARN_ON_ONCE(!chanctx_conf)) 1777 goto unlock; 1778 1779 chanctx = container_of(chanctx_conf, struct ieee80211_chanctx, conf); 1780 ieee80211_recalc_smps_chanctx(local, chanctx); 1781 unlock: 1782 mutex_unlock(&local->chanctx_mtx); 1783 } 1784 1785 static bool ieee80211_id_in_list(const u8 *ids, int n_ids, u8 id) 1786 { 1787 int i; 1788 1789 for (i = 0; i < n_ids; i++) 1790 if (ids[i] == id) 1791 return true; 1792 return false; 1793 } 1794 1795 /** 1796 * ieee80211_ie_split - split an IE buffer according to ordering 1797 * 1798 * @ies: the IE buffer 1799 * @ielen: the length of the IE buffer 1800 * @ids: an array with element IDs that are allowed before 1801 * the split 1802 * @n_ids: the size of the element ID array 1803 * @offset: offset where to start splitting in the buffer 1804 * 1805 * This function splits an IE buffer by updating the @offset 1806 * variable to point to the location where the buffer should be 1807 * split. 1808 * 1809 * It assumes that the given IE buffer is well-formed, this 1810 * has to be guaranteed by the caller! 1811 * 1812 * It also assumes that the IEs in the buffer are ordered 1813 * correctly, if not the result of using this function will not 1814 * be ordered correctly either, i.e. it does no reordering. 1815 * 1816 * The function returns the offset where the next part of the 1817 * buffer starts, which may be @ielen if the entire (remainder) 1818 * of the buffer should be used. 1819 */ 1820 size_t ieee80211_ie_split(const u8 *ies, size_t ielen, 1821 const u8 *ids, int n_ids, size_t offset) 1822 { 1823 size_t pos = offset; 1824 1825 while (pos < ielen && ieee80211_id_in_list(ids, n_ids, ies[pos])) 1826 pos += 2 + ies[pos + 1]; 1827 1828 return pos; 1829 } 1830 1831 size_t ieee80211_ie_split_vendor(const u8 *ies, size_t ielen, size_t offset) 1832 { 1833 size_t pos = offset; 1834 1835 while (pos < ielen && ies[pos] != WLAN_EID_VENDOR_SPECIFIC) 1836 pos += 2 + ies[pos + 1]; 1837 1838 return pos; 1839 } 1840 1841 static void _ieee80211_enable_rssi_reports(struct ieee80211_sub_if_data *sdata, 1842 int rssi_min_thold, 1843 int rssi_max_thold) 1844 { 1845 trace_api_enable_rssi_reports(sdata, rssi_min_thold, rssi_max_thold); 1846 1847 if (WARN_ON(sdata->vif.type != NL80211_IFTYPE_STATION)) 1848 return; 1849 1850 /* 1851 * Scale up threshold values before storing it, as the RSSI averaging 1852 * algorithm uses a scaled up value as well. Change this scaling 1853 * factor if the RSSI averaging algorithm changes. 1854 */ 1855 sdata->u.mgd.rssi_min_thold = rssi_min_thold*16; 1856 sdata->u.mgd.rssi_max_thold = rssi_max_thold*16; 1857 } 1858 1859 void ieee80211_enable_rssi_reports(struct ieee80211_vif *vif, 1860 int rssi_min_thold, 1861 int rssi_max_thold) 1862 { 1863 struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif); 1864 1865 WARN_ON(rssi_min_thold == rssi_max_thold || 1866 rssi_min_thold > rssi_max_thold); 1867 1868 _ieee80211_enable_rssi_reports(sdata, rssi_min_thold, 1869 rssi_max_thold); 1870 } 1871 EXPORT_SYMBOL(ieee80211_enable_rssi_reports); 1872 1873 void ieee80211_disable_rssi_reports(struct ieee80211_vif *vif) 1874 { 1875 struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif); 1876 1877 _ieee80211_enable_rssi_reports(sdata, 0, 0); 1878 } 1879 EXPORT_SYMBOL(ieee80211_disable_rssi_reports); 1880 1881 u8 *ieee80211_ie_build_ht_cap(u8 *pos, struct ieee80211_sta_ht_cap *ht_cap, 1882 u16 cap) 1883 { 1884 __le16 tmp; 1885 1886 *pos++ = WLAN_EID_HT_CAPABILITY; 1887 *pos++ = sizeof(struct ieee80211_ht_cap); 1888 memset(pos, 0, sizeof(struct ieee80211_ht_cap)); 1889 1890 /* capability flags */ 1891 tmp = cpu_to_le16(cap); 1892 memcpy(pos, &tmp, sizeof(u16)); 1893 pos += sizeof(u16); 1894 1895 /* AMPDU parameters */ 1896 *pos++ = ht_cap->ampdu_factor | 1897 (ht_cap->ampdu_density << 1898 IEEE80211_HT_AMPDU_PARM_DENSITY_SHIFT); 1899 1900 /* MCS set */ 1901 memcpy(pos, &ht_cap->mcs, sizeof(ht_cap->mcs)); 1902 pos += sizeof(ht_cap->mcs); 1903 1904 /* extended capabilities */ 1905 pos += sizeof(__le16); 1906 1907 /* BF capabilities */ 1908 pos += sizeof(__le32); 1909 1910 /* antenna selection */ 1911 pos += sizeof(u8); 1912 1913 return pos; 1914 } 1915 1916 u8 *ieee80211_ie_build_vht_cap(u8 *pos, struct ieee80211_sta_vht_cap *vht_cap, 1917 u32 cap) 1918 { 1919 __le32 tmp; 1920 1921 *pos++ = WLAN_EID_VHT_CAPABILITY; 1922 *pos++ = sizeof(struct ieee80211_vht_cap); 1923 memset(pos, 0, sizeof(struct ieee80211_vht_cap)); 1924 1925 /* capability flags */ 1926 tmp = cpu_to_le32(cap); 1927 memcpy(pos, &tmp, sizeof(u32)); 1928 pos += sizeof(u32); 1929 1930 /* VHT MCS set */ 1931 memcpy(pos, &vht_cap->vht_mcs, sizeof(vht_cap->vht_mcs)); 1932 pos += sizeof(vht_cap->vht_mcs); 1933 1934 return pos; 1935 } 1936 1937 u8 *ieee80211_ie_build_ht_oper(u8 *pos, struct ieee80211_sta_ht_cap *ht_cap, 1938 const struct cfg80211_chan_def *chandef, 1939 u16 prot_mode) 1940 { 1941 struct ieee80211_ht_operation *ht_oper; 1942 /* Build HT Information */ 1943 *pos++ = WLAN_EID_HT_OPERATION; 1944 *pos++ = sizeof(struct ieee80211_ht_operation); 1945 ht_oper = (struct ieee80211_ht_operation *)pos; 1946 ht_oper->primary_chan = ieee80211_frequency_to_channel( 1947 chandef->chan->center_freq); 1948 switch (chandef->width) { 1949 case NL80211_CHAN_WIDTH_160: 1950 case NL80211_CHAN_WIDTH_80P80: 1951 case NL80211_CHAN_WIDTH_80: 1952 case NL80211_CHAN_WIDTH_40: 1953 if (chandef->center_freq1 > chandef->chan->center_freq) 1954 ht_oper->ht_param = IEEE80211_HT_PARAM_CHA_SEC_ABOVE; 1955 else 1956 ht_oper->ht_param = IEEE80211_HT_PARAM_CHA_SEC_BELOW; 1957 break; 1958 default: 1959 ht_oper->ht_param = IEEE80211_HT_PARAM_CHA_SEC_NONE; 1960 break; 1961 } 1962 if (ht_cap->cap & IEEE80211_HT_CAP_SUP_WIDTH_20_40 && 1963 chandef->width != NL80211_CHAN_WIDTH_20_NOHT && 1964 chandef->width != NL80211_CHAN_WIDTH_20) 1965 ht_oper->ht_param |= IEEE80211_HT_PARAM_CHAN_WIDTH_ANY; 1966 1967 ht_oper->operation_mode = cpu_to_le16(prot_mode); 1968 ht_oper->stbc_param = 0x0000; 1969 1970 /* It seems that Basic MCS set and Supported MCS set 1971 are identical for the first 10 bytes */ 1972 memset(&ht_oper->basic_set, 0, 16); 1973 memcpy(&ht_oper->basic_set, &ht_cap->mcs, 10); 1974 1975 return pos + sizeof(struct ieee80211_ht_operation); 1976 } 1977 1978 void ieee80211_ht_oper_to_chandef(struct ieee80211_channel *control_chan, 1979 const struct ieee80211_ht_operation *ht_oper, 1980 struct cfg80211_chan_def *chandef) 1981 { 1982 enum nl80211_channel_type channel_type; 1983 1984 if (!ht_oper) { 1985 cfg80211_chandef_create(chandef, control_chan, 1986 NL80211_CHAN_NO_HT); 1987 return; 1988 } 1989 1990 switch (ht_oper->ht_param & IEEE80211_HT_PARAM_CHA_SEC_OFFSET) { 1991 case IEEE80211_HT_PARAM_CHA_SEC_NONE: 1992 channel_type = NL80211_CHAN_HT20; 1993 break; 1994 case IEEE80211_HT_PARAM_CHA_SEC_ABOVE: 1995 channel_type = NL80211_CHAN_HT40PLUS; 1996 break; 1997 case IEEE80211_HT_PARAM_CHA_SEC_BELOW: 1998 channel_type = NL80211_CHAN_HT40MINUS; 1999 break; 2000 default: 2001 channel_type = NL80211_CHAN_NO_HT; 2002 } 2003 2004 cfg80211_chandef_create(chandef, control_chan, channel_type); 2005 } 2006 2007 int ieee80211_add_srates_ie(struct ieee80211_sub_if_data *sdata, 2008 struct sk_buff *skb, bool need_basic, 2009 enum ieee80211_band band) 2010 { 2011 struct ieee80211_local *local = sdata->local; 2012 struct ieee80211_supported_band *sband; 2013 int rate; 2014 u8 i, rates, *pos; 2015 u32 basic_rates = sdata->vif.bss_conf.basic_rates; 2016 2017 sband = local->hw.wiphy->bands[band]; 2018 rates = sband->n_bitrates; 2019 if (rates > 8) 2020 rates = 8; 2021 2022 if (skb_tailroom(skb) < rates + 2) 2023 return -ENOMEM; 2024 2025 pos = skb_put(skb, rates + 2); 2026 *pos++ = WLAN_EID_SUPP_RATES; 2027 *pos++ = rates; 2028 for (i = 0; i < rates; i++) { 2029 u8 basic = 0; 2030 if (need_basic && basic_rates & BIT(i)) 2031 basic = 0x80; 2032 rate = sband->bitrates[i].bitrate; 2033 *pos++ = basic | (u8) (rate / 5); 2034 } 2035 2036 return 0; 2037 } 2038 2039 int ieee80211_add_ext_srates_ie(struct ieee80211_sub_if_data *sdata, 2040 struct sk_buff *skb, bool need_basic, 2041 enum ieee80211_band band) 2042 { 2043 struct ieee80211_local *local = sdata->local; 2044 struct ieee80211_supported_band *sband; 2045 int rate; 2046 u8 i, exrates, *pos; 2047 u32 basic_rates = sdata->vif.bss_conf.basic_rates; 2048 2049 sband = local->hw.wiphy->bands[band]; 2050 exrates = sband->n_bitrates; 2051 if (exrates > 8) 2052 exrates -= 8; 2053 else 2054 exrates = 0; 2055 2056 if (skb_tailroom(skb) < exrates + 2) 2057 return -ENOMEM; 2058 2059 if (exrates) { 2060 pos = skb_put(skb, exrates + 2); 2061 *pos++ = WLAN_EID_EXT_SUPP_RATES; 2062 *pos++ = exrates; 2063 for (i = 8; i < sband->n_bitrates; i++) { 2064 u8 basic = 0; 2065 if (need_basic && basic_rates & BIT(i)) 2066 basic = 0x80; 2067 rate = sband->bitrates[i].bitrate; 2068 *pos++ = basic | (u8) (rate / 5); 2069 } 2070 } 2071 return 0; 2072 } 2073 2074 int ieee80211_ave_rssi(struct ieee80211_vif *vif) 2075 { 2076 struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif); 2077 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; 2078 2079 if (WARN_ON_ONCE(sdata->vif.type != NL80211_IFTYPE_STATION)) { 2080 /* non-managed type inferfaces */ 2081 return 0; 2082 } 2083 return ifmgd->ave_beacon_signal / 16; 2084 } 2085 EXPORT_SYMBOL_GPL(ieee80211_ave_rssi); 2086 2087 u8 ieee80211_mcs_to_chains(const struct ieee80211_mcs_info *mcs) 2088 { 2089 if (!mcs) 2090 return 1; 2091 2092 /* TODO: consider rx_highest */ 2093 2094 if (mcs->rx_mask[3]) 2095 return 4; 2096 if (mcs->rx_mask[2]) 2097 return 3; 2098 if (mcs->rx_mask[1]) 2099 return 2; 2100 return 1; 2101 } 2102 2103 /** 2104 * ieee80211_calculate_rx_timestamp - calculate timestamp in frame 2105 * @local: mac80211 hw info struct 2106 * @status: RX status 2107 * @mpdu_len: total MPDU length (including FCS) 2108 * @mpdu_offset: offset into MPDU to calculate timestamp at 2109 * 2110 * This function calculates the RX timestamp at the given MPDU offset, taking 2111 * into account what the RX timestamp was. An offset of 0 will just normalize 2112 * the timestamp to TSF at beginning of MPDU reception. 2113 */ 2114 u64 ieee80211_calculate_rx_timestamp(struct ieee80211_local *local, 2115 struct ieee80211_rx_status *status, 2116 unsigned int mpdu_len, 2117 unsigned int mpdu_offset) 2118 { 2119 u64 ts = status->mactime; 2120 struct rate_info ri; 2121 u16 rate; 2122 2123 if (WARN_ON(!ieee80211_have_rx_timestamp(status))) 2124 return 0; 2125 2126 memset(&ri, 0, sizeof(ri)); 2127 2128 /* Fill cfg80211 rate info */ 2129 if (status->flag & RX_FLAG_HT) { 2130 ri.mcs = status->rate_idx; 2131 ri.flags |= RATE_INFO_FLAGS_MCS; 2132 if (status->flag & RX_FLAG_40MHZ) 2133 ri.flags |= RATE_INFO_FLAGS_40_MHZ_WIDTH; 2134 if (status->flag & RX_FLAG_SHORT_GI) 2135 ri.flags |= RATE_INFO_FLAGS_SHORT_GI; 2136 } else if (status->flag & RX_FLAG_VHT) { 2137 ri.flags |= RATE_INFO_FLAGS_VHT_MCS; 2138 ri.mcs = status->rate_idx; 2139 ri.nss = status->vht_nss; 2140 if (status->flag & RX_FLAG_40MHZ) 2141 ri.flags |= RATE_INFO_FLAGS_40_MHZ_WIDTH; 2142 if (status->flag & RX_FLAG_80MHZ) 2143 ri.flags |= RATE_INFO_FLAGS_80_MHZ_WIDTH; 2144 if (status->flag & RX_FLAG_80P80MHZ) 2145 ri.flags |= RATE_INFO_FLAGS_80P80_MHZ_WIDTH; 2146 if (status->flag & RX_FLAG_160MHZ) 2147 ri.flags |= RATE_INFO_FLAGS_160_MHZ_WIDTH; 2148 if (status->flag & RX_FLAG_SHORT_GI) 2149 ri.flags |= RATE_INFO_FLAGS_SHORT_GI; 2150 } else { 2151 struct ieee80211_supported_band *sband; 2152 2153 sband = local->hw.wiphy->bands[status->band]; 2154 ri.legacy = sband->bitrates[status->rate_idx].bitrate; 2155 } 2156 2157 rate = cfg80211_calculate_bitrate(&ri); 2158 2159 /* rewind from end of MPDU */ 2160 if (status->flag & RX_FLAG_MACTIME_END) 2161 ts -= mpdu_len * 8 * 10 / rate; 2162 2163 ts += mpdu_offset * 8 * 10 / rate; 2164 2165 return ts; 2166 } 2167 2168 void ieee80211_dfs_cac_cancel(struct ieee80211_local *local) 2169 { 2170 struct ieee80211_sub_if_data *sdata; 2171 2172 mutex_lock(&local->iflist_mtx); 2173 list_for_each_entry(sdata, &local->interfaces, list) { 2174 cancel_delayed_work_sync(&sdata->dfs_cac_timer_work); 2175 2176 if (sdata->wdev.cac_started) { 2177 ieee80211_vif_release_channel(sdata); 2178 cfg80211_cac_event(sdata->dev, 2179 NL80211_RADAR_CAC_ABORTED, 2180 GFP_KERNEL); 2181 } 2182 } 2183 mutex_unlock(&local->iflist_mtx); 2184 } 2185 2186 void ieee80211_dfs_radar_detected_work(struct work_struct *work) 2187 { 2188 struct ieee80211_local *local = 2189 container_of(work, struct ieee80211_local, radar_detected_work); 2190 struct cfg80211_chan_def chandef; 2191 2192 ieee80211_dfs_cac_cancel(local); 2193 2194 if (local->use_chanctx) 2195 /* currently not handled */ 2196 WARN_ON(1); 2197 else { 2198 chandef = local->hw.conf.chandef; 2199 cfg80211_radar_event(local->hw.wiphy, &chandef, GFP_KERNEL); 2200 } 2201 } 2202 2203 void ieee80211_radar_detected(struct ieee80211_hw *hw) 2204 { 2205 struct ieee80211_local *local = hw_to_local(hw); 2206 2207 trace_api_radar_detected(local); 2208 2209 ieee80211_queue_work(hw, &local->radar_detected_work); 2210 } 2211 EXPORT_SYMBOL(ieee80211_radar_detected); 2212