1e2ebc74dSJohannes Berg /* 2e2ebc74dSJohannes Berg * Copyright 2002-2005, Instant802 Networks, Inc. 3e2ebc74dSJohannes Berg * Copyright 2005-2006, Devicescape Software, Inc. 4e2ebc74dSJohannes Berg * Copyright 2006-2007 Jiri Benc <jbenc@suse.cz> 5e2ebc74dSJohannes Berg * Copyright 2007 Johannes Berg <johannes@sipsolutions.net> 6e2ebc74dSJohannes Berg * 7e2ebc74dSJohannes Berg * This program is free software; you can redistribute it and/or modify 8e2ebc74dSJohannes Berg * it under the terms of the GNU General Public License version 2 as 9e2ebc74dSJohannes Berg * published by the Free Software Foundation. 10e2ebc74dSJohannes Berg * 11e2ebc74dSJohannes Berg * 12e2ebc74dSJohannes Berg * Transmit and frame generation functions. 13e2ebc74dSJohannes Berg */ 14e2ebc74dSJohannes Berg 15e2ebc74dSJohannes Berg #include <linux/kernel.h> 16e2ebc74dSJohannes Berg #include <linux/slab.h> 17e2ebc74dSJohannes Berg #include <linux/skbuff.h> 18e2ebc74dSJohannes Berg #include <linux/etherdevice.h> 19e2ebc74dSJohannes Berg #include <linux/bitmap.h> 20d4e46a3dSJohannes Berg #include <linux/rcupdate.h> 21bc3b2d7fSPaul Gortmaker #include <linux/export.h> 22881d966bSEric W. Biederman #include <net/net_namespace.h> 23e2ebc74dSJohannes Berg #include <net/ieee80211_radiotap.h> 24e2ebc74dSJohannes Berg #include <net/cfg80211.h> 25e2ebc74dSJohannes Berg #include <net/mac80211.h> 26e2ebc74dSJohannes Berg #include <asm/unaligned.h> 27e2ebc74dSJohannes Berg 28e2ebc74dSJohannes Berg #include "ieee80211_i.h" 2924487981SJohannes Berg #include "driver-ops.h" 302c8dccc7SJohannes Berg #include "led.h" 3133b64eb2SLuis Carlos Cobo #include "mesh.h" 32e2ebc74dSJohannes Berg #include "wep.h" 33e2ebc74dSJohannes Berg #include "wpa.h" 34e2ebc74dSJohannes Berg #include "wme.h" 352c8dccc7SJohannes Berg #include "rate.h" 36e2ebc74dSJohannes Berg 37e2ebc74dSJohannes Berg /* misc utils */ 38e2ebc74dSJohannes Berg 39252b86c4SJohannes Berg static __le16 ieee80211_duration(struct ieee80211_tx_data *tx, 40252b86c4SJohannes Berg struct sk_buff *skb, int group_addr, 41e2ebc74dSJohannes Berg int next_frag_len) 42e2ebc74dSJohannes Berg { 432103dec1SSimon Wunderlich int rate, mrate, erp, dur, i, shift = 0; 442e92e6f2SJohannes Berg struct ieee80211_rate *txrate; 45e2ebc74dSJohannes Berg struct ieee80211_local *local = tx->local; 468318d78aSJohannes Berg struct ieee80211_supported_band *sband; 47358c8d9dSHarvey Harrison struct ieee80211_hdr *hdr; 48252b86c4SJohannes Berg struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); 492103dec1SSimon Wunderlich struct ieee80211_chanctx_conf *chanctx_conf; 502103dec1SSimon Wunderlich u32 rate_flags = 0; 512103dec1SSimon Wunderlich 522103dec1SSimon Wunderlich rcu_read_lock(); 532103dec1SSimon Wunderlich chanctx_conf = rcu_dereference(tx->sdata->vif.chanctx_conf); 542103dec1SSimon Wunderlich if (chanctx_conf) { 552103dec1SSimon Wunderlich shift = ieee80211_chandef_get_shift(&chanctx_conf->def); 562103dec1SSimon Wunderlich rate_flags = ieee80211_chandef_rate_flags(&chanctx_conf->def); 572103dec1SSimon Wunderlich } 582103dec1SSimon Wunderlich rcu_read_unlock(); 59e6a9854bSJohannes Berg 60e6a9854bSJohannes Berg /* assume HW handles this */ 610d528d85SFelix Fietkau if (tx->rate.flags & IEEE80211_TX_RC_MCS) 62e6a9854bSJohannes Berg return 0; 63e6a9854bSJohannes Berg 64e6a9854bSJohannes Berg /* uh huh? */ 650d528d85SFelix Fietkau if (WARN_ON_ONCE(tx->rate.idx < 0)) 66e6a9854bSJohannes Berg return 0; 67e2ebc74dSJohannes Berg 682d56577bSJohannes Berg sband = local->hw.wiphy->bands[info->band]; 690d528d85SFelix Fietkau txrate = &sband->bitrates[tx->rate.idx]; 708318d78aSJohannes Berg 718318d78aSJohannes Berg erp = txrate->flags & IEEE80211_RATE_ERP_G; 72e2ebc74dSJohannes Berg 73e2ebc74dSJohannes Berg /* 74e2ebc74dSJohannes Berg * data and mgmt (except PS Poll): 75e2ebc74dSJohannes Berg * - during CFP: 32768 76e2ebc74dSJohannes Berg * - during contention period: 77e2ebc74dSJohannes Berg * if addr1 is group address: 0 78e2ebc74dSJohannes Berg * if more fragments = 0 and addr1 is individual address: time to 79e2ebc74dSJohannes Berg * transmit one ACK plus SIFS 80e2ebc74dSJohannes Berg * if more fragments = 1 and addr1 is individual address: time to 81e2ebc74dSJohannes Berg * transmit next fragment plus 2 x ACK plus 3 x SIFS 82e2ebc74dSJohannes Berg * 83e2ebc74dSJohannes Berg * IEEE 802.11, 9.6: 84e2ebc74dSJohannes Berg * - control response frame (CTS or ACK) shall be transmitted using the 85e2ebc74dSJohannes Berg * same rate as the immediately previous frame in the frame exchange 86e2ebc74dSJohannes Berg * sequence, if this rate belongs to the PHY mandatory rates, or else 87e2ebc74dSJohannes Berg * at the highest possible rate belonging to the PHY rates in the 88e2ebc74dSJohannes Berg * BSSBasicRateSet 89e2ebc74dSJohannes Berg */ 90252b86c4SJohannes Berg hdr = (struct ieee80211_hdr *)skb->data; 91358c8d9dSHarvey Harrison if (ieee80211_is_ctl(hdr->frame_control)) { 92e2ebc74dSJohannes Berg /* TODO: These control frames are not currently sent by 93ccd7b362SJohannes Berg * mac80211, but should they be implemented, this function 94e2ebc74dSJohannes Berg * needs to be updated to support duration field calculation. 95e2ebc74dSJohannes Berg * 96e2ebc74dSJohannes Berg * RTS: time needed to transmit pending data/mgmt frame plus 97e2ebc74dSJohannes Berg * one CTS frame plus one ACK frame plus 3 x SIFS 98e2ebc74dSJohannes Berg * CTS: duration of immediately previous RTS minus time 99e2ebc74dSJohannes Berg * required to transmit CTS and its SIFS 100e2ebc74dSJohannes Berg * ACK: 0 if immediately previous directed data/mgmt had 101e2ebc74dSJohannes Berg * more=0, with more=1 duration in ACK frame is duration 102e2ebc74dSJohannes Berg * from previous frame minus time needed to transmit ACK 103e2ebc74dSJohannes Berg * and its SIFS 104e2ebc74dSJohannes Berg * PS Poll: BIT(15) | BIT(14) | aid 105e2ebc74dSJohannes Berg */ 106e2ebc74dSJohannes Berg return 0; 107e2ebc74dSJohannes Berg } 108e2ebc74dSJohannes Berg 109e2ebc74dSJohannes Berg /* data/mgmt */ 110e2ebc74dSJohannes Berg if (0 /* FIX: data/mgmt during CFP */) 11103f93c3dSJohannes Berg return cpu_to_le16(32768); 112e2ebc74dSJohannes Berg 113e2ebc74dSJohannes Berg if (group_addr) /* Group address as the destination - no ACK */ 114e2ebc74dSJohannes Berg return 0; 115e2ebc74dSJohannes Berg 116e2ebc74dSJohannes Berg /* Individual destination address: 117e2ebc74dSJohannes Berg * IEEE 802.11, Ch. 9.6 (after IEEE 802.11g changes) 118e2ebc74dSJohannes Berg * CTS and ACK frames shall be transmitted using the highest rate in 119e2ebc74dSJohannes Berg * basic rate set that is less than or equal to the rate of the 120e2ebc74dSJohannes Berg * immediately previous frame and that is using the same modulation 121e2ebc74dSJohannes Berg * (CCK or OFDM). If no basic rate set matches with these requirements, 122e2ebc74dSJohannes Berg * the highest mandatory rate of the PHY that is less than or equal to 123e2ebc74dSJohannes Berg * the rate of the previous frame is used. 124e2ebc74dSJohannes Berg * Mandatory rates for IEEE 802.11g PHY: 1, 2, 5.5, 11, 6, 12, 24 Mbps 125e2ebc74dSJohannes Berg */ 126e2ebc74dSJohannes Berg rate = -1; 1278318d78aSJohannes Berg /* use lowest available if everything fails */ 1288318d78aSJohannes Berg mrate = sband->bitrates[0].bitrate; 1298318d78aSJohannes Berg for (i = 0; i < sband->n_bitrates; i++) { 1308318d78aSJohannes Berg struct ieee80211_rate *r = &sband->bitrates[i]; 1318318d78aSJohannes Berg 1328318d78aSJohannes Berg if (r->bitrate > txrate->bitrate) 133e2ebc74dSJohannes Berg break; 134e2ebc74dSJohannes Berg 1352103dec1SSimon Wunderlich if ((rate_flags & r->flags) != rate_flags) 1362103dec1SSimon Wunderlich continue; 1372103dec1SSimon Wunderlich 138bda3933aSJohannes Berg if (tx->sdata->vif.bss_conf.basic_rates & BIT(i)) 1392103dec1SSimon Wunderlich rate = DIV_ROUND_UP(r->bitrate, 1 << shift); 140e2ebc74dSJohannes Berg 1418318d78aSJohannes Berg switch (sband->band) { 1428318d78aSJohannes Berg case IEEE80211_BAND_2GHZ: { 1438318d78aSJohannes Berg u32 flag; 1448318d78aSJohannes Berg if (tx->sdata->flags & IEEE80211_SDATA_OPERATING_GMODE) 1458318d78aSJohannes Berg flag = IEEE80211_RATE_MANDATORY_G; 1468318d78aSJohannes Berg else 1478318d78aSJohannes Berg flag = IEEE80211_RATE_MANDATORY_B; 1488318d78aSJohannes Berg if (r->flags & flag) 1498318d78aSJohannes Berg mrate = r->bitrate; 1508318d78aSJohannes Berg break; 1518318d78aSJohannes Berg } 1528318d78aSJohannes Berg case IEEE80211_BAND_5GHZ: 1538318d78aSJohannes Berg if (r->flags & IEEE80211_RATE_MANDATORY_A) 1548318d78aSJohannes Berg mrate = r->bitrate; 1558318d78aSJohannes Berg break; 1563a0c52a6SVladimir Kondratiev case IEEE80211_BAND_60GHZ: 1573a0c52a6SVladimir Kondratiev /* TODO, for now fall through */ 1588318d78aSJohannes Berg case IEEE80211_NUM_BANDS: 1598318d78aSJohannes Berg WARN_ON(1); 1608318d78aSJohannes Berg break; 1618318d78aSJohannes Berg } 162e2ebc74dSJohannes Berg } 163e2ebc74dSJohannes Berg if (rate == -1) { 164e2ebc74dSJohannes Berg /* No matching basic rate found; use highest suitable mandatory 165e2ebc74dSJohannes Berg * PHY rate */ 1662103dec1SSimon Wunderlich rate = DIV_ROUND_UP(mrate, 1 << shift); 167e2ebc74dSJohannes Berg } 168e2ebc74dSJohannes Berg 1696674f210SSimon Wunderlich /* Don't calculate ACKs for QoS Frames with NoAck Policy set */ 1706674f210SSimon Wunderlich if (ieee80211_is_data_qos(hdr->frame_control) && 171c26a0e10SClaudio Pisa *(ieee80211_get_qos_ctl(hdr)) & IEEE80211_QOS_CTL_ACK_POLICY_NOACK) 1726674f210SSimon Wunderlich dur = 0; 1736674f210SSimon Wunderlich else 174e2ebc74dSJohannes Berg /* Time needed to transmit ACK 175e2ebc74dSJohannes Berg * (10 bytes + 4-byte FCS = 112 bits) plus SIFS; rounded up 176e2ebc74dSJohannes Berg * to closest integer */ 1774ee73f33SMichal Kazior dur = ieee80211_frame_duration(sband->band, 10, rate, erp, 178438b61b7SSimon Wunderlich tx->sdata->vif.bss_conf.use_short_preamble, 179438b61b7SSimon Wunderlich shift); 180e2ebc74dSJohannes Berg 181e2ebc74dSJohannes Berg if (next_frag_len) { 182e2ebc74dSJohannes Berg /* Frame is fragmented: duration increases with time needed to 183e2ebc74dSJohannes Berg * transmit next fragment plus ACK and 2 x SIFS. */ 184e2ebc74dSJohannes Berg dur *= 2; /* ACK + SIFS */ 185e2ebc74dSJohannes Berg /* next fragment */ 1864ee73f33SMichal Kazior dur += ieee80211_frame_duration(sband->band, next_frag_len, 1878318d78aSJohannes Berg txrate->bitrate, erp, 188438b61b7SSimon Wunderlich tx->sdata->vif.bss_conf.use_short_preamble, 189438b61b7SSimon Wunderlich shift); 190e2ebc74dSJohannes Berg } 191e2ebc74dSJohannes Berg 19203f93c3dSJohannes Berg return cpu_to_le16(dur); 193e2ebc74dSJohannes Berg } 194e2ebc74dSJohannes Berg 195e2ebc74dSJohannes Berg /* tx handlers */ 1965c1b98a5SKalle Valo static ieee80211_tx_result debug_noinline 1975c1b98a5SKalle Valo ieee80211_tx_h_dynamic_ps(struct ieee80211_tx_data *tx) 1985c1b98a5SKalle Valo { 1995c1b98a5SKalle Valo struct ieee80211_local *local = tx->local; 2000c74211dSKalle Valo struct ieee80211_if_managed *ifmgd; 2015c1b98a5SKalle Valo 2025c1b98a5SKalle Valo /* driver doesn't support power save */ 2035c1b98a5SKalle Valo if (!(local->hw.flags & IEEE80211_HW_SUPPORTS_PS)) 2045c1b98a5SKalle Valo return TX_CONTINUE; 2055c1b98a5SKalle Valo 2065c1b98a5SKalle Valo /* hardware does dynamic power save */ 2075c1b98a5SKalle Valo if (local->hw.flags & IEEE80211_HW_SUPPORTS_DYNAMIC_PS) 2085c1b98a5SKalle Valo return TX_CONTINUE; 2095c1b98a5SKalle Valo 2105c1b98a5SKalle Valo /* dynamic power save disabled */ 2115c1b98a5SKalle Valo if (local->hw.conf.dynamic_ps_timeout <= 0) 2125c1b98a5SKalle Valo return TX_CONTINUE; 2135c1b98a5SKalle Valo 2145c1b98a5SKalle Valo /* we are scanning, don't enable power save */ 2155c1b98a5SKalle Valo if (local->scanning) 2165c1b98a5SKalle Valo return TX_CONTINUE; 2175c1b98a5SKalle Valo 2185c1b98a5SKalle Valo if (!local->ps_sdata) 2195c1b98a5SKalle Valo return TX_CONTINUE; 2205c1b98a5SKalle Valo 2215c1b98a5SKalle Valo /* No point if we're going to suspend */ 2225c1b98a5SKalle Valo if (local->quiescing) 2235c1b98a5SKalle Valo return TX_CONTINUE; 2245c1b98a5SKalle Valo 2250c74211dSKalle Valo /* dynamic ps is supported only in managed mode */ 2260c74211dSKalle Valo if (tx->sdata->vif.type != NL80211_IFTYPE_STATION) 2270c74211dSKalle Valo return TX_CONTINUE; 2280c74211dSKalle Valo 2290c74211dSKalle Valo ifmgd = &tx->sdata->u.mgd; 2300c74211dSKalle Valo 2310c74211dSKalle Valo /* 2320c74211dSKalle Valo * Don't wakeup from power save if u-apsd is enabled, voip ac has 2330c74211dSKalle Valo * u-apsd enabled and the frame is in voip class. This effectively 2340c74211dSKalle Valo * means that even if all access categories have u-apsd enabled, in 2350c74211dSKalle Valo * practise u-apsd is only used with the voip ac. This is a 2360c74211dSKalle Valo * workaround for the case when received voip class packets do not 2370c74211dSKalle Valo * have correct qos tag for some reason, due the network or the 2380c74211dSKalle Valo * peer application. 2390c74211dSKalle Valo * 240dc41e4d4SEliad Peller * Note: ifmgd->uapsd_queues access is racy here. If the value is 2410c74211dSKalle Valo * changed via debugfs, user needs to reassociate manually to have 2420c74211dSKalle Valo * everything in sync. 2430c74211dSKalle Valo */ 2444875d30dSJohannes Berg if ((ifmgd->flags & IEEE80211_STA_UAPSD_ENABLED) && 2454875d30dSJohannes Berg (ifmgd->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VO) && 2464875d30dSJohannes Berg skb_get_queue_mapping(tx->skb) == IEEE80211_AC_VO) 2470c74211dSKalle Valo return TX_CONTINUE; 2480c74211dSKalle Valo 2495c1b98a5SKalle Valo if (local->hw.conf.flags & IEEE80211_CONF_PS) { 2505c1b98a5SKalle Valo ieee80211_stop_queues_by_reason(&local->hw, 251445ea4e8SJohannes Berg IEEE80211_MAX_QUEUE_MAP, 2525c1b98a5SKalle Valo IEEE80211_QUEUE_STOP_REASON_PS); 253db28569aSVivek Natarajan ifmgd->flags &= ~IEEE80211_STA_NULLFUNC_ACKED; 2545c1b98a5SKalle Valo ieee80211_queue_work(&local->hw, 2555c1b98a5SKalle Valo &local->dynamic_ps_disable_work); 2565c1b98a5SKalle Valo } 2575c1b98a5SKalle Valo 2585db1c07cSLuciano Coelho /* Don't restart the timer if we're not disassociated */ 2595db1c07cSLuciano Coelho if (!ifmgd->associated) 2605db1c07cSLuciano Coelho return TX_CONTINUE; 2615db1c07cSLuciano Coelho 2625c1b98a5SKalle Valo mod_timer(&local->dynamic_ps_timer, jiffies + 2635c1b98a5SKalle Valo msecs_to_jiffies(local->hw.conf.dynamic_ps_timeout)); 2645c1b98a5SKalle Valo 2655c1b98a5SKalle Valo return TX_CONTINUE; 2665c1b98a5SKalle Valo } 267e2ebc74dSJohannes Berg 268d9e8a70fSJohannes Berg static ieee80211_tx_result debug_noinline 2695cf121c3SJohannes Berg ieee80211_tx_h_check_assoc(struct ieee80211_tx_data *tx) 270e2ebc74dSJohannes Berg { 271358c8d9dSHarvey Harrison 272e039fa4aSJohannes Berg struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)tx->skb->data; 273e039fa4aSJohannes Berg struct ieee80211_tx_info *info = IEEE80211_SKB_CB(tx->skb); 274c2c98fdeSJohannes Berg bool assoc = false; 275e2ebc74dSJohannes Berg 276e039fa4aSJohannes Berg if (unlikely(info->flags & IEEE80211_TX_CTL_INJECTED)) 2779ae54c84SJohannes Berg return TX_CONTINUE; 27858d4185eSJohannes Berg 279b23b025fSBen Greear if (unlikely(test_bit(SCAN_SW_SCANNING, &tx->local->scanning)) && 280b23b025fSBen Greear test_bit(SDATA_STATE_OFFCHANNEL, &tx->sdata->state) && 281a9a6ffffSKalle Valo !ieee80211_is_probe_req(hdr->frame_control) && 282a9a6ffffSKalle Valo !ieee80211_is_nullfunc(hdr->frame_control)) 283a9a6ffffSKalle Valo /* 284a9a6ffffSKalle Valo * When software scanning only nullfunc frames (to notify 285a9a6ffffSKalle Valo * the sleep state to the AP) and probe requests (for the 286a9a6ffffSKalle Valo * active scan) are allowed, all other frames should not be 287a9a6ffffSKalle Valo * sent and we should not get here, but if we do 288a9a6ffffSKalle Valo * nonetheless, drop them to avoid sending them 289a9a6ffffSKalle Valo * off-channel. See the link below and 290a9a6ffffSKalle Valo * ieee80211_start_scan() for more. 291a9a6ffffSKalle Valo * 292a9a6ffffSKalle Valo * http://article.gmane.org/gmane.linux.kernel.wireless.general/30089 293a9a6ffffSKalle Valo */ 2949ae54c84SJohannes Berg return TX_DROP; 295e2ebc74dSJohannes Berg 2961be7fe8dSBill Jordan if (tx->sdata->vif.type == NL80211_IFTYPE_WDS) 2971be7fe8dSBill Jordan return TX_CONTINUE; 2981be7fe8dSBill Jordan 29905c914feSJohannes Berg if (tx->sdata->vif.type == NL80211_IFTYPE_MESH_POINT) 30033b64eb2SLuis Carlos Cobo return TX_CONTINUE; 30133b64eb2SLuis Carlos Cobo 3025cf121c3SJohannes Berg if (tx->flags & IEEE80211_TX_PS_BUFFERED) 3039ae54c84SJohannes Berg return TX_CONTINUE; 304e2ebc74dSJohannes Berg 305c2c98fdeSJohannes Berg if (tx->sta) 306c2c98fdeSJohannes Berg assoc = test_sta_flag(tx->sta, WLAN_STA_ASSOC); 307e2ebc74dSJohannes Berg 3085cf121c3SJohannes Berg if (likely(tx->flags & IEEE80211_TX_UNICAST)) { 309c2c98fdeSJohannes Berg if (unlikely(!assoc && 310358c8d9dSHarvey Harrison ieee80211_is_data(hdr->frame_control))) { 311e2ebc74dSJohannes Berg #ifdef CONFIG_MAC80211_VERBOSE_DEBUG 312bdcbd8e0SJohannes Berg sdata_info(tx->sdata, 313bdcbd8e0SJohannes Berg "dropped data frame to not associated station %pM\n", 314bdcbd8e0SJohannes Berg hdr->addr1); 315bdcbd8e0SJohannes Berg #endif 316e2ebc74dSJohannes Berg I802_DEBUG_INC(tx->local->tx_handlers_drop_not_assoc); 3179ae54c84SJohannes Berg return TX_DROP; 318e2ebc74dSJohannes Berg } 31929623892SJohannes Berg } else if (unlikely(tx->sdata->vif.type == NL80211_IFTYPE_AP && 32029623892SJohannes Berg ieee80211_is_data(hdr->frame_control) && 321030ef8f8SFelix Fietkau !atomic_read(&tx->sdata->u.ap.num_mcast_sta))) { 322e2ebc74dSJohannes Berg /* 323e2ebc74dSJohannes Berg * No associated STAs - no need to send multicast 324e2ebc74dSJohannes Berg * frames. 325e2ebc74dSJohannes Berg */ 3269ae54c84SJohannes Berg return TX_DROP; 327e2ebc74dSJohannes Berg } 328e2ebc74dSJohannes Berg 3299ae54c84SJohannes Berg return TX_CONTINUE; 330e2ebc74dSJohannes Berg } 331e2ebc74dSJohannes Berg 332e2ebc74dSJohannes Berg /* This function is called whenever the AP is about to exceed the maximum limit 333e2ebc74dSJohannes Berg * of buffered frames for power saving STAs. This situation should not really 334e2ebc74dSJohannes Berg * happen often during normal operation, so dropping the oldest buffered packet 335e2ebc74dSJohannes Berg * from each queue should be OK to make some room for new frames. */ 336e2ebc74dSJohannes Berg static void purge_old_ps_buffers(struct ieee80211_local *local) 337e2ebc74dSJohannes Berg { 338e2ebc74dSJohannes Berg int total = 0, purged = 0; 339e2ebc74dSJohannes Berg struct sk_buff *skb; 340e2ebc74dSJohannes Berg struct ieee80211_sub_if_data *sdata; 341e2ebc74dSJohannes Berg struct sta_info *sta; 342e2ebc74dSJohannes Berg 34379010420SJohannes Berg list_for_each_entry_rcu(sdata, &local->interfaces, list) { 344d012a605SMarco Porsch struct ps_data *ps; 345d012a605SMarco Porsch 346d012a605SMarco Porsch if (sdata->vif.type == NL80211_IFTYPE_AP) 347d012a605SMarco Porsch ps = &sdata->u.ap.ps; 3483f52b7e3SMarco Porsch else if (ieee80211_vif_is_mesh(&sdata->vif)) 3493f52b7e3SMarco Porsch ps = &sdata->u.mesh.ps; 350d012a605SMarco Porsch else 351e2ebc74dSJohannes Berg continue; 352d012a605SMarco Porsch 353d012a605SMarco Porsch skb = skb_dequeue(&ps->bc_buf); 354e2ebc74dSJohannes Berg if (skb) { 355e2ebc74dSJohannes Berg purged++; 356e2ebc74dSJohannes Berg dev_kfree_skb(skb); 357e2ebc74dSJohannes Berg } 358d012a605SMarco Porsch total += skb_queue_len(&ps->bc_buf); 359e2ebc74dSJohannes Berg } 360e2ebc74dSJohannes Berg 361948d887dSJohannes Berg /* 362948d887dSJohannes Berg * Drop one frame from each station from the lowest-priority 363948d887dSJohannes Berg * AC that has frames at all. 364948d887dSJohannes Berg */ 365d0709a65SJohannes Berg list_for_each_entry_rcu(sta, &local->sta_list, list) { 366948d887dSJohannes Berg int ac; 367948d887dSJohannes Berg 368948d887dSJohannes Berg for (ac = IEEE80211_AC_BK; ac >= IEEE80211_AC_VO; ac--) { 369948d887dSJohannes Berg skb = skb_dequeue(&sta->ps_tx_buf[ac]); 370948d887dSJohannes Berg total += skb_queue_len(&sta->ps_tx_buf[ac]); 371e2ebc74dSJohannes Berg if (skb) { 372e2ebc74dSJohannes Berg purged++; 373c3e7724bSFelix Fietkau ieee80211_free_txskb(&local->hw, skb); 374948d887dSJohannes Berg break; 375e2ebc74dSJohannes Berg } 376948d887dSJohannes Berg } 377e2ebc74dSJohannes Berg } 378d0709a65SJohannes Berg 379e2ebc74dSJohannes Berg local->total_ps_buffered = total; 380bdcbd8e0SJohannes Berg ps_dbg_hw(&local->hw, "PS buffers full - purged %d frames\n", purged); 381e2ebc74dSJohannes Berg } 382e2ebc74dSJohannes Berg 3839ae54c84SJohannes Berg static ieee80211_tx_result 3845cf121c3SJohannes Berg ieee80211_tx_h_multicast_ps_buf(struct ieee80211_tx_data *tx) 385e2ebc74dSJohannes Berg { 386e039fa4aSJohannes Berg struct ieee80211_tx_info *info = IEEE80211_SKB_CB(tx->skb); 387358c8d9dSHarvey Harrison struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)tx->skb->data; 388d012a605SMarco Porsch struct ps_data *ps; 389e039fa4aSJohannes Berg 3907d54d0ddSJohannes Berg /* 3917d54d0ddSJohannes Berg * broadcast/multicast frame 3927d54d0ddSJohannes Berg * 3933f52b7e3SMarco Porsch * If any of the associated/peer stations is in power save mode, 3947d54d0ddSJohannes Berg * the frame is buffered to be sent after DTIM beacon frame. 3957d54d0ddSJohannes Berg * This is done either by the hardware or us. 3967d54d0ddSJohannes Berg */ 3977d54d0ddSJohannes Berg 3983f52b7e3SMarco Porsch /* powersaving STAs currently only in AP/VLAN/mesh mode */ 399d012a605SMarco Porsch if (tx->sdata->vif.type == NL80211_IFTYPE_AP || 400d012a605SMarco Porsch tx->sdata->vif.type == NL80211_IFTYPE_AP_VLAN) { 4013e122be0SJohannes Berg if (!tx->sdata->bss) 4023e122be0SJohannes Berg return TX_CONTINUE; 4033e122be0SJohannes Berg 404d012a605SMarco Porsch ps = &tx->sdata->bss->ps; 4053f52b7e3SMarco Porsch } else if (ieee80211_vif_is_mesh(&tx->sdata->vif)) { 4063f52b7e3SMarco Porsch ps = &tx->sdata->u.mesh.ps; 407d012a605SMarco Porsch } else { 408d012a605SMarco Porsch return TX_CONTINUE; 409d012a605SMarco Porsch } 410d012a605SMarco Porsch 411d012a605SMarco Porsch 4123e122be0SJohannes Berg /* no buffering for ordered frames */ 413358c8d9dSHarvey Harrison if (ieee80211_has_order(hdr->frame_control)) 4149ae54c84SJohannes Berg return TX_CONTINUE; 4157d54d0ddSJohannes Berg 416f4d57941SJohannes Berg if (tx->local->hw.flags & IEEE80211_HW_QUEUE_CONTROL) 417f4d57941SJohannes Berg info->hw_queue = tx->sdata->vif.cab_queue; 418f4d57941SJohannes Berg 4197d54d0ddSJohannes Berg /* no stations in PS mode */ 420d012a605SMarco Porsch if (!atomic_read(&ps->num_sta_ps)) 4219ae54c84SJohannes Berg return TX_CONTINUE; 4227d54d0ddSJohannes Berg 42362b1208eSJohannes Berg info->flags |= IEEE80211_TX_CTL_SEND_AFTER_DTIM; 42462b1208eSJohannes Berg 42562b517cbSJohannes Berg /* device releases frame after DTIM beacon */ 42662b517cbSJohannes Berg if (!(tx->local->hw.flags & IEEE80211_HW_HOST_BROADCAST_PS_BUFFERING)) 42762b1208eSJohannes Berg return TX_CONTINUE; 42862b1208eSJohannes Berg 4297d54d0ddSJohannes Berg /* buffered in mac80211 */ 430e2ebc74dSJohannes Berg if (tx->local->total_ps_buffered >= TOTAL_MAX_TX_BUFFER) 431e2ebc74dSJohannes Berg purge_old_ps_buffers(tx->local); 43262b1208eSJohannes Berg 433d012a605SMarco Porsch if (skb_queue_len(&ps->bc_buf) >= AP_MAX_BC_BUFFER) { 434bdcbd8e0SJohannes Berg ps_dbg(tx->sdata, 435bdcbd8e0SJohannes Berg "BC TX buffer full - dropping the oldest frame\n"); 436d012a605SMarco Porsch dev_kfree_skb(skb_dequeue(&ps->bc_buf)); 437e2ebc74dSJohannes Berg } else 438e2ebc74dSJohannes Berg tx->local->total_ps_buffered++; 43962b1208eSJohannes Berg 440d012a605SMarco Porsch skb_queue_tail(&ps->bc_buf, tx->skb); 44162b1208eSJohannes Berg 4429ae54c84SJohannes Berg return TX_QUEUED; 443e2ebc74dSJohannes Berg } 444e2ebc74dSJohannes Berg 445fb733336SJouni Malinen static int ieee80211_use_mfp(__le16 fc, struct sta_info *sta, 446fb733336SJouni Malinen struct sk_buff *skb) 447fb733336SJouni Malinen { 448fb733336SJouni Malinen if (!ieee80211_is_mgmt(fc)) 449fb733336SJouni Malinen return 0; 450fb733336SJouni Malinen 451c2c98fdeSJohannes Berg if (sta == NULL || !test_sta_flag(sta, WLAN_STA_MFP)) 452fb733336SJouni Malinen return 0; 453fb733336SJouni Malinen 454fb733336SJouni Malinen if (!ieee80211_is_robust_mgmt_frame((struct ieee80211_hdr *) 455fb733336SJouni Malinen skb->data)) 456fb733336SJouni Malinen return 0; 457fb733336SJouni Malinen 458fb733336SJouni Malinen return 1; 459fb733336SJouni Malinen } 460fb733336SJouni Malinen 4619ae54c84SJohannes Berg static ieee80211_tx_result 4625cf121c3SJohannes Berg ieee80211_tx_h_unicast_ps_buf(struct ieee80211_tx_data *tx) 463e2ebc74dSJohannes Berg { 464e2ebc74dSJohannes Berg struct sta_info *sta = tx->sta; 465e039fa4aSJohannes Berg struct ieee80211_tx_info *info = IEEE80211_SKB_CB(tx->skb); 466358c8d9dSHarvey Harrison struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)tx->skb->data; 4673393a608SJuuso Oikarinen struct ieee80211_local *local = tx->local; 468e2ebc74dSJohannes Berg 46902f2f1a9SJohannes Berg if (unlikely(!sta)) 4709ae54c84SJohannes Berg return TX_CONTINUE; 471e2ebc74dSJohannes Berg 472c2c98fdeSJohannes Berg if (unlikely((test_sta_flag(sta, WLAN_STA_PS_STA) || 473c2c98fdeSJohannes Berg test_sta_flag(sta, WLAN_STA_PS_DRIVER)) && 47402f2f1a9SJohannes Berg !(info->flags & IEEE80211_TX_CTL_NO_PS_BUFFER))) { 475948d887dSJohannes Berg int ac = skb_get_queue_mapping(tx->skb); 476948d887dSJohannes Berg 47702f2f1a9SJohannes Berg /* only deauth, disassoc and action are bufferable MMPDUs */ 47802f2f1a9SJohannes Berg if (ieee80211_is_mgmt(hdr->frame_control) && 47902f2f1a9SJohannes Berg !ieee80211_is_deauth(hdr->frame_control) && 48002f2f1a9SJohannes Berg !ieee80211_is_disassoc(hdr->frame_control) && 48102f2f1a9SJohannes Berg !ieee80211_is_action(hdr->frame_control)) { 48202f2f1a9SJohannes Berg info->flags |= IEEE80211_TX_CTL_NO_PS_BUFFER; 48302f2f1a9SJohannes Berg return TX_CONTINUE; 48402f2f1a9SJohannes Berg } 48502f2f1a9SJohannes Berg 486bdcbd8e0SJohannes Berg ps_dbg(sta->sdata, "STA %pM aid %d: PS buffer for AC %d\n", 487948d887dSJohannes Berg sta->sta.addr, sta->sta.aid, ac); 488e2ebc74dSJohannes Berg if (tx->local->total_ps_buffered >= TOTAL_MAX_TX_BUFFER) 489e2ebc74dSJohannes Berg purge_old_ps_buffers(tx->local); 490948d887dSJohannes Berg if (skb_queue_len(&sta->ps_tx_buf[ac]) >= STA_MAX_TX_BUFFER) { 491948d887dSJohannes Berg struct sk_buff *old = skb_dequeue(&sta->ps_tx_buf[ac]); 492bdcbd8e0SJohannes Berg ps_dbg(tx->sdata, 493bdcbd8e0SJohannes Berg "STA %pM TX buffer for AC %d full - dropping oldest frame\n", 494bdcbd8e0SJohannes Berg sta->sta.addr, ac); 495c3e7724bSFelix Fietkau ieee80211_free_txskb(&local->hw, old); 496e2ebc74dSJohannes Berg } else 497e2ebc74dSJohannes Berg tx->local->total_ps_buffered++; 498004c872eSJohannes Berg 499e039fa4aSJohannes Berg info->control.jiffies = jiffies; 5005061b0c2SJohannes Berg info->control.vif = &tx->sdata->vif; 5018f77f384SJohannes Berg info->flags |= IEEE80211_TX_INTFL_NEED_TXPROCESSING; 502948d887dSJohannes Berg skb_queue_tail(&sta->ps_tx_buf[ac], tx->skb); 5033393a608SJuuso Oikarinen 5043393a608SJuuso Oikarinen if (!timer_pending(&local->sta_cleanup)) 5053393a608SJuuso Oikarinen mod_timer(&local->sta_cleanup, 5063393a608SJuuso Oikarinen round_jiffies(jiffies + 5073393a608SJuuso Oikarinen STA_INFO_CLEANUP_INTERVAL)); 5083393a608SJuuso Oikarinen 509c868cb35SJohannes Berg /* 510c868cb35SJohannes Berg * We queued up some frames, so the TIM bit might 511c868cb35SJohannes Berg * need to be set, recalculate it. 512c868cb35SJohannes Berg */ 513c868cb35SJohannes Berg sta_info_recalc_tim(sta); 514c868cb35SJohannes Berg 5159ae54c84SJohannes Berg return TX_QUEUED; 516bdcbd8e0SJohannes Berg } else if (unlikely(test_sta_flag(sta, WLAN_STA_PS_STA))) { 517bdcbd8e0SJohannes Berg ps_dbg(tx->sdata, 518bdcbd8e0SJohannes Berg "STA %pM in PS mode, but polling/in SP -> send frame\n", 519bdcbd8e0SJohannes Berg sta->sta.addr); 520e2ebc74dSJohannes Berg } 521e2ebc74dSJohannes Berg 5229ae54c84SJohannes Berg return TX_CONTINUE; 523e2ebc74dSJohannes Berg } 524e2ebc74dSJohannes Berg 525d9e8a70fSJohannes Berg static ieee80211_tx_result debug_noinline 5265cf121c3SJohannes Berg ieee80211_tx_h_ps_buf(struct ieee80211_tx_data *tx) 527e2ebc74dSJohannes Berg { 5285cf121c3SJohannes Berg if (unlikely(tx->flags & IEEE80211_TX_PS_BUFFERED)) 5299ae54c84SJohannes Berg return TX_CONTINUE; 530e2ebc74dSJohannes Berg 5315cf121c3SJohannes Berg if (tx->flags & IEEE80211_TX_UNICAST) 532e2ebc74dSJohannes Berg return ieee80211_tx_h_unicast_ps_buf(tx); 533e2ebc74dSJohannes Berg else 534e2ebc74dSJohannes Berg return ieee80211_tx_h_multicast_ps_buf(tx); 535e2ebc74dSJohannes Berg } 536e2ebc74dSJohannes Berg 537d9e8a70fSJohannes Berg static ieee80211_tx_result debug_noinline 538a621fa4dSJohannes Berg ieee80211_tx_h_check_control_port_protocol(struct ieee80211_tx_data *tx) 539a621fa4dSJohannes Berg { 540a621fa4dSJohannes Berg struct ieee80211_tx_info *info = IEEE80211_SKB_CB(tx->skb); 541a621fa4dSJohannes Berg 542af61a165SJohannes Berg if (unlikely(tx->sdata->control_port_protocol == tx->skb->protocol)) { 543af61a165SJohannes Berg if (tx->sdata->control_port_no_encrypt) 544a621fa4dSJohannes Berg info->flags |= IEEE80211_TX_INTFL_DONT_ENCRYPT; 545af61a165SJohannes Berg info->control.flags |= IEEE80211_TX_CTRL_PORT_CTRL_PROTO; 546af61a165SJohannes Berg } 547a621fa4dSJohannes Berg 548a621fa4dSJohannes Berg return TX_CONTINUE; 549a621fa4dSJohannes Berg } 550a621fa4dSJohannes Berg 551a621fa4dSJohannes Berg static ieee80211_tx_result debug_noinline 5525cf121c3SJohannes Berg ieee80211_tx_h_select_key(struct ieee80211_tx_data *tx) 553e2ebc74dSJohannes Berg { 55446e6de15SJohannes Berg struct ieee80211_key *key; 555e039fa4aSJohannes Berg struct ieee80211_tx_info *info = IEEE80211_SKB_CB(tx->skb); 556358c8d9dSHarvey Harrison struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)tx->skb->data; 557d4e46a3dSJohannes Berg 5583b8d81e0SJohannes Berg if (unlikely(info->flags & IEEE80211_TX_INTFL_DONT_ENCRYPT)) 559e2ebc74dSJohannes Berg tx->key = NULL; 560e31b8213SJohannes Berg else if (tx->sta && (key = rcu_dereference(tx->sta->ptk))) 561d4e46a3dSJohannes Berg tx->key = key; 5623cfcf6acSJouni Malinen else if (ieee80211_is_mgmt(hdr->frame_control) && 563ecbcd324SJouni Malinen is_multicast_ether_addr(hdr->addr1) && 564ecbcd324SJouni Malinen ieee80211_is_robust_mgmt_frame(hdr) && 5653cfcf6acSJouni Malinen (key = rcu_dereference(tx->sdata->default_mgmt_key))) 5663cfcf6acSJouni Malinen tx->key = key; 567f7e0104cSJohannes Berg else if (is_multicast_ether_addr(hdr->addr1) && 568f7e0104cSJohannes Berg (key = rcu_dereference(tx->sdata->default_multicast_key))) 569f7e0104cSJohannes Berg tx->key = key; 570f7e0104cSJohannes Berg else if (!is_multicast_ether_addr(hdr->addr1) && 571f7e0104cSJohannes Berg (key = rcu_dereference(tx->sdata->default_unicast_key))) 572d4e46a3dSJohannes Berg tx->key = key; 57346e6de15SJohannes Berg else if (info->flags & IEEE80211_TX_CTL_INJECTED) 57446e6de15SJohannes Berg tx->key = NULL; 57546e6de15SJohannes Berg else if (!tx->sdata->drop_unencrypted) 57646e6de15SJohannes Berg tx->key = NULL; 57746e6de15SJohannes Berg else if (tx->skb->protocol == tx->sdata->control_port_protocol) 57846e6de15SJohannes Berg tx->key = NULL; 57946e6de15SJohannes Berg else if (ieee80211_is_robust_mgmt_frame(hdr) && 58046e6de15SJohannes Berg !(ieee80211_is_action(hdr->frame_control) && 58146e6de15SJohannes Berg tx->sta && test_sta_flag(tx->sta, WLAN_STA_MFP))) 58246e6de15SJohannes Berg tx->key = NULL; 5834922f71fSNicolas Cavallari else if (ieee80211_is_mgmt(hdr->frame_control) && 5844922f71fSNicolas Cavallari !ieee80211_is_robust_mgmt_frame(hdr)) 5854922f71fSNicolas Cavallari tx->key = NULL; 58646e6de15SJohannes Berg else { 587e2ebc74dSJohannes Berg I802_DEBUG_INC(tx->local->tx_handlers_drop_unencrypted); 5889ae54c84SJohannes Berg return TX_DROP; 58946e6de15SJohannes Berg } 590e2ebc74dSJohannes Berg 591e2ebc74dSJohannes Berg if (tx->key) { 592813d7669SJohannes Berg bool skip_hw = false; 593813d7669SJohannes Berg 594e2ebc74dSJohannes Berg tx->key->tx_rx_count++; 595011bfcc4SJohannes Berg /* TODO: add threshold stuff again */ 596176e4f84SJohannes Berg 59797359d12SJohannes Berg switch (tx->key->conf.cipher) { 59897359d12SJohannes Berg case WLAN_CIPHER_SUITE_WEP40: 59997359d12SJohannes Berg case WLAN_CIPHER_SUITE_WEP104: 60097359d12SJohannes Berg case WLAN_CIPHER_SUITE_TKIP: 601358c8d9dSHarvey Harrison if (!ieee80211_is_data_present(hdr->frame_control)) 602176e4f84SJohannes Berg tx->key = NULL; 603176e4f84SJohannes Berg break; 60497359d12SJohannes Berg case WLAN_CIPHER_SUITE_CCMP: 605fb733336SJouni Malinen if (!ieee80211_is_data_present(hdr->frame_control) && 606fb733336SJouni Malinen !ieee80211_use_mfp(hdr->frame_control, tx->sta, 607fb733336SJouni Malinen tx->skb)) 608fb733336SJouni Malinen tx->key = NULL; 6093b43a187SKalle Valo else 610813d7669SJohannes Berg skip_hw = (tx->key->conf.flags & 611e548c49eSJohannes Berg IEEE80211_KEY_FLAG_SW_MGMT_TX) && 612813d7669SJohannes Berg ieee80211_is_mgmt(hdr->frame_control); 613fb733336SJouni Malinen break; 61497359d12SJohannes Berg case WLAN_CIPHER_SUITE_AES_CMAC: 6153cfcf6acSJouni Malinen if (!ieee80211_is_mgmt(hdr->frame_control)) 6163cfcf6acSJouni Malinen tx->key = NULL; 6173cfcf6acSJouni Malinen break; 618e2ebc74dSJohannes Berg } 619813d7669SJohannes Berg 620e54faf29SJohannes Berg if (unlikely(tx->key && tx->key->flags & KEY_FLAG_TAINTED && 621e54faf29SJohannes Berg !ieee80211_is_deauth(hdr->frame_control))) 62295acac61SJohannes Berg return TX_DROP; 62395acac61SJohannes Berg 624f12553ebSJohannes Berg if (!skip_hw && tx->key && 625382b1655SJohannes Berg tx->key->flags & KEY_FLAG_UPLOADED_TO_HARDWARE) 626813d7669SJohannes Berg info->control.hw_key = &tx->key->conf; 627176e4f84SJohannes Berg } 628176e4f84SJohannes Berg 6299ae54c84SJohannes Berg return TX_CONTINUE; 630e2ebc74dSJohannes Berg } 631e2ebc74dSJohannes Berg 632d9e8a70fSJohannes Berg static ieee80211_tx_result debug_noinline 6335cf121c3SJohannes Berg ieee80211_tx_h_rate_ctrl(struct ieee80211_tx_data *tx) 634e2ebc74dSJohannes Berg { 635e039fa4aSJohannes Berg struct ieee80211_tx_info *info = IEEE80211_SKB_CB(tx->skb); 636e6a9854bSJohannes Berg struct ieee80211_hdr *hdr = (void *)tx->skb->data; 637e6a9854bSJohannes Berg struct ieee80211_supported_band *sband; 638a2c40249SShanyu Zhao u32 len; 639e6a9854bSJohannes Berg struct ieee80211_tx_rate_control txrc; 6400d528d85SFelix Fietkau struct ieee80211_sta_rates *ratetbl = NULL; 641c2c98fdeSJohannes Berg bool assoc = false; 642e6a9854bSJohannes Berg 643e6a9854bSJohannes Berg memset(&txrc, 0, sizeof(txrc)); 6448318d78aSJohannes Berg 6452d56577bSJohannes Berg sband = tx->local->hw.wiphy->bands[info->band]; 646e2ebc74dSJohannes Berg 647a2c40249SShanyu Zhao len = min_t(u32, tx->skb->len + FCS_LEN, 648b9a5f8caSJouni Malinen tx->local->hw.wiphy->frag_threshold); 64958d4185eSJohannes Berg 650e6a9854bSJohannes Berg /* set up the tx rate control struct we give the RC algo */ 651005e472bSJohannes Berg txrc.hw = &tx->local->hw; 652e6a9854bSJohannes Berg txrc.sband = sband; 653e6a9854bSJohannes Berg txrc.bss_conf = &tx->sdata->vif.bss_conf; 654e6a9854bSJohannes Berg txrc.skb = tx->skb; 655e6a9854bSJohannes Berg txrc.reported_rate.idx = -1; 6562d56577bSJohannes Berg txrc.rate_idx_mask = tx->sdata->rc_rateidx_mask[info->band]; 65737eb0b16SJouni Malinen if (txrc.rate_idx_mask == (1 << sband->n_bitrates) - 1) 65837eb0b16SJouni Malinen txrc.max_rate_idx = -1; 65937eb0b16SJouni Malinen else 66037eb0b16SJouni Malinen txrc.max_rate_idx = fls(txrc.rate_idx_mask) - 1; 6612ffbe6d3SFelix Fietkau 6622ffbe6d3SFelix Fietkau if (tx->sdata->rc_has_mcs_mask[info->band]) 6632ffbe6d3SFelix Fietkau txrc.rate_idx_mcs_mask = 6642ffbe6d3SFelix Fietkau tx->sdata->rc_rateidx_mcs_mask[info->band]; 6652ffbe6d3SFelix Fietkau 6668f0729b1SFelix Fietkau txrc.bss = (tx->sdata->vif.type == NL80211_IFTYPE_AP || 6674bb62344SChun-Yeow Yeoh tx->sdata->vif.type == NL80211_IFTYPE_MESH_POINT || 6688f0729b1SFelix Fietkau tx->sdata->vif.type == NL80211_IFTYPE_ADHOC); 66958d4185eSJohannes Berg 670e6a9854bSJohannes Berg /* set up RTS protection if desired */ 671b9a5f8caSJouni Malinen if (len > tx->local->hw.wiphy->rts_threshold) { 6720d528d85SFelix Fietkau txrc.rts = true; 673e2ebc74dSJohannes Berg } 674e6a9854bSJohannes Berg 6750d528d85SFelix Fietkau info->control.use_rts = txrc.rts; 676991fec09SFelix Fietkau info->control.use_cts_prot = tx->sdata->vif.bss_conf.use_cts_prot; 677991fec09SFelix Fietkau 678e6a9854bSJohannes Berg /* 679e6a9854bSJohannes Berg * Use short preamble if the BSS can handle it, but not for 680e6a9854bSJohannes Berg * management frames unless we know the receiver can handle 681e6a9854bSJohannes Berg * that -- the management frame might be to a station that 682e6a9854bSJohannes Berg * just wants a probe response. 683e6a9854bSJohannes Berg */ 684e6a9854bSJohannes Berg if (tx->sdata->vif.bss_conf.use_short_preamble && 685e6a9854bSJohannes Berg (ieee80211_is_data(hdr->frame_control) || 686c2c98fdeSJohannes Berg (tx->sta && test_sta_flag(tx->sta, WLAN_STA_SHORT_PREAMBLE)))) 6870d528d85SFelix Fietkau txrc.short_preamble = true; 6880d528d85SFelix Fietkau 6890d528d85SFelix Fietkau info->control.short_preamble = txrc.short_preamble; 690e6a9854bSJohannes Berg 691c2c98fdeSJohannes Berg if (tx->sta) 692c2c98fdeSJohannes Berg assoc = test_sta_flag(tx->sta, WLAN_STA_ASSOC); 693e6a9854bSJohannes Berg 694b770b43eSLuis R. Rodriguez /* 695b770b43eSLuis R. Rodriguez * Lets not bother rate control if we're associated and cannot 696b770b43eSLuis R. Rodriguez * talk to the sta. This should not happen. 697b770b43eSLuis R. Rodriguez */ 698c2c98fdeSJohannes Berg if (WARN(test_bit(SCAN_SW_SCANNING, &tx->local->scanning) && assoc && 699b770b43eSLuis R. Rodriguez !rate_usable_index_exists(sband, &tx->sta->sta), 700b770b43eSLuis R. Rodriguez "%s: Dropped data frame as no usable bitrate found while " 701b770b43eSLuis R. Rodriguez "scanning and associated. Target station: " 702b770b43eSLuis R. Rodriguez "%pM on %d GHz band\n", 70347846c9bSJohannes Berg tx->sdata->name, hdr->addr1, 7042d56577bSJohannes Berg info->band ? 5 : 2)) 705b770b43eSLuis R. Rodriguez return TX_DROP; 706b770b43eSLuis R. Rodriguez 707b770b43eSLuis R. Rodriguez /* 708b770b43eSLuis R. Rodriguez * If we're associated with the sta at this point we know we can at 709b770b43eSLuis R. Rodriguez * least send the frame at the lowest bit rate. 710b770b43eSLuis R. Rodriguez */ 711e6a9854bSJohannes Berg rate_control_get_rate(tx->sdata, tx->sta, &txrc); 712e6a9854bSJohannes Berg 7130d528d85SFelix Fietkau if (tx->sta && !info->control.skip_table) 7140d528d85SFelix Fietkau ratetbl = rcu_dereference(tx->sta->sta.rates); 7150d528d85SFelix Fietkau 7160d528d85SFelix Fietkau if (unlikely(info->control.rates[0].idx < 0)) { 7170d528d85SFelix Fietkau if (ratetbl) { 7180d528d85SFelix Fietkau struct ieee80211_tx_rate rate = { 7190d528d85SFelix Fietkau .idx = ratetbl->rate[0].idx, 7200d528d85SFelix Fietkau .flags = ratetbl->rate[0].flags, 7210d528d85SFelix Fietkau .count = ratetbl->rate[0].count 7220d528d85SFelix Fietkau }; 7230d528d85SFelix Fietkau 7240d528d85SFelix Fietkau if (ratetbl->rate[0].idx < 0) 725e6a9854bSJohannes Berg return TX_DROP; 726e6a9854bSJohannes Berg 7270d528d85SFelix Fietkau tx->rate = rate; 7280d528d85SFelix Fietkau } else { 7290d528d85SFelix Fietkau return TX_DROP; 7300d528d85SFelix Fietkau } 7310d528d85SFelix Fietkau } else { 7320d528d85SFelix Fietkau tx->rate = info->control.rates[0]; 7330d528d85SFelix Fietkau } 7340d528d85SFelix Fietkau 735c1ce5a74SHelmut Schaa if (txrc.reported_rate.idx < 0) { 7360d528d85SFelix Fietkau txrc.reported_rate = tx->rate; 737c1ce5a74SHelmut Schaa if (tx->sta && ieee80211_is_data(hdr->frame_control)) 738c1ce5a74SHelmut Schaa tx->sta->last_tx_rate = txrc.reported_rate; 739c1ce5a74SHelmut Schaa } else if (tx->sta) 740e6a9854bSJohannes Berg tx->sta->last_tx_rate = txrc.reported_rate; 741e6a9854bSJohannes Berg 7420d528d85SFelix Fietkau if (ratetbl) 7430d528d85SFelix Fietkau return TX_CONTINUE; 7440d528d85SFelix Fietkau 745e6a9854bSJohannes Berg if (unlikely(!info->control.rates[0].count)) 746e6a9854bSJohannes Berg info->control.rates[0].count = 1; 747e6a9854bSJohannes Berg 7489955151dSGábor Stefanik if (WARN_ON_ONCE((info->control.rates[0].count > 1) && 7499955151dSGábor Stefanik (info->flags & IEEE80211_TX_CTL_NO_ACK))) 7509955151dSGábor Stefanik info->control.rates[0].count = 1; 7519955151dSGábor Stefanik 7529ae54c84SJohannes Berg return TX_CONTINUE; 753e2ebc74dSJohannes Berg } 754e2ebc74dSJohannes Berg 755d9e8a70fSJohannes Berg static ieee80211_tx_result debug_noinline 756f591fa5dSJohannes Berg ieee80211_tx_h_sequence(struct ieee80211_tx_data *tx) 757f591fa5dSJohannes Berg { 758f591fa5dSJohannes Berg struct ieee80211_tx_info *info = IEEE80211_SKB_CB(tx->skb); 759f591fa5dSJohannes Berg struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)tx->skb->data; 760f591fa5dSJohannes Berg u16 *seq; 761f591fa5dSJohannes Berg u8 *qc; 762f591fa5dSJohannes Berg int tid; 763f591fa5dSJohannes Berg 76425d834e1SJohannes Berg /* 76525d834e1SJohannes Berg * Packet injection may want to control the sequence 76625d834e1SJohannes Berg * number, if we have no matching interface then we 76725d834e1SJohannes Berg * neither assign one ourselves nor ask the driver to. 76825d834e1SJohannes Berg */ 7695061b0c2SJohannes Berg if (unlikely(info->control.vif->type == NL80211_IFTYPE_MONITOR)) 77025d834e1SJohannes Berg return TX_CONTINUE; 77125d834e1SJohannes Berg 772f591fa5dSJohannes Berg if (unlikely(ieee80211_is_ctl(hdr->frame_control))) 773f591fa5dSJohannes Berg return TX_CONTINUE; 774f591fa5dSJohannes Berg 775f591fa5dSJohannes Berg if (ieee80211_hdrlen(hdr->frame_control) < 24) 776f591fa5dSJohannes Berg return TX_CONTINUE; 777f591fa5dSJohannes Berg 77849a59543SJohannes Berg if (ieee80211_is_qos_nullfunc(hdr->frame_control)) 77949a59543SJohannes Berg return TX_CONTINUE; 78049a59543SJohannes Berg 78194778280SJohannes Berg /* 78294778280SJohannes Berg * Anything but QoS data that has a sequence number field 78394778280SJohannes Berg * (is long enough) gets a sequence number from the global 784c4c205f3SBob Copeland * counter. QoS data frames with a multicast destination 785c4c205f3SBob Copeland * also use the global counter (802.11-2012 9.3.2.10). 78694778280SJohannes Berg */ 787c4c205f3SBob Copeland if (!ieee80211_is_data_qos(hdr->frame_control) || 788c4c205f3SBob Copeland is_multicast_ether_addr(hdr->addr1)) { 78994778280SJohannes Berg /* driver should assign sequence number */ 790f591fa5dSJohannes Berg info->flags |= IEEE80211_TX_CTL_ASSIGN_SEQ; 79194778280SJohannes Berg /* for pure STA mode without beacons, we can do it */ 79294778280SJohannes Berg hdr->seq_ctrl = cpu_to_le16(tx->sdata->sequence_number); 79394778280SJohannes Berg tx->sdata->sequence_number += 0x10; 794f591fa5dSJohannes Berg return TX_CONTINUE; 795f591fa5dSJohannes Berg } 796f591fa5dSJohannes Berg 797f591fa5dSJohannes Berg /* 798f591fa5dSJohannes Berg * This should be true for injected/management frames only, for 799f591fa5dSJohannes Berg * management frames we have set the IEEE80211_TX_CTL_ASSIGN_SEQ 800f591fa5dSJohannes Berg * above since they are not QoS-data frames. 801f591fa5dSJohannes Berg */ 802f591fa5dSJohannes Berg if (!tx->sta) 803f591fa5dSJohannes Berg return TX_CONTINUE; 804f591fa5dSJohannes Berg 805f591fa5dSJohannes Berg /* include per-STA, per-TID sequence counter */ 806f591fa5dSJohannes Berg 807f591fa5dSJohannes Berg qc = ieee80211_get_qos_ctl(hdr); 808f591fa5dSJohannes Berg tid = *qc & IEEE80211_QOS_CTL_TID_MASK; 809f591fa5dSJohannes Berg seq = &tx->sta->tid_seq[tid]; 810f591fa5dSJohannes Berg 811f591fa5dSJohannes Berg hdr->seq_ctrl = cpu_to_le16(*seq); 812f591fa5dSJohannes Berg 813f591fa5dSJohannes Berg /* Increase the sequence number. */ 814f591fa5dSJohannes Berg *seq = (*seq + 0x10) & IEEE80211_SCTL_SEQ; 815f591fa5dSJohannes Berg 816f591fa5dSJohannes Berg return TX_CONTINUE; 817f591fa5dSJohannes Berg } 818f591fa5dSJohannes Berg 819252b86c4SJohannes Berg static int ieee80211_fragment(struct ieee80211_tx_data *tx, 8202de8e0d9SJohannes Berg struct sk_buff *skb, int hdrlen, 8212de8e0d9SJohannes Berg int frag_threshold) 8222de8e0d9SJohannes Berg { 823252b86c4SJohannes Berg struct ieee80211_local *local = tx->local; 824a1a3fcecSJohannes Berg struct ieee80211_tx_info *info; 825252b86c4SJohannes Berg struct sk_buff *tmp; 8262de8e0d9SJohannes Berg int per_fragm = frag_threshold - hdrlen - FCS_LEN; 8272de8e0d9SJohannes Berg int pos = hdrlen + per_fragm; 8282de8e0d9SJohannes Berg int rem = skb->len - hdrlen - per_fragm; 8292de8e0d9SJohannes Berg 8302de8e0d9SJohannes Berg if (WARN_ON(rem < 0)) 8312de8e0d9SJohannes Berg return -EINVAL; 8322de8e0d9SJohannes Berg 833252b86c4SJohannes Berg /* first fragment was already added to queue by caller */ 834252b86c4SJohannes Berg 8352de8e0d9SJohannes Berg while (rem) { 8362de8e0d9SJohannes Berg int fraglen = per_fragm; 8372de8e0d9SJohannes Berg 8382de8e0d9SJohannes Berg if (fraglen > rem) 8392de8e0d9SJohannes Berg fraglen = rem; 8402de8e0d9SJohannes Berg rem -= fraglen; 8412de8e0d9SJohannes Berg tmp = dev_alloc_skb(local->tx_headroom + 8422de8e0d9SJohannes Berg frag_threshold + 8432de8e0d9SJohannes Berg IEEE80211_ENCRYPT_HEADROOM + 8442de8e0d9SJohannes Berg IEEE80211_ENCRYPT_TAILROOM); 8452de8e0d9SJohannes Berg if (!tmp) 8462de8e0d9SJohannes Berg return -ENOMEM; 847252b86c4SJohannes Berg 848252b86c4SJohannes Berg __skb_queue_tail(&tx->skbs, tmp); 849252b86c4SJohannes Berg 8502de8e0d9SJohannes Berg skb_reserve(tmp, local->tx_headroom + 8512de8e0d9SJohannes Berg IEEE80211_ENCRYPT_HEADROOM); 8522de8e0d9SJohannes Berg /* copy control information */ 8532de8e0d9SJohannes Berg memcpy(tmp->cb, skb->cb, sizeof(tmp->cb)); 854a1a3fcecSJohannes Berg 855a1a3fcecSJohannes Berg info = IEEE80211_SKB_CB(tmp); 856a1a3fcecSJohannes Berg info->flags &= ~(IEEE80211_TX_CTL_CLEAR_PS_FILT | 857a1a3fcecSJohannes Berg IEEE80211_TX_CTL_FIRST_FRAGMENT); 858a1a3fcecSJohannes Berg 859a1a3fcecSJohannes Berg if (rem) 860a1a3fcecSJohannes Berg info->flags |= IEEE80211_TX_CTL_MORE_FRAMES; 861a1a3fcecSJohannes Berg 8622de8e0d9SJohannes Berg skb_copy_queue_mapping(tmp, skb); 8632de8e0d9SJohannes Berg tmp->priority = skb->priority; 8642de8e0d9SJohannes Berg tmp->dev = skb->dev; 8652de8e0d9SJohannes Berg 8662de8e0d9SJohannes Berg /* copy header and data */ 8672de8e0d9SJohannes Berg memcpy(skb_put(tmp, hdrlen), skb->data, hdrlen); 8682de8e0d9SJohannes Berg memcpy(skb_put(tmp, fraglen), skb->data + pos, fraglen); 8692de8e0d9SJohannes Berg 8702de8e0d9SJohannes Berg pos += fraglen; 8712de8e0d9SJohannes Berg } 8722de8e0d9SJohannes Berg 873252b86c4SJohannes Berg /* adjust first fragment's length */ 8742de8e0d9SJohannes Berg skb->len = hdrlen + per_fragm; 8752de8e0d9SJohannes Berg return 0; 8762de8e0d9SJohannes Berg } 8772de8e0d9SJohannes Berg 878f591fa5dSJohannes Berg static ieee80211_tx_result debug_noinline 879e2454948SJohannes Berg ieee80211_tx_h_fragment(struct ieee80211_tx_data *tx) 880e2454948SJohannes Berg { 8812de8e0d9SJohannes Berg struct sk_buff *skb = tx->skb; 8822de8e0d9SJohannes Berg struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); 8832de8e0d9SJohannes Berg struct ieee80211_hdr *hdr = (void *)skb->data; 884b9a5f8caSJouni Malinen int frag_threshold = tx->local->hw.wiphy->frag_threshold; 8852de8e0d9SJohannes Berg int hdrlen; 8862de8e0d9SJohannes Berg int fragnum; 887e2454948SJohannes Berg 888252b86c4SJohannes Berg /* no matter what happens, tx->skb moves to tx->skbs */ 889252b86c4SJohannes Berg __skb_queue_tail(&tx->skbs, skb); 890252b86c4SJohannes Berg tx->skb = NULL; 891252b86c4SJohannes Berg 892a26eb27aSJohannes Berg if (info->flags & IEEE80211_TX_CTL_DONTFRAG) 893a26eb27aSJohannes Berg return TX_CONTINUE; 894a26eb27aSJohannes Berg 895a26eb27aSJohannes Berg if (tx->local->ops->set_frag_threshold) 896e2454948SJohannes Berg return TX_CONTINUE; 897e2454948SJohannes Berg 898eefce91aSJohannes Berg /* 899eefce91aSJohannes Berg * Warn when submitting a fragmented A-MPDU frame and drop it. 9003b8d81e0SJohannes Berg * This scenario is handled in ieee80211_tx_prepare but extra 9018d5e0d58SRon Rindjunsky * caution taken here as fragmented ampdu may cause Tx stop. 902eefce91aSJohannes Berg */ 9038b30b1feSSujith if (WARN_ON(info->flags & IEEE80211_TX_CTL_AMPDU)) 904eefce91aSJohannes Berg return TX_DROP; 905eefce91aSJohannes Berg 906065e9605SHarvey Harrison hdrlen = ieee80211_hdrlen(hdr->frame_control); 907e2454948SJohannes Berg 908a26eb27aSJohannes Berg /* internal error, why isn't DONTFRAG set? */ 9098ccd8f21SJohannes Berg if (WARN_ON(skb->len + FCS_LEN <= frag_threshold)) 9102de8e0d9SJohannes Berg return TX_DROP; 911e2454948SJohannes Berg 9122de8e0d9SJohannes Berg /* 9132de8e0d9SJohannes Berg * Now fragment the frame. This will allocate all the fragments and 9142de8e0d9SJohannes Berg * chain them (using skb as the first fragment) to skb->next. 9152de8e0d9SJohannes Berg * During transmission, we will remove the successfully transmitted 9162de8e0d9SJohannes Berg * fragments from this list. When the low-level driver rejects one 9172de8e0d9SJohannes Berg * of the fragments then we will simply pretend to accept the skb 9182de8e0d9SJohannes Berg * but store it away as pending. 9192de8e0d9SJohannes Berg */ 920252b86c4SJohannes Berg if (ieee80211_fragment(tx, skb, hdrlen, frag_threshold)) 9212de8e0d9SJohannes Berg return TX_DROP; 922e2454948SJohannes Berg 9232de8e0d9SJohannes Berg /* update duration/seq/flags of fragments */ 9242de8e0d9SJohannes Berg fragnum = 0; 925252b86c4SJohannes Berg 926252b86c4SJohannes Berg skb_queue_walk(&tx->skbs, skb) { 9272de8e0d9SJohannes Berg const __le16 morefrags = cpu_to_le16(IEEE80211_FCTL_MOREFRAGS); 928e2454948SJohannes Berg 9292de8e0d9SJohannes Berg hdr = (void *)skb->data; 9302de8e0d9SJohannes Berg info = IEEE80211_SKB_CB(skb); 931e6a9854bSJohannes Berg 932252b86c4SJohannes Berg if (!skb_queue_is_last(&tx->skbs, skb)) { 9332de8e0d9SJohannes Berg hdr->frame_control |= morefrags; 934e6a9854bSJohannes Berg /* 935e6a9854bSJohannes Berg * No multi-rate retries for fragmented frames, that 936e6a9854bSJohannes Berg * would completely throw off the NAV at other STAs. 937e6a9854bSJohannes Berg */ 938e6a9854bSJohannes Berg info->control.rates[1].idx = -1; 939e6a9854bSJohannes Berg info->control.rates[2].idx = -1; 940e6a9854bSJohannes Berg info->control.rates[3].idx = -1; 941e3e1a0bcSThomas Huehn BUILD_BUG_ON(IEEE80211_TX_MAX_RATES != 4); 942e6a9854bSJohannes Berg info->flags &= ~IEEE80211_TX_CTL_RATE_CTRL_PROBE; 9432de8e0d9SJohannes Berg } else { 9442de8e0d9SJohannes Berg hdr->frame_control &= ~morefrags; 945e6a9854bSJohannes Berg } 9462de8e0d9SJohannes Berg hdr->seq_ctrl |= cpu_to_le16(fragnum & IEEE80211_SCTL_FRAG); 9472de8e0d9SJohannes Berg fragnum++; 948252b86c4SJohannes Berg } 949e2454948SJohannes Berg 950e2454948SJohannes Berg return TX_CONTINUE; 951e2454948SJohannes Berg } 952e2454948SJohannes Berg 953d9e8a70fSJohannes Berg static ieee80211_tx_result debug_noinline 954feff1f2fSJohannes Berg ieee80211_tx_h_stats(struct ieee80211_tx_data *tx) 955feff1f2fSJohannes Berg { 956252b86c4SJohannes Berg struct sk_buff *skb; 957560d2682SJohannes Berg int ac = -1; 958feff1f2fSJohannes Berg 959feff1f2fSJohannes Berg if (!tx->sta) 960feff1f2fSJohannes Berg return TX_CONTINUE; 961feff1f2fSJohannes Berg 962252b86c4SJohannes Berg skb_queue_walk(&tx->skbs, skb) { 963560d2682SJohannes Berg ac = skb_get_queue_mapping(skb); 964feff1f2fSJohannes Berg tx->sta->tx_fragments++; 965560d2682SJohannes Berg tx->sta->tx_bytes[ac] += skb->len; 966252b86c4SJohannes Berg } 967560d2682SJohannes Berg if (ac >= 0) 968560d2682SJohannes Berg tx->sta->tx_packets[ac]++; 969feff1f2fSJohannes Berg 970feff1f2fSJohannes Berg return TX_CONTINUE; 971feff1f2fSJohannes Berg } 972feff1f2fSJohannes Berg 973feff1f2fSJohannes Berg static ieee80211_tx_result debug_noinline 974e2454948SJohannes Berg ieee80211_tx_h_encrypt(struct ieee80211_tx_data *tx) 975e2454948SJohannes Berg { 976e2454948SJohannes Berg if (!tx->key) 977e2454948SJohannes Berg return TX_CONTINUE; 978e2454948SJohannes Berg 97997359d12SJohannes Berg switch (tx->key->conf.cipher) { 98097359d12SJohannes Berg case WLAN_CIPHER_SUITE_WEP40: 98197359d12SJohannes Berg case WLAN_CIPHER_SUITE_WEP104: 982e2454948SJohannes Berg return ieee80211_crypto_wep_encrypt(tx); 98397359d12SJohannes Berg case WLAN_CIPHER_SUITE_TKIP: 984e2454948SJohannes Berg return ieee80211_crypto_tkip_encrypt(tx); 98597359d12SJohannes Berg case WLAN_CIPHER_SUITE_CCMP: 986e2454948SJohannes Berg return ieee80211_crypto_ccmp_encrypt(tx); 98797359d12SJohannes Berg case WLAN_CIPHER_SUITE_AES_CMAC: 9883cfcf6acSJouni Malinen return ieee80211_crypto_aes_cmac_encrypt(tx); 9893ffc2a90SJohannes Berg default: 990d32a1028SYoni Divinsky return ieee80211_crypto_hw_encrypt(tx); 991e2454948SJohannes Berg } 992e2454948SJohannes Berg 993e2454948SJohannes Berg return TX_DROP; 994e2454948SJohannes Berg } 995e2454948SJohannes Berg 996d9e8a70fSJohannes Berg static ieee80211_tx_result debug_noinline 99703f93c3dSJohannes Berg ieee80211_tx_h_calculate_duration(struct ieee80211_tx_data *tx) 99803f93c3dSJohannes Berg { 999252b86c4SJohannes Berg struct sk_buff *skb; 10002de8e0d9SJohannes Berg struct ieee80211_hdr *hdr; 10012de8e0d9SJohannes Berg int next_len; 10022de8e0d9SJohannes Berg bool group_addr; 100303f93c3dSJohannes Berg 1004252b86c4SJohannes Berg skb_queue_walk(&tx->skbs, skb) { 10052de8e0d9SJohannes Berg hdr = (void *) skb->data; 10067e0aae47SJouni Malinen if (unlikely(ieee80211_is_pspoll(hdr->frame_control))) 10077e0aae47SJouni Malinen break; /* must not overwrite AID */ 1008252b86c4SJohannes Berg if (!skb_queue_is_last(&tx->skbs, skb)) { 1009252b86c4SJohannes Berg struct sk_buff *next = skb_queue_next(&tx->skbs, skb); 1010252b86c4SJohannes Berg next_len = next->len; 1011252b86c4SJohannes Berg } else 1012252b86c4SJohannes Berg next_len = 0; 10132de8e0d9SJohannes Berg group_addr = is_multicast_ether_addr(hdr->addr1); 101403f93c3dSJohannes Berg 10152de8e0d9SJohannes Berg hdr->duration_id = 1016252b86c4SJohannes Berg ieee80211_duration(tx, skb, group_addr, next_len); 1017252b86c4SJohannes Berg } 101803f93c3dSJohannes Berg 101903f93c3dSJohannes Berg return TX_CONTINUE; 102003f93c3dSJohannes Berg } 102103f93c3dSJohannes Berg 1022e2ebc74dSJohannes Berg /* actual transmit path */ 1023e2ebc74dSJohannes Berg 1024a622ab72SJohannes Berg static bool ieee80211_tx_prep_agg(struct ieee80211_tx_data *tx, 1025a622ab72SJohannes Berg struct sk_buff *skb, 1026a622ab72SJohannes Berg struct ieee80211_tx_info *info, 1027a622ab72SJohannes Berg struct tid_ampdu_tx *tid_tx, 1028a622ab72SJohannes Berg int tid) 1029a622ab72SJohannes Berg { 1030a622ab72SJohannes Berg bool queued = false; 1031285fa695SNikolay Martynov bool reset_agg_timer = false; 1032aa454580SHelmut Schaa struct sk_buff *purge_skb = NULL; 1033a622ab72SJohannes Berg 1034a622ab72SJohannes Berg if (test_bit(HT_AGG_STATE_OPERATIONAL, &tid_tx->state)) { 1035a622ab72SJohannes Berg info->flags |= IEEE80211_TX_CTL_AMPDU; 1036285fa695SNikolay Martynov reset_agg_timer = true; 10370ab33703SJohannes Berg } else if (test_bit(HT_AGG_STATE_WANT_START, &tid_tx->state)) { 10380ab33703SJohannes Berg /* 10390ab33703SJohannes Berg * nothing -- this aggregation session is being started 10400ab33703SJohannes Berg * but that might still fail with the driver 10410ab33703SJohannes Berg */ 1042a622ab72SJohannes Berg } else { 1043a622ab72SJohannes Berg spin_lock(&tx->sta->lock); 1044a622ab72SJohannes Berg /* 1045a622ab72SJohannes Berg * Need to re-check now, because we may get here 1046a622ab72SJohannes Berg * 1047a622ab72SJohannes Berg * 1) in the window during which the setup is actually 1048a622ab72SJohannes Berg * already done, but not marked yet because not all 1049a622ab72SJohannes Berg * packets are spliced over to the driver pending 1050a622ab72SJohannes Berg * queue yet -- if this happened we acquire the lock 1051a622ab72SJohannes Berg * either before or after the splice happens, but 1052a622ab72SJohannes Berg * need to recheck which of these cases happened. 1053a622ab72SJohannes Berg * 1054a622ab72SJohannes Berg * 2) during session teardown, if the OPERATIONAL bit 1055a622ab72SJohannes Berg * was cleared due to the teardown but the pointer 1056a622ab72SJohannes Berg * hasn't been assigned NULL yet (or we loaded it 1057a622ab72SJohannes Berg * before it was assigned) -- in this case it may 1058a622ab72SJohannes Berg * now be NULL which means we should just let the 1059a622ab72SJohannes Berg * packet pass through because splicing the frames 1060a622ab72SJohannes Berg * back is already done. 1061a622ab72SJohannes Berg */ 106240b275b6SJohannes Berg tid_tx = rcu_dereference_protected_tid_tx(tx->sta, tid); 1063a622ab72SJohannes Berg 1064a622ab72SJohannes Berg if (!tid_tx) { 1065a622ab72SJohannes Berg /* do nothing, let packet pass through */ 1066a622ab72SJohannes Berg } else if (test_bit(HT_AGG_STATE_OPERATIONAL, &tid_tx->state)) { 1067a622ab72SJohannes Berg info->flags |= IEEE80211_TX_CTL_AMPDU; 1068285fa695SNikolay Martynov reset_agg_timer = true; 1069a622ab72SJohannes Berg } else { 1070a622ab72SJohannes Berg queued = true; 1071a622ab72SJohannes Berg info->control.vif = &tx->sdata->vif; 1072a622ab72SJohannes Berg info->flags |= IEEE80211_TX_INTFL_NEED_TXPROCESSING; 1073a622ab72SJohannes Berg __skb_queue_tail(&tid_tx->pending, skb); 1074aa454580SHelmut Schaa if (skb_queue_len(&tid_tx->pending) > STA_MAX_TX_BUFFER) 1075aa454580SHelmut Schaa purge_skb = __skb_dequeue(&tid_tx->pending); 1076a622ab72SJohannes Berg } 1077a622ab72SJohannes Berg spin_unlock(&tx->sta->lock); 1078aa454580SHelmut Schaa 1079aa454580SHelmut Schaa if (purge_skb) 1080c3e7724bSFelix Fietkau ieee80211_free_txskb(&tx->local->hw, purge_skb); 1081a622ab72SJohannes Berg } 1082a622ab72SJohannes Berg 1083285fa695SNikolay Martynov /* reset session timer */ 1084285fa695SNikolay Martynov if (reset_agg_timer && tid_tx->timeout) 108512d3952fSFelix Fietkau tid_tx->last_tx = jiffies; 1086285fa695SNikolay Martynov 1087a622ab72SJohannes Berg return queued; 1088a622ab72SJohannes Berg } 1089a622ab72SJohannes Berg 109058d4185eSJohannes Berg /* 109158d4185eSJohannes Berg * initialises @tx 109258d4185eSJohannes Berg */ 10939ae54c84SJohannes Berg static ieee80211_tx_result 10943b8d81e0SJohannes Berg ieee80211_tx_prepare(struct ieee80211_sub_if_data *sdata, 10953b8d81e0SJohannes Berg struct ieee80211_tx_data *tx, 10963b8d81e0SJohannes Berg struct sk_buff *skb) 1097e2ebc74dSJohannes Berg { 10983b8d81e0SJohannes Berg struct ieee80211_local *local = sdata->local; 109958d4185eSJohannes Berg struct ieee80211_hdr *hdr; 1100e039fa4aSJohannes Berg struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); 110168f2b517SJohannes Berg int tid; 1102a622ab72SJohannes Berg u8 *qc; 1103e2ebc74dSJohannes Berg 1104e2ebc74dSJohannes Berg memset(tx, 0, sizeof(*tx)); 1105e2ebc74dSJohannes Berg tx->skb = skb; 1106e2ebc74dSJohannes Berg tx->local = local; 11073b8d81e0SJohannes Berg tx->sdata = sdata; 1108252b86c4SJohannes Berg __skb_queue_head_init(&tx->skbs); 1109e2ebc74dSJohannes Berg 1110cd8ffc80SJohannes Berg /* 1111cd8ffc80SJohannes Berg * If this flag is set to true anywhere, and we get here, 1112cd8ffc80SJohannes Berg * we are doing the needed processing, so remove the flag 1113cd8ffc80SJohannes Berg * now. 1114cd8ffc80SJohannes Berg */ 1115cd8ffc80SJohannes Berg info->flags &= ~IEEE80211_TX_INTFL_NEED_TXPROCESSING; 1116cd8ffc80SJohannes Berg 111758d4185eSJohannes Berg hdr = (struct ieee80211_hdr *) skb->data; 111858d4185eSJohannes Berg 11193f0e0b22SFelix Fietkau if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN) { 1120f14543eeSFelix Fietkau tx->sta = rcu_dereference(sdata->u.vlan.sta); 11213f0e0b22SFelix Fietkau if (!tx->sta && sdata->dev->ieee80211_ptr->use_4addr) 11223f0e0b22SFelix Fietkau return TX_DROP; 112366f2c99aSFelix Fietkau } else if (info->flags & IEEE80211_TX_CTL_INJECTED || 112466f2c99aSFelix Fietkau tx->sdata->control_port_protocol == tx->skb->protocol) { 1125b4d57adbSFelix Fietkau tx->sta = sta_info_get_bss(sdata, hdr->addr1); 11263f0e0b22SFelix Fietkau } 1127f14543eeSFelix Fietkau if (!tx->sta) 1128abe60632SJohannes Berg tx->sta = sta_info_get(sdata, hdr->addr1); 112958d4185eSJohannes Berg 1130cd8ffc80SJohannes Berg if (tx->sta && ieee80211_is_data_qos(hdr->frame_control) && 113149a59543SJohannes Berg !ieee80211_is_qos_nullfunc(hdr->frame_control) && 1132edf6b784SArik Nemtsov (local->hw.flags & IEEE80211_HW_AMPDU_AGGREGATION) && 1133edf6b784SArik Nemtsov !(local->hw.flags & IEEE80211_HW_TX_AMPDU_SETUP_IN_HW)) { 1134cd8ffc80SJohannes Berg struct tid_ampdu_tx *tid_tx; 1135cd8ffc80SJohannes Berg 11368b30b1feSSujith qc = ieee80211_get_qos_ctl(hdr); 11378b30b1feSSujith tid = *qc & IEEE80211_QOS_CTL_TID_MASK; 11388b30b1feSSujith 1139a622ab72SJohannes Berg tid_tx = rcu_dereference(tx->sta->ampdu_mlme.tid_tx[tid]); 1140a622ab72SJohannes Berg if (tid_tx) { 1141a622ab72SJohannes Berg bool queued; 1142a622ab72SJohannes Berg 1143a622ab72SJohannes Berg queued = ieee80211_tx_prep_agg(tx, skb, info, 1144a622ab72SJohannes Berg tid_tx, tid); 1145cd8ffc80SJohannes Berg 1146cd8ffc80SJohannes Berg if (unlikely(queued)) 1147cd8ffc80SJohannes Berg return TX_QUEUED; 11488b30b1feSSujith } 1149a622ab72SJohannes Berg } 11508b30b1feSSujith 1151badffb72SJiri Slaby if (is_multicast_ether_addr(hdr->addr1)) { 11525cf121c3SJohannes Berg tx->flags &= ~IEEE80211_TX_UNICAST; 1153e039fa4aSJohannes Berg info->flags |= IEEE80211_TX_CTL_NO_ACK; 11546fd67e93SSimon Wunderlich } else 11555cf121c3SJohannes Berg tx->flags |= IEEE80211_TX_UNICAST; 115658d4185eSJohannes Berg 1157a26eb27aSJohannes Berg if (!(info->flags & IEEE80211_TX_CTL_DONTFRAG)) { 1158a26eb27aSJohannes Berg if (!(tx->flags & IEEE80211_TX_UNICAST) || 1159a26eb27aSJohannes Berg skb->len + FCS_LEN <= local->hw.wiphy->frag_threshold || 1160a26eb27aSJohannes Berg info->flags & IEEE80211_TX_CTL_AMPDU) 1161a26eb27aSJohannes Berg info->flags |= IEEE80211_TX_CTL_DONTFRAG; 116258d4185eSJohannes Berg } 116358d4185eSJohannes Berg 1164e2ebc74dSJohannes Berg if (!tx->sta) 1165e039fa4aSJohannes Berg info->flags |= IEEE80211_TX_CTL_CLEAR_PS_FILT; 1166c2c98fdeSJohannes Berg else if (test_and_clear_sta_flag(tx->sta, WLAN_STA_CLEAR_PS_FILT)) 1167e039fa4aSJohannes Berg info->flags |= IEEE80211_TX_CTL_CLEAR_PS_FILT; 116858d4185eSJohannes Berg 1169e039fa4aSJohannes Berg info->flags |= IEEE80211_TX_CTL_FIRST_FRAGMENT; 1170e2ebc74dSJohannes Berg 11719ae54c84SJohannes Berg return TX_CONTINUE; 1172e2ebc74dSJohannes Berg } 1173e2ebc74dSJohannes Berg 117411127e91SJohannes Berg static bool ieee80211_tx_frags(struct ieee80211_local *local, 117511127e91SJohannes Berg struct ieee80211_vif *vif, 117611127e91SJohannes Berg struct ieee80211_sta *sta, 117711127e91SJohannes Berg struct sk_buff_head *skbs, 117811127e91SJohannes Berg bool txpending) 1179e2ebc74dSJohannes Berg { 118036323f81SThomas Huehn struct ieee80211_tx_control control; 1181252b86c4SJohannes Berg struct sk_buff *skb, *tmp; 11823b8d81e0SJohannes Berg unsigned long flags; 1183e2ebc74dSJohannes Berg 1184252b86c4SJohannes Berg skb_queue_walk_safe(skbs, skb, tmp) { 11853a25a8c8SJohannes Berg struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); 11863a25a8c8SJohannes Berg int q = info->hw_queue; 11873a25a8c8SJohannes Berg 11883a25a8c8SJohannes Berg #ifdef CONFIG_MAC80211_VERBOSE_DEBUG 11893a25a8c8SJohannes Berg if (WARN_ON_ONCE(q >= local->hw.queues)) { 11903a25a8c8SJohannes Berg __skb_unlink(skb, skbs); 1191c3e7724bSFelix Fietkau ieee80211_free_txskb(&local->hw, skb); 11923a25a8c8SJohannes Berg continue; 11933a25a8c8SJohannes Berg } 11943a25a8c8SJohannes Berg #endif 11953b8d81e0SJohannes Berg 11963b8d81e0SJohannes Berg spin_lock_irqsave(&local->queue_stop_reason_lock, flags); 11973b8d81e0SJohannes Berg if (local->queue_stop_reasons[q] || 11987bb45683SJohannes Berg (!txpending && !skb_queue_empty(&local->pending[q]))) { 11996c17b77bSSeth Forshee if (unlikely(info->flags & 1200a7679ed5SSeth Forshee IEEE80211_TX_INTFL_OFFCHAN_TX_OK)) { 1201a7679ed5SSeth Forshee if (local->queue_stop_reasons[q] & 1202a7679ed5SSeth Forshee ~BIT(IEEE80211_QUEUE_STOP_REASON_OFFCHANNEL)) { 12036c17b77bSSeth Forshee /* 1204a7679ed5SSeth Forshee * Drop off-channel frames if queues 1205a7679ed5SSeth Forshee * are stopped for any reason other 1206a7679ed5SSeth Forshee * than off-channel operation. Never 1207a7679ed5SSeth Forshee * queue them. 12086c17b77bSSeth Forshee */ 12096c17b77bSSeth Forshee spin_unlock_irqrestore( 1210a7679ed5SSeth Forshee &local->queue_stop_reason_lock, 1211a7679ed5SSeth Forshee flags); 1212a7679ed5SSeth Forshee ieee80211_purge_tx_queue(&local->hw, 1213a7679ed5SSeth Forshee skbs); 12146c17b77bSSeth Forshee return true; 12156c17b77bSSeth Forshee } 1216a7679ed5SSeth Forshee } else { 12176c17b77bSSeth Forshee 12187bb45683SJohannes Berg /* 1219a7679ed5SSeth Forshee * Since queue is stopped, queue up frames for 1220a7679ed5SSeth Forshee * later transmission from the tx-pending 1221a7679ed5SSeth Forshee * tasklet when the queue is woken again. 12227bb45683SJohannes Berg */ 1223252b86c4SJohannes Berg if (txpending) 1224a7679ed5SSeth Forshee skb_queue_splice_init(skbs, 1225a7679ed5SSeth Forshee &local->pending[q]); 12267bb45683SJohannes Berg else 12274db4e0a1SJohannes Berg skb_queue_splice_tail_init(skbs, 12284db4e0a1SJohannes Berg &local->pending[q]); 12297bb45683SJohannes Berg 12307bb45683SJohannes Berg spin_unlock_irqrestore(&local->queue_stop_reason_lock, 12317bb45683SJohannes Berg flags); 12327bb45683SJohannes Berg return false; 12337bb45683SJohannes Berg } 1234a7679ed5SSeth Forshee } 12353b8d81e0SJohannes Berg spin_unlock_irqrestore(&local->queue_stop_reason_lock, flags); 1236e2530083SJohannes Berg 123711127e91SJohannes Berg info->control.vif = vif; 123836323f81SThomas Huehn control.sta = sta; 1239ec25acc4SJohannes Berg 1240252b86c4SJohannes Berg __skb_unlink(skb, skbs); 124136323f81SThomas Huehn drv_tx(local, &control, skb); 1242e2ebc74dSJohannes Berg } 12432de8e0d9SJohannes Berg 124411127e91SJohannes Berg return true; 124511127e91SJohannes Berg } 124611127e91SJohannes Berg 124711127e91SJohannes Berg /* 124811127e91SJohannes Berg * Returns false if the frame couldn't be transmitted but was queued instead. 124911127e91SJohannes Berg */ 125011127e91SJohannes Berg static bool __ieee80211_tx(struct ieee80211_local *local, 125111127e91SJohannes Berg struct sk_buff_head *skbs, int led_len, 125211127e91SJohannes Berg struct sta_info *sta, bool txpending) 125311127e91SJohannes Berg { 125411127e91SJohannes Berg struct ieee80211_tx_info *info; 125511127e91SJohannes Berg struct ieee80211_sub_if_data *sdata; 125611127e91SJohannes Berg struct ieee80211_vif *vif; 125711127e91SJohannes Berg struct ieee80211_sta *pubsta; 125811127e91SJohannes Berg struct sk_buff *skb; 125911127e91SJohannes Berg bool result = true; 126011127e91SJohannes Berg __le16 fc; 126111127e91SJohannes Berg 126211127e91SJohannes Berg if (WARN_ON(skb_queue_empty(skbs))) 126311127e91SJohannes Berg return true; 126411127e91SJohannes Berg 126511127e91SJohannes Berg skb = skb_peek(skbs); 126611127e91SJohannes Berg fc = ((struct ieee80211_hdr *)skb->data)->frame_control; 126711127e91SJohannes Berg info = IEEE80211_SKB_CB(skb); 126811127e91SJohannes Berg sdata = vif_to_sdata(info->control.vif); 126911127e91SJohannes Berg if (sta && !sta->uploaded) 127011127e91SJohannes Berg sta = NULL; 127111127e91SJohannes Berg 127211127e91SJohannes Berg if (sta) 127311127e91SJohannes Berg pubsta = &sta->sta; 127411127e91SJohannes Berg else 127511127e91SJohannes Berg pubsta = NULL; 127611127e91SJohannes Berg 127711127e91SJohannes Berg switch (sdata->vif.type) { 127811127e91SJohannes Berg case NL80211_IFTYPE_MONITOR: 1279c82b5a74SJohannes Berg if (sdata->u.mntr_flags & MONITOR_FLAG_ACTIVE) { 1280c82b5a74SJohannes Berg vif = &sdata->vif; 1281c82b5a74SJohannes Berg break; 1282c82b5a74SJohannes Berg } 12834b6f1dd6SJohannes Berg sdata = rcu_dereference(local->monitor_sdata); 12843a25a8c8SJohannes Berg if (sdata) { 12854b6f1dd6SJohannes Berg vif = &sdata->vif; 12863a25a8c8SJohannes Berg info->hw_queue = 12873a25a8c8SJohannes Berg vif->hw_queue[skb_get_queue_mapping(skb)]; 12883a25a8c8SJohannes Berg } else if (local->hw.flags & IEEE80211_HW_QUEUE_CONTROL) { 12893a25a8c8SJohannes Berg dev_kfree_skb(skb); 12903a25a8c8SJohannes Berg return true; 12913a25a8c8SJohannes Berg } else 129211127e91SJohannes Berg vif = NULL; 129311127e91SJohannes Berg break; 129411127e91SJohannes Berg case NL80211_IFTYPE_AP_VLAN: 129511127e91SJohannes Berg sdata = container_of(sdata->bss, 129611127e91SJohannes Berg struct ieee80211_sub_if_data, u.ap); 129711127e91SJohannes Berg /* fall through */ 129811127e91SJohannes Berg default: 129911127e91SJohannes Berg vif = &sdata->vif; 130011127e91SJohannes Berg break; 130111127e91SJohannes Berg } 130211127e91SJohannes Berg 130311127e91SJohannes Berg result = ieee80211_tx_frags(local, vif, pubsta, skbs, 130411127e91SJohannes Berg txpending); 130511127e91SJohannes Berg 130674e4dbfdSJohannes Berg ieee80211_tpt_led_trig_tx(local, fc, led_len); 130774e4dbfdSJohannes Berg 13084db4e0a1SJohannes Berg WARN_ON_ONCE(!skb_queue_empty(skbs)); 1309252b86c4SJohannes Berg 131011127e91SJohannes Berg return result; 1311e2ebc74dSJohannes Berg } 1312e2ebc74dSJohannes Berg 131397b045d6SJohannes Berg /* 131497b045d6SJohannes Berg * Invoke TX handlers, return 0 on success and non-zero if the 131597b045d6SJohannes Berg * frame was dropped or queued. 131697b045d6SJohannes Berg */ 131797b045d6SJohannes Berg static int invoke_tx_handlers(struct ieee80211_tx_data *tx) 131897b045d6SJohannes Berg { 1319252b86c4SJohannes Berg struct ieee80211_tx_info *info = IEEE80211_SKB_CB(tx->skb); 132097b045d6SJohannes Berg ieee80211_tx_result res = TX_DROP; 132197b045d6SJohannes Berg 1322d9e8a70fSJohannes Berg #define CALL_TXH(txh) \ 13239aa4aee3SJohannes Berg do { \ 1324d9e8a70fSJohannes Berg res = txh(tx); \ 1325d9e8a70fSJohannes Berg if (res != TX_CONTINUE) \ 13269aa4aee3SJohannes Berg goto txh_done; \ 13279aa4aee3SJohannes Berg } while (0) 132897b045d6SJohannes Berg 13295c1b98a5SKalle Valo CALL_TXH(ieee80211_tx_h_dynamic_ps); 13309aa4aee3SJohannes Berg CALL_TXH(ieee80211_tx_h_check_assoc); 13319aa4aee3SJohannes Berg CALL_TXH(ieee80211_tx_h_ps_buf); 1332a621fa4dSJohannes Berg CALL_TXH(ieee80211_tx_h_check_control_port_protocol); 13339aa4aee3SJohannes Berg CALL_TXH(ieee80211_tx_h_select_key); 1334af65cd96SJohannes Berg if (!(tx->local->hw.flags & IEEE80211_HW_HAS_RATE_CONTROL)) 13359aa4aee3SJohannes Berg CALL_TXH(ieee80211_tx_h_rate_ctrl); 1336c6fcf6bcSJohannes Berg 1337aa5b5492SJohannes Berg if (unlikely(info->flags & IEEE80211_TX_INTFL_RETRANSMISSION)) { 1338aa5b5492SJohannes Berg __skb_queue_tail(&tx->skbs, tx->skb); 1339aa5b5492SJohannes Berg tx->skb = NULL; 1340c6fcf6bcSJohannes Berg goto txh_done; 1341aa5b5492SJohannes Berg } 1342c6fcf6bcSJohannes Berg 1343c6fcf6bcSJohannes Berg CALL_TXH(ieee80211_tx_h_michael_mic_add); 13449aa4aee3SJohannes Berg CALL_TXH(ieee80211_tx_h_sequence); 13459aa4aee3SJohannes Berg CALL_TXH(ieee80211_tx_h_fragment); 1346d9e8a70fSJohannes Berg /* handlers after fragment must be aware of tx info fragmentation! */ 13479aa4aee3SJohannes Berg CALL_TXH(ieee80211_tx_h_stats); 13489aa4aee3SJohannes Berg CALL_TXH(ieee80211_tx_h_encrypt); 13498fd369eeSArik Nemtsov if (!(tx->local->hw.flags & IEEE80211_HW_HAS_RATE_CONTROL)) 13509aa4aee3SJohannes Berg CALL_TXH(ieee80211_tx_h_calculate_duration); 1351d9e8a70fSJohannes Berg #undef CALL_TXH 1352d9e8a70fSJohannes Berg 1353d9e8a70fSJohannes Berg txh_done: 135497b045d6SJohannes Berg if (unlikely(res == TX_DROP)) { 13555479d0e7STomas Winkler I802_DEBUG_INC(tx->local->tx_handlers_drop); 1356252b86c4SJohannes Berg if (tx->skb) 1357c3e7724bSFelix Fietkau ieee80211_free_txskb(&tx->local->hw, tx->skb); 1358252b86c4SJohannes Berg else 13591f98ab7fSFelix Fietkau ieee80211_purge_tx_queue(&tx->local->hw, &tx->skbs); 136097b045d6SJohannes Berg return -1; 136197b045d6SJohannes Berg } else if (unlikely(res == TX_QUEUED)) { 13625479d0e7STomas Winkler I802_DEBUG_INC(tx->local->tx_handlers_queued); 136397b045d6SJohannes Berg return -1; 136497b045d6SJohannes Berg } 136597b045d6SJohannes Berg 136697b045d6SJohannes Berg return 0; 136797b045d6SJohannes Berg } 136897b045d6SJohannes Berg 1369*06be6b14SFelix Fietkau bool ieee80211_tx_prepare_skb(struct ieee80211_hw *hw, 1370*06be6b14SFelix Fietkau struct ieee80211_vif *vif, struct sk_buff *skb, 1371*06be6b14SFelix Fietkau int band, struct ieee80211_sta **sta) 1372*06be6b14SFelix Fietkau { 1373*06be6b14SFelix Fietkau struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif); 1374*06be6b14SFelix Fietkau struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); 1375*06be6b14SFelix Fietkau struct ieee80211_tx_data tx; 1376*06be6b14SFelix Fietkau 1377*06be6b14SFelix Fietkau if (ieee80211_tx_prepare(sdata, &tx, skb) == TX_DROP) 1378*06be6b14SFelix Fietkau return false; 1379*06be6b14SFelix Fietkau 1380*06be6b14SFelix Fietkau info->band = band; 1381*06be6b14SFelix Fietkau info->control.vif = vif; 1382*06be6b14SFelix Fietkau info->hw_queue = vif->hw_queue[skb_get_queue_mapping(skb)]; 1383*06be6b14SFelix Fietkau 1384*06be6b14SFelix Fietkau if (invoke_tx_handlers(&tx)) 1385*06be6b14SFelix Fietkau return false; 1386*06be6b14SFelix Fietkau 1387*06be6b14SFelix Fietkau if (sta) { 1388*06be6b14SFelix Fietkau if (tx.sta) 1389*06be6b14SFelix Fietkau *sta = &tx.sta->sta; 1390*06be6b14SFelix Fietkau else 1391*06be6b14SFelix Fietkau *sta = NULL; 1392*06be6b14SFelix Fietkau } 1393*06be6b14SFelix Fietkau 1394*06be6b14SFelix Fietkau return true; 1395*06be6b14SFelix Fietkau } 1396*06be6b14SFelix Fietkau EXPORT_SYMBOL(ieee80211_tx_prepare_skb); 1397*06be6b14SFelix Fietkau 13987bb45683SJohannes Berg /* 13997bb45683SJohannes Berg * Returns false if the frame couldn't be transmitted but was queued instead. 14007bb45683SJohannes Berg */ 14017bb45683SJohannes Berg static bool ieee80211_tx(struct ieee80211_sub_if_data *sdata, 140255de908aSJohannes Berg struct sk_buff *skb, bool txpending, 140355de908aSJohannes Berg enum ieee80211_band band) 1404e2ebc74dSJohannes Berg { 14053b8d81e0SJohannes Berg struct ieee80211_local *local = sdata->local; 14065cf121c3SJohannes Berg struct ieee80211_tx_data tx; 140797b045d6SJohannes Berg ieee80211_tx_result res_prepare; 1408e039fa4aSJohannes Berg struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); 14097bb45683SJohannes Berg bool result = true; 141074e4dbfdSJohannes Berg int led_len; 1411e2ebc74dSJohannes Berg 1412e2ebc74dSJohannes Berg if (unlikely(skb->len < 10)) { 1413e2ebc74dSJohannes Berg dev_kfree_skb(skb); 14147bb45683SJohannes Berg return true; 1415e2ebc74dSJohannes Berg } 1416e2ebc74dSJohannes Berg 141758d4185eSJohannes Berg /* initialises tx */ 141874e4dbfdSJohannes Berg led_len = skb->len; 14193b8d81e0SJohannes Berg res_prepare = ieee80211_tx_prepare(sdata, &tx, skb); 1420e2ebc74dSJohannes Berg 1421cd8ffc80SJohannes Berg if (unlikely(res_prepare == TX_DROP)) { 1422c3e7724bSFelix Fietkau ieee80211_free_txskb(&local->hw, skb); 142355de908aSJohannes Berg return true; 1424cd8ffc80SJohannes Berg } else if (unlikely(res_prepare == TX_QUEUED)) { 142555de908aSJohannes Berg return true; 1426e2ebc74dSJohannes Berg } 1427e2ebc74dSJohannes Berg 142855de908aSJohannes Berg info->band = band; 1429e2ebc74dSJohannes Berg 14303a25a8c8SJohannes Berg /* set up hw_queue value early */ 14313a25a8c8SJohannes Berg if (!(info->flags & IEEE80211_TX_CTL_TX_OFFCHAN) || 14323a25a8c8SJohannes Berg !(local->hw.flags & IEEE80211_HW_QUEUE_CONTROL)) 14333a25a8c8SJohannes Berg info->hw_queue = 14343a25a8c8SJohannes Berg sdata->vif.hw_queue[skb_get_queue_mapping(skb)]; 14353a25a8c8SJohannes Berg 14367bb45683SJohannes Berg if (!invoke_tx_handlers(&tx)) 143774e4dbfdSJohannes Berg result = __ieee80211_tx(local, &tx.skbs, led_len, 143874e4dbfdSJohannes Berg tx.sta, txpending); 143955de908aSJohannes Berg 14407bb45683SJohannes Berg return result; 1441e2ebc74dSJohannes Berg } 1442e2ebc74dSJohannes Berg 1443e2ebc74dSJohannes Berg /* device xmit handlers */ 1444e2ebc74dSJohannes Berg 14453bff1865SYogesh Ashok Powar static int ieee80211_skb_resize(struct ieee80211_sub_if_data *sdata, 144623c0752aSJohannes Berg struct sk_buff *skb, 144723c0752aSJohannes Berg int head_need, bool may_encrypt) 144823c0752aSJohannes Berg { 14493bff1865SYogesh Ashok Powar struct ieee80211_local *local = sdata->local; 145023c0752aSJohannes Berg int tail_need = 0; 145123c0752aSJohannes Berg 14523bff1865SYogesh Ashok Powar if (may_encrypt && sdata->crypto_tx_tailroom_needed_cnt) { 145323c0752aSJohannes Berg tail_need = IEEE80211_ENCRYPT_TAILROOM; 145423c0752aSJohannes Berg tail_need -= skb_tailroom(skb); 145523c0752aSJohannes Berg tail_need = max_t(int, tail_need, 0); 145623c0752aSJohannes Berg } 145723c0752aSJohannes Berg 1458fc7c976dSFelix Fietkau if (skb_cloned(skb)) 145923c0752aSJohannes Berg I802_DEBUG_INC(local->tx_expand_skb_head_cloned); 14604cd06a34SFelix Fietkau else if (head_need || tail_need) 146123c0752aSJohannes Berg I802_DEBUG_INC(local->tx_expand_skb_head); 14624cd06a34SFelix Fietkau else 14634cd06a34SFelix Fietkau return 0; 146423c0752aSJohannes Berg 146523c0752aSJohannes Berg if (pskb_expand_head(skb, head_need, tail_need, GFP_ATOMIC)) { 14660fb9a9ecSJoe Perches wiphy_debug(local->hw.wiphy, 14670fb9a9ecSJoe Perches "failed to reallocate TX buffer\n"); 146823c0752aSJohannes Berg return -ENOMEM; 146923c0752aSJohannes Berg } 147023c0752aSJohannes Berg 147123c0752aSJohannes Berg return 0; 147223c0752aSJohannes Berg } 147323c0752aSJohannes Berg 147455de908aSJohannes Berg void ieee80211_xmit(struct ieee80211_sub_if_data *sdata, struct sk_buff *skb, 147555de908aSJohannes Berg enum ieee80211_band band) 1476e2ebc74dSJohannes Berg { 14773b8d81e0SJohannes Berg struct ieee80211_local *local = sdata->local; 1478e039fa4aSJohannes Berg struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); 1479e32f85f7SLuis Carlos Cobo struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data; 1480e2ebc74dSJohannes Berg int headroom; 148123c0752aSJohannes Berg bool may_encrypt; 1482e2ebc74dSJohannes Berg 14833b8d81e0SJohannes Berg may_encrypt = !(info->flags & IEEE80211_TX_INTFL_DONT_ENCRYPT); 148423c0752aSJohannes Berg 14853b8d81e0SJohannes Berg headroom = local->tx_headroom; 148623c0752aSJohannes Berg if (may_encrypt) 148723c0752aSJohannes Berg headroom += IEEE80211_ENCRYPT_HEADROOM; 148823c0752aSJohannes Berg headroom -= skb_headroom(skb); 148923c0752aSJohannes Berg headroom = max_t(int, 0, headroom); 149023c0752aSJohannes Berg 14913bff1865SYogesh Ashok Powar if (ieee80211_skb_resize(sdata, skb, headroom, may_encrypt)) { 1492c3e7724bSFelix Fietkau ieee80211_free_txskb(&local->hw, skb); 14933b8d81e0SJohannes Berg return; 1494e2ebc74dSJohannes Berg } 1495e2ebc74dSJohannes Berg 1496740c1aa3SSteve deRosier hdr = (struct ieee80211_hdr *) skb->data; 14975061b0c2SJohannes Berg info->control.vif = &sdata->vif; 1498cd8ffc80SJohannes Berg 14993f52b7e3SMarco Porsch if (ieee80211_vif_is_mesh(&sdata->vif)) { 15003f52b7e3SMarco Porsch if (ieee80211_is_data(hdr->frame_control) && 15013f52b7e3SMarco Porsch is_unicast_ether_addr(hdr->addr1)) { 1502bf7cd94dSJohannes Berg if (mesh_nexthop_resolve(sdata, skb)) 15033f52b7e3SMarco Porsch return; /* skb queued: don't free */ 15043f52b7e3SMarco Porsch } else { 15053f52b7e3SMarco Porsch ieee80211_mps_set_frame_flags(sdata, NULL, hdr); 15063f52b7e3SMarco Porsch } 1507cca89496SJavier Cardona } 1508cca89496SJavier Cardona 15092154c81cSJavier Cardona ieee80211_set_qos_hdr(sdata, skb); 151055de908aSJohannes Berg ieee80211_tx(sdata, skb, false, band); 1511e2ebc74dSJohannes Berg } 1512e2ebc74dSJohannes Berg 151373b9f03aSJohannes Berg static bool ieee80211_parse_tx_radiotap(struct sk_buff *skb) 151473b9f03aSJohannes Berg { 151573b9f03aSJohannes Berg struct ieee80211_radiotap_iterator iterator; 151673b9f03aSJohannes Berg struct ieee80211_radiotap_header *rthdr = 151773b9f03aSJohannes Berg (struct ieee80211_radiotap_header *) skb->data; 151873b9f03aSJohannes Berg struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); 151973b9f03aSJohannes Berg int ret = ieee80211_radiotap_iterator_init(&iterator, rthdr, skb->len, 152073b9f03aSJohannes Berg NULL); 152173b9f03aSJohannes Berg u16 txflags; 152273b9f03aSJohannes Berg 152373b9f03aSJohannes Berg info->flags |= IEEE80211_TX_INTFL_DONT_ENCRYPT | 152473b9f03aSJohannes Berg IEEE80211_TX_CTL_DONTFRAG; 152573b9f03aSJohannes Berg 152673b9f03aSJohannes Berg /* 152773b9f03aSJohannes Berg * for every radiotap entry that is present 152873b9f03aSJohannes Berg * (ieee80211_radiotap_iterator_next returns -ENOENT when no more 152973b9f03aSJohannes Berg * entries present, or -EINVAL on error) 153073b9f03aSJohannes Berg */ 153173b9f03aSJohannes Berg 153273b9f03aSJohannes Berg while (!ret) { 153373b9f03aSJohannes Berg ret = ieee80211_radiotap_iterator_next(&iterator); 153473b9f03aSJohannes Berg 153573b9f03aSJohannes Berg if (ret) 153673b9f03aSJohannes Berg continue; 153773b9f03aSJohannes Berg 153873b9f03aSJohannes Berg /* see if this argument is something we can use */ 153973b9f03aSJohannes Berg switch (iterator.this_arg_index) { 154073b9f03aSJohannes Berg /* 154173b9f03aSJohannes Berg * You must take care when dereferencing iterator.this_arg 154273b9f03aSJohannes Berg * for multibyte types... the pointer is not aligned. Use 154373b9f03aSJohannes Berg * get_unaligned((type *)iterator.this_arg) to dereference 154473b9f03aSJohannes Berg * iterator.this_arg for type "type" safely on all arches. 154573b9f03aSJohannes Berg */ 154673b9f03aSJohannes Berg case IEEE80211_RADIOTAP_FLAGS: 154773b9f03aSJohannes Berg if (*iterator.this_arg & IEEE80211_RADIOTAP_F_FCS) { 154873b9f03aSJohannes Berg /* 154973b9f03aSJohannes Berg * this indicates that the skb we have been 155073b9f03aSJohannes Berg * handed has the 32-bit FCS CRC at the end... 155173b9f03aSJohannes Berg * we should react to that by snipping it off 155273b9f03aSJohannes Berg * because it will be recomputed and added 155373b9f03aSJohannes Berg * on transmission 155473b9f03aSJohannes Berg */ 155573b9f03aSJohannes Berg if (skb->len < (iterator._max_length + FCS_LEN)) 155673b9f03aSJohannes Berg return false; 155773b9f03aSJohannes Berg 155873b9f03aSJohannes Berg skb_trim(skb, skb->len - FCS_LEN); 155973b9f03aSJohannes Berg } 156073b9f03aSJohannes Berg if (*iterator.this_arg & IEEE80211_RADIOTAP_F_WEP) 156173b9f03aSJohannes Berg info->flags &= ~IEEE80211_TX_INTFL_DONT_ENCRYPT; 156273b9f03aSJohannes Berg if (*iterator.this_arg & IEEE80211_RADIOTAP_F_FRAG) 156373b9f03aSJohannes Berg info->flags &= ~IEEE80211_TX_CTL_DONTFRAG; 156473b9f03aSJohannes Berg break; 156573b9f03aSJohannes Berg 156673b9f03aSJohannes Berg case IEEE80211_RADIOTAP_TX_FLAGS: 156773b9f03aSJohannes Berg txflags = get_unaligned_le16(iterator.this_arg); 156873b9f03aSJohannes Berg if (txflags & IEEE80211_RADIOTAP_F_TX_NOACK) 156973b9f03aSJohannes Berg info->flags |= IEEE80211_TX_CTL_NO_ACK; 157073b9f03aSJohannes Berg break; 157173b9f03aSJohannes Berg 157273b9f03aSJohannes Berg /* 157373b9f03aSJohannes Berg * Please update the file 157473b9f03aSJohannes Berg * Documentation/networking/mac80211-injection.txt 157573b9f03aSJohannes Berg * when parsing new fields here. 157673b9f03aSJohannes Berg */ 157773b9f03aSJohannes Berg 157873b9f03aSJohannes Berg default: 157973b9f03aSJohannes Berg break; 158073b9f03aSJohannes Berg } 158173b9f03aSJohannes Berg } 158273b9f03aSJohannes Berg 158373b9f03aSJohannes Berg if (ret != -ENOENT) /* ie, if we didn't simply run out of fields */ 158473b9f03aSJohannes Berg return false; 158573b9f03aSJohannes Berg 158673b9f03aSJohannes Berg /* 158773b9f03aSJohannes Berg * remove the radiotap header 158873b9f03aSJohannes Berg * iterator->_max_length was sanity-checked against 158973b9f03aSJohannes Berg * skb->len by iterator init 159073b9f03aSJohannes Berg */ 159173b9f03aSJohannes Berg skb_pull(skb, iterator._max_length); 159273b9f03aSJohannes Berg 159373b9f03aSJohannes Berg return true; 159473b9f03aSJohannes Berg } 159573b9f03aSJohannes Berg 1596d0cf9c0dSStephen Hemminger netdev_tx_t ieee80211_monitor_start_xmit(struct sk_buff *skb, 1597e2ebc74dSJohannes Berg struct net_device *dev) 1598e2ebc74dSJohannes Berg { 1599e2ebc74dSJohannes Berg struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr); 160055de908aSJohannes Berg struct ieee80211_chanctx_conf *chanctx_conf; 160155de908aSJohannes Berg struct ieee80211_channel *chan; 1602e2ebc74dSJohannes Berg struct ieee80211_radiotap_header *prthdr = 1603e2ebc74dSJohannes Berg (struct ieee80211_radiotap_header *)skb->data; 16043b8d81e0SJohannes Berg struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); 1605f75f5c6fSHelmut Schaa struct ieee80211_hdr *hdr; 16065d9cf4a5SJohannes Berg struct ieee80211_sub_if_data *tmp_sdata, *sdata; 16079b8a74e3SAndy Green u16 len_rthdr; 16085d9cf4a5SJohannes Berg int hdrlen; 1609e2ebc74dSJohannes Berg 16109b8a74e3SAndy Green /* check for not even having the fixed radiotap header part */ 16119b8a74e3SAndy Green if (unlikely(skb->len < sizeof(struct ieee80211_radiotap_header))) 16129b8a74e3SAndy Green goto fail; /* too short to be possibly valid */ 16139b8a74e3SAndy Green 16149b8a74e3SAndy Green /* is it a header version we can trust to find length from? */ 16159b8a74e3SAndy Green if (unlikely(prthdr->it_version)) 16169b8a74e3SAndy Green goto fail; /* only version 0 is supported */ 16179b8a74e3SAndy Green 16189b8a74e3SAndy Green /* then there must be a radiotap header with a length we can use */ 16199b8a74e3SAndy Green len_rthdr = ieee80211_get_radiotap_len(skb->data); 16209b8a74e3SAndy Green 16219b8a74e3SAndy Green /* does the skb contain enough to deliver on the alleged length? */ 16229b8a74e3SAndy Green if (unlikely(skb->len < len_rthdr)) 16239b8a74e3SAndy Green goto fail; /* skb too short for claimed rt header extent */ 1624e2ebc74dSJohannes Berg 1625e2ebc74dSJohannes Berg /* 1626e2ebc74dSJohannes Berg * fix up the pointers accounting for the radiotap 1627e2ebc74dSJohannes Berg * header still being in there. We are being given 1628e2ebc74dSJohannes Berg * a precooked IEEE80211 header so no need for 1629e2ebc74dSJohannes Berg * normal processing 1630e2ebc74dSJohannes Berg */ 16319b8a74e3SAndy Green skb_set_mac_header(skb, len_rthdr); 1632e2ebc74dSJohannes Berg /* 16339b8a74e3SAndy Green * these are just fixed to the end of the rt area since we 16349b8a74e3SAndy Green * don't have any better information and at this point, nobody cares 1635e2ebc74dSJohannes Berg */ 16369b8a74e3SAndy Green skb_set_network_header(skb, len_rthdr); 16379b8a74e3SAndy Green skb_set_transport_header(skb, len_rthdr); 1638e2ebc74dSJohannes Berg 16395d9cf4a5SJohannes Berg if (skb->len < len_rthdr + 2) 16405d9cf4a5SJohannes Berg goto fail; 16415d9cf4a5SJohannes Berg 16425d9cf4a5SJohannes Berg hdr = (struct ieee80211_hdr *)(skb->data + len_rthdr); 16435d9cf4a5SJohannes Berg hdrlen = ieee80211_hdrlen(hdr->frame_control); 16445d9cf4a5SJohannes Berg 16455d9cf4a5SJohannes Berg if (skb->len < len_rthdr + hdrlen) 16465d9cf4a5SJohannes Berg goto fail; 16475d9cf4a5SJohannes Berg 1648f75f5c6fSHelmut Schaa /* 1649f75f5c6fSHelmut Schaa * Initialize skb->protocol if the injected frame is a data frame 1650f75f5c6fSHelmut Schaa * carrying a rfc1042 header 1651f75f5c6fSHelmut Schaa */ 1652f75f5c6fSHelmut Schaa if (ieee80211_is_data(hdr->frame_control) && 16535d9cf4a5SJohannes Berg skb->len >= len_rthdr + hdrlen + sizeof(rfc1042_header) + 2) { 16545d9cf4a5SJohannes Berg u8 *payload = (u8 *)hdr + hdrlen; 16555d9cf4a5SJohannes Berg 1656b203ca39SJoe Perches if (ether_addr_equal(payload, rfc1042_header)) 1657f75f5c6fSHelmut Schaa skb->protocol = cpu_to_be16((payload[6] << 8) | 1658f75f5c6fSHelmut Schaa payload[7]); 1659f75f5c6fSHelmut Schaa } 1660f75f5c6fSHelmut Schaa 16613b8d81e0SJohannes Berg memset(info, 0, sizeof(*info)); 16623b8d81e0SJohannes Berg 16635d9cf4a5SJohannes Berg info->flags = IEEE80211_TX_CTL_REQ_TX_STATUS | 166473b9f03aSJohannes Berg IEEE80211_TX_CTL_INJECTED; 166573b9f03aSJohannes Berg 166673b9f03aSJohannes Berg /* process and remove the injection radiotap header */ 166773b9f03aSJohannes Berg if (!ieee80211_parse_tx_radiotap(skb)) 166873b9f03aSJohannes Berg goto fail; 16695d9cf4a5SJohannes Berg 16705d9cf4a5SJohannes Berg rcu_read_lock(); 16715d9cf4a5SJohannes Berg 16725d9cf4a5SJohannes Berg /* 16735d9cf4a5SJohannes Berg * We process outgoing injected frames that have a local address 16745d9cf4a5SJohannes Berg * we handle as though they are non-injected frames. 16755d9cf4a5SJohannes Berg * This code here isn't entirely correct, the local MAC address 16765d9cf4a5SJohannes Berg * isn't always enough to find the interface to use; for proper 16775d9cf4a5SJohannes Berg * VLAN/WDS support we will need a different mechanism (which 16785d9cf4a5SJohannes Berg * likely isn't going to be monitor interfaces). 16795d9cf4a5SJohannes Berg */ 16805d9cf4a5SJohannes Berg sdata = IEEE80211_DEV_TO_SUB_IF(dev); 16815d9cf4a5SJohannes Berg 16825d9cf4a5SJohannes Berg list_for_each_entry_rcu(tmp_sdata, &local->interfaces, list) { 16835d9cf4a5SJohannes Berg if (!ieee80211_sdata_running(tmp_sdata)) 16845d9cf4a5SJohannes Berg continue; 16855d9cf4a5SJohannes Berg if (tmp_sdata->vif.type == NL80211_IFTYPE_MONITOR || 16865d9cf4a5SJohannes Berg tmp_sdata->vif.type == NL80211_IFTYPE_AP_VLAN || 16875d9cf4a5SJohannes Berg tmp_sdata->vif.type == NL80211_IFTYPE_WDS) 16885d9cf4a5SJohannes Berg continue; 1689b203ca39SJoe Perches if (ether_addr_equal(tmp_sdata->vif.addr, hdr->addr2)) { 16905d9cf4a5SJohannes Berg sdata = tmp_sdata; 16915d9cf4a5SJohannes Berg break; 16925d9cf4a5SJohannes Berg } 16935d9cf4a5SJohannes Berg } 16947351c6bdSJohannes Berg 169555de908aSJohannes Berg chanctx_conf = rcu_dereference(sdata->vif.chanctx_conf); 169655de908aSJohannes Berg if (!chanctx_conf) { 169755de908aSJohannes Berg tmp_sdata = rcu_dereference(local->monitor_sdata); 169855de908aSJohannes Berg if (tmp_sdata) 169955de908aSJohannes Berg chanctx_conf = 170055de908aSJohannes Berg rcu_dereference(tmp_sdata->vif.chanctx_conf); 170155de908aSJohannes Berg } 170255de908aSJohannes Berg 1703b4a7ff75SFelix Fietkau if (chanctx_conf) 17044bf88530SJohannes Berg chan = chanctx_conf->def.chan; 1705b4a7ff75SFelix Fietkau else if (!local->use_chanctx) 1706675a0b04SKarl Beldan chan = local->_oper_chandef.chan; 1707b4a7ff75SFelix Fietkau else 1708b4a7ff75SFelix Fietkau goto fail_rcu; 170955de908aSJohannes Berg 171055de908aSJohannes Berg /* 171155de908aSJohannes Berg * Frame injection is not allowed if beaconing is not allowed 171255de908aSJohannes Berg * or if we need radar detection. Beaconing is usually not allowed when 171355de908aSJohannes Berg * the mode or operation (Adhoc, AP, Mesh) does not support DFS. 171455de908aSJohannes Berg * Passive scan is also used in world regulatory domains where 171555de908aSJohannes Berg * your country is not known and as such it should be treated as 171655de908aSJohannes Berg * NO TX unless the channel is explicitly allowed in which case 171755de908aSJohannes Berg * your current regulatory domain would not have the passive scan 171855de908aSJohannes Berg * flag. 171955de908aSJohannes Berg * 172055de908aSJohannes Berg * Since AP mode uses monitor interfaces to inject/TX management 172155de908aSJohannes Berg * frames we can make AP mode the exception to this rule once it 172255de908aSJohannes Berg * supports radar detection as its implementation can deal with 172355de908aSJohannes Berg * radar detection by itself. We can do that later by adding a 172455de908aSJohannes Berg * monitor flag interfaces used for AP support. 172555de908aSJohannes Berg */ 172655de908aSJohannes Berg if ((chan->flags & (IEEE80211_CHAN_NO_IBSS | IEEE80211_CHAN_RADAR | 172755de908aSJohannes Berg IEEE80211_CHAN_PASSIVE_SCAN))) 172855de908aSJohannes Berg goto fail_rcu; 172955de908aSJohannes Berg 173055de908aSJohannes Berg ieee80211_xmit(sdata, skb, chan->band); 17315d9cf4a5SJohannes Berg rcu_read_unlock(); 17325d9cf4a5SJohannes Berg 1733e2ebc74dSJohannes Berg return NETDEV_TX_OK; 17349b8a74e3SAndy Green 173555de908aSJohannes Berg fail_rcu: 173655de908aSJohannes Berg rcu_read_unlock(); 17379b8a74e3SAndy Green fail: 17389b8a74e3SAndy Green dev_kfree_skb(skb); 17399b8a74e3SAndy Green return NETDEV_TX_OK; /* meaning, we dealt with the skb */ 1740e2ebc74dSJohannes Berg } 1741e2ebc74dSJohannes Berg 1742e2ebc74dSJohannes Berg /** 1743e2ebc74dSJohannes Berg * ieee80211_subif_start_xmit - netif start_xmit function for Ethernet-type 1744e2ebc74dSJohannes Berg * subinterfaces (wlan#, WDS, and VLAN interfaces) 1745e2ebc74dSJohannes Berg * @skb: packet to be sent 1746e2ebc74dSJohannes Berg * @dev: incoming interface 1747e2ebc74dSJohannes Berg * 1748e2ebc74dSJohannes Berg * Returns: 0 on success (and frees skb in this case) or 1 on failure (skb will 1749e2ebc74dSJohannes Berg * not be freed, and caller is responsible for either retrying later or freeing 1750e2ebc74dSJohannes Berg * skb). 1751e2ebc74dSJohannes Berg * 1752e2ebc74dSJohannes Berg * This function takes in an Ethernet header and encapsulates it with suitable 1753e2ebc74dSJohannes Berg * IEEE 802.11 header based on which interface the packet is coming in. The 1754e2ebc74dSJohannes Berg * encapsulated packet will then be passed to master interface, wlan#.11, for 1755e2ebc74dSJohannes Berg * transmission (through low-level driver). 1756e2ebc74dSJohannes Berg */ 1757d0cf9c0dSStephen Hemminger netdev_tx_t ieee80211_subif_start_xmit(struct sk_buff *skb, 1758e2ebc74dSJohannes Berg struct net_device *dev) 1759e2ebc74dSJohannes Berg { 1760133b8226SJohannes Berg struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); 1761133b8226SJohannes Berg struct ieee80211_local *local = sdata->local; 1762489ee919SFelix Fietkau struct ieee80211_tx_info *info; 1763dcf33963SJohannes Berg int head_need; 1764065e9605SHarvey Harrison u16 ethertype, hdrlen, meshhdrlen = 0; 1765065e9605SHarvey Harrison __le16 fc; 1766e2ebc74dSJohannes Berg struct ieee80211_hdr hdr; 1767ff67bb86SWey-Yi Guy struct ieee80211s_hdr mesh_hdr __maybe_unused; 1768b8bacc18SChun-Yeow Yeoh struct mesh_path __maybe_unused *mppath = NULL, *mpath = NULL; 1769e2ebc74dSJohannes Berg const u8 *encaps_data; 1770e2ebc74dSJohannes Berg int encaps_len, skip_header_bytes; 1771e8bf9649SJiri Slaby int nh_pos, h_pos; 1772f14543eeSFelix Fietkau struct sta_info *sta = NULL; 1773c2c98fdeSJohannes Berg bool wme_sta = false, authorized = false, tdls_auth = false; 1774941c93cdSArik Nemtsov bool tdls_direct = false; 1775a729cff8SJohannes Berg bool multicast; 1776a729cff8SJohannes Berg u32 info_flags = 0; 1777a729cff8SJohannes Berg u16 info_id = 0; 177855de908aSJohannes Berg struct ieee80211_chanctx_conf *chanctx_conf; 177955de908aSJohannes Berg struct ieee80211_sub_if_data *ap_sdata; 178055de908aSJohannes Berg enum ieee80211_band band; 1781e2ebc74dSJohannes Berg 1782dcf33963SJohannes Berg if (unlikely(skb->len < ETH_HLEN)) 1783e2ebc74dSJohannes Berg goto fail; 1784e2ebc74dSJohannes Berg 1785e2ebc74dSJohannes Berg /* convert Ethernet header to proper 802.11 header (based on 1786e2ebc74dSJohannes Berg * operation mode) */ 1787e2ebc74dSJohannes Berg ethertype = (skb->data[12] << 8) | skb->data[13]; 1788065e9605SHarvey Harrison fc = cpu_to_le16(IEEE80211_FTYPE_DATA | IEEE80211_STYPE_DATA); 1789e2ebc74dSJohannes Berg 179055de908aSJohannes Berg rcu_read_lock(); 179155de908aSJohannes Berg 179251fb61e7SJohannes Berg switch (sdata->vif.type) { 179305c914feSJohannes Berg case NL80211_IFTYPE_AP_VLAN: 1794f14543eeSFelix Fietkau sta = rcu_dereference(sdata->u.vlan.sta); 1795f14543eeSFelix Fietkau if (sta) { 1796f14543eeSFelix Fietkau fc |= cpu_to_le16(IEEE80211_FCTL_FROMDS | IEEE80211_FCTL_TODS); 1797f14543eeSFelix Fietkau /* RA TA DA SA */ 1798f14543eeSFelix Fietkau memcpy(hdr.addr1, sta->sta.addr, ETH_ALEN); 179947846c9bSJohannes Berg memcpy(hdr.addr2, sdata->vif.addr, ETH_ALEN); 1800f14543eeSFelix Fietkau memcpy(hdr.addr3, skb->data, ETH_ALEN); 1801f14543eeSFelix Fietkau memcpy(hdr.addr4, skb->data + ETH_ALEN, ETH_ALEN); 1802f14543eeSFelix Fietkau hdrlen = 30; 1803c2c98fdeSJohannes Berg authorized = test_sta_flag(sta, WLAN_STA_AUTHORIZED); 1804c2c98fdeSJohannes Berg wme_sta = test_sta_flag(sta, WLAN_STA_WME); 1805f14543eeSFelix Fietkau } 180655de908aSJohannes Berg ap_sdata = container_of(sdata->bss, struct ieee80211_sub_if_data, 180755de908aSJohannes Berg u.ap); 180855de908aSJohannes Berg chanctx_conf = rcu_dereference(ap_sdata->vif.chanctx_conf); 180955de908aSJohannes Berg if (!chanctx_conf) 181055de908aSJohannes Berg goto fail_rcu; 18114bf88530SJohannes Berg band = chanctx_conf->def.chan->band; 1812f14543eeSFelix Fietkau if (sta) 1813f14543eeSFelix Fietkau break; 1814f14543eeSFelix Fietkau /* fall through */ 1815f14543eeSFelix Fietkau case NL80211_IFTYPE_AP: 1816fe80123dSArnd Bergmann if (sdata->vif.type == NL80211_IFTYPE_AP) 1817fe80123dSArnd Bergmann chanctx_conf = rcu_dereference(sdata->vif.chanctx_conf); 1818fe80123dSArnd Bergmann if (!chanctx_conf) 1819fe80123dSArnd Bergmann goto fail_rcu; 1820065e9605SHarvey Harrison fc |= cpu_to_le16(IEEE80211_FCTL_FROMDS); 1821e2ebc74dSJohannes Berg /* DA BSSID SA */ 1822e2ebc74dSJohannes Berg memcpy(hdr.addr1, skb->data, ETH_ALEN); 182347846c9bSJohannes Berg memcpy(hdr.addr2, sdata->vif.addr, ETH_ALEN); 1824e2ebc74dSJohannes Berg memcpy(hdr.addr3, skb->data + ETH_ALEN, ETH_ALEN); 1825e2ebc74dSJohannes Berg hdrlen = 24; 18264bf88530SJohannes Berg band = chanctx_conf->def.chan->band; 1827cf966838SJohannes Berg break; 182805c914feSJohannes Berg case NL80211_IFTYPE_WDS: 1829065e9605SHarvey Harrison fc |= cpu_to_le16(IEEE80211_FCTL_FROMDS | IEEE80211_FCTL_TODS); 1830e2ebc74dSJohannes Berg /* RA TA DA SA */ 1831e2ebc74dSJohannes Berg memcpy(hdr.addr1, sdata->u.wds.remote_addr, ETH_ALEN); 183247846c9bSJohannes Berg memcpy(hdr.addr2, sdata->vif.addr, ETH_ALEN); 1833e2ebc74dSJohannes Berg memcpy(hdr.addr3, skb->data, ETH_ALEN); 1834e2ebc74dSJohannes Berg memcpy(hdr.addr4, skb->data + ETH_ALEN, ETH_ALEN); 1835e2ebc74dSJohannes Berg hdrlen = 30; 183655de908aSJohannes Berg /* 183755de908aSJohannes Berg * This is the exception! WDS style interfaces are prohibited 183855de908aSJohannes Berg * when channel contexts are in used so this must be valid 183955de908aSJohannes Berg */ 1840675a0b04SKarl Beldan band = local->hw.conf.chandef.chan->band; 1841cf966838SJohannes Berg break; 184233b64eb2SLuis Carlos Cobo #ifdef CONFIG_MAC80211_MESH 184305c914feSJohannes Berg case NL80211_IFTYPE_MESH_POINT: 1844b8bacc18SChun-Yeow Yeoh if (!is_multicast_ether_addr(skb->data)) { 1845163df6cfSChun-Yeow Yeoh struct sta_info *next_hop; 1846163df6cfSChun-Yeow Yeoh bool mpp_lookup = true; 1847163df6cfSChun-Yeow Yeoh 1848bf7cd94dSJohannes Berg mpath = mesh_path_lookup(sdata, skb->data); 1849163df6cfSChun-Yeow Yeoh if (mpath) { 1850163df6cfSChun-Yeow Yeoh mpp_lookup = false; 1851163df6cfSChun-Yeow Yeoh next_hop = rcu_dereference(mpath->next_hop); 1852163df6cfSChun-Yeow Yeoh if (!next_hop || 1853163df6cfSChun-Yeow Yeoh !(mpath->flags & (MESH_PATH_ACTIVE | 1854163df6cfSChun-Yeow Yeoh MESH_PATH_RESOLVING))) 1855163df6cfSChun-Yeow Yeoh mpp_lookup = true; 1856163df6cfSChun-Yeow Yeoh } 1857163df6cfSChun-Yeow Yeoh 1858163df6cfSChun-Yeow Yeoh if (mpp_lookup) 1859bf7cd94dSJohannes Berg mppath = mpp_path_lookup(sdata, skb->data); 1860163df6cfSChun-Yeow Yeoh 1861163df6cfSChun-Yeow Yeoh if (mppath && mpath) 1862163df6cfSChun-Yeow Yeoh mesh_path_del(mpath->sdata, mpath->dst); 1863b8bacc18SChun-Yeow Yeoh } 186479617deeSYanBo 1865f76b57b4SJoel A Fernandes /* 18669d52501bSJoel A Fernandes * Use address extension if it is a packet from 18679d52501bSJoel A Fernandes * another interface or if we know the destination 18689d52501bSJoel A Fernandes * is being proxied by a portal (i.e. portal address 18699d52501bSJoel A Fernandes * differs from proxied address) 1870f76b57b4SJoel A Fernandes */ 1871b203ca39SJoe Perches if (ether_addr_equal(sdata->vif.addr, skb->data + ETH_ALEN) && 1872b203ca39SJoe Perches !(mppath && !ether_addr_equal(mppath->mpp, skb->data))) { 18733c5772a5SJavier Cardona hdrlen = ieee80211_fill_mesh_addresses(&hdr, &fc, 18743c5772a5SJavier Cardona skb->data, skb->data + ETH_ALEN); 1875bf7cd94dSJohannes Berg meshhdrlen = ieee80211_new_mesh_header(sdata, &mesh_hdr, 1876bf7cd94dSJohannes Berg NULL, NULL); 187779617deeSYanBo } else { 187827f01124SThomas Pedersen /* DS -> MBSS (802.11-2012 13.11.3.3). 187927f01124SThomas Pedersen * For unicast with unknown forwarding information, 188027f01124SThomas Pedersen * destination might be in the MBSS or if that fails 188127f01124SThomas Pedersen * forwarded to another mesh gate. In either case 188227f01124SThomas Pedersen * resolution will be handled in ieee80211_xmit(), so 188327f01124SThomas Pedersen * leave the original DA. This also works for mcast */ 188427f01124SThomas Pedersen const u8 *mesh_da = skb->data; 188579617deeSYanBo 188627f01124SThomas Pedersen if (mppath) 18873c5772a5SJavier Cardona mesh_da = mppath->mpp; 188827f01124SThomas Pedersen else if (mpath) 18897c41f315SChun-Yeow Yeoh mesh_da = mpath->dst; 189027f01124SThomas Pedersen 18913c5772a5SJavier Cardona hdrlen = ieee80211_fill_mesh_addresses(&hdr, &fc, 189247846c9bSJohannes Berg mesh_da, sdata->vif.addr); 189327f01124SThomas Pedersen if (is_multicast_ether_addr(mesh_da)) 189427f01124SThomas Pedersen /* DA TA mSA AE:SA */ 1895bf7cd94dSJohannes Berg meshhdrlen = ieee80211_new_mesh_header( 1896bf7cd94dSJohannes Berg sdata, &mesh_hdr, 1897bf7cd94dSJohannes Berg skb->data + ETH_ALEN, NULL); 18983c5772a5SJavier Cardona else 189927f01124SThomas Pedersen /* RA TA mDA mSA AE:DA SA */ 1900bf7cd94dSJohannes Berg meshhdrlen = ieee80211_new_mesh_header( 1901bf7cd94dSJohannes Berg sdata, &mesh_hdr, skb->data, 19023c5772a5SJavier Cardona skb->data + ETH_ALEN); 190379617deeSYanBo 190479617deeSYanBo } 190555de908aSJohannes Berg chanctx_conf = rcu_dereference(sdata->vif.chanctx_conf); 190655de908aSJohannes Berg if (!chanctx_conf) 190755de908aSJohannes Berg goto fail_rcu; 19084bf88530SJohannes Berg band = chanctx_conf->def.chan->band; 190933b64eb2SLuis Carlos Cobo break; 191033b64eb2SLuis Carlos Cobo #endif 191105c914feSJohannes Berg case NL80211_IFTYPE_STATION: 1912941c93cdSArik Nemtsov if (sdata->wdev.wiphy->flags & WIPHY_FLAG_SUPPORTS_TDLS) { 1913c2c98fdeSJohannes Berg bool tdls_peer = false; 1914c2c98fdeSJohannes Berg 1915941c93cdSArik Nemtsov sta = sta_info_get(sdata, skb->data); 1916c2c98fdeSJohannes Berg if (sta) { 1917c2c98fdeSJohannes Berg authorized = test_sta_flag(sta, 1918c2c98fdeSJohannes Berg WLAN_STA_AUTHORIZED); 1919c2c98fdeSJohannes Berg wme_sta = test_sta_flag(sta, WLAN_STA_WME); 1920c2c98fdeSJohannes Berg tdls_peer = test_sta_flag(sta, 1921c2c98fdeSJohannes Berg WLAN_STA_TDLS_PEER); 1922c2c98fdeSJohannes Berg tdls_auth = test_sta_flag(sta, 1923c2c98fdeSJohannes Berg WLAN_STA_TDLS_PEER_AUTH); 1924c2c98fdeSJohannes Berg } 1925941c93cdSArik Nemtsov 1926941c93cdSArik Nemtsov /* 1927941c93cdSArik Nemtsov * If the TDLS link is enabled, send everything 1928941c93cdSArik Nemtsov * directly. Otherwise, allow TDLS setup frames 1929941c93cdSArik Nemtsov * to be transmitted indirectly. 1930941c93cdSArik Nemtsov */ 1931c2c98fdeSJohannes Berg tdls_direct = tdls_peer && (tdls_auth || 1932941c93cdSArik Nemtsov !(ethertype == ETH_P_TDLS && skb->len > 14 && 1933941c93cdSArik Nemtsov skb->data[14] == WLAN_TDLS_SNAP_RFTYPE)); 1934941c93cdSArik Nemtsov } 1935941c93cdSArik Nemtsov 1936941c93cdSArik Nemtsov if (tdls_direct) { 1937941c93cdSArik Nemtsov /* link during setup - throw out frames to peer */ 1938dcf33963SJohannes Berg if (!tdls_auth) 193955de908aSJohannes Berg goto fail_rcu; 1940941c93cdSArik Nemtsov 1941941c93cdSArik Nemtsov /* DA SA BSSID */ 1942941c93cdSArik Nemtsov memcpy(hdr.addr1, skb->data, ETH_ALEN); 1943941c93cdSArik Nemtsov memcpy(hdr.addr2, skb->data + ETH_ALEN, ETH_ALEN); 1944941c93cdSArik Nemtsov memcpy(hdr.addr3, sdata->u.mgd.bssid, ETH_ALEN); 1945941c93cdSArik Nemtsov hdrlen = 24; 1946941c93cdSArik Nemtsov } else if (sdata->u.mgd.use_4addr && 1947a621fa4dSJohannes Berg cpu_to_be16(ethertype) != sdata->control_port_protocol) { 1948941c93cdSArik Nemtsov fc |= cpu_to_le16(IEEE80211_FCTL_FROMDS | 1949941c93cdSArik Nemtsov IEEE80211_FCTL_TODS); 1950f14543eeSFelix Fietkau /* RA TA DA SA */ 1951941c93cdSArik Nemtsov memcpy(hdr.addr1, sdata->u.mgd.bssid, ETH_ALEN); 195247846c9bSJohannes Berg memcpy(hdr.addr2, sdata->vif.addr, ETH_ALEN); 1953f14543eeSFelix Fietkau memcpy(hdr.addr3, skb->data, ETH_ALEN); 1954f14543eeSFelix Fietkau memcpy(hdr.addr4, skb->data + ETH_ALEN, ETH_ALEN); 1955f14543eeSFelix Fietkau hdrlen = 30; 1956f14543eeSFelix Fietkau } else { 1957065e9605SHarvey Harrison fc |= cpu_to_le16(IEEE80211_FCTL_TODS); 1958e2ebc74dSJohannes Berg /* BSSID SA DA */ 1959941c93cdSArik Nemtsov memcpy(hdr.addr1, sdata->u.mgd.bssid, ETH_ALEN); 1960e2ebc74dSJohannes Berg memcpy(hdr.addr2, skb->data + ETH_ALEN, ETH_ALEN); 1961e2ebc74dSJohannes Berg memcpy(hdr.addr3, skb->data, ETH_ALEN); 1962e2ebc74dSJohannes Berg hdrlen = 24; 1963f14543eeSFelix Fietkau } 196455de908aSJohannes Berg chanctx_conf = rcu_dereference(sdata->vif.chanctx_conf); 196555de908aSJohannes Berg if (!chanctx_conf) 196655de908aSJohannes Berg goto fail_rcu; 19674bf88530SJohannes Berg band = chanctx_conf->def.chan->band; 1968cf966838SJohannes Berg break; 196905c914feSJohannes Berg case NL80211_IFTYPE_ADHOC: 1970e2ebc74dSJohannes Berg /* DA SA BSSID */ 1971e2ebc74dSJohannes Berg memcpy(hdr.addr1, skb->data, ETH_ALEN); 1972e2ebc74dSJohannes Berg memcpy(hdr.addr2, skb->data + ETH_ALEN, ETH_ALEN); 197346900298SJohannes Berg memcpy(hdr.addr3, sdata->u.ibss.bssid, ETH_ALEN); 1974e2ebc74dSJohannes Berg hdrlen = 24; 197555de908aSJohannes Berg chanctx_conf = rcu_dereference(sdata->vif.chanctx_conf); 197655de908aSJohannes Berg if (!chanctx_conf) 197755de908aSJohannes Berg goto fail_rcu; 19784bf88530SJohannes Berg band = chanctx_conf->def.chan->band; 1979cf966838SJohannes Berg break; 1980cf966838SJohannes Berg default: 198155de908aSJohannes Berg goto fail_rcu; 1982e2ebc74dSJohannes Berg } 1983e2ebc74dSJohannes Berg 19847d185b8bSJohannes Berg /* 19857d185b8bSJohannes Berg * There's no need to try to look up the destination 19867d185b8bSJohannes Berg * if it is a multicast address (which can only happen 19877d185b8bSJohannes Berg * in AP mode) 19887d185b8bSJohannes Berg */ 1989a729cff8SJohannes Berg multicast = is_multicast_ether_addr(hdr.addr1); 1990a729cff8SJohannes Berg if (!multicast) { 1991abe60632SJohannes Berg sta = sta_info_get(sdata, hdr.addr1); 1992c2c98fdeSJohannes Berg if (sta) { 1993c2c98fdeSJohannes Berg authorized = test_sta_flag(sta, WLAN_STA_AUTHORIZED); 1994c2c98fdeSJohannes Berg wme_sta = test_sta_flag(sta, WLAN_STA_WME); 1995c2c98fdeSJohannes Berg } 19967d185b8bSJohannes Berg } 1997ce3edf6dSJohannes Berg 19984777be41SJavier Cardona /* For mesh, the use of the QoS header is mandatory */ 19994777be41SJavier Cardona if (ieee80211_vif_is_mesh(&sdata->vif)) 2000c2c98fdeSJohannes Berg wme_sta = true; 20014777be41SJavier Cardona 20023434fbd3SJohannes Berg /* receiver and we are QoS enabled, use a QoS type frame */ 200332c5057bSJohannes Berg if (wme_sta && local->hw.queues >= IEEE80211_NUM_ACS) { 2004065e9605SHarvey Harrison fc |= cpu_to_le16(IEEE80211_STYPE_QOS_DATA); 2005e2ebc74dSJohannes Berg hdrlen += 2; 2006e2ebc74dSJohannes Berg } 2007ce3edf6dSJohannes Berg 2008ce3edf6dSJohannes Berg /* 2009238814fdSJohannes Berg * Drop unicast frames to unauthorised stations unless they are 2010238814fdSJohannes Berg * EAPOL frames from the local station. 2011ce3edf6dSJohannes Berg */ 201255182e4aSJohannes Berg if (unlikely(!ieee80211_vif_is_mesh(&sdata->vif) && 2013a6ececf4SSergey Ryazanov !multicast && !authorized && 201455182e4aSJohannes Berg (cpu_to_be16(ethertype) != sdata->control_port_protocol || 2015b203ca39SJoe Perches !ether_addr_equal(sdata->vif.addr, skb->data + ETH_ALEN)))) { 2016ce3edf6dSJohannes Berg #ifdef CONFIG_MAC80211_VERBOSE_DEBUG 2017bdcbd8e0SJohannes Berg net_info_ratelimited("%s: dropped frame to %pM (unauthorized port)\n", 2018e87cc472SJoe Perches dev->name, hdr.addr1); 2019ce3edf6dSJohannes Berg #endif 2020ce3edf6dSJohannes Berg 2021ce3edf6dSJohannes Berg I802_DEBUG_INC(local->tx_handlers_drop_unauth_port); 2022ce3edf6dSJohannes Berg 202355de908aSJohannes Berg goto fail_rcu; 2024e2ebc74dSJohannes Berg } 2025e2ebc74dSJohannes Berg 2026a729cff8SJohannes Berg if (unlikely(!multicast && skb->sk && 2027a729cff8SJohannes Berg skb_shinfo(skb)->tx_flags & SKBTX_WIFI_STATUS)) { 2028a729cff8SJohannes Berg struct sk_buff *orig_skb = skb; 2029a729cff8SJohannes Berg 2030a729cff8SJohannes Berg skb = skb_clone(skb, GFP_ATOMIC); 2031a729cff8SJohannes Berg if (skb) { 2032a729cff8SJohannes Berg unsigned long flags; 20339475af6eSTejun Heo int id; 2034a729cff8SJohannes Berg 2035a729cff8SJohannes Berg spin_lock_irqsave(&local->ack_status_lock, flags); 20369475af6eSTejun Heo id = idr_alloc(&local->ack_status_frames, orig_skb, 20379475af6eSTejun Heo 1, 0x10000, GFP_ATOMIC); 2038a729cff8SJohannes Berg spin_unlock_irqrestore(&local->ack_status_lock, flags); 2039a729cff8SJohannes Berg 20409475af6eSTejun Heo if (id >= 0) { 2041a729cff8SJohannes Berg info_id = id; 2042a729cff8SJohannes Berg info_flags |= IEEE80211_TX_CTL_REQ_TX_STATUS; 2043a729cff8SJohannes Berg } else if (skb_shared(skb)) { 2044a729cff8SJohannes Berg kfree_skb(orig_skb); 2045a729cff8SJohannes Berg } else { 2046a729cff8SJohannes Berg kfree_skb(skb); 2047a729cff8SJohannes Berg skb = orig_skb; 2048a729cff8SJohannes Berg } 2049a729cff8SJohannes Berg } else { 2050a729cff8SJohannes Berg /* couldn't clone -- lose tx status ... */ 2051a729cff8SJohannes Berg skb = orig_skb; 2052a729cff8SJohannes Berg } 2053a729cff8SJohannes Berg } 2054a729cff8SJohannes Berg 20557e244707SHelmut Schaa /* 20567e244707SHelmut Schaa * If the skb is shared we need to obtain our own copy. 20577e244707SHelmut Schaa */ 20587e244707SHelmut Schaa if (skb_shared(skb)) { 2059a729cff8SJohannes Berg struct sk_buff *tmp_skb = skb; 2060a729cff8SJohannes Berg 2061a729cff8SJohannes Berg /* can't happen -- skb is a clone if info_id != 0 */ 2062a729cff8SJohannes Berg WARN_ON(info_id); 2063a729cff8SJohannes Berg 2064f8a0a781SFelix Fietkau skb = skb_clone(skb, GFP_ATOMIC); 20657e244707SHelmut Schaa kfree_skb(tmp_skb); 20667e244707SHelmut Schaa 2067dcf33963SJohannes Berg if (!skb) 206855de908aSJohannes Berg goto fail_rcu; 20697e244707SHelmut Schaa } 20707e244707SHelmut Schaa 2071065e9605SHarvey Harrison hdr.frame_control = fc; 2072e2ebc74dSJohannes Berg hdr.duration_id = 0; 2073e2ebc74dSJohannes Berg hdr.seq_ctrl = 0; 2074e2ebc74dSJohannes Berg 2075e2ebc74dSJohannes Berg skip_header_bytes = ETH_HLEN; 2076e2ebc74dSJohannes Berg if (ethertype == ETH_P_AARP || ethertype == ETH_P_IPX) { 2077e2ebc74dSJohannes Berg encaps_data = bridge_tunnel_header; 2078e2ebc74dSJohannes Berg encaps_len = sizeof(bridge_tunnel_header); 2079e2ebc74dSJohannes Berg skip_header_bytes -= 2; 2080e5c5d22eSSimon Horman } else if (ethertype >= ETH_P_802_3_MIN) { 2081e2ebc74dSJohannes Berg encaps_data = rfc1042_header; 2082e2ebc74dSJohannes Berg encaps_len = sizeof(rfc1042_header); 2083e2ebc74dSJohannes Berg skip_header_bytes -= 2; 2084e2ebc74dSJohannes Berg } else { 2085e2ebc74dSJohannes Berg encaps_data = NULL; 2086e2ebc74dSJohannes Berg encaps_len = 0; 2087e2ebc74dSJohannes Berg } 2088e2ebc74dSJohannes Berg 20897e244707SHelmut Schaa nh_pos = skb_network_header(skb) - skb->data; 20907e244707SHelmut Schaa h_pos = skb_transport_header(skb) - skb->data; 20917e244707SHelmut Schaa 2092e2ebc74dSJohannes Berg skb_pull(skb, skip_header_bytes); 2093e2ebc74dSJohannes Berg nh_pos -= skip_header_bytes; 2094e2ebc74dSJohannes Berg h_pos -= skip_header_bytes; 2095e2ebc74dSJohannes Berg 209623c0752aSJohannes Berg head_need = hdrlen + encaps_len + meshhdrlen - skb_headroom(skb); 2097e2ebc74dSJohannes Berg 209823c0752aSJohannes Berg /* 209923c0752aSJohannes Berg * So we need to modify the skb header and hence need a copy of 210023c0752aSJohannes Berg * that. The head_need variable above doesn't, so far, include 210123c0752aSJohannes Berg * the needed header space that we don't need right away. If we 210223c0752aSJohannes Berg * can, then we don't reallocate right now but only after the 210323c0752aSJohannes Berg * frame arrives at the master device (if it does...) 210423c0752aSJohannes Berg * 210523c0752aSJohannes Berg * If we cannot, however, then we will reallocate to include all 210623c0752aSJohannes Berg * the ever needed space. Also, if we need to reallocate it anyway, 210723c0752aSJohannes Berg * make it big enough for everything we may ever need. 210823c0752aSJohannes Berg */ 2109e2ebc74dSJohannes Berg 21103a5be7d4SDavid S. Miller if (head_need > 0 || skb_cloned(skb)) { 211123c0752aSJohannes Berg head_need += IEEE80211_ENCRYPT_HEADROOM; 211223c0752aSJohannes Berg head_need += local->tx_headroom; 211323c0752aSJohannes Berg head_need = max_t(int, 0, head_need); 2114c3e7724bSFelix Fietkau if (ieee80211_skb_resize(sdata, skb, head_need, true)) { 2115c3e7724bSFelix Fietkau ieee80211_free_txskb(&local->hw, skb); 21161c963becSJohannes Berg skb = NULL; 211755de908aSJohannes Berg goto fail_rcu; 2118c3e7724bSFelix Fietkau } 2119e2ebc74dSJohannes Berg } 2120e2ebc74dSJohannes Berg 2121e2ebc74dSJohannes Berg if (encaps_data) { 2122e2ebc74dSJohannes Berg memcpy(skb_push(skb, encaps_len), encaps_data, encaps_len); 2123e2ebc74dSJohannes Berg nh_pos += encaps_len; 2124e2ebc74dSJohannes Berg h_pos += encaps_len; 2125e2ebc74dSJohannes Berg } 2126c29b9b9bSJohannes Berg 2127e4ab7eb0SYuri Ershov #ifdef CONFIG_MAC80211_MESH 212833b64eb2SLuis Carlos Cobo if (meshhdrlen > 0) { 212933b64eb2SLuis Carlos Cobo memcpy(skb_push(skb, meshhdrlen), &mesh_hdr, meshhdrlen); 213033b64eb2SLuis Carlos Cobo nh_pos += meshhdrlen; 213133b64eb2SLuis Carlos Cobo h_pos += meshhdrlen; 213233b64eb2SLuis Carlos Cobo } 2133e4ab7eb0SYuri Ershov #endif 213433b64eb2SLuis Carlos Cobo 2135065e9605SHarvey Harrison if (ieee80211_is_data_qos(fc)) { 2136c29b9b9bSJohannes Berg __le16 *qos_control; 2137c29b9b9bSJohannes Berg 2138c29b9b9bSJohannes Berg qos_control = (__le16*) skb_push(skb, 2); 2139c29b9b9bSJohannes Berg memcpy(skb_push(skb, hdrlen - 2), &hdr, hdrlen - 2); 2140c29b9b9bSJohannes Berg /* 2141c29b9b9bSJohannes Berg * Maybe we could actually set some fields here, for now just 2142c29b9b9bSJohannes Berg * initialise to zero to indicate no special operation. 2143c29b9b9bSJohannes Berg */ 2144c29b9b9bSJohannes Berg *qos_control = 0; 2145c29b9b9bSJohannes Berg } else 2146e2ebc74dSJohannes Berg memcpy(skb_push(skb, hdrlen), &hdr, hdrlen); 2147c29b9b9bSJohannes Berg 2148e2ebc74dSJohannes Berg nh_pos += hdrlen; 2149e2ebc74dSJohannes Berg h_pos += hdrlen; 2150e2ebc74dSJohannes Berg 215168aae116SStephen Hemminger dev->stats.tx_packets++; 215268aae116SStephen Hemminger dev->stats.tx_bytes += skb->len; 2153e2ebc74dSJohannes Berg 2154e2ebc74dSJohannes Berg /* Update skb pointers to various headers since this modified frame 2155e2ebc74dSJohannes Berg * is going to go through Linux networking code that may potentially 2156e2ebc74dSJohannes Berg * need things like pointer to IP header. */ 2157e2ebc74dSJohannes Berg skb_set_mac_header(skb, 0); 2158e2ebc74dSJohannes Berg skb_set_network_header(skb, nh_pos); 2159e2ebc74dSJohannes Berg skb_set_transport_header(skb, h_pos); 2160e2ebc74dSJohannes Berg 2161489ee919SFelix Fietkau info = IEEE80211_SKB_CB(skb); 21623b8d81e0SJohannes Berg memset(info, 0, sizeof(*info)); 21633b8d81e0SJohannes Berg 2164e2ebc74dSJohannes Berg dev->trans_start = jiffies; 2165a729cff8SJohannes Berg 2166a729cff8SJohannes Berg info->flags = info_flags; 2167a729cff8SJohannes Berg info->ack_frame_id = info_id; 2168a729cff8SJohannes Berg 216955de908aSJohannes Berg ieee80211_xmit(sdata, skb, band); 217055de908aSJohannes Berg rcu_read_unlock(); 2171e2ebc74dSJohannes Berg 2172ec634fe3SPatrick McHardy return NETDEV_TX_OK; 2173e2ebc74dSJohannes Berg 217455de908aSJohannes Berg fail_rcu: 217555de908aSJohannes Berg rcu_read_unlock(); 2176e2ebc74dSJohannes Berg fail: 2177e2ebc74dSJohannes Berg dev_kfree_skb(skb); 2178dcf33963SJohannes Berg return NETDEV_TX_OK; 2179e2ebc74dSJohannes Berg } 2180e2ebc74dSJohannes Berg 2181e2ebc74dSJohannes Berg 2182e2530083SJohannes Berg /* 2183e2530083SJohannes Berg * ieee80211_clear_tx_pending may not be called in a context where 2184e2530083SJohannes Berg * it is possible that it packets could come in again. 2185e2530083SJohannes Berg */ 2186e2ebc74dSJohannes Berg void ieee80211_clear_tx_pending(struct ieee80211_local *local) 2187e2ebc74dSJohannes Berg { 21881f98ab7fSFelix Fietkau struct sk_buff *skb; 21892de8e0d9SJohannes Berg int i; 2190e2ebc74dSJohannes Berg 21911f98ab7fSFelix Fietkau for (i = 0; i < local->hw.queues; i++) { 21921f98ab7fSFelix Fietkau while ((skb = skb_dequeue(&local->pending[i])) != NULL) 21931f98ab7fSFelix Fietkau ieee80211_free_txskb(&local->hw, skb); 21941f98ab7fSFelix Fietkau } 2195e2ebc74dSJohannes Berg } 2196e2ebc74dSJohannes Berg 21977bb45683SJohannes Berg /* 21987bb45683SJohannes Berg * Returns false if the frame couldn't be transmitted but was queued instead, 21997bb45683SJohannes Berg * which in this case means re-queued -- take as an indication to stop sending 22007bb45683SJohannes Berg * more pending frames. 22017bb45683SJohannes Berg */ 2202cd8ffc80SJohannes Berg static bool ieee80211_tx_pending_skb(struct ieee80211_local *local, 2203cd8ffc80SJohannes Berg struct sk_buff *skb) 2204cd8ffc80SJohannes Berg { 2205cd8ffc80SJohannes Berg struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); 2206cd8ffc80SJohannes Berg struct ieee80211_sub_if_data *sdata; 2207cd8ffc80SJohannes Berg struct sta_info *sta; 2208cd8ffc80SJohannes Berg struct ieee80211_hdr *hdr; 22097bb45683SJohannes Berg bool result; 221055de908aSJohannes Berg struct ieee80211_chanctx_conf *chanctx_conf; 2211cd8ffc80SJohannes Berg 22125061b0c2SJohannes Berg sdata = vif_to_sdata(info->control.vif); 2213cd8ffc80SJohannes Berg 2214cd8ffc80SJohannes Berg if (info->flags & IEEE80211_TX_INTFL_NEED_TXPROCESSING) { 221555de908aSJohannes Berg chanctx_conf = rcu_dereference(sdata->vif.chanctx_conf); 221655de908aSJohannes Berg if (unlikely(!chanctx_conf)) { 221755de908aSJohannes Berg dev_kfree_skb(skb); 221855de908aSJohannes Berg return true; 221955de908aSJohannes Berg } 222055de908aSJohannes Berg result = ieee80211_tx(sdata, skb, true, 22214bf88530SJohannes Berg chanctx_conf->def.chan->band); 2222cd8ffc80SJohannes Berg } else { 2223252b86c4SJohannes Berg struct sk_buff_head skbs; 2224252b86c4SJohannes Berg 2225252b86c4SJohannes Berg __skb_queue_head_init(&skbs); 2226252b86c4SJohannes Berg __skb_queue_tail(&skbs, skb); 2227252b86c4SJohannes Berg 2228cd8ffc80SJohannes Berg hdr = (struct ieee80211_hdr *)skb->data; 2229abe60632SJohannes Berg sta = sta_info_get(sdata, hdr->addr1); 2230cd8ffc80SJohannes Berg 223174e4dbfdSJohannes Berg result = __ieee80211_tx(local, &skbs, skb->len, sta, true); 2232cd8ffc80SJohannes Berg } 2233cd8ffc80SJohannes Berg 2234cd8ffc80SJohannes Berg return result; 2235cd8ffc80SJohannes Berg } 2236cd8ffc80SJohannes Berg 2237e2530083SJohannes Berg /* 22383b8d81e0SJohannes Berg * Transmit all pending packets. Called from tasklet. 2239e2530083SJohannes Berg */ 2240e2ebc74dSJohannes Berg void ieee80211_tx_pending(unsigned long data) 2241e2ebc74dSJohannes Berg { 2242e2ebc74dSJohannes Berg struct ieee80211_local *local = (struct ieee80211_local *)data; 22432a577d98SJohannes Berg unsigned long flags; 2244cd8ffc80SJohannes Berg int i; 22453b8d81e0SJohannes Berg bool txok; 2246e2ebc74dSJohannes Berg 2247f0e72851SJohannes Berg rcu_read_lock(); 22482a577d98SJohannes Berg 22493b8d81e0SJohannes Berg spin_lock_irqsave(&local->queue_stop_reason_lock, flags); 2250176be728SJohannes Berg for (i = 0; i < local->hw.queues; i++) { 22512a577d98SJohannes Berg /* 22522a577d98SJohannes Berg * If queue is stopped by something other than due to pending 22532a577d98SJohannes Berg * frames, or we have no pending frames, proceed to next queue. 22542a577d98SJohannes Berg */ 22553b8d81e0SJohannes Berg if (local->queue_stop_reasons[i] || 22562a577d98SJohannes Berg skb_queue_empty(&local->pending[i])) 2257e2ebc74dSJohannes Berg continue; 2258e2530083SJohannes Berg 22592a577d98SJohannes Berg while (!skb_queue_empty(&local->pending[i])) { 22603b8d81e0SJohannes Berg struct sk_buff *skb = __skb_dequeue(&local->pending[i]); 22615061b0c2SJohannes Berg struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); 22625061b0c2SJohannes Berg 2263a7bc376cSJohannes Berg if (WARN_ON(!info->control.vif)) { 2264c3e7724bSFelix Fietkau ieee80211_free_txskb(&local->hw, skb); 2265a7bc376cSJohannes Berg continue; 2266a7bc376cSJohannes Berg } 2267a7bc376cSJohannes Berg 22683b8d81e0SJohannes Berg spin_unlock_irqrestore(&local->queue_stop_reason_lock, 22693b8d81e0SJohannes Berg flags); 22702a577d98SJohannes Berg 22713b8d81e0SJohannes Berg txok = ieee80211_tx_pending_skb(local, skb); 22723b8d81e0SJohannes Berg spin_lock_irqsave(&local->queue_stop_reason_lock, 22733b8d81e0SJohannes Berg flags); 22743b8d81e0SJohannes Berg if (!txok) 22752a577d98SJohannes Berg break; 2276e2ebc74dSJohannes Berg } 22777236fe29SJohannes Berg 22787236fe29SJohannes Berg if (skb_queue_empty(&local->pending[i])) 22793a25a8c8SJohannes Berg ieee80211_propagate_queue_wake(local, i); 2280e2ebc74dSJohannes Berg } 22813b8d81e0SJohannes Berg spin_unlock_irqrestore(&local->queue_stop_reason_lock, flags); 22822a577d98SJohannes Berg 2283f0e72851SJohannes Berg rcu_read_unlock(); 2284e2ebc74dSJohannes Berg } 2285e2ebc74dSJohannes Berg 2286e2ebc74dSJohannes Berg /* functions for drivers to get certain frames */ 2287e2ebc74dSJohannes Berg 2288eac70c13SMarco Porsch static void __ieee80211_beacon_add_tim(struct ieee80211_sub_if_data *sdata, 2289eac70c13SMarco Porsch struct ps_data *ps, struct sk_buff *skb) 2290e2ebc74dSJohannes Berg { 2291e2ebc74dSJohannes Berg u8 *pos, *tim; 2292e2ebc74dSJohannes Berg int aid0 = 0; 2293e2ebc74dSJohannes Berg int i, have_bits = 0, n1, n2; 2294e2ebc74dSJohannes Berg 2295e2ebc74dSJohannes Berg /* Generate bitmap for TIM only if there are any STAs in power save 2296e2ebc74dSJohannes Berg * mode. */ 2297d012a605SMarco Porsch if (atomic_read(&ps->num_sta_ps) > 0) 2298e2ebc74dSJohannes Berg /* in the hope that this is faster than 2299e2ebc74dSJohannes Berg * checking byte-for-byte */ 2300d012a605SMarco Porsch have_bits = !bitmap_empty((unsigned long*)ps->tim, 2301e2ebc74dSJohannes Berg IEEE80211_MAX_AID+1); 2302e2ebc74dSJohannes Berg 2303d012a605SMarco Porsch if (ps->dtim_count == 0) 2304d012a605SMarco Porsch ps->dtim_count = sdata->vif.bss_conf.dtim_period - 1; 2305e2ebc74dSJohannes Berg else 2306d012a605SMarco Porsch ps->dtim_count--; 2307e2ebc74dSJohannes Berg 2308e2ebc74dSJohannes Berg tim = pos = (u8 *) skb_put(skb, 6); 2309e2ebc74dSJohannes Berg *pos++ = WLAN_EID_TIM; 2310e2ebc74dSJohannes Berg *pos++ = 4; 2311d012a605SMarco Porsch *pos++ = ps->dtim_count; 23128860020eSJohannes Berg *pos++ = sdata->vif.bss_conf.dtim_period; 2313e2ebc74dSJohannes Berg 2314d012a605SMarco Porsch if (ps->dtim_count == 0 && !skb_queue_empty(&ps->bc_buf)) 2315e2ebc74dSJohannes Berg aid0 = 1; 2316e2ebc74dSJohannes Berg 2317d012a605SMarco Porsch ps->dtim_bc_mc = aid0 == 1; 2318512119b3SChristian Lamparter 2319e2ebc74dSJohannes Berg if (have_bits) { 2320e2ebc74dSJohannes Berg /* Find largest even number N1 so that bits numbered 1 through 2321e2ebc74dSJohannes Berg * (N1 x 8) - 1 in the bitmap are 0 and number N2 so that bits 2322e2ebc74dSJohannes Berg * (N2 + 1) x 8 through 2007 are 0. */ 2323e2ebc74dSJohannes Berg n1 = 0; 2324e2ebc74dSJohannes Berg for (i = 0; i < IEEE80211_MAX_TIM_LEN; i++) { 2325d012a605SMarco Porsch if (ps->tim[i]) { 2326e2ebc74dSJohannes Berg n1 = i & 0xfe; 2327e2ebc74dSJohannes Berg break; 2328e2ebc74dSJohannes Berg } 2329e2ebc74dSJohannes Berg } 2330e2ebc74dSJohannes Berg n2 = n1; 2331e2ebc74dSJohannes Berg for (i = IEEE80211_MAX_TIM_LEN - 1; i >= n1; i--) { 2332d012a605SMarco Porsch if (ps->tim[i]) { 2333e2ebc74dSJohannes Berg n2 = i; 2334e2ebc74dSJohannes Berg break; 2335e2ebc74dSJohannes Berg } 2336e2ebc74dSJohannes Berg } 2337e2ebc74dSJohannes Berg 2338e2ebc74dSJohannes Berg /* Bitmap control */ 2339e2ebc74dSJohannes Berg *pos++ = n1 | aid0; 2340e2ebc74dSJohannes Berg /* Part Virt Bitmap */ 23415220da39SEliad Peller skb_put(skb, n2 - n1); 2342d012a605SMarco Porsch memcpy(pos, ps->tim + n1, n2 - n1 + 1); 2343e2ebc74dSJohannes Berg 2344e2ebc74dSJohannes Berg tim[1] = n2 - n1 + 4; 2345e2ebc74dSJohannes Berg } else { 2346e2ebc74dSJohannes Berg *pos++ = aid0; /* Bitmap control */ 2347e2ebc74dSJohannes Berg *pos++ = 0; /* Part Virt Bitmap */ 2348e2ebc74dSJohannes Berg } 2349e2ebc74dSJohannes Berg } 2350e2ebc74dSJohannes Berg 2351eac70c13SMarco Porsch static int ieee80211_beacon_add_tim(struct ieee80211_sub_if_data *sdata, 2352eac70c13SMarco Porsch struct ps_data *ps, struct sk_buff *skb) 2353eac70c13SMarco Porsch { 2354eac70c13SMarco Porsch struct ieee80211_local *local = sdata->local; 2355eac70c13SMarco Porsch 2356eac70c13SMarco Porsch /* 2357eac70c13SMarco Porsch * Not very nice, but we want to allow the driver to call 2358eac70c13SMarco Porsch * ieee80211_beacon_get() as a response to the set_tim() 2359eac70c13SMarco Porsch * callback. That, however, is already invoked under the 2360eac70c13SMarco Porsch * sta_lock to guarantee consistent and race-free update 2361eac70c13SMarco Porsch * of the tim bitmap in mac80211 and the driver. 2362eac70c13SMarco Porsch */ 2363eac70c13SMarco Porsch if (local->tim_in_locked_section) { 2364eac70c13SMarco Porsch __ieee80211_beacon_add_tim(sdata, ps, skb); 2365eac70c13SMarco Porsch } else { 23661b91731dSJohannes Berg spin_lock_bh(&local->tim_lock); 2367eac70c13SMarco Porsch __ieee80211_beacon_add_tim(sdata, ps, skb); 23681b91731dSJohannes Berg spin_unlock_bh(&local->tim_lock); 2369eac70c13SMarco Porsch } 2370eac70c13SMarco Porsch 2371eac70c13SMarco Porsch return 0; 2372eac70c13SMarco Porsch } 2373eac70c13SMarco Porsch 237473da7d5bSSimon Wunderlich void ieee80211_csa_finish(struct ieee80211_vif *vif) 237573da7d5bSSimon Wunderlich { 237673da7d5bSSimon Wunderlich struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif); 237773da7d5bSSimon Wunderlich 237873da7d5bSSimon Wunderlich ieee80211_queue_work(&sdata->local->hw, 237973da7d5bSSimon Wunderlich &sdata->csa_finalize_work); 238073da7d5bSSimon Wunderlich } 238173da7d5bSSimon Wunderlich EXPORT_SYMBOL(ieee80211_csa_finish); 238273da7d5bSSimon Wunderlich 238373da7d5bSSimon Wunderlich static void ieee80211_update_csa(struct ieee80211_sub_if_data *sdata, 238473da7d5bSSimon Wunderlich struct beacon_data *beacon) 238573da7d5bSSimon Wunderlich { 238673da7d5bSSimon Wunderlich struct probe_resp *resp; 238773da7d5bSSimon Wunderlich int counter_offset_beacon = sdata->csa_counter_offset_beacon; 238873da7d5bSSimon Wunderlich int counter_offset_presp = sdata->csa_counter_offset_presp; 2389cd7760e6SSimon Wunderlich u8 *beacon_data; 2390cd7760e6SSimon Wunderlich size_t beacon_data_len; 239173da7d5bSSimon Wunderlich 2392cd7760e6SSimon Wunderlich switch (sdata->vif.type) { 2393cd7760e6SSimon Wunderlich case NL80211_IFTYPE_AP: 2394cd7760e6SSimon Wunderlich beacon_data = beacon->tail; 2395cd7760e6SSimon Wunderlich beacon_data_len = beacon->tail_len; 2396cd7760e6SSimon Wunderlich break; 2397cd7760e6SSimon Wunderlich case NL80211_IFTYPE_ADHOC: 2398cd7760e6SSimon Wunderlich beacon_data = beacon->head; 2399cd7760e6SSimon Wunderlich beacon_data_len = beacon->head_len; 2400cd7760e6SSimon Wunderlich break; 2401cd7760e6SSimon Wunderlich default: 2402cd7760e6SSimon Wunderlich return; 2403cd7760e6SSimon Wunderlich } 2404cd7760e6SSimon Wunderlich if (WARN_ON(counter_offset_beacon >= beacon_data_len)) 240573da7d5bSSimon Wunderlich return; 240673da7d5bSSimon Wunderlich 2407cd7760e6SSimon Wunderlich /* warn if the driver did not check for/react to csa completeness */ 2408cd7760e6SSimon Wunderlich if (WARN_ON(beacon_data[counter_offset_beacon] == 0)) 2409cd7760e6SSimon Wunderlich return; 241073da7d5bSSimon Wunderlich 2411cd7760e6SSimon Wunderlich beacon_data[counter_offset_beacon]--; 2412cd7760e6SSimon Wunderlich 2413cd7760e6SSimon Wunderlich if (sdata->vif.type == NL80211_IFTYPE_AP && counter_offset_presp) { 241473da7d5bSSimon Wunderlich rcu_read_lock(); 241573da7d5bSSimon Wunderlich resp = rcu_dereference(sdata->u.ap.probe_resp); 241673da7d5bSSimon Wunderlich 241773da7d5bSSimon Wunderlich /* if nl80211 accepted the offset, this should not happen. */ 241873da7d5bSSimon Wunderlich if (WARN_ON(!resp)) { 241973da7d5bSSimon Wunderlich rcu_read_unlock(); 242073da7d5bSSimon Wunderlich return; 242173da7d5bSSimon Wunderlich } 242273da7d5bSSimon Wunderlich resp->data[counter_offset_presp]--; 242373da7d5bSSimon Wunderlich rcu_read_unlock(); 242473da7d5bSSimon Wunderlich } 242573da7d5bSSimon Wunderlich } 242673da7d5bSSimon Wunderlich 242773da7d5bSSimon Wunderlich bool ieee80211_csa_is_complete(struct ieee80211_vif *vif) 242873da7d5bSSimon Wunderlich { 242973da7d5bSSimon Wunderlich struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif); 243073da7d5bSSimon Wunderlich struct beacon_data *beacon = NULL; 243173da7d5bSSimon Wunderlich u8 *beacon_data; 243273da7d5bSSimon Wunderlich size_t beacon_data_len; 243373da7d5bSSimon Wunderlich int counter_beacon = sdata->csa_counter_offset_beacon; 243473da7d5bSSimon Wunderlich int ret = false; 243573da7d5bSSimon Wunderlich 243673da7d5bSSimon Wunderlich if (!ieee80211_sdata_running(sdata)) 243773da7d5bSSimon Wunderlich return false; 243873da7d5bSSimon Wunderlich 243973da7d5bSSimon Wunderlich rcu_read_lock(); 244073da7d5bSSimon Wunderlich if (vif->type == NL80211_IFTYPE_AP) { 244173da7d5bSSimon Wunderlich struct ieee80211_if_ap *ap = &sdata->u.ap; 244273da7d5bSSimon Wunderlich 244373da7d5bSSimon Wunderlich beacon = rcu_dereference(ap->beacon); 244473da7d5bSSimon Wunderlich if (WARN_ON(!beacon || !beacon->tail)) 244573da7d5bSSimon Wunderlich goto out; 244673da7d5bSSimon Wunderlich beacon_data = beacon->tail; 244773da7d5bSSimon Wunderlich beacon_data_len = beacon->tail_len; 2448cd7760e6SSimon Wunderlich } else if (vif->type == NL80211_IFTYPE_ADHOC) { 2449cd7760e6SSimon Wunderlich struct ieee80211_if_ibss *ifibss = &sdata->u.ibss; 2450cd7760e6SSimon Wunderlich 2451cd7760e6SSimon Wunderlich beacon = rcu_dereference(ifibss->presp); 2452cd7760e6SSimon Wunderlich if (!beacon) 2453cd7760e6SSimon Wunderlich goto out; 2454cd7760e6SSimon Wunderlich 2455cd7760e6SSimon Wunderlich beacon_data = beacon->head; 2456cd7760e6SSimon Wunderlich beacon_data_len = beacon->head_len; 245773da7d5bSSimon Wunderlich } else { 245873da7d5bSSimon Wunderlich WARN_ON(1); 245973da7d5bSSimon Wunderlich goto out; 246073da7d5bSSimon Wunderlich } 246173da7d5bSSimon Wunderlich 246273da7d5bSSimon Wunderlich if (WARN_ON(counter_beacon > beacon_data_len)) 246373da7d5bSSimon Wunderlich goto out; 246473da7d5bSSimon Wunderlich 246573da7d5bSSimon Wunderlich if (beacon_data[counter_beacon] == 0) 246673da7d5bSSimon Wunderlich ret = true; 246773da7d5bSSimon Wunderlich out: 246873da7d5bSSimon Wunderlich rcu_read_unlock(); 246973da7d5bSSimon Wunderlich 247073da7d5bSSimon Wunderlich return ret; 247173da7d5bSSimon Wunderlich } 247273da7d5bSSimon Wunderlich EXPORT_SYMBOL(ieee80211_csa_is_complete); 247373da7d5bSSimon Wunderlich 2474eddcbb94SJohannes Berg struct sk_buff *ieee80211_beacon_get_tim(struct ieee80211_hw *hw, 2475eddcbb94SJohannes Berg struct ieee80211_vif *vif, 2476eddcbb94SJohannes Berg u16 *tim_offset, u16 *tim_length) 2477e2ebc74dSJohannes Berg { 2478e2ebc74dSJohannes Berg struct ieee80211_local *local = hw_to_local(hw); 24799d139c81SJohannes Berg struct sk_buff *skb = NULL; 2480e039fa4aSJohannes Berg struct ieee80211_tx_info *info; 2481e2ebc74dSJohannes Berg struct ieee80211_sub_if_data *sdata = NULL; 248255de908aSJohannes Berg enum ieee80211_band band; 2483e00cfce0SJouni Malinen struct ieee80211_tx_rate_control txrc; 248455de908aSJohannes Berg struct ieee80211_chanctx_conf *chanctx_conf; 24858318d78aSJohannes Berg 24865dfdaf58SJohannes Berg rcu_read_lock(); 2487e2ebc74dSJohannes Berg 248832bfd35dSJohannes Berg sdata = vif_to_sdata(vif); 248955de908aSJohannes Berg chanctx_conf = rcu_dereference(sdata->vif.chanctx_conf); 249033b64eb2SLuis Carlos Cobo 249155de908aSJohannes Berg if (!ieee80211_sdata_running(sdata) || !chanctx_conf) 2492eb3e554bSFelix Fietkau goto out; 2493eb3e554bSFelix Fietkau 2494eddcbb94SJohannes Berg if (tim_offset) 2495eddcbb94SJohannes Berg *tim_offset = 0; 2496eddcbb94SJohannes Berg if (tim_length) 2497eddcbb94SJohannes Berg *tim_length = 0; 2498eddcbb94SJohannes Berg 249905c914feSJohannes Berg if (sdata->vif.type == NL80211_IFTYPE_AP) { 2500d012a605SMarco Porsch struct ieee80211_if_ap *ap = &sdata->u.ap; 2501d012a605SMarco Porsch struct beacon_data *beacon = rcu_dereference(ap->beacon); 2502d012a605SMarco Porsch 25033ad97fbcSDan Carpenter if (beacon) { 250473da7d5bSSimon Wunderlich if (sdata->vif.csa_active) 250573da7d5bSSimon Wunderlich ieee80211_update_csa(sdata, beacon); 250673da7d5bSSimon Wunderlich 2507902acc78SJohannes Berg /* 2508902acc78SJohannes Berg * headroom, head length, 2509902acc78SJohannes Berg * tail length and maximum TIM length 2510902acc78SJohannes Berg */ 2511902acc78SJohannes Berg skb = dev_alloc_skb(local->tx_headroom + 2512902acc78SJohannes Berg beacon->head_len + 25135dfdaf58SJohannes Berg beacon->tail_len + 256); 2514e2ebc74dSJohannes Berg if (!skb) 25155dfdaf58SJohannes Berg goto out; 2516e2ebc74dSJohannes Berg 2517e2ebc74dSJohannes Berg skb_reserve(skb, local->tx_headroom); 25185dfdaf58SJohannes Berg memcpy(skb_put(skb, beacon->head_len), beacon->head, 25195dfdaf58SJohannes Berg beacon->head_len); 2520e2ebc74dSJohannes Berg 2521d012a605SMarco Porsch ieee80211_beacon_add_tim(sdata, &ap->ps, skb); 2522e2ebc74dSJohannes Berg 2523eddcbb94SJohannes Berg if (tim_offset) 2524eddcbb94SJohannes Berg *tim_offset = beacon->head_len; 2525eddcbb94SJohannes Berg if (tim_length) 2526eddcbb94SJohannes Berg *tim_length = skb->len - beacon->head_len; 2527eddcbb94SJohannes Berg 25285dfdaf58SJohannes Berg if (beacon->tail) 2529902acc78SJohannes Berg memcpy(skb_put(skb, beacon->tail_len), 2530902acc78SJohannes Berg beacon->tail, beacon->tail_len); 25319d139c81SJohannes Berg } else 25329d139c81SJohannes Berg goto out; 253305c914feSJohannes Berg } else if (sdata->vif.type == NL80211_IFTYPE_ADHOC) { 253446900298SJohannes Berg struct ieee80211_if_ibss *ifibss = &sdata->u.ibss; 25359d139c81SJohannes Berg struct ieee80211_hdr *hdr; 2536c3ffeab4SJohannes Berg struct beacon_data *presp = rcu_dereference(ifibss->presp); 253733b64eb2SLuis Carlos Cobo 2538af8cdcd8SJohannes Berg if (!presp) 25399d139c81SJohannes Berg goto out; 25409d139c81SJohannes Berg 2541cd7760e6SSimon Wunderlich if (sdata->vif.csa_active) 2542cd7760e6SSimon Wunderlich ieee80211_update_csa(sdata, presp); 2543cd7760e6SSimon Wunderlich 2544cd7760e6SSimon Wunderlich 2545c3ffeab4SJohannes Berg skb = dev_alloc_skb(local->tx_headroom + presp->head_len); 25469d139c81SJohannes Berg if (!skb) 25479d139c81SJohannes Berg goto out; 2548c3ffeab4SJohannes Berg skb_reserve(skb, local->tx_headroom); 2549c3ffeab4SJohannes Berg memcpy(skb_put(skb, presp->head_len), presp->head, 2550c3ffeab4SJohannes Berg presp->head_len); 25519d139c81SJohannes Berg 25529d139c81SJohannes Berg hdr = (struct ieee80211_hdr *) skb->data; 2553e7827a70SHarvey Harrison hdr->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT | 25549d139c81SJohannes Berg IEEE80211_STYPE_BEACON); 2555902acc78SJohannes Berg } else if (ieee80211_vif_is_mesh(&sdata->vif)) { 2556dbf498fbSJavier Cardona struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh; 25572b5e1967SThomas Pedersen struct beacon_data *bcn = rcu_dereference(ifmsh->beacon); 2558472dbc45SJohannes Berg 25592b5e1967SThomas Pedersen if (!bcn) 2560ac1bd846SJohannes Berg goto out; 2561ac1bd846SJohannes Berg 2562dbf498fbSJavier Cardona if (ifmsh->sync_ops) 2563dbf498fbSJavier Cardona ifmsh->sync_ops->adjust_tbtt( 2564dbf498fbSJavier Cardona sdata); 2565dbf498fbSJavier Cardona 25663b69a9c5SThomas Pedersen skb = dev_alloc_skb(local->tx_headroom + 25672b5e1967SThomas Pedersen bcn->head_len + 25683f52b7e3SMarco Porsch 256 + /* TIM IE */ 25692b5e1967SThomas Pedersen bcn->tail_len); 2570902acc78SJohannes Berg if (!skb) 2571902acc78SJohannes Berg goto out; 25722b5e1967SThomas Pedersen skb_reserve(skb, local->tx_headroom); 25732b5e1967SThomas Pedersen memcpy(skb_put(skb, bcn->head_len), bcn->head, bcn->head_len); 25742b5e1967SThomas Pedersen ieee80211_beacon_add_tim(sdata, &ifmsh->ps, skb); 25752b5e1967SThomas Pedersen memcpy(skb_put(skb, bcn->tail_len), bcn->tail, bcn->tail_len); 25769d139c81SJohannes Berg } else { 25779d139c81SJohannes Berg WARN_ON(1); 257833b64eb2SLuis Carlos Cobo goto out; 257933b64eb2SLuis Carlos Cobo } 258033b64eb2SLuis Carlos Cobo 25814bf88530SJohannes Berg band = chanctx_conf->def.chan->band; 258255de908aSJohannes Berg 2583e039fa4aSJohannes Berg info = IEEE80211_SKB_CB(skb); 2584e039fa4aSJohannes Berg 25853b8d81e0SJohannes Berg info->flags |= IEEE80211_TX_INTFL_DONT_ENCRYPT; 2586e00cfce0SJouni Malinen info->flags |= IEEE80211_TX_CTL_NO_ACK; 2587e039fa4aSJohannes Berg info->band = band; 2588e00cfce0SJouni Malinen 2589e00cfce0SJouni Malinen memset(&txrc, 0, sizeof(txrc)); 2590e00cfce0SJouni Malinen txrc.hw = hw; 2591e31583cdSJohannes Berg txrc.sband = local->hw.wiphy->bands[band]; 2592e00cfce0SJouni Malinen txrc.bss_conf = &sdata->vif.bss_conf; 2593e00cfce0SJouni Malinen txrc.skb = skb; 2594e00cfce0SJouni Malinen txrc.reported_rate.idx = -1; 259537eb0b16SJouni Malinen txrc.rate_idx_mask = sdata->rc_rateidx_mask[band]; 2596e31583cdSJohannes Berg if (txrc.rate_idx_mask == (1 << txrc.sband->n_bitrates) - 1) 259737eb0b16SJouni Malinen txrc.max_rate_idx = -1; 259837eb0b16SJouni Malinen else 259937eb0b16SJouni Malinen txrc.max_rate_idx = fls(txrc.rate_idx_mask) - 1; 26008f0729b1SFelix Fietkau txrc.bss = true; 2601e00cfce0SJouni Malinen rate_control_get_rate(sdata, NULL, &txrc); 2602e2ebc74dSJohannes Berg 2603e039fa4aSJohannes Berg info->control.vif = vif; 2604f591fa5dSJohannes Berg 2605a472e71bSJohn W. Linville info->flags |= IEEE80211_TX_CTL_CLEAR_PS_FILT | 2606a472e71bSJohn W. Linville IEEE80211_TX_CTL_ASSIGN_SEQ | 2607a472e71bSJohn W. Linville IEEE80211_TX_CTL_FIRST_FRAGMENT; 26085dfdaf58SJohannes Berg out: 26095dfdaf58SJohannes Berg rcu_read_unlock(); 2610e2ebc74dSJohannes Berg return skb; 2611e2ebc74dSJohannes Berg } 2612eddcbb94SJohannes Berg EXPORT_SYMBOL(ieee80211_beacon_get_tim); 2613e2ebc74dSJohannes Berg 261402945821SArik Nemtsov struct sk_buff *ieee80211_proberesp_get(struct ieee80211_hw *hw, 261502945821SArik Nemtsov struct ieee80211_vif *vif) 261602945821SArik Nemtsov { 261702945821SArik Nemtsov struct ieee80211_if_ap *ap = NULL; 2618aa7a0080SEyal Shapira struct sk_buff *skb = NULL; 2619aa7a0080SEyal Shapira struct probe_resp *presp = NULL; 262002945821SArik Nemtsov struct ieee80211_hdr *hdr; 262102945821SArik Nemtsov struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif); 262202945821SArik Nemtsov 262302945821SArik Nemtsov if (sdata->vif.type != NL80211_IFTYPE_AP) 262402945821SArik Nemtsov return NULL; 262502945821SArik Nemtsov 262602945821SArik Nemtsov rcu_read_lock(); 262702945821SArik Nemtsov 262802945821SArik Nemtsov ap = &sdata->u.ap; 262902945821SArik Nemtsov presp = rcu_dereference(ap->probe_resp); 263002945821SArik Nemtsov if (!presp) 263102945821SArik Nemtsov goto out; 263202945821SArik Nemtsov 2633aa7a0080SEyal Shapira skb = dev_alloc_skb(presp->len); 263402945821SArik Nemtsov if (!skb) 263502945821SArik Nemtsov goto out; 263602945821SArik Nemtsov 2637aa7a0080SEyal Shapira memcpy(skb_put(skb, presp->len), presp->data, presp->len); 2638aa7a0080SEyal Shapira 263902945821SArik Nemtsov hdr = (struct ieee80211_hdr *) skb->data; 264002945821SArik Nemtsov memset(hdr->addr1, 0, sizeof(hdr->addr1)); 264102945821SArik Nemtsov 264202945821SArik Nemtsov out: 264302945821SArik Nemtsov rcu_read_unlock(); 264402945821SArik Nemtsov return skb; 264502945821SArik Nemtsov } 264602945821SArik Nemtsov EXPORT_SYMBOL(ieee80211_proberesp_get); 264702945821SArik Nemtsov 26487044cc56SKalle Valo struct sk_buff *ieee80211_pspoll_get(struct ieee80211_hw *hw, 26497044cc56SKalle Valo struct ieee80211_vif *vif) 26507044cc56SKalle Valo { 26517044cc56SKalle Valo struct ieee80211_sub_if_data *sdata; 26527044cc56SKalle Valo struct ieee80211_if_managed *ifmgd; 26537044cc56SKalle Valo struct ieee80211_pspoll *pspoll; 26547044cc56SKalle Valo struct ieee80211_local *local; 26557044cc56SKalle Valo struct sk_buff *skb; 26567044cc56SKalle Valo 26577044cc56SKalle Valo if (WARN_ON(vif->type != NL80211_IFTYPE_STATION)) 26587044cc56SKalle Valo return NULL; 26597044cc56SKalle Valo 26607044cc56SKalle Valo sdata = vif_to_sdata(vif); 26617044cc56SKalle Valo ifmgd = &sdata->u.mgd; 26627044cc56SKalle Valo local = sdata->local; 26637044cc56SKalle Valo 26647044cc56SKalle Valo skb = dev_alloc_skb(local->hw.extra_tx_headroom + sizeof(*pspoll)); 2665d15b8459SJoe Perches if (!skb) 26667044cc56SKalle Valo return NULL; 2667d15b8459SJoe Perches 26687044cc56SKalle Valo skb_reserve(skb, local->hw.extra_tx_headroom); 26697044cc56SKalle Valo 26707044cc56SKalle Valo pspoll = (struct ieee80211_pspoll *) skb_put(skb, sizeof(*pspoll)); 26717044cc56SKalle Valo memset(pspoll, 0, sizeof(*pspoll)); 26727044cc56SKalle Valo pspoll->frame_control = cpu_to_le16(IEEE80211_FTYPE_CTL | 26737044cc56SKalle Valo IEEE80211_STYPE_PSPOLL); 26747044cc56SKalle Valo pspoll->aid = cpu_to_le16(ifmgd->aid); 26757044cc56SKalle Valo 26767044cc56SKalle Valo /* aid in PS-Poll has its two MSBs each set to 1 */ 26777044cc56SKalle Valo pspoll->aid |= cpu_to_le16(1 << 15 | 1 << 14); 26787044cc56SKalle Valo 26797044cc56SKalle Valo memcpy(pspoll->bssid, ifmgd->bssid, ETH_ALEN); 26807044cc56SKalle Valo memcpy(pspoll->ta, vif->addr, ETH_ALEN); 26817044cc56SKalle Valo 26827044cc56SKalle Valo return skb; 26837044cc56SKalle Valo } 26847044cc56SKalle Valo EXPORT_SYMBOL(ieee80211_pspoll_get); 26857044cc56SKalle Valo 26867044cc56SKalle Valo struct sk_buff *ieee80211_nullfunc_get(struct ieee80211_hw *hw, 26877044cc56SKalle Valo struct ieee80211_vif *vif) 26887044cc56SKalle Valo { 26897044cc56SKalle Valo struct ieee80211_hdr_3addr *nullfunc; 26907044cc56SKalle Valo struct ieee80211_sub_if_data *sdata; 26917044cc56SKalle Valo struct ieee80211_if_managed *ifmgd; 26927044cc56SKalle Valo struct ieee80211_local *local; 26937044cc56SKalle Valo struct sk_buff *skb; 26947044cc56SKalle Valo 26957044cc56SKalle Valo if (WARN_ON(vif->type != NL80211_IFTYPE_STATION)) 26967044cc56SKalle Valo return NULL; 26977044cc56SKalle Valo 26987044cc56SKalle Valo sdata = vif_to_sdata(vif); 26997044cc56SKalle Valo ifmgd = &sdata->u.mgd; 27007044cc56SKalle Valo local = sdata->local; 27017044cc56SKalle Valo 27027044cc56SKalle Valo skb = dev_alloc_skb(local->hw.extra_tx_headroom + sizeof(*nullfunc)); 2703d15b8459SJoe Perches if (!skb) 27047044cc56SKalle Valo return NULL; 2705d15b8459SJoe Perches 27067044cc56SKalle Valo skb_reserve(skb, local->hw.extra_tx_headroom); 27077044cc56SKalle Valo 27087044cc56SKalle Valo nullfunc = (struct ieee80211_hdr_3addr *) skb_put(skb, 27097044cc56SKalle Valo sizeof(*nullfunc)); 27107044cc56SKalle Valo memset(nullfunc, 0, sizeof(*nullfunc)); 27117044cc56SKalle Valo nullfunc->frame_control = cpu_to_le16(IEEE80211_FTYPE_DATA | 27127044cc56SKalle Valo IEEE80211_STYPE_NULLFUNC | 27137044cc56SKalle Valo IEEE80211_FCTL_TODS); 27147044cc56SKalle Valo memcpy(nullfunc->addr1, ifmgd->bssid, ETH_ALEN); 27157044cc56SKalle Valo memcpy(nullfunc->addr2, vif->addr, ETH_ALEN); 27167044cc56SKalle Valo memcpy(nullfunc->addr3, ifmgd->bssid, ETH_ALEN); 27177044cc56SKalle Valo 27187044cc56SKalle Valo return skb; 27197044cc56SKalle Valo } 27207044cc56SKalle Valo EXPORT_SYMBOL(ieee80211_nullfunc_get); 27217044cc56SKalle Valo 272205e54ea6SKalle Valo struct sk_buff *ieee80211_probereq_get(struct ieee80211_hw *hw, 272305e54ea6SKalle Valo struct ieee80211_vif *vif, 272405e54ea6SKalle Valo const u8 *ssid, size_t ssid_len, 2725b9a9ada1SJohannes Berg size_t tailroom) 272605e54ea6SKalle Valo { 272705e54ea6SKalle Valo struct ieee80211_sub_if_data *sdata; 272805e54ea6SKalle Valo struct ieee80211_local *local; 272905e54ea6SKalle Valo struct ieee80211_hdr_3addr *hdr; 273005e54ea6SKalle Valo struct sk_buff *skb; 273105e54ea6SKalle Valo size_t ie_ssid_len; 273205e54ea6SKalle Valo u8 *pos; 273305e54ea6SKalle Valo 273405e54ea6SKalle Valo sdata = vif_to_sdata(vif); 273505e54ea6SKalle Valo local = sdata->local; 273605e54ea6SKalle Valo ie_ssid_len = 2 + ssid_len; 273705e54ea6SKalle Valo 273805e54ea6SKalle Valo skb = dev_alloc_skb(local->hw.extra_tx_headroom + sizeof(*hdr) + 2739b9a9ada1SJohannes Berg ie_ssid_len + tailroom); 2740d15b8459SJoe Perches if (!skb) 274105e54ea6SKalle Valo return NULL; 274205e54ea6SKalle Valo 274305e54ea6SKalle Valo skb_reserve(skb, local->hw.extra_tx_headroom); 274405e54ea6SKalle Valo 274505e54ea6SKalle Valo hdr = (struct ieee80211_hdr_3addr *) skb_put(skb, sizeof(*hdr)); 274605e54ea6SKalle Valo memset(hdr, 0, sizeof(*hdr)); 274705e54ea6SKalle Valo hdr->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT | 274805e54ea6SKalle Valo IEEE80211_STYPE_PROBE_REQ); 2749e83e6541SJohannes Berg eth_broadcast_addr(hdr->addr1); 275005e54ea6SKalle Valo memcpy(hdr->addr2, vif->addr, ETH_ALEN); 2751e83e6541SJohannes Berg eth_broadcast_addr(hdr->addr3); 275205e54ea6SKalle Valo 275305e54ea6SKalle Valo pos = skb_put(skb, ie_ssid_len); 275405e54ea6SKalle Valo *pos++ = WLAN_EID_SSID; 275505e54ea6SKalle Valo *pos++ = ssid_len; 275688c868c4SStanislaw Gruszka if (ssid_len) 275705e54ea6SKalle Valo memcpy(pos, ssid, ssid_len); 275805e54ea6SKalle Valo pos += ssid_len; 275905e54ea6SKalle Valo 276005e54ea6SKalle Valo return skb; 276105e54ea6SKalle Valo } 276205e54ea6SKalle Valo EXPORT_SYMBOL(ieee80211_probereq_get); 276305e54ea6SKalle Valo 276432bfd35dSJohannes Berg void ieee80211_rts_get(struct ieee80211_hw *hw, struct ieee80211_vif *vif, 2765e2ebc74dSJohannes Berg const void *frame, size_t frame_len, 2766e039fa4aSJohannes Berg const struct ieee80211_tx_info *frame_txctl, 2767e2ebc74dSJohannes Berg struct ieee80211_rts *rts) 2768e2ebc74dSJohannes Berg { 2769e2ebc74dSJohannes Berg const struct ieee80211_hdr *hdr = frame; 2770e2ebc74dSJohannes Berg 2771065e9605SHarvey Harrison rts->frame_control = 2772065e9605SHarvey Harrison cpu_to_le16(IEEE80211_FTYPE_CTL | IEEE80211_STYPE_RTS); 277332bfd35dSJohannes Berg rts->duration = ieee80211_rts_duration(hw, vif, frame_len, 277432bfd35dSJohannes Berg frame_txctl); 2775e2ebc74dSJohannes Berg memcpy(rts->ra, hdr->addr1, sizeof(rts->ra)); 2776e2ebc74dSJohannes Berg memcpy(rts->ta, hdr->addr2, sizeof(rts->ta)); 2777e2ebc74dSJohannes Berg } 2778e2ebc74dSJohannes Berg EXPORT_SYMBOL(ieee80211_rts_get); 2779e2ebc74dSJohannes Berg 278032bfd35dSJohannes Berg void ieee80211_ctstoself_get(struct ieee80211_hw *hw, struct ieee80211_vif *vif, 2781e2ebc74dSJohannes Berg const void *frame, size_t frame_len, 2782e039fa4aSJohannes Berg const struct ieee80211_tx_info *frame_txctl, 2783e2ebc74dSJohannes Berg struct ieee80211_cts *cts) 2784e2ebc74dSJohannes Berg { 2785e2ebc74dSJohannes Berg const struct ieee80211_hdr *hdr = frame; 2786e2ebc74dSJohannes Berg 2787065e9605SHarvey Harrison cts->frame_control = 2788065e9605SHarvey Harrison cpu_to_le16(IEEE80211_FTYPE_CTL | IEEE80211_STYPE_CTS); 278932bfd35dSJohannes Berg cts->duration = ieee80211_ctstoself_duration(hw, vif, 279032bfd35dSJohannes Berg frame_len, frame_txctl); 2791e2ebc74dSJohannes Berg memcpy(cts->ra, hdr->addr1, sizeof(cts->ra)); 2792e2ebc74dSJohannes Berg } 2793e2ebc74dSJohannes Berg EXPORT_SYMBOL(ieee80211_ctstoself_get); 2794e2ebc74dSJohannes Berg 2795e2ebc74dSJohannes Berg struct sk_buff * 279632bfd35dSJohannes Berg ieee80211_get_buffered_bc(struct ieee80211_hw *hw, 2797e039fa4aSJohannes Berg struct ieee80211_vif *vif) 2798e2ebc74dSJohannes Berg { 2799e2ebc74dSJohannes Berg struct ieee80211_local *local = hw_to_local(hw); 2800747cf5e9STomas Winkler struct sk_buff *skb = NULL; 28015cf121c3SJohannes Berg struct ieee80211_tx_data tx; 2802e2ebc74dSJohannes Berg struct ieee80211_sub_if_data *sdata; 2803d012a605SMarco Porsch struct ps_data *ps; 2804e039fa4aSJohannes Berg struct ieee80211_tx_info *info; 280555de908aSJohannes Berg struct ieee80211_chanctx_conf *chanctx_conf; 2806e2ebc74dSJohannes Berg 280732bfd35dSJohannes Berg sdata = vif_to_sdata(vif); 28085dfdaf58SJohannes Berg 28095dfdaf58SJohannes Berg rcu_read_lock(); 281055de908aSJohannes Berg chanctx_conf = rcu_dereference(sdata->vif.chanctx_conf); 28115dfdaf58SJohannes Berg 2812d012a605SMarco Porsch if (!chanctx_conf) 2813747cf5e9STomas Winkler goto out; 28145dfdaf58SJohannes Berg 2815d012a605SMarco Porsch if (sdata->vif.type == NL80211_IFTYPE_AP) { 2816d012a605SMarco Porsch struct beacon_data *beacon = 2817d012a605SMarco Porsch rcu_dereference(sdata->u.ap.beacon); 2818d012a605SMarco Porsch 2819d012a605SMarco Porsch if (!beacon || !beacon->head) 2820d012a605SMarco Porsch goto out; 2821d012a605SMarco Porsch 2822d012a605SMarco Porsch ps = &sdata->u.ap.ps; 28233f52b7e3SMarco Porsch } else if (ieee80211_vif_is_mesh(&sdata->vif)) { 28243f52b7e3SMarco Porsch ps = &sdata->u.mesh.ps; 2825d012a605SMarco Porsch } else { 2826d012a605SMarco Porsch goto out; 2827d012a605SMarco Porsch } 2828d012a605SMarco Porsch 2829d012a605SMarco Porsch if (ps->dtim_count != 0 || !ps->dtim_bc_mc) 2830747cf5e9STomas Winkler goto out; /* send buffered bc/mc only after DTIM beacon */ 2831e039fa4aSJohannes Berg 2832e2ebc74dSJohannes Berg while (1) { 2833d012a605SMarco Porsch skb = skb_dequeue(&ps->bc_buf); 2834e2ebc74dSJohannes Berg if (!skb) 2835747cf5e9STomas Winkler goto out; 2836e2ebc74dSJohannes Berg local->total_ps_buffered--; 2837e2ebc74dSJohannes Berg 2838d012a605SMarco Porsch if (!skb_queue_empty(&ps->bc_buf) && skb->len >= 2) { 2839e2ebc74dSJohannes Berg struct ieee80211_hdr *hdr = 2840e2ebc74dSJohannes Berg (struct ieee80211_hdr *) skb->data; 2841e2ebc74dSJohannes Berg /* more buffered multicast/broadcast frames ==> set 2842e2ebc74dSJohannes Berg * MoreData flag in IEEE 802.11 header to inform PS 2843e2ebc74dSJohannes Berg * STAs */ 2844e2ebc74dSJohannes Berg hdr->frame_control |= 2845e2ebc74dSJohannes Berg cpu_to_le16(IEEE80211_FCTL_MOREDATA); 2846e2ebc74dSJohannes Berg } 2847e2ebc74dSJohannes Berg 28487cbf9d01SMarco Porsch if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN) 2849de74a1d9SMichael Braun sdata = IEEE80211_DEV_TO_SUB_IF(skb->dev); 28503b8d81e0SJohannes Berg if (!ieee80211_tx_prepare(sdata, &tx, skb)) 2851e2ebc74dSJohannes Berg break; 2852e2ebc74dSJohannes Berg dev_kfree_skb_any(skb); 2853e2ebc74dSJohannes Berg } 2854e039fa4aSJohannes Berg 2855e039fa4aSJohannes Berg info = IEEE80211_SKB_CB(skb); 2856e039fa4aSJohannes Berg 28575cf121c3SJohannes Berg tx.flags |= IEEE80211_TX_PS_BUFFERED; 28584bf88530SJohannes Berg info->band = chanctx_conf->def.chan->band; 2859e2ebc74dSJohannes Berg 286097b045d6SJohannes Berg if (invoke_tx_handlers(&tx)) 2861e2ebc74dSJohannes Berg skb = NULL; 2862747cf5e9STomas Winkler out: 2863d0709a65SJohannes Berg rcu_read_unlock(); 2864e2ebc74dSJohannes Berg 2865e2ebc74dSJohannes Berg return skb; 2866e2ebc74dSJohannes Berg } 2867e2ebc74dSJohannes Berg EXPORT_SYMBOL(ieee80211_get_buffered_bc); 28683b8d81e0SJohannes Berg 286955de908aSJohannes Berg void __ieee80211_tx_skb_tid_band(struct ieee80211_sub_if_data *sdata, 287055de908aSJohannes Berg struct sk_buff *skb, int tid, 287155de908aSJohannes Berg enum ieee80211_band band) 28723b8d81e0SJohannes Berg { 2873353d09c6SChristian Lamparter int ac = ieee802_1d_to_ac[tid & 7]; 28743a25a8c8SJohannes Berg 28753b8d81e0SJohannes Berg skb_set_mac_header(skb, 0); 28763b8d81e0SJohannes Berg skb_set_network_header(skb, 0); 28773b8d81e0SJohannes Berg skb_set_transport_header(skb, 0); 28783b8d81e0SJohannes Berg 28793a25a8c8SJohannes Berg skb_set_queue_mapping(skb, ac); 2880cf6bb79aSHelmut Schaa skb->priority = tid; 2881cf0277e7SJohannes Berg 288289afe614SJohannes Berg skb->dev = sdata->dev; 288389afe614SJohannes Berg 28843d34deb6SJohannes Berg /* 28853d34deb6SJohannes Berg * The other path calling ieee80211_xmit is from the tasklet, 28863d34deb6SJohannes Berg * and while we can handle concurrent transmissions locking 28873d34deb6SJohannes Berg * requirements are that we do not come into tx with bhs on. 28883d34deb6SJohannes Berg */ 28893d34deb6SJohannes Berg local_bh_disable(); 289055de908aSJohannes Berg ieee80211_xmit(sdata, skb, band); 28913d34deb6SJohannes Berg local_bh_enable(); 28923b8d81e0SJohannes Berg } 2893