mirror of
https://github.com/Telecominfraproject/wlan-ap.git
synced 2025-12-20 19:03:39 +00:00
221 lines
7.3 KiB
Diff
221 lines
7.3 KiB
Diff
From 91df8aa674d2d4064ab22f47515c3fb126527208 Mon Sep 17 00:00:00 2001
|
|
From: Karthikeyan Kathirvel <kathirve@codeaurora.org>
|
|
Date: Thu, 12 Nov 2020 15:02:56 +0530
|
|
Subject: [PATCH] ath11k: NSS MCBC Exception added for STA
|
|
|
|
Since NSS FW is not supporting PN check for MCBC pkts, those pkts are
|
|
excepted from NSS offload to pass through mac80211 PN check.
|
|
|
|
Signed-off-by: Karthikeyan Kathirvel <kathirve@codeaurora.org>
|
|
Change-Id: I4a6ac67a1c2cf3ab7a219d0953907191606a5e70
|
|
---
|
|
drivers/net/wireless/ath/ath11k/nss.c | 128 +++++++++++++++++++++
|
|
drivers/net/wireless/ath/ath11k/nss.h | 51 ++++----
|
|
2 files changed, 153 insertions(+), 26 deletions(-)
|
|
create mode 100644 mac80211/patches/301-ath11k-nss-mcbc-exception.patch
|
|
|
|
--- a/drivers/net/wireless/ath/ath11k/nss.c
|
|
+++ b/drivers/net/wireless/ath/ath11k/nss.c
|
|
@@ -600,7 +600,7 @@ static int ath11k_nss_undecap_nwifi(stru
|
|
|
|
static void ath11k_nss_wds_type_rx(struct ath11k *ar, struct net_device *dev,
|
|
u8* src_mac, u8 is_sa_valid, u8 addr4_valid,
|
|
- u16 peer_id, bool *drop)
|
|
+ u16 peer_id)
|
|
{
|
|
struct ath11k_base *ab = ar->ab;
|
|
struct ath11k_ast_entry *ast_entry = NULL;
|
|
@@ -635,9 +635,6 @@ static void ath11k_nss_wds_type_rx(struc
|
|
ath11k_nss_update_wds_peer(ar, ta_peer, src_mac);
|
|
}
|
|
}
|
|
-
|
|
- if (!ta_peer->nss.ext_vdev_up)
|
|
- drop = true;
|
|
}
|
|
|
|
spin_unlock_bh(&ab->base_lock);
|
|
@@ -681,8 +678,7 @@ static void ath11k_nss_mec_handler(struc
|
|
|
|
static void ath11k_nss_vdev_spl_receive_ext_wdsdata(struct ath11k_vif *arvif,
|
|
struct sk_buff *skb,
|
|
- struct nss_wifi_vdev_wds_per_packet_metadata *wds_metadata,
|
|
- bool *drop)
|
|
+ struct nss_wifi_vdev_wds_per_packet_metadata *wds_metadata)
|
|
{
|
|
struct ath11k *ar = arvif->ar;
|
|
struct ath11k_base *ab = ar->ab;
|
|
@@ -704,7 +700,7 @@ static void ath11k_nss_vdev_spl_receive_
|
|
switch (wds_type) {
|
|
case NSS_WIFI_VDEV_WDS_TYPE_RX:
|
|
ath11k_nss_wds_type_rx(ar, skb->dev, src_mac, is_sa_valid,
|
|
- addr4_valid, peer_id, &drop);
|
|
+ addr4_valid, peer_id);
|
|
break;
|
|
case NSS_WIFI_VDEV_WDS_TYPE_MEC:
|
|
ath11k_nss_mec_handler(ar, (u8 *)(skb->data));
|
|
@@ -767,12 +763,14 @@ ath11k_nss_vdev_special_data_receive(str
|
|
{
|
|
struct nss_wifi_vdev_per_packet_metadata *wifi_metadata = NULL;
|
|
struct nss_wifi_vdev_wds_per_packet_metadata *wds_metadata = NULL;
|
|
+ struct nss_wifi_vdev_addr4_data_metadata *addr4_metadata = NULL;
|
|
struct ath11k_vif *arvif;
|
|
struct ath11k_base *ab;
|
|
- bool drop = false;
|
|
+ struct ath11k_skb_rxcb *rxcb;
|
|
bool eth_decap = false;
|
|
int data_offs = 0;
|
|
int ret = 0;
|
|
+ struct ath11k_peer *ta_peer = NULL;
|
|
|
|
arvif = ath11k_nss_get_arvif_from_dev(dev);
|
|
if (!arvif) {
|
|
@@ -804,15 +802,50 @@ ath11k_nss_vdev_special_data_receive(str
|
|
return;
|
|
}
|
|
|
|
- if (eth_decap && wifi_metadata->pkt_type ==
|
|
- NSS_WIFI_VDEV_EXT_DATA_PKT_TYPE_WDS_LEARN) {
|
|
- wds_metadata = &wifi_metadata->metadata.wds_metadata;
|
|
- ath11k_nss_vdev_spl_receive_ext_wdsdata(arvif, skb,
|
|
- wds_metadata, &drop);
|
|
- }
|
|
+ switch(wifi_metadata->pkt_type) {
|
|
+ case NSS_WIFI_VDEV_EXT_DATA_PKT_TYPE_WDS_LEARN:
|
|
+ if (eth_decap) {
|
|
+ wds_metadata = &wifi_metadata->metadata.wds_metadata;
|
|
+ ath11k_nss_vdev_spl_receive_ext_wdsdata(arvif, skb,
|
|
+ wds_metadata);
|
|
+ }
|
|
+ dev_kfree_skb_any(skb);
|
|
+ break;
|
|
+ case NSS_WIFI_VDEV_EXT_DATA_PKT_TYPE_MCBC_RX:
|
|
+ ath11k_dbg_dump(ab, ATH11K_DBG_DP_RX, "",
|
|
+ "mcbc packet exception from nss: ",
|
|
+ skb->data, skb->len);
|
|
+ rxcb = ATH11K_SKB_RXCB(skb);
|
|
+ rxcb->rx_desc = (struct hal_rx_desc *)skb->head;
|
|
+ rxcb->is_first_msdu = rxcb->is_last_msdu = true;
|
|
+ rxcb->is_continuation = false;
|
|
+ rxcb->is_mcbc = true;
|
|
+ ath11k_dp_rx_from_nss(arvif->ar, skb, napi);
|
|
+ break;
|
|
+ case NSS_WIFI_VDEV_EXT_DATA_PKT_TYPE_4ADDR:
|
|
+ if (eth_decap) {
|
|
+ addr4_metadata = &wifi_metadata->metadata.addr4_metadata;
|
|
+
|
|
+ spin_lock_bh(&ab->base_lock);
|
|
+ ta_peer = ath11k_peer_find_by_id(ab, addr4_metadata->peer_id);
|
|
+ if (!ta_peer) {
|
|
+ spin_unlock_bh(&ab->base_lock);
|
|
+ dev_kfree_skb_any(skb);
|
|
+ return;
|
|
+ }
|
|
|
|
- if (!drop)
|
|
- ath11k_nss_deliver_rx(arvif->vif, skb, eth_decap, data_offs, napi);
|
|
+ ath11k_dbg(ab, ATH11K_DBG_NSS_WDS, "4addr exception ta_peer %pM\n",
|
|
+ ta_peer->addr);
|
|
+ if (!ta_peer->nss.ext_vdev_up && addr4_metadata->addr4_valid)
|
|
+ ieee80211_rx_nss_notify_4addr(dev, ta_peer->addr);
|
|
+ spin_unlock_bh(&ab->base_lock);
|
|
+ }
|
|
+ dev_kfree_skb_any(skb);
|
|
+ break;
|
|
+ default:
|
|
+ ath11k_warn(ab, "unsupported pkt_type %d from nss\n", wifi_metadata->pkt_type);
|
|
+ dev_kfree_skb_any(skb);
|
|
+ }
|
|
}
|
|
|
|
static void
|
|
@@ -2001,6 +2034,7 @@ ath11k_nss_mesh_link_vdev_special_data_r
|
|
rxcb->rx_desc = (struct hal_rx_desc *)skb->head;
|
|
rxcb->is_first_msdu = rxcb->is_last_msdu = true;
|
|
rxcb->is_continuation = false;
|
|
+ rxcb->is_mcbc = true;
|
|
ath11k_dp_rx_from_nss(arvif->ar, skb, napi);
|
|
break;
|
|
case NSS_WIFI_VDEV_EXT_DATA_PKT_TYPE_MESH:
|
|
@@ -2125,6 +2159,9 @@ int ath11k_nss_vdev_set_cmd(struct ath11
|
|
case ATH11K_NSS_WIFI_VDEV_CFG_WDS_BACKHAUL_CMD:
|
|
cmd = NSS_WIFI_VDEV_CFG_WDS_BACKHAUL_CMD;
|
|
break;
|
|
+ case ATH11K_NSS_WIFI_VDEV_CFG_MCBC_EXC_TO_HOST_CMD:
|
|
+ cmd = NSS_WIFI_VDEV_CFG_MCBC_EXC_TO_HOST_CMD;
|
|
+ break;
|
|
default:
|
|
return -EINVAL;
|
|
}
|
|
@@ -2638,12 +2675,31 @@ int ath11k_nss_vdev_create(struct ath11k
|
|
goto free_vdev;
|
|
|
|
switch (arvif->vif->type) {
|
|
- case NL80211_IFTYPE_AP:
|
|
case NL80211_IFTYPE_STATION:
|
|
ret = ath11k_nss_vdev_configure(arvif);
|
|
if (ret)
|
|
goto unregister_vdev;
|
|
|
|
+ ret = ath11k_nss_vdev_set_cmd(arvif,
|
|
+ ATH11K_NSS_WIFI_VDEV_CFG_MCBC_EXC_TO_HOST_CMD,
|
|
+ ATH11K_NSS_ENABLE_MCBC_EXC);
|
|
+ if (ret) {
|
|
+ ath11k_err(ab, "failed to set MCBC in nss %d\n", ret);
|
|
+ goto unregister_vdev;
|
|
+ }
|
|
+ break;
|
|
+ case NL80211_IFTYPE_AP:
|
|
+ ret = ath11k_nss_vdev_configure(arvif);
|
|
+ if (ret)
|
|
+ goto unregister_vdev;
|
|
+
|
|
+ ret = ath11k_nss_vdev_set_cmd(arvif,
|
|
+ ATH11K_NSS_WIFI_VDEV_CFG_WDS_BACKHAUL_CMD,
|
|
+ true);
|
|
+ if (ret) {
|
|
+ ath11k_warn(ab, "failed to cfg wds backhaul in nss %d\n", ret);
|
|
+ goto unregister_vdev;
|
|
+ }
|
|
break;
|
|
case NL80211_IFTYPE_MESH_POINT:
|
|
ret = ath11k_nss_mesh_alloc_register(arvif, wdev->netdev);
|
|
@@ -2665,7 +2721,7 @@ int ath11k_nss_vdev_create(struct ath11k
|
|
}
|
|
|
|
ret = ath11k_nss_vdev_set_cmd(arvif,
|
|
- NSS_WIFI_VDEV_CFG_MCBC_EXC_TO_HOST_CMD, 1);
|
|
+ ATH11K_NSS_WIFI_VDEV_CFG_MCBC_EXC_TO_HOST_CMD, 1);
|
|
if (ret) {
|
|
ath11k_warn(ab, "failed to enable mcast/bcast exception %d\n", ret);
|
|
goto unregister_vdev;
|
|
--- a/drivers/net/wireless/ath/ath11k/nss.h
|
|
+++ b/drivers/net/wireless/ath/ath11k/nss.h
|
|
@@ -113,10 +113,14 @@ enum ath11k_nss_vdev_cmd {
|
|
ATH11K_NSS_WIFI_VDEV_ENCAP_TYPE_CMD,
|
|
ATH11K_NSS_WIFI_VDEV_DECAP_TYPE_CMD,
|
|
ATH11K_NSS_WIFI_VDEV_CFG_WDS_BACKHAUL_CMD,
|
|
+ ATH11K_NSS_WIFI_VDEV_CFG_MCBC_EXC_TO_HOST_CMD,
|
|
};
|
|
|
|
#define ATH11K_MPP_EXPIRY_TIMER_INTERVAL_MS 60 * HZ
|
|
|
|
+/* Enables the MCBC exception in NSS fw, 1 = enable */
|
|
+#define ATH11K_NSS_ENABLE_MCBC_EXC 1
|
|
+
|
|
enum ath11k_nss_opmode {
|
|
ATH11K_NSS_OPMODE_UNKNOWN,
|
|
ATH11K_NSS_OPMODE_AP,
|
|
--- a/drivers/net/wireless/ath/ath11k/dp_rx.c
|
|
+++ b/drivers/net/wireless/ath/ath11k/dp_rx.c
|
|
@@ -2711,7 +2711,8 @@ static void ath11k_dp_rx_h_mpdu(struct a
|
|
|
|
/* PN for multicast packets will be checked in mac80211 */
|
|
rxcb = ATH11K_SKB_RXCB(msdu);
|
|
- fill_crypto_hdr = ath11k_dp_rx_h_attn_is_mcbc(ar->ab, rx_desc);
|
|
+ if (!ar->ab->nss.enabled)
|
|
+ fill_crypto_hdr = ath11k_dp_rx_h_attn_is_mcbc(ar->ab, rx_desc);
|
|
rxcb->is_mcbc = fill_crypto_hdr;
|
|
|
|
if (rxcb->is_mcbc) {
|