mac80211: Simplify Extended Key ID API
authorAlexander Wetzel <alexander@wetzel-home.de>
Sat, 29 Jun 2019 19:50:13 +0000 (21:50 +0200)
committerJohannes Berg <johannes.berg@intel.com>
Fri, 26 Jul 2019 11:28:59 +0000 (13:28 +0200)
1) Drop IEEE80211_HW_EXT_KEY_ID_NATIVE and let drivers directly set
   the NL80211_EXT_FEATURE_EXT_KEY_ID flag.

2) Drop IEEE80211_HW_NO_AMPDU_KEYBORDER_SUPPORT and simply assume all
   drivers are unable to handle A-MPDU key borders.

The new Extended Key ID API now requires all mac80211 drivers to set
NL80211_EXT_FEATURE_EXT_KEY_ID when they implement set_key() and can
handle Extended Key ID. For drivers not providing set_key() mac80211
itself enables Extended Key ID support, using the internal SW crypto
services.

Signed-off-by: Alexander Wetzel <alexander@wetzel-home.de>
Link: https://lore.kernel.org/r/20190629195015.19680-2-alexander@wetzel-home.de
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
include/net/mac80211.h
net/mac80211/debugfs.c
net/mac80211/key.c
net/mac80211/main.c

index fbe1c29e334910d298f3ecc717789264123d07d7..58941893a13f118cc74b87310d039c4dd1db0aa2 100644 (file)
@@ -2268,12 +2268,6 @@ struct ieee80211_txq {
  * @IEEE80211_HW_SUPPORTS_ONLY_HE_MULTI_BSSID: Hardware supports multi BSSID
  *     only for HE APs. Applies if @IEEE80211_HW_SUPPORTS_MULTI_BSSID is set.
  *
- * @IEEE80211_HW_EXT_KEY_ID_NATIVE: Driver and hardware are supporting Extended
- *     Key ID and can handle two unicast keys per station for Rx and Tx.
- *
- * @IEEE80211_HW_NO_AMPDU_KEYBORDER_SUPPORT: The card/driver can't handle
- *     active Tx A-MPDU sessions with Extended Key IDs during rekey.
- *
  * @NUM_IEEE80211_HW_FLAGS: number of hardware flags, used for sizing arrays
  */
 enum ieee80211_hw_flags {
@@ -2325,8 +2319,6 @@ enum ieee80211_hw_flags {
        IEEE80211_HW_TX_STATUS_NO_AMPDU_LEN,
        IEEE80211_HW_SUPPORTS_MULTI_BSSID,
        IEEE80211_HW_SUPPORTS_ONLY_HE_MULTI_BSSID,
-       IEEE80211_HW_EXT_KEY_ID_NATIVE,
-       IEEE80211_HW_NO_AMPDU_KEYBORDER_SUPPORT,
 
        /* keep last, obviously */
        NUM_IEEE80211_HW_FLAGS
index 2e7f75938c514c047d14fd9e039d88ee1dd449bf..47435f57e086b82d73974bad68cc1ed52fea6af6 100644 (file)
@@ -271,8 +271,6 @@ static const char *hw_flag_names[] = {
        FLAG(TX_STATUS_NO_AMPDU_LEN),
        FLAG(SUPPORTS_MULTI_BSSID),
        FLAG(SUPPORTS_ONLY_HE_MULTI_BSSID),
-       FLAG(EXT_KEY_ID_NATIVE),
-       FLAG(NO_AMPDU_KEYBORDER_SUPPORT),
 #undef FLAG
 };
 
index dd60f64280493ff4ca9787bdfa111260bbb1a682..92c3affb0eb0b853c8ba77e314125b986abad95c 100644 (file)
@@ -270,8 +270,7 @@ int ieee80211_set_tx_key(struct ieee80211_key *key)
 
        sta->ptk_idx = key->conf.keyidx;
 
-       if (ieee80211_hw_check(&local->hw, NO_AMPDU_KEYBORDER_SUPPORT))
-               clear_sta_flag(sta, WLAN_STA_BLOCK_BA);
+       clear_sta_flag(sta, WLAN_STA_BLOCK_BA);
        ieee80211_check_fast_xmit(sta);
 
        return 0;
@@ -289,16 +288,15 @@ static void ieee80211_pairwise_rekey(struct ieee80211_key *old,
        if (new->conf.flags & IEEE80211_KEY_FLAG_NO_AUTO_TX) {
                /* Extended Key ID key install, initial one or rekey */
 
-               if (sta->ptk_idx != INVALID_PTK_KEYIDX &&
-                   ieee80211_hw_check(&local->hw,
-                                      NO_AMPDU_KEYBORDER_SUPPORT)) {
+               if (sta->ptk_idx != INVALID_PTK_KEYIDX) {
                        /* Aggregation Sessions with Extended Key ID must not
                         * mix MPDUs with different keyIDs within one A-MPDU.
-                        * Tear down any running Tx aggregation and all new
-                        * Rx/Tx aggregation request during rekey if the driver
-                        * asks us to do so. (Blocking Tx only would be
-                        * sufficient but WLAN_STA_BLOCK_BA gets the job done
-                        * for the few ms we need it.)
+                        * Tear down running Tx aggregation sessions and block
+                        * new Rx/Tx aggregation requests during rekey to
+                        * ensure there are no A-MPDUs for the driver to
+                        * aggregate. (Blocking Tx only would be sufficient but
+                        * WLAN_STA_BLOCK_BA gets the job done for the few ms
+                        * we need it.)
                         */
                        set_sta_flag(sta, WLAN_STA_BLOCK_BA);
                        mutex_lock(&sta->ampdu_mlme.mtx);
index 4c2702f128f3a3b9dff40674c71b45d23b6e8b17..29b9d57df1a30875c98dc11d3022cd090c7c1e1e 100644 (file)
@@ -1048,21 +1048,15 @@ int ieee80211_register_hw(struct ieee80211_hw *hw)
                }
        }
 
-       /* Enable Extended Key IDs when driver allowed it, or when it
-        * supports neither HW crypto nor A-MPDUs
+       /* Mac80211 and therefore all drivers using SW crypto only
+        * are able to handle PTK rekeys and Extended Key ID.
         */
-       if ((!local->ops->set_key &&
-            !ieee80211_hw_check(hw, AMPDU_AGGREGATION)) ||
-           ieee80211_hw_check(&local->hw, EXT_KEY_ID_NATIVE))
-               wiphy_ext_feature_set(local->hw.wiphy,
-                                     NL80211_EXT_FEATURE_EXT_KEY_ID);
-
-       /* Mac80211 and therefore all cards only using SW crypto are able to
-        * handle PTK rekeys correctly
-        */
-       if (!local->ops->set_key)
+       if (!local->ops->set_key) {
                wiphy_ext_feature_set(local->hw.wiphy,
                                      NL80211_EXT_FEATURE_CAN_REPLACE_PTK0);
+               wiphy_ext_feature_set(local->hw.wiphy,
+                                     NL80211_EXT_FEATURE_EXT_KEY_ID);
+       }
 
        /*
         * Calculate scan IE length -- we need this to alloc