Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3e47bf1c authored by Alexander Wetzel's avatar Alexander Wetzel Committed by Johannes Berg
Browse files

mac80211: Simplify Extended Key ID API



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: default avatarAlexander Wetzel <alexander@wetzel-home.de>
Link: https://lore.kernel.org/r/20190629195015.19680-2-alexander@wetzel-home.de


Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
parent 5d29050b
Loading
Loading
Loading
Loading
+0 −8
Original line number Diff line number Diff line
@@ -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
+0 −2
Original line number Diff line number Diff line
@@ -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
};

+8 −10
Original line number Diff line number Diff line
@@ -270,7 +270,6 @@ 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);
	ieee80211_check_fast_xmit(sta);

@@ -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);
+6 −12
Original line number Diff line number Diff line
@@ -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