mirror of
https://github.com/openwrt/openwrt.git
synced 2024-12-28 17:48:58 +00:00
323e249ce8
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>
133 lines
4.0 KiB
Diff
133 lines
4.0 KiB
Diff
From: Felix Fietkau <nbd@nbd.name>
|
|
Date: Thu, 16 Feb 2023 11:07:30 +0100
|
|
Subject: [PATCH] wifi: mac80211: use mesh header cache to speed up mesh
|
|
forwarding
|
|
|
|
Significantly reduces mesh forwarding path CPU usage and enables the
|
|
direct use of iTXQ.
|
|
|
|
Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
|
---
|
|
|
|
--- a/net/mac80211/rx.c
|
|
+++ b/net/mac80211/rx.c
|
|
@@ -2726,6 +2726,65 @@ ieee80211_deliver_skb(struct ieee80211_r
|
|
}
|
|
}
|
|
|
|
+#ifdef CPTCFG_MAC80211_MESH
|
|
+static bool
|
|
+ieee80211_rx_mesh_fast_forward(struct ieee80211_sub_if_data *sdata,
|
|
+ struct sk_buff *skb, int hdrlen)
|
|
+{
|
|
+ struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh;
|
|
+ struct ieee80211_mesh_fast_tx *entry = NULL;
|
|
+ struct ieee80211s_hdr *mesh_hdr;
|
|
+ struct tid_ampdu_tx *tid_tx;
|
|
+ struct sta_info *sta;
|
|
+ struct ethhdr eth;
|
|
+ u8 tid;
|
|
+
|
|
+ mesh_hdr = (struct ieee80211s_hdr *)(skb->data + sizeof(eth));
|
|
+ if ((mesh_hdr->flags & MESH_FLAGS_AE) == MESH_FLAGS_AE_A5_A6)
|
|
+ entry = mesh_fast_tx_get(sdata, mesh_hdr->eaddr1);
|
|
+ else if (!(mesh_hdr->flags & MESH_FLAGS_AE))
|
|
+ entry = mesh_fast_tx_get(sdata, skb->data);
|
|
+ if (!entry)
|
|
+ return false;
|
|
+
|
|
+ sta = rcu_dereference(entry->mpath->next_hop);
|
|
+ if (!sta)
|
|
+ return false;
|
|
+
|
|
+ if (skb_linearize(skb))
|
|
+ return false;
|
|
+
|
|
+ tid = skb->priority & IEEE80211_QOS_CTL_TAG1D_MASK;
|
|
+ tid_tx = rcu_dereference(sta->ampdu_mlme.tid_tx[tid]);
|
|
+ if (tid_tx) {
|
|
+ if (!test_bit(HT_AGG_STATE_OPERATIONAL, &tid_tx->state))
|
|
+ return false;
|
|
+
|
|
+ if (tid_tx->timeout)
|
|
+ tid_tx->last_tx = jiffies;
|
|
+ }
|
|
+
|
|
+ ieee80211_aggr_check(sdata, sta, skb);
|
|
+
|
|
+ if (ieee80211_get_8023_tunnel_proto(skb->data + hdrlen,
|
|
+ &skb->protocol))
|
|
+ hdrlen += ETH_ALEN;
|
|
+ else
|
|
+ skb->protocol = htons(skb->len - hdrlen);
|
|
+ skb_set_network_header(skb, hdrlen + 2);
|
|
+
|
|
+ skb->dev = sdata->dev;
|
|
+ memcpy(ð, skb->data, ETH_HLEN - 2);
|
|
+ skb_pull(skb, 2);
|
|
+ __ieee80211_xmit_fast(sdata, sta, &entry->fast_tx, skb, tid_tx,
|
|
+ eth.h_dest, eth.h_source);
|
|
+ IEEE80211_IFSTA_MESH_CTR_INC(ifmsh, fwded_unicast);
|
|
+ IEEE80211_IFSTA_MESH_CTR_INC(ifmsh, fwded_frames);
|
|
+
|
|
+ return true;
|
|
+}
|
|
+#endif
|
|
+
|
|
static ieee80211_rx_result
|
|
ieee80211_rx_mesh_data(struct ieee80211_sub_if_data *sdata, struct sta_info *sta,
|
|
struct sk_buff *skb)
|
|
@@ -2830,6 +2889,10 @@ ieee80211_rx_mesh_data(struct ieee80211_
|
|
|
|
skb_set_queue_mapping(skb, ieee802_1d_to_ac[skb->priority]);
|
|
|
|
+ if (!multicast &&
|
|
+ ieee80211_rx_mesh_fast_forward(sdata, skb, mesh_hdrlen))
|
|
+ return RX_QUEUED;
|
|
+
|
|
ieee80211_fill_mesh_addresses(&hdr, &hdr.frame_control,
|
|
eth->h_dest, eth->h_source);
|
|
hdrlen = ieee80211_hdrlen(hdr.frame_control);
|
|
@@ -2868,6 +2931,7 @@ ieee80211_rx_mesh_data(struct ieee80211_
|
|
info->control.flags |= IEEE80211_TX_INTCFL_NEED_TXPROCESSING;
|
|
info->control.vif = &sdata->vif;
|
|
info->control.jiffies = jiffies;
|
|
+ fwd_skb->dev = sdata->dev;
|
|
if (multicast) {
|
|
IEEE80211_IFSTA_MESH_CTR_INC(ifmsh, fwded_mcast);
|
|
memcpy(fwd_hdr->addr2, sdata->vif.addr, ETH_ALEN);
|
|
@@ -2889,7 +2953,6 @@ ieee80211_rx_mesh_data(struct ieee80211_
|
|
}
|
|
|
|
IEEE80211_IFSTA_MESH_CTR_INC(ifmsh, fwded_frames);
|
|
- fwd_skb->dev = sdata->dev;
|
|
ieee80211_add_pending_skb(local, fwd_skb);
|
|
|
|
rx_accept:
|
|
--- a/net/mac80211/ieee80211_i.h
|
|
+++ b/net/mac80211/ieee80211_i.h
|
|
@@ -2027,6 +2027,8 @@ void __ieee80211_xmit_fast(struct ieee80
|
|
struct ieee80211_fast_tx *fast_tx,
|
|
struct sk_buff *skb, bool ampdu,
|
|
const u8 *da, const u8 *sa);
|
|
+void ieee80211_aggr_check(struct ieee80211_sub_if_data *sdata,
|
|
+ struct sta_info *sta, struct sk_buff *skb);
|
|
|
|
/* HT */
|
|
void ieee80211_apply_htcap_overrides(struct ieee80211_sub_if_data *sdata,
|
|
--- a/net/mac80211/tx.c
|
|
+++ b/net/mac80211/tx.c
|
|
@@ -1197,10 +1197,8 @@ static bool ieee80211_tx_prep_agg(struct
|
|
return queued;
|
|
}
|
|
|
|
-static void
|
|
-ieee80211_aggr_check(struct ieee80211_sub_if_data *sdata,
|
|
- struct sta_info *sta,
|
|
- struct sk_buff *skb)
|
|
+void ieee80211_aggr_check(struct ieee80211_sub_if_data *sdata,
|
|
+ struct sta_info *sta, struct sk_buff *skb)
|
|
{
|
|
struct rate_control_ref *ref = sdata->local->rate_ctrl;
|
|
u16 tid;
|