6668 lines · 177.9 KB · C
RawDownload
// SPDX-License-Identifier: GPL-2.0-only/* * Copyright 2002-2005, Instant802 Networks, Inc. * Copyright 2005-2006, Devicescape Software, Inc. * Copyright 2006-2007	Jiri Benc <jbenc@suse.cz> * Copyright 2007	Johannes Berg <johannes@sipsolutions.net> * Copyright 2013-2014  Intel Mobile Communications GmbH * Copyright (C) 2018-2026 Intel Corporation * * Transmit and frame generation functions. */ #include <linux/kernel.h>#include <linux/slab.h>#include <linux/skbuff.h>#include <linux/if_vlan.h>#include <linux/etherdevice.h>#include <linux/bitmap.h>#include <linux/rcupdate.h>#include <linux/export.h>#include <net/net_namespace.h>#include <net/ieee80211_radiotap.h>#include <net/cfg80211.h>#include <net/mac80211.h>#include <net/codel.h>#include <net/codel_impl.h>#include <linux/unaligned.h>#include <net/fq_impl.h>#include <net/sock.h>#include <net/gso.h> #include "ieee80211_i.h"#include "driver-ops.h"#include "led.h"#include "mesh.h"#include "wep.h"#include "wpa.h"#include "wme.h"#include "rate.h" /* misc utils */ static __le16 ieee80211_duration(struct ieee80211_tx_data *tx,				 struct sk_buff *skb, int group_addr,				 int next_frag_len){	int rate, mrate, erp, dur, i;	struct ieee80211_rate *txrate;	struct ieee80211_local *local = tx->local;	struct ieee80211_supported_band *sband;	struct ieee80211_hdr *hdr;	struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); 	/* assume HW handles this */	if (tx->rate.flags & (IEEE80211_TX_RC_MCS | IEEE80211_TX_RC_VHT_MCS))		return 0; 	/* uh huh? */	if (WARN_ON_ONCE(tx->rate.idx < 0))		return 0; 	if (info->band >= NUM_NL80211_BANDS)		return 0; 	sband = local->hw.wiphy->bands[info->band];	txrate = &sband->bitrates[tx->rate.idx]; 	erp = txrate->flags & IEEE80211_RATE_ERP_G; 	/* device is expected to do this */	if (sband->band == NL80211_BAND_S1GHZ)		return 0; 	/*	 * data and mgmt (except PS Poll):	 * - during CFP: 32768	 * - during contention period:	 *   if addr1 is group address: 0	 *   if more fragments = 0 and addr1 is individual address: time to	 *      transmit one ACK plus SIFS	 *   if more fragments = 1 and addr1 is individual address: time to	 *      transmit next fragment plus 2 x ACK plus 3 x SIFS	 *	 * IEEE 802.11, 9.6:	 * - control response frame (CTS or ACK) shall be transmitted using the	 *   same rate as the immediately previous frame in the frame exchange	 *   sequence, if this rate belongs to the PHY mandatory rates, or else	 *   at the highest possible rate belonging to the PHY rates in the	 *   BSSBasicRateSet	 */	hdr = (struct ieee80211_hdr *)skb->data;	if (ieee80211_is_ctl(hdr->frame_control)) {		/* TODO: These control frames are not currently sent by		 * mac80211, but should they be implemented, this function		 * needs to be updated to support duration field calculation.		 *		 * RTS: time needed to transmit pending data/mgmt frame plus		 *    one CTS frame plus one ACK frame plus 3 x SIFS		 * CTS: duration of immediately previous RTS minus time		 *    required to transmit CTS and its SIFS		 * ACK: 0 if immediately previous directed data/mgmt had		 *    more=0, with more=1 duration in ACK frame is duration		 *    from previous frame minus time needed to transmit ACK		 *    and its SIFS		 * PS Poll: BIT(15) | BIT(14) | aid		 */		return 0;	} 	/* data/mgmt */	if (0 /* FIX: data/mgmt during CFP */)		return cpu_to_le16(32768); 	if (group_addr) /* Group address as the destination - no ACK */		return 0; 	/* Individual destination address:	 * IEEE 802.11, Ch. 9.6 (after IEEE 802.11g changes)	 * CTS and ACK frames shall be transmitted using the highest rate in	 * basic rate set that is less than or equal to the rate of the	 * immediately previous frame and that is using the same modulation	 * (CCK or OFDM). If no basic rate set matches with these requirements,	 * the highest mandatory rate of the PHY that is less than or equal to	 * the rate of the previous frame is used.	 * Mandatory rates for IEEE 802.11g PHY: 1, 2, 5.5, 11, 6, 12, 24 Mbps	 */	rate = -1;	/* use lowest available if everything fails */	mrate = sband->bitrates[0].bitrate;	for (i = 0; i < sband->n_bitrates; i++) {		struct ieee80211_rate *r = &sband->bitrates[i];		u32 flag; 		if (r->bitrate > txrate->bitrate)			break; 		if (tx->sdata->vif.bss_conf.basic_rates & BIT(i))			rate = r->bitrate; 		switch (sband->band) {		case NL80211_BAND_2GHZ:		case NL80211_BAND_LC:			if (tx->sdata->deflink.operating_11g_mode)				flag = IEEE80211_RATE_MANDATORY_G;			else				flag = IEEE80211_RATE_MANDATORY_B;			break;		case NL80211_BAND_5GHZ:		case NL80211_BAND_6GHZ:			flag = IEEE80211_RATE_MANDATORY_A;			break;		default:			flag = 0;			WARN_ON(1);			break;		} 		if (r->flags & flag)			mrate = r->bitrate;	}	if (rate == -1) {		/* No matching basic rate found; use highest suitable mandatory		 * PHY rate */		rate = mrate;	} 	/* Don't calculate ACKs for QoS Frames with NoAck Policy set */	if (ieee80211_is_data_qos(hdr->frame_control) &&	    *(ieee80211_get_qos_ctl(hdr)) & IEEE80211_QOS_CTL_ACK_POLICY_NOACK)		dur = 0;	else		/* Time needed to transmit ACK		 * (10 bytes + 4-byte FCS = 112 bits) plus SIFS; rounded up		 * to closest integer */		dur = ieee80211_frame_duration(sband->band, 10, rate, erp,				tx->sdata->vif.bss_conf.use_short_preamble); 	if (next_frag_len) {		/* Frame is fragmented: duration increases with time needed to		 * transmit next fragment plus ACK and 2 x SIFS. */		dur *= 2; /* ACK + SIFS */		/* next fragment */		dur += ieee80211_frame_duration(sband->band, next_frag_len,				txrate->bitrate, erp,				tx->sdata->vif.bss_conf.use_short_preamble);	} 	return cpu_to_le16(dur);} /* tx handlers */static ieee80211_tx_result debug_noinlineieee80211_tx_h_dynamic_ps(struct ieee80211_tx_data *tx){	struct ieee80211_local *local = tx->local;	struct ieee80211_if_managed *ifmgd;	struct ieee80211_tx_info *info = IEEE80211_SKB_CB(tx->skb); 	/* driver doesn't support power save */	if (!ieee80211_hw_check(&local->hw, SUPPORTS_PS))		return TX_CONTINUE; 	/* hardware does dynamic power save */	if (ieee80211_hw_check(&local->hw, SUPPORTS_DYNAMIC_PS))		return TX_CONTINUE; 	/* dynamic power save disabled */	if (local->hw.conf.dynamic_ps_timeout <= 0)		return TX_CONTINUE; 	/* we are scanning, don't enable power save */	if (local->scanning)		return TX_CONTINUE; 	if (!local->ps_sdata)		return TX_CONTINUE; 	/* No point if we're going to suspend */	if (local->quiescing)		return TX_CONTINUE; 	/* dynamic ps is supported only in managed mode */	if (tx->sdata->vif.type != NL80211_IFTYPE_STATION)		return TX_CONTINUE; 	if (unlikely(info->flags & IEEE80211_TX_INTFL_OFFCHAN_TX_OK))		return TX_CONTINUE; 	ifmgd = &tx->sdata->u.mgd; 	/*	 * Don't wakeup from power save if u-apsd is enabled, voip ac has	 * u-apsd enabled and the frame is in voip class. This effectively	 * means that even if all access categories have u-apsd enabled, in	 * practise u-apsd is only used with the voip ac. This is a	 * workaround for the case when received voip class packets do not	 * have correct qos tag for some reason, due the network or the	 * peer application.	 *	 * Note: ifmgd->uapsd_queues access is racy here. If the value is	 * changed via debugfs, user needs to reassociate manually to have	 * everything in sync.	 */	if ((ifmgd->flags & IEEE80211_STA_UAPSD_ENABLED) &&	    (ifmgd->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VO) &&	    skb_get_queue_mapping(tx->skb) == IEEE80211_AC_VO)		return TX_CONTINUE; 	if (local->hw.conf.flags & IEEE80211_CONF_PS) {		ieee80211_stop_queues_by_reason(&local->hw,						IEEE80211_MAX_QUEUE_MAP,						IEEE80211_QUEUE_STOP_REASON_PS,						false);		ifmgd->flags &= ~IEEE80211_STA_NULLFUNC_ACKED;		wiphy_work_queue(local->hw.wiphy,				 &local->dynamic_ps_disable_work);	} 	/* Don't restart the timer if we're not disassociated */	if (!ifmgd->associated)		return TX_CONTINUE; 	mod_timer(&local->dynamic_ps_timer, jiffies +		  msecs_to_jiffies(local->hw.conf.dynamic_ps_timeout)); 	return TX_CONTINUE;} static ieee80211_tx_result debug_noinlineieee80211_tx_h_check_assoc(struct ieee80211_tx_data *tx){ 	struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)tx->skb->data;	struct ieee80211_tx_info *info = IEEE80211_SKB_CB(tx->skb);	bool assoc = false; 	if (unlikely(info->flags & IEEE80211_TX_CTL_INJECTED))		return TX_CONTINUE; 	if (unlikely(test_bit(SCAN_SW_SCANNING, &tx->local->scanning)) &&	    test_bit(SDATA_STATE_OFFCHANNEL, &tx->sdata->state) &&	    !ieee80211_is_probe_req(hdr->frame_control) &&	    !ieee80211_is_any_nullfunc(hdr->frame_control))		/*		 * When software scanning only nullfunc frames (to notify		 * the sleep state to the AP) and probe requests (for the		 * active scan) are allowed, all other frames should not be		 * sent and we should not get here, but if we do		 * nonetheless, drop them to avoid sending them		 * off-channel. See __ieee80211_start_scan() for more.		 */		return TX_DROP; 	if (tx->sdata->vif.type == NL80211_IFTYPE_OCB)		return TX_CONTINUE; 	if (tx->flags & IEEE80211_TX_PS_BUFFERED)		return TX_CONTINUE; 	if (tx->sta)		assoc = test_sta_flag(tx->sta, WLAN_STA_ASSOC); 	if (likely(tx->flags & IEEE80211_TX_UNICAST)) {		if (unlikely(!assoc &&			     ieee80211_is_data(hdr->frame_control))) {#ifdef CONFIG_MAC80211_VERBOSE_DEBUG			sdata_info(tx->sdata,				   "dropped data frame to not associated station %pM\n",				   hdr->addr1);#endif			I802_DEBUG_INC(tx->local->tx_handlers_drop_not_assoc);			return TX_DROP;		}	} else if (unlikely(ieee80211_is_data(hdr->frame_control) &&			    ieee80211_vif_get_num_mcast_if(tx->sdata) == 0)) {		/*		 * No associated STAs - no need to send multicast		 * frames.		 */		return TX_DROP;	} 	return TX_CONTINUE;} /* This function is called whenever the AP is about to exceed the maximum limit * of buffered frames for power saving STAs. This situation should not really * happen often during normal operation, so dropping the oldest buffered packet * from each queue should be OK to make some room for new frames. */static void purge_old_ps_buffers(struct ieee80211_local *local){	int total = 0, purged = 0;	struct sk_buff *skb;	struct ieee80211_sub_if_data *sdata;	struct sta_info *sta; 	list_for_each_entry_rcu(sdata, &local->interfaces, list) {		struct ps_data *ps; 		if (sdata->vif.type == NL80211_IFTYPE_AP)			ps = &sdata->u.ap.ps;		else if (ieee80211_vif_is_mesh(&sdata->vif))			ps = &sdata->u.mesh.ps;		else			continue; 		skb = skb_dequeue(&ps->bc_buf);		if (skb) {			purged++;			ieee80211_free_txskb(&local->hw, skb);		}		total += skb_queue_len(&ps->bc_buf);	} 	/*	 * Drop one frame from each station from the lowest-priority	 * AC that has frames at all.	 */	list_for_each_entry_rcu(sta, &local->sta_list, list) {		int ac; 		for (ac = IEEE80211_AC_BK; ac >= IEEE80211_AC_VO; ac--) {			skb = skb_dequeue(&sta->ps_tx_buf[ac]);			total += skb_queue_len(&sta->ps_tx_buf[ac]);			if (skb) {				purged++;				ieee80211_free_txskb(&local->hw, skb);				break;			}		}	} 	local->total_ps_buffered = total;	ps_dbg_hw(&local->hw, "PS buffers full - purged %d frames\n", purged);} static ieee80211_tx_resultieee80211_tx_h_multicast_ps_buf(struct ieee80211_tx_data *tx){	struct ieee80211_tx_info *info = IEEE80211_SKB_CB(tx->skb);	struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)tx->skb->data;	struct ps_data *ps; 	/*	 * broadcast/multicast frame	 *	 * If any of the associated/peer stations is in power save mode,	 * the frame is buffered to be sent after DTIM beacon frame.	 * This is done either by the hardware or us.	 */ 	/* powersaving STAs currently only in AP/VLAN/mesh mode */	if (tx->sdata->vif.type == NL80211_IFTYPE_AP ||	    tx->sdata->vif.type == NL80211_IFTYPE_AP_VLAN) {		if (!tx->sdata->bss)			return TX_CONTINUE; 		ps = &tx->sdata->bss->ps;	} else if (ieee80211_vif_is_mesh(&tx->sdata->vif)) {		ps = &tx->sdata->u.mesh.ps;	} else {		return TX_CONTINUE;	}  	/* no buffering for ordered frames */	if (ieee80211_has_order(hdr->frame_control))		return TX_CONTINUE; 	if (ieee80211_is_probe_req(hdr->frame_control))		return TX_CONTINUE; 	if (ieee80211_hw_check(&tx->local->hw, QUEUE_CONTROL))		info->hw_queue = tx->sdata->vif.cab_queue; 	/* no stations in PS mode and no buffered packets */	if (!atomic_read(&ps->num_sta_ps) && skb_queue_empty(&ps->bc_buf))		return TX_CONTINUE; 	info->flags |= IEEE80211_TX_CTL_SEND_AFTER_DTIM; 	/* device releases frame after DTIM beacon */	if (!ieee80211_hw_check(&tx->local->hw, HOST_BROADCAST_PS_BUFFERING))		return TX_CONTINUE; 	/* buffered in mac80211 */	if (tx->local->total_ps_buffered >= TOTAL_MAX_TX_BUFFER)		purge_old_ps_buffers(tx->local); 	if (skb_queue_len(&ps->bc_buf) >= AP_MAX_BC_BUFFER) {		ps_dbg(tx->sdata,		       "BC TX buffer full - dropping the oldest frame\n");		ieee80211_free_txskb(&tx->local->hw, skb_dequeue(&ps->bc_buf));	} else		tx->local->total_ps_buffered++; 	skb_queue_tail(&ps->bc_buf, tx->skb); 	return TX_QUEUED;} static int ieee80211_use_mfp(__le16 fc, struct sta_info *sta,			     struct sk_buff *skb){	if (!ieee80211_is_mgmt(fc))		return 0; 	if (sta == NULL || !test_sta_flag(sta, WLAN_STA_MFP))		return 0; 	if (!ieee80211_is_robust_mgmt_frame(skb))		return 0; 	return 1;} static ieee80211_tx_resultieee80211_tx_h_unicast_ps_buf(struct ieee80211_tx_data *tx){	struct sta_info *sta = tx->sta;	struct ieee80211_tx_info *info = IEEE80211_SKB_CB(tx->skb);	struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)tx->skb->data;	struct ieee80211_local *local = tx->local; 	if (unlikely(!sta))		return TX_CONTINUE; 	if (unlikely((test_sta_flag(sta, WLAN_STA_PS_STA) ||		      test_sta_flag(sta, WLAN_STA_PS_DRIVER) ||		      test_sta_flag(sta, WLAN_STA_PS_DELIVER)) &&		     !(info->flags & IEEE80211_TX_CTL_NO_PS_BUFFER))) {		int ac = skb_get_queue_mapping(tx->skb); 		if (ieee80211_is_mgmt(hdr->frame_control) &&		    !ieee80211_is_bufferable_mmpdu(tx->skb)) {			info->flags |= IEEE80211_TX_CTL_NO_PS_BUFFER;			return TX_CONTINUE;		} 		ps_dbg(sta->sdata, "STA %pM aid %d: PS buffer for AC %d\n",		       sta->sta.addr, sta->sta.aid, ac);		if (tx->local->total_ps_buffered >= TOTAL_MAX_TX_BUFFER)			purge_old_ps_buffers(tx->local); 		/* sync with ieee80211_sta_ps_deliver_wakeup */		spin_lock(&sta->ps_lock);		/*		 * STA woke up the meantime and all the frames on ps_tx_buf have		 * been queued to pending queue. No reordering can happen, go		 * ahead and Tx the packet.		 */		if (!test_sta_flag(sta, WLAN_STA_PS_STA) &&		    !test_sta_flag(sta, WLAN_STA_PS_DRIVER) &&		    !test_sta_flag(sta, WLAN_STA_PS_DELIVER)) {			spin_unlock(&sta->ps_lock);			return TX_CONTINUE;		} 		if (skb_queue_len(&sta->ps_tx_buf[ac]) >= STA_MAX_TX_BUFFER) {			struct sk_buff *old = skb_dequeue(&sta->ps_tx_buf[ac]);

Lines 1–500 of 6668.

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t