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 int ieee80211_reconfig(struct ieee80211_local *local) 1361 { 1362 struct ieee80211_hw *hw = &local->hw; 1363 struct ieee80211_sub_if_data *sdata; 1364 struct ieee80211_chanctx *ctx; 1365 struct sta_info *sta; 1366 int res, i; 1367 bool reconfig_due_to_wowlan = false; 1368 1369 #ifdef CONFIG_PM 1370 if (local->suspended) 1371 local->resuming = true; 1372 1373 if (local->wowlan) { 1374 local->wowlan = false; 1375 res = drv_resume(local); 1376 if (res < 0) { 1377 local->resuming = false; 1378 return res; 1379 } 1380 if (res == 0) 1381 goto wake_up; 1382 WARN_ON(res > 1); 1383 /* 1384 * res is 1, which means the driver requested 1385 * to go through a regular reset on wakeup. 1386 */ 1387 reconfig_due_to_wowlan = true; 1388 } 1389 #endif 1390 /* everything else happens only if HW was up & running */ 1391 if (!local->open_count) 1392 goto wake_up; 1393 1394 /* 1395 * Upon resume hardware can sometimes be goofy due to 1396 * various platform / driver / bus issues, so restarting 1397 * the device may at times not work immediately. Propagate 1398 * the error. 1399 */ 1400 res = drv_start(local); 1401 if (res) { 1402 WARN(local->suspended, "Hardware became unavailable " 1403 "upon resume. This could be a software issue " 1404 "prior to suspend or a hardware issue.\n"); 1405 return res; 1406 } 1407 1408 /* setup fragmentation threshold */ 1409 drv_set_frag_threshold(local, hw->wiphy->frag_threshold); 1410 1411 /* setup RTS threshold */ 1412 drv_set_rts_threshold(local, hw->wiphy->rts_threshold); 1413 1414 /* reset coverage class */ 1415 drv_set_coverage_class(local, hw->wiphy->coverage_class); 1416 1417 ieee80211_led_radio(local, true); 1418 ieee80211_mod_tpt_led_trig(local, 1419 IEEE80211_TPT_LEDTRIG_FL_RADIO, 0); 1420 1421 /* add interfaces */ 1422 sdata = rtnl_dereference(local->monitor_sdata); 1423 if (sdata) { 1424 res = drv_add_interface(local, sdata); 1425 if (WARN_ON(res)) { 1426 rcu_assign_pointer(local->monitor_sdata, NULL); 1427 synchronize_net(); 1428 kfree(sdata); 1429 } 1430 } 1431 1432 list_for_each_entry(sdata, &local->interfaces, list) { 1433 if (sdata->vif.type != NL80211_IFTYPE_AP_VLAN && 1434 sdata->vif.type != NL80211_IFTYPE_MONITOR && 1435 ieee80211_sdata_running(sdata)) 1436 res = drv_add_interface(local, sdata); 1437 } 1438 1439 /* add channel contexts */ 1440 if (local->use_chanctx) { 1441 mutex_lock(&local->chanctx_mtx); 1442 list_for_each_entry(ctx, &local->chanctx_list, list) 1443 WARN_ON(drv_add_chanctx(local, ctx)); 1444 mutex_unlock(&local->chanctx_mtx); 1445 } 1446 1447 list_for_each_entry(sdata, &local->interfaces, list) { 1448 struct ieee80211_chanctx_conf *ctx_conf; 1449 1450 if (!ieee80211_sdata_running(sdata)) 1451 continue; 1452 1453 mutex_lock(&local->chanctx_mtx); 1454 ctx_conf = rcu_dereference_protected(sdata->vif.chanctx_conf, 1455 lockdep_is_held(&local->chanctx_mtx)); 1456 if (ctx_conf) { 1457 ctx = container_of(ctx_conf, struct ieee80211_chanctx, 1458 conf); 1459 drv_assign_vif_chanctx(local, sdata, ctx); 1460 } 1461 mutex_unlock(&local->chanctx_mtx); 1462 } 1463 1464 sdata = rtnl_dereference(local->monitor_sdata); 1465 if (sdata && local->use_chanctx && ieee80211_sdata_running(sdata)) { 1466 struct ieee80211_chanctx_conf *ctx_conf; 1467 1468 mutex_lock(&local->chanctx_mtx); 1469 ctx_conf = rcu_dereference_protected(sdata->vif.chanctx_conf, 1470 lockdep_is_held(&local->chanctx_mtx)); 1471 if (ctx_conf) { 1472 ctx = container_of(ctx_conf, struct ieee80211_chanctx, 1473 conf); 1474 drv_assign_vif_chanctx(local, sdata, ctx); 1475 } 1476 mutex_unlock(&local->chanctx_mtx); 1477 } 1478 1479 /* add STAs back */ 1480 mutex_lock(&local->sta_mtx); 1481 list_for_each_entry(sta, &local->sta_list, list) { 1482 enum ieee80211_sta_state state; 1483 1484 if (!sta->uploaded) 1485 continue; 1486 1487 /* AP-mode stations will be added later */ 1488 if (sta->sdata->vif.type == NL80211_IFTYPE_AP) 1489 continue; 1490 1491 for (state = IEEE80211_STA_NOTEXIST; 1492 state < sta->sta_state; state++) 1493 WARN_ON(drv_sta_state(local, sta->sdata, sta, state, 1494 state + 1)); 1495 } 1496 mutex_unlock(&local->sta_mtx); 1497 1498 /* reconfigure tx conf */ 1499 if (hw->queues >= IEEE80211_NUM_ACS) { 1500 list_for_each_entry(sdata, &local->interfaces, list) { 1501 if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN || 1502 sdata->vif.type == NL80211_IFTYPE_MONITOR || 1503 !ieee80211_sdata_running(sdata)) 1504 continue; 1505 1506 for (i = 0; i < IEEE80211_NUM_ACS; i++) 1507 drv_conf_tx(local, sdata, i, 1508 &sdata->tx_conf[i]); 1509 } 1510 } 1511 1512 /* reconfigure hardware */ 1513 ieee80211_hw_config(local, ~0); 1514 1515 ieee80211_configure_filter(local); 1516 1517 /* Finally also reconfigure all the BSS information */ 1518 list_for_each_entry(sdata, &local->interfaces, list) { 1519 u32 changed; 1520 1521 if (!ieee80211_sdata_running(sdata)) 1522 continue; 1523 1524 /* common change flags for all interface types */ 1525 changed = BSS_CHANGED_ERP_CTS_PROT | 1526 BSS_CHANGED_ERP_PREAMBLE | 1527 BSS_CHANGED_ERP_SLOT | 1528 BSS_CHANGED_HT | 1529 BSS_CHANGED_BASIC_RATES | 1530 BSS_CHANGED_BEACON_INT | 1531 BSS_CHANGED_BSSID | 1532 BSS_CHANGED_CQM | 1533 BSS_CHANGED_QOS | 1534 BSS_CHANGED_IDLE | 1535 BSS_CHANGED_TXPOWER; 1536 1537 #ifdef CONFIG_PM 1538 if (local->resuming && !reconfig_due_to_wowlan) 1539 sdata->vif.bss_conf = sdata->suspend_bss_conf; 1540 #endif 1541 1542 switch (sdata->vif.type) { 1543 case NL80211_IFTYPE_STATION: 1544 changed |= BSS_CHANGED_ASSOC | 1545 BSS_CHANGED_ARP_FILTER | 1546 BSS_CHANGED_PS; 1547 1548 if (sdata->u.mgd.dtim_period) 1549 changed |= BSS_CHANGED_DTIM_PERIOD; 1550 1551 mutex_lock(&sdata->u.mgd.mtx); 1552 ieee80211_bss_info_change_notify(sdata, changed); 1553 mutex_unlock(&sdata->u.mgd.mtx); 1554 break; 1555 case NL80211_IFTYPE_ADHOC: 1556 changed |= BSS_CHANGED_IBSS; 1557 /* fall through */ 1558 case NL80211_IFTYPE_AP: 1559 changed |= BSS_CHANGED_SSID | BSS_CHANGED_P2P_PS; 1560 1561 if (sdata->vif.type == NL80211_IFTYPE_AP) { 1562 changed |= BSS_CHANGED_AP_PROBE_RESP; 1563 1564 if (rcu_access_pointer(sdata->u.ap.beacon)) 1565 drv_start_ap(local, sdata); 1566 } 1567 1568 /* fall through */ 1569 case NL80211_IFTYPE_MESH_POINT: 1570 if (sdata->vif.bss_conf.enable_beacon) { 1571 changed |= BSS_CHANGED_BEACON | 1572 BSS_CHANGED_BEACON_ENABLED; 1573 ieee80211_bss_info_change_notify(sdata, changed); 1574 } 1575 break; 1576 case NL80211_IFTYPE_WDS: 1577 break; 1578 case NL80211_IFTYPE_AP_VLAN: 1579 case NL80211_IFTYPE_MONITOR: 1580 /* ignore virtual */ 1581 break; 1582 case NL80211_IFTYPE_P2P_DEVICE: 1583 changed = BSS_CHANGED_IDLE; 1584 break; 1585 case NL80211_IFTYPE_UNSPECIFIED: 1586 case NUM_NL80211_IFTYPES: 1587 case NL80211_IFTYPE_P2P_CLIENT: 1588 case NL80211_IFTYPE_P2P_GO: 1589 WARN_ON(1); 1590 break; 1591 } 1592 } 1593 1594 ieee80211_recalc_ps(local, -1); 1595 1596 /* 1597 * The sta might be in psm against the ap (e.g. because 1598 * this was the state before a hw restart), so we 1599 * explicitly send a null packet in order to make sure 1600 * it'll sync against the ap (and get out of psm). 1601 */ 1602 if (!(local->hw.conf.flags & IEEE80211_CONF_PS)) { 1603 list_for_each_entry(sdata, &local->interfaces, list) { 1604 if (sdata->vif.type != NL80211_IFTYPE_STATION) 1605 continue; 1606 if (!sdata->u.mgd.associated) 1607 continue; 1608 1609 ieee80211_send_nullfunc(local, sdata, 0); 1610 } 1611 } 1612 1613 /* APs are now beaconing, add back stations */ 1614 mutex_lock(&local->sta_mtx); 1615 list_for_each_entry(sta, &local->sta_list, list) { 1616 enum ieee80211_sta_state state; 1617 1618 if (!sta->uploaded) 1619 continue; 1620 1621 if (sta->sdata->vif.type != NL80211_IFTYPE_AP) 1622 continue; 1623 1624 for (state = IEEE80211_STA_NOTEXIST; 1625 state < sta->sta_state; state++) 1626 WARN_ON(drv_sta_state(local, sta->sdata, sta, state, 1627 state + 1)); 1628 } 1629 mutex_unlock(&local->sta_mtx); 1630 1631 /* add back keys */ 1632 list_for_each_entry(sdata, &local->interfaces, list) 1633 if (ieee80211_sdata_running(sdata)) 1634 ieee80211_enable_keys(sdata); 1635 1636 wake_up: 1637 local->in_reconfig = false; 1638 barrier(); 1639 1640 /* 1641 * Clear the WLAN_STA_BLOCK_BA flag so new aggregation 1642 * sessions can be established after a resume. 1643 * 1644 * Also tear down aggregation sessions since reconfiguring 1645 * them in a hardware restart scenario is not easily done 1646 * right now, and the hardware will have lost information 1647 * about the sessions, but we and the AP still think they 1648 * are active. This is really a workaround though. 1649 */ 1650 if (hw->flags & IEEE80211_HW_AMPDU_AGGREGATION) { 1651 mutex_lock(&local->sta_mtx); 1652 1653 list_for_each_entry(sta, &local->sta_list, list) { 1654 ieee80211_sta_tear_down_BA_sessions( 1655 sta, AGG_STOP_LOCAL_REQUEST); 1656 clear_sta_flag(sta, WLAN_STA_BLOCK_BA); 1657 } 1658 1659 mutex_unlock(&local->sta_mtx); 1660 } 1661 1662 ieee80211_wake_queues_by_reason(hw, 1663 IEEE80211_QUEUE_STOP_REASON_SUSPEND); 1664 1665 /* 1666 * If this is for hw restart things are still running. 1667 * We may want to change that later, however. 1668 */ 1669 if (!local->suspended || reconfig_due_to_wowlan) 1670 drv_restart_complete(local); 1671 1672 if (!local->suspended) 1673 return 0; 1674 1675 #ifdef CONFIG_PM 1676 /* first set suspended false, then resuming */ 1677 local->suspended = false; 1678 mb(); 1679 local->resuming = false; 1680 1681 list_for_each_entry(sdata, &local->interfaces, list) { 1682 switch(sdata->vif.type) { 1683 case NL80211_IFTYPE_STATION: 1684 ieee80211_sta_restart(sdata); 1685 break; 1686 case NL80211_IFTYPE_ADHOC: 1687 ieee80211_ibss_restart(sdata); 1688 break; 1689 case NL80211_IFTYPE_MESH_POINT: 1690 ieee80211_mesh_restart(sdata); 1691 break; 1692 default: 1693 break; 1694 } 1695 } 1696 1697 mod_timer(&local->sta_cleanup, jiffies + 1); 1698 1699 mutex_lock(&local->sta_mtx); 1700 list_for_each_entry(sta, &local->sta_list, list) 1701 mesh_plink_restart(sta); 1702 mutex_unlock(&local->sta_mtx); 1703 #else 1704 WARN_ON(1); 1705 #endif 1706 return 0; 1707 } 1708 1709 void ieee80211_resume_disconnect(struct ieee80211_vif *vif) 1710 { 1711 struct ieee80211_sub_if_data *sdata; 1712 struct ieee80211_local *local; 1713 struct ieee80211_key *key; 1714 1715 if (WARN_ON(!vif)) 1716 return; 1717 1718 sdata = vif_to_sdata(vif); 1719 local = sdata->local; 1720 1721 if (WARN_ON(!local->resuming)) 1722 return; 1723 1724 if (WARN_ON(vif->type != NL80211_IFTYPE_STATION)) 1725 return; 1726 1727 sdata->flags |= IEEE80211_SDATA_DISCONNECT_RESUME; 1728 1729 mutex_lock(&local->key_mtx); 1730 list_for_each_entry(key, &sdata->key_list, list) 1731 key->flags |= KEY_FLAG_TAINTED; 1732 mutex_unlock(&local->key_mtx); 1733 } 1734 EXPORT_SYMBOL_GPL(ieee80211_resume_disconnect); 1735 1736 void ieee80211_recalc_smps(struct ieee80211_sub_if_data *sdata) 1737 { 1738 struct ieee80211_local *local = sdata->local; 1739 struct ieee80211_chanctx_conf *chanctx_conf; 1740 struct ieee80211_chanctx *chanctx; 1741 1742 mutex_lock(&local->chanctx_mtx); 1743 1744 chanctx_conf = rcu_dereference_protected(sdata->vif.chanctx_conf, 1745 lockdep_is_held(&local->chanctx_mtx)); 1746 1747 if (WARN_ON_ONCE(!chanctx_conf)) 1748 goto unlock; 1749 1750 chanctx = container_of(chanctx_conf, struct ieee80211_chanctx, conf); 1751 ieee80211_recalc_smps_chanctx(local, chanctx); 1752 unlock: 1753 mutex_unlock(&local->chanctx_mtx); 1754 } 1755 1756 static bool ieee80211_id_in_list(const u8 *ids, int n_ids, u8 id) 1757 { 1758 int i; 1759 1760 for (i = 0; i < n_ids; i++) 1761 if (ids[i] == id) 1762 return true; 1763 return false; 1764 } 1765 1766 /** 1767 * ieee80211_ie_split - split an IE buffer according to ordering 1768 * 1769 * @ies: the IE buffer 1770 * @ielen: the length of the IE buffer 1771 * @ids: an array with element IDs that are allowed before 1772 * the split 1773 * @n_ids: the size of the element ID array 1774 * @offset: offset where to start splitting in the buffer 1775 * 1776 * This function splits an IE buffer by updating the @offset 1777 * variable to point to the location where the buffer should be 1778 * split. 1779 * 1780 * It assumes that the given IE buffer is well-formed, this 1781 * has to be guaranteed by the caller! 1782 * 1783 * It also assumes that the IEs in the buffer are ordered 1784 * correctly, if not the result of using this function will not 1785 * be ordered correctly either, i.e. it does no reordering. 1786 * 1787 * The function returns the offset where the next part of the 1788 * buffer starts, which may be @ielen if the entire (remainder) 1789 * of the buffer should be used. 1790 */ 1791 size_t ieee80211_ie_split(const u8 *ies, size_t ielen, 1792 const u8 *ids, int n_ids, size_t offset) 1793 { 1794 size_t pos = offset; 1795 1796 while (pos < ielen && ieee80211_id_in_list(ids, n_ids, ies[pos])) 1797 pos += 2 + ies[pos + 1]; 1798 1799 return pos; 1800 } 1801 1802 size_t ieee80211_ie_split_vendor(const u8 *ies, size_t ielen, size_t offset) 1803 { 1804 size_t pos = offset; 1805 1806 while (pos < ielen && ies[pos] != WLAN_EID_VENDOR_SPECIFIC) 1807 pos += 2 + ies[pos + 1]; 1808 1809 return pos; 1810 } 1811 1812 static void _ieee80211_enable_rssi_reports(struct ieee80211_sub_if_data *sdata, 1813 int rssi_min_thold, 1814 int rssi_max_thold) 1815 { 1816 trace_api_enable_rssi_reports(sdata, rssi_min_thold, rssi_max_thold); 1817 1818 if (WARN_ON(sdata->vif.type != NL80211_IFTYPE_STATION)) 1819 return; 1820 1821 /* 1822 * Scale up threshold values before storing it, as the RSSI averaging 1823 * algorithm uses a scaled up value as well. Change this scaling 1824 * factor if the RSSI averaging algorithm changes. 1825 */ 1826 sdata->u.mgd.rssi_min_thold = rssi_min_thold*16; 1827 sdata->u.mgd.rssi_max_thold = rssi_max_thold*16; 1828 } 1829 1830 void ieee80211_enable_rssi_reports(struct ieee80211_vif *vif, 1831 int rssi_min_thold, 1832 int rssi_max_thold) 1833 { 1834 struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif); 1835 1836 WARN_ON(rssi_min_thold == rssi_max_thold || 1837 rssi_min_thold > rssi_max_thold); 1838 1839 _ieee80211_enable_rssi_reports(sdata, rssi_min_thold, 1840 rssi_max_thold); 1841 } 1842 EXPORT_SYMBOL(ieee80211_enable_rssi_reports); 1843 1844 void ieee80211_disable_rssi_reports(struct ieee80211_vif *vif) 1845 { 1846 struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif); 1847 1848 _ieee80211_enable_rssi_reports(sdata, 0, 0); 1849 } 1850 EXPORT_SYMBOL(ieee80211_disable_rssi_reports); 1851 1852 u8 *ieee80211_ie_build_ht_cap(u8 *pos, struct ieee80211_sta_ht_cap *ht_cap, 1853 u16 cap) 1854 { 1855 __le16 tmp; 1856 1857 *pos++ = WLAN_EID_HT_CAPABILITY; 1858 *pos++ = sizeof(struct ieee80211_ht_cap); 1859 memset(pos, 0, sizeof(struct ieee80211_ht_cap)); 1860 1861 /* capability flags */ 1862 tmp = cpu_to_le16(cap); 1863 memcpy(pos, &tmp, sizeof(u16)); 1864 pos += sizeof(u16); 1865 1866 /* AMPDU parameters */ 1867 *pos++ = ht_cap->ampdu_factor | 1868 (ht_cap->ampdu_density << 1869 IEEE80211_HT_AMPDU_PARM_DENSITY_SHIFT); 1870 1871 /* MCS set */ 1872 memcpy(pos, &ht_cap->mcs, sizeof(ht_cap->mcs)); 1873 pos += sizeof(ht_cap->mcs); 1874 1875 /* extended capabilities */ 1876 pos += sizeof(__le16); 1877 1878 /* BF capabilities */ 1879 pos += sizeof(__le32); 1880 1881 /* antenna selection */ 1882 pos += sizeof(u8); 1883 1884 return pos; 1885 } 1886 1887 u8 *ieee80211_ie_build_vht_cap(u8 *pos, struct ieee80211_sta_vht_cap *vht_cap, 1888 u32 cap) 1889 { 1890 __le32 tmp; 1891 1892 *pos++ = WLAN_EID_VHT_CAPABILITY; 1893 *pos++ = sizeof(struct ieee80211_vht_cap); 1894 memset(pos, 0, sizeof(struct ieee80211_vht_cap)); 1895 1896 /* capability flags */ 1897 tmp = cpu_to_le32(cap); 1898 memcpy(pos, &tmp, sizeof(u32)); 1899 pos += sizeof(u32); 1900 1901 /* VHT MCS set */ 1902 memcpy(pos, &vht_cap->vht_mcs, sizeof(vht_cap->vht_mcs)); 1903 pos += sizeof(vht_cap->vht_mcs); 1904 1905 return pos; 1906 } 1907 1908 u8 *ieee80211_ie_build_ht_oper(u8 *pos, struct ieee80211_sta_ht_cap *ht_cap, 1909 const struct cfg80211_chan_def *chandef, 1910 u16 prot_mode) 1911 { 1912 struct ieee80211_ht_operation *ht_oper; 1913 /* Build HT Information */ 1914 *pos++ = WLAN_EID_HT_OPERATION; 1915 *pos++ = sizeof(struct ieee80211_ht_operation); 1916 ht_oper = (struct ieee80211_ht_operation *)pos; 1917 ht_oper->primary_chan = ieee80211_frequency_to_channel( 1918 chandef->chan->center_freq); 1919 switch (chandef->width) { 1920 case NL80211_CHAN_WIDTH_160: 1921 case NL80211_CHAN_WIDTH_80P80: 1922 case NL80211_CHAN_WIDTH_80: 1923 case NL80211_CHAN_WIDTH_40: 1924 if (chandef->center_freq1 > chandef->chan->center_freq) 1925 ht_oper->ht_param = IEEE80211_HT_PARAM_CHA_SEC_ABOVE; 1926 else 1927 ht_oper->ht_param = IEEE80211_HT_PARAM_CHA_SEC_BELOW; 1928 break; 1929 default: 1930 ht_oper->ht_param = IEEE80211_HT_PARAM_CHA_SEC_NONE; 1931 break; 1932 } 1933 if (ht_cap->cap & IEEE80211_HT_CAP_SUP_WIDTH_20_40 && 1934 chandef->width != NL80211_CHAN_WIDTH_20_NOHT && 1935 chandef->width != NL80211_CHAN_WIDTH_20) 1936 ht_oper->ht_param |= IEEE80211_HT_PARAM_CHAN_WIDTH_ANY; 1937 1938 ht_oper->operation_mode = cpu_to_le16(prot_mode); 1939 ht_oper->stbc_param = 0x0000; 1940 1941 /* It seems that Basic MCS set and Supported MCS set 1942 are identical for the first 10 bytes */ 1943 memset(&ht_oper->basic_set, 0, 16); 1944 memcpy(&ht_oper->basic_set, &ht_cap->mcs, 10); 1945 1946 return pos + sizeof(struct ieee80211_ht_operation); 1947 } 1948 1949 void ieee80211_ht_oper_to_chandef(struct ieee80211_channel *control_chan, 1950 const struct ieee80211_ht_operation *ht_oper, 1951 struct cfg80211_chan_def *chandef) 1952 { 1953 enum nl80211_channel_type channel_type; 1954 1955 if (!ht_oper) { 1956 cfg80211_chandef_create(chandef, control_chan, 1957 NL80211_CHAN_NO_HT); 1958 return; 1959 } 1960 1961 switch (ht_oper->ht_param & IEEE80211_HT_PARAM_CHA_SEC_OFFSET) { 1962 case IEEE80211_HT_PARAM_CHA_SEC_NONE: 1963 channel_type = NL80211_CHAN_HT20; 1964 break; 1965 case IEEE80211_HT_PARAM_CHA_SEC_ABOVE: 1966 channel_type = NL80211_CHAN_HT40PLUS; 1967 break; 1968 case IEEE80211_HT_PARAM_CHA_SEC_BELOW: 1969 channel_type = NL80211_CHAN_HT40MINUS; 1970 break; 1971 default: 1972 channel_type = NL80211_CHAN_NO_HT; 1973 } 1974 1975 cfg80211_chandef_create(chandef, control_chan, channel_type); 1976 } 1977 1978 int ieee80211_add_srates_ie(struct ieee80211_sub_if_data *sdata, 1979 struct sk_buff *skb, bool need_basic, 1980 enum ieee80211_band band) 1981 { 1982 struct ieee80211_local *local = sdata->local; 1983 struct ieee80211_supported_band *sband; 1984 int rate; 1985 u8 i, rates, *pos; 1986 u32 basic_rates = sdata->vif.bss_conf.basic_rates; 1987 1988 sband = local->hw.wiphy->bands[band]; 1989 rates = sband->n_bitrates; 1990 if (rates > 8) 1991 rates = 8; 1992 1993 if (skb_tailroom(skb) < rates + 2) 1994 return -ENOMEM; 1995 1996 pos = skb_put(skb, rates + 2); 1997 *pos++ = WLAN_EID_SUPP_RATES; 1998 *pos++ = rates; 1999 for (i = 0; i < rates; i++) { 2000 u8 basic = 0; 2001 if (need_basic && basic_rates & BIT(i)) 2002 basic = 0x80; 2003 rate = sband->bitrates[i].bitrate; 2004 *pos++ = basic | (u8) (rate / 5); 2005 } 2006 2007 return 0; 2008 } 2009 2010 int ieee80211_add_ext_srates_ie(struct ieee80211_sub_if_data *sdata, 2011 struct sk_buff *skb, bool need_basic, 2012 enum ieee80211_band band) 2013 { 2014 struct ieee80211_local *local = sdata->local; 2015 struct ieee80211_supported_band *sband; 2016 int rate; 2017 u8 i, exrates, *pos; 2018 u32 basic_rates = sdata->vif.bss_conf.basic_rates; 2019 2020 sband = local->hw.wiphy->bands[band]; 2021 exrates = sband->n_bitrates; 2022 if (exrates > 8) 2023 exrates -= 8; 2024 else 2025 exrates = 0; 2026 2027 if (skb_tailroom(skb) < exrates + 2) 2028 return -ENOMEM; 2029 2030 if (exrates) { 2031 pos = skb_put(skb, exrates + 2); 2032 *pos++ = WLAN_EID_EXT_SUPP_RATES; 2033 *pos++ = exrates; 2034 for (i = 8; i < sband->n_bitrates; i++) { 2035 u8 basic = 0; 2036 if (need_basic && basic_rates & BIT(i)) 2037 basic = 0x80; 2038 rate = sband->bitrates[i].bitrate; 2039 *pos++ = basic | (u8) (rate / 5); 2040 } 2041 } 2042 return 0; 2043 } 2044 2045 int ieee80211_ave_rssi(struct ieee80211_vif *vif) 2046 { 2047 struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif); 2048 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; 2049 2050 if (WARN_ON_ONCE(sdata->vif.type != NL80211_IFTYPE_STATION)) { 2051 /* non-managed type inferfaces */ 2052 return 0; 2053 } 2054 return ifmgd->ave_beacon_signal; 2055 } 2056 EXPORT_SYMBOL_GPL(ieee80211_ave_rssi); 2057 2058 u8 ieee80211_mcs_to_chains(const struct ieee80211_mcs_info *mcs) 2059 { 2060 if (!mcs) 2061 return 1; 2062 2063 /* TODO: consider rx_highest */ 2064 2065 if (mcs->rx_mask[3]) 2066 return 4; 2067 if (mcs->rx_mask[2]) 2068 return 3; 2069 if (mcs->rx_mask[1]) 2070 return 2; 2071 return 1; 2072 } 2073 2074 /** 2075 * ieee80211_calculate_rx_timestamp - calculate timestamp in frame 2076 * @local: mac80211 hw info struct 2077 * @status: RX status 2078 * @mpdu_len: total MPDU length (including FCS) 2079 * @mpdu_offset: offset into MPDU to calculate timestamp at 2080 * 2081 * This function calculates the RX timestamp at the given MPDU offset, taking 2082 * into account what the RX timestamp was. An offset of 0 will just normalize 2083 * the timestamp to TSF at beginning of MPDU reception. 2084 */ 2085 u64 ieee80211_calculate_rx_timestamp(struct ieee80211_local *local, 2086 struct ieee80211_rx_status *status, 2087 unsigned int mpdu_len, 2088 unsigned int mpdu_offset) 2089 { 2090 u64 ts = status->mactime; 2091 struct rate_info ri; 2092 u16 rate; 2093 2094 if (WARN_ON(!ieee80211_have_rx_timestamp(status))) 2095 return 0; 2096 2097 memset(&ri, 0, sizeof(ri)); 2098 2099 /* Fill cfg80211 rate info */ 2100 if (status->flag & RX_FLAG_HT) { 2101 ri.mcs = status->rate_idx; 2102 ri.flags |= RATE_INFO_FLAGS_MCS; 2103 if (status->flag & RX_FLAG_40MHZ) 2104 ri.flags |= RATE_INFO_FLAGS_40_MHZ_WIDTH; 2105 if (status->flag & RX_FLAG_SHORT_GI) 2106 ri.flags |= RATE_INFO_FLAGS_SHORT_GI; 2107 } else if (status->flag & RX_FLAG_VHT) { 2108 ri.flags |= RATE_INFO_FLAGS_VHT_MCS; 2109 ri.mcs = status->rate_idx; 2110 ri.nss = status->vht_nss; 2111 if (status->flag & RX_FLAG_40MHZ) 2112 ri.flags |= RATE_INFO_FLAGS_40_MHZ_WIDTH; 2113 if (status->flag & RX_FLAG_80MHZ) 2114 ri.flags |= RATE_INFO_FLAGS_80_MHZ_WIDTH; 2115 if (status->flag & RX_FLAG_80P80MHZ) 2116 ri.flags |= RATE_INFO_FLAGS_80P80_MHZ_WIDTH; 2117 if (status->flag & RX_FLAG_160MHZ) 2118 ri.flags |= RATE_INFO_FLAGS_160_MHZ_WIDTH; 2119 if (status->flag & RX_FLAG_SHORT_GI) 2120 ri.flags |= RATE_INFO_FLAGS_SHORT_GI; 2121 } else { 2122 struct ieee80211_supported_band *sband; 2123 2124 sband = local->hw.wiphy->bands[status->band]; 2125 ri.legacy = sband->bitrates[status->rate_idx].bitrate; 2126 } 2127 2128 rate = cfg80211_calculate_bitrate(&ri); 2129 2130 /* rewind from end of MPDU */ 2131 if (status->flag & RX_FLAG_MACTIME_END) 2132 ts -= mpdu_len * 8 * 10 / rate; 2133 2134 ts += mpdu_offset * 8 * 10 / rate; 2135 2136 return ts; 2137 } 2138 2139 void ieee80211_dfs_cac_cancel(struct ieee80211_local *local) 2140 { 2141 struct ieee80211_sub_if_data *sdata; 2142 2143 mutex_lock(&local->iflist_mtx); 2144 list_for_each_entry(sdata, &local->interfaces, list) { 2145 cancel_delayed_work_sync(&sdata->dfs_cac_timer_work); 2146 2147 if (sdata->wdev.cac_started) { 2148 ieee80211_vif_release_channel(sdata); 2149 cfg80211_cac_event(sdata->dev, 2150 NL80211_RADAR_CAC_ABORTED, 2151 GFP_KERNEL); 2152 } 2153 } 2154 mutex_unlock(&local->iflist_mtx); 2155 } 2156 2157 void ieee80211_dfs_radar_detected_work(struct work_struct *work) 2158 { 2159 struct ieee80211_local *local = 2160 container_of(work, struct ieee80211_local, radar_detected_work); 2161 struct cfg80211_chan_def chandef; 2162 2163 ieee80211_dfs_cac_cancel(local); 2164 2165 if (local->use_chanctx) 2166 /* currently not handled */ 2167 WARN_ON(1); 2168 else { 2169 cfg80211_chandef_create(&chandef, local->hw.conf.channel, 2170 local->hw.conf.channel_type); 2171 cfg80211_radar_event(local->hw.wiphy, &chandef, GFP_KERNEL); 2172 } 2173 } 2174 2175 void ieee80211_radar_detected(struct ieee80211_hw *hw) 2176 { 2177 struct ieee80211_local *local = hw_to_local(hw); 2178 2179 trace_api_radar_detected(local); 2180 2181 ieee80211_queue_work(hw, &local->radar_detected_work); 2182 } 2183 EXPORT_SYMBOL(ieee80211_radar_detected); 2184