Merge wireless into wireless-next
[sfrench/cifs-2.6.git] / net / wireless / mlme.c
index ac059cefbeb39e107d6e34c694dc05e0082fb687..579fea2f354889084ffca6cf25d87c8259e7812c 100644 (file)
@@ -4,7 +4,7 @@
  *
  * Copyright (c) 2009, Jouni Malinen <j@w1.fi>
  * Copyright (c) 2015          Intel Deutschland GmbH
- * Copyright (C) 2019-2020, 2022 Intel Corporation
+ * Copyright (C) 2019-2020, 2022-2023 Intel Corporation
  */
 
 #include <linux/kernel.h>
@@ -52,7 +52,8 @@ void cfg80211_rx_assoc_resp(struct net_device *dev,
                cr.links[link_id].bssid = data->links[link_id].bss->bssid;
                cr.links[link_id].addr = data->links[link_id].addr;
                /* need to have local link addresses for MLO connections */
-               WARN_ON(cr.ap_mld_addr && !cr.links[link_id].addr);
+               WARN_ON(cr.ap_mld_addr &&
+                       !is_valid_ether_addr(cr.links[link_id].addr));
 
                BUG_ON(!cr.links[link_id].bss->channel);
 
@@ -149,7 +150,7 @@ void cfg80211_rx_mlme_mgmt(struct net_device *dev, const u8 *buf, size_t len)
        struct wireless_dev *wdev = dev->ieee80211_ptr;
        struct ieee80211_mgmt *mgmt = (void *)buf;
 
-       ASSERT_WDEV_LOCK(wdev);
+       lockdep_assert_wiphy(wdev->wiphy);
 
        trace_cfg80211_rx_mlme_mgmt(dev, buf, len);
 
@@ -214,7 +215,7 @@ void cfg80211_tx_mlme_mgmt(struct net_device *dev, const u8 *buf, size_t len,
        struct wireless_dev *wdev = dev->ieee80211_ptr;
        struct ieee80211_mgmt *mgmt = (void *)buf;
 
-       ASSERT_WDEV_LOCK(wdev);
+       lockdep_assert_wiphy(wdev->wiphy);
 
        trace_cfg80211_tx_mlme_mgmt(dev, buf, len, reconnect);
 
@@ -262,7 +263,7 @@ int cfg80211_mlme_auth(struct cfg80211_registered_device *rdev,
 {
        struct wireless_dev *wdev = dev->ieee80211_ptr;
 
-       ASSERT_WDEV_LOCK(wdev);
+       lockdep_assert_wiphy(wdev->wiphy);
 
        if (!req->bss)
                return -ENOENT;
@@ -281,6 +282,11 @@ int cfg80211_mlme_auth(struct cfg80211_registered_device *rdev,
            ether_addr_equal(req->bss->bssid, wdev->u.client.connected_addr))
                return -EALREADY;
 
+       if (ether_addr_equal(req->bss->bssid, dev->dev_addr) ||
+           (req->link_id >= 0 &&
+            ether_addr_equal(req->ap_mld_addr, dev->dev_addr)))
+               return -EINVAL;
+
        return rdev_auth(rdev, dev, req);
 }
 
@@ -326,7 +332,7 @@ int cfg80211_mlme_assoc(struct cfg80211_registered_device *rdev,
        struct wireless_dev *wdev = dev->ieee80211_ptr;
        int err, i, j;
 
-       ASSERT_WDEV_LOCK(wdev);
+       lockdep_assert_wiphy(wdev->wiphy);
 
        for (i = 1; i < ARRAY_SIZE(req->links); i++) {
                if (!req->links[i].bss)
@@ -335,6 +341,9 @@ int cfg80211_mlme_assoc(struct cfg80211_registered_device *rdev,
                        if (req->links[i].bss == req->links[j].bss)
                                return -EINVAL;
                }
+
+               if (ether_addr_equal(req->links[i].bss->bssid, dev->dev_addr))
+                       return -EINVAL;
        }
 
        if (wdev->connected &&
@@ -342,6 +351,11 @@ int cfg80211_mlme_assoc(struct cfg80211_registered_device *rdev,
             !ether_addr_equal(wdev->u.client.connected_addr, req->prev_bssid)))
                return -EALREADY;
 
+       if ((req->bss && ether_addr_equal(req->bss->bssid, dev->dev_addr)) ||
+           (req->link_id >= 0 &&
+            ether_addr_equal(req->ap_mld_addr, dev->dev_addr)))
+               return -EINVAL;
+
        cfg80211_oper_and_ht_capa(&req->ht_capa_mask,
                                  rdev->wiphy.ht_capa_mod_mask);
        cfg80211_oper_and_vht_capa(&req->vht_capa_mask,
@@ -380,7 +394,7 @@ int cfg80211_mlme_deauth(struct cfg80211_registered_device *rdev,
                .local_state_change = local_state_change,
        };
 
-       ASSERT_WDEV_LOCK(wdev);
+       lockdep_assert_wiphy(wdev->wiphy);
 
        if (local_state_change &&
            (!wdev->connected ||
@@ -410,7 +424,7 @@ int cfg80211_mlme_disassoc(struct cfg80211_registered_device *rdev,
        };
        int err;
 
-       ASSERT_WDEV_LOCK(wdev);
+       lockdep_assert_wiphy(wdev->wiphy);
 
        if (!wdev->connected)
                return -ENOTCONN;
@@ -433,7 +447,7 @@ void cfg80211_mlme_down(struct cfg80211_registered_device *rdev,
        struct wireless_dev *wdev = dev->ieee80211_ptr;
        u8 bssid[ETH_ALEN];
 
-       ASSERT_WDEV_LOCK(wdev);
+       lockdep_assert_wiphy(wdev->wiphy);
 
        if (!rdev->ops->deauth)
                return;
@@ -713,6 +727,8 @@ int cfg80211_mlme_mgmt_tx(struct cfg80211_registered_device *rdev,
        const struct ieee80211_mgmt *mgmt;
        u16 stype;
 
+       lockdep_assert_wiphy(&rdev->wiphy);
+
        if (!wdev->wiphy->mgmt_stypes)
                return -EOPNOTSUPP;
 
@@ -735,8 +751,6 @@ int cfg80211_mlme_mgmt_tx(struct cfg80211_registered_device *rdev,
            mgmt->u.action.category != WLAN_CATEGORY_PUBLIC) {
                int err = 0;
 
-               wdev_lock(wdev);
-
                switch (wdev->iftype) {
                case NL80211_IFTYPE_ADHOC:
                        /*
@@ -801,7 +815,6 @@ int cfg80211_mlme_mgmt_tx(struct cfg80211_registered_device *rdev,
                        err = -EOPNOTSUPP;
                        break;
                }
-               wdev_unlock(wdev);
 
                if (err)
                        return err;