mirror of
https://github.com/openwrt/openwrt.git
synced 2025-01-01 11:36:49 +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>
78 lines
2.5 KiB
Diff
78 lines
2.5 KiB
Diff
From: Felix Fietkau <nbd@nbd.name>
|
|
Date: Thu, 2 Mar 2023 13:52:29 +0100
|
|
Subject: [PATCH] wifi: mac80211: add mesh fast-rx support
|
|
|
|
This helps bring down rx CPU usage by avoiding calls to the rx handlers in
|
|
the slow path. Supports forwarding and local rx, including A-MSDU.
|
|
|
|
Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
|
---
|
|
|
|
--- a/net/mac80211/rx.c
|
|
+++ b/net/mac80211/rx.c
|
|
@@ -4580,6 +4580,12 @@ void ieee80211_check_fast_rx(struct sta_
|
|
}
|
|
|
|
break;
|
|
+ case NL80211_IFTYPE_MESH_POINT:
|
|
+ fastrx.expected_ds_bits = cpu_to_le16(IEEE80211_FCTL_FROMDS |
|
|
+ IEEE80211_FCTL_TODS);
|
|
+ fastrx.da_offs = offsetof(struct ieee80211_hdr, addr3);
|
|
+ fastrx.sa_offs = offsetof(struct ieee80211_hdr, addr4);
|
|
+ break;
|
|
default:
|
|
goto clear;
|
|
}
|
|
@@ -4788,6 +4794,7 @@ static bool ieee80211_invoke_fast_rx(str
|
|
struct sk_buff *skb = rx->skb;
|
|
struct ieee80211_hdr *hdr = (void *)skb->data;
|
|
struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb);
|
|
+ static ieee80211_rx_result res;
|
|
int orig_len = skb->len;
|
|
int hdrlen = ieee80211_hdrlen(hdr->frame_control);
|
|
int snap_offs = hdrlen;
|
|
@@ -4849,7 +4856,8 @@ static bool ieee80211_invoke_fast_rx(str
|
|
snap_offs += IEEE80211_CCMP_HDR_LEN;
|
|
}
|
|
|
|
- if (!(status->rx_flags & IEEE80211_RX_AMSDU)) {
|
|
+ if (!ieee80211_vif_is_mesh(&rx->sdata->vif) &&
|
|
+ !(status->rx_flags & IEEE80211_RX_AMSDU)) {
|
|
if (!pskb_may_pull(skb, snap_offs + sizeof(*payload)))
|
|
return false;
|
|
|
|
@@ -4888,13 +4896,29 @@ static bool ieee80211_invoke_fast_rx(str
|
|
/* do the header conversion - first grab the addresses */
|
|
ether_addr_copy(addrs.da, skb->data + fast_rx->da_offs);
|
|
ether_addr_copy(addrs.sa, skb->data + fast_rx->sa_offs);
|
|
- skb_postpull_rcsum(skb, skb->data + snap_offs,
|
|
- sizeof(rfc1042_header) + 2);
|
|
- /* remove the SNAP but leave the ethertype */
|
|
- skb_pull(skb, snap_offs + sizeof(rfc1042_header));
|
|
+ if (ieee80211_vif_is_mesh(&rx->sdata->vif)) {
|
|
+ skb_pull(skb, snap_offs - 2);
|
|
+ put_unaligned_be16(skb->len - 2, skb->data);
|
|
+ } else {
|
|
+ skb_postpull_rcsum(skb, skb->data + snap_offs,
|
|
+ sizeof(rfc1042_header) + 2);
|
|
+
|
|
+ /* remove the SNAP but leave the ethertype */
|
|
+ skb_pull(skb, snap_offs + sizeof(rfc1042_header));
|
|
+ }
|
|
/* push the addresses in front */
|
|
memcpy(skb_push(skb, sizeof(addrs)), &addrs, sizeof(addrs));
|
|
|
|
+ res = ieee80211_rx_mesh_data(rx->sdata, rx->sta, rx->skb);
|
|
+ switch (res) {
|
|
+ case RX_QUEUED:
|
|
+ return true;
|
|
+ case RX_CONTINUE:
|
|
+ break;
|
|
+ default:
|
|
+ goto drop;
|
|
+ }
|
|
+
|
|
ieee80211_rx_8023(rx, fast_rx, orig_len);
|
|
|
|
return true;
|