]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
wifi: mac80211: set key link ID to the deflink one
authorBenjamin Berg <benjamin.berg@intel.com>
Thu, 2 Jan 2025 14:20:05 +0000 (16:20 +0200)
committerJohannes Berg <johannes.berg@intel.com>
Mon, 13 Jan 2025 14:34:09 +0000 (15:34 +0100)
When in non-MLO mode, the key ID was set to -1 even for keys that are
not pairwise. Change the link ID to be the link ID of the deflink in
this case so that drivers do not need to special cases for this.

Signed-off-by: Benjamin Berg <benjamin.berg@intel.com>
Signed-off-by: Miri Korenblit <miriam.rachel.korenblit@intel.com>
Link: https://patch.msgid.link/20250102161730.0c066f084677.I4a5c288465e75119edb6a0df90dddf6f30d14a02@changeid
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
include/net/mac80211.h
net/mac80211/cfg.c
net/mac80211/key.c

index 0d7ddaa952ff09e6f5d45356f54c8ba6017da592..c3ed2fcff8b79837bd7c00c7716a104dc811a91d 100644 (file)
@@ -2229,7 +2229,7 @@ enum ieee80211_key_flags {
  *     - Temporal Authenticator Rx MIC Key (64 bits)
  * @icv_len: The ICV length for this key type
  * @iv_len: The IV length for this key type
- * @link_id: the link ID for MLO, or -1 for non-MLO or pairwise keys
+ * @link_id: the link ID, 0 for non-MLO, or -1 for pairwise keys
  */
 struct ieee80211_key_conf {
        atomic64_t tx_pn;
index ae12c5dc74e6a0d879034a8e704bfe560ce48b39..9351c64608a9986d4b6af5a6e5a80122d1393d60 100644 (file)
@@ -503,6 +503,9 @@ static int ieee80211_add_key(struct wiphy *wiphy, struct net_device *dev,
        if (IS_ERR(link))
                return PTR_ERR(link);
 
+       if (WARN_ON(pairwise && link_id >= 0))
+               return -EINVAL;
+
        if (pairwise && params->mode == NL80211_KEY_SET_TX)
                return ieee80211_set_tx(sdata, mac_addr, key_idx);
 
@@ -525,10 +528,12 @@ static int ieee80211_add_key(struct wiphy *wiphy, struct net_device *dev,
        if (IS_ERR(key))
                return PTR_ERR(key);
 
-       key->conf.link_id = link_id;
-
-       if (pairwise)
+       if (pairwise) {
                key->conf.flags |= IEEE80211_KEY_FLAG_PAIRWISE;
+               key->conf.link_id = -1;
+       } else {
+               key->conf.link_id = link->link_id;
+       }
 
        if (params->mode == NL80211_KEY_NO_TX)
                key->conf.flags |= IEEE80211_KEY_FLAG_NO_AUTO_TX;
index 67ecfea2298294debe442d2103e3c82d4fc63712..dcf8643a0baa507b3411a71b840a3fb55a90ce21 100644 (file)
@@ -1409,7 +1409,7 @@ ieee80211_gtk_rekey_add(struct ieee80211_vif *vif,
        if (sdata->u.mgd.mfp != IEEE80211_MFP_DISABLED)
                key->conf.flags |= IEEE80211_KEY_FLAG_RX_MGMT;
 
-       key->conf.link_id = link_id;
+       key->conf.link_id = link_data->link_id;
 
        err = ieee80211_key_link(key, link_data, NULL);
        if (err)