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