1 // SPDX-License-Identifier: GPL-2.0-only 2 /* 3 * Copyright 2002-2005, Instant802 Networks, Inc. 4 * Copyright 2005-2006, Devicescape Software, Inc. 5 * Copyright 2006-2007 Jiri Benc <jbenc@suse.cz> 6 * Copyright 2007 Johannes Berg <johannes@sipsolutions.net> 7 * Copyright 2013-2014 Intel Mobile Communications GmbH 8 * Copyright (C) 2015-2017 Intel Deutschland GmbH 9 * Copyright (C) 2018-2023 Intel Corporation 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 #include <kunit/visibility.h> 28 29 #include "ieee80211_i.h" 30 #include "driver-ops.h" 31 #include "rate.h" 32 #include "mesh.h" 33 #include "wme.h" 34 #include "led.h" 35 #include "wep.h" 36 37 /* privid for wiphys to determine whether they belong to us or not */ 38 const void *const mac80211_wiphy_privid = &mac80211_wiphy_privid; 39 40 struct ieee80211_hw *wiphy_to_ieee80211_hw(struct wiphy *wiphy) 41 { 42 struct ieee80211_local *local; 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 if (ieee80211_is_data(fc)) { 55 if (len < 24) /* drop incorrect hdr len (data) */ 56 return NULL; 57 58 if (ieee80211_has_a4(fc)) 59 return NULL; 60 if (ieee80211_has_tods(fc)) 61 return hdr->addr1; 62 if (ieee80211_has_fromds(fc)) 63 return hdr->addr2; 64 65 return hdr->addr3; 66 } 67 68 if (ieee80211_is_s1g_beacon(fc)) { 69 struct ieee80211_ext *ext = (void *) hdr; 70 71 return ext->u.s1g_beacon.sa; 72 } 73 74 if (ieee80211_is_mgmt(fc)) { 75 if (len < 24) /* drop incorrect hdr len (mgmt) */ 76 return NULL; 77 return hdr->addr3; 78 } 79 80 if (ieee80211_is_ctl(fc)) { 81 if (ieee80211_is_pspoll(fc)) 82 return hdr->addr1; 83 84 if (ieee80211_is_back_req(fc)) { 85 switch (type) { 86 case NL80211_IFTYPE_STATION: 87 return hdr->addr2; 88 case NL80211_IFTYPE_AP: 89 case NL80211_IFTYPE_AP_VLAN: 90 return hdr->addr1; 91 default: 92 break; /* fall through to the return */ 93 } 94 } 95 } 96 97 return NULL; 98 } 99 EXPORT_SYMBOL(ieee80211_get_bssid); 100 101 void ieee80211_tx_set_protected(struct ieee80211_tx_data *tx) 102 { 103 struct sk_buff *skb; 104 struct ieee80211_hdr *hdr; 105 106 skb_queue_walk(&tx->skbs, skb) { 107 hdr = (struct ieee80211_hdr *) skb->data; 108 hdr->frame_control |= cpu_to_le16(IEEE80211_FCTL_PROTECTED); 109 } 110 } 111 112 int ieee80211_frame_duration(enum nl80211_band band, size_t len, 113 int rate, int erp, int short_preamble) 114 { 115 int dur; 116 117 /* calculate duration (in microseconds, rounded up to next higher 118 * integer if it includes a fractional microsecond) to send frame of 119 * len bytes (does not include FCS) at the given rate. Duration will 120 * also include SIFS. 121 * 122 * rate is in 100 kbps, so divident is multiplied by 10 in the 123 * DIV_ROUND_UP() operations. 124 */ 125 126 if (band == NL80211_BAND_5GHZ || erp) { 127 /* 128 * OFDM: 129 * 130 * N_DBPS = DATARATE x 4 131 * N_SYM = Ceiling((16+8xLENGTH+6) / N_DBPS) 132 * (16 = SIGNAL time, 6 = tail bits) 133 * TXTIME = T_PREAMBLE + T_SIGNAL + T_SYM x N_SYM + Signal Ext 134 * 135 * T_SYM = 4 usec 136 * 802.11a - 18.5.2: aSIFSTime = 16 usec 137 * 802.11g - 19.8.4: aSIFSTime = 10 usec + 138 * signal ext = 6 usec 139 */ 140 dur = 16; /* SIFS + signal ext */ 141 dur += 16; /* IEEE 802.11-2012 18.3.2.4: T_PREAMBLE = 16 usec */ 142 dur += 4; /* IEEE 802.11-2012 18.3.2.4: T_SIGNAL = 4 usec */ 143 144 /* rates should already consider the channel bandwidth, 145 * don't apply divisor again. 146 */ 147 dur += 4 * DIV_ROUND_UP((16 + 8 * (len + 4) + 6) * 10, 148 4 * rate); /* T_SYM x N_SYM */ 149 } else { 150 /* 151 * 802.11b or 802.11g with 802.11b compatibility: 152 * 18.3.4: TXTIME = PreambleLength + PLCPHeaderTime + 153 * Ceiling(((LENGTH+PBCC)x8)/DATARATE). PBCC=0. 154 * 155 * 802.11 (DS): 15.3.3, 802.11b: 18.3.4 156 * aSIFSTime = 10 usec 157 * aPreambleLength = 144 usec or 72 usec with short preamble 158 * aPLCPHeaderLength = 48 usec or 24 usec with short preamble 159 */ 160 dur = 10; /* aSIFSTime = 10 usec */ 161 dur += short_preamble ? (72 + 24) : (144 + 48); 162 163 dur += DIV_ROUND_UP(8 * (len + 4) * 10, rate); 164 } 165 166 return dur; 167 } 168 169 /* Exported duration function for driver use */ 170 __le16 ieee80211_generic_frame_duration(struct ieee80211_hw *hw, 171 struct ieee80211_vif *vif, 172 enum nl80211_band band, 173 size_t frame_len, 174 struct ieee80211_rate *rate) 175 { 176 struct ieee80211_sub_if_data *sdata; 177 u16 dur; 178 int erp; 179 bool short_preamble = false; 180 181 erp = 0; 182 if (vif) { 183 sdata = vif_to_sdata(vif); 184 short_preamble = sdata->vif.bss_conf.use_short_preamble; 185 if (sdata->deflink.operating_11g_mode) 186 erp = rate->flags & IEEE80211_RATE_ERP_G; 187 } 188 189 dur = ieee80211_frame_duration(band, frame_len, rate->bitrate, erp, 190 short_preamble); 191 192 return cpu_to_le16(dur); 193 } 194 EXPORT_SYMBOL(ieee80211_generic_frame_duration); 195 196 __le16 ieee80211_rts_duration(struct ieee80211_hw *hw, 197 struct ieee80211_vif *vif, size_t frame_len, 198 const struct ieee80211_tx_info *frame_txctl) 199 { 200 struct ieee80211_local *local = hw_to_local(hw); 201 struct ieee80211_rate *rate; 202 struct ieee80211_sub_if_data *sdata; 203 bool short_preamble; 204 int erp, bitrate; 205 u16 dur; 206 struct ieee80211_supported_band *sband; 207 208 sband = local->hw.wiphy->bands[frame_txctl->band]; 209 210 short_preamble = false; 211 212 rate = &sband->bitrates[frame_txctl->control.rts_cts_rate_idx]; 213 214 erp = 0; 215 if (vif) { 216 sdata = vif_to_sdata(vif); 217 short_preamble = sdata->vif.bss_conf.use_short_preamble; 218 if (sdata->deflink.operating_11g_mode) 219 erp = rate->flags & IEEE80211_RATE_ERP_G; 220 } 221 222 bitrate = rate->bitrate; 223 224 /* CTS duration */ 225 dur = ieee80211_frame_duration(sband->band, 10, bitrate, 226 erp, short_preamble); 227 /* Data frame duration */ 228 dur += ieee80211_frame_duration(sband->band, frame_len, bitrate, 229 erp, short_preamble); 230 /* ACK duration */ 231 dur += ieee80211_frame_duration(sband->band, 10, bitrate, 232 erp, short_preamble); 233 234 return cpu_to_le16(dur); 235 } 236 EXPORT_SYMBOL(ieee80211_rts_duration); 237 238 __le16 ieee80211_ctstoself_duration(struct ieee80211_hw *hw, 239 struct ieee80211_vif *vif, 240 size_t frame_len, 241 const struct ieee80211_tx_info *frame_txctl) 242 { 243 struct ieee80211_local *local = hw_to_local(hw); 244 struct ieee80211_rate *rate; 245 struct ieee80211_sub_if_data *sdata; 246 bool short_preamble; 247 int erp, bitrate; 248 u16 dur; 249 struct ieee80211_supported_band *sband; 250 251 sband = local->hw.wiphy->bands[frame_txctl->band]; 252 253 short_preamble = false; 254 255 rate = &sband->bitrates[frame_txctl->control.rts_cts_rate_idx]; 256 erp = 0; 257 if (vif) { 258 sdata = vif_to_sdata(vif); 259 short_preamble = sdata->vif.bss_conf.use_short_preamble; 260 if (sdata->deflink.operating_11g_mode) 261 erp = rate->flags & IEEE80211_RATE_ERP_G; 262 } 263 264 bitrate = rate->bitrate; 265 266 /* Data frame duration */ 267 dur = ieee80211_frame_duration(sband->band, frame_len, bitrate, 268 erp, short_preamble); 269 if (!(frame_txctl->flags & IEEE80211_TX_CTL_NO_ACK)) { 270 /* ACK duration */ 271 dur += ieee80211_frame_duration(sband->band, 10, bitrate, 272 erp, short_preamble); 273 } 274 275 return cpu_to_le16(dur); 276 } 277 EXPORT_SYMBOL(ieee80211_ctstoself_duration); 278 279 static void wake_tx_push_queue(struct ieee80211_local *local, 280 struct ieee80211_sub_if_data *sdata, 281 struct ieee80211_txq *queue) 282 { 283 struct ieee80211_tx_control control = { 284 .sta = queue->sta, 285 }; 286 struct sk_buff *skb; 287 288 while (1) { 289 skb = ieee80211_tx_dequeue(&local->hw, queue); 290 if (!skb) 291 break; 292 293 drv_tx(local, &control, skb); 294 } 295 } 296 297 /* wake_tx_queue handler for driver not implementing a custom one*/ 298 void ieee80211_handle_wake_tx_queue(struct ieee80211_hw *hw, 299 struct ieee80211_txq *txq) 300 { 301 struct ieee80211_local *local = hw_to_local(hw); 302 struct ieee80211_sub_if_data *sdata = vif_to_sdata(txq->vif); 303 struct ieee80211_txq *queue; 304 305 spin_lock(&local->handle_wake_tx_queue_lock); 306 307 /* Use ieee80211_next_txq() for airtime fairness accounting */ 308 ieee80211_txq_schedule_start(hw, txq->ac); 309 while ((queue = ieee80211_next_txq(hw, txq->ac))) { 310 wake_tx_push_queue(local, sdata, queue); 311 ieee80211_return_txq(hw, queue, false); 312 } 313 ieee80211_txq_schedule_end(hw, txq->ac); 314 spin_unlock(&local->handle_wake_tx_queue_lock); 315 } 316 EXPORT_SYMBOL(ieee80211_handle_wake_tx_queue); 317 318 static void __ieee80211_wake_txqs(struct ieee80211_sub_if_data *sdata, int ac) 319 { 320 struct ieee80211_local *local = sdata->local; 321 struct ieee80211_vif *vif = &sdata->vif; 322 struct fq *fq = &local->fq; 323 struct ps_data *ps = NULL; 324 struct txq_info *txqi; 325 struct sta_info *sta; 326 int i; 327 328 local_bh_disable(); 329 spin_lock(&fq->lock); 330 331 if (!test_bit(SDATA_STATE_RUNNING, &sdata->state)) 332 goto out; 333 334 if (sdata->vif.type == NL80211_IFTYPE_AP) 335 ps = &sdata->bss->ps; 336 337 list_for_each_entry_rcu(sta, &local->sta_list, list) { 338 if (sdata != sta->sdata) 339 continue; 340 341 for (i = 0; i < ARRAY_SIZE(sta->sta.txq); i++) { 342 struct ieee80211_txq *txq = sta->sta.txq[i]; 343 344 if (!txq) 345 continue; 346 347 txqi = to_txq_info(txq); 348 349 if (ac != txq->ac) 350 continue; 351 352 if (!test_and_clear_bit(IEEE80211_TXQ_DIRTY, 353 &txqi->flags)) 354 continue; 355 356 spin_unlock(&fq->lock); 357 drv_wake_tx_queue(local, txqi); 358 spin_lock(&fq->lock); 359 } 360 } 361 362 if (!vif->txq) 363 goto out; 364 365 txqi = to_txq_info(vif->txq); 366 367 if (!test_and_clear_bit(IEEE80211_TXQ_DIRTY, &txqi->flags) || 368 (ps && atomic_read(&ps->num_sta_ps)) || ac != vif->txq->ac) 369 goto out; 370 371 spin_unlock(&fq->lock); 372 373 drv_wake_tx_queue(local, txqi); 374 local_bh_enable(); 375 return; 376 out: 377 spin_unlock(&fq->lock); 378 local_bh_enable(); 379 } 380 381 static void 382 __releases(&local->queue_stop_reason_lock) 383 __acquires(&local->queue_stop_reason_lock) 384 _ieee80211_wake_txqs(struct ieee80211_local *local, unsigned long *flags) 385 { 386 struct ieee80211_sub_if_data *sdata; 387 int n_acs = IEEE80211_NUM_ACS; 388 int i; 389 390 rcu_read_lock(); 391 392 if (local->hw.queues < IEEE80211_NUM_ACS) 393 n_acs = 1; 394 395 for (i = 0; i < local->hw.queues; i++) { 396 if (local->queue_stop_reasons[i]) 397 continue; 398 399 spin_unlock_irqrestore(&local->queue_stop_reason_lock, *flags); 400 list_for_each_entry_rcu(sdata, &local->interfaces, list) { 401 int ac; 402 403 for (ac = 0; ac < n_acs; ac++) { 404 int ac_queue = sdata->vif.hw_queue[ac]; 405 406 if (ac_queue == i || 407 sdata->vif.cab_queue == i) 408 __ieee80211_wake_txqs(sdata, ac); 409 } 410 } 411 spin_lock_irqsave(&local->queue_stop_reason_lock, *flags); 412 } 413 414 rcu_read_unlock(); 415 } 416 417 void ieee80211_wake_txqs(struct tasklet_struct *t) 418 { 419 struct ieee80211_local *local = from_tasklet(local, t, 420 wake_txqs_tasklet); 421 unsigned long flags; 422 423 spin_lock_irqsave(&local->queue_stop_reason_lock, flags); 424 _ieee80211_wake_txqs(local, &flags); 425 spin_unlock_irqrestore(&local->queue_stop_reason_lock, flags); 426 } 427 428 static void __ieee80211_wake_queue(struct ieee80211_hw *hw, int queue, 429 enum queue_stop_reason reason, 430 bool refcounted, 431 unsigned long *flags) 432 { 433 struct ieee80211_local *local = hw_to_local(hw); 434 435 trace_wake_queue(local, queue, reason); 436 437 if (WARN_ON(queue >= hw->queues)) 438 return; 439 440 if (!test_bit(reason, &local->queue_stop_reasons[queue])) 441 return; 442 443 if (!refcounted) { 444 local->q_stop_reasons[queue][reason] = 0; 445 } else { 446 local->q_stop_reasons[queue][reason]--; 447 if (WARN_ON(local->q_stop_reasons[queue][reason] < 0)) 448 local->q_stop_reasons[queue][reason] = 0; 449 } 450 451 if (local->q_stop_reasons[queue][reason] == 0) 452 __clear_bit(reason, &local->queue_stop_reasons[queue]); 453 454 if (local->queue_stop_reasons[queue] != 0) 455 /* someone still has this queue stopped */ 456 return; 457 458 if (!skb_queue_empty(&local->pending[queue])) 459 tasklet_schedule(&local->tx_pending_tasklet); 460 461 /* 462 * Calling _ieee80211_wake_txqs here can be a problem because it may 463 * release queue_stop_reason_lock which has been taken by 464 * __ieee80211_wake_queue's caller. It is certainly not very nice to 465 * release someone's lock, but it is fine because all the callers of 466 * __ieee80211_wake_queue call it right before releasing the lock. 467 */ 468 if (reason == IEEE80211_QUEUE_STOP_REASON_DRIVER) 469 tasklet_schedule(&local->wake_txqs_tasklet); 470 else 471 _ieee80211_wake_txqs(local, flags); 472 } 473 474 void ieee80211_wake_queue_by_reason(struct ieee80211_hw *hw, int queue, 475 enum queue_stop_reason reason, 476 bool refcounted) 477 { 478 struct ieee80211_local *local = hw_to_local(hw); 479 unsigned long flags; 480 481 spin_lock_irqsave(&local->queue_stop_reason_lock, flags); 482 __ieee80211_wake_queue(hw, queue, reason, refcounted, &flags); 483 spin_unlock_irqrestore(&local->queue_stop_reason_lock, flags); 484 } 485 486 void ieee80211_wake_queue(struct ieee80211_hw *hw, int queue) 487 { 488 ieee80211_wake_queue_by_reason(hw, queue, 489 IEEE80211_QUEUE_STOP_REASON_DRIVER, 490 false); 491 } 492 EXPORT_SYMBOL(ieee80211_wake_queue); 493 494 static void __ieee80211_stop_queue(struct ieee80211_hw *hw, int queue, 495 enum queue_stop_reason reason, 496 bool refcounted) 497 { 498 struct ieee80211_local *local = hw_to_local(hw); 499 500 trace_stop_queue(local, queue, reason); 501 502 if (WARN_ON(queue >= hw->queues)) 503 return; 504 505 if (!refcounted) 506 local->q_stop_reasons[queue][reason] = 1; 507 else 508 local->q_stop_reasons[queue][reason]++; 509 510 set_bit(reason, &local->queue_stop_reasons[queue]); 511 } 512 513 void ieee80211_stop_queue_by_reason(struct ieee80211_hw *hw, int queue, 514 enum queue_stop_reason reason, 515 bool refcounted) 516 { 517 struct ieee80211_local *local = hw_to_local(hw); 518 unsigned long flags; 519 520 spin_lock_irqsave(&local->queue_stop_reason_lock, flags); 521 __ieee80211_stop_queue(hw, queue, reason, refcounted); 522 spin_unlock_irqrestore(&local->queue_stop_reason_lock, flags); 523 } 524 525 void ieee80211_stop_queue(struct ieee80211_hw *hw, int queue) 526 { 527 ieee80211_stop_queue_by_reason(hw, queue, 528 IEEE80211_QUEUE_STOP_REASON_DRIVER, 529 false); 530 } 531 EXPORT_SYMBOL(ieee80211_stop_queue); 532 533 void ieee80211_add_pending_skb(struct ieee80211_local *local, 534 struct sk_buff *skb) 535 { 536 struct ieee80211_hw *hw = &local->hw; 537 unsigned long flags; 538 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); 539 int queue = info->hw_queue; 540 541 if (WARN_ON(!info->control.vif)) { 542 ieee80211_free_txskb(&local->hw, skb); 543 return; 544 } 545 546 spin_lock_irqsave(&local->queue_stop_reason_lock, flags); 547 __ieee80211_stop_queue(hw, queue, IEEE80211_QUEUE_STOP_REASON_SKB_ADD, 548 false); 549 __skb_queue_tail(&local->pending[queue], skb); 550 __ieee80211_wake_queue(hw, queue, IEEE80211_QUEUE_STOP_REASON_SKB_ADD, 551 false, &flags); 552 spin_unlock_irqrestore(&local->queue_stop_reason_lock, flags); 553 } 554 555 void ieee80211_add_pending_skbs(struct ieee80211_local *local, 556 struct sk_buff_head *skbs) 557 { 558 struct ieee80211_hw *hw = &local->hw; 559 struct sk_buff *skb; 560 unsigned long flags; 561 int queue, i; 562 563 spin_lock_irqsave(&local->queue_stop_reason_lock, flags); 564 while ((skb = skb_dequeue(skbs))) { 565 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); 566 567 if (WARN_ON(!info->control.vif)) { 568 ieee80211_free_txskb(&local->hw, skb); 569 continue; 570 } 571 572 queue = info->hw_queue; 573 574 __ieee80211_stop_queue(hw, queue, 575 IEEE80211_QUEUE_STOP_REASON_SKB_ADD, 576 false); 577 578 __skb_queue_tail(&local->pending[queue], skb); 579 } 580 581 for (i = 0; i < hw->queues; i++) 582 __ieee80211_wake_queue(hw, i, 583 IEEE80211_QUEUE_STOP_REASON_SKB_ADD, 584 false, &flags); 585 spin_unlock_irqrestore(&local->queue_stop_reason_lock, flags); 586 } 587 588 void ieee80211_stop_queues_by_reason(struct ieee80211_hw *hw, 589 unsigned long queues, 590 enum queue_stop_reason reason, 591 bool refcounted) 592 { 593 struct ieee80211_local *local = hw_to_local(hw); 594 unsigned long flags; 595 int i; 596 597 spin_lock_irqsave(&local->queue_stop_reason_lock, flags); 598 599 for_each_set_bit(i, &queues, hw->queues) 600 __ieee80211_stop_queue(hw, i, reason, refcounted); 601 602 spin_unlock_irqrestore(&local->queue_stop_reason_lock, flags); 603 } 604 605 void ieee80211_stop_queues(struct ieee80211_hw *hw) 606 { 607 ieee80211_stop_queues_by_reason(hw, IEEE80211_MAX_QUEUE_MAP, 608 IEEE80211_QUEUE_STOP_REASON_DRIVER, 609 false); 610 } 611 EXPORT_SYMBOL(ieee80211_stop_queues); 612 613 int ieee80211_queue_stopped(struct ieee80211_hw *hw, int queue) 614 { 615 struct ieee80211_local *local = hw_to_local(hw); 616 unsigned long flags; 617 int ret; 618 619 if (WARN_ON(queue >= hw->queues)) 620 return true; 621 622 spin_lock_irqsave(&local->queue_stop_reason_lock, flags); 623 ret = test_bit(IEEE80211_QUEUE_STOP_REASON_DRIVER, 624 &local->queue_stop_reasons[queue]); 625 spin_unlock_irqrestore(&local->queue_stop_reason_lock, flags); 626 return ret; 627 } 628 EXPORT_SYMBOL(ieee80211_queue_stopped); 629 630 void ieee80211_wake_queues_by_reason(struct ieee80211_hw *hw, 631 unsigned long queues, 632 enum queue_stop_reason reason, 633 bool refcounted) 634 { 635 struct ieee80211_local *local = hw_to_local(hw); 636 unsigned long flags; 637 int i; 638 639 spin_lock_irqsave(&local->queue_stop_reason_lock, flags); 640 641 for_each_set_bit(i, &queues, hw->queues) 642 __ieee80211_wake_queue(hw, i, reason, refcounted, &flags); 643 644 spin_unlock_irqrestore(&local->queue_stop_reason_lock, flags); 645 } 646 647 void ieee80211_wake_queues(struct ieee80211_hw *hw) 648 { 649 ieee80211_wake_queues_by_reason(hw, IEEE80211_MAX_QUEUE_MAP, 650 IEEE80211_QUEUE_STOP_REASON_DRIVER, 651 false); 652 } 653 EXPORT_SYMBOL(ieee80211_wake_queues); 654 655 static unsigned int 656 ieee80211_get_vif_queues(struct ieee80211_local *local, 657 struct ieee80211_sub_if_data *sdata) 658 { 659 unsigned int queues; 660 661 if (sdata && ieee80211_hw_check(&local->hw, QUEUE_CONTROL)) { 662 int ac; 663 664 queues = 0; 665 666 for (ac = 0; ac < IEEE80211_NUM_ACS; ac++) 667 queues |= BIT(sdata->vif.hw_queue[ac]); 668 if (sdata->vif.cab_queue != IEEE80211_INVAL_HW_QUEUE) 669 queues |= BIT(sdata->vif.cab_queue); 670 } else { 671 /* all queues */ 672 queues = BIT(local->hw.queues) - 1; 673 } 674 675 return queues; 676 } 677 678 void __ieee80211_flush_queues(struct ieee80211_local *local, 679 struct ieee80211_sub_if_data *sdata, 680 unsigned int queues, bool drop) 681 { 682 if (!local->ops->flush) 683 return; 684 685 /* 686 * If no queue was set, or if the HW doesn't support 687 * IEEE80211_HW_QUEUE_CONTROL - flush all queues 688 */ 689 if (!queues || !ieee80211_hw_check(&local->hw, QUEUE_CONTROL)) 690 queues = ieee80211_get_vif_queues(local, sdata); 691 692 ieee80211_stop_queues_by_reason(&local->hw, queues, 693 IEEE80211_QUEUE_STOP_REASON_FLUSH, 694 false); 695 696 if (drop) { 697 struct sta_info *sta; 698 699 /* Purge the queues, so the frames on them won't be 700 * sent during __ieee80211_wake_queue() 701 */ 702 list_for_each_entry(sta, &local->sta_list, list) { 703 if (sdata != sta->sdata) 704 continue; 705 ieee80211_purge_sta_txqs(sta); 706 } 707 } 708 709 drv_flush(local, sdata, queues, drop); 710 711 ieee80211_wake_queues_by_reason(&local->hw, queues, 712 IEEE80211_QUEUE_STOP_REASON_FLUSH, 713 false); 714 } 715 716 void ieee80211_flush_queues(struct ieee80211_local *local, 717 struct ieee80211_sub_if_data *sdata, bool drop) 718 { 719 __ieee80211_flush_queues(local, sdata, 0, drop); 720 } 721 722 void ieee80211_stop_vif_queues(struct ieee80211_local *local, 723 struct ieee80211_sub_if_data *sdata, 724 enum queue_stop_reason reason) 725 { 726 ieee80211_stop_queues_by_reason(&local->hw, 727 ieee80211_get_vif_queues(local, sdata), 728 reason, true); 729 } 730 731 void ieee80211_wake_vif_queues(struct ieee80211_local *local, 732 struct ieee80211_sub_if_data *sdata, 733 enum queue_stop_reason reason) 734 { 735 ieee80211_wake_queues_by_reason(&local->hw, 736 ieee80211_get_vif_queues(local, sdata), 737 reason, true); 738 } 739 740 static void __iterate_interfaces(struct ieee80211_local *local, 741 u32 iter_flags, 742 void (*iterator)(void *data, u8 *mac, 743 struct ieee80211_vif *vif), 744 void *data) 745 { 746 struct ieee80211_sub_if_data *sdata; 747 bool active_only = iter_flags & IEEE80211_IFACE_ITER_ACTIVE; 748 749 list_for_each_entry_rcu(sdata, &local->interfaces, list) { 750 switch (sdata->vif.type) { 751 case NL80211_IFTYPE_MONITOR: 752 if (!(sdata->u.mntr.flags & MONITOR_FLAG_ACTIVE)) 753 continue; 754 break; 755 case NL80211_IFTYPE_AP_VLAN: 756 continue; 757 default: 758 break; 759 } 760 if (!(iter_flags & IEEE80211_IFACE_ITER_RESUME_ALL) && 761 active_only && !(sdata->flags & IEEE80211_SDATA_IN_DRIVER)) 762 continue; 763 if ((iter_flags & IEEE80211_IFACE_SKIP_SDATA_NOT_IN_DRIVER) && 764 !(sdata->flags & IEEE80211_SDATA_IN_DRIVER)) 765 continue; 766 if (ieee80211_sdata_running(sdata) || !active_only) 767 iterator(data, sdata->vif.addr, 768 &sdata->vif); 769 } 770 771 sdata = rcu_dereference_check(local->monitor_sdata, 772 lockdep_is_held(&local->iflist_mtx) || 773 lockdep_is_held(&local->hw.wiphy->mtx)); 774 if (sdata && 775 (iter_flags & IEEE80211_IFACE_ITER_RESUME_ALL || !active_only || 776 sdata->flags & IEEE80211_SDATA_IN_DRIVER)) 777 iterator(data, sdata->vif.addr, &sdata->vif); 778 } 779 780 void ieee80211_iterate_interfaces( 781 struct ieee80211_hw *hw, u32 iter_flags, 782 void (*iterator)(void *data, u8 *mac, 783 struct ieee80211_vif *vif), 784 void *data) 785 { 786 struct ieee80211_local *local = hw_to_local(hw); 787 788 mutex_lock(&local->iflist_mtx); 789 __iterate_interfaces(local, iter_flags, iterator, data); 790 mutex_unlock(&local->iflist_mtx); 791 } 792 EXPORT_SYMBOL_GPL(ieee80211_iterate_interfaces); 793 794 void ieee80211_iterate_active_interfaces_atomic( 795 struct ieee80211_hw *hw, u32 iter_flags, 796 void (*iterator)(void *data, u8 *mac, 797 struct ieee80211_vif *vif), 798 void *data) 799 { 800 struct ieee80211_local *local = hw_to_local(hw); 801 802 rcu_read_lock(); 803 __iterate_interfaces(local, iter_flags | IEEE80211_IFACE_ITER_ACTIVE, 804 iterator, data); 805 rcu_read_unlock(); 806 } 807 EXPORT_SYMBOL_GPL(ieee80211_iterate_active_interfaces_atomic); 808 809 void ieee80211_iterate_active_interfaces_mtx( 810 struct ieee80211_hw *hw, u32 iter_flags, 811 void (*iterator)(void *data, u8 *mac, 812 struct ieee80211_vif *vif), 813 void *data) 814 { 815 struct ieee80211_local *local = hw_to_local(hw); 816 817 lockdep_assert_wiphy(hw->wiphy); 818 819 __iterate_interfaces(local, iter_flags | IEEE80211_IFACE_ITER_ACTIVE, 820 iterator, data); 821 } 822 EXPORT_SYMBOL_GPL(ieee80211_iterate_active_interfaces_mtx); 823 824 static void __iterate_stations(struct ieee80211_local *local, 825 void (*iterator)(void *data, 826 struct ieee80211_sta *sta), 827 void *data) 828 { 829 struct sta_info *sta; 830 831 list_for_each_entry_rcu(sta, &local->sta_list, list) { 832 if (!sta->uploaded) 833 continue; 834 835 iterator(data, &sta->sta); 836 } 837 } 838 839 void ieee80211_iterate_stations_atomic(struct ieee80211_hw *hw, 840 void (*iterator)(void *data, 841 struct ieee80211_sta *sta), 842 void *data) 843 { 844 struct ieee80211_local *local = hw_to_local(hw); 845 846 rcu_read_lock(); 847 __iterate_stations(local, iterator, data); 848 rcu_read_unlock(); 849 } 850 EXPORT_SYMBOL_GPL(ieee80211_iterate_stations_atomic); 851 852 struct ieee80211_vif *wdev_to_ieee80211_vif(struct wireless_dev *wdev) 853 { 854 struct ieee80211_sub_if_data *sdata = IEEE80211_WDEV_TO_SUB_IF(wdev); 855 856 if (!ieee80211_sdata_running(sdata) || 857 !(sdata->flags & IEEE80211_SDATA_IN_DRIVER)) 858 return NULL; 859 return &sdata->vif; 860 } 861 EXPORT_SYMBOL_GPL(wdev_to_ieee80211_vif); 862 863 struct wireless_dev *ieee80211_vif_to_wdev(struct ieee80211_vif *vif) 864 { 865 if (!vif) 866 return NULL; 867 868 return &vif_to_sdata(vif)->wdev; 869 } 870 EXPORT_SYMBOL_GPL(ieee80211_vif_to_wdev); 871 872 /* 873 * Nothing should have been stuffed into the workqueue during 874 * the suspend->resume cycle. Since we can't check each caller 875 * of this function if we are already quiescing / suspended, 876 * check here and don't WARN since this can actually happen when 877 * the rx path (for example) is racing against __ieee80211_suspend 878 * and suspending / quiescing was set after the rx path checked 879 * them. 880 */ 881 static bool ieee80211_can_queue_work(struct ieee80211_local *local) 882 { 883 if (local->quiescing || (local->suspended && !local->resuming)) { 884 pr_warn("queueing ieee80211 work while going to suspend\n"); 885 return false; 886 } 887 888 return true; 889 } 890 891 void ieee80211_queue_work(struct ieee80211_hw *hw, struct work_struct *work) 892 { 893 struct ieee80211_local *local = hw_to_local(hw); 894 895 if (!ieee80211_can_queue_work(local)) 896 return; 897 898 queue_work(local->workqueue, work); 899 } 900 EXPORT_SYMBOL(ieee80211_queue_work); 901 902 void ieee80211_queue_delayed_work(struct ieee80211_hw *hw, 903 struct delayed_work *dwork, 904 unsigned long delay) 905 { 906 struct ieee80211_local *local = hw_to_local(hw); 907 908 if (!ieee80211_can_queue_work(local)) 909 return; 910 911 queue_delayed_work(local->workqueue, dwork, delay); 912 } 913 EXPORT_SYMBOL(ieee80211_queue_delayed_work); 914 915 static void 916 ieee80211_parse_extension_element(u32 *crc, 917 const struct element *elem, 918 struct ieee802_11_elems *elems, 919 struct ieee80211_elems_parse_params *params) 920 { 921 const void *data = elem->data + 1; 922 bool calc_crc = false; 923 u8 len; 924 925 if (!elem->datalen) 926 return; 927 928 len = elem->datalen - 1; 929 930 switch (elem->data[0]) { 931 case WLAN_EID_EXT_HE_MU_EDCA: 932 calc_crc = true; 933 if (len >= sizeof(*elems->mu_edca_param_set)) 934 elems->mu_edca_param_set = data; 935 break; 936 case WLAN_EID_EXT_HE_CAPABILITY: 937 if (ieee80211_he_capa_size_ok(data, len)) { 938 elems->he_cap = data; 939 elems->he_cap_len = len; 940 } 941 break; 942 case WLAN_EID_EXT_HE_OPERATION: 943 calc_crc = true; 944 if (len >= sizeof(*elems->he_operation) && 945 len >= ieee80211_he_oper_size(data) - 1) 946 elems->he_operation = data; 947 break; 948 case WLAN_EID_EXT_UORA: 949 if (len >= 1) 950 elems->uora_element = data; 951 break; 952 case WLAN_EID_EXT_MAX_CHANNEL_SWITCH_TIME: 953 if (len == 3) 954 elems->max_channel_switch_time = data; 955 break; 956 case WLAN_EID_EXT_MULTIPLE_BSSID_CONFIGURATION: 957 if (len >= sizeof(*elems->mbssid_config_ie)) 958 elems->mbssid_config_ie = data; 959 break; 960 case WLAN_EID_EXT_HE_SPR: 961 if (len >= sizeof(*elems->he_spr) && 962 len >= ieee80211_he_spr_size(data)) 963 elems->he_spr = data; 964 break; 965 case WLAN_EID_EXT_HE_6GHZ_CAPA: 966 if (len >= sizeof(*elems->he_6ghz_capa)) 967 elems->he_6ghz_capa = data; 968 break; 969 case WLAN_EID_EXT_EHT_CAPABILITY: 970 if (ieee80211_eht_capa_size_ok(elems->he_cap, 971 data, len, 972 params->from_ap)) { 973 elems->eht_cap = data; 974 elems->eht_cap_len = len; 975 } 976 break; 977 case WLAN_EID_EXT_EHT_OPERATION: 978 if (ieee80211_eht_oper_size_ok(data, len)) 979 elems->eht_operation = data; 980 calc_crc = true; 981 break; 982 case WLAN_EID_EXT_EHT_MULTI_LINK: 983 calc_crc = true; 984 985 if (ieee80211_mle_size_ok(data, len)) { 986 const struct ieee80211_multi_link_elem *mle = 987 (void *)data; 988 989 switch (le16_get_bits(mle->control, 990 IEEE80211_ML_CONTROL_TYPE)) { 991 case IEEE80211_ML_CONTROL_TYPE_BASIC: 992 elems->ml_basic_elem = (void *)elem; 993 elems->ml_basic = data; 994 elems->ml_basic_len = len; 995 break; 996 case IEEE80211_ML_CONTROL_TYPE_RECONF: 997 elems->ml_reconf_elem = (void *)elem; 998 elems->ml_reconf = data; 999 elems->ml_reconf_len = len; 1000 break; 1001 default: 1002 break; 1003 } 1004 } 1005 break; 1006 case WLAN_EID_EXT_BANDWIDTH_INDICATION: 1007 if (ieee80211_bandwidth_indication_size_ok(data, len)) 1008 elems->bandwidth_indication = data; 1009 calc_crc = true; 1010 break; 1011 case WLAN_EID_EXT_TID_TO_LINK_MAPPING: 1012 calc_crc = true; 1013 if (ieee80211_tid_to_link_map_size_ok(data, len) && 1014 elems->ttlm_num < ARRAY_SIZE(elems->ttlm)) { 1015 elems->ttlm[elems->ttlm_num] = (void *)data; 1016 elems->ttlm_num++; 1017 } 1018 break; 1019 } 1020 1021 if (crc && calc_crc) 1022 *crc = crc32_be(*crc, (void *)elem, elem->datalen + 2); 1023 } 1024 1025 static u32 1026 _ieee802_11_parse_elems_full(struct ieee80211_elems_parse_params *params, 1027 struct ieee802_11_elems *elems, 1028 const struct element *check_inherit) 1029 { 1030 const struct element *elem; 1031 bool calc_crc = params->filter != 0; 1032 DECLARE_BITMAP(seen_elems, 256); 1033 u32 crc = params->crc; 1034 1035 bitmap_zero(seen_elems, 256); 1036 1037 for_each_element(elem, params->start, params->len) { 1038 const struct element *subelem; 1039 bool elem_parse_failed; 1040 u8 id = elem->id; 1041 u8 elen = elem->datalen; 1042 const u8 *pos = elem->data; 1043 1044 if (check_inherit && 1045 !cfg80211_is_element_inherited(elem, 1046 check_inherit)) 1047 continue; 1048 1049 switch (id) { 1050 case WLAN_EID_SSID: 1051 case WLAN_EID_SUPP_RATES: 1052 case WLAN_EID_FH_PARAMS: 1053 case WLAN_EID_DS_PARAMS: 1054 case WLAN_EID_CF_PARAMS: 1055 case WLAN_EID_TIM: 1056 case WLAN_EID_IBSS_PARAMS: 1057 case WLAN_EID_CHALLENGE: 1058 case WLAN_EID_RSN: 1059 case WLAN_EID_ERP_INFO: 1060 case WLAN_EID_EXT_SUPP_RATES: 1061 case WLAN_EID_HT_CAPABILITY: 1062 case WLAN_EID_HT_OPERATION: 1063 case WLAN_EID_VHT_CAPABILITY: 1064 case WLAN_EID_VHT_OPERATION: 1065 case WLAN_EID_MESH_ID: 1066 case WLAN_EID_MESH_CONFIG: 1067 case WLAN_EID_PEER_MGMT: 1068 case WLAN_EID_PREQ: 1069 case WLAN_EID_PREP: 1070 case WLAN_EID_PERR: 1071 case WLAN_EID_RANN: 1072 case WLAN_EID_CHANNEL_SWITCH: 1073 case WLAN_EID_EXT_CHANSWITCH_ANN: 1074 case WLAN_EID_COUNTRY: 1075 case WLAN_EID_PWR_CONSTRAINT: 1076 case WLAN_EID_TIMEOUT_INTERVAL: 1077 case WLAN_EID_SECONDARY_CHANNEL_OFFSET: 1078 case WLAN_EID_WIDE_BW_CHANNEL_SWITCH: 1079 case WLAN_EID_CHAN_SWITCH_PARAM: 1080 case WLAN_EID_EXT_CAPABILITY: 1081 case WLAN_EID_CHAN_SWITCH_TIMING: 1082 case WLAN_EID_LINK_ID: 1083 case WLAN_EID_BSS_MAX_IDLE_PERIOD: 1084 case WLAN_EID_RSNX: 1085 case WLAN_EID_S1G_BCN_COMPAT: 1086 case WLAN_EID_S1G_CAPABILITIES: 1087 case WLAN_EID_S1G_OPERATION: 1088 case WLAN_EID_AID_RESPONSE: 1089 case WLAN_EID_S1G_SHORT_BCN_INTERVAL: 1090 /* 1091 * not listing WLAN_EID_CHANNEL_SWITCH_WRAPPER -- it seems possible 1092 * that if the content gets bigger it might be needed more than once 1093 */ 1094 if (test_bit(id, seen_elems)) { 1095 elems->parse_error = true; 1096 continue; 1097 } 1098 break; 1099 } 1100 1101 if (calc_crc && id < 64 && (params->filter & (1ULL << id))) 1102 crc = crc32_be(crc, pos - 2, elen + 2); 1103 1104 elem_parse_failed = false; 1105 1106 switch (id) { 1107 case WLAN_EID_LINK_ID: 1108 if (elen + 2 < sizeof(struct ieee80211_tdls_lnkie)) { 1109 elem_parse_failed = true; 1110 break; 1111 } 1112 elems->lnk_id = (void *)(pos - 2); 1113 break; 1114 case WLAN_EID_CHAN_SWITCH_TIMING: 1115 if (elen < sizeof(struct ieee80211_ch_switch_timing)) { 1116 elem_parse_failed = true; 1117 break; 1118 } 1119 elems->ch_sw_timing = (void *)pos; 1120 break; 1121 case WLAN_EID_EXT_CAPABILITY: 1122 elems->ext_capab = pos; 1123 elems->ext_capab_len = elen; 1124 break; 1125 case WLAN_EID_SSID: 1126 elems->ssid = pos; 1127 elems->ssid_len = elen; 1128 break; 1129 case WLAN_EID_SUPP_RATES: 1130 elems->supp_rates = pos; 1131 elems->supp_rates_len = elen; 1132 break; 1133 case WLAN_EID_DS_PARAMS: 1134 if (elen >= 1) 1135 elems->ds_params = pos; 1136 else 1137 elem_parse_failed = true; 1138 break; 1139 case WLAN_EID_TIM: 1140 if (elen >= sizeof(struct ieee80211_tim_ie)) { 1141 elems->tim = (void *)pos; 1142 elems->tim_len = elen; 1143 } else 1144 elem_parse_failed = true; 1145 break; 1146 case WLAN_EID_VENDOR_SPECIFIC: 1147 if (elen >= 4 && pos[0] == 0x00 && pos[1] == 0x50 && 1148 pos[2] == 0xf2) { 1149 /* Microsoft OUI (00:50:F2) */ 1150 1151 if (calc_crc) 1152 crc = crc32_be(crc, pos - 2, elen + 2); 1153 1154 if (elen >= 5 && pos[3] == 2) { 1155 /* OUI Type 2 - WMM IE */ 1156 if (pos[4] == 0) { 1157 elems->wmm_info = pos; 1158 elems->wmm_info_len = elen; 1159 } else if (pos[4] == 1) { 1160 elems->wmm_param = pos; 1161 elems->wmm_param_len = elen; 1162 } 1163 } 1164 } 1165 break; 1166 case WLAN_EID_RSN: 1167 elems->rsn = pos; 1168 elems->rsn_len = elen; 1169 break; 1170 case WLAN_EID_ERP_INFO: 1171 if (elen >= 1) 1172 elems->erp_info = pos; 1173 else 1174 elem_parse_failed = true; 1175 break; 1176 case WLAN_EID_EXT_SUPP_RATES: 1177 elems->ext_supp_rates = pos; 1178 elems->ext_supp_rates_len = elen; 1179 break; 1180 case WLAN_EID_HT_CAPABILITY: 1181 if (elen >= sizeof(struct ieee80211_ht_cap)) 1182 elems->ht_cap_elem = (void *)pos; 1183 else 1184 elem_parse_failed = true; 1185 break; 1186 case WLAN_EID_HT_OPERATION: 1187 if (elen >= sizeof(struct ieee80211_ht_operation)) 1188 elems->ht_operation = (void *)pos; 1189 else 1190 elem_parse_failed = true; 1191 break; 1192 case WLAN_EID_VHT_CAPABILITY: 1193 if (elen >= sizeof(struct ieee80211_vht_cap)) 1194 elems->vht_cap_elem = (void *)pos; 1195 else 1196 elem_parse_failed = true; 1197 break; 1198 case WLAN_EID_VHT_OPERATION: 1199 if (elen >= sizeof(struct ieee80211_vht_operation)) { 1200 elems->vht_operation = (void *)pos; 1201 if (calc_crc) 1202 crc = crc32_be(crc, pos - 2, elen + 2); 1203 break; 1204 } 1205 elem_parse_failed = true; 1206 break; 1207 case WLAN_EID_OPMODE_NOTIF: 1208 if (elen > 0) { 1209 elems->opmode_notif = pos; 1210 if (calc_crc) 1211 crc = crc32_be(crc, pos - 2, elen + 2); 1212 break; 1213 } 1214 elem_parse_failed = true; 1215 break; 1216 case WLAN_EID_MESH_ID: 1217 elems->mesh_id = pos; 1218 elems->mesh_id_len = elen; 1219 break; 1220 case WLAN_EID_MESH_CONFIG: 1221 if (elen >= sizeof(struct ieee80211_meshconf_ie)) 1222 elems->mesh_config = (void *)pos; 1223 else 1224 elem_parse_failed = true; 1225 break; 1226 case WLAN_EID_PEER_MGMT: 1227 elems->peering = pos; 1228 elems->peering_len = elen; 1229 break; 1230 case WLAN_EID_MESH_AWAKE_WINDOW: 1231 if (elen >= 2) 1232 elems->awake_window = (void *)pos; 1233 break; 1234 case WLAN_EID_PREQ: 1235 elems->preq = pos; 1236 elems->preq_len = elen; 1237 break; 1238 case WLAN_EID_PREP: 1239 elems->prep = pos; 1240 elems->prep_len = elen; 1241 break; 1242 case WLAN_EID_PERR: 1243 elems->perr = pos; 1244 elems->perr_len = elen; 1245 break; 1246 case WLAN_EID_RANN: 1247 if (elen >= sizeof(struct ieee80211_rann_ie)) 1248 elems->rann = (void *)pos; 1249 else 1250 elem_parse_failed = true; 1251 break; 1252 case WLAN_EID_CHANNEL_SWITCH: 1253 if (elen != sizeof(struct ieee80211_channel_sw_ie)) { 1254 elem_parse_failed = true; 1255 break; 1256 } 1257 elems->ch_switch_ie = (void *)pos; 1258 break; 1259 case WLAN_EID_EXT_CHANSWITCH_ANN: 1260 if (elen != sizeof(struct ieee80211_ext_chansw_ie)) { 1261 elem_parse_failed = true; 1262 break; 1263 } 1264 elems->ext_chansw_ie = (void *)pos; 1265 break; 1266 case WLAN_EID_SECONDARY_CHANNEL_OFFSET: 1267 if (elen != sizeof(struct ieee80211_sec_chan_offs_ie)) { 1268 elem_parse_failed = true; 1269 break; 1270 } 1271 elems->sec_chan_offs = (void *)pos; 1272 break; 1273 case WLAN_EID_CHAN_SWITCH_PARAM: 1274 if (elen < 1275 sizeof(*elems->mesh_chansw_params_ie)) { 1276 elem_parse_failed = true; 1277 break; 1278 } 1279 elems->mesh_chansw_params_ie = (void *)pos; 1280 break; 1281 case WLAN_EID_WIDE_BW_CHANNEL_SWITCH: 1282 if (!params->action || 1283 elen < sizeof(*elems->wide_bw_chansw_ie)) { 1284 elem_parse_failed = true; 1285 break; 1286 } 1287 elems->wide_bw_chansw_ie = (void *)pos; 1288 break; 1289 case WLAN_EID_CHANNEL_SWITCH_WRAPPER: 1290 if (params->action) { 1291 elem_parse_failed = true; 1292 break; 1293 } 1294 /* 1295 * This is a bit tricky, but as we only care about 1296 * a few elements, parse them out manually. 1297 */ 1298 subelem = cfg80211_find_elem(WLAN_EID_WIDE_BW_CHANNEL_SWITCH, 1299 pos, elen); 1300 if (subelem) { 1301 if (subelem->datalen >= sizeof(*elems->wide_bw_chansw_ie)) 1302 elems->wide_bw_chansw_ie = 1303 (void *)subelem->data; 1304 else 1305 elem_parse_failed = true; 1306 } 1307 1308 subelem = cfg80211_find_ext_elem(WLAN_EID_EXT_BANDWIDTH_INDICATION, 1309 pos, elen); 1310 if (subelem) { 1311 const void *edata = subelem->data + 1; 1312 u8 edatalen = subelem->datalen - 1; 1313 1314 if (ieee80211_bandwidth_indication_size_ok(edata, 1315 edatalen)) 1316 elems->bandwidth_indication = edata; 1317 else 1318 elem_parse_failed = true; 1319 } 1320 break; 1321 case WLAN_EID_COUNTRY: 1322 elems->country_elem = pos; 1323 elems->country_elem_len = elen; 1324 break; 1325 case WLAN_EID_PWR_CONSTRAINT: 1326 if (elen != 1) { 1327 elem_parse_failed = true; 1328 break; 1329 } 1330 elems->pwr_constr_elem = pos; 1331 break; 1332 case WLAN_EID_CISCO_VENDOR_SPECIFIC: 1333 /* Lots of different options exist, but we only care 1334 * about the Dynamic Transmit Power Control element. 1335 * First check for the Cisco OUI, then for the DTPC 1336 * tag (0x00). 1337 */ 1338 if (elen < 4) { 1339 elem_parse_failed = true; 1340 break; 1341 } 1342 1343 if (pos[0] != 0x00 || pos[1] != 0x40 || 1344 pos[2] != 0x96 || pos[3] != 0x00) 1345 break; 1346 1347 if (elen != 6) { 1348 elem_parse_failed = true; 1349 break; 1350 } 1351 1352 if (calc_crc) 1353 crc = crc32_be(crc, pos - 2, elen + 2); 1354 1355 elems->cisco_dtpc_elem = pos; 1356 break; 1357 case WLAN_EID_ADDBA_EXT: 1358 if (elen < sizeof(struct ieee80211_addba_ext_ie)) { 1359 elem_parse_failed = true; 1360 break; 1361 } 1362 elems->addba_ext_ie = (void *)pos; 1363 break; 1364 case WLAN_EID_TIMEOUT_INTERVAL: 1365 if (elen >= sizeof(struct ieee80211_timeout_interval_ie)) 1366 elems->timeout_int = (void *)pos; 1367 else 1368 elem_parse_failed = true; 1369 break; 1370 case WLAN_EID_BSS_MAX_IDLE_PERIOD: 1371 if (elen >= sizeof(*elems->max_idle_period_ie)) 1372 elems->max_idle_period_ie = (void *)pos; 1373 break; 1374 case WLAN_EID_RSNX: 1375 elems->rsnx = pos; 1376 elems->rsnx_len = elen; 1377 break; 1378 case WLAN_EID_TX_POWER_ENVELOPE: 1379 if (elen < 1 || 1380 elen > sizeof(struct ieee80211_tx_pwr_env)) 1381 break; 1382 1383 if (elems->tx_pwr_env_num >= ARRAY_SIZE(elems->tx_pwr_env)) 1384 break; 1385 1386 elems->tx_pwr_env[elems->tx_pwr_env_num] = (void *)pos; 1387 elems->tx_pwr_env_len[elems->tx_pwr_env_num] = elen; 1388 elems->tx_pwr_env_num++; 1389 break; 1390 case WLAN_EID_EXTENSION: 1391 ieee80211_parse_extension_element(calc_crc ? 1392 &crc : NULL, 1393 elem, elems, params); 1394 break; 1395 case WLAN_EID_S1G_CAPABILITIES: 1396 if (elen >= sizeof(*elems->s1g_capab)) 1397 elems->s1g_capab = (void *)pos; 1398 else 1399 elem_parse_failed = true; 1400 break; 1401 case WLAN_EID_S1G_OPERATION: 1402 if (elen == sizeof(*elems->s1g_oper)) 1403 elems->s1g_oper = (void *)pos; 1404 else 1405 elem_parse_failed = true; 1406 break; 1407 case WLAN_EID_S1G_BCN_COMPAT: 1408 if (elen == sizeof(*elems->s1g_bcn_compat)) 1409 elems->s1g_bcn_compat = (void *)pos; 1410 else 1411 elem_parse_failed = true; 1412 break; 1413 case WLAN_EID_AID_RESPONSE: 1414 if (elen == sizeof(struct ieee80211_aid_response_ie)) 1415 elems->aid_resp = (void *)pos; 1416 else 1417 elem_parse_failed = true; 1418 break; 1419 default: 1420 break; 1421 } 1422 1423 if (elem_parse_failed) 1424 elems->parse_error = true; 1425 else 1426 __set_bit(id, seen_elems); 1427 } 1428 1429 if (!for_each_element_completed(elem, params->start, params->len)) 1430 elems->parse_error = true; 1431 1432 return crc; 1433 } 1434 1435 static size_t ieee802_11_find_bssid_profile(const u8 *start, size_t len, 1436 struct ieee802_11_elems *elems, 1437 struct cfg80211_bss *bss, 1438 u8 *nontransmitted_profile) 1439 { 1440 const struct element *elem, *sub; 1441 size_t profile_len = 0; 1442 bool found = false; 1443 1444 if (!bss || !bss->transmitted_bss) 1445 return profile_len; 1446 1447 for_each_element_id(elem, WLAN_EID_MULTIPLE_BSSID, start, len) { 1448 if (elem->datalen < 2) 1449 continue; 1450 if (elem->data[0] < 1 || elem->data[0] > 8) 1451 continue; 1452 1453 for_each_element(sub, elem->data + 1, elem->datalen - 1) { 1454 u8 new_bssid[ETH_ALEN]; 1455 const u8 *index; 1456 1457 if (sub->id != 0 || sub->datalen < 4) { 1458 /* not a valid BSS profile */ 1459 continue; 1460 } 1461 1462 if (sub->data[0] != WLAN_EID_NON_TX_BSSID_CAP || 1463 sub->data[1] != 2) { 1464 /* The first element of the 1465 * Nontransmitted BSSID Profile is not 1466 * the Nontransmitted BSSID Capability 1467 * element. 1468 */ 1469 continue; 1470 } 1471 1472 memset(nontransmitted_profile, 0, len); 1473 profile_len = cfg80211_merge_profile(start, len, 1474 elem, 1475 sub, 1476 nontransmitted_profile, 1477 len); 1478 1479 /* found a Nontransmitted BSSID Profile */ 1480 index = cfg80211_find_ie(WLAN_EID_MULTI_BSSID_IDX, 1481 nontransmitted_profile, 1482 profile_len); 1483 if (!index || index[1] < 1 || index[2] == 0) { 1484 /* Invalid MBSSID Index element */ 1485 continue; 1486 } 1487 1488 cfg80211_gen_new_bssid(bss->transmitted_bss->bssid, 1489 elem->data[0], 1490 index[2], 1491 new_bssid); 1492 if (ether_addr_equal(new_bssid, bss->bssid)) { 1493 found = true; 1494 elems->bssid_index_len = index[1]; 1495 elems->bssid_index = (void *)&index[2]; 1496 break; 1497 } 1498 } 1499 } 1500 1501 return found ? profile_len : 0; 1502 } 1503 1504 static void ieee80211_mle_get_sta_prof(struct ieee802_11_elems *elems, 1505 u8 link_id) 1506 { 1507 const struct ieee80211_multi_link_elem *ml = elems->ml_basic; 1508 ssize_t ml_len = elems->ml_basic_len; 1509 const struct element *sub; 1510 1511 if (!ml || !ml_len) 1512 return; 1513 1514 if (le16_get_bits(ml->control, IEEE80211_ML_CONTROL_TYPE) != 1515 IEEE80211_ML_CONTROL_TYPE_BASIC) 1516 return; 1517 1518 for_each_mle_subelement(sub, (u8 *)ml, ml_len) { 1519 struct ieee80211_mle_per_sta_profile *prof = (void *)sub->data; 1520 ssize_t sta_prof_len; 1521 u16 control; 1522 1523 if (sub->id != IEEE80211_MLE_SUBELEM_PER_STA_PROFILE) 1524 continue; 1525 1526 if (!ieee80211_mle_basic_sta_prof_size_ok(sub->data, 1527 sub->datalen)) 1528 return; 1529 1530 control = le16_to_cpu(prof->control); 1531 1532 if (link_id != u16_get_bits(control, 1533 IEEE80211_MLE_STA_CONTROL_LINK_ID)) 1534 continue; 1535 1536 if (!(control & IEEE80211_MLE_STA_CONTROL_COMPLETE_PROFILE)) 1537 return; 1538 1539 /* the sub element can be fragmented */ 1540 sta_prof_len = 1541 cfg80211_defragment_element(sub, 1542 (u8 *)ml, ml_len, 1543 elems->scratch_pos, 1544 elems->scratch + 1545 elems->scratch_len - 1546 elems->scratch_pos, 1547 IEEE80211_MLE_SUBELEM_FRAGMENT); 1548 1549 if (sta_prof_len < 0) 1550 return; 1551 1552 elems->prof = (void *)elems->scratch_pos; 1553 elems->sta_prof_len = sta_prof_len; 1554 elems->scratch_pos += sta_prof_len; 1555 1556 return; 1557 } 1558 } 1559 1560 static void ieee80211_mle_parse_link(struct ieee802_11_elems *elems, 1561 struct ieee80211_elems_parse_params *params) 1562 { 1563 struct ieee80211_mle_per_sta_profile *prof; 1564 struct ieee80211_elems_parse_params sub = { 1565 .action = params->action, 1566 .from_ap = params->from_ap, 1567 .link_id = -1, 1568 }; 1569 ssize_t ml_len = elems->ml_basic_len; 1570 const struct element *non_inherit = NULL; 1571 const u8 *end; 1572 1573 if (params->link_id == -1) 1574 return; 1575 1576 ml_len = cfg80211_defragment_element(elems->ml_basic_elem, 1577 elems->ie_start, 1578 elems->total_len, 1579 elems->scratch_pos, 1580 elems->scratch + 1581 elems->scratch_len - 1582 elems->scratch_pos, 1583 WLAN_EID_FRAGMENT); 1584 1585 if (ml_len < 0) 1586 return; 1587 1588 elems->ml_basic = (const void *)elems->scratch_pos; 1589 elems->ml_basic_len = ml_len; 1590 1591 ieee80211_mle_get_sta_prof(elems, params->link_id); 1592 prof = elems->prof; 1593 1594 if (!prof) 1595 return; 1596 1597 /* check if we have the 4 bytes for the fixed part in assoc response */ 1598 if (elems->sta_prof_len < sizeof(*prof) + prof->sta_info_len - 1 + 4) { 1599 elems->prof = NULL; 1600 elems->sta_prof_len = 0; 1601 return; 1602 } 1603 1604 /* 1605 * Skip the capability information and the status code that are expected 1606 * as part of the station profile in association response frames. Note 1607 * the -1 is because the 'sta_info_len' is accounted to as part of the 1608 * per-STA profile, but not part of the 'u8 variable[]' portion. 1609 */ 1610 sub.start = prof->variable + prof->sta_info_len - 1 + 4; 1611 end = (const u8 *)prof + elems->sta_prof_len; 1612 sub.len = end - sub.start; 1613 1614 non_inherit = cfg80211_find_ext_elem(WLAN_EID_EXT_NON_INHERITANCE, 1615 sub.start, sub.len); 1616 _ieee802_11_parse_elems_full(&sub, elems, non_inherit); 1617 } 1618 1619 struct ieee802_11_elems * 1620 ieee802_11_parse_elems_full(struct ieee80211_elems_parse_params *params) 1621 { 1622 struct ieee802_11_elems *elems; 1623 const struct element *non_inherit = NULL; 1624 u8 *nontransmitted_profile; 1625 int nontransmitted_profile_len = 0; 1626 size_t scratch_len = 3 * params->len; 1627 1628 elems = kzalloc(struct_size(elems, scratch, scratch_len), GFP_ATOMIC); 1629 if (!elems) 1630 return NULL; 1631 elems->ie_start = params->start; 1632 elems->total_len = params->len; 1633 elems->scratch_len = scratch_len; 1634 elems->scratch_pos = elems->scratch; 1635 1636 nontransmitted_profile = elems->scratch_pos; 1637 nontransmitted_profile_len = 1638 ieee802_11_find_bssid_profile(params->start, params->len, 1639 elems, params->bss, 1640 nontransmitted_profile); 1641 elems->scratch_pos += nontransmitted_profile_len; 1642 elems->scratch_len -= nontransmitted_profile_len; 1643 non_inherit = cfg80211_find_ext_elem(WLAN_EID_EXT_NON_INHERITANCE, 1644 nontransmitted_profile, 1645 nontransmitted_profile_len); 1646 1647 elems->crc = _ieee802_11_parse_elems_full(params, elems, non_inherit); 1648 1649 /* Override with nontransmitted profile, if found */ 1650 if (nontransmitted_profile_len) { 1651 struct ieee80211_elems_parse_params sub = { 1652 .start = nontransmitted_profile, 1653 .len = nontransmitted_profile_len, 1654 .action = params->action, 1655 .link_id = params->link_id, 1656 }; 1657 1658 _ieee802_11_parse_elems_full(&sub, elems, NULL); 1659 } 1660 1661 ieee80211_mle_parse_link(elems, params); 1662 1663 if (elems->tim && !elems->parse_error) { 1664 const struct ieee80211_tim_ie *tim_ie = elems->tim; 1665 1666 elems->dtim_period = tim_ie->dtim_period; 1667 elems->dtim_count = tim_ie->dtim_count; 1668 } 1669 1670 /* Override DTIM period and count if needed */ 1671 if (elems->bssid_index && 1672 elems->bssid_index_len >= 1673 offsetofend(struct ieee80211_bssid_index, dtim_period)) 1674 elems->dtim_period = elems->bssid_index->dtim_period; 1675 1676 if (elems->bssid_index && 1677 elems->bssid_index_len >= 1678 offsetofend(struct ieee80211_bssid_index, dtim_count)) 1679 elems->dtim_count = elems->bssid_index->dtim_count; 1680 1681 return elems; 1682 } 1683 EXPORT_SYMBOL_IF_KUNIT(ieee802_11_parse_elems_full); 1684 1685 void ieee80211_regulatory_limit_wmm_params(struct ieee80211_sub_if_data *sdata, 1686 struct ieee80211_tx_queue_params 1687 *qparam, int ac) 1688 { 1689 struct ieee80211_chanctx_conf *chanctx_conf; 1690 const struct ieee80211_reg_rule *rrule; 1691 const struct ieee80211_wmm_ac *wmm_ac; 1692 u16 center_freq = 0; 1693 1694 if (sdata->vif.type != NL80211_IFTYPE_AP && 1695 sdata->vif.type != NL80211_IFTYPE_STATION) 1696 return; 1697 1698 rcu_read_lock(); 1699 chanctx_conf = rcu_dereference(sdata->vif.bss_conf.chanctx_conf); 1700 if (chanctx_conf) 1701 center_freq = chanctx_conf->def.chan->center_freq; 1702 1703 if (!center_freq) { 1704 rcu_read_unlock(); 1705 return; 1706 } 1707 1708 rrule = freq_reg_info(sdata->wdev.wiphy, MHZ_TO_KHZ(center_freq)); 1709 1710 if (IS_ERR_OR_NULL(rrule) || !rrule->has_wmm) { 1711 rcu_read_unlock(); 1712 return; 1713 } 1714 1715 if (sdata->vif.type == NL80211_IFTYPE_AP) 1716 wmm_ac = &rrule->wmm_rule.ap[ac]; 1717 else 1718 wmm_ac = &rrule->wmm_rule.client[ac]; 1719 qparam->cw_min = max_t(u16, qparam->cw_min, wmm_ac->cw_min); 1720 qparam->cw_max = max_t(u16, qparam->cw_max, wmm_ac->cw_max); 1721 qparam->aifs = max_t(u8, qparam->aifs, wmm_ac->aifsn); 1722 qparam->txop = min_t(u16, qparam->txop, wmm_ac->cot / 32); 1723 rcu_read_unlock(); 1724 } 1725 1726 void ieee80211_set_wmm_default(struct ieee80211_link_data *link, 1727 bool bss_notify, bool enable_qos) 1728 { 1729 struct ieee80211_sub_if_data *sdata = link->sdata; 1730 struct ieee80211_local *local = sdata->local; 1731 struct ieee80211_tx_queue_params qparam; 1732 struct ieee80211_chanctx_conf *chanctx_conf; 1733 int ac; 1734 bool use_11b; 1735 bool is_ocb; /* Use another EDCA parameters if dot11OCBActivated=true */ 1736 int aCWmin, aCWmax; 1737 1738 if (!local->ops->conf_tx) 1739 return; 1740 1741 if (local->hw.queues < IEEE80211_NUM_ACS) 1742 return; 1743 1744 memset(&qparam, 0, sizeof(qparam)); 1745 1746 rcu_read_lock(); 1747 chanctx_conf = rcu_dereference(link->conf->chanctx_conf); 1748 use_11b = (chanctx_conf && 1749 chanctx_conf->def.chan->band == NL80211_BAND_2GHZ) && 1750 !link->operating_11g_mode; 1751 rcu_read_unlock(); 1752 1753 is_ocb = (sdata->vif.type == NL80211_IFTYPE_OCB); 1754 1755 /* Set defaults according to 802.11-2007 Table 7-37 */ 1756 aCWmax = 1023; 1757 if (use_11b) 1758 aCWmin = 31; 1759 else 1760 aCWmin = 15; 1761 1762 /* Confiure old 802.11b/g medium access rules. */ 1763 qparam.cw_max = aCWmax; 1764 qparam.cw_min = aCWmin; 1765 qparam.txop = 0; 1766 qparam.aifs = 2; 1767 1768 for (ac = 0; ac < IEEE80211_NUM_ACS; ac++) { 1769 /* Update if QoS is enabled. */ 1770 if (enable_qos) { 1771 switch (ac) { 1772 case IEEE80211_AC_BK: 1773 qparam.cw_max = aCWmax; 1774 qparam.cw_min = aCWmin; 1775 qparam.txop = 0; 1776 if (is_ocb) 1777 qparam.aifs = 9; 1778 else 1779 qparam.aifs = 7; 1780 break; 1781 /* never happens but let's not leave undefined */ 1782 default: 1783 case IEEE80211_AC_BE: 1784 qparam.cw_max = aCWmax; 1785 qparam.cw_min = aCWmin; 1786 qparam.txop = 0; 1787 if (is_ocb) 1788 qparam.aifs = 6; 1789 else 1790 qparam.aifs = 3; 1791 break; 1792 case IEEE80211_AC_VI: 1793 qparam.cw_max = aCWmin; 1794 qparam.cw_min = (aCWmin + 1) / 2 - 1; 1795 if (is_ocb) 1796 qparam.txop = 0; 1797 else if (use_11b) 1798 qparam.txop = 6016/32; 1799 else 1800 qparam.txop = 3008/32; 1801 1802 if (is_ocb) 1803 qparam.aifs = 3; 1804 else 1805 qparam.aifs = 2; 1806 break; 1807 case IEEE80211_AC_VO: 1808 qparam.cw_max = (aCWmin + 1) / 2 - 1; 1809 qparam.cw_min = (aCWmin + 1) / 4 - 1; 1810 if (is_ocb) 1811 qparam.txop = 0; 1812 else if (use_11b) 1813 qparam.txop = 3264/32; 1814 else 1815 qparam.txop = 1504/32; 1816 qparam.aifs = 2; 1817 break; 1818 } 1819 } 1820 ieee80211_regulatory_limit_wmm_params(sdata, &qparam, ac); 1821 1822 qparam.uapsd = false; 1823 1824 link->tx_conf[ac] = qparam; 1825 drv_conf_tx(local, link, ac, &qparam); 1826 } 1827 1828 if (sdata->vif.type != NL80211_IFTYPE_MONITOR && 1829 sdata->vif.type != NL80211_IFTYPE_P2P_DEVICE && 1830 sdata->vif.type != NL80211_IFTYPE_NAN) { 1831 link->conf->qos = enable_qos; 1832 if (bss_notify) 1833 ieee80211_link_info_change_notify(sdata, link, 1834 BSS_CHANGED_QOS); 1835 } 1836 } 1837 1838 void ieee80211_send_auth(struct ieee80211_sub_if_data *sdata, 1839 u16 transaction, u16 auth_alg, u16 status, 1840 const u8 *extra, size_t extra_len, const u8 *da, 1841 const u8 *bssid, const u8 *key, u8 key_len, u8 key_idx, 1842 u32 tx_flags) 1843 { 1844 struct ieee80211_local *local = sdata->local; 1845 struct sk_buff *skb; 1846 struct ieee80211_mgmt *mgmt; 1847 bool multi_link = ieee80211_vif_is_mld(&sdata->vif); 1848 struct { 1849 u8 id; 1850 u8 len; 1851 u8 ext_id; 1852 struct ieee80211_multi_link_elem ml; 1853 struct ieee80211_mle_basic_common_info basic; 1854 } __packed mle = { 1855 .id = WLAN_EID_EXTENSION, 1856 .len = sizeof(mle) - 2, 1857 .ext_id = WLAN_EID_EXT_EHT_MULTI_LINK, 1858 .ml.control = cpu_to_le16(IEEE80211_ML_CONTROL_TYPE_BASIC), 1859 .basic.len = sizeof(mle.basic), 1860 }; 1861 int err; 1862 1863 memcpy(mle.basic.mld_mac_addr, sdata->vif.addr, ETH_ALEN); 1864 1865 /* 24 + 6 = header + auth_algo + auth_transaction + status_code */ 1866 skb = dev_alloc_skb(local->hw.extra_tx_headroom + IEEE80211_WEP_IV_LEN + 1867 24 + 6 + extra_len + IEEE80211_WEP_ICV_LEN + 1868 multi_link * sizeof(mle)); 1869 if (!skb) 1870 return; 1871 1872 skb_reserve(skb, local->hw.extra_tx_headroom + IEEE80211_WEP_IV_LEN); 1873 1874 mgmt = skb_put_zero(skb, 24 + 6); 1875 mgmt->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT | 1876 IEEE80211_STYPE_AUTH); 1877 memcpy(mgmt->da, da, ETH_ALEN); 1878 memcpy(mgmt->sa, sdata->vif.addr, ETH_ALEN); 1879 memcpy(mgmt->bssid, bssid, ETH_ALEN); 1880 mgmt->u.auth.auth_alg = cpu_to_le16(auth_alg); 1881 mgmt->u.auth.auth_transaction = cpu_to_le16(transaction); 1882 mgmt->u.auth.status_code = cpu_to_le16(status); 1883 if (extra) 1884 skb_put_data(skb, extra, extra_len); 1885 if (multi_link) 1886 skb_put_data(skb, &mle, sizeof(mle)); 1887 1888 if (auth_alg == WLAN_AUTH_SHARED_KEY && transaction == 3) { 1889 mgmt->frame_control |= cpu_to_le16(IEEE80211_FCTL_PROTECTED); 1890 err = ieee80211_wep_encrypt(local, skb, key, key_len, key_idx); 1891 if (WARN_ON(err)) { 1892 kfree_skb(skb); 1893 return; 1894 } 1895 } 1896 1897 IEEE80211_SKB_CB(skb)->flags |= IEEE80211_TX_INTFL_DONT_ENCRYPT | 1898 tx_flags; 1899 ieee80211_tx_skb(sdata, skb); 1900 } 1901 1902 void ieee80211_send_deauth_disassoc(struct ieee80211_sub_if_data *sdata, 1903 const u8 *da, const u8 *bssid, 1904 u16 stype, u16 reason, 1905 bool send_frame, u8 *frame_buf) 1906 { 1907 struct ieee80211_local *local = sdata->local; 1908 struct sk_buff *skb; 1909 struct ieee80211_mgmt *mgmt = (void *)frame_buf; 1910 1911 /* build frame */ 1912 mgmt->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT | stype); 1913 mgmt->duration = 0; /* initialize only */ 1914 mgmt->seq_ctrl = 0; /* initialize only */ 1915 memcpy(mgmt->da, da, ETH_ALEN); 1916 memcpy(mgmt->sa, sdata->vif.addr, ETH_ALEN); 1917 memcpy(mgmt->bssid, bssid, ETH_ALEN); 1918 /* u.deauth.reason_code == u.disassoc.reason_code */ 1919 mgmt->u.deauth.reason_code = cpu_to_le16(reason); 1920 1921 if (send_frame) { 1922 skb = dev_alloc_skb(local->hw.extra_tx_headroom + 1923 IEEE80211_DEAUTH_FRAME_LEN); 1924 if (!skb) 1925 return; 1926 1927 skb_reserve(skb, local->hw.extra_tx_headroom); 1928 1929 /* copy in frame */ 1930 skb_put_data(skb, mgmt, IEEE80211_DEAUTH_FRAME_LEN); 1931 1932 if (sdata->vif.type != NL80211_IFTYPE_STATION || 1933 !(sdata->u.mgd.flags & IEEE80211_STA_MFP_ENABLED)) 1934 IEEE80211_SKB_CB(skb)->flags |= 1935 IEEE80211_TX_INTFL_DONT_ENCRYPT; 1936 1937 ieee80211_tx_skb(sdata, skb); 1938 } 1939 } 1940 1941 u8 *ieee80211_write_he_6ghz_cap(u8 *pos, __le16 cap, u8 *end) 1942 { 1943 if ((end - pos) < 5) 1944 return pos; 1945 1946 *pos++ = WLAN_EID_EXTENSION; 1947 *pos++ = 1 + sizeof(cap); 1948 *pos++ = WLAN_EID_EXT_HE_6GHZ_CAPA; 1949 memcpy(pos, &cap, sizeof(cap)); 1950 1951 return pos + 2; 1952 } 1953 1954 static int ieee80211_build_preq_ies_band(struct ieee80211_sub_if_data *sdata, 1955 u8 *buffer, size_t buffer_len, 1956 const u8 *ie, size_t ie_len, 1957 enum nl80211_band band, 1958 u32 rate_mask, 1959 struct cfg80211_chan_def *chandef, 1960 size_t *offset, u32 flags) 1961 { 1962 struct ieee80211_local *local = sdata->local; 1963 struct ieee80211_supported_band *sband; 1964 const struct ieee80211_sta_he_cap *he_cap; 1965 const struct ieee80211_sta_eht_cap *eht_cap; 1966 u8 *pos = buffer, *end = buffer + buffer_len; 1967 size_t noffset; 1968 int supp_rates_len, i; 1969 u8 rates[32]; 1970 int num_rates; 1971 int ext_rates_len; 1972 u32 rate_flags; 1973 bool have_80mhz = false; 1974 1975 *offset = 0; 1976 1977 sband = local->hw.wiphy->bands[band]; 1978 if (WARN_ON_ONCE(!sband)) 1979 return 0; 1980 1981 rate_flags = ieee80211_chandef_rate_flags(chandef); 1982 1983 /* For direct scan add S1G IE and consider its override bits */ 1984 if (band == NL80211_BAND_S1GHZ) { 1985 if (end - pos < 2 + sizeof(struct ieee80211_s1g_cap)) 1986 goto out_err; 1987 pos = ieee80211_ie_build_s1g_cap(pos, &sband->s1g_cap); 1988 goto done; 1989 } 1990 1991 num_rates = 0; 1992 for (i = 0; i < sband->n_bitrates; i++) { 1993 if ((BIT(i) & rate_mask) == 0) 1994 continue; /* skip rate */ 1995 if ((rate_flags & sband->bitrates[i].flags) != rate_flags) 1996 continue; 1997 1998 rates[num_rates++] = 1999 (u8) DIV_ROUND_UP(sband->bitrates[i].bitrate, 5); 2000 } 2001 2002 supp_rates_len = min_t(int, num_rates, 8); 2003 2004 if (end - pos < 2 + supp_rates_len) 2005 goto out_err; 2006 *pos++ = WLAN_EID_SUPP_RATES; 2007 *pos++ = supp_rates_len; 2008 memcpy(pos, rates, supp_rates_len); 2009 pos += supp_rates_len; 2010 2011 /* insert "request information" if in custom IEs */ 2012 if (ie && ie_len) { 2013 static const u8 before_extrates[] = { 2014 WLAN_EID_SSID, 2015 WLAN_EID_SUPP_RATES, 2016 WLAN_EID_REQUEST, 2017 }; 2018 noffset = ieee80211_ie_split(ie, ie_len, 2019 before_extrates, 2020 ARRAY_SIZE(before_extrates), 2021 *offset); 2022 if (end - pos < noffset - *offset) 2023 goto out_err; 2024 memcpy(pos, ie + *offset, noffset - *offset); 2025 pos += noffset - *offset; 2026 *offset = noffset; 2027 } 2028 2029 ext_rates_len = num_rates - supp_rates_len; 2030 if (ext_rates_len > 0) { 2031 if (end - pos < 2 + ext_rates_len) 2032 goto out_err; 2033 *pos++ = WLAN_EID_EXT_SUPP_RATES; 2034 *pos++ = ext_rates_len; 2035 memcpy(pos, rates + supp_rates_len, ext_rates_len); 2036 pos += ext_rates_len; 2037 } 2038 2039 if (chandef->chan && sband->band == NL80211_BAND_2GHZ) { 2040 if (end - pos < 3) 2041 goto out_err; 2042 *pos++ = WLAN_EID_DS_PARAMS; 2043 *pos++ = 1; 2044 *pos++ = ieee80211_frequency_to_channel( 2045 chandef->chan->center_freq); 2046 } 2047 2048 if (flags & IEEE80211_PROBE_FLAG_MIN_CONTENT) 2049 goto done; 2050 2051 /* insert custom IEs that go before HT */ 2052 if (ie && ie_len) { 2053 static const u8 before_ht[] = { 2054 /* 2055 * no need to list the ones split off already 2056 * (or generated here) 2057 */ 2058 WLAN_EID_DS_PARAMS, 2059 WLAN_EID_SUPPORTED_REGULATORY_CLASSES, 2060 }; 2061 noffset = ieee80211_ie_split(ie, ie_len, 2062 before_ht, ARRAY_SIZE(before_ht), 2063 *offset); 2064 if (end - pos < noffset - *offset) 2065 goto out_err; 2066 memcpy(pos, ie + *offset, noffset - *offset); 2067 pos += noffset - *offset; 2068 *offset = noffset; 2069 } 2070 2071 if (sband->ht_cap.ht_supported) { 2072 if (end - pos < 2 + sizeof(struct ieee80211_ht_cap)) 2073 goto out_err; 2074 pos = ieee80211_ie_build_ht_cap(pos, &sband->ht_cap, 2075 sband->ht_cap.cap); 2076 } 2077 2078 /* insert custom IEs that go before VHT */ 2079 if (ie && ie_len) { 2080 static const u8 before_vht[] = { 2081 /* 2082 * no need to list the ones split off already 2083 * (or generated here) 2084 */ 2085 WLAN_EID_BSS_COEX_2040, 2086 WLAN_EID_EXT_CAPABILITY, 2087 WLAN_EID_SSID_LIST, 2088 WLAN_EID_CHANNEL_USAGE, 2089 WLAN_EID_INTERWORKING, 2090 WLAN_EID_MESH_ID, 2091 /* 60 GHz (Multi-band, DMG, MMS) can't happen */ 2092 }; 2093 noffset = ieee80211_ie_split(ie, ie_len, 2094 before_vht, ARRAY_SIZE(before_vht), 2095 *offset); 2096 if (end - pos < noffset - *offset) 2097 goto out_err; 2098 memcpy(pos, ie + *offset, noffset - *offset); 2099 pos += noffset - *offset; 2100 *offset = noffset; 2101 } 2102 2103 /* Check if any channel in this sband supports at least 80 MHz */ 2104 for (i = 0; i < sband->n_channels; i++) { 2105 if (sband->channels[i].flags & (IEEE80211_CHAN_DISABLED | 2106 IEEE80211_CHAN_NO_80MHZ)) 2107 continue; 2108 2109 have_80mhz = true; 2110 break; 2111 } 2112 2113 if (sband->vht_cap.vht_supported && have_80mhz) { 2114 if (end - pos < 2 + sizeof(struct ieee80211_vht_cap)) 2115 goto out_err; 2116 pos = ieee80211_ie_build_vht_cap(pos, &sband->vht_cap, 2117 sband->vht_cap.cap); 2118 } 2119 2120 /* insert custom IEs that go before HE */ 2121 if (ie && ie_len) { 2122 static const u8 before_he[] = { 2123 /* 2124 * no need to list the ones split off before VHT 2125 * or generated here 2126 */ 2127 WLAN_EID_EXTENSION, WLAN_EID_EXT_FILS_REQ_PARAMS, 2128 WLAN_EID_AP_CSN, 2129 /* TODO: add 11ah/11aj/11ak elements */ 2130 }; 2131 noffset = ieee80211_ie_split(ie, ie_len, 2132 before_he, ARRAY_SIZE(before_he), 2133 *offset); 2134 if (end - pos < noffset - *offset) 2135 goto out_err; 2136 memcpy(pos, ie + *offset, noffset - *offset); 2137 pos += noffset - *offset; 2138 *offset = noffset; 2139 } 2140 2141 he_cap = ieee80211_get_he_iftype_cap_vif(sband, &sdata->vif); 2142 if (he_cap && 2143 cfg80211_any_usable_channels(local->hw.wiphy, BIT(sband->band), 2144 IEEE80211_CHAN_NO_HE)) { 2145 pos = ieee80211_ie_build_he_cap(0, pos, he_cap, end); 2146 if (!pos) 2147 goto out_err; 2148 } 2149 2150 eht_cap = ieee80211_get_eht_iftype_cap_vif(sband, &sdata->vif); 2151 2152 if (eht_cap && 2153 cfg80211_any_usable_channels(local->hw.wiphy, BIT(sband->band), 2154 IEEE80211_CHAN_NO_HE | 2155 IEEE80211_CHAN_NO_EHT)) { 2156 pos = ieee80211_ie_build_eht_cap(pos, he_cap, eht_cap, end, 2157 sdata->vif.type == NL80211_IFTYPE_AP); 2158 if (!pos) 2159 goto out_err; 2160 } 2161 2162 if (cfg80211_any_usable_channels(local->hw.wiphy, 2163 BIT(NL80211_BAND_6GHZ), 2164 IEEE80211_CHAN_NO_HE)) { 2165 struct ieee80211_supported_band *sband6; 2166 2167 sband6 = local->hw.wiphy->bands[NL80211_BAND_6GHZ]; 2168 he_cap = ieee80211_get_he_iftype_cap_vif(sband6, &sdata->vif); 2169 2170 if (he_cap) { 2171 enum nl80211_iftype iftype = 2172 ieee80211_vif_type_p2p(&sdata->vif); 2173 __le16 cap = ieee80211_get_he_6ghz_capa(sband6, iftype); 2174 2175 pos = ieee80211_write_he_6ghz_cap(pos, cap, end); 2176 } 2177 } 2178 2179 /* 2180 * If adding more here, adjust code in main.c 2181 * that calculates local->scan_ies_len. 2182 */ 2183 2184 return pos - buffer; 2185 out_err: 2186 WARN_ONCE(1, "not enough space for preq IEs\n"); 2187 done: 2188 return pos - buffer; 2189 } 2190 2191 int ieee80211_build_preq_ies(struct ieee80211_sub_if_data *sdata, u8 *buffer, 2192 size_t buffer_len, 2193 struct ieee80211_scan_ies *ie_desc, 2194 const u8 *ie, size_t ie_len, 2195 u8 bands_used, u32 *rate_masks, 2196 struct cfg80211_chan_def *chandef, 2197 u32 flags) 2198 { 2199 size_t pos = 0, old_pos = 0, custom_ie_offset = 0; 2200 int i; 2201 2202 memset(ie_desc, 0, sizeof(*ie_desc)); 2203 2204 for (i = 0; i < NUM_NL80211_BANDS; i++) { 2205 if (bands_used & BIT(i)) { 2206 pos += ieee80211_build_preq_ies_band(sdata, 2207 buffer + pos, 2208 buffer_len - pos, 2209 ie, ie_len, i, 2210 rate_masks[i], 2211 chandef, 2212 &custom_ie_offset, 2213 flags); 2214 ie_desc->ies[i] = buffer + old_pos; 2215 ie_desc->len[i] = pos - old_pos; 2216 old_pos = pos; 2217 } 2218 } 2219 2220 /* add any remaining custom IEs */ 2221 if (ie && ie_len) { 2222 if (WARN_ONCE(buffer_len - pos < ie_len - custom_ie_offset, 2223 "not enough space for preq custom IEs\n")) 2224 return pos; 2225 memcpy(buffer + pos, ie + custom_ie_offset, 2226 ie_len - custom_ie_offset); 2227 ie_desc->common_ies = buffer + pos; 2228 ie_desc->common_ie_len = ie_len - custom_ie_offset; 2229 pos += ie_len - custom_ie_offset; 2230 } 2231 2232 return pos; 2233 }; 2234 2235 struct sk_buff *ieee80211_build_probe_req(struct ieee80211_sub_if_data *sdata, 2236 const u8 *src, const u8 *dst, 2237 u32 ratemask, 2238 struct ieee80211_channel *chan, 2239 const u8 *ssid, size_t ssid_len, 2240 const u8 *ie, size_t ie_len, 2241 u32 flags) 2242 { 2243 struct ieee80211_local *local = sdata->local; 2244 struct cfg80211_chan_def chandef; 2245 struct sk_buff *skb; 2246 struct ieee80211_mgmt *mgmt; 2247 int ies_len; 2248 u32 rate_masks[NUM_NL80211_BANDS] = {}; 2249 struct ieee80211_scan_ies dummy_ie_desc; 2250 2251 /* 2252 * Do not send DS Channel parameter for directed probe requests 2253 * in order to maximize the chance that we get a response. Some 2254 * badly-behaved APs don't respond when this parameter is included. 2255 */ 2256 chandef.width = sdata->vif.bss_conf.chandef.width; 2257 if (flags & IEEE80211_PROBE_FLAG_DIRECTED) 2258 chandef.chan = NULL; 2259 else 2260 chandef.chan = chan; 2261 2262 skb = ieee80211_probereq_get(&local->hw, src, ssid, ssid_len, 2263 local->scan_ies_len + ie_len); 2264 if (!skb) 2265 return NULL; 2266 2267 rate_masks[chan->band] = ratemask; 2268 ies_len = ieee80211_build_preq_ies(sdata, skb_tail_pointer(skb), 2269 skb_tailroom(skb), &dummy_ie_desc, 2270 ie, ie_len, BIT(chan->band), 2271 rate_masks, &chandef, flags); 2272 skb_put(skb, ies_len); 2273 2274 if (dst) { 2275 mgmt = (struct ieee80211_mgmt *) skb->data; 2276 memcpy(mgmt->da, dst, ETH_ALEN); 2277 memcpy(mgmt->bssid, dst, ETH_ALEN); 2278 } 2279 2280 IEEE80211_SKB_CB(skb)->flags |= IEEE80211_TX_INTFL_DONT_ENCRYPT; 2281 2282 return skb; 2283 } 2284 2285 u32 ieee80211_sta_get_rates(struct ieee80211_sub_if_data *sdata, 2286 struct ieee802_11_elems *elems, 2287 enum nl80211_band band, u32 *basic_rates) 2288 { 2289 struct ieee80211_supported_band *sband; 2290 size_t num_rates; 2291 u32 supp_rates, rate_flags; 2292 int i, j; 2293 2294 sband = sdata->local->hw.wiphy->bands[band]; 2295 if (WARN_ON(!sband)) 2296 return 1; 2297 2298 rate_flags = ieee80211_chandef_rate_flags(&sdata->vif.bss_conf.chandef); 2299 2300 num_rates = sband->n_bitrates; 2301 supp_rates = 0; 2302 for (i = 0; i < elems->supp_rates_len + 2303 elems->ext_supp_rates_len; i++) { 2304 u8 rate = 0; 2305 int own_rate; 2306 bool is_basic; 2307 if (i < elems->supp_rates_len) 2308 rate = elems->supp_rates[i]; 2309 else if (elems->ext_supp_rates) 2310 rate = elems->ext_supp_rates 2311 [i - elems->supp_rates_len]; 2312 own_rate = 5 * (rate & 0x7f); 2313 is_basic = !!(rate & 0x80); 2314 2315 if (is_basic && (rate & 0x7f) == BSS_MEMBERSHIP_SELECTOR_HT_PHY) 2316 continue; 2317 2318 for (j = 0; j < num_rates; j++) { 2319 int brate; 2320 if ((rate_flags & sband->bitrates[j].flags) 2321 != rate_flags) 2322 continue; 2323 2324 brate = sband->bitrates[j].bitrate; 2325 2326 if (brate == own_rate) { 2327 supp_rates |= BIT(j); 2328 if (basic_rates && is_basic) 2329 *basic_rates |= BIT(j); 2330 } 2331 } 2332 } 2333 return supp_rates; 2334 } 2335 2336 void ieee80211_stop_device(struct ieee80211_local *local) 2337 { 2338 ieee80211_led_radio(local, false); 2339 ieee80211_mod_tpt_led_trig(local, 0, IEEE80211_TPT_LEDTRIG_FL_RADIO); 2340 2341 wiphy_work_cancel(local->hw.wiphy, &local->reconfig_filter); 2342 2343 flush_workqueue(local->workqueue); 2344 wiphy_work_flush(local->hw.wiphy, NULL); 2345 drv_stop(local); 2346 } 2347 2348 static void ieee80211_flush_completed_scan(struct ieee80211_local *local, 2349 bool aborted) 2350 { 2351 /* It's possible that we don't handle the scan completion in 2352 * time during suspend, so if it's still marked as completed 2353 * here, queue the work and flush it to clean things up. 2354 * Instead of calling the worker function directly here, we 2355 * really queue it to avoid potential races with other flows 2356 * scheduling the same work. 2357 */ 2358 if (test_bit(SCAN_COMPLETED, &local->scanning)) { 2359 /* If coming from reconfiguration failure, abort the scan so 2360 * we don't attempt to continue a partial HW scan - which is 2361 * possible otherwise if (e.g.) the 2.4 GHz portion was the 2362 * completed scan, and a 5 GHz portion is still pending. 2363 */ 2364 if (aborted) 2365 set_bit(SCAN_ABORTED, &local->scanning); 2366 wiphy_delayed_work_queue(local->hw.wiphy, &local->scan_work, 0); 2367 wiphy_delayed_work_flush(local->hw.wiphy, &local->scan_work); 2368 } 2369 } 2370 2371 static void ieee80211_handle_reconfig_failure(struct ieee80211_local *local) 2372 { 2373 struct ieee80211_sub_if_data *sdata; 2374 struct ieee80211_chanctx *ctx; 2375 2376 lockdep_assert_wiphy(local->hw.wiphy); 2377 2378 /* 2379 * We get here if during resume the device can't be restarted properly. 2380 * We might also get here if this happens during HW reset, which is a 2381 * slightly different situation and we need to drop all connections in 2382 * the latter case. 2383 * 2384 * Ask cfg80211 to turn off all interfaces, this will result in more 2385 * warnings but at least we'll then get into a clean stopped state. 2386 */ 2387 2388 local->resuming = false; 2389 local->suspended = false; 2390 local->in_reconfig = false; 2391 local->reconfig_failure = true; 2392 2393 ieee80211_flush_completed_scan(local, true); 2394 2395 /* scheduled scan clearly can't be running any more, but tell 2396 * cfg80211 and clear local state 2397 */ 2398 ieee80211_sched_scan_end(local); 2399 2400 list_for_each_entry(sdata, &local->interfaces, list) 2401 sdata->flags &= ~IEEE80211_SDATA_IN_DRIVER; 2402 2403 /* Mark channel contexts as not being in the driver any more to avoid 2404 * removing them from the driver during the shutdown process... 2405 */ 2406 list_for_each_entry(ctx, &local->chanctx_list, list) 2407 ctx->driver_present = false; 2408 } 2409 2410 static void ieee80211_assign_chanctx(struct ieee80211_local *local, 2411 struct ieee80211_sub_if_data *sdata, 2412 struct ieee80211_link_data *link) 2413 { 2414 struct ieee80211_chanctx_conf *conf; 2415 struct ieee80211_chanctx *ctx; 2416 2417 lockdep_assert_wiphy(local->hw.wiphy); 2418 2419 if (!local->use_chanctx) 2420 return; 2421 2422 conf = rcu_dereference_protected(link->conf->chanctx_conf, 2423 lockdep_is_held(&local->hw.wiphy->mtx)); 2424 if (conf) { 2425 ctx = container_of(conf, struct ieee80211_chanctx, conf); 2426 drv_assign_vif_chanctx(local, sdata, link->conf, ctx); 2427 } 2428 } 2429 2430 static void ieee80211_reconfig_stations(struct ieee80211_sub_if_data *sdata) 2431 { 2432 struct ieee80211_local *local = sdata->local; 2433 struct sta_info *sta; 2434 2435 lockdep_assert_wiphy(local->hw.wiphy); 2436 2437 /* add STAs back */ 2438 list_for_each_entry(sta, &local->sta_list, list) { 2439 enum ieee80211_sta_state state; 2440 2441 if (!sta->uploaded || sta->sdata != sdata) 2442 continue; 2443 2444 for (state = IEEE80211_STA_NOTEXIST; 2445 state < sta->sta_state; state++) 2446 WARN_ON(drv_sta_state(local, sta->sdata, sta, state, 2447 state + 1)); 2448 } 2449 } 2450 2451 static int ieee80211_reconfig_nan(struct ieee80211_sub_if_data *sdata) 2452 { 2453 struct cfg80211_nan_func *func, **funcs; 2454 int res, id, i = 0; 2455 2456 res = drv_start_nan(sdata->local, sdata, 2457 &sdata->u.nan.conf); 2458 if (WARN_ON(res)) 2459 return res; 2460 2461 funcs = kcalloc(sdata->local->hw.max_nan_de_entries + 1, 2462 sizeof(*funcs), 2463 GFP_KERNEL); 2464 if (!funcs) 2465 return -ENOMEM; 2466 2467 /* Add all the functions: 2468 * This is a little bit ugly. We need to call a potentially sleeping 2469 * callback for each NAN function, so we can't hold the spinlock. 2470 */ 2471 spin_lock_bh(&sdata->u.nan.func_lock); 2472 2473 idr_for_each_entry(&sdata->u.nan.function_inst_ids, func, id) 2474 funcs[i++] = func; 2475 2476 spin_unlock_bh(&sdata->u.nan.func_lock); 2477 2478 for (i = 0; funcs[i]; i++) { 2479 res = drv_add_nan_func(sdata->local, sdata, funcs[i]); 2480 if (WARN_ON(res)) 2481 ieee80211_nan_func_terminated(&sdata->vif, 2482 funcs[i]->instance_id, 2483 NL80211_NAN_FUNC_TERM_REASON_ERROR, 2484 GFP_KERNEL); 2485 } 2486 2487 kfree(funcs); 2488 2489 return 0; 2490 } 2491 2492 static void ieee80211_reconfig_ap_links(struct ieee80211_local *local, 2493 struct ieee80211_sub_if_data *sdata, 2494 u64 changed) 2495 { 2496 int link_id; 2497 2498 for (link_id = 0; link_id < ARRAY_SIZE(sdata->link); link_id++) { 2499 struct ieee80211_link_data *link; 2500 2501 if (!(sdata->vif.active_links & BIT(link_id))) 2502 continue; 2503 2504 link = sdata_dereference(sdata->link[link_id], sdata); 2505 if (!link) 2506 continue; 2507 2508 if (rcu_access_pointer(link->u.ap.beacon)) 2509 drv_start_ap(local, sdata, link->conf); 2510 2511 if (!link->conf->enable_beacon) 2512 continue; 2513 2514 changed |= BSS_CHANGED_BEACON | 2515 BSS_CHANGED_BEACON_ENABLED; 2516 2517 ieee80211_link_info_change_notify(sdata, link, changed); 2518 } 2519 } 2520 2521 int ieee80211_reconfig(struct ieee80211_local *local) 2522 { 2523 struct ieee80211_hw *hw = &local->hw; 2524 struct ieee80211_sub_if_data *sdata; 2525 struct ieee80211_chanctx *ctx; 2526 struct sta_info *sta; 2527 int res, i; 2528 bool reconfig_due_to_wowlan = false; 2529 struct ieee80211_sub_if_data *sched_scan_sdata; 2530 struct cfg80211_sched_scan_request *sched_scan_req; 2531 bool sched_scan_stopped = false; 2532 bool suspended = local->suspended; 2533 bool in_reconfig = false; 2534 2535 lockdep_assert_wiphy(local->hw.wiphy); 2536 2537 /* nothing to do if HW shouldn't run */ 2538 if (!local->open_count) 2539 goto wake_up; 2540 2541 #ifdef CONFIG_PM 2542 if (suspended) 2543 local->resuming = true; 2544 2545 if (local->wowlan) { 2546 /* 2547 * In the wowlan case, both mac80211 and the device 2548 * are functional when the resume op is called, so 2549 * clear local->suspended so the device could operate 2550 * normally (e.g. pass rx frames). 2551 */ 2552 local->suspended = false; 2553 res = drv_resume(local); 2554 local->wowlan = false; 2555 if (res < 0) { 2556 local->resuming = false; 2557 return res; 2558 } 2559 if (res == 0) 2560 goto wake_up; 2561 WARN_ON(res > 1); 2562 /* 2563 * res is 1, which means the driver requested 2564 * to go through a regular reset on wakeup. 2565 * restore local->suspended in this case. 2566 */ 2567 reconfig_due_to_wowlan = true; 2568 local->suspended = true; 2569 } 2570 #endif 2571 2572 /* 2573 * In case of hw_restart during suspend (without wowlan), 2574 * cancel restart work, as we are reconfiguring the device 2575 * anyway. 2576 * Note that restart_work is scheduled on a frozen workqueue, 2577 * so we can't deadlock in this case. 2578 */ 2579 if (suspended && local->in_reconfig && !reconfig_due_to_wowlan) 2580 cancel_work_sync(&local->restart_work); 2581 2582 local->started = false; 2583 2584 /* 2585 * Upon resume hardware can sometimes be goofy due to 2586 * various platform / driver / bus issues, so restarting 2587 * the device may at times not work immediately. Propagate 2588 * the error. 2589 */ 2590 res = drv_start(local); 2591 if (res) { 2592 if (suspended) 2593 WARN(1, "Hardware became unavailable upon resume. This could be a software issue prior to suspend or a hardware issue.\n"); 2594 else 2595 WARN(1, "Hardware became unavailable during restart.\n"); 2596 ieee80211_handle_reconfig_failure(local); 2597 return res; 2598 } 2599 2600 /* setup fragmentation threshold */ 2601 drv_set_frag_threshold(local, hw->wiphy->frag_threshold); 2602 2603 /* setup RTS threshold */ 2604 drv_set_rts_threshold(local, hw->wiphy->rts_threshold); 2605 2606 /* reset coverage class */ 2607 drv_set_coverage_class(local, hw->wiphy->coverage_class); 2608 2609 ieee80211_led_radio(local, true); 2610 ieee80211_mod_tpt_led_trig(local, 2611 IEEE80211_TPT_LEDTRIG_FL_RADIO, 0); 2612 2613 /* add interfaces */ 2614 sdata = wiphy_dereference(local->hw.wiphy, local->monitor_sdata); 2615 if (sdata) { 2616 /* in HW restart it exists already */ 2617 WARN_ON(local->resuming); 2618 res = drv_add_interface(local, sdata); 2619 if (WARN_ON(res)) { 2620 RCU_INIT_POINTER(local->monitor_sdata, NULL); 2621 synchronize_net(); 2622 kfree(sdata); 2623 } 2624 } 2625 2626 list_for_each_entry(sdata, &local->interfaces, list) { 2627 if (sdata->vif.type != NL80211_IFTYPE_AP_VLAN && 2628 sdata->vif.type != NL80211_IFTYPE_MONITOR && 2629 ieee80211_sdata_running(sdata)) { 2630 res = drv_add_interface(local, sdata); 2631 if (WARN_ON(res)) 2632 break; 2633 } 2634 } 2635 2636 /* If adding any of the interfaces failed above, roll back and 2637 * report failure. 2638 */ 2639 if (res) { 2640 list_for_each_entry_continue_reverse(sdata, &local->interfaces, 2641 list) 2642 if (sdata->vif.type != NL80211_IFTYPE_AP_VLAN && 2643 sdata->vif.type != NL80211_IFTYPE_MONITOR && 2644 ieee80211_sdata_running(sdata)) 2645 drv_remove_interface(local, sdata); 2646 ieee80211_handle_reconfig_failure(local); 2647 return res; 2648 } 2649 2650 /* add channel contexts */ 2651 if (local->use_chanctx) { 2652 list_for_each_entry(ctx, &local->chanctx_list, list) 2653 if (ctx->replace_state != 2654 IEEE80211_CHANCTX_REPLACES_OTHER) 2655 WARN_ON(drv_add_chanctx(local, ctx)); 2656 2657 sdata = wiphy_dereference(local->hw.wiphy, 2658 local->monitor_sdata); 2659 if (sdata && ieee80211_sdata_running(sdata)) 2660 ieee80211_assign_chanctx(local, sdata, &sdata->deflink); 2661 } 2662 2663 /* reconfigure hardware */ 2664 ieee80211_hw_config(local, ~0); 2665 2666 ieee80211_configure_filter(local); 2667 2668 /* Finally also reconfigure all the BSS information */ 2669 list_for_each_entry(sdata, &local->interfaces, list) { 2670 /* common change flags for all interface types - link only */ 2671 u64 changed = BSS_CHANGED_ERP_CTS_PROT | 2672 BSS_CHANGED_ERP_PREAMBLE | 2673 BSS_CHANGED_ERP_SLOT | 2674 BSS_CHANGED_HT | 2675 BSS_CHANGED_BASIC_RATES | 2676 BSS_CHANGED_BEACON_INT | 2677 BSS_CHANGED_BSSID | 2678 BSS_CHANGED_CQM | 2679 BSS_CHANGED_QOS | 2680 BSS_CHANGED_TXPOWER | 2681 BSS_CHANGED_MCAST_RATE; 2682 struct ieee80211_link_data *link = NULL; 2683 unsigned int link_id; 2684 u32 active_links = 0; 2685 2686 if (!ieee80211_sdata_running(sdata)) 2687 continue; 2688 2689 if (ieee80211_vif_is_mld(&sdata->vif)) { 2690 struct ieee80211_bss_conf *old[IEEE80211_MLD_MAX_NUM_LINKS] = { 2691 [0] = &sdata->vif.bss_conf, 2692 }; 2693 2694 if (sdata->vif.type == NL80211_IFTYPE_STATION) { 2695 /* start with a single active link */ 2696 active_links = sdata->vif.active_links; 2697 link_id = ffs(active_links) - 1; 2698 sdata->vif.active_links = BIT(link_id); 2699 } 2700 2701 drv_change_vif_links(local, sdata, 0, 2702 sdata->vif.active_links, 2703 old); 2704 } 2705 2706 for (link_id = 0; 2707 link_id < ARRAY_SIZE(sdata->vif.link_conf); 2708 link_id++) { 2709 if (ieee80211_vif_is_mld(&sdata->vif) && 2710 !(sdata->vif.active_links & BIT(link_id))) 2711 continue; 2712 2713 link = sdata_dereference(sdata->link[link_id], sdata); 2714 if (!link) 2715 continue; 2716 2717 ieee80211_assign_chanctx(local, sdata, link); 2718 } 2719 2720 switch (sdata->vif.type) { 2721 case NL80211_IFTYPE_AP_VLAN: 2722 case NL80211_IFTYPE_MONITOR: 2723 break; 2724 case NL80211_IFTYPE_ADHOC: 2725 if (sdata->vif.cfg.ibss_joined) 2726 WARN_ON(drv_join_ibss(local, sdata)); 2727 fallthrough; 2728 default: 2729 ieee80211_reconfig_stations(sdata); 2730 fallthrough; 2731 case NL80211_IFTYPE_AP: /* AP stations are handled later */ 2732 for (i = 0; i < IEEE80211_NUM_ACS; i++) 2733 drv_conf_tx(local, &sdata->deflink, i, 2734 &sdata->deflink.tx_conf[i]); 2735 break; 2736 } 2737 2738 if (sdata->vif.bss_conf.mu_mimo_owner) 2739 changed |= BSS_CHANGED_MU_GROUPS; 2740 2741 if (!ieee80211_vif_is_mld(&sdata->vif)) 2742 changed |= BSS_CHANGED_IDLE; 2743 2744 switch (sdata->vif.type) { 2745 case NL80211_IFTYPE_STATION: 2746 if (!ieee80211_vif_is_mld(&sdata->vif)) { 2747 changed |= BSS_CHANGED_ASSOC | 2748 BSS_CHANGED_ARP_FILTER | 2749 BSS_CHANGED_PS; 2750 2751 /* Re-send beacon info report to the driver */ 2752 if (sdata->deflink.u.mgd.have_beacon) 2753 changed |= BSS_CHANGED_BEACON_INFO; 2754 2755 if (sdata->vif.bss_conf.max_idle_period || 2756 sdata->vif.bss_conf.protected_keep_alive) 2757 changed |= BSS_CHANGED_KEEP_ALIVE; 2758 2759 if (sdata->vif.bss_conf.eht_puncturing) 2760 changed |= BSS_CHANGED_EHT_PUNCTURING; 2761 2762 ieee80211_bss_info_change_notify(sdata, 2763 changed); 2764 } else if (!WARN_ON(!link)) { 2765 ieee80211_link_info_change_notify(sdata, link, 2766 changed); 2767 changed = BSS_CHANGED_ASSOC | 2768 BSS_CHANGED_IDLE | 2769 BSS_CHANGED_PS | 2770 BSS_CHANGED_ARP_FILTER; 2771 ieee80211_vif_cfg_change_notify(sdata, changed); 2772 } 2773 break; 2774 case NL80211_IFTYPE_OCB: 2775 changed |= BSS_CHANGED_OCB; 2776 ieee80211_bss_info_change_notify(sdata, changed); 2777 break; 2778 case NL80211_IFTYPE_ADHOC: 2779 changed |= BSS_CHANGED_IBSS; 2780 fallthrough; 2781 case NL80211_IFTYPE_AP: 2782 changed |= BSS_CHANGED_P2P_PS; 2783 2784 if (ieee80211_vif_is_mld(&sdata->vif)) 2785 ieee80211_vif_cfg_change_notify(sdata, 2786 BSS_CHANGED_SSID); 2787 else 2788 changed |= BSS_CHANGED_SSID; 2789 2790 if (sdata->vif.bss_conf.ftm_responder == 1 && 2791 wiphy_ext_feature_isset(sdata->local->hw.wiphy, 2792 NL80211_EXT_FEATURE_ENABLE_FTM_RESPONDER)) 2793 changed |= BSS_CHANGED_FTM_RESPONDER; 2794 2795 if (sdata->vif.type == NL80211_IFTYPE_AP) { 2796 changed |= BSS_CHANGED_AP_PROBE_RESP; 2797 2798 if (ieee80211_vif_is_mld(&sdata->vif)) { 2799 ieee80211_reconfig_ap_links(local, 2800 sdata, 2801 changed); 2802 break; 2803 } 2804 2805 if (rcu_access_pointer(sdata->deflink.u.ap.beacon)) 2806 drv_start_ap(local, sdata, 2807 sdata->deflink.conf); 2808 } 2809 fallthrough; 2810 case NL80211_IFTYPE_MESH_POINT: 2811 if (sdata->vif.bss_conf.enable_beacon) { 2812 changed |= BSS_CHANGED_BEACON | 2813 BSS_CHANGED_BEACON_ENABLED; 2814 ieee80211_bss_info_change_notify(sdata, changed); 2815 } 2816 break; 2817 case NL80211_IFTYPE_NAN: 2818 res = ieee80211_reconfig_nan(sdata); 2819 if (res < 0) { 2820 ieee80211_handle_reconfig_failure(local); 2821 return res; 2822 } 2823 break; 2824 case NL80211_IFTYPE_AP_VLAN: 2825 case NL80211_IFTYPE_MONITOR: 2826 case NL80211_IFTYPE_P2P_DEVICE: 2827 /* nothing to do */ 2828 break; 2829 case NL80211_IFTYPE_UNSPECIFIED: 2830 case NUM_NL80211_IFTYPES: 2831 case NL80211_IFTYPE_P2P_CLIENT: 2832 case NL80211_IFTYPE_P2P_GO: 2833 case NL80211_IFTYPE_WDS: 2834 WARN_ON(1); 2835 break; 2836 } 2837 2838 if (active_links) 2839 ieee80211_set_active_links(&sdata->vif, active_links); 2840 } 2841 2842 ieee80211_recalc_ps(local); 2843 2844 /* 2845 * The sta might be in psm against the ap (e.g. because 2846 * this was the state before a hw restart), so we 2847 * explicitly send a null packet in order to make sure 2848 * it'll sync against the ap (and get out of psm). 2849 */ 2850 if (!(local->hw.conf.flags & IEEE80211_CONF_PS)) { 2851 list_for_each_entry(sdata, &local->interfaces, list) { 2852 if (sdata->vif.type != NL80211_IFTYPE_STATION) 2853 continue; 2854 if (!sdata->u.mgd.associated) 2855 continue; 2856 2857 ieee80211_send_nullfunc(local, sdata, false); 2858 } 2859 } 2860 2861 /* APs are now beaconing, add back stations */ 2862 list_for_each_entry(sdata, &local->interfaces, list) { 2863 if (!ieee80211_sdata_running(sdata)) 2864 continue; 2865 2866 switch (sdata->vif.type) { 2867 case NL80211_IFTYPE_AP_VLAN: 2868 case NL80211_IFTYPE_AP: 2869 ieee80211_reconfig_stations(sdata); 2870 break; 2871 default: 2872 break; 2873 } 2874 } 2875 2876 /* add back keys */ 2877 list_for_each_entry(sdata, &local->interfaces, list) 2878 ieee80211_reenable_keys(sdata); 2879 2880 /* Reconfigure sched scan if it was interrupted by FW restart */ 2881 sched_scan_sdata = rcu_dereference_protected(local->sched_scan_sdata, 2882 lockdep_is_held(&local->hw.wiphy->mtx)); 2883 sched_scan_req = rcu_dereference_protected(local->sched_scan_req, 2884 lockdep_is_held(&local->hw.wiphy->mtx)); 2885 if (sched_scan_sdata && sched_scan_req) 2886 /* 2887 * Sched scan stopped, but we don't want to report it. Instead, 2888 * we're trying to reschedule. However, if more than one scan 2889 * plan was set, we cannot reschedule since we don't know which 2890 * scan plan was currently running (and some scan plans may have 2891 * already finished). 2892 */ 2893 if (sched_scan_req->n_scan_plans > 1 || 2894 __ieee80211_request_sched_scan_start(sched_scan_sdata, 2895 sched_scan_req)) { 2896 RCU_INIT_POINTER(local->sched_scan_sdata, NULL); 2897 RCU_INIT_POINTER(local->sched_scan_req, NULL); 2898 sched_scan_stopped = true; 2899 } 2900 2901 if (sched_scan_stopped) 2902 cfg80211_sched_scan_stopped_locked(local->hw.wiphy, 0); 2903 2904 wake_up: 2905 2906 if (local->monitors == local->open_count && local->monitors > 0) 2907 ieee80211_add_virtual_monitor(local); 2908 2909 /* 2910 * Clear the WLAN_STA_BLOCK_BA flag so new aggregation 2911 * sessions can be established after a resume. 2912 * 2913 * Also tear down aggregation sessions since reconfiguring 2914 * them in a hardware restart scenario is not easily done 2915 * right now, and the hardware will have lost information 2916 * about the sessions, but we and the AP still think they 2917 * are active. This is really a workaround though. 2918 */ 2919 if (ieee80211_hw_check(hw, AMPDU_AGGREGATION)) { 2920 list_for_each_entry(sta, &local->sta_list, list) { 2921 if (!local->resuming) 2922 ieee80211_sta_tear_down_BA_sessions( 2923 sta, AGG_STOP_LOCAL_REQUEST); 2924 clear_sta_flag(sta, WLAN_STA_BLOCK_BA); 2925 } 2926 } 2927 2928 /* 2929 * If this is for hw restart things are still running. 2930 * We may want to change that later, however. 2931 */ 2932 if (local->open_count && (!suspended || reconfig_due_to_wowlan)) 2933 drv_reconfig_complete(local, IEEE80211_RECONFIG_TYPE_RESTART); 2934 2935 if (local->in_reconfig) { 2936 in_reconfig = local->in_reconfig; 2937 local->in_reconfig = false; 2938 barrier(); 2939 2940 /* Restart deferred ROCs */ 2941 ieee80211_start_next_roc(local); 2942 2943 /* Requeue all works */ 2944 list_for_each_entry(sdata, &local->interfaces, list) 2945 wiphy_work_queue(local->hw.wiphy, &sdata->work); 2946 } 2947 2948 ieee80211_wake_queues_by_reason(hw, IEEE80211_MAX_QUEUE_MAP, 2949 IEEE80211_QUEUE_STOP_REASON_SUSPEND, 2950 false); 2951 2952 if (in_reconfig) { 2953 list_for_each_entry(sdata, &local->interfaces, list) { 2954 if (!ieee80211_sdata_running(sdata)) 2955 continue; 2956 if (sdata->vif.type == NL80211_IFTYPE_STATION) 2957 ieee80211_sta_restart(sdata); 2958 } 2959 } 2960 2961 if (!suspended) 2962 return 0; 2963 2964 #ifdef CONFIG_PM 2965 /* first set suspended false, then resuming */ 2966 local->suspended = false; 2967 mb(); 2968 local->resuming = false; 2969 2970 ieee80211_flush_completed_scan(local, false); 2971 2972 if (local->open_count && !reconfig_due_to_wowlan) 2973 drv_reconfig_complete(local, IEEE80211_RECONFIG_TYPE_SUSPEND); 2974 2975 list_for_each_entry(sdata, &local->interfaces, list) { 2976 if (!ieee80211_sdata_running(sdata)) 2977 continue; 2978 if (sdata->vif.type == NL80211_IFTYPE_STATION) 2979 ieee80211_sta_restart(sdata); 2980 } 2981 2982 mod_timer(&local->sta_cleanup, jiffies + 1); 2983 #else 2984 WARN_ON(1); 2985 #endif 2986 2987 return 0; 2988 } 2989 2990 static void ieee80211_reconfig_disconnect(struct ieee80211_vif *vif, u8 flag) 2991 { 2992 struct ieee80211_sub_if_data *sdata; 2993 struct ieee80211_local *local; 2994 struct ieee80211_key *key; 2995 2996 if (WARN_ON(!vif)) 2997 return; 2998 2999 sdata = vif_to_sdata(vif); 3000 local = sdata->local; 3001 3002 lockdep_assert_wiphy(local->hw.wiphy); 3003 3004 if (WARN_ON(flag & IEEE80211_SDATA_DISCONNECT_RESUME && 3005 !local->resuming)) 3006 return; 3007 3008 if (WARN_ON(flag & IEEE80211_SDATA_DISCONNECT_HW_RESTART && 3009 !local->in_reconfig)) 3010 return; 3011 3012 if (WARN_ON(vif->type != NL80211_IFTYPE_STATION)) 3013 return; 3014 3015 sdata->flags |= flag; 3016 3017 list_for_each_entry(key, &sdata->key_list, list) 3018 key->flags |= KEY_FLAG_TAINTED; 3019 } 3020 3021 void ieee80211_hw_restart_disconnect(struct ieee80211_vif *vif) 3022 { 3023 ieee80211_reconfig_disconnect(vif, IEEE80211_SDATA_DISCONNECT_HW_RESTART); 3024 } 3025 EXPORT_SYMBOL_GPL(ieee80211_hw_restart_disconnect); 3026 3027 void ieee80211_resume_disconnect(struct ieee80211_vif *vif) 3028 { 3029 ieee80211_reconfig_disconnect(vif, IEEE80211_SDATA_DISCONNECT_RESUME); 3030 } 3031 EXPORT_SYMBOL_GPL(ieee80211_resume_disconnect); 3032 3033 void ieee80211_recalc_smps(struct ieee80211_sub_if_data *sdata, 3034 struct ieee80211_link_data *link) 3035 { 3036 struct ieee80211_local *local = sdata->local; 3037 struct ieee80211_chanctx_conf *chanctx_conf; 3038 struct ieee80211_chanctx *chanctx; 3039 3040 lockdep_assert_wiphy(local->hw.wiphy); 3041 3042 chanctx_conf = rcu_dereference_protected(link->conf->chanctx_conf, 3043 lockdep_is_held(&local->hw.wiphy->mtx)); 3044 3045 /* 3046 * This function can be called from a work, thus it may be possible 3047 * that the chanctx_conf is removed (due to a disconnection, for 3048 * example). 3049 * So nothing should be done in such case. 3050 */ 3051 if (!chanctx_conf) 3052 return; 3053 3054 chanctx = container_of(chanctx_conf, struct ieee80211_chanctx, conf); 3055 ieee80211_recalc_smps_chanctx(local, chanctx); 3056 } 3057 3058 void ieee80211_recalc_min_chandef(struct ieee80211_sub_if_data *sdata, 3059 int link_id) 3060 { 3061 struct ieee80211_local *local = sdata->local; 3062 struct ieee80211_chanctx_conf *chanctx_conf; 3063 struct ieee80211_chanctx *chanctx; 3064 int i; 3065 3066 lockdep_assert_wiphy(local->hw.wiphy); 3067 3068 for (i = 0; i < ARRAY_SIZE(sdata->vif.link_conf); i++) { 3069 struct ieee80211_bss_conf *bss_conf; 3070 3071 if (link_id >= 0 && link_id != i) 3072 continue; 3073 3074 rcu_read_lock(); 3075 bss_conf = rcu_dereference(sdata->vif.link_conf[i]); 3076 if (!bss_conf) { 3077 rcu_read_unlock(); 3078 continue; 3079 } 3080 3081 chanctx_conf = rcu_dereference_protected(bss_conf->chanctx_conf, 3082 lockdep_is_held(&local->hw.wiphy->mtx)); 3083 /* 3084 * Since we hold the wiphy mutex (checked above) 3085 * we can take the chanctx_conf pointer out of the 3086 * RCU critical section, it cannot go away without 3087 * the mutex. Just the way we reached it could - in 3088 * theory - go away, but we don't really care and 3089 * it really shouldn't happen anyway. 3090 */ 3091 rcu_read_unlock(); 3092 3093 if (!chanctx_conf) 3094 return; 3095 3096 chanctx = container_of(chanctx_conf, struct ieee80211_chanctx, 3097 conf); 3098 ieee80211_recalc_chanctx_min_def(local, chanctx, NULL); 3099 } 3100 } 3101 3102 size_t ieee80211_ie_split_vendor(const u8 *ies, size_t ielen, size_t offset) 3103 { 3104 size_t pos = offset; 3105 3106 while (pos < ielen && ies[pos] != WLAN_EID_VENDOR_SPECIFIC) 3107 pos += 2 + ies[pos + 1]; 3108 3109 return pos; 3110 } 3111 3112 u8 *ieee80211_ie_build_s1g_cap(u8 *pos, struct ieee80211_sta_s1g_cap *s1g_cap) 3113 { 3114 *pos++ = WLAN_EID_S1G_CAPABILITIES; 3115 *pos++ = sizeof(struct ieee80211_s1g_cap); 3116 memset(pos, 0, sizeof(struct ieee80211_s1g_cap)); 3117 3118 memcpy(pos, &s1g_cap->cap, sizeof(s1g_cap->cap)); 3119 pos += sizeof(s1g_cap->cap); 3120 3121 memcpy(pos, &s1g_cap->nss_mcs, sizeof(s1g_cap->nss_mcs)); 3122 pos += sizeof(s1g_cap->nss_mcs); 3123 3124 return pos; 3125 } 3126 3127 u8 *ieee80211_ie_build_ht_cap(u8 *pos, struct ieee80211_sta_ht_cap *ht_cap, 3128 u16 cap) 3129 { 3130 __le16 tmp; 3131 3132 *pos++ = WLAN_EID_HT_CAPABILITY; 3133 *pos++ = sizeof(struct ieee80211_ht_cap); 3134 memset(pos, 0, sizeof(struct ieee80211_ht_cap)); 3135 3136 /* capability flags */ 3137 tmp = cpu_to_le16(cap); 3138 memcpy(pos, &tmp, sizeof(u16)); 3139 pos += sizeof(u16); 3140 3141 /* AMPDU parameters */ 3142 *pos++ = ht_cap->ampdu_factor | 3143 (ht_cap->ampdu_density << 3144 IEEE80211_HT_AMPDU_PARM_DENSITY_SHIFT); 3145 3146 /* MCS set */ 3147 memcpy(pos, &ht_cap->mcs, sizeof(ht_cap->mcs)); 3148 pos += sizeof(ht_cap->mcs); 3149 3150 /* extended capabilities */ 3151 pos += sizeof(__le16); 3152 3153 /* BF capabilities */ 3154 pos += sizeof(__le32); 3155 3156 /* antenna selection */ 3157 pos += sizeof(u8); 3158 3159 return pos; 3160 } 3161 3162 u8 *ieee80211_ie_build_vht_cap(u8 *pos, struct ieee80211_sta_vht_cap *vht_cap, 3163 u32 cap) 3164 { 3165 __le32 tmp; 3166 3167 *pos++ = WLAN_EID_VHT_CAPABILITY; 3168 *pos++ = sizeof(struct ieee80211_vht_cap); 3169 memset(pos, 0, sizeof(struct ieee80211_vht_cap)); 3170 3171 /* capability flags */ 3172 tmp = cpu_to_le32(cap); 3173 memcpy(pos, &tmp, sizeof(u32)); 3174 pos += sizeof(u32); 3175 3176 /* VHT MCS set */ 3177 memcpy(pos, &vht_cap->vht_mcs, sizeof(vht_cap->vht_mcs)); 3178 pos += sizeof(vht_cap->vht_mcs); 3179 3180 return pos; 3181 } 3182 3183 u8 ieee80211_ie_len_he_cap(struct ieee80211_sub_if_data *sdata, u8 iftype) 3184 { 3185 const struct ieee80211_sta_he_cap *he_cap; 3186 struct ieee80211_supported_band *sband; 3187 u8 n; 3188 3189 sband = ieee80211_get_sband(sdata); 3190 if (!sband) 3191 return 0; 3192 3193 he_cap = ieee80211_get_he_iftype_cap(sband, iftype); 3194 if (!he_cap) 3195 return 0; 3196 3197 n = ieee80211_he_mcs_nss_size(&he_cap->he_cap_elem); 3198 return 2 + 1 + 3199 sizeof(he_cap->he_cap_elem) + n + 3200 ieee80211_he_ppe_size(he_cap->ppe_thres[0], 3201 he_cap->he_cap_elem.phy_cap_info); 3202 } 3203 3204 u8 *ieee80211_ie_build_he_cap(ieee80211_conn_flags_t disable_flags, u8 *pos, 3205 const struct ieee80211_sta_he_cap *he_cap, 3206 u8 *end) 3207 { 3208 struct ieee80211_he_cap_elem elem; 3209 u8 n; 3210 u8 ie_len; 3211 u8 *orig_pos = pos; 3212 3213 /* Make sure we have place for the IE */ 3214 /* 3215 * TODO: the 1 added is because this temporarily is under the EXTENSION 3216 * IE. Get rid of it when it moves. 3217 */ 3218 if (!he_cap) 3219 return orig_pos; 3220 3221 /* modify on stack first to calculate 'n' and 'ie_len' correctly */ 3222 elem = he_cap->he_cap_elem; 3223 3224 if (disable_flags & IEEE80211_CONN_DISABLE_40MHZ) 3225 elem.phy_cap_info[0] &= 3226 ~(IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_80MHZ_IN_5G | 3227 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_IN_2G); 3228 3229 if (disable_flags & IEEE80211_CONN_DISABLE_160MHZ) 3230 elem.phy_cap_info[0] &= 3231 ~IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G; 3232 3233 if (disable_flags & IEEE80211_CONN_DISABLE_80P80MHZ) 3234 elem.phy_cap_info[0] &= 3235 ~IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G; 3236 3237 n = ieee80211_he_mcs_nss_size(&elem); 3238 ie_len = 2 + 1 + 3239 sizeof(he_cap->he_cap_elem) + n + 3240 ieee80211_he_ppe_size(he_cap->ppe_thres[0], 3241 he_cap->he_cap_elem.phy_cap_info); 3242 3243 if ((end - pos) < ie_len) 3244 return orig_pos; 3245 3246 *pos++ = WLAN_EID_EXTENSION; 3247 pos++; /* We'll set the size later below */ 3248 *pos++ = WLAN_EID_EXT_HE_CAPABILITY; 3249 3250 /* Fixed data */ 3251 memcpy(pos, &elem, sizeof(elem)); 3252 pos += sizeof(elem); 3253 3254 memcpy(pos, &he_cap->he_mcs_nss_supp, n); 3255 pos += n; 3256 3257 /* Check if PPE Threshold should be present */ 3258 if ((he_cap->he_cap_elem.phy_cap_info[6] & 3259 IEEE80211_HE_PHY_CAP6_PPE_THRESHOLD_PRESENT) == 0) 3260 goto end; 3261 3262 /* 3263 * Calculate how many PPET16/PPET8 pairs are to come. Algorithm: 3264 * (NSS_M1 + 1) x (num of 1 bits in RU_INDEX_BITMASK) 3265 */ 3266 n = hweight8(he_cap->ppe_thres[0] & 3267 IEEE80211_PPE_THRES_RU_INDEX_BITMASK_MASK); 3268 n *= (1 + ((he_cap->ppe_thres[0] & IEEE80211_PPE_THRES_NSS_MASK) >> 3269 IEEE80211_PPE_THRES_NSS_POS)); 3270 3271 /* 3272 * Each pair is 6 bits, and we need to add the 7 "header" bits to the 3273 * total size. 3274 */ 3275 n = (n * IEEE80211_PPE_THRES_INFO_PPET_SIZE * 2) + 7; 3276 n = DIV_ROUND_UP(n, 8); 3277 3278 /* Copy PPE Thresholds */ 3279 memcpy(pos, &he_cap->ppe_thres, n); 3280 pos += n; 3281 3282 end: 3283 orig_pos[1] = (pos - orig_pos) - 2; 3284 return pos; 3285 } 3286 3287 void ieee80211_ie_build_he_6ghz_cap(struct ieee80211_sub_if_data *sdata, 3288 enum ieee80211_smps_mode smps_mode, 3289 struct sk_buff *skb) 3290 { 3291 struct ieee80211_supported_band *sband; 3292 const struct ieee80211_sband_iftype_data *iftd; 3293 enum nl80211_iftype iftype = ieee80211_vif_type_p2p(&sdata->vif); 3294 u8 *pos; 3295 u16 cap; 3296 3297 if (!cfg80211_any_usable_channels(sdata->local->hw.wiphy, 3298 BIT(NL80211_BAND_6GHZ), 3299 IEEE80211_CHAN_NO_HE)) 3300 return; 3301 3302 sband = sdata->local->hw.wiphy->bands[NL80211_BAND_6GHZ]; 3303 3304 iftd = ieee80211_get_sband_iftype_data(sband, iftype); 3305 if (!iftd) 3306 return; 3307 3308 /* Check for device HE 6 GHz capability before adding element */ 3309 if (!iftd->he_6ghz_capa.capa) 3310 return; 3311 3312 cap = le16_to_cpu(iftd->he_6ghz_capa.capa); 3313 cap &= ~IEEE80211_HE_6GHZ_CAP_SM_PS; 3314 3315 switch (smps_mode) { 3316 case IEEE80211_SMPS_AUTOMATIC: 3317 case IEEE80211_SMPS_NUM_MODES: 3318 WARN_ON(1); 3319 fallthrough; 3320 case IEEE80211_SMPS_OFF: 3321 cap |= u16_encode_bits(WLAN_HT_CAP_SM_PS_DISABLED, 3322 IEEE80211_HE_6GHZ_CAP_SM_PS); 3323 break; 3324 case IEEE80211_SMPS_STATIC: 3325 cap |= u16_encode_bits(WLAN_HT_CAP_SM_PS_STATIC, 3326 IEEE80211_HE_6GHZ_CAP_SM_PS); 3327 break; 3328 case IEEE80211_SMPS_DYNAMIC: 3329 cap |= u16_encode_bits(WLAN_HT_CAP_SM_PS_DYNAMIC, 3330 IEEE80211_HE_6GHZ_CAP_SM_PS); 3331 break; 3332 } 3333 3334 pos = skb_put(skb, 2 + 1 + sizeof(cap)); 3335 ieee80211_write_he_6ghz_cap(pos, cpu_to_le16(cap), 3336 pos + 2 + 1 + sizeof(cap)); 3337 } 3338 3339 u8 *ieee80211_ie_build_ht_oper(u8 *pos, struct ieee80211_sta_ht_cap *ht_cap, 3340 const struct cfg80211_chan_def *chandef, 3341 u16 prot_mode, bool rifs_mode) 3342 { 3343 struct ieee80211_ht_operation *ht_oper; 3344 /* Build HT Information */ 3345 *pos++ = WLAN_EID_HT_OPERATION; 3346 *pos++ = sizeof(struct ieee80211_ht_operation); 3347 ht_oper = (struct ieee80211_ht_operation *)pos; 3348 ht_oper->primary_chan = ieee80211_frequency_to_channel( 3349 chandef->chan->center_freq); 3350 switch (chandef->width) { 3351 case NL80211_CHAN_WIDTH_160: 3352 case NL80211_CHAN_WIDTH_80P80: 3353 case NL80211_CHAN_WIDTH_80: 3354 case NL80211_CHAN_WIDTH_40: 3355 if (chandef->center_freq1 > chandef->chan->center_freq) 3356 ht_oper->ht_param = IEEE80211_HT_PARAM_CHA_SEC_ABOVE; 3357 else 3358 ht_oper->ht_param = IEEE80211_HT_PARAM_CHA_SEC_BELOW; 3359 break; 3360 case NL80211_CHAN_WIDTH_320: 3361 /* HT information element should not be included on 6GHz */ 3362 WARN_ON(1); 3363 return pos; 3364 default: 3365 ht_oper->ht_param = IEEE80211_HT_PARAM_CHA_SEC_NONE; 3366 break; 3367 } 3368 if (ht_cap->cap & IEEE80211_HT_CAP_SUP_WIDTH_20_40 && 3369 chandef->width != NL80211_CHAN_WIDTH_20_NOHT && 3370 chandef->width != NL80211_CHAN_WIDTH_20) 3371 ht_oper->ht_param |= IEEE80211_HT_PARAM_CHAN_WIDTH_ANY; 3372 3373 if (rifs_mode) 3374 ht_oper->ht_param |= IEEE80211_HT_PARAM_RIFS_MODE; 3375 3376 ht_oper->operation_mode = cpu_to_le16(prot_mode); 3377 ht_oper->stbc_param = 0x0000; 3378 3379 /* It seems that Basic MCS set and Supported MCS set 3380 are identical for the first 10 bytes */ 3381 memset(&ht_oper->basic_set, 0, 16); 3382 memcpy(&ht_oper->basic_set, &ht_cap->mcs, 10); 3383 3384 return pos + sizeof(struct ieee80211_ht_operation); 3385 } 3386 3387 void ieee80211_ie_build_wide_bw_cs(u8 *pos, 3388 const struct cfg80211_chan_def *chandef) 3389 { 3390 *pos++ = WLAN_EID_WIDE_BW_CHANNEL_SWITCH; /* EID */ 3391 *pos++ = 3; /* IE length */ 3392 /* New channel width */ 3393 switch (chandef->width) { 3394 case NL80211_CHAN_WIDTH_80: 3395 *pos++ = IEEE80211_VHT_CHANWIDTH_80MHZ; 3396 break; 3397 case NL80211_CHAN_WIDTH_160: 3398 *pos++ = IEEE80211_VHT_CHANWIDTH_160MHZ; 3399 break; 3400 case NL80211_CHAN_WIDTH_80P80: 3401 *pos++ = IEEE80211_VHT_CHANWIDTH_80P80MHZ; 3402 break; 3403 case NL80211_CHAN_WIDTH_320: 3404 /* The behavior is not defined for 320 MHz channels */ 3405 WARN_ON(1); 3406 fallthrough; 3407 default: 3408 *pos++ = IEEE80211_VHT_CHANWIDTH_USE_HT; 3409 } 3410 3411 /* new center frequency segment 0 */ 3412 *pos++ = ieee80211_frequency_to_channel(chandef->center_freq1); 3413 /* new center frequency segment 1 */ 3414 if (chandef->center_freq2) 3415 *pos++ = ieee80211_frequency_to_channel(chandef->center_freq2); 3416 else 3417 *pos++ = 0; 3418 } 3419 3420 u8 *ieee80211_ie_build_vht_oper(u8 *pos, struct ieee80211_sta_vht_cap *vht_cap, 3421 const struct cfg80211_chan_def *chandef) 3422 { 3423 struct ieee80211_vht_operation *vht_oper; 3424 3425 *pos++ = WLAN_EID_VHT_OPERATION; 3426 *pos++ = sizeof(struct ieee80211_vht_operation); 3427 vht_oper = (struct ieee80211_vht_operation *)pos; 3428 vht_oper->center_freq_seg0_idx = ieee80211_frequency_to_channel( 3429 chandef->center_freq1); 3430 if (chandef->center_freq2) 3431 vht_oper->center_freq_seg1_idx = 3432 ieee80211_frequency_to_channel(chandef->center_freq2); 3433 else 3434 vht_oper->center_freq_seg1_idx = 0x00; 3435 3436 switch (chandef->width) { 3437 case NL80211_CHAN_WIDTH_160: 3438 /* 3439 * Convert 160 MHz channel width to new style as interop 3440 * workaround. 3441 */ 3442 vht_oper->chan_width = IEEE80211_VHT_CHANWIDTH_80MHZ; 3443 vht_oper->center_freq_seg1_idx = vht_oper->center_freq_seg0_idx; 3444 if (chandef->chan->center_freq < chandef->center_freq1) 3445 vht_oper->center_freq_seg0_idx -= 8; 3446 else 3447 vht_oper->center_freq_seg0_idx += 8; 3448 break; 3449 case NL80211_CHAN_WIDTH_80P80: 3450 /* 3451 * Convert 80+80 MHz channel width to new style as interop 3452 * workaround. 3453 */ 3454 vht_oper->chan_width = IEEE80211_VHT_CHANWIDTH_80MHZ; 3455 break; 3456 case NL80211_CHAN_WIDTH_80: 3457 vht_oper->chan_width = IEEE80211_VHT_CHANWIDTH_80MHZ; 3458 break; 3459 case NL80211_CHAN_WIDTH_320: 3460 /* VHT information element should not be included on 6GHz */ 3461 WARN_ON(1); 3462 return pos; 3463 default: 3464 vht_oper->chan_width = IEEE80211_VHT_CHANWIDTH_USE_HT; 3465 break; 3466 } 3467 3468 /* don't require special VHT peer rates */ 3469 vht_oper->basic_mcs_set = cpu_to_le16(0xffff); 3470 3471 return pos + sizeof(struct ieee80211_vht_operation); 3472 } 3473 3474 u8 *ieee80211_ie_build_he_oper(u8 *pos, struct cfg80211_chan_def *chandef) 3475 { 3476 struct ieee80211_he_operation *he_oper; 3477 struct ieee80211_he_6ghz_oper *he_6ghz_op; 3478 u32 he_oper_params; 3479 u8 ie_len = 1 + sizeof(struct ieee80211_he_operation); 3480 3481 if (chandef->chan->band == NL80211_BAND_6GHZ) 3482 ie_len += sizeof(struct ieee80211_he_6ghz_oper); 3483 3484 *pos++ = WLAN_EID_EXTENSION; 3485 *pos++ = ie_len; 3486 *pos++ = WLAN_EID_EXT_HE_OPERATION; 3487 3488 he_oper_params = 0; 3489 he_oper_params |= u32_encode_bits(1023, /* disabled */ 3490 IEEE80211_HE_OPERATION_RTS_THRESHOLD_MASK); 3491 he_oper_params |= u32_encode_bits(1, 3492 IEEE80211_HE_OPERATION_ER_SU_DISABLE); 3493 he_oper_params |= u32_encode_bits(1, 3494 IEEE80211_HE_OPERATION_BSS_COLOR_DISABLED); 3495 if (chandef->chan->band == NL80211_BAND_6GHZ) 3496 he_oper_params |= u32_encode_bits(1, 3497 IEEE80211_HE_OPERATION_6GHZ_OP_INFO); 3498 3499 he_oper = (struct ieee80211_he_operation *)pos; 3500 he_oper->he_oper_params = cpu_to_le32(he_oper_params); 3501 3502 /* don't require special HE peer rates */ 3503 he_oper->he_mcs_nss_set = cpu_to_le16(0xffff); 3504 pos += sizeof(struct ieee80211_he_operation); 3505 3506 if (chandef->chan->band != NL80211_BAND_6GHZ) 3507 goto out; 3508 3509 /* TODO add VHT operational */ 3510 he_6ghz_op = (struct ieee80211_he_6ghz_oper *)pos; 3511 he_6ghz_op->minrate = 6; /* 6 Mbps */ 3512 he_6ghz_op->primary = 3513 ieee80211_frequency_to_channel(chandef->chan->center_freq); 3514 he_6ghz_op->ccfs0 = 3515 ieee80211_frequency_to_channel(chandef->center_freq1); 3516 if (chandef->center_freq2) 3517 he_6ghz_op->ccfs1 = 3518 ieee80211_frequency_to_channel(chandef->center_freq2); 3519 else 3520 he_6ghz_op->ccfs1 = 0; 3521 3522 switch (chandef->width) { 3523 case NL80211_CHAN_WIDTH_320: 3524 /* 3525 * TODO: mesh operation is not defined over 6GHz 320 MHz 3526 * channels. 3527 */ 3528 WARN_ON(1); 3529 break; 3530 case NL80211_CHAN_WIDTH_160: 3531 /* Convert 160 MHz channel width to new style as interop 3532 * workaround. 3533 */ 3534 he_6ghz_op->control = 3535 IEEE80211_HE_6GHZ_OPER_CTRL_CHANWIDTH_160MHZ; 3536 he_6ghz_op->ccfs1 = he_6ghz_op->ccfs0; 3537 if (chandef->chan->center_freq < chandef->center_freq1) 3538 he_6ghz_op->ccfs0 -= 8; 3539 else 3540 he_6ghz_op->ccfs0 += 8; 3541 fallthrough; 3542 case NL80211_CHAN_WIDTH_80P80: 3543 he_6ghz_op->control = 3544 IEEE80211_HE_6GHZ_OPER_CTRL_CHANWIDTH_160MHZ; 3545 break; 3546 case NL80211_CHAN_WIDTH_80: 3547 he_6ghz_op->control = 3548 IEEE80211_HE_6GHZ_OPER_CTRL_CHANWIDTH_80MHZ; 3549 break; 3550 case NL80211_CHAN_WIDTH_40: 3551 he_6ghz_op->control = 3552 IEEE80211_HE_6GHZ_OPER_CTRL_CHANWIDTH_40MHZ; 3553 break; 3554 default: 3555 he_6ghz_op->control = 3556 IEEE80211_HE_6GHZ_OPER_CTRL_CHANWIDTH_20MHZ; 3557 break; 3558 } 3559 3560 pos += sizeof(struct ieee80211_he_6ghz_oper); 3561 3562 out: 3563 return pos; 3564 } 3565 3566 u8 *ieee80211_ie_build_eht_oper(u8 *pos, struct cfg80211_chan_def *chandef, 3567 const struct ieee80211_sta_eht_cap *eht_cap) 3568 3569 { 3570 const struct ieee80211_eht_mcs_nss_supp_20mhz_only *eht_mcs_nss = 3571 &eht_cap->eht_mcs_nss_supp.only_20mhz; 3572 struct ieee80211_eht_operation *eht_oper; 3573 struct ieee80211_eht_operation_info *eht_oper_info; 3574 u8 eht_oper_len = offsetof(struct ieee80211_eht_operation, optional); 3575 u8 eht_oper_info_len = 3576 offsetof(struct ieee80211_eht_operation_info, optional); 3577 u8 chan_width = 0; 3578 3579 *pos++ = WLAN_EID_EXTENSION; 3580 *pos++ = 1 + eht_oper_len + eht_oper_info_len; 3581 *pos++ = WLAN_EID_EXT_EHT_OPERATION; 3582 3583 eht_oper = (struct ieee80211_eht_operation *)pos; 3584 3585 memcpy(&eht_oper->basic_mcs_nss, eht_mcs_nss, sizeof(*eht_mcs_nss)); 3586 eht_oper->params |= IEEE80211_EHT_OPER_INFO_PRESENT; 3587 pos += eht_oper_len; 3588 3589 eht_oper_info = 3590 (struct ieee80211_eht_operation_info *)eht_oper->optional; 3591 3592 eht_oper_info->ccfs0 = 3593 ieee80211_frequency_to_channel(chandef->center_freq1); 3594 if (chandef->center_freq2) 3595 eht_oper_info->ccfs1 = 3596 ieee80211_frequency_to_channel(chandef->center_freq2); 3597 else 3598 eht_oper_info->ccfs1 = 0; 3599 3600 switch (chandef->width) { 3601 case NL80211_CHAN_WIDTH_320: 3602 chan_width = IEEE80211_EHT_OPER_CHAN_WIDTH_320MHZ; 3603 eht_oper_info->ccfs1 = eht_oper_info->ccfs0; 3604 if (chandef->chan->center_freq < chandef->center_freq1) 3605 eht_oper_info->ccfs0 -= 16; 3606 else 3607 eht_oper_info->ccfs0 += 16; 3608 break; 3609 case NL80211_CHAN_WIDTH_160: 3610 eht_oper_info->ccfs1 = eht_oper_info->ccfs0; 3611 if (chandef->chan->center_freq < chandef->center_freq1) 3612 eht_oper_info->ccfs0 -= 8; 3613 else 3614 eht_oper_info->ccfs0 += 8; 3615 fallthrough; 3616 case NL80211_CHAN_WIDTH_80P80: 3617 chan_width = IEEE80211_EHT_OPER_CHAN_WIDTH_160MHZ; 3618 break; 3619 case NL80211_CHAN_WIDTH_80: 3620 chan_width = IEEE80211_EHT_OPER_CHAN_WIDTH_80MHZ; 3621 break; 3622 case NL80211_CHAN_WIDTH_40: 3623 chan_width = IEEE80211_EHT_OPER_CHAN_WIDTH_40MHZ; 3624 break; 3625 default: 3626 chan_width = IEEE80211_EHT_OPER_CHAN_WIDTH_20MHZ; 3627 break; 3628 } 3629 eht_oper_info->control = chan_width; 3630 pos += eht_oper_info_len; 3631 3632 /* TODO: eht_oper_info->optional */ 3633 3634 return pos; 3635 } 3636 3637 bool ieee80211_chandef_ht_oper(const struct ieee80211_ht_operation *ht_oper, 3638 struct cfg80211_chan_def *chandef) 3639 { 3640 enum nl80211_channel_type channel_type; 3641 3642 if (!ht_oper) 3643 return false; 3644 3645 switch (ht_oper->ht_param & IEEE80211_HT_PARAM_CHA_SEC_OFFSET) { 3646 case IEEE80211_HT_PARAM_CHA_SEC_NONE: 3647 channel_type = NL80211_CHAN_HT20; 3648 break; 3649 case IEEE80211_HT_PARAM_CHA_SEC_ABOVE: 3650 channel_type = NL80211_CHAN_HT40PLUS; 3651 break; 3652 case IEEE80211_HT_PARAM_CHA_SEC_BELOW: 3653 channel_type = NL80211_CHAN_HT40MINUS; 3654 break; 3655 default: 3656 return false; 3657 } 3658 3659 cfg80211_chandef_create(chandef, chandef->chan, channel_type); 3660 return true; 3661 } 3662 3663 bool ieee80211_chandef_vht_oper(struct ieee80211_hw *hw, u32 vht_cap_info, 3664 const struct ieee80211_vht_operation *oper, 3665 const struct ieee80211_ht_operation *htop, 3666 struct cfg80211_chan_def *chandef) 3667 { 3668 struct cfg80211_chan_def new = *chandef; 3669 int cf0, cf1; 3670 int ccfs0, ccfs1, ccfs2; 3671 int ccf0, ccf1; 3672 u32 vht_cap; 3673 bool support_80_80 = false; 3674 bool support_160 = false; 3675 u8 ext_nss_bw_supp = u32_get_bits(vht_cap_info, 3676 IEEE80211_VHT_CAP_EXT_NSS_BW_MASK); 3677 u8 supp_chwidth = u32_get_bits(vht_cap_info, 3678 IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_MASK); 3679 3680 if (!oper || !htop) 3681 return false; 3682 3683 vht_cap = hw->wiphy->bands[chandef->chan->band]->vht_cap.cap; 3684 support_160 = (vht_cap & (IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_MASK | 3685 IEEE80211_VHT_CAP_EXT_NSS_BW_MASK)); 3686 support_80_80 = ((vht_cap & 3687 IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160_80PLUS80MHZ) || 3688 (vht_cap & IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160MHZ && 3689 vht_cap & IEEE80211_VHT_CAP_EXT_NSS_BW_MASK) || 3690 ((vht_cap & IEEE80211_VHT_CAP_EXT_NSS_BW_MASK) >> 3691 IEEE80211_VHT_CAP_EXT_NSS_BW_SHIFT > 1)); 3692 ccfs0 = oper->center_freq_seg0_idx; 3693 ccfs1 = oper->center_freq_seg1_idx; 3694 ccfs2 = (le16_to_cpu(htop->operation_mode) & 3695 IEEE80211_HT_OP_MODE_CCFS2_MASK) 3696 >> IEEE80211_HT_OP_MODE_CCFS2_SHIFT; 3697 3698 ccf0 = ccfs0; 3699 3700 /* if not supported, parse as though we didn't understand it */ 3701 if (!ieee80211_hw_check(hw, SUPPORTS_VHT_EXT_NSS_BW)) 3702 ext_nss_bw_supp = 0; 3703 3704 /* 3705 * Cf. IEEE 802.11 Table 9-250 3706 * 3707 * We really just consider that because it's inefficient to connect 3708 * at a higher bandwidth than we'll actually be able to use. 3709 */ 3710 switch ((supp_chwidth << 4) | ext_nss_bw_supp) { 3711 default: 3712 case 0x00: 3713 ccf1 = 0; 3714 support_160 = false; 3715 support_80_80 = false; 3716 break; 3717 case 0x01: 3718 support_80_80 = false; 3719 fallthrough; 3720 case 0x02: 3721 case 0x03: 3722 ccf1 = ccfs2; 3723 break; 3724 case 0x10: 3725 ccf1 = ccfs1; 3726 break; 3727 case 0x11: 3728 case 0x12: 3729 if (!ccfs1) 3730 ccf1 = ccfs2; 3731 else 3732 ccf1 = ccfs1; 3733 break; 3734 case 0x13: 3735 case 0x20: 3736 case 0x23: 3737 ccf1 = ccfs1; 3738 break; 3739 } 3740 3741 cf0 = ieee80211_channel_to_frequency(ccf0, chandef->chan->band); 3742 cf1 = ieee80211_channel_to_frequency(ccf1, chandef->chan->band); 3743 3744 switch (oper->chan_width) { 3745 case IEEE80211_VHT_CHANWIDTH_USE_HT: 3746 /* just use HT information directly */ 3747 break; 3748 case IEEE80211_VHT_CHANWIDTH_80MHZ: 3749 new.width = NL80211_CHAN_WIDTH_80; 3750 new.center_freq1 = cf0; 3751 /* If needed, adjust based on the newer interop workaround. */ 3752 if (ccf1) { 3753 unsigned int diff; 3754 3755 diff = abs(ccf1 - ccf0); 3756 if ((diff == 8) && support_160) { 3757 new.width = NL80211_CHAN_WIDTH_160; 3758 new.center_freq1 = cf1; 3759 } else if ((diff > 8) && support_80_80) { 3760 new.width = NL80211_CHAN_WIDTH_80P80; 3761 new.center_freq2 = cf1; 3762 } 3763 } 3764 break; 3765 case IEEE80211_VHT_CHANWIDTH_160MHZ: 3766 /* deprecated encoding */ 3767 new.width = NL80211_CHAN_WIDTH_160; 3768 new.center_freq1 = cf0; 3769 break; 3770 case IEEE80211_VHT_CHANWIDTH_80P80MHZ: 3771 /* deprecated encoding */ 3772 new.width = NL80211_CHAN_WIDTH_80P80; 3773 new.center_freq1 = cf0; 3774 new.center_freq2 = cf1; 3775 break; 3776 default: 3777 return false; 3778 } 3779 3780 if (!cfg80211_chandef_valid(&new)) 3781 return false; 3782 3783 *chandef = new; 3784 return true; 3785 } 3786 3787 void ieee80211_chandef_eht_oper(const struct ieee80211_eht_operation_info *info, 3788 bool support_160, bool support_320, 3789 struct cfg80211_chan_def *chandef) 3790 { 3791 chandef->center_freq1 = 3792 ieee80211_channel_to_frequency(info->ccfs0, 3793 chandef->chan->band); 3794 3795 switch (u8_get_bits(info->control, 3796 IEEE80211_EHT_OPER_CHAN_WIDTH)) { 3797 case IEEE80211_EHT_OPER_CHAN_WIDTH_20MHZ: 3798 chandef->width = NL80211_CHAN_WIDTH_20; 3799 break; 3800 case IEEE80211_EHT_OPER_CHAN_WIDTH_40MHZ: 3801 chandef->width = NL80211_CHAN_WIDTH_40; 3802 break; 3803 case IEEE80211_EHT_OPER_CHAN_WIDTH_80MHZ: 3804 chandef->width = NL80211_CHAN_WIDTH_80; 3805 break; 3806 case IEEE80211_EHT_OPER_CHAN_WIDTH_160MHZ: 3807 if (support_160) { 3808 chandef->width = NL80211_CHAN_WIDTH_160; 3809 chandef->center_freq1 = 3810 ieee80211_channel_to_frequency(info->ccfs1, 3811 chandef->chan->band); 3812 } else { 3813 chandef->width = NL80211_CHAN_WIDTH_80; 3814 } 3815 break; 3816 case IEEE80211_EHT_OPER_CHAN_WIDTH_320MHZ: 3817 if (support_320) { 3818 chandef->width = NL80211_CHAN_WIDTH_320; 3819 chandef->center_freq1 = 3820 ieee80211_channel_to_frequency(info->ccfs1, 3821 chandef->chan->band); 3822 } else if (support_160) { 3823 chandef->width = NL80211_CHAN_WIDTH_160; 3824 } else { 3825 chandef->width = NL80211_CHAN_WIDTH_80; 3826 3827 if (chandef->center_freq1 > chandef->chan->center_freq) 3828 chandef->center_freq1 -= 40; 3829 else 3830 chandef->center_freq1 += 40; 3831 } 3832 break; 3833 } 3834 } 3835 3836 bool ieee80211_chandef_he_6ghz_oper(struct ieee80211_sub_if_data *sdata, 3837 const struct ieee80211_he_operation *he_oper, 3838 const struct ieee80211_eht_operation *eht_oper, 3839 struct cfg80211_chan_def *chandef) 3840 { 3841 struct ieee80211_local *local = sdata->local; 3842 struct ieee80211_supported_band *sband; 3843 enum nl80211_iftype iftype = ieee80211_vif_type_p2p(&sdata->vif); 3844 const struct ieee80211_sta_he_cap *he_cap; 3845 const struct ieee80211_sta_eht_cap *eht_cap; 3846 struct cfg80211_chan_def he_chandef = *chandef; 3847 const struct ieee80211_he_6ghz_oper *he_6ghz_oper; 3848 struct ieee80211_bss_conf *bss_conf = &sdata->vif.bss_conf; 3849 bool support_80_80, support_160, support_320; 3850 u8 he_phy_cap, eht_phy_cap; 3851 u32 freq; 3852 3853 if (chandef->chan->band != NL80211_BAND_6GHZ) 3854 return true; 3855 3856 sband = local->hw.wiphy->bands[NL80211_BAND_6GHZ]; 3857 3858 he_cap = ieee80211_get_he_iftype_cap(sband, iftype); 3859 if (!he_cap) { 3860 sdata_info(sdata, "Missing iftype sband data/HE cap"); 3861 return false; 3862 } 3863 3864 he_phy_cap = he_cap->he_cap_elem.phy_cap_info[0]; 3865 support_160 = 3866 he_phy_cap & 3867 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G; 3868 support_80_80 = 3869 he_phy_cap & 3870 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G; 3871 3872 if (!he_oper) { 3873 sdata_info(sdata, 3874 "HE is not advertised on (on %d MHz), expect issues\n", 3875 chandef->chan->center_freq); 3876 return false; 3877 } 3878 3879 eht_cap = ieee80211_get_eht_iftype_cap(sband, iftype); 3880 if (!eht_cap) 3881 eht_oper = NULL; 3882 3883 he_6ghz_oper = ieee80211_he_6ghz_oper(he_oper); 3884 3885 if (!he_6ghz_oper) { 3886 sdata_info(sdata, 3887 "HE 6GHz operation missing (on %d MHz), expect issues\n", 3888 chandef->chan->center_freq); 3889 return false; 3890 } 3891 3892 /* 3893 * The EHT operation IE does not contain the primary channel so the 3894 * primary channel frequency should be taken from the 6 GHz operation 3895 * information. 3896 */ 3897 freq = ieee80211_channel_to_frequency(he_6ghz_oper->primary, 3898 NL80211_BAND_6GHZ); 3899 he_chandef.chan = ieee80211_get_channel(sdata->local->hw.wiphy, freq); 3900 3901 switch (u8_get_bits(he_6ghz_oper->control, 3902 IEEE80211_HE_6GHZ_OPER_CTRL_REG_INFO)) { 3903 case IEEE80211_6GHZ_CTRL_REG_LPI_AP: 3904 bss_conf->power_type = IEEE80211_REG_LPI_AP; 3905 break; 3906 case IEEE80211_6GHZ_CTRL_REG_SP_AP: 3907 bss_conf->power_type = IEEE80211_REG_SP_AP; 3908 break; 3909 default: 3910 bss_conf->power_type = IEEE80211_REG_UNSET_AP; 3911 break; 3912 } 3913 3914 if (!eht_oper || 3915 !(eht_oper->params & IEEE80211_EHT_OPER_INFO_PRESENT)) { 3916 switch (u8_get_bits(he_6ghz_oper->control, 3917 IEEE80211_HE_6GHZ_OPER_CTRL_CHANWIDTH)) { 3918 case IEEE80211_HE_6GHZ_OPER_CTRL_CHANWIDTH_20MHZ: 3919 he_chandef.width = NL80211_CHAN_WIDTH_20; 3920 break; 3921 case IEEE80211_HE_6GHZ_OPER_CTRL_CHANWIDTH_40MHZ: 3922 he_chandef.width = NL80211_CHAN_WIDTH_40; 3923 break; 3924 case IEEE80211_HE_6GHZ_OPER_CTRL_CHANWIDTH_80MHZ: 3925 he_chandef.width = NL80211_CHAN_WIDTH_80; 3926 break; 3927 case IEEE80211_HE_6GHZ_OPER_CTRL_CHANWIDTH_160MHZ: 3928 he_chandef.width = NL80211_CHAN_WIDTH_80; 3929 if (!he_6ghz_oper->ccfs1) 3930 break; 3931 if (abs(he_6ghz_oper->ccfs1 - he_6ghz_oper->ccfs0) == 8) { 3932 if (support_160) 3933 he_chandef.width = NL80211_CHAN_WIDTH_160; 3934 } else { 3935 if (support_80_80) 3936 he_chandef.width = NL80211_CHAN_WIDTH_80P80; 3937 } 3938 break; 3939 } 3940 3941 if (he_chandef.width == NL80211_CHAN_WIDTH_160) { 3942 he_chandef.center_freq1 = 3943 ieee80211_channel_to_frequency(he_6ghz_oper->ccfs1, 3944 NL80211_BAND_6GHZ); 3945 } else { 3946 he_chandef.center_freq1 = 3947 ieee80211_channel_to_frequency(he_6ghz_oper->ccfs0, 3948 NL80211_BAND_6GHZ); 3949 if (support_80_80 || support_160) 3950 he_chandef.center_freq2 = 3951 ieee80211_channel_to_frequency(he_6ghz_oper->ccfs1, 3952 NL80211_BAND_6GHZ); 3953 } 3954 } else { 3955 eht_phy_cap = eht_cap->eht_cap_elem.phy_cap_info[0]; 3956 support_320 = 3957 eht_phy_cap & IEEE80211_EHT_PHY_CAP0_320MHZ_IN_6GHZ; 3958 3959 ieee80211_chandef_eht_oper((const void *)eht_oper->optional, 3960 support_160, support_320, 3961 &he_chandef); 3962 } 3963 3964 if (!cfg80211_chandef_valid(&he_chandef)) { 3965 sdata_info(sdata, 3966 "HE 6GHz operation resulted in invalid chandef: %d MHz/%d/%d MHz/%d MHz\n", 3967 he_chandef.chan ? he_chandef.chan->center_freq : 0, 3968 he_chandef.width, 3969 he_chandef.center_freq1, 3970 he_chandef.center_freq2); 3971 return false; 3972 } 3973 3974 *chandef = he_chandef; 3975 3976 return true; 3977 } 3978 3979 bool ieee80211_chandef_s1g_oper(const struct ieee80211_s1g_oper_ie *oper, 3980 struct cfg80211_chan_def *chandef) 3981 { 3982 u32 oper_freq; 3983 3984 if (!oper) 3985 return false; 3986 3987 switch (FIELD_GET(S1G_OPER_CH_WIDTH_OPER, oper->ch_width)) { 3988 case IEEE80211_S1G_CHANWIDTH_1MHZ: 3989 chandef->width = NL80211_CHAN_WIDTH_1; 3990 break; 3991 case IEEE80211_S1G_CHANWIDTH_2MHZ: 3992 chandef->width = NL80211_CHAN_WIDTH_2; 3993 break; 3994 case IEEE80211_S1G_CHANWIDTH_4MHZ: 3995 chandef->width = NL80211_CHAN_WIDTH_4; 3996 break; 3997 case IEEE80211_S1G_CHANWIDTH_8MHZ: 3998 chandef->width = NL80211_CHAN_WIDTH_8; 3999 break; 4000 case IEEE80211_S1G_CHANWIDTH_16MHZ: 4001 chandef->width = NL80211_CHAN_WIDTH_16; 4002 break; 4003 default: 4004 return false; 4005 } 4006 4007 oper_freq = ieee80211_channel_to_freq_khz(oper->oper_ch, 4008 NL80211_BAND_S1GHZ); 4009 chandef->center_freq1 = KHZ_TO_MHZ(oper_freq); 4010 chandef->freq1_offset = oper_freq % 1000; 4011 4012 return true; 4013 } 4014 4015 int ieee80211_parse_bitrates(enum nl80211_chan_width width, 4016 const struct ieee80211_supported_band *sband, 4017 const u8 *srates, int srates_len, u32 *rates) 4018 { 4019 u32 rate_flags = ieee80211_chanwidth_rate_flags(width); 4020 struct ieee80211_rate *br; 4021 int brate, rate, i, j, count = 0; 4022 4023 *rates = 0; 4024 4025 for (i = 0; i < srates_len; i++) { 4026 rate = srates[i] & 0x7f; 4027 4028 for (j = 0; j < sband->n_bitrates; j++) { 4029 br = &sband->bitrates[j]; 4030 if ((rate_flags & br->flags) != rate_flags) 4031 continue; 4032 4033 brate = DIV_ROUND_UP(br->bitrate, 5); 4034 if (brate == rate) { 4035 *rates |= BIT(j); 4036 count++; 4037 break; 4038 } 4039 } 4040 } 4041 return count; 4042 } 4043 4044 int ieee80211_add_srates_ie(struct ieee80211_sub_if_data *sdata, 4045 struct sk_buff *skb, bool need_basic, 4046 enum nl80211_band band) 4047 { 4048 struct ieee80211_local *local = sdata->local; 4049 struct ieee80211_supported_band *sband; 4050 int rate; 4051 u8 i, rates, *pos; 4052 u32 basic_rates = sdata->vif.bss_conf.basic_rates; 4053 u32 rate_flags; 4054 4055 rate_flags = ieee80211_chandef_rate_flags(&sdata->vif.bss_conf.chandef); 4056 sband = local->hw.wiphy->bands[band]; 4057 rates = 0; 4058 for (i = 0; i < sband->n_bitrates; i++) { 4059 if ((rate_flags & sband->bitrates[i].flags) != rate_flags) 4060 continue; 4061 rates++; 4062 } 4063 if (rates > 8) 4064 rates = 8; 4065 4066 if (skb_tailroom(skb) < rates + 2) 4067 return -ENOMEM; 4068 4069 pos = skb_put(skb, rates + 2); 4070 *pos++ = WLAN_EID_SUPP_RATES; 4071 *pos++ = rates; 4072 for (i = 0; i < rates; i++) { 4073 u8 basic = 0; 4074 if ((rate_flags & sband->bitrates[i].flags) != rate_flags) 4075 continue; 4076 4077 if (need_basic && basic_rates & BIT(i)) 4078 basic = 0x80; 4079 rate = DIV_ROUND_UP(sband->bitrates[i].bitrate, 5); 4080 *pos++ = basic | (u8) rate; 4081 } 4082 4083 return 0; 4084 } 4085 4086 int ieee80211_add_ext_srates_ie(struct ieee80211_sub_if_data *sdata, 4087 struct sk_buff *skb, bool need_basic, 4088 enum nl80211_band band) 4089 { 4090 struct ieee80211_local *local = sdata->local; 4091 struct ieee80211_supported_band *sband; 4092 int rate; 4093 u8 i, exrates, *pos; 4094 u32 basic_rates = sdata->vif.bss_conf.basic_rates; 4095 u32 rate_flags; 4096 4097 rate_flags = ieee80211_chandef_rate_flags(&sdata->vif.bss_conf.chandef); 4098 4099 sband = local->hw.wiphy->bands[band]; 4100 exrates = 0; 4101 for (i = 0; i < sband->n_bitrates; i++) { 4102 if ((rate_flags & sband->bitrates[i].flags) != rate_flags) 4103 continue; 4104 exrates++; 4105 } 4106 4107 if (exrates > 8) 4108 exrates -= 8; 4109 else 4110 exrates = 0; 4111 4112 if (skb_tailroom(skb) < exrates + 2) 4113 return -ENOMEM; 4114 4115 if (exrates) { 4116 pos = skb_put(skb, exrates + 2); 4117 *pos++ = WLAN_EID_EXT_SUPP_RATES; 4118 *pos++ = exrates; 4119 for (i = 8; i < sband->n_bitrates; i++) { 4120 u8 basic = 0; 4121 if ((rate_flags & sband->bitrates[i].flags) 4122 != rate_flags) 4123 continue; 4124 if (need_basic && basic_rates & BIT(i)) 4125 basic = 0x80; 4126 rate = DIV_ROUND_UP(sband->bitrates[i].bitrate, 5); 4127 *pos++ = basic | (u8) rate; 4128 } 4129 } 4130 return 0; 4131 } 4132 4133 int ieee80211_ave_rssi(struct ieee80211_vif *vif) 4134 { 4135 struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif); 4136 4137 if (WARN_ON_ONCE(sdata->vif.type != NL80211_IFTYPE_STATION)) 4138 return 0; 4139 4140 return -ewma_beacon_signal_read(&sdata->deflink.u.mgd.ave_beacon_signal); 4141 } 4142 EXPORT_SYMBOL_GPL(ieee80211_ave_rssi); 4143 4144 u8 ieee80211_mcs_to_chains(const struct ieee80211_mcs_info *mcs) 4145 { 4146 if (!mcs) 4147 return 1; 4148 4149 /* TODO: consider rx_highest */ 4150 4151 if (mcs->rx_mask[3]) 4152 return 4; 4153 if (mcs->rx_mask[2]) 4154 return 3; 4155 if (mcs->rx_mask[1]) 4156 return 2; 4157 return 1; 4158 } 4159 4160 /** 4161 * ieee80211_calculate_rx_timestamp - calculate timestamp in frame 4162 * @local: mac80211 hw info struct 4163 * @status: RX status 4164 * @mpdu_len: total MPDU length (including FCS) 4165 * @mpdu_offset: offset into MPDU to calculate timestamp at 4166 * 4167 * This function calculates the RX timestamp at the given MPDU offset, taking 4168 * into account what the RX timestamp was. An offset of 0 will just normalize 4169 * the timestamp to TSF at beginning of MPDU reception. 4170 * 4171 * Returns: the calculated timestamp 4172 */ 4173 u64 ieee80211_calculate_rx_timestamp(struct ieee80211_local *local, 4174 struct ieee80211_rx_status *status, 4175 unsigned int mpdu_len, 4176 unsigned int mpdu_offset) 4177 { 4178 u64 ts = status->mactime; 4179 bool mactime_plcp_start; 4180 struct rate_info ri; 4181 u16 rate; 4182 u8 n_ltf; 4183 4184 if (WARN_ON(!ieee80211_have_rx_timestamp(status))) 4185 return 0; 4186 4187 mactime_plcp_start = (status->flag & RX_FLAG_MACTIME) == 4188 RX_FLAG_MACTIME_PLCP_START; 4189 4190 memset(&ri, 0, sizeof(ri)); 4191 4192 ri.bw = status->bw; 4193 4194 /* Fill cfg80211 rate info */ 4195 switch (status->encoding) { 4196 case RX_ENC_EHT: 4197 ri.flags |= RATE_INFO_FLAGS_EHT_MCS; 4198 ri.mcs = status->rate_idx; 4199 ri.nss = status->nss; 4200 ri.eht_ru_alloc = status->eht.ru; 4201 if (status->enc_flags & RX_ENC_FLAG_SHORT_GI) 4202 ri.flags |= RATE_INFO_FLAGS_SHORT_GI; 4203 /* TODO/FIXME: is this right? handle other PPDUs */ 4204 if (mactime_plcp_start) { 4205 mpdu_offset += 2; 4206 ts += 36; 4207 } 4208 break; 4209 case RX_ENC_HE: 4210 ri.flags |= RATE_INFO_FLAGS_HE_MCS; 4211 ri.mcs = status->rate_idx; 4212 ri.nss = status->nss; 4213 ri.he_ru_alloc = status->he_ru; 4214 if (status->enc_flags & RX_ENC_FLAG_SHORT_GI) 4215 ri.flags |= RATE_INFO_FLAGS_SHORT_GI; 4216 4217 /* 4218 * See P802.11ax_D6.0, section 27.3.4 for 4219 * VHT PPDU format. 4220 */ 4221 if (mactime_plcp_start) { 4222 mpdu_offset += 2; 4223 ts += 36; 4224 4225 /* 4226 * TODO: 4227 * For HE MU PPDU, add the HE-SIG-B. 4228 * For HE ER PPDU, add 8us for the HE-SIG-A. 4229 * For HE TB PPDU, add 4us for the HE-STF. 4230 * Add the HE-LTF durations - variable. 4231 */ 4232 } 4233 4234 break; 4235 case RX_ENC_HT: 4236 ri.mcs = status->rate_idx; 4237 ri.flags |= RATE_INFO_FLAGS_MCS; 4238 if (status->enc_flags & RX_ENC_FLAG_SHORT_GI) 4239 ri.flags |= RATE_INFO_FLAGS_SHORT_GI; 4240 4241 /* 4242 * See P802.11REVmd_D3.0, section 19.3.2 for 4243 * HT PPDU format. 4244 */ 4245 if (mactime_plcp_start) { 4246 mpdu_offset += 2; 4247 if (status->enc_flags & RX_ENC_FLAG_HT_GF) 4248 ts += 24; 4249 else 4250 ts += 32; 4251 4252 /* 4253 * Add Data HT-LTFs per streams 4254 * TODO: add Extension HT-LTFs, 4us per LTF 4255 */ 4256 n_ltf = ((ri.mcs >> 3) & 3) + 1; 4257 n_ltf = n_ltf == 3 ? 4 : n_ltf; 4258 ts += n_ltf * 4; 4259 } 4260 4261 break; 4262 case RX_ENC_VHT: 4263 ri.flags |= RATE_INFO_FLAGS_VHT_MCS; 4264 ri.mcs = status->rate_idx; 4265 ri.nss = status->nss; 4266 if (status->enc_flags & RX_ENC_FLAG_SHORT_GI) 4267 ri.flags |= RATE_INFO_FLAGS_SHORT_GI; 4268 4269 /* 4270 * See P802.11REVmd_D3.0, section 21.3.2 for 4271 * VHT PPDU format. 4272 */ 4273 if (mactime_plcp_start) { 4274 mpdu_offset += 2; 4275 ts += 36; 4276 4277 /* 4278 * Add VHT-LTFs per streams 4279 */ 4280 n_ltf = (ri.nss != 1) && (ri.nss % 2) ? 4281 ri.nss + 1 : ri.nss; 4282 ts += 4 * n_ltf; 4283 } 4284 4285 break; 4286 default: 4287 WARN_ON(1); 4288 fallthrough; 4289 case RX_ENC_LEGACY: { 4290 struct ieee80211_supported_band *sband; 4291 4292 sband = local->hw.wiphy->bands[status->band]; 4293 ri.legacy = sband->bitrates[status->rate_idx].bitrate; 4294 4295 if (mactime_plcp_start) { 4296 if (status->band == NL80211_BAND_5GHZ) { 4297 ts += 20; 4298 mpdu_offset += 2; 4299 } else if (status->enc_flags & RX_ENC_FLAG_SHORTPRE) { 4300 ts += 96; 4301 } else { 4302 ts += 192; 4303 } 4304 } 4305 break; 4306 } 4307 } 4308 4309 rate = cfg80211_calculate_bitrate(&ri); 4310 if (WARN_ONCE(!rate, 4311 "Invalid bitrate: flags=0x%llx, idx=%d, vht_nss=%d\n", 4312 (unsigned long long)status->flag, status->rate_idx, 4313 status->nss)) 4314 return 0; 4315 4316 /* rewind from end of MPDU */ 4317 if ((status->flag & RX_FLAG_MACTIME) == RX_FLAG_MACTIME_END) 4318 ts -= mpdu_len * 8 * 10 / rate; 4319 4320 ts += mpdu_offset * 8 * 10 / rate; 4321 4322 return ts; 4323 } 4324 4325 void ieee80211_dfs_cac_cancel(struct ieee80211_local *local) 4326 { 4327 struct ieee80211_sub_if_data *sdata; 4328 struct cfg80211_chan_def chandef; 4329 4330 lockdep_assert_wiphy(local->hw.wiphy); 4331 4332 list_for_each_entry(sdata, &local->interfaces, list) { 4333 /* it might be waiting for the local->mtx, but then 4334 * by the time it gets it, sdata->wdev.cac_started 4335 * will no longer be true 4336 */ 4337 wiphy_delayed_work_cancel(local->hw.wiphy, 4338 &sdata->deflink.dfs_cac_timer_work); 4339 4340 if (sdata->wdev.cac_started) { 4341 chandef = sdata->vif.bss_conf.chandef; 4342 ieee80211_link_release_channel(&sdata->deflink); 4343 cfg80211_cac_event(sdata->dev, 4344 &chandef, 4345 NL80211_RADAR_CAC_ABORTED, 4346 GFP_KERNEL); 4347 } 4348 } 4349 } 4350 4351 void ieee80211_dfs_radar_detected_work(struct wiphy *wiphy, 4352 struct wiphy_work *work) 4353 { 4354 struct ieee80211_local *local = 4355 container_of(work, struct ieee80211_local, radar_detected_work); 4356 struct cfg80211_chan_def chandef = local->hw.conf.chandef; 4357 struct ieee80211_chanctx *ctx; 4358 int num_chanctx = 0; 4359 4360 lockdep_assert_wiphy(local->hw.wiphy); 4361 4362 list_for_each_entry(ctx, &local->chanctx_list, list) { 4363 if (ctx->replace_state == IEEE80211_CHANCTX_REPLACES_OTHER) 4364 continue; 4365 4366 num_chanctx++; 4367 chandef = ctx->conf.def; 4368 } 4369 4370 ieee80211_dfs_cac_cancel(local); 4371 4372 if (num_chanctx > 1) 4373 /* XXX: multi-channel is not supported yet */ 4374 WARN_ON(1); 4375 else 4376 cfg80211_radar_event(local->hw.wiphy, &chandef, GFP_KERNEL); 4377 } 4378 4379 void ieee80211_radar_detected(struct ieee80211_hw *hw) 4380 { 4381 struct ieee80211_local *local = hw_to_local(hw); 4382 4383 trace_api_radar_detected(local); 4384 4385 wiphy_work_queue(hw->wiphy, &local->radar_detected_work); 4386 } 4387 EXPORT_SYMBOL(ieee80211_radar_detected); 4388 4389 ieee80211_conn_flags_t ieee80211_chandef_downgrade(struct cfg80211_chan_def *c) 4390 { 4391 ieee80211_conn_flags_t ret; 4392 int tmp; 4393 4394 switch (c->width) { 4395 case NL80211_CHAN_WIDTH_20: 4396 c->width = NL80211_CHAN_WIDTH_20_NOHT; 4397 ret = IEEE80211_CONN_DISABLE_HT | IEEE80211_CONN_DISABLE_VHT; 4398 break; 4399 case NL80211_CHAN_WIDTH_40: 4400 c->width = NL80211_CHAN_WIDTH_20; 4401 c->center_freq1 = c->chan->center_freq; 4402 ret = IEEE80211_CONN_DISABLE_40MHZ | 4403 IEEE80211_CONN_DISABLE_VHT; 4404 break; 4405 case NL80211_CHAN_WIDTH_80: 4406 tmp = (30 + c->chan->center_freq - c->center_freq1)/20; 4407 /* n_P40 */ 4408 tmp /= 2; 4409 /* freq_P40 */ 4410 c->center_freq1 = c->center_freq1 - 20 + 40 * tmp; 4411 c->width = NL80211_CHAN_WIDTH_40; 4412 ret = IEEE80211_CONN_DISABLE_VHT; 4413 break; 4414 case NL80211_CHAN_WIDTH_80P80: 4415 c->center_freq2 = 0; 4416 c->width = NL80211_CHAN_WIDTH_80; 4417 ret = IEEE80211_CONN_DISABLE_80P80MHZ | 4418 IEEE80211_CONN_DISABLE_160MHZ; 4419 break; 4420 case NL80211_CHAN_WIDTH_160: 4421 /* n_P20 */ 4422 tmp = (70 + c->chan->center_freq - c->center_freq1)/20; 4423 /* n_P80 */ 4424 tmp /= 4; 4425 c->center_freq1 = c->center_freq1 - 40 + 80 * tmp; 4426 c->width = NL80211_CHAN_WIDTH_80; 4427 ret = IEEE80211_CONN_DISABLE_80P80MHZ | 4428 IEEE80211_CONN_DISABLE_160MHZ; 4429 break; 4430 case NL80211_CHAN_WIDTH_320: 4431 /* n_P20 */ 4432 tmp = (150 + c->chan->center_freq - c->center_freq1) / 20; 4433 /* n_P160 */ 4434 tmp /= 8; 4435 c->center_freq1 = c->center_freq1 - 80 + 160 * tmp; 4436 c->width = NL80211_CHAN_WIDTH_160; 4437 ret = IEEE80211_CONN_DISABLE_320MHZ; 4438 break; 4439 default: 4440 case NL80211_CHAN_WIDTH_20_NOHT: 4441 WARN_ON_ONCE(1); 4442 c->width = NL80211_CHAN_WIDTH_20_NOHT; 4443 ret = IEEE80211_CONN_DISABLE_HT | IEEE80211_CONN_DISABLE_VHT; 4444 break; 4445 case NL80211_CHAN_WIDTH_1: 4446 case NL80211_CHAN_WIDTH_2: 4447 case NL80211_CHAN_WIDTH_4: 4448 case NL80211_CHAN_WIDTH_8: 4449 case NL80211_CHAN_WIDTH_16: 4450 case NL80211_CHAN_WIDTH_5: 4451 case NL80211_CHAN_WIDTH_10: 4452 WARN_ON_ONCE(1); 4453 /* keep c->width */ 4454 ret = IEEE80211_CONN_DISABLE_HT | IEEE80211_CONN_DISABLE_VHT; 4455 break; 4456 } 4457 4458 WARN_ON_ONCE(!cfg80211_chandef_valid(c)); 4459 4460 return ret; 4461 } 4462 4463 /* 4464 * Returns true if smps_mode_new is strictly more restrictive than 4465 * smps_mode_old. 4466 */ 4467 bool ieee80211_smps_is_restrictive(enum ieee80211_smps_mode smps_mode_old, 4468 enum ieee80211_smps_mode smps_mode_new) 4469 { 4470 if (WARN_ON_ONCE(smps_mode_old == IEEE80211_SMPS_AUTOMATIC || 4471 smps_mode_new == IEEE80211_SMPS_AUTOMATIC)) 4472 return false; 4473 4474 switch (smps_mode_old) { 4475 case IEEE80211_SMPS_STATIC: 4476 return false; 4477 case IEEE80211_SMPS_DYNAMIC: 4478 return smps_mode_new == IEEE80211_SMPS_STATIC; 4479 case IEEE80211_SMPS_OFF: 4480 return smps_mode_new != IEEE80211_SMPS_OFF; 4481 default: 4482 WARN_ON(1); 4483 } 4484 4485 return false; 4486 } 4487 4488 int ieee80211_send_action_csa(struct ieee80211_sub_if_data *sdata, 4489 struct cfg80211_csa_settings *csa_settings) 4490 { 4491 struct sk_buff *skb; 4492 struct ieee80211_mgmt *mgmt; 4493 struct ieee80211_local *local = sdata->local; 4494 int freq; 4495 int hdr_len = offsetofend(struct ieee80211_mgmt, 4496 u.action.u.chan_switch); 4497 u8 *pos; 4498 4499 if (sdata->vif.type != NL80211_IFTYPE_ADHOC && 4500 sdata->vif.type != NL80211_IFTYPE_MESH_POINT) 4501 return -EOPNOTSUPP; 4502 4503 skb = dev_alloc_skb(local->tx_headroom + hdr_len + 4504 5 + /* channel switch announcement element */ 4505 3 + /* secondary channel offset element */ 4506 5 + /* wide bandwidth channel switch announcement */ 4507 8); /* mesh channel switch parameters element */ 4508 if (!skb) 4509 return -ENOMEM; 4510 4511 skb_reserve(skb, local->tx_headroom); 4512 mgmt = skb_put_zero(skb, hdr_len); 4513 mgmt->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT | 4514 IEEE80211_STYPE_ACTION); 4515 4516 eth_broadcast_addr(mgmt->da); 4517 memcpy(mgmt->sa, sdata->vif.addr, ETH_ALEN); 4518 if (ieee80211_vif_is_mesh(&sdata->vif)) { 4519 memcpy(mgmt->bssid, sdata->vif.addr, ETH_ALEN); 4520 } else { 4521 struct ieee80211_if_ibss *ifibss = &sdata->u.ibss; 4522 memcpy(mgmt->bssid, ifibss->bssid, ETH_ALEN); 4523 } 4524 mgmt->u.action.category = WLAN_CATEGORY_SPECTRUM_MGMT; 4525 mgmt->u.action.u.chan_switch.action_code = WLAN_ACTION_SPCT_CHL_SWITCH; 4526 pos = skb_put(skb, 5); 4527 *pos++ = WLAN_EID_CHANNEL_SWITCH; /* EID */ 4528 *pos++ = 3; /* IE length */ 4529 *pos++ = csa_settings->block_tx ? 1 : 0; /* CSA mode */ 4530 freq = csa_settings->chandef.chan->center_freq; 4531 *pos++ = ieee80211_frequency_to_channel(freq); /* channel */ 4532 *pos++ = csa_settings->count; /* count */ 4533 4534 if (csa_settings->chandef.width == NL80211_CHAN_WIDTH_40) { 4535 enum nl80211_channel_type ch_type; 4536 4537 skb_put(skb, 3); 4538 *pos++ = WLAN_EID_SECONDARY_CHANNEL_OFFSET; /* EID */ 4539 *pos++ = 1; /* IE length */ 4540 ch_type = cfg80211_get_chandef_type(&csa_settings->chandef); 4541 if (ch_type == NL80211_CHAN_HT40PLUS) 4542 *pos++ = IEEE80211_HT_PARAM_CHA_SEC_ABOVE; 4543 else 4544 *pos++ = IEEE80211_HT_PARAM_CHA_SEC_BELOW; 4545 } 4546 4547 if (ieee80211_vif_is_mesh(&sdata->vif)) { 4548 struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh; 4549 4550 skb_put(skb, 8); 4551 *pos++ = WLAN_EID_CHAN_SWITCH_PARAM; /* EID */ 4552 *pos++ = 6; /* IE length */ 4553 *pos++ = sdata->u.mesh.mshcfg.dot11MeshTTL; /* Mesh TTL */ 4554 *pos = 0x00; /* Mesh Flag: Tx Restrict, Initiator, Reason */ 4555 *pos |= WLAN_EID_CHAN_SWITCH_PARAM_INITIATOR; 4556 *pos++ |= csa_settings->block_tx ? 4557 WLAN_EID_CHAN_SWITCH_PARAM_TX_RESTRICT : 0x00; 4558 put_unaligned_le16(WLAN_REASON_MESH_CHAN, pos); /* Reason Cd */ 4559 pos += 2; 4560 put_unaligned_le16(ifmsh->pre_value, pos);/* Precedence Value */ 4561 pos += 2; 4562 } 4563 4564 if (csa_settings->chandef.width == NL80211_CHAN_WIDTH_80 || 4565 csa_settings->chandef.width == NL80211_CHAN_WIDTH_80P80 || 4566 csa_settings->chandef.width == NL80211_CHAN_WIDTH_160) { 4567 skb_put(skb, 5); 4568 ieee80211_ie_build_wide_bw_cs(pos, &csa_settings->chandef); 4569 } 4570 4571 ieee80211_tx_skb(sdata, skb); 4572 return 0; 4573 } 4574 4575 static bool 4576 ieee80211_extend_noa_desc(struct ieee80211_noa_data *data, u32 tsf, int i) 4577 { 4578 s32 end = data->desc[i].start + data->desc[i].duration - (tsf + 1); 4579 int skip; 4580 4581 if (end > 0) 4582 return false; 4583 4584 /* One shot NOA */ 4585 if (data->count[i] == 1) 4586 return false; 4587 4588 if (data->desc[i].interval == 0) 4589 return false; 4590 4591 /* End time is in the past, check for repetitions */ 4592 skip = DIV_ROUND_UP(-end, data->desc[i].interval); 4593 if (data->count[i] < 255) { 4594 if (data->count[i] <= skip) { 4595 data->count[i] = 0; 4596 return false; 4597 } 4598 4599 data->count[i] -= skip; 4600 } 4601 4602 data->desc[i].start += skip * data->desc[i].interval; 4603 4604 return true; 4605 } 4606 4607 static bool 4608 ieee80211_extend_absent_time(struct ieee80211_noa_data *data, u32 tsf, 4609 s32 *offset) 4610 { 4611 bool ret = false; 4612 int i; 4613 4614 for (i = 0; i < IEEE80211_P2P_NOA_DESC_MAX; i++) { 4615 s32 cur; 4616 4617 if (!data->count[i]) 4618 continue; 4619 4620 if (ieee80211_extend_noa_desc(data, tsf + *offset, i)) 4621 ret = true; 4622 4623 cur = data->desc[i].start - tsf; 4624 if (cur > *offset) 4625 continue; 4626 4627 cur = data->desc[i].start + data->desc[i].duration - tsf; 4628 if (cur > *offset) 4629 *offset = cur; 4630 } 4631 4632 return ret; 4633 } 4634 4635 static u32 4636 ieee80211_get_noa_absent_time(struct ieee80211_noa_data *data, u32 tsf) 4637 { 4638 s32 offset = 0; 4639 int tries = 0; 4640 /* 4641 * arbitrary limit, used to avoid infinite loops when combined NoA 4642 * descriptors cover the full time period. 4643 */ 4644 int max_tries = 5; 4645 4646 ieee80211_extend_absent_time(data, tsf, &offset); 4647 do { 4648 if (!ieee80211_extend_absent_time(data, tsf, &offset)) 4649 break; 4650 4651 tries++; 4652 } while (tries < max_tries); 4653 4654 return offset; 4655 } 4656 4657 void ieee80211_update_p2p_noa(struct ieee80211_noa_data *data, u32 tsf) 4658 { 4659 u32 next_offset = BIT(31) - 1; 4660 int i; 4661 4662 data->absent = 0; 4663 data->has_next_tsf = false; 4664 for (i = 0; i < IEEE80211_P2P_NOA_DESC_MAX; i++) { 4665 s32 start; 4666 4667 if (!data->count[i]) 4668 continue; 4669 4670 ieee80211_extend_noa_desc(data, tsf, i); 4671 start = data->desc[i].start - tsf; 4672 if (start <= 0) 4673 data->absent |= BIT(i); 4674 4675 if (next_offset > start) 4676 next_offset = start; 4677 4678 data->has_next_tsf = true; 4679 } 4680 4681 if (data->absent) 4682 next_offset = ieee80211_get_noa_absent_time(data, tsf); 4683 4684 data->next_tsf = tsf + next_offset; 4685 } 4686 EXPORT_SYMBOL(ieee80211_update_p2p_noa); 4687 4688 int ieee80211_parse_p2p_noa(const struct ieee80211_p2p_noa_attr *attr, 4689 struct ieee80211_noa_data *data, u32 tsf) 4690 { 4691 int ret = 0; 4692 int i; 4693 4694 memset(data, 0, sizeof(*data)); 4695 4696 for (i = 0; i < IEEE80211_P2P_NOA_DESC_MAX; i++) { 4697 const struct ieee80211_p2p_noa_desc *desc = &attr->desc[i]; 4698 4699 if (!desc->count || !desc->duration) 4700 continue; 4701 4702 data->count[i] = desc->count; 4703 data->desc[i].start = le32_to_cpu(desc->start_time); 4704 data->desc[i].duration = le32_to_cpu(desc->duration); 4705 data->desc[i].interval = le32_to_cpu(desc->interval); 4706 4707 if (data->count[i] > 1 && 4708 data->desc[i].interval < data->desc[i].duration) 4709 continue; 4710 4711 ieee80211_extend_noa_desc(data, tsf, i); 4712 ret++; 4713 } 4714 4715 if (ret) 4716 ieee80211_update_p2p_noa(data, tsf); 4717 4718 return ret; 4719 } 4720 EXPORT_SYMBOL(ieee80211_parse_p2p_noa); 4721 4722 void ieee80211_recalc_dtim(struct ieee80211_local *local, 4723 struct ieee80211_sub_if_data *sdata) 4724 { 4725 u64 tsf = drv_get_tsf(local, sdata); 4726 u64 dtim_count = 0; 4727 u16 beacon_int = sdata->vif.bss_conf.beacon_int * 1024; 4728 u8 dtim_period = sdata->vif.bss_conf.dtim_period; 4729 struct ps_data *ps; 4730 u8 bcns_from_dtim; 4731 4732 if (tsf == -1ULL || !beacon_int || !dtim_period) 4733 return; 4734 4735 if (sdata->vif.type == NL80211_IFTYPE_AP || 4736 sdata->vif.type == NL80211_IFTYPE_AP_VLAN) { 4737 if (!sdata->bss) 4738 return; 4739 4740 ps = &sdata->bss->ps; 4741 } else if (ieee80211_vif_is_mesh(&sdata->vif)) { 4742 ps = &sdata->u.mesh.ps; 4743 } else { 4744 return; 4745 } 4746 4747 /* 4748 * actually finds last dtim_count, mac80211 will update in 4749 * __beacon_add_tim(). 4750 * dtim_count = dtim_period - (tsf / bcn_int) % dtim_period 4751 */ 4752 do_div(tsf, beacon_int); 4753 bcns_from_dtim = do_div(tsf, dtim_period); 4754 /* just had a DTIM */ 4755 if (!bcns_from_dtim) 4756 dtim_count = 0; 4757 else 4758 dtim_count = dtim_period - bcns_from_dtim; 4759 4760 ps->dtim_count = dtim_count; 4761 } 4762 4763 static u8 ieee80211_chanctx_radar_detect(struct ieee80211_local *local, 4764 struct ieee80211_chanctx *ctx) 4765 { 4766 struct ieee80211_link_data *link; 4767 u8 radar_detect = 0; 4768 4769 lockdep_assert_wiphy(local->hw.wiphy); 4770 4771 if (WARN_ON(ctx->replace_state == IEEE80211_CHANCTX_WILL_BE_REPLACED)) 4772 return 0; 4773 4774 list_for_each_entry(link, &ctx->reserved_links, reserved_chanctx_list) 4775 if (link->reserved_radar_required) 4776 radar_detect |= BIT(link->reserved_chandef.width); 4777 4778 /* 4779 * An in-place reservation context should not have any assigned vifs 4780 * until it replaces the other context. 4781 */ 4782 WARN_ON(ctx->replace_state == IEEE80211_CHANCTX_REPLACES_OTHER && 4783 !list_empty(&ctx->assigned_links)); 4784 4785 list_for_each_entry(link, &ctx->assigned_links, assigned_chanctx_list) { 4786 if (!link->radar_required) 4787 continue; 4788 4789 radar_detect |= 4790 BIT(link->conf->chandef.width); 4791 } 4792 4793 return radar_detect; 4794 } 4795 4796 int ieee80211_check_combinations(struct ieee80211_sub_if_data *sdata, 4797 const struct cfg80211_chan_def *chandef, 4798 enum ieee80211_chanctx_mode chanmode, 4799 u8 radar_detect) 4800 { 4801 struct ieee80211_local *local = sdata->local; 4802 struct ieee80211_sub_if_data *sdata_iter; 4803 enum nl80211_iftype iftype = sdata->wdev.iftype; 4804 struct ieee80211_chanctx *ctx; 4805 int total = 1; 4806 struct iface_combination_params params = { 4807 .radar_detect = radar_detect, 4808 }; 4809 4810 lockdep_assert_wiphy(local->hw.wiphy); 4811 4812 if (WARN_ON(hweight32(radar_detect) > 1)) 4813 return -EINVAL; 4814 4815 if (WARN_ON(chandef && chanmode == IEEE80211_CHANCTX_SHARED && 4816 !chandef->chan)) 4817 return -EINVAL; 4818 4819 if (WARN_ON(iftype >= NUM_NL80211_IFTYPES)) 4820 return -EINVAL; 4821 4822 if (sdata->vif.type == NL80211_IFTYPE_AP || 4823 sdata->vif.type == NL80211_IFTYPE_MESH_POINT) { 4824 /* 4825 * always passing this is harmless, since it'll be the 4826 * same value that cfg80211 finds if it finds the same 4827 * interface ... and that's always allowed 4828 */ 4829 params.new_beacon_int = sdata->vif.bss_conf.beacon_int; 4830 } 4831 4832 /* Always allow software iftypes */ 4833 if (cfg80211_iftype_allowed(local->hw.wiphy, iftype, 0, 1)) { 4834 if (radar_detect) 4835 return -EINVAL; 4836 return 0; 4837 } 4838 4839 if (chandef) 4840 params.num_different_channels = 1; 4841 4842 if (iftype != NL80211_IFTYPE_UNSPECIFIED) 4843 params.iftype_num[iftype] = 1; 4844 4845 list_for_each_entry(ctx, &local->chanctx_list, list) { 4846 if (ctx->replace_state == IEEE80211_CHANCTX_WILL_BE_REPLACED) 4847 continue; 4848 params.radar_detect |= 4849 ieee80211_chanctx_radar_detect(local, ctx); 4850 if (ctx->mode == IEEE80211_CHANCTX_EXCLUSIVE) { 4851 params.num_different_channels++; 4852 continue; 4853 } 4854 if (chandef && chanmode == IEEE80211_CHANCTX_SHARED && 4855 cfg80211_chandef_compatible(chandef, 4856 &ctx->conf.def)) 4857 continue; 4858 params.num_different_channels++; 4859 } 4860 4861 list_for_each_entry_rcu(sdata_iter, &local->interfaces, list) { 4862 struct wireless_dev *wdev_iter; 4863 4864 wdev_iter = &sdata_iter->wdev; 4865 4866 if (sdata_iter == sdata || 4867 !ieee80211_sdata_running(sdata_iter) || 4868 cfg80211_iftype_allowed(local->hw.wiphy, 4869 wdev_iter->iftype, 0, 1)) 4870 continue; 4871 4872 params.iftype_num[wdev_iter->iftype]++; 4873 total++; 4874 } 4875 4876 if (total == 1 && !params.radar_detect) 4877 return 0; 4878 4879 return cfg80211_check_combinations(local->hw.wiphy, ¶ms); 4880 } 4881 4882 static void 4883 ieee80211_iter_max_chans(const struct ieee80211_iface_combination *c, 4884 void *data) 4885 { 4886 u32 *max_num_different_channels = data; 4887 4888 *max_num_different_channels = max(*max_num_different_channels, 4889 c->num_different_channels); 4890 } 4891 4892 int ieee80211_max_num_channels(struct ieee80211_local *local) 4893 { 4894 struct ieee80211_sub_if_data *sdata; 4895 struct ieee80211_chanctx *ctx; 4896 u32 max_num_different_channels = 1; 4897 int err; 4898 struct iface_combination_params params = {0}; 4899 4900 lockdep_assert_wiphy(local->hw.wiphy); 4901 4902 list_for_each_entry(ctx, &local->chanctx_list, list) { 4903 if (ctx->replace_state == IEEE80211_CHANCTX_WILL_BE_REPLACED) 4904 continue; 4905 4906 params.num_different_channels++; 4907 4908 params.radar_detect |= 4909 ieee80211_chanctx_radar_detect(local, ctx); 4910 } 4911 4912 list_for_each_entry_rcu(sdata, &local->interfaces, list) 4913 params.iftype_num[sdata->wdev.iftype]++; 4914 4915 err = cfg80211_iter_combinations(local->hw.wiphy, ¶ms, 4916 ieee80211_iter_max_chans, 4917 &max_num_different_channels); 4918 if (err < 0) 4919 return err; 4920 4921 return max_num_different_channels; 4922 } 4923 4924 void ieee80211_add_s1g_capab_ie(struct ieee80211_sub_if_data *sdata, 4925 struct ieee80211_sta_s1g_cap *caps, 4926 struct sk_buff *skb) 4927 { 4928 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; 4929 struct ieee80211_s1g_cap s1g_capab; 4930 u8 *pos; 4931 int i; 4932 4933 if (WARN_ON(sdata->vif.type != NL80211_IFTYPE_STATION)) 4934 return; 4935 4936 if (!caps->s1g) 4937 return; 4938 4939 memcpy(s1g_capab.capab_info, caps->cap, sizeof(caps->cap)); 4940 memcpy(s1g_capab.supp_mcs_nss, caps->nss_mcs, sizeof(caps->nss_mcs)); 4941 4942 /* override the capability info */ 4943 for (i = 0; i < sizeof(ifmgd->s1g_capa.capab_info); i++) { 4944 u8 mask = ifmgd->s1g_capa_mask.capab_info[i]; 4945 4946 s1g_capab.capab_info[i] &= ~mask; 4947 s1g_capab.capab_info[i] |= ifmgd->s1g_capa.capab_info[i] & mask; 4948 } 4949 4950 /* then MCS and NSS set */ 4951 for (i = 0; i < sizeof(ifmgd->s1g_capa.supp_mcs_nss); i++) { 4952 u8 mask = ifmgd->s1g_capa_mask.supp_mcs_nss[i]; 4953 4954 s1g_capab.supp_mcs_nss[i] &= ~mask; 4955 s1g_capab.supp_mcs_nss[i] |= 4956 ifmgd->s1g_capa.supp_mcs_nss[i] & mask; 4957 } 4958 4959 pos = skb_put(skb, 2 + sizeof(s1g_capab)); 4960 *pos++ = WLAN_EID_S1G_CAPABILITIES; 4961 *pos++ = sizeof(s1g_capab); 4962 4963 memcpy(pos, &s1g_capab, sizeof(s1g_capab)); 4964 } 4965 4966 void ieee80211_add_aid_request_ie(struct ieee80211_sub_if_data *sdata, 4967 struct sk_buff *skb) 4968 { 4969 u8 *pos = skb_put(skb, 3); 4970 4971 *pos++ = WLAN_EID_AID_REQUEST; 4972 *pos++ = 1; 4973 *pos++ = 0; 4974 } 4975 4976 u8 *ieee80211_add_wmm_info_ie(u8 *buf, u8 qosinfo) 4977 { 4978 *buf++ = WLAN_EID_VENDOR_SPECIFIC; 4979 *buf++ = 7; /* len */ 4980 *buf++ = 0x00; /* Microsoft OUI 00:50:F2 */ 4981 *buf++ = 0x50; 4982 *buf++ = 0xf2; 4983 *buf++ = 2; /* WME */ 4984 *buf++ = 0; /* WME info */ 4985 *buf++ = 1; /* WME ver */ 4986 *buf++ = qosinfo; /* U-APSD no in use */ 4987 4988 return buf; 4989 } 4990 4991 void ieee80211_txq_get_depth(struct ieee80211_txq *txq, 4992 unsigned long *frame_cnt, 4993 unsigned long *byte_cnt) 4994 { 4995 struct txq_info *txqi = to_txq_info(txq); 4996 u32 frag_cnt = 0, frag_bytes = 0; 4997 struct sk_buff *skb; 4998 4999 skb_queue_walk(&txqi->frags, skb) { 5000 frag_cnt++; 5001 frag_bytes += skb->len; 5002 } 5003 5004 if (frame_cnt) 5005 *frame_cnt = txqi->tin.backlog_packets + frag_cnt; 5006 5007 if (byte_cnt) 5008 *byte_cnt = txqi->tin.backlog_bytes + frag_bytes; 5009 } 5010 EXPORT_SYMBOL(ieee80211_txq_get_depth); 5011 5012 const u8 ieee80211_ac_to_qos_mask[IEEE80211_NUM_ACS] = { 5013 IEEE80211_WMM_IE_STA_QOSINFO_AC_VO, 5014 IEEE80211_WMM_IE_STA_QOSINFO_AC_VI, 5015 IEEE80211_WMM_IE_STA_QOSINFO_AC_BE, 5016 IEEE80211_WMM_IE_STA_QOSINFO_AC_BK 5017 }; 5018 5019 u16 ieee80211_encode_usf(int listen_interval) 5020 { 5021 static const int listen_int_usf[] = { 1, 10, 1000, 10000 }; 5022 u16 ui, usf = 0; 5023 5024 /* find greatest USF */ 5025 while (usf < IEEE80211_MAX_USF) { 5026 if (listen_interval % listen_int_usf[usf + 1]) 5027 break; 5028 usf += 1; 5029 } 5030 ui = listen_interval / listen_int_usf[usf]; 5031 5032 /* error if there is a remainder. Should've been checked by user */ 5033 WARN_ON_ONCE(ui > IEEE80211_MAX_UI); 5034 listen_interval = FIELD_PREP(LISTEN_INT_USF, usf) | 5035 FIELD_PREP(LISTEN_INT_UI, ui); 5036 5037 return (u16) listen_interval; 5038 } 5039 5040 u8 ieee80211_ie_len_eht_cap(struct ieee80211_sub_if_data *sdata, u8 iftype) 5041 { 5042 const struct ieee80211_sta_he_cap *he_cap; 5043 const struct ieee80211_sta_eht_cap *eht_cap; 5044 struct ieee80211_supported_band *sband; 5045 bool is_ap; 5046 u8 n; 5047 5048 sband = ieee80211_get_sband(sdata); 5049 if (!sband) 5050 return 0; 5051 5052 he_cap = ieee80211_get_he_iftype_cap(sband, iftype); 5053 eht_cap = ieee80211_get_eht_iftype_cap(sband, iftype); 5054 if (!he_cap || !eht_cap) 5055 return 0; 5056 5057 is_ap = iftype == NL80211_IFTYPE_AP || 5058 iftype == NL80211_IFTYPE_P2P_GO; 5059 5060 n = ieee80211_eht_mcs_nss_size(&he_cap->he_cap_elem, 5061 &eht_cap->eht_cap_elem, 5062 is_ap); 5063 return 2 + 1 + 5064 sizeof(eht_cap->eht_cap_elem) + n + 5065 ieee80211_eht_ppe_size(eht_cap->eht_ppe_thres[0], 5066 eht_cap->eht_cap_elem.phy_cap_info); 5067 return 0; 5068 } 5069 5070 u8 *ieee80211_ie_build_eht_cap(u8 *pos, 5071 const struct ieee80211_sta_he_cap *he_cap, 5072 const struct ieee80211_sta_eht_cap *eht_cap, 5073 u8 *end, 5074 bool for_ap) 5075 { 5076 u8 mcs_nss_len, ppet_len; 5077 u8 ie_len; 5078 u8 *orig_pos = pos; 5079 5080 /* Make sure we have place for the IE */ 5081 if (!he_cap || !eht_cap) 5082 return orig_pos; 5083 5084 mcs_nss_len = ieee80211_eht_mcs_nss_size(&he_cap->he_cap_elem, 5085 &eht_cap->eht_cap_elem, 5086 for_ap); 5087 ppet_len = ieee80211_eht_ppe_size(eht_cap->eht_ppe_thres[0], 5088 eht_cap->eht_cap_elem.phy_cap_info); 5089 5090 ie_len = 2 + 1 + sizeof(eht_cap->eht_cap_elem) + mcs_nss_len + ppet_len; 5091 if ((end - pos) < ie_len) 5092 return orig_pos; 5093 5094 *pos++ = WLAN_EID_EXTENSION; 5095 *pos++ = ie_len - 2; 5096 *pos++ = WLAN_EID_EXT_EHT_CAPABILITY; 5097 5098 /* Fixed data */ 5099 memcpy(pos, &eht_cap->eht_cap_elem, sizeof(eht_cap->eht_cap_elem)); 5100 pos += sizeof(eht_cap->eht_cap_elem); 5101 5102 memcpy(pos, &eht_cap->eht_mcs_nss_supp, mcs_nss_len); 5103 pos += mcs_nss_len; 5104 5105 if (ppet_len) { 5106 memcpy(pos, &eht_cap->eht_ppe_thres, ppet_len); 5107 pos += ppet_len; 5108 } 5109 5110 return pos; 5111 } 5112