From d11158486a89c64513c67894dac6909fb049276f Mon Sep 17 00:00:00 2001 From: Lucas Asvio Date: Sat, 22 Feb 2025 12:48:06 +0100 Subject: [PATCH] mac80211: add support for NSS on ipq806x platform SqTER-PL --- package/kernel/mac80211/Makefile | 20 +- ...90-mac80211-add-nss-redirect-support.patch | 296 ++++++++++++++++++ ...rnel-warning-on-ath10k-wave2-devices.patch | 11 + 3 files changed, 323 insertions(+), 4 deletions(-) create mode 100644 package/kernel/mac80211/patches/subsys/990-mac80211-add-nss-redirect-support.patch create mode 100644 package/kernel/mac80211/patches/subsys/991-silence-kernel-warning-on-ath10k-wave2-devices.patch diff --git a/package/kernel/mac80211/Makefile b/package/kernel/mac80211/Makefile index 2dcd70f7e1..7940afa1ee 100644 --- a/package/kernel/mac80211/Makefile +++ b/package/kernel/mac80211/Makefile @@ -86,6 +86,7 @@ config-$(CONFIG_PACKAGE_CFG80211_TESTMODE) += NL80211_TESTMODE config-$(call config_package,mac80211,$(ALL_VARIANTS)) += MAC80211 config-$(CONFIG_PACKAGE_MAC80211_MESH) += MAC80211_MESH +config-$(CONFIG_PACKAGE_MAC80211_NSS_SUPPORT) += MAC80211_NSS_SUPPORT include ath.mk include broadcom.mk @@ -130,7 +131,7 @@ define KernelPackage/mac80211 $(call KernelPackage/mac80211/Default) TITLE:=Linux 802.11 Wireless Networking Stack # +kmod-crypto-cmac is a runtime only dependency of net/mac80211/aes_cmac.c - DEPENDS+= +kmod-cfg80211 +kmod-crypto-cmac +kmod-crypto-ccm +kmod-crypto-gcm +hostapd-common + DEPENDS+= +kmod-cfg80211 +kmod-crypto-cmac +kmod-crypto-ccm +kmod-crypto-gcm +hostapd-common +PACKAGE_kmod-qca-nss-drv:kmod-qca-nss-drv KCONFIG:=\ CONFIG_AVERAGE=y FILES:= $(PKG_BUILD_DIR)/net/mac80211/mac80211.ko @@ -141,6 +142,16 @@ endef define KernelPackage/mac80211/config if PACKAGE_kmod-mac80211 + if PACKAGE_kmod-qca-nss-drv + config PACKAGE_MAC80211_NSS_SUPPORT + bool "Enable NSS support for IPQ platform" + default y + help + This option enables support for NSS in boards + like Netgear R7800. + endif + + config PACKAGE_MAC80211_DEBUGFS bool "Export mac80211 internals in DebugFS" select KERNEL_DEBUG_FS @@ -282,9 +293,10 @@ ifeq ($(BUILD_VARIANT),smallbuffers) C_DEFINES+= -DCONFIG_ATH10K_SMALLBUFFERS endif -MAKE_OPTS:= \ - $(subst -C $(LINUX_DIR),-C "$(PKG_BUILD_DIR)",$(KERNEL_MAKEOPTS)) \ - EXTRA_CFLAGS="-I$(PKG_BUILD_DIR)/include $(IREMAP_CFLAGS) $(C_DEFINES)" \ +MAKE_OPTS:= -C "$(PKG_BUILD_DIR)" \ + $(KERNEL_MAKE_FLAGS) \ + EXTRA_CFLAGS="-I$(PKG_BUILD_DIR)/include $(IREMAP_CFLAGS) $(C_DEFINES) \ + -I$(STAGING_DIR)/usr/include/qca-nss-drv" \ KLIB_BUILD="$(LINUX_DIR)" \ MODPROBE=true \ KLIB=$(TARGET_MODULES_DIR) \ diff --git a/package/kernel/mac80211/patches/subsys/990-mac80211-add-nss-redirect-support.patch b/package/kernel/mac80211/patches/subsys/990-mac80211-add-nss-redirect-support.patch new file mode 100644 index 0000000000..eee2bfb496 --- /dev/null +++ b/package/kernel/mac80211/patches/subsys/990-mac80211-add-nss-redirect-support.patch @@ -0,0 +1,296 @@ +From 3acca4ecfe25a7d97e7cb820fd8c7c6324a1f318 Mon Sep 17 00:00:00 2001 +From: Sowmiya Sree Elavalagan +Date: Tue, 18 Aug 2020 16:17:25 +0530 +Subject: [PATCH] ath11k : Add NSS redirect support + +Add NSS Redirect support for ath11k. Tested on ipq8074 +Most of the changes are similar to the one done for ath10k with +minor changes to send to nss with eth header + +Redirect can be enabled by setting nss_redirect module param during +mac80211 insmod followed by ecm start +insmod mac80211.ko nss_redirect=1 +/etc/init.d/qca-nss-ecm start + +Check for ipv4_hash_hits counts in ipv4 stats and eth_rx +in qca-nss-drv to check whether packets are redirected or not. + +Verified both in nwifi and ethernet mode by running tcp and udp +traffic. + +Co-developed by: Sriram R +Signed-off-by: Sriram R +Signed-off-by: Sowmiya Sree Elavalagan +--- + net/mac80211/ieee80211_i.h | 2 ++ + net/mac80211/iface.c | 43 ++++++++++++++++++++++++++++++++ + net/mac80211/rx.c | 61 +++++++++++++++++++++++++++++++++++++--------- + net/mac80211/tx.c | 32 ++++++++++++++++++++++++ + 4 files changed, 126 insertions(+), 12 deletions(-) + +--- a/local-symbols ++++ b/local-symbols +@@ -32,6 +32,7 @@ LIB80211_CRYPT_CCMP= + LIB80211_CRYPT_TKIP= + LIB80211_DEBUG= + MAC80211= ++MAC80211_NSS_SUPPORT= + MAC80211_HAS_RC= + MAC80211_RC_MINSTREL= + MAC80211_RC_DEFAULT_MINSTREL= +--- a/net/mac80211/Kconfig ++++ b/net/mac80211/Kconfig +@@ -19,6 +19,13 @@ comment "CFG80211 needs to be enabled fo + + if MAC80211 != n + ++config MAC80211_NSS_SUPPORT ++ bool "Enable NSS support for IPQ platform" ++ default n ++ ---help--- ++ This option enables support for NSS in boards ++ like Netgear R7800. ++ + config MAC80211_HAS_RC + bool + +--- a/net/mac80211/ieee80211_i.h ++++ b/net/mac80211/ieee80211_i.h +@@ -36,6 +36,10 @@ + #include "debug.h" + #include "drop.h" + ++#ifdef CPTCFG_MAC80211_NSS_SUPPORT ++#include ++#endif ++ + extern const struct cfg80211_ops mac80211_config_ops; + + struct ieee80211_local; +@@ -1185,6 +1189,10 @@ struct ieee80211_sub_if_data { + } debugfs; + #endif + ++#ifdef CPTCFG_MAC80211_NSS_SUPPORT ++ struct nss_virt_if_handle *nssctx; ++#endif ++ + /* must be last, dynamically sized area in this! */ + struct ieee80211_vif vif; + }; +--- a/net/mac80211/iface.c ++++ b/net/mac80211/iface.c +@@ -27,6 +27,12 @@ + #include "wme.h" + #include "rate.h" + ++#ifdef CPTCFG_MAC80211_NSS_SUPPORT ++bool nss_redirect = true; ++module_param(nss_redirect, bool, 0644); ++MODULE_PARM_DESC(nss_redirect, "module param to enable NSS Redirect; 1-enable, 0-disable"); ++#endif ++ + /** + * DOC: Interface list locking + * +@@ -776,6 +782,13 @@ static int ieee80211_stop(struct net_dev + ieee80211_stop_mbssid(sdata); + } + ++#ifdef CPTCFG_MAC80211_NSS_SUPPORT ++ if (sdata->nssctx) { ++ nss_virt_if_destroy_sync(sdata->nssctx); ++ sdata_info(sdata, "Destroyed NSS virtual interface\n"); ++ } ++#endif ++ + wiphy_lock(sdata->local->hw.wiphy); + wiphy_work_cancel(sdata->local->hw.wiphy, &sdata->activate_links_work); + +@@ -1226,6 +1239,34 @@ void ieee80211_del_virtual_monitor(struc + kfree(sdata); + } + ++#ifdef CPTCFG_MAC80211_NSS_SUPPORT ++/* This callback is registered for nss redirect to receive packet exceptioned from nss in Rx path. ++ * When packet does not match any of the ecm rules is redirected back here. ++ */ ++void receive_from_nss(struct net_device *dev, struct sk_buff *sk_buff, struct napi_struct *napi) ++{ ++ struct net_device *netdev; ++ struct sk_buff *skb; ++ struct ieee80211_sub_if_data *sdata; ++ ++ if (!dev) { ++ kfree(sk_buff); ++ return; ++ } ++ ++ netdev = (struct net_device *)dev; ++ sdata = netdev_priv(netdev); ++ if (sdata->dev != dev) { ++ kfree(sk_buff); ++ return; ++ } ++ skb = (struct sk_buff *)sk_buff; ++ skb->dev = netdev; ++ skb->protocol = eth_type_trans(skb, netdev); ++ napi_gro_receive(napi, skb); ++} ++#endif ++ + /* + * NOTE: Be very careful when changing this function, it must NOT return + * an error on interface type changes that have been pre-checked, so most +@@ -1456,6 +1497,19 @@ int ieee80211_do_open(struct wireless_de + + ieee80211_recalc_ps(local); + ++#ifdef CPTCFG_MAC80211_NSS_SUPPORT ++ sdata->nssctx = NULL; ++ if (nss_redirect) { ++ sdata->nssctx = nss_virt_if_create_sync(dev); ++ if (sdata->nssctx) { ++ sdata_info(sdata, "Created a NSS virtual interface\n"); ++ nss_virt_if_register(sdata->nssctx, receive_from_nss, sdata->dev); ++ } else { ++ sdata_info(sdata, "Failed to create a NSS virtual interface\n"); ++ } ++ } ++#endif ++ + set_bit(SDATA_STATE_RUNNING, &sdata->state); + + return 0; +--- a/net/mac80211/rx.c ++++ b/net/mac80211/rx.c +@@ -2613,6 +2613,54 @@ static bool ieee80211_frame_allowed(stru + return true; + } + ++#ifdef CPTCFG_MAC80211_NSS_SUPPORT ++#define case_rtn_string(val) case val: return #val ++ ++static const char *nss_tx_status_str(nss_tx_status_t status) ++{ ++ switch (status) { ++ case_rtn_string(NSS_TX_SUCCESS); ++ case_rtn_string(NSS_TX_FAILURE); ++ case_rtn_string(NSS_TX_FAILURE_QUEUE); ++ case_rtn_string(NSS_TX_FAILURE_NOT_READY); ++ case_rtn_string(NSS_TX_FAILURE_TOO_LARGE); ++ case_rtn_string(NSS_TX_FAILURE_TOO_SHORT); ++ case_rtn_string(NSS_TX_FAILURE_NOT_SUPPORTED); ++ case_rtn_string(NSS_TX_FAILURE_BAD_PARAM); ++ default: ++ return "Unknown NSS TX status"; ++ } ++} ++ ++static void netif_rx_nss(struct ieee80211_rx_data *rx, ++ struct sk_buff *skb) ++{ ++ struct ieee80211_sub_if_data *sdata = rx->sdata; ++ int ret; ++ ++ if (!sdata->nssctx) ++ goto out; ++ ++ /* NSS expects ethernet header in skb data so resetting here */ ++ skb_push(skb, ETH_HLEN); ++ ret = nss_virt_if_tx_buf(sdata->nssctx, skb); ++ if (ret) { ++ if (net_ratelimit()) { ++ sdata_err(sdata, "NSS TX failed with error: %s\n", ++ nss_tx_status_str(ret)); ++ } ++ goto out; ++ } ++ ++ return; ++out: ++ if (rx->list) ++ list_add_tail(&skb->list, rx->list); ++ else ++ netif_receive_skb(skb); ++} ++#endif ++ + static void ieee80211_deliver_skb_to_local_stack(struct sk_buff *skb, + struct ieee80211_rx_data *rx) + { +@@ -2653,10 +2701,14 @@ static void ieee80211_deliver_skb_to_loc + ether_addr_copy(ehdr->h_dest, sdata->vif.addr); + + /* deliver to local stack */ ++#ifdef CPTCFG_MAC80211_NSS_SUPPORT ++ netif_rx_nss(rx, skb); ++#else + if (rx->list) + list_add_tail(&skb->list, rx->list); + else + netif_receive_skb(skb); ++#endif + } + } + +--- a/net/mac80211/tx.c ++++ b/net/mac80211/tx.c +@@ -4495,6 +4495,35 @@ static void ieee80211_mlo_multicast_tx(s + kfree_skb(skb); + } + ++#ifdef CPTCFG_MAC80211_NSS_SUPPORT ++void ieee80211_xmit_nss_fixup(struct sk_buff *skb, ++ struct net_device *dev) ++{ ++ struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); ++ ++ /* Packets from NSS does not have valid protocol, priority and other ++ * network stack values. Derive required parameters (priority ++ * and network_header) from payload for QoS header. ++ * XXX: Here the assumption is that packet are in 802.3 format. ++ * As of now priority is handled only for IPv4 and IPv6. ++ */ ++ ++ if (sdata->nssctx && likely(!skb->protocol)) { ++ skb_set_network_header(skb, 14); ++ switch (((struct ethhdr *)skb->data)->h_proto) { ++ case htons(ETH_P_IP): ++ skb->priority = (ipv4_get_dsfield(ip_hdr(skb)) & ++ 0xfc) >> 5; ++ break; ++ case htons(ETH_P_IPV6): ++ skb->priority = (ipv6_get_dsfield(ipv6_hdr(skb)) & ++ 0xfc) >> 5; ++ break; ++ } ++ } ++} ++#endif ++ + /** + * ieee80211_subif_start_xmit - netif start_xmit function for 802.3 vifs + * @skb: packet to be sent +@@ -4510,6 +4539,10 @@ netdev_tx_t ieee80211_subif_start_xmit(s + struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); + const struct ethhdr *eth = (void *)skb->data; + ++#ifdef CPTCFG_MAC80211_NSS_SUPPORT ++ ieee80211_xmit_nss_fixup(skb, dev); ++#endif ++ + if (likely(!is_multicast_ether_addr(eth->h_dest))) + goto normal; + +@@ -4696,6 +4729,10 @@ netdev_tx_t ieee80211_subif_start_xmit_8 + struct ieee80211_key *key; + struct sta_info *sta; + ++#ifdef CPTCFG_MAC80211_NSS_SUPPORT ++ ieee80211_xmit_nss_fixup(skb, dev); ++#endif ++ + if (unlikely(!ieee80211_sdata_running(sdata) || skb->len < ETH_HLEN)) { + kfree_skb(skb); + return NETDEV_TX_OK; diff --git a/package/kernel/mac80211/patches/subsys/991-silence-kernel-warning-on-ath10k-wave2-devices.patch b/package/kernel/mac80211/patches/subsys/991-silence-kernel-warning-on-ath10k-wave2-devices.patch new file mode 100644 index 0000000000..04d4e9815c --- /dev/null +++ b/package/kernel/mac80211/patches/subsys/991-silence-kernel-warning-on-ath10k-wave2-devices.patch @@ -0,0 +1,11 @@ +--- a/net/mac80211/main.c ++++ b/net/mac80211/main.c +@@ -269,7 +269,7 @@ void ieee80211_hw_conf_init(struct ieee8 + ctx ? &ctx->conf : NULL); + } + +- WARN_ON(drv_config(local, changed)); ++ drv_config(local, changed); + } + + int ieee80211_emulate_add_chanctx(struct ieee80211_hw *hw,