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:
Felix Fietkau 2020-09-08 14:22:28 +02:00
parent c18a872825
commit d717343c85
17 changed files with 1200 additions and 150 deletions

View File

@ -1,7 +1,7 @@
From: Felix Fietkau <nbd@nbd.name>
Date: Mon, 17 Aug 2020 13:55:56 +0200
Subject: [PATCH] mac80211: add missing queue/hash initialization to 802.3
xmit
Subject: [PATCH] mac80211: add missing queue/hash initialization to
802.3 xmit
Fixes AQL for encap-offloaded tx

View File

@ -1,7 +1,7 @@
From: Felix Fietkau <nbd@nbd.name>
Date: Mon, 17 Aug 2020 21:11:25 +0200
Subject: [PATCH] mac80211: check and refresh aggregation session in encap
offload tx
Subject: [PATCH] mac80211: check and refresh aggregation session in
encap offload tx
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

View File

@ -10,28 +10,6 @@ using an AP_VLAN.
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
+++ b/net/mac80211/tx.c
@@ -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 sta_info *sta;
if (unlikely(skb->len < ETH_HLEN)) {
@@ -4297,6 +4257,10 @@ netdev_tx_t ieee80211_subif_start_xmit_8
if (WARN_ON(!sdata->hw_80211_encap)) {
@@ -4302,6 +4262,10 @@ netdev_tx_t ieee80211_subif_start_xmit_8
if (ieee80211_lookup_ra_sta(sdata, skb, &sta))
kfree_skb(skb);

View File

@ -19,7 +19,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
u8 tid;
@@ -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;
+ key = rcu_dereference(sta->ptk[sta->ptk_idx]);

View File

@ -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
+++ b/net/mac80211/debugfs.c
@@ -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)
{
@@ -348,6 +349,99 @@ static int ieee80211_check_queues(struct
@@ -348,6 +349,85 @@ static int ieee80211_check_queues(struct
return 0;
}
+static bool ieee80211_iftype_supports_encap_offload(enum nl80211_iftype iftype)
+{
+ switch (iftype) {
+ /* P2P GO and client are mapped to AP/STATION types */
+ case NL80211_IFTYPE_AP:
+ case NL80211_IFTYPE_P2P_GO:
+ case NL80211_IFTYPE_P2P_CLIENT:
+ case NL80211_IFTYPE_STATION:
+ return true;
+ 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)
+{
+ struct ieee80211_local *local = sdata->local;
+ struct ieee80211_key *key;
+ u32 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) &&
+ ieee80211_iftype_supports_encap_offload(sdata->vif.type)) {
+ 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) &&
+ 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,
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)) {
ieee80211_vif_vlan_copy_chanctx(sdata);
netif_carrier_on(dev);
@ -395,7 +353,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
} else {
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_configure_filter(local);
@ -403,7 +361,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
mutex_lock(&local->mtx);
ieee80211_recalc_idle(local);
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:
if (coming_up) {
ieee80211_del_virtual_monitor(local);
@ -417,7 +375,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
res = ieee80211_check_queues(sdata,
ieee80211_vif_type_p2p(&sdata->vif));
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)
{
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
}
@ -487,7 +445,6 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
+{
+ struct ieee80211_local *local = sdata->local;
+ struct ieee80211_sub_if_data *bss = sdata;
+ struct ieee80211_key *key;
+ bool enabled;
+
+ 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))
+ 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 :
+ &ieee80211_dataif_ops;
+}
@ -531,7 +470,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
static void ieee80211_iface_work(struct work_struct *work)
{
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->noack_map = 0;
@ -539,7 +478,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
/* only monitor/p2p-device differ */
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);
@ -547,7 +486,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
ret = drv_change_interface(local, sdata, internal_type, p2p);
if (ret)
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_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_BIP_CMAC_256:
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
+++ b/net/mac80211/trace.h
@@ -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
--- a/net/mac80211/tx.c
+++ b/net/mac80211/tx.c
@@ -4264,11 +4264,6 @@ netdev_tx_t ieee80211_subif_start_xmit_8
struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
struct sta_info *sta;
@@ -4181,11 +4181,10 @@ static bool ieee80211_tx_8023(struct iee
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)) {
- kfree_skb(skb);
- return NETDEV_TX_OK;
- }
-
+ bool offload = true;
if (unlikely(skb->len < ETH_HLEN)) {
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;

View File

@ -198,7 +198,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
goto encap_out;
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,
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->control.vif = &sdata->vif;
ieee80211_tx_8023(sdata, skb, skb->len, sta, false);
@@ -4351,7 +4351,7 @@ static bool ieee80211_tx_pending_skb(str
if (key)
@@ -4355,7 +4355,7 @@ static bool ieee80211_tx_pending_skb(str
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);
if (unlikely(!chanctx_conf)) {
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;
result = ieee80211_tx(sdata, NULL, skb, true, 0);

View File

@ -1,7 +1,7 @@
From: Felix Fietkau <nbd@nbd.name>
Date: Fri, 21 Aug 2020 05:49:07 +0200
Subject: [PATCH] mac80211: extend ieee80211_tx_status_ext to support bulk
free
Subject: [PATCH] mac80211: extend ieee80211_tx_status_ext to support
bulk free
Store processed skbs ready to be freed in a list so the driver bulk free them

View File

@ -30,7 +30,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
/**
--- a/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);
__ieee80211_check_fast_rx_iface(vlansdata);

View File

@ -18,7 +18,7 @@
const u8 *addr);
--- a/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
* value only that is set to the minimum of all interfaces
@ -26,7 +26,7 @@
*
* @chandef: the channel definition to tune to
* @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 {
u32 flags;
int power_level, dynamic_ps_timeout;
@ -57,7 +57,7 @@
__NL80211_ATTR_AFTER_LAST,
--- a/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;
}
@ -77,7 +77,7 @@
static int ieee80211_set_wds_peer(struct wiphy *wiphy, struct net_device *dev,
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_tx_power = ieee80211_set_tx_power,
.get_tx_power = ieee80211_get_tx_power,