This updates mac80211 to version 6.1.97-1. This code is based on Linux 6.1.97 and contains all fixes included in the upstream wireless subsystem from that kernel version. This includes many bugfixes and also some security fixes. The removed patches are already integrated in upstream Linux 6.1.97 or in backports. The following patches were integrated in upstream Linux: ath11k/0013-wifi-ath11k-synchronize-ath11k_mac_he_gi_to_nl80211_.patch ath11k/0035-wifi-ath11k-Use-platform_get_irq-to-get-the-interrup.patch ath11k/0036-wifi-ath11k-fix-SAC-bug-on-peer-addition-with-sta-ba.patch ath11k/0047-wifi-ath11k-fix-deinitialization-of-firmware-resourc.patch ath11k/0053-wifi-ath11k-fix-writing-to-unintended-memory-region.patch ath11k/0060-wifi-ath11k-Ignore-frags-from-uninitialized-peer-in-.patch ath11k/0065-wifi-ath11k-fix-tx-status-reporting-in-encap-offload.patch ath11k/0067-wifi-ath11k-Fix-SKB-corruption-in-REO-destination-ri.patch ath11k/0069-wifi-ath11k-fix-registration-of-6Ghz-only-phy-withou.patch ath11k/0080-wifi-ath11k-add-support-default-regdb-while-searchin.patch ath11k/0085-wifi-ath11k-fix-memory-leak-in-WMI-firmware-stats.patch ath11k/0086-wifi-ath11k-Add-missing-check-for-ioremap.patch ath11k/0096-wifi-ath11k-fix-boot-failure-with-one-MSI-vector.patch subsys/337-wifi-mac80211-fix-race-condition-on-enabling-fast-xm.patch The following patches were integrated in upstream backports: ath11k/901-wifi-ath11k-pci-fix-compilation-in-5.16-and-older.patch build/080-resv_start_op.patch build/110-backport_napi_build_skb.patch The following files are missing in backports, we do not have to remove them any more. Some were already missing before some were removed in this update: include/linux/cordic.h include/linux/crc8.h include/linux/eeprom_93cx6.h include/linux/wl12xx.h include/net/ieee80211.h backport-include/linux/bcm47xx_nvram.h include/linux/ath9k_platform.h include/net/bluetooth/ backports ships a dummy Mediatek wed header for older kernel versions. We backported the feature in our kernel, remove the dummy header: backport-include/linux/soc/mediatek/mtk_wed.h Remove header files for subsystems used form the mainline kernel: include/trace/events/qrtr.h include/net/rsi_91x.h backport-include/linux/platform_data/brcmnand.h Link: https://github.com/openwrt/openwrt/pull/15827 Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
135 lines
4.6 KiB
Diff
135 lines
4.6 KiB
Diff
From: Johannes Berg <johannes.berg@intel.com>
|
|
Date: Wed, 29 Mar 2023 16:46:26 +0200
|
|
Subject: [PATCH] wifi: ieee80211: correctly mark FTM frames non-bufferable
|
|
|
|
The checks of whether or not a frame is bufferable were not
|
|
taking into account that some action frames aren't, such as
|
|
FTM. Check this, which requires some changes to the function
|
|
ieee80211_is_bufferable_mmpdu() since we need the whole skb
|
|
for the checks now.
|
|
|
|
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
|
Reviewed-by: Greenman, Gregory <gregory.greenman@intel.com>
|
|
Reviewed-by: Peer, Ilan <ilan.peer@intel.com>
|
|
---
|
|
|
|
--- a/drivers/net/wireless/intel/iwlwifi/mvm/tx.c
|
|
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/tx.c
|
|
@@ -605,8 +605,9 @@ static void iwl_mvm_skb_prepare_status(s
|
|
|
|
static int iwl_mvm_get_ctrl_vif_queue(struct iwl_mvm *mvm,
|
|
struct ieee80211_tx_info *info,
|
|
- struct ieee80211_hdr *hdr)
|
|
+ struct sk_buff *skb)
|
|
{
|
|
+ struct ieee80211_hdr *hdr = (void *)skb->data;
|
|
struct iwl_mvm_vif *mvmvif =
|
|
iwl_mvm_vif_from_mac80211(info->control.vif);
|
|
__le16 fc = hdr->frame_control;
|
|
@@ -625,7 +626,7 @@ static int iwl_mvm_get_ctrl_vif_queue(st
|
|
* reason 7 ("Class 3 frame received from nonassociated STA").
|
|
*/
|
|
if (ieee80211_is_mgmt(fc) &&
|
|
- (!ieee80211_is_bufferable_mmpdu(fc) ||
|
|
+ (!ieee80211_is_bufferable_mmpdu(skb) ||
|
|
ieee80211_is_deauth(fc) || ieee80211_is_disassoc(fc)))
|
|
return mvm->probe_queue;
|
|
|
|
@@ -744,7 +745,7 @@ int iwl_mvm_tx_skb_non_sta(struct iwl_mv
|
|
else
|
|
sta_id = mvmvif->mcast_sta.sta_id;
|
|
|
|
- queue = iwl_mvm_get_ctrl_vif_queue(mvm, &info, hdr);
|
|
+ queue = iwl_mvm_get_ctrl_vif_queue(mvm, &info, skb);
|
|
} else if (info.control.vif->type == NL80211_IFTYPE_MONITOR) {
|
|
queue = mvm->snif_queue;
|
|
sta_id = mvm->snif_sta.sta_id;
|
|
--- a/include/linux/ieee80211.h
|
|
+++ b/include/linux/ieee80211.h
|
|
@@ -772,20 +772,6 @@ static inline bool ieee80211_is_any_null
|
|
}
|
|
|
|
/**
|
|
- * ieee80211_is_bufferable_mmpdu - check if frame is bufferable MMPDU
|
|
- * @fc: frame control field in little-endian byteorder
|
|
- */
|
|
-static inline bool ieee80211_is_bufferable_mmpdu(__le16 fc)
|
|
-{
|
|
- /* IEEE 802.11-2012, definition of "bufferable management frame";
|
|
- * note that this ignores the IBSS special case. */
|
|
- return ieee80211_is_mgmt(fc) &&
|
|
- (ieee80211_is_action(fc) ||
|
|
- ieee80211_is_disassoc(fc) ||
|
|
- ieee80211_is_deauth(fc));
|
|
-}
|
|
-
|
|
-/**
|
|
* ieee80211_is_first_frag - check if IEEE80211_SCTL_FRAG is not set
|
|
* @seq_ctrl: frame sequence control bytes in little-endian byteorder
|
|
*/
|
|
@@ -4123,6 +4109,44 @@ static inline u8 *ieee80211_get_DA(struc
|
|
}
|
|
|
|
/**
|
|
+ * ieee80211_is_bufferable_mmpdu - check if frame is bufferable MMPDU
|
|
+ * @skb: the skb to check, starting with the 802.11 header
|
|
+ */
|
|
+static inline bool ieee80211_is_bufferable_mmpdu(struct sk_buff *skb)
|
|
+{
|
|
+ struct ieee80211_mgmt *mgmt = (void *)skb->data;
|
|
+ __le16 fc = mgmt->frame_control;
|
|
+
|
|
+ /*
|
|
+ * IEEE 802.11 REVme D2.0 definition of bufferable MMPDU;
|
|
+ * note that this ignores the IBSS special case.
|
|
+ */
|
|
+ if (!ieee80211_is_mgmt(fc))
|
|
+ return false;
|
|
+
|
|
+ if (ieee80211_is_disassoc(fc) || ieee80211_is_deauth(fc))
|
|
+ return true;
|
|
+
|
|
+ if (!ieee80211_is_action(fc))
|
|
+ return false;
|
|
+
|
|
+ if (skb->len < offsetofend(typeof(*mgmt), u.action.u.ftm.action_code))
|
|
+ return true;
|
|
+
|
|
+ /* action frame - additionally check for non-bufferable FTM */
|
|
+
|
|
+ if (mgmt->u.action.category != WLAN_CATEGORY_PUBLIC &&
|
|
+ mgmt->u.action.category != WLAN_CATEGORY_PROTECTED_DUAL_OF_ACTION)
|
|
+ return true;
|
|
+
|
|
+ if (mgmt->u.action.u.ftm.action_code == WLAN_PUB_ACTION_FTM_REQUEST ||
|
|
+ mgmt->u.action.u.ftm.action_code == WLAN_PUBLIC_ACTION_FTM_RESPONSE)
|
|
+ return false;
|
|
+
|
|
+ return true;
|
|
+}
|
|
+
|
|
+/**
|
|
* _ieee80211_is_robust_mgmt_frame - check if frame is a robust management frame
|
|
* @hdr: the frame (buffer must include at least the first octet of payload)
|
|
*/
|
|
--- a/net/mac80211/tx.c
|
|
+++ b/net/mac80211/tx.c
|
|
@@ -488,7 +488,7 @@ ieee80211_tx_h_unicast_ps_buf(struct iee
|
|
int ac = skb_get_queue_mapping(tx->skb);
|
|
|
|
if (ieee80211_is_mgmt(hdr->frame_control) &&
|
|
- !ieee80211_is_bufferable_mmpdu(hdr->frame_control)) {
|
|
+ !ieee80211_is_bufferable_mmpdu(tx->skb)) {
|
|
info->flags |= IEEE80211_TX_CTL_NO_PS_BUFFER;
|
|
return TX_CONTINUE;
|
|
}
|
|
@@ -1332,7 +1332,7 @@ static struct txq_info *ieee80211_get_tx
|
|
if (!(info->flags & IEEE80211_TX_CTL_HW_80211_ENCAP) &&
|
|
unlikely(!ieee80211_is_data_present(hdr->frame_control))) {
|
|
if ((!ieee80211_is_mgmt(hdr->frame_control) ||
|
|
- ieee80211_is_bufferable_mmpdu(hdr->frame_control) ||
|
|
+ ieee80211_is_bufferable_mmpdu(skb) ||
|
|
vif->type == NL80211_IFTYPE_STATION) &&
|
|
sta && sta->uploaded) {
|
|
/*
|