mac80211: rework tx encapsulation offload API
The current API (which lets the driver turn on/off per vif directly) has a
number of limitations:
- it does not deal with AP_VLAN
- conditions for enabling (no tkip, no monitor) are only checked at
add_interface time
- no way to indicate 4-addr support
In order to address this, store offload flags in struct ieee80211_vif
(easy to extend for decap offload later). mac80211 initially sets the enable
flag, but gives the driver a chance to modify it before its settings are
applied. In addition to the .add_interface op, a .update_vif_offload op is
introduced, which can be used for runtime changes.
If a driver can't disable encap offload at runtime, or if it has some extra
limitations, it can simply override the flags within those ops.
Support for encap offload with 4-address mode interfaces can be enabled
by setting a flag from .add_interface or .update_vif_offload.
Signed-off-by: Felix Fietkau <nbd@nbd.name>
Link: https://lore.kernel.org/r/20200908123702.88454-6-nbd@nbd.name
[resolved conflict with commit aa2092a9ba
("ath11k: add raw mode and
software crypto support")]
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
This commit is contained in:

committed by
Johannes Berg

parent
ae04515276
commit
6aea26ce5a
@@ -1606,6 +1606,21 @@ enum ieee80211_vif_flags {
|
||||
IEEE80211_VIF_GET_NOA_UPDATE = BIT(3),
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* enum ieee80211_offload_flags - virtual interface offload flags
|
||||
*
|
||||
* @IEEE80211_OFFLOAD_ENCAP_ENABLED: tx encapsulation offload is enabled
|
||||
* The driver supports sending frames passed as 802.3 frames by mac80211.
|
||||
* It must also support sending 802.11 packets for the same interface.
|
||||
* @IEEE80211_OFFLOAD_ENCAP_4ADDR: support 4-address mode encapsulation offload
|
||||
*/
|
||||
|
||||
enum ieee80211_offload_flags {
|
||||
IEEE80211_OFFLOAD_ENCAP_ENABLED = BIT(0),
|
||||
IEEE80211_OFFLOAD_ENCAP_4ADDR = BIT(1),
|
||||
};
|
||||
|
||||
/**
|
||||
* struct ieee80211_vif - per-interface data
|
||||
*
|
||||
@@ -1626,6 +1641,11 @@ enum ieee80211_vif_flags {
|
||||
* these need to be set (or cleared) when the interface is added
|
||||
* or, if supported by the driver, the interface type is changed
|
||||
* at runtime, mac80211 will never touch this field
|
||||
* @offloaad_flags: hardware offload capabilities/flags for this interface.
|
||||
* These are initialized by mac80211 before calling .add_interface,
|
||||
* .change_interface or .update_vif_offload and updated by the driver
|
||||
* within these ops, based on supported features or runtime change
|
||||
* restrictions.
|
||||
* @hw_queue: hardware queue for each AC
|
||||
* @cab_queue: content-after-beacon (DTIM beacon really) queue, AP mode only
|
||||
* @chanctx_conf: The channel context this interface is assigned to, or %NULL
|
||||
@@ -1662,6 +1682,7 @@ struct ieee80211_vif {
|
||||
struct ieee80211_chanctx_conf __rcu *chanctx_conf;
|
||||
|
||||
u32 driver_flags;
|
||||
u32 offload_flags;
|
||||
|
||||
#ifdef CONFIG_MAC80211_DEBUGFS
|
||||
struct dentry *debugfs_dir;
|
||||
@@ -2328,6 +2349,9 @@ struct ieee80211_txq {
|
||||
* aggregating MPDUs with the same keyid, allowing mac80211 to keep Tx
|
||||
* A-MPDU sessions active while rekeying with Extended Key ID.
|
||||
*
|
||||
* @IEEE80211_HW_SUPPORTS_TX_ENCAP_OFFLOAD: Hardware supports tx encapsulation
|
||||
* offload
|
||||
*
|
||||
* @NUM_IEEE80211_HW_FLAGS: number of hardware flags, used for sizing arrays
|
||||
*/
|
||||
enum ieee80211_hw_flags {
|
||||
@@ -2380,6 +2404,7 @@ enum ieee80211_hw_flags {
|
||||
IEEE80211_HW_SUPPORTS_MULTI_BSSID,
|
||||
IEEE80211_HW_SUPPORTS_ONLY_HE_MULTI_BSSID,
|
||||
IEEE80211_HW_AMPDU_KEYBORDER_SUPPORT,
|
||||
IEEE80211_HW_SUPPORTS_TX_ENCAP_OFFLOAD,
|
||||
|
||||
/* keep last, obviously */
|
||||
NUM_IEEE80211_HW_FLAGS
|
||||
@@ -3814,6 +3839,8 @@ enum ieee80211_reconfig_type {
|
||||
* @set_tid_config: Apply TID specific configurations. This callback may sleep.
|
||||
* @reset_tid_config: Reset TID specific configuration for the peer.
|
||||
* This callback may sleep.
|
||||
* @update_vif_config: Update virtual interface offload flags
|
||||
* This callback may sleep.
|
||||
*/
|
||||
struct ieee80211_ops {
|
||||
void (*tx)(struct ieee80211_hw *hw,
|
||||
@@ -4125,6 +4152,8 @@ struct ieee80211_ops {
|
||||
int (*reset_tid_config)(struct ieee80211_hw *hw,
|
||||
struct ieee80211_vif *vif,
|
||||
struct ieee80211_sta *sta, u8 tids);
|
||||
void (*update_vif_offload)(struct ieee80211_hw *hw,
|
||||
struct ieee80211_vif *vif);
|
||||
};
|
||||
|
||||
/**
|
||||
|
Reference in New Issue
Block a user