mirror of
https://github.com/openwrt/openwrt.git
synced 2024-12-24 07:46:48 +00:00
mac80211: update encap offload patches to the latest version
Minor cleanup and code reorganization, along with a change to not disable offload anymore when a tkip or sw crypto key is added Signed-off-by: Felix Fietkau <nbd@nbd.name>
This commit is contained in:
parent
c18a872825
commit
d717343c85
@ -1,7 +1,7 @@
|
|||||||
From: Felix Fietkau <nbd@nbd.name>
|
From: Felix Fietkau <nbd@nbd.name>
|
||||||
Date: Mon, 17 Aug 2020 13:55:56 +0200
|
Date: Mon, 17 Aug 2020 13:55:56 +0200
|
||||||
Subject: [PATCH] mac80211: add missing queue/hash initialization to 802.3
|
Subject: [PATCH] mac80211: add missing queue/hash initialization to
|
||||||
xmit
|
802.3 xmit
|
||||||
|
|
||||||
Fixes AQL for encap-offloaded tx
|
Fixes AQL for encap-offloaded tx
|
||||||
|
|
@ -1,7 +1,7 @@
|
|||||||
From: Felix Fietkau <nbd@nbd.name>
|
From: Felix Fietkau <nbd@nbd.name>
|
||||||
Date: Mon, 17 Aug 2020 21:11:25 +0200
|
Date: Mon, 17 Aug 2020 21:11:25 +0200
|
||||||
Subject: [PATCH] mac80211: check and refresh aggregation session in encap
|
Subject: [PATCH] mac80211: check and refresh aggregation session in
|
||||||
offload tx
|
encap offload tx
|
||||||
|
|
||||||
Update the last_tx timestamp to avoid tearing down the aggregation session
|
Update the last_tx timestamp to avoid tearing down the aggregation session
|
||||||
early. Fall back to the slow path if the session setup is still running
|
early. Fall back to the slow path if the session setup is still running
|
@ -10,28 +10,6 @@ using an AP_VLAN.
|
|||||||
Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||||
---
|
---
|
||||||
|
|
||||||
--- a/net/mac80211/iface.c
|
|
||||||
+++ b/net/mac80211/iface.c
|
|
||||||
@@ -378,7 +378,8 @@ static bool ieee80211_set_sdata_offload_
|
|
||||||
if (key->conf.cipher == WLAN_CIPHER_SUITE_AES_CMAC ||
|
|
||||||
key->conf.cipher == WLAN_CIPHER_SUITE_BIP_GMAC_128 ||
|
|
||||||
key->conf.cipher == WLAN_CIPHER_SUITE_BIP_GMAC_256 ||
|
|
||||||
- key->conf.cipher == WLAN_CIPHER_SUITE_BIP_CMAC_256)
|
|
||||||
+ key->conf.cipher == WLAN_CIPHER_SUITE_BIP_CMAC_256 ||
|
|
||||||
+ !(key->conf.flags & IEEE80211_KEY_FLAG_PAIRWISE))
|
|
||||||
continue;
|
|
||||||
if (key->conf.cipher == WLAN_CIPHER_SUITE_TKIP ||
|
|
||||||
!(key->flags & KEY_FLAG_UPLOADED_TO_HARDWARE))
|
|
||||||
@@ -1448,7 +1449,8 @@ static void ieee80211_set_vif_encap_ops(
|
|
||||||
if (key->conf.cipher == WLAN_CIPHER_SUITE_AES_CMAC ||
|
|
||||||
key->conf.cipher == WLAN_CIPHER_SUITE_BIP_GMAC_128 ||
|
|
||||||
key->conf.cipher == WLAN_CIPHER_SUITE_BIP_GMAC_256 ||
|
|
||||||
- key->conf.cipher == WLAN_CIPHER_SUITE_BIP_CMAC_256)
|
|
||||||
+ key->conf.cipher == WLAN_CIPHER_SUITE_BIP_CMAC_256 ||
|
|
||||||
+ !(key->conf.flags & IEEE80211_KEY_FLAG_PAIRWISE))
|
|
||||||
continue;
|
|
||||||
if (!(key->flags & KEY_FLAG_UPLOADED_TO_HARDWARE))
|
|
||||||
enabled = false;
|
|
||||||
--- a/net/mac80211/tx.c
|
--- a/net/mac80211/tx.c
|
||||||
+++ b/net/mac80211/tx.c
|
+++ b/net/mac80211/tx.c
|
||||||
@@ -4184,88 +4184,47 @@ static void ieee80211_8023_xmit(struct i
|
@@ -4184,88 +4184,47 @@ static void ieee80211_8023_xmit(struct i
|
||||||
@ -144,8 +122,8 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
|||||||
+ struct ethhdr *ehdr = (struct ethhdr *)skb->data;
|
+ struct ethhdr *ehdr = (struct ethhdr *)skb->data;
|
||||||
struct sta_info *sta;
|
struct sta_info *sta;
|
||||||
|
|
||||||
if (unlikely(skb->len < ETH_HLEN)) {
|
if (WARN_ON(!sdata->hw_80211_encap)) {
|
||||||
@@ -4297,6 +4257,10 @@ netdev_tx_t ieee80211_subif_start_xmit_8
|
@@ -4302,6 +4262,10 @@ netdev_tx_t ieee80211_subif_start_xmit_8
|
||||||
|
|
||||||
if (ieee80211_lookup_ra_sta(sdata, skb, &sta))
|
if (ieee80211_lookup_ra_sta(sdata, skb, &sta))
|
||||||
kfree_skb(skb);
|
kfree_skb(skb);
|
@ -19,7 +19,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
|||||||
u8 tid;
|
u8 tid;
|
||||||
|
|
||||||
@@ -4233,6 +4234,10 @@ static void ieee80211_8023_xmit(struct i
|
@@ -4233,6 +4234,10 @@ static void ieee80211_8023_xmit(struct i
|
||||||
info->flags |= IEEE80211_TX_CTL_HW_80211_ENCAP;
|
info->control.flags |= IEEE80211_TX_CTRL_HW_80211_ENCAP;
|
||||||
info->control.vif = &sdata->vif;
|
info->control.vif = &sdata->vif;
|
||||||
|
|
||||||
+ key = rcu_dereference(sta->ptk[sta->ptk_idx]);
|
+ key = rcu_dereference(sta->ptk[sta->ptk_idx]);
|
@ -198,34 +198,6 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
|||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
--- a/net/mac80211/cfg.c
|
|
||||||
+++ b/net/mac80211/cfg.c
|
|
||||||
@@ -504,6 +504,7 @@ static int ieee80211_del_key(struct wiph
|
|
||||||
struct ieee80211_local *local = sdata->local;
|
|
||||||
struct sta_info *sta;
|
|
||||||
struct ieee80211_key *key = NULL;
|
|
||||||
+ bool recalc_offload = false;
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
mutex_lock(&local->sta_mtx);
|
|
||||||
@@ -528,6 +529,7 @@ static int ieee80211_del_key(struct wiph
|
|
||||||
goto out_unlock;
|
|
||||||
}
|
|
||||||
|
|
||||||
+ recalc_offload = key->conf.cipher == WLAN_CIPHER_SUITE_TKIP;
|
|
||||||
ieee80211_key_free(key, sdata->vif.type == NL80211_IFTYPE_STATION);
|
|
||||||
|
|
||||||
ret = 0;
|
|
||||||
@@ -535,6 +537,9 @@ static int ieee80211_del_key(struct wiph
|
|
||||||
mutex_unlock(&local->key_mtx);
|
|
||||||
mutex_unlock(&local->sta_mtx);
|
|
||||||
|
|
||||||
+ if (recalc_offload)
|
|
||||||
+ ieee80211_recalc_offload(local);
|
|
||||||
+
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
--- a/net/mac80211/debugfs.c
|
--- a/net/mac80211/debugfs.c
|
||||||
+++ b/net/mac80211/debugfs.c
|
+++ b/net/mac80211/debugfs.c
|
||||||
@@ -408,6 +408,7 @@ static const char *hw_flag_names[] = {
|
@@ -408,6 +408,7 @@ static const char *hw_flag_names[] = {
|
||||||
@ -287,16 +259,15 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
|||||||
|
|
||||||
bool __ieee80211_recalc_txpower(struct ieee80211_sub_if_data *sdata)
|
bool __ieee80211_recalc_txpower(struct ieee80211_sub_if_data *sdata)
|
||||||
{
|
{
|
||||||
@@ -348,6 +349,99 @@ static int ieee80211_check_queues(struct
|
@@ -348,6 +349,85 @@ static int ieee80211_check_queues(struct
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
+static bool ieee80211_iftype_supports_encap_offload(enum nl80211_iftype iftype)
|
+static bool ieee80211_iftype_supports_encap_offload(enum nl80211_iftype iftype)
|
||||||
+{
|
+{
|
||||||
+ switch (iftype) {
|
+ switch (iftype) {
|
||||||
|
+ /* P2P GO and client are mapped to AP/STATION types */
|
||||||
+ case NL80211_IFTYPE_AP:
|
+ case NL80211_IFTYPE_AP:
|
||||||
+ case NL80211_IFTYPE_P2P_GO:
|
|
||||||
+ case NL80211_IFTYPE_P2P_CLIENT:
|
|
||||||
+ case NL80211_IFTYPE_STATION:
|
+ case NL80211_IFTYPE_STATION:
|
||||||
+ return true;
|
+ return true;
|
||||||
+ default:
|
+ default:
|
||||||
@ -307,7 +278,6 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
|||||||
+static bool ieee80211_set_sdata_offload_flags(struct ieee80211_sub_if_data *sdata)
|
+static bool ieee80211_set_sdata_offload_flags(struct ieee80211_sub_if_data *sdata)
|
||||||
+{
|
+{
|
||||||
+ struct ieee80211_local *local = sdata->local;
|
+ struct ieee80211_local *local = sdata->local;
|
||||||
+ struct ieee80211_key *key;
|
|
||||||
+ u32 flags;
|
+ u32 flags;
|
||||||
+
|
+
|
||||||
+ flags = sdata->vif.offload_flags;
|
+ flags = sdata->vif.offload_flags;
|
||||||
@ -315,18 +285,6 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
|||||||
+ if (ieee80211_hw_check(&local->hw, SUPPORTS_TX_ENCAP_OFFLOAD) &&
|
+ if (ieee80211_hw_check(&local->hw, SUPPORTS_TX_ENCAP_OFFLOAD) &&
|
||||||
+ ieee80211_iftype_supports_encap_offload(sdata->vif.type)) {
|
+ ieee80211_iftype_supports_encap_offload(sdata->vif.type)) {
|
||||||
+ flags |= IEEE80211_OFFLOAD_ENCAP_ENABLED;
|
+ flags |= IEEE80211_OFFLOAD_ENCAP_ENABLED;
|
||||||
+ mutex_lock(&local->key_mtx);
|
|
||||||
+ list_for_each_entry(key, &sdata->key_list, list) {
|
|
||||||
+ if (key->conf.cipher == WLAN_CIPHER_SUITE_AES_CMAC ||
|
|
||||||
+ key->conf.cipher == WLAN_CIPHER_SUITE_BIP_GMAC_128 ||
|
|
||||||
+ key->conf.cipher == WLAN_CIPHER_SUITE_BIP_GMAC_256 ||
|
|
||||||
+ key->conf.cipher == WLAN_CIPHER_SUITE_BIP_CMAC_256)
|
|
||||||
+ continue;
|
|
||||||
+ if (key->conf.cipher == WLAN_CIPHER_SUITE_TKIP ||
|
|
||||||
+ !(key->flags & KEY_FLAG_UPLOADED_TO_HARDWARE))
|
|
||||||
+ flags &= ~IEEE80211_OFFLOAD_ENCAP_ENABLED;
|
|
||||||
+ }
|
|
||||||
+ mutex_unlock(&local->key_mtx);
|
|
||||||
+
|
+
|
||||||
+ if (!ieee80211_hw_check(&local->hw, SUPPORTS_TX_FRAG) &&
|
+ if (!ieee80211_hw_check(&local->hw, SUPPORTS_TX_FRAG) &&
|
||||||
+ local->hw.wiphy->frag_threshold != (u32)-1)
|
+ local->hw.wiphy->frag_threshold != (u32)-1)
|
||||||
@ -387,7 +345,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
|||||||
void ieee80211_adjust_monitor_flags(struct ieee80211_sub_if_data *sdata,
|
void ieee80211_adjust_monitor_flags(struct ieee80211_sub_if_data *sdata,
|
||||||
const int offset)
|
const int offset)
|
||||||
{
|
{
|
||||||
@@ -587,6 +681,7 @@ int ieee80211_do_open(struct wireless_de
|
@@ -587,6 +667,7 @@ int ieee80211_do_open(struct wireless_de
|
||||||
if (rtnl_dereference(sdata->bss->beacon)) {
|
if (rtnl_dereference(sdata->bss->beacon)) {
|
||||||
ieee80211_vif_vlan_copy_chanctx(sdata);
|
ieee80211_vif_vlan_copy_chanctx(sdata);
|
||||||
netif_carrier_on(dev);
|
netif_carrier_on(dev);
|
||||||
@ -395,7 +353,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
|||||||
} else {
|
} else {
|
||||||
netif_carrier_off(dev);
|
netif_carrier_off(dev);
|
||||||
}
|
}
|
||||||
@@ -616,6 +711,7 @@ int ieee80211_do_open(struct wireless_de
|
@@ -616,6 +697,7 @@ int ieee80211_do_open(struct wireless_de
|
||||||
|
|
||||||
ieee80211_adjust_monitor_flags(sdata, 1);
|
ieee80211_adjust_monitor_flags(sdata, 1);
|
||||||
ieee80211_configure_filter(local);
|
ieee80211_configure_filter(local);
|
||||||
@ -403,7 +361,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
|||||||
mutex_lock(&local->mtx);
|
mutex_lock(&local->mtx);
|
||||||
ieee80211_recalc_idle(local);
|
ieee80211_recalc_idle(local);
|
||||||
mutex_unlock(&local->mtx);
|
mutex_unlock(&local->mtx);
|
||||||
@@ -625,10 +721,13 @@ int ieee80211_do_open(struct wireless_de
|
@@ -625,10 +707,13 @@ int ieee80211_do_open(struct wireless_de
|
||||||
default:
|
default:
|
||||||
if (coming_up) {
|
if (coming_up) {
|
||||||
ieee80211_del_virtual_monitor(local);
|
ieee80211_del_virtual_monitor(local);
|
||||||
@ -417,7 +375,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
|||||||
res = ieee80211_check_queues(sdata,
|
res = ieee80211_check_queues(sdata,
|
||||||
ieee80211_vif_type_p2p(&sdata->vif));
|
ieee80211_vif_type_p2p(&sdata->vif));
|
||||||
if (res)
|
if (res)
|
||||||
@@ -1286,61 +1385,6 @@ static const struct net_device_ops ieee8
|
@@ -1286,61 +1371,6 @@ static const struct net_device_ops ieee8
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -479,7 +437,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
|||||||
static void ieee80211_if_free(struct net_device *dev)
|
static void ieee80211_if_free(struct net_device *dev)
|
||||||
{
|
{
|
||||||
free_percpu(netdev_tstats(dev));
|
free_percpu(netdev_tstats(dev));
|
||||||
@@ -1371,6 +1415,51 @@ static void ieee80211_if_setup_no_queue(
|
@@ -1371,6 +1401,32 @@ static void ieee80211_if_setup_no_queue(
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -487,7 +445,6 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
|||||||
+{
|
+{
|
||||||
+ struct ieee80211_local *local = sdata->local;
|
+ struct ieee80211_local *local = sdata->local;
|
||||||
+ struct ieee80211_sub_if_data *bss = sdata;
|
+ struct ieee80211_sub_if_data *bss = sdata;
|
||||||
+ struct ieee80211_key *key;
|
|
||||||
+ bool enabled;
|
+ bool enabled;
|
||||||
+
|
+
|
||||||
+ if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN) {
|
+ if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN) {
|
||||||
@ -506,24 +463,6 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
|||||||
+ !(bss->vif.offload_flags & IEEE80211_OFFLOAD_ENCAP_4ADDR))
|
+ !(bss->vif.offload_flags & IEEE80211_OFFLOAD_ENCAP_4ADDR))
|
||||||
+ enabled = false;
|
+ enabled = false;
|
||||||
+
|
+
|
||||||
+ /*
|
|
||||||
+ * Encapsulation offload cannot be used with software crypto, and a per-VLAN
|
|
||||||
+ * key may have been set
|
|
||||||
+ */
|
|
||||||
+ if (enabled && sdata->vif.type == NL80211_IFTYPE_AP_VLAN) {
|
|
||||||
+ mutex_lock(&local->key_mtx);
|
|
||||||
+ list_for_each_entry(key, &sdata->key_list, list) {
|
|
||||||
+ if (key->conf.cipher == WLAN_CIPHER_SUITE_AES_CMAC ||
|
|
||||||
+ key->conf.cipher == WLAN_CIPHER_SUITE_BIP_GMAC_128 ||
|
|
||||||
+ key->conf.cipher == WLAN_CIPHER_SUITE_BIP_GMAC_256 ||
|
|
||||||
+ key->conf.cipher == WLAN_CIPHER_SUITE_BIP_CMAC_256)
|
|
||||||
+ continue;
|
|
||||||
+ if (!(key->flags & KEY_FLAG_UPLOADED_TO_HARDWARE))
|
|
||||||
+ enabled = false;
|
|
||||||
+ }
|
|
||||||
+ mutex_unlock(&local->key_mtx);
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ sdata->dev->netdev_ops = enabled ? &ieee80211_dataif_8023_ops :
|
+ sdata->dev->netdev_ops = enabled ? &ieee80211_dataif_8023_ops :
|
||||||
+ &ieee80211_dataif_ops;
|
+ &ieee80211_dataif_ops;
|
||||||
+}
|
+}
|
||||||
@ -531,7 +470,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
|||||||
static void ieee80211_iface_work(struct work_struct *work)
|
static void ieee80211_iface_work(struct work_struct *work)
|
||||||
{
|
{
|
||||||
struct ieee80211_sub_if_data *sdata =
|
struct ieee80211_sub_if_data *sdata =
|
||||||
@@ -1553,7 +1642,6 @@ static void ieee80211_setup_sdata(struct
|
@@ -1553,7 +1609,6 @@ static void ieee80211_setup_sdata(struct
|
||||||
sdata->vif.bss_conf.txpower = INT_MIN; /* unset */
|
sdata->vif.bss_conf.txpower = INT_MIN; /* unset */
|
||||||
|
|
||||||
sdata->noack_map = 0;
|
sdata->noack_map = 0;
|
||||||
@ -539,7 +478,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
|||||||
|
|
||||||
/* only monitor/p2p-device differ */
|
/* only monitor/p2p-device differ */
|
||||||
if (sdata->dev) {
|
if (sdata->dev) {
|
||||||
@@ -1688,6 +1776,7 @@ static int ieee80211_runtime_change_ifty
|
@@ -1688,6 +1743,7 @@ static int ieee80211_runtime_change_ifty
|
||||||
|
|
||||||
ieee80211_teardown_sdata(sdata);
|
ieee80211_teardown_sdata(sdata);
|
||||||
|
|
||||||
@ -547,7 +486,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
|||||||
ret = drv_change_interface(local, sdata, internal_type, p2p);
|
ret = drv_change_interface(local, sdata, internal_type, p2p);
|
||||||
if (ret)
|
if (ret)
|
||||||
type = ieee80211_vif_type_p2p(&sdata->vif);
|
type = ieee80211_vif_type_p2p(&sdata->vif);
|
||||||
@@ -1700,6 +1789,7 @@ static int ieee80211_runtime_change_ifty
|
@@ -1700,6 +1756,7 @@ static int ieee80211_runtime_change_ifty
|
||||||
ieee80211_check_queues(sdata, type);
|
ieee80211_check_queues(sdata, type);
|
||||||
|
|
||||||
ieee80211_setup_sdata(sdata, type);
|
ieee80211_setup_sdata(sdata, type);
|
||||||
@ -586,40 +525,6 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
|||||||
case WLAN_CIPHER_SUITE_AES_CMAC:
|
case WLAN_CIPHER_SUITE_AES_CMAC:
|
||||||
case WLAN_CIPHER_SUITE_BIP_CMAC_256:
|
case WLAN_CIPHER_SUITE_BIP_CMAC_256:
|
||||||
case WLAN_CIPHER_SUITE_BIP_GMAC_128:
|
case WLAN_CIPHER_SUITE_BIP_GMAC_128:
|
||||||
@@ -824,6 +809,7 @@ int ieee80211_key_link(struct ieee80211_
|
|
||||||
*/
|
|
||||||
bool delay_tailroom = sdata->vif.type == NL80211_IFTYPE_STATION;
|
|
||||||
int ret = -EOPNOTSUPP;
|
|
||||||
+ bool recalc_offload = false;
|
|
||||||
|
|
||||||
mutex_lock(&sdata->local->key_mtx);
|
|
||||||
|
|
||||||
@@ -864,11 +850,15 @@ int ieee80211_key_link(struct ieee80211_
|
|
||||||
key->local = sdata->local;
|
|
||||||
key->sdata = sdata;
|
|
||||||
key->sta = sta;
|
|
||||||
+ recalc_offload = !old_key && key->conf.cipher == WLAN_CIPHER_SUITE_TKIP;
|
|
||||||
|
|
||||||
increment_tailroom_need_count(sdata);
|
|
||||||
|
|
||||||
ret = ieee80211_key_replace(sdata, sta, pairwise, old_key, key);
|
|
||||||
|
|
||||||
+ if (!(key->flags & KEY_FLAG_UPLOADED_TO_HARDWARE))
|
|
||||||
+ recalc_offload = true;
|
|
||||||
+
|
|
||||||
if (!ret) {
|
|
||||||
ieee80211_debugfs_key_add(key);
|
|
||||||
ieee80211_key_destroy(old_key, delay_tailroom);
|
|
||||||
@@ -879,6 +869,9 @@ int ieee80211_key_link(struct ieee80211_
|
|
||||||
out:
|
|
||||||
mutex_unlock(&sdata->local->key_mtx);
|
|
||||||
|
|
||||||
+ if (recalc_offload)
|
|
||||||
+ ieee80211_recalc_offload(sdata->local);
|
|
||||||
+
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
--- a/net/mac80211/trace.h
|
--- a/net/mac80211/trace.h
|
||||||
+++ b/net/mac80211/trace.h
|
+++ b/net/mac80211/trace.h
|
||||||
@@ -2733,6 +2733,12 @@ TRACE_EVENT(drv_get_ftm_responder_stats,
|
@@ -2733,6 +2733,12 @@ TRACE_EVENT(drv_get_ftm_responder_stats,
|
||||||
@ -637,15 +542,72 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
|||||||
#undef TRACE_INCLUDE_PATH
|
#undef TRACE_INCLUDE_PATH
|
||||||
--- a/net/mac80211/tx.c
|
--- a/net/mac80211/tx.c
|
||||||
+++ b/net/mac80211/tx.c
|
+++ b/net/mac80211/tx.c
|
||||||
@@ -4264,11 +4264,6 @@ netdev_tx_t ieee80211_subif_start_xmit_8
|
@@ -4181,11 +4181,10 @@ static bool ieee80211_tx_8023(struct iee
|
||||||
struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
|
|
||||||
struct sta_info *sta;
|
|
||||||
|
|
||||||
|
static void ieee80211_8023_xmit(struct ieee80211_sub_if_data *sdata,
|
||||||
|
struct net_device *dev, struct sta_info *sta,
|
||||||
|
- struct sk_buff *skb)
|
||||||
|
+ struct ieee80211_key *key, struct sk_buff *skb)
|
||||||
|
{
|
||||||
|
struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
|
||||||
|
struct ieee80211_local *local = sdata->local;
|
||||||
|
- struct ieee80211_key *key;
|
||||||
|
struct tid_ampdu_tx *tid_tx;
|
||||||
|
u8 tid;
|
||||||
|
|
||||||
|
@@ -4234,7 +4233,6 @@ static void ieee80211_8023_xmit(struct i
|
||||||
|
info->control.flags |= IEEE80211_TX_CTRL_HW_80211_ENCAP;
|
||||||
|
info->control.vif = &sdata->vif;
|
||||||
|
|
||||||
|
- key = rcu_dereference(sta->ptk[sta->ptk_idx]);
|
||||||
|
if (key)
|
||||||
|
info->control.hw_key = &key->conf;
|
||||||
|
|
||||||
|
@@ -4251,12 +4249,9 @@ netdev_tx_t ieee80211_subif_start_xmit_8
|
||||||
|
{
|
||||||
|
struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
|
||||||
|
struct ethhdr *ehdr = (struct ethhdr *)skb->data;
|
||||||
|
+ struct ieee80211_key *key;
|
||||||
|
struct sta_info *sta;
|
||||||
|
-
|
||||||
- if (WARN_ON(!sdata->hw_80211_encap)) {
|
- if (WARN_ON(!sdata->hw_80211_encap)) {
|
||||||
- kfree_skb(skb);
|
- kfree_skb(skb);
|
||||||
- return NETDEV_TX_OK;
|
- return NETDEV_TX_OK;
|
||||||
- }
|
- }
|
||||||
-
|
+ bool offload = true;
|
||||||
|
|
||||||
if (unlikely(skb->len < ETH_HLEN)) {
|
if (unlikely(skb->len < ETH_HLEN)) {
|
||||||
kfree_skb(skb);
|
kfree_skb(skb);
|
||||||
return NETDEV_TX_OK;
|
@@ -4265,15 +4260,26 @@ netdev_tx_t ieee80211_subif_start_xmit_8
|
||||||
|
|
||||||
|
rcu_read_lock();
|
||||||
|
|
||||||
|
- if (ieee80211_lookup_ra_sta(sdata, skb, &sta))
|
||||||
|
+ if (ieee80211_lookup_ra_sta(sdata, skb, &sta)) {
|
||||||
|
kfree_skb(skb);
|
||||||
|
- else if (unlikely(IS_ERR_OR_NULL(sta) || !sta->uploaded ||
|
||||||
|
- !test_sta_flag(sta, WLAN_STA_AUTHORIZED) ||
|
||||||
|
- sdata->control_port_protocol == ehdr->h_proto))
|
||||||
|
- ieee80211_subif_start_xmit(skb, dev);
|
||||||
|
+ goto out;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if (unlikely(IS_ERR_OR_NULL(sta) || !sta->uploaded ||
|
||||||
|
+ !test_sta_flag(sta, WLAN_STA_AUTHORIZED) ||
|
||||||
|
+ sdata->control_port_protocol == ehdr->h_proto))
|
||||||
|
+ offload = false;
|
||||||
|
+ else if ((key = rcu_dereference(sta->ptk[sta->ptk_idx])) &&
|
||||||
|
+ (!(key->flags & KEY_FLAG_UPLOADED_TO_HARDWARE) ||
|
||||||
|
+ key->conf.cipher == WLAN_CIPHER_SUITE_TKIP))
|
||||||
|
+ offload = false;
|
||||||
|
+
|
||||||
|
+ if (offload)
|
||||||
|
+ ieee80211_8023_xmit(sdata, dev, sta, key, skb);
|
||||||
|
else
|
||||||
|
- ieee80211_8023_xmit(sdata, dev, sta, skb);
|
||||||
|
+ ieee80211_subif_start_xmit(skb, dev);
|
||||||
|
|
||||||
|
+out:
|
||||||
|
rcu_read_unlock();
|
||||||
|
|
||||||
|
return NETDEV_TX_OK;
|
@ -198,7 +198,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
|||||||
goto encap_out;
|
goto encap_out;
|
||||||
|
|
||||||
if (info->control.flags & IEEE80211_TX_CTRL_FAST_XMIT) {
|
if (info->control.flags & IEEE80211_TX_CTRL_FAST_XMIT) {
|
||||||
@@ -4247,7 +4247,7 @@ static void ieee80211_8023_xmit(struct i
|
@@ -4230,7 +4230,7 @@ static void ieee80211_8023_xmit(struct i
|
||||||
sdata = container_of(sdata->bss,
|
sdata = container_of(sdata->bss,
|
||||||
struct ieee80211_sub_if_data, u.ap);
|
struct ieee80211_sub_if_data, u.ap);
|
||||||
|
|
||||||
@ -206,8 +206,8 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
|||||||
+ info->flags |= IEEE80211_TX_CTL_HW_80211_ENCAP;
|
+ info->flags |= IEEE80211_TX_CTL_HW_80211_ENCAP;
|
||||||
info->control.vif = &sdata->vif;
|
info->control.vif = &sdata->vif;
|
||||||
|
|
||||||
ieee80211_tx_8023(sdata, skb, skb->len, sta, false);
|
if (key)
|
||||||
@@ -4351,7 +4351,7 @@ static bool ieee80211_tx_pending_skb(str
|
@@ -4355,7 +4355,7 @@ static bool ieee80211_tx_pending_skb(str
|
||||||
|
|
||||||
sdata = vif_to_sdata(info->control.vif);
|
sdata = vif_to_sdata(info->control.vif);
|
||||||
|
|
||||||
@ -216,7 +216,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
|||||||
chanctx_conf = rcu_dereference(sdata->vif.chanctx_conf);
|
chanctx_conf = rcu_dereference(sdata->vif.chanctx_conf);
|
||||||
if (unlikely(!chanctx_conf)) {
|
if (unlikely(!chanctx_conf)) {
|
||||||
dev_kfree_skb(skb);
|
dev_kfree_skb(skb);
|
||||||
@@ -4359,7 +4359,7 @@ static bool ieee80211_tx_pending_skb(str
|
@@ -4363,7 +4363,7 @@ static bool ieee80211_tx_pending_skb(str
|
||||||
}
|
}
|
||||||
info->band = chanctx_conf->def.chan->band;
|
info->band = chanctx_conf->def.chan->band;
|
||||||
result = ieee80211_tx(sdata, NULL, skb, true, 0);
|
result = ieee80211_tx(sdata, NULL, skb, true, 0);
|
@ -1,7 +1,7 @@
|
|||||||
From: Felix Fietkau <nbd@nbd.name>
|
From: Felix Fietkau <nbd@nbd.name>
|
||||||
Date: Fri, 21 Aug 2020 05:49:07 +0200
|
Date: Fri, 21 Aug 2020 05:49:07 +0200
|
||||||
Subject: [PATCH] mac80211: extend ieee80211_tx_status_ext to support bulk
|
Subject: [PATCH] mac80211: extend ieee80211_tx_status_ext to support
|
||||||
free
|
bulk free
|
||||||
|
|
||||||
Store processed skbs ready to be freed in a list so the driver bulk free them
|
Store processed skbs ready to be freed in a list so the driver bulk free them
|
||||||
|
|
@ -30,7 +30,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
|||||||
/**
|
/**
|
||||||
--- a/net/mac80211/cfg.c
|
--- a/net/mac80211/cfg.c
|
||||||
+++ b/net/mac80211/cfg.c
|
+++ b/net/mac80211/cfg.c
|
||||||
@@ -1698,6 +1698,7 @@ static int ieee80211_change_station(stru
|
@@ -1693,6 +1693,7 @@ static int ieee80211_change_station(stru
|
||||||
|
|
||||||
rcu_assign_pointer(vlansdata->u.vlan.sta, sta);
|
rcu_assign_pointer(vlansdata->u.vlan.sta, sta);
|
||||||
__ieee80211_check_fast_rx_iface(vlansdata);
|
__ieee80211_check_fast_rx_iface(vlansdata);
|
File diff suppressed because it is too large
Load Diff
@ -18,7 +18,7 @@
|
|||||||
const u8 *addr);
|
const u8 *addr);
|
||||||
--- a/include/net/mac80211.h
|
--- a/include/net/mac80211.h
|
||||||
+++ b/include/net/mac80211.h
|
+++ b/include/net/mac80211.h
|
||||||
@@ -1519,6 +1519,7 @@ enum ieee80211_smps_mode {
|
@@ -1521,6 +1521,7 @@ enum ieee80211_smps_mode {
|
||||||
*
|
*
|
||||||
* @power_level: requested transmit power (in dBm), backward compatibility
|
* @power_level: requested transmit power (in dBm), backward compatibility
|
||||||
* value only that is set to the minimum of all interfaces
|
* value only that is set to the minimum of all interfaces
|
||||||
@ -26,7 +26,7 @@
|
|||||||
*
|
*
|
||||||
* @chandef: the channel definition to tune to
|
* @chandef: the channel definition to tune to
|
||||||
* @radar_enabled: whether radar detection is enabled
|
* @radar_enabled: whether radar detection is enabled
|
||||||
@@ -1539,6 +1540,7 @@ enum ieee80211_smps_mode {
|
@@ -1541,6 +1542,7 @@ enum ieee80211_smps_mode {
|
||||||
struct ieee80211_conf {
|
struct ieee80211_conf {
|
||||||
u32 flags;
|
u32 flags;
|
||||||
int power_level, dynamic_ps_timeout;
|
int power_level, dynamic_ps_timeout;
|
||||||
@ -57,7 +57,7 @@
|
|||||||
__NL80211_ATTR_AFTER_LAST,
|
__NL80211_ATTR_AFTER_LAST,
|
||||||
--- a/net/mac80211/cfg.c
|
--- a/net/mac80211/cfg.c
|
||||||
+++ b/net/mac80211/cfg.c
|
+++ b/net/mac80211/cfg.c
|
||||||
@@ -2615,6 +2615,19 @@ static int ieee80211_get_tx_power(struct
|
@@ -2611,6 +2611,19 @@ static int ieee80211_get_tx_power(struct
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -77,7 +77,7 @@
|
|||||||
static int ieee80211_set_wds_peer(struct wiphy *wiphy, struct net_device *dev,
|
static int ieee80211_set_wds_peer(struct wiphy *wiphy, struct net_device *dev,
|
||||||
const u8 *addr)
|
const u8 *addr)
|
||||||
{
|
{
|
||||||
@@ -4045,6 +4058,7 @@ const struct cfg80211_ops mac80211_confi
|
@@ -4041,6 +4054,7 @@ const struct cfg80211_ops mac80211_confi
|
||||||
.set_wiphy_params = ieee80211_set_wiphy_params,
|
.set_wiphy_params = ieee80211_set_wiphy_params,
|
||||||
.set_tx_power = ieee80211_set_tx_power,
|
.set_tx_power = ieee80211_set_tx_power,
|
||||||
.get_tx_power = ieee80211_get_tx_power,
|
.get_tx_power = ieee80211_get_tx_power,
|
||||||
|
Loading…
Reference in New Issue
Block a user