mac80211: add support for NSS on ipq806x platform

SqTER-PL <r.napierala@asta-net.pl>
This commit is contained in:
Lucas Asvio
2025-02-22 12:48:06 +01:00
parent decbb7c782
commit d11158486a
3 changed files with 323 additions and 4 deletions

View File

@@ -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) \

View File

@@ -0,0 +1,296 @@
From 3acca4ecfe25a7d97e7cb820fd8c7c6324a1f318 Mon Sep 17 00:00:00 2001
From: Sowmiya Sree Elavalagan <ssreeela@codeaurora.org>
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 <srirrama@codeaurora.org>
Signed-off-by: Sriram R <srirrama@codeaurora.org>
Signed-off-by: Sowmiya Sree Elavalagan <ssreeela@codeaurora.org>
---
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 <nss_api_if.h>
+#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;

View File

@@ -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,