xref: /openbmc/linux/net/mac80211/tx.c (revision 06be6b149f7e406bcf16098567f5a6c9f042bced)
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