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