From 5af7d47cd7fb936dc7d640e1ba63443152d0416a Mon Sep 17 00:00:00 2001 From: Martin Schiller Date: Tue, 27 Jun 2023 09:57:53 +0200 Subject: [PATCH 1/5] kernel: net: phy: realtek: fix rtl822x_probe on unsupported devices Calling rtl822x_probe() on phy devices which uses the rtl822x_read_mmd() and rtl822x_write_mmd() functions makes no sense and the probe ends with an EOPNOTSUPP error. Signed-off-by: Martin Schiller --- ...-phy-realtek-introduce-rtl822x_probe.patch | 24 ++++--------------- ...tek-detect-early-version-of-RTL8221B.patch | 2 +- ...-phy-realtek-introduce-rtl822x_probe.patch | 24 ++++--------------- ...tek-detect-early-version-of-RTL8221B.patch | 2 +- 4 files changed, 10 insertions(+), 42 deletions(-) diff --git a/target/linux/generic/pending-5.15/729-net-phy-realtek-introduce-rtl822x_probe.patch b/target/linux/generic/pending-5.15/729-net-phy-realtek-introduce-rtl822x_probe.patch index 87102d3818..cea3511b83 100644 --- a/target/linux/generic/pending-5.15/729-net-phy-realtek-introduce-rtl822x_probe.patch +++ b/target/linux/generic/pending-5.15/729-net-phy-realtek-introduce-rtl822x_probe.patch @@ -50,23 +50,7 @@ Signed-off-by: Daniel Golle static int rtlgen_resume(struct phy_device *phydev) { int ret = genphy_resume(phydev); -@@ -1013,6 +1036,7 @@ static struct phy_driver realtek_drvs[] - .match_phy_device = rtl8226_match_phy_device, - .get_features = rtl822x_get_features, - .config_aneg = rtl822x_config_aneg, -+ .probe = rtl822x_probe, - .read_status = rtl822x_read_status, - .suspend = genphy_suspend, - .resume = rtlgen_resume, -@@ -1026,6 +1050,7 @@ static struct phy_driver realtek_drvs[] - .name = "RTL8226B_RTL8221B 2.5Gbps PHY", - .get_features = rtl822x_get_features, - .config_aneg = rtl822x_config_aneg, -+ .probe = rtl822x_probe, - .read_status = rtl822x_read_status, - .suspend = genphy_suspend, - .resume = rtlgen_resume, -@@ -1039,6 +1064,7 @@ static struct phy_driver realtek_drvs[] +@@ -1039,6 +1062,7 @@ static struct phy_driver realtek_drvs[] .name = "RTL8226-CG 2.5Gbps PHY", .get_features = rtl822x_get_features, .config_aneg = rtl822x_config_aneg, @@ -74,7 +58,7 @@ Signed-off-by: Daniel Golle .read_status = rtl822x_read_status, .suspend = genphy_suspend, .resume = rtlgen_resume, -@@ -1050,6 +1076,7 @@ static struct phy_driver realtek_drvs[] +@@ -1050,6 +1074,7 @@ static struct phy_driver realtek_drvs[] .name = "RTL8226B-CG_RTL8221B-CG 2.5Gbps PHY", .get_features = rtl822x_get_features, .config_aneg = rtl822x_config_aneg, @@ -82,7 +66,7 @@ Signed-off-by: Daniel Golle .read_status = rtl822x_read_status, .suspend = genphy_suspend, .resume = rtlgen_resume, -@@ -1062,6 +1089,7 @@ static struct phy_driver realtek_drvs[] +@@ -1062,6 +1087,7 @@ static struct phy_driver realtek_drvs[] .get_features = rtl822x_get_features, .config_init = rtl8221b_config_init, .config_aneg = rtl822x_config_aneg, @@ -90,7 +74,7 @@ Signed-off-by: Daniel Golle .read_status = rtl822x_read_status, .suspend = genphy_suspend, .resume = rtlgen_resume, -@@ -1074,6 +1102,7 @@ static struct phy_driver realtek_drvs[] +@@ -1074,6 +1100,7 @@ static struct phy_driver realtek_drvs[] .get_features = rtl822x_get_features, .config_aneg = rtl822x_config_aneg, .config_init = rtl8221b_config_init, diff --git a/target/linux/generic/pending-5.15/730-net-phy-realtek-detect-early-version-of-RTL8221B.patch b/target/linux/generic/pending-5.15/730-net-phy-realtek-detect-early-version-of-RTL8221B.patch index 6d414bfbad..b1e7a35a55 100644 --- a/target/linux/generic/pending-5.15/730-net-phy-realtek-detect-early-version-of-RTL8221B.patch +++ b/target/linux/generic/pending-5.15/730-net-phy-realtek-detect-early-version-of-RTL8221B.patch @@ -52,7 +52,7 @@ Signed-off-by: Daniel Golle static int rtl822x_probe(struct phy_device *phydev) { struct device *dev = &phydev->mdio.dev; -@@ -1084,7 +1116,7 @@ static struct phy_driver realtek_drvs[] +@@ -1082,7 +1114,7 @@ static struct phy_driver realtek_drvs[] .write_page = rtl821x_write_page, .soft_reset = genphy_soft_reset, }, { diff --git a/target/linux/generic/pending-6.1/729-net-phy-realtek-introduce-rtl822x_probe.patch b/target/linux/generic/pending-6.1/729-net-phy-realtek-introduce-rtl822x_probe.patch index b5dbfa383a..2eca27310f 100644 --- a/target/linux/generic/pending-6.1/729-net-phy-realtek-introduce-rtl822x_probe.patch +++ b/target/linux/generic/pending-6.1/729-net-phy-realtek-introduce-rtl822x_probe.patch @@ -50,23 +50,7 @@ Signed-off-by: Daniel Golle static int rtlgen_resume(struct phy_device *phydev) { int ret = genphy_resume(phydev); -@@ -1033,6 +1056,7 @@ static struct phy_driver realtek_drvs[] - .match_phy_device = rtl8226_match_phy_device, - .get_features = rtl822x_get_features, - .config_aneg = rtl822x_config_aneg, -+ .probe = rtl822x_probe, - .read_status = rtl822x_read_status, - .suspend = genphy_suspend, - .resume = rtlgen_resume, -@@ -1046,6 +1070,7 @@ static struct phy_driver realtek_drvs[] - .name = "RTL8226B_RTL8221B 2.5Gbps PHY", - .get_features = rtl822x_get_features, - .config_aneg = rtl822x_config_aneg, -+ .probe = rtl822x_probe, - .read_status = rtl822x_read_status, - .suspend = genphy_suspend, - .resume = rtlgen_resume, -@@ -1059,6 +1084,7 @@ static struct phy_driver realtek_drvs[] +@@ -1059,6 +1082,7 @@ static struct phy_driver realtek_drvs[] .name = "RTL8226-CG 2.5Gbps PHY", .get_features = rtl822x_get_features, .config_aneg = rtl822x_config_aneg, @@ -74,7 +58,7 @@ Signed-off-by: Daniel Golle .read_status = rtl822x_read_status, .suspend = genphy_suspend, .resume = rtlgen_resume, -@@ -1070,6 +1096,7 @@ static struct phy_driver realtek_drvs[] +@@ -1070,6 +1094,7 @@ static struct phy_driver realtek_drvs[] .name = "RTL8226B-CG_RTL8221B-CG 2.5Gbps PHY", .get_features = rtl822x_get_features, .config_aneg = rtl822x_config_aneg, @@ -82,7 +66,7 @@ Signed-off-by: Daniel Golle .read_status = rtl822x_read_status, .suspend = genphy_suspend, .resume = rtlgen_resume, -@@ -1082,6 +1109,7 @@ static struct phy_driver realtek_drvs[] +@@ -1082,6 +1107,7 @@ static struct phy_driver realtek_drvs[] .get_features = rtl822x_get_features, .config_init = rtl8221b_config_init, .config_aneg = rtl822x_config_aneg, @@ -90,7 +74,7 @@ Signed-off-by: Daniel Golle .read_status = rtl822x_read_status, .suspend = genphy_suspend, .resume = rtlgen_resume, -@@ -1094,6 +1122,7 @@ static struct phy_driver realtek_drvs[] +@@ -1094,6 +1120,7 @@ static struct phy_driver realtek_drvs[] .get_features = rtl822x_get_features, .config_aneg = rtl822x_config_aneg, .config_init = rtl8221b_config_init, diff --git a/target/linux/generic/pending-6.1/730-net-phy-realtek-detect-early-version-of-RTL8221B.patch b/target/linux/generic/pending-6.1/730-net-phy-realtek-detect-early-version-of-RTL8221B.patch index ac38555151..97e128ccdb 100644 --- a/target/linux/generic/pending-6.1/730-net-phy-realtek-detect-early-version-of-RTL8221B.patch +++ b/target/linux/generic/pending-6.1/730-net-phy-realtek-detect-early-version-of-RTL8221B.patch @@ -52,7 +52,7 @@ Signed-off-by: Daniel Golle static int rtl822x_probe(struct phy_device *phydev) { struct device *dev = &phydev->mdio.dev; -@@ -1104,7 +1136,7 @@ static struct phy_driver realtek_drvs[] +@@ -1102,7 +1134,7 @@ static struct phy_driver realtek_drvs[] .write_page = rtl821x_write_page, .soft_reset = genphy_soft_reset, }, { From 01885bc6a33dbfa6f3c9e97778fd8f4f60e2514f Mon Sep 17 00:00:00 2001 From: Felix Fietkau Date: Thu, 22 Jun 2023 19:37:13 +0200 Subject: [PATCH 2/5] mt76: update to the latest version 2c9c8ffe9d8c wifi: mt76: mt7615: fix possible race in mt7615_mac_sta_poll 3365c80f4202 wifi: mt76: connac: fix stats->tx_bytes calculation b69d82130b47 wifi: mt76: connac: do not check WED status for non-mmio devices 1f9cd65b55d7 wifi: mt76: mt7921e: fix probe timeout after reboot 42dace9ce247 wifi: mt76: mt7921: Fix use-after-free in fw features query. 540adbb38205 wifi: mt76: mt7921: add Netgear AXE3000 (A8000) support 150e2d0ffc0c wifi: mt76: mt7996: fix possible NULL pointer dereference in mt7996_mac_write_txwi() 5b7519be2bf6 wifi: mt76: mt7996: fix endianness of MT_TXD6_TX_RATE 40f6e433f747 wifi: mt76: mt76x02: remove WEP support 84ea1a24f5b5 mt76: mt7921: don't assume adequate headroom for SDIO headers 5c28e17f8c78 wifi: mt76: mt7996: fix header translation logic 2386cec860fa wifi: mt76: mt7996: enable BSS_CHANGED_MU_GROUPS support 748d4a2bfebd wifi: mt76: mt7615: enable BSS_CHANGED_MU_GROUPS support 458ad0af21be wifi: mt76: enable UNII-4 channel 177 support 7fb046011293 wifi: mt76: mt7915: fix background radar event being blocked d2a77a9954bb wifi: mt76: mt7915: report tx retries/failed counts for non-WED path f76b102b09ca wifi: mt76: mt7915: rework tx packets counting when WED is active 5637d9e37d9e wifi: mt76: mt7915: rework tx bytes counting when WED is active 34bdc7fcb4c0 wifi: mt76: report non-binding skb tx rate when WED is active d71aa7b992a3 wifi: mt76: mt7915: drop return in mt7915_sta_statistics 251c363c3087 wifi: mt76: mt7996: drop return in mt7996_sta_statistics 150bb95cb153 wifi: mt76: mt7921: do not support one stream on secondary antenna only d480c3281f21 wifi: mt76: mt7921: remove macro duplication in regs.h 18b1027e5b6e wifi: mt76: mt7915: move mib_stats structure in mt76.h 25ec4b91020e wifi: mt76: mt7996: rely on mib_stats shared definition 6541afa88b3b wifi: mt76: mt7921: rely on mib_stats shared definition eeb60eb9a5a0 wifi: mt76: mt7915: add support for MT7981 [sync with upstream] d5b7e6a3d735 wifi: mt76: mt7921e: report tx retries/failed counts in tx free event f0f19cea6646 wifi: mt76: mt7921: fix skb leak by txs missing in AMSDU edd8a830f6e3 wifi: mt76: add tx_nss histogram to ethtool stats e48235308b3e wifi: mt76: mt7915: accumulate mu-mimo ofdma muru stats a729242363d9 wifi: mt76: mt7921: fix non-PSC channel scan fail 8d52436ee0cd wifi: mt76: mt7921: Support temp sensor d152c8688c14 wifi: mt76: mt7915: disable WFDMA Tx/Rx during SER recovery d07785c344ac wifi: mt76: mt7996: disable WFDMA Tx/Rx during SER recovery 2a19784137f9 wifi: mt76: mt7921: make mt7921_mac_sta_poll static da8e33a15e71 wifi: mt76: mt7915: fix command timeout in AP stop period cc58d5c4a9c9 mt76: mt7996: rely on mt76_sta_stats in mt76_wcid 98a37c82a373 wifi: mt76: mt7921: get rid of MT7921_RESET_TIMEOUT marco ece724cf562b wifi: mt76: mt7996: move radio ctrl commands to proper functions 527cbbc5ede7 wifi: mt76: connac: add support for dsp firmware download 44e323340637 wifi: mt76: mt7996: fix bss wlan_idx when sending bss_info command 63f0053df07a wifi: mt76: mt7996: enable VHT extended NSS BW feature e1bb4ef7b2bb wifi: mt76: connac: add support to set ifs time by mcu command 080ca19cc686 wifi: mt76: mt7996: use correct phy for background radar event 2c163f1812a3 wifi: mt76: mt7996: fix WA event ring size b511a437ace4 wifi: mt76: mt7996: add muru support ece67c98dc1c wifi: mt76: mt7996: increase tx token size 7c2515d85117 wifi: mt76: mt7921e: fix init command fail with enabled device 30706095c566 wifi: mt76: mt7915: move sta_poll_list and sta_poll_lock in mt76_dev b06ed10ee271 wifi: mt76: mt7603: rely on shared sta_poll_list and sta_poll_lock b59bdae339de wifi: mt76: mt7615: rely on shared sta_poll_list and sta_poll_lock 6da2e0e4ef54 wifi: mt76: mt7996: rely on shared sta_poll_list and sta_poll_lock b19d3ad88e8b wifi: mt76: mt7921: rely on shared sta_poll_list and sta_poll_lock 595b033275a3 wifi: mt76: mt7915: move poll_list in mt76_wcid 16fcad171849 wifi: mt76: mt7603: rely on shared poll_list field e19f84091d2e wifi: mt76: mt7615: rely on shared poll_list field b87e4dad1e84 wifi: mt76: mt7996: rely on shared poll_list field 6d7950e258d0 wifi: mt76: mt7921: rely on shared poll_list field f5c5eece5038 wifi: mt76: move ampdu_state in mt76_wcid 7e44467469fe mt76: connac: move more mt7921/mt7915 mac shared code in connac lib 39a70710ddcd wifi: mt76: move rate info in mt76_vif 0dc4326991df wifi: mt76: connac: move connac3 definitions in mt76_connac3_mac.h 29cfabbb4b90 wifi: mt76: connac: add connac3 mac library d60b401867f4 linux-firmware: update firmware for MT7922 WiFi device 9404601a6c97 linux-firmware: update firmware for MT7922 WiFi device 2f851902d6b1 linux-firmware: update firmware for MT7921 WiFi device f36b921692b9 Revert "wifi: mt76: mt76x02: remove WEP support Signed-off-by: Felix Fietkau --- package/kernel/mt76/Makefile | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/package/kernel/mt76/Makefile b/package/kernel/mt76/Makefile index 04db7fe32c..7ada236c67 100644 --- a/package/kernel/mt76/Makefile +++ b/package/kernel/mt76/Makefile @@ -8,9 +8,9 @@ PKG_LICENSE_FILES:= PKG_SOURCE_URL:=https://github.com/openwrt/mt76 PKG_SOURCE_PROTO:=git -PKG_SOURCE_DATE:=2023-05-13 -PKG_SOURCE_VERSION:=969b7b5ebd129068ca56e4b0d831593a2f92382f -PKG_MIRROR_HASH:=d28869591d1cb9a967b72f5cd8215c7b2c3388b7b31147b7b18c797018ab8ffb +PKG_SOURCE_DATE:=2023-06-27 +PKG_SOURCE_VERSION:=f36b921692b940bc74b155575e9a17930b42140d +PKG_MIRROR_HASH:=c26dea3a58ba03d539c8e6cc2d3c99ce0cb5bb3b1aac76cab7fea689b6a86e4c PKG_MAINTAINER:=Felix Fietkau PKG_USE_NINJA:=0 @@ -266,7 +266,7 @@ define KernelPackage/mt7921-common $(KernelPackage/mt76-default) TITLE:=MediaTek MT7615 wireless driver common code HIDDEN:=1 - DEPENDS+=+kmod-mt76-connac +kmod-mt7921-firmware +@DRIVER_11AX_SUPPORT + DEPENDS+=+kmod-mt76-connac +kmod-mt7921-firmware +@DRIVER_11AX_SUPPORT +kmod-hwmon-core FILES:= $(PKG_BUILD_DIR)/mt7921/mt7921-common.ko endef From 9419a50242f81b73bae2b1105c0e370385682ad1 Mon Sep 17 00:00:00 2001 From: Felix Fietkau Date: Tue, 6 Jun 2023 15:05:27 +0200 Subject: [PATCH 3/5] ucode: update to the latest version 9986b839595d ci: unbreak failing builds by using fixed gh-actions-openwrt-ci-sdk 77c961e20eda ci: fix broken imx6-generic SDK build 86107a647cb0 ci: cancel concurrent builds ed543d8bf481 ci: update the workflows 11d5f8840002 Merge pull request #151 from ynezz/ynezz/unbreak-ci b934ce815ff2 program: fix memory leak in read_sourceinfo b0baf043e64c Merge pull request #152 from Ansuel/fix-memory-leak 740e2501fdca main: add user specified library search paths before default path 15f1a669e8e2 struct: remove state->len 29edb011caf1 ubus: add support for strings containing null bytes 2b4346bfdc67 vm: clear vm->alloc_refs in uc_gc_common b213bd120d55 Merge pull request #150 from nbd168/misc-improvements 66520ebe27ae vm: immediately release arguments on calls with invalid spreads 07cc72a77e3b README.md: fix debian dependencies d048ea88fe71 compiler: fix memory leak in uc_compiler_compile_import on early exit 7b7e22dcdf02 Merge pull request #155 from luizluca/luizluca-patch-1 d656d150905e types: implement ucv_object_sort() d72eebeb168b lib: support object ordering in `uc_sort()` ed1f0133c870 nl80211: add constants for iftypes 3ffb046c59a6 Merge pull request #156 from nbd168/nl80211-iftypes c7d84aae0969 Merge pull request #153 from jow-/lib-sort-object-support Signed-off-by: Felix Fietkau --- package/utils/ucode/Makefile | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package/utils/ucode/Makefile b/package/utils/ucode/Makefile index e768acbae9..e2fe4c8bad 100644 --- a/package/utils/ucode/Makefile +++ b/package/utils/ucode/Makefile @@ -12,9 +12,9 @@ PKG_RELEASE:=1 PKG_SOURCE_PROTO:=git PKG_SOURCE_URL=https://github.com/jow-/ucode.git -PKG_SOURCE_DATE:=2023-04-03 -PKG_SOURCE_VERSION:=5163867269fc04fa01ec5e9f8df3384c933339f2 -PKG_MIRROR_HASH:=e82922ff59d6f899d9434bf79f2e6e4add0b7b0466355755fc83d4b5a0aeebfb +PKG_SOURCE_DATE:=2023-06-06 +PKG_SOURCE_VERSION:=c7d84aae09691a99ae3db427c0b2463732ef84f4 +PKG_MIRROR_HASH:=38826ae70d886d1d7ada3fc6591ac807169aa28107f60f7f2e617520083525fb PKG_MAINTAINER:=Jo-Philipp Wich PKG_LICENSE:=ISC From 81f667513a2dd0ef82b6ef06fecf61d474bff72f Mon Sep 17 00:00:00 2001 From: Felix Fietkau Date: Wed, 28 Jun 2023 15:10:52 +0200 Subject: [PATCH 4/5] netifd: update to the latest version 493e1589bc8b bridge: fix coverity false positive report 03a619947717 bridge: add support for configuring extra vlans for the bridge itself 4bea6d21a9ab wireless: fix changing reconf/serialize options in configuration 255b4d5c472e wireless: fix handling config reload with reconf=1 1ab992a74b43 wireless: fix another reconf issue Signed-off-by: Felix Fietkau --- package/network/config/netifd/Makefile | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package/network/config/netifd/Makefile b/package/network/config/netifd/Makefile index 69fdfa28ec..957cc83d3c 100644 --- a/package/network/config/netifd/Makefile +++ b/package/network/config/netifd/Makefile @@ -5,9 +5,9 @@ PKG_RELEASE:=1 PKG_SOURCE_PROTO:=git PKG_SOURCE_URL=$(PROJECT_GIT)/project/netifd.git -PKG_SOURCE_DATE:=2023-06-23 -PKG_SOURCE_VERSION:=edf3aced9f9ae4b07cfbb98d3919ddc7a9e44362 -PKG_MIRROR_HASH:=cae6397d7e10d5f2659bf4c1e66b1ed7198693d2d4e448c414780fcf2a43ea94 +PKG_SOURCE_DATE:=2023-06-29 +PKG_SOURCE_VERSION:=1ab992a74b43c7b92667ec2b8480de8fa40df689 +PKG_MIRROR_HASH:=8664ca50006e654e0f250fadd479e1f280a5fe32923d76583cc4efb02694ffba PKG_MAINTAINER:=Felix Fietkau PKG_LICENSE:=GPL-2.0 From c8963580aaf6a1207367c809d1350557d6e075e9 Mon Sep 17 00:00:00 2001 From: Felix Fietkau Date: Fri, 30 Jun 2023 13:18:31 +0200 Subject: [PATCH 5/5] mac80211: fix mesh fast tx cache issues Split the cache by tx type in order to avoid packet drop issues Signed-off-by: Felix Fietkau --- ...esh-fast-tx-cache-into-local-proxied.patch | 219 ++++++++++++++++++ 1 file changed, 219 insertions(+) create mode 100644 package/kernel/mac80211/patches/subsys/338-mac80211-split-mesh-fast-tx-cache-into-local-proxied.patch diff --git a/package/kernel/mac80211/patches/subsys/338-mac80211-split-mesh-fast-tx-cache-into-local-proxied.patch b/package/kernel/mac80211/patches/subsys/338-mac80211-split-mesh-fast-tx-cache-into-local-proxied.patch new file mode 100644 index 0000000000..f7391a5809 --- /dev/null +++ b/package/kernel/mac80211/patches/subsys/338-mac80211-split-mesh-fast-tx-cache-into-local-proxied.patch @@ -0,0 +1,219 @@ +From: Felix Fietkau +Date: Fri, 30 Jun 2023 13:11:51 +0200 +Subject: [PATCH] mac80211: split mesh fast tx cache into + local/proxied/forwarded + +Depending on the origin of the packets (and their SA), 802.11 + mesh headers +could be filled in differently. In order to properly deal with that, add a +new field to the lookup key, indicating the type (local, proxied or +forwarded). This can fix spurious packet drop issues that depend on the order +in which nodes/hosts communicate with each other. + +Signed-off-by: Felix Fietkau +--- + +--- a/net/mac80211/mesh.c ++++ b/net/mac80211/mesh.c +@@ -703,6 +703,9 @@ bool ieee80211_mesh_xmit_fast(struct iee + struct sk_buff *skb, u32 ctrl_flags) + { + struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh; ++ struct ieee80211_mesh_fast_tx_key key = { ++ .type = MESH_FAST_TX_TYPE_LOCAL ++ }; + struct ieee80211_mesh_fast_tx *entry; + struct ieee80211s_hdr *meshhdr; + u8 sa[ETH_ALEN] __aligned(2); +@@ -738,7 +741,10 @@ bool ieee80211_mesh_xmit_fast(struct iee + return false; + } + +- entry = mesh_fast_tx_get(sdata, skb->data); ++ ether_addr_copy(key.addr, skb->data); ++ if (!ether_addr_equal(skb->data + ETH_ALEN, sdata->vif.addr)) ++ key.type = MESH_FAST_TX_TYPE_PROXIED; ++ entry = mesh_fast_tx_get(sdata, &key); + if (!entry) + return false; + +--- a/net/mac80211/mesh.h ++++ b/net/mac80211/mesh.h +@@ -133,9 +133,33 @@ struct mesh_path { + #define MESH_FAST_TX_CACHE_TIMEOUT 8000 /* msecs */ + + /** ++ * enum ieee80211_mesh_fast_tx_type - cached mesh fast tx entry type ++ * ++ * @MESH_FAST_TX_TYPE_LOCAL: tx from the local vif address as SA ++ * @MESH_FAST_TX_TYPE_PROXIED: local tx with a different SA (e.g. bridged) ++ * @MESH_FAST_TX_TYPE_FORWARDED: forwarded from a different mesh point ++ */ ++enum ieee80211_mesh_fast_tx_type { ++ MESH_FAST_TX_TYPE_LOCAL, ++ MESH_FAST_TX_TYPE_PROXIED, ++ MESH_FAST_TX_TYPE_FORWARDED, ++}; ++ ++/** ++ * struct ieee80211_mesh_fast_tx_key - cached mesh fast tx entry key ++ * ++ * @addr: The Ethernet DA for this entry ++ * @type: cache entry type ++ */ ++struct ieee80211_mesh_fast_tx_key { ++ u8 addr[ETH_ALEN] __aligned(2); ++ enum ieee80211_mesh_fast_tx_type type; ++}; ++ ++/** + * struct ieee80211_mesh_fast_tx - cached mesh fast tx entry + * @rhash: rhashtable pointer +- * @addr_key: The Ethernet DA which is the key for this entry ++ * @key: the lookup key for this cache entry + * @fast_tx: base fast_tx data + * @hdr: cached mesh and rfc1042 headers + * @hdrlen: length of mesh + rfc1042 +@@ -146,7 +170,7 @@ struct mesh_path { + */ + struct ieee80211_mesh_fast_tx { + struct rhash_head rhash; +- u8 addr_key[ETH_ALEN] __aligned(2); ++ struct ieee80211_mesh_fast_tx_key key; + + struct ieee80211_fast_tx fast_tx; + u8 hdr[sizeof(struct ieee80211s_hdr) + sizeof(rfc1042_header)]; +@@ -329,7 +353,8 @@ void mesh_path_tx_root_frame(struct ieee + + bool mesh_action_is_path_sel(struct ieee80211_mgmt *mgmt); + struct ieee80211_mesh_fast_tx * +-mesh_fast_tx_get(struct ieee80211_sub_if_data *sdata, const u8 *addr); ++mesh_fast_tx_get(struct ieee80211_sub_if_data *sdata, ++ struct ieee80211_mesh_fast_tx_key *key); + bool ieee80211_mesh_xmit_fast(struct ieee80211_sub_if_data *sdata, + struct sk_buff *skb, u32 ctrl_flags); + void mesh_fast_tx_cache(struct ieee80211_sub_if_data *sdata, +--- a/net/mac80211/mesh_pathtbl.c ++++ b/net/mac80211/mesh_pathtbl.c +@@ -36,8 +36,8 @@ static const struct rhashtable_params me + static const struct rhashtable_params fast_tx_rht_params = { + .nelem_hint = 10, + .automatic_shrinking = true, +- .key_len = ETH_ALEN, +- .key_offset = offsetof(struct ieee80211_mesh_fast_tx, addr_key), ++ .key_len = sizeof(struct ieee80211_mesh_fast_tx_key), ++ .key_offset = offsetof(struct ieee80211_mesh_fast_tx, key), + .head_offset = offsetof(struct ieee80211_mesh_fast_tx, rhash), + .hashfn = mesh_table_hash, + }; +@@ -426,20 +426,21 @@ static void mesh_fast_tx_entry_free(stru + } + + struct ieee80211_mesh_fast_tx * +-mesh_fast_tx_get(struct ieee80211_sub_if_data *sdata, const u8 *addr) ++mesh_fast_tx_get(struct ieee80211_sub_if_data *sdata, ++ struct ieee80211_mesh_fast_tx_key *key) + { + struct ieee80211_mesh_fast_tx *entry; + struct mesh_tx_cache *cache; + + cache = &sdata->u.mesh.tx_cache; +- entry = rhashtable_lookup(&cache->rht, addr, fast_tx_rht_params); ++ entry = rhashtable_lookup(&cache->rht, key, fast_tx_rht_params); + if (!entry) + return NULL; + + if (!(entry->mpath->flags & MESH_PATH_ACTIVE) || + mpath_expired(entry->mpath)) { + spin_lock_bh(&cache->walk_lock); +- entry = rhashtable_lookup(&cache->rht, addr, fast_tx_rht_params); ++ entry = rhashtable_lookup(&cache->rht, key, fast_tx_rht_params); + if (entry) + mesh_fast_tx_entry_free(cache, entry); + spin_unlock_bh(&cache->walk_lock); +@@ -484,18 +485,24 @@ void mesh_fast_tx_cache(struct ieee80211 + if (!sta) + return; + ++ build.key.type = MESH_FAST_TX_TYPE_LOCAL; + if ((meshhdr->flags & MESH_FLAGS_AE) == MESH_FLAGS_AE_A5_A6) { + /* This is required to keep the mppath alive */ + mppath = mpp_path_lookup(sdata, meshhdr->eaddr1); + if (!mppath) + return; + build.mppath = mppath; ++ if (!ether_addr_equal(meshhdr->eaddr2, sdata->vif.addr)) ++ build.key.type = MESH_FAST_TX_TYPE_PROXIED; + } else if (ieee80211_has_a4(hdr->frame_control)) { + mppath = mpath; + } else { + return; + } + ++ if (!ether_addr_equal(hdr->addr4, sdata->vif.addr)) ++ build.key.type = MESH_FAST_TX_TYPE_FORWARDED; ++ + /* rate limit, in case fast xmit can't be enabled */ + if (mppath->fast_tx_check == jiffies) + return; +@@ -542,7 +549,7 @@ void mesh_fast_tx_cache(struct ieee80211 + } + } + +- memcpy(build.addr_key, mppath->dst, ETH_ALEN); ++ memcpy(build.key.addr, mppath->dst, ETH_ALEN); + build.timestamp = jiffies; + build.fast_tx.band = info->band; + build.fast_tx.da_offs = offsetof(struct ieee80211_hdr, addr3); +@@ -644,13 +651,19 @@ void mesh_fast_tx_flush_addr(struct ieee + const u8 *addr) + { + struct mesh_tx_cache *cache = &sdata->u.mesh.tx_cache; ++ struct ieee80211_mesh_fast_tx_key key = {}; + struct ieee80211_mesh_fast_tx *entry; ++ int i; + ++ ether_addr_copy(key.addr, addr); + cache = &sdata->u.mesh.tx_cache; + spin_lock_bh(&cache->walk_lock); +- entry = rhashtable_lookup(&cache->rht, addr, fast_tx_rht_params); +- if (entry) +- mesh_fast_tx_entry_free(cache, entry); ++ for (i = MESH_FAST_TX_TYPE_LOCAL; i < MESH_FAST_TX_TYPE_FORWARDED; i++) { ++ key.type = i; ++ entry = rhashtable_lookup(&cache->rht, &key, fast_tx_rht_params); ++ if (entry) ++ mesh_fast_tx_entry_free(cache, entry); ++ } + spin_unlock_bh(&cache->walk_lock); + } + +--- a/net/mac80211/rx.c ++++ b/net/mac80211/rx.c +@@ -2726,7 +2726,10 @@ ieee80211_rx_mesh_fast_forward(struct ie + struct sk_buff *skb, int hdrlen) + { + struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh; +- struct ieee80211_mesh_fast_tx *entry = NULL; ++ struct ieee80211_mesh_fast_tx_key key = { ++ .type = MESH_FAST_TX_TYPE_FORWARDED ++ }; ++ struct ieee80211_mesh_fast_tx *entry; + struct ieee80211s_hdr *mesh_hdr; + struct tid_ampdu_tx *tid_tx; + struct sta_info *sta; +@@ -2735,9 +2738,13 @@ ieee80211_rx_mesh_fast_forward(struct ie + + 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); ++ ether_addr_copy(key.addr, mesh_hdr->eaddr1); + else if (!(mesh_hdr->flags & MESH_FLAGS_AE)) +- entry = mesh_fast_tx_get(sdata, skb->data); ++ ether_addr_copy(key.addr, skb->data); ++ else ++ return false; ++ ++ entry = mesh_fast_tx_get(sdata, &key); + if (!entry) + return false; +