wifi: cfg80211: put cfg80211_rx_assoc_resp() arguments into a struct
authorJohannes Berg <johannes.berg@intel.com>
Tue, 28 Jun 2022 14:25:37 +0000 (16:25 +0200)
committerJohannes Berg <johannes.berg@intel.com>
Fri, 15 Jul 2022 09:43:17 +0000 (11:43 +0200)
For MLO we'll need a lot more arguments, including all the
BSS pointers and link addresses, so move the data to a struct
to be able to extend it more easily later.

Signed-off-by: Johannes Berg <johannes.berg@intel.com>
include/net/cfg80211.h
net/mac80211/mlme.c
net/wireless/mlme.c
net/wireless/nl80211.c
net/wireless/nl80211.h

index 1d8cecf035d115fb23e3edd55b5c24f7ea03704d..2628e8f98a134f0c09d0c11b0713383d47a817cb 100644 (file)
@@ -6877,16 +6877,29 @@ void cfg80211_rx_mlme_mgmt(struct net_device *dev, const u8 *buf, size_t len);
 void cfg80211_auth_timeout(struct net_device *dev, const u8 *addr);
 
 /**
- * cfg80211_rx_assoc_resp - notification of processed association response
- * @dev: network device
+ * struct cfg80211_rx_assoc_resp - association response data
  * @bss: the BSS that association was requested with, ownership of the pointer
- *     moves to cfg80211 in this call
+ *     moves to cfg80211 in the call to cfg80211_rx_assoc_resp()
  * @buf: (Re)Association Response frame (header + body)
  * @len: length of the frame data
  * @uapsd_queues: bitmap of queues configured for uapsd. Same format
  *     as the AC bitmap in the QoS info field
  * @req_ies: information elements from the (Re)Association Request frame
  * @req_ies_len: length of req_ies data
+ */
+struct cfg80211_rx_assoc_resp {
+       struct cfg80211_bss *bss;
+       const u8 *buf;
+       size_t len;
+       const u8 *req_ies;
+       size_t req_ies_len;
+       int uapsd_queues;
+};
+
+/**
+ * cfg80211_rx_assoc_resp - notification of processed association response
+ * @dev: network device
+ * @data: association response data, &struct cfg80211_rx_assoc_resp
  *
  * After being asked to associate via cfg80211_ops::assoc() the driver must
  * call either this function or cfg80211_auth_timeout().
@@ -6894,10 +6907,7 @@ void cfg80211_auth_timeout(struct net_device *dev, const u8 *addr);
  * This function may sleep. The caller must hold the corresponding wdev's mutex.
  */
 void cfg80211_rx_assoc_resp(struct net_device *dev,
-                           struct cfg80211_bss *bss,
-                           const u8 *buf, size_t len,
-                           int uapsd_queues,
-                           const u8 *req_ies, size_t req_ies_len);
+                           struct cfg80211_rx_assoc_resp *data);
 
 /**
  * struct cfg80211_assoc_failure - association failure data
index 91f07b67f2f04a428c09aa653146b254be9c8043..ecbd70a1fbb7ebb3ec9ec60450dcd414abdc6c73 100644 (file)
@@ -3878,7 +3878,7 @@ static void ieee80211_rx_mgmt_assoc_resp(struct ieee80211_sub_if_data *sdata,
        struct ieee80211_mgd_assoc_data *assoc_data = ifmgd->assoc_data;
        u16 capab_info, status_code, aid;
        struct ieee802_11_elems *elems;
-       int ac, uapsd_queues = -1;
+       int ac;
        u8 *pos;
        bool reassoc;
        struct cfg80211_bss *cbss;
@@ -3887,6 +3887,9 @@ static void ieee80211_rx_mgmt_assoc_resp(struct ieee80211_sub_if_data *sdata,
                .u.mlme.data = ASSOC_EVENT,
        };
        struct ieee80211_prep_tx_info info = {};
+       struct cfg80211_rx_assoc_resp resp = {
+               .uapsd_queues = -1,
+       };
 
        sdata_assert_lock(sdata);
 
@@ -3984,16 +3987,20 @@ static void ieee80211_rx_mgmt_assoc_resp(struct ieee80211_sub_if_data *sdata,
                ieee80211_destroy_assoc_data(sdata, ASSOC_SUCCESS);
 
                /* get uapsd queues configuration */
-               uapsd_queues = 0;
+               resp.uapsd_queues = 0;
                for (ac = 0; ac < IEEE80211_NUM_ACS; ac++)
                        if (sdata->deflink.tx_conf[ac].uapsd)
-                               uapsd_queues |= ieee80211_ac_to_qos_mask[ac];
+                               resp.uapsd_queues |= ieee80211_ac_to_qos_mask[ac];
 
                info.success = 1;
        }
 
-       cfg80211_rx_assoc_resp(sdata->dev, cbss, (u8 *)mgmt, len, uapsd_queues,
-                              ifmgd->assoc_req_ies, ifmgd->assoc_req_ies_len);
+       resp.bss = cbss;
+       resp.buf = (u8 *)mgmt;
+       resp.len = len;
+       resp.req_ies = ifmgd->assoc_req_ies;
+       resp.req_ies_len = ifmgd->assoc_req_ies_len;
+       cfg80211_rx_assoc_resp(sdata->dev, &resp);
 notify_driver:
        drv_mgd_complete_tx(sdata->local, sdata, &info);
        kfree(elems);
index aefe8b26f0d755e2922883962f8476593360956c..a6ad696f131bf5512cf3af4b154d310581fe882c 100644 (file)
 #include "rdev-ops.h"
 
 
-void cfg80211_rx_assoc_resp(struct net_device *dev, struct cfg80211_bss *bss,
-                           const u8 *buf, size_t len, int uapsd_queues,
-                           const u8 *req_ies, size_t req_ies_len)
+void cfg80211_rx_assoc_resp(struct net_device *dev,
+                           struct cfg80211_rx_assoc_resp *data)
 {
        struct wireless_dev *wdev = dev->ieee80211_ptr;
        struct wiphy *wiphy = wdev->wiphy;
        struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
-       struct ieee80211_mgmt *mgmt = (struct ieee80211_mgmt *)buf;
+       struct ieee80211_mgmt *mgmt = (struct ieee80211_mgmt *)data->buf;
        struct cfg80211_connect_resp_params cr;
        const u8 *resp_ie = mgmt->u.assoc_resp.variable;
-       size_t resp_ie_len = len - offsetof(struct ieee80211_mgmt,
-                                           u.assoc_resp.variable);
+       size_t resp_ie_len = data->len - offsetof(struct ieee80211_mgmt,
+                                                 u.assoc_resp.variable);
 
-       if (bss->channel->band == NL80211_BAND_S1GHZ) {
+       if (data->bss->channel->band == NL80211_BAND_S1GHZ) {
                resp_ie = (u8 *)&mgmt->u.s1g_assoc_resp.variable;
-               resp_ie_len = len - offsetof(struct ieee80211_mgmt,
-                                            u.s1g_assoc_resp.variable);
+               resp_ie_len = data->len - offsetof(struct ieee80211_mgmt,
+                                                  u.s1g_assoc_resp.variable);
        }
 
        memset(&cr, 0, sizeof(cr));
        cr.status = (int)le16_to_cpu(mgmt->u.assoc_resp.status_code);
        cr.links[0].bssid = mgmt->bssid;
-       cr.links[0].bss = bss;
-       cr.req_ie = req_ies;
-       cr.req_ie_len = req_ies_len;
+       cr.links[0].bss = data->bss;
+       cr.req_ie = data->req_ies;
+       cr.req_ie_len = data->req_ies_len;
        cr.resp_ie = resp_ie;
        cr.resp_ie_len = resp_ie_len;
        cr.timeout_reason = NL80211_TIMEOUT_UNSPECIFIED;
 
-       trace_cfg80211_send_rx_assoc(dev, bss);
+       trace_cfg80211_send_rx_assoc(dev, data->bss);
 
        /*
         * This is a bit of a hack, we don't notify userspace of
@@ -59,13 +58,12 @@ void cfg80211_rx_assoc_resp(struct net_device *dev, struct cfg80211_bss *bss,
         * frame instead of reassoc.
         */
        if (cfg80211_sme_rx_assoc_resp(wdev, cr.status)) {
-               cfg80211_unhold_bss(bss_from_pub(bss));
-               cfg80211_put_bss(wiphy, bss);
+               cfg80211_unhold_bss(bss_from_pub(data->bss));
+               cfg80211_put_bss(wiphy, data->bss);
                return;
        }
 
-       nl80211_send_rx_assoc(rdev, dev, buf, len, GFP_KERNEL, uapsd_queues,
-                             req_ies, req_ies_len);
+       nl80211_send_rx_assoc(rdev, dev, data);
        /* update current_bss etc., consumes the bss reference */
        __cfg80211_connect_result(dev, &cr, cr.status == WLAN_STATUS_SUCCESS);
 }
index 6c3b47a7960f72be4e1aa2a82fde0bcf0824f096..11cad2d46d0eafe01495308d4d3ead0bd679f9ab 100644 (file)
@@ -17432,13 +17432,13 @@ void nl80211_send_rx_auth(struct cfg80211_registered_device *rdev,
 }
 
 void nl80211_send_rx_assoc(struct cfg80211_registered_device *rdev,
-                          struct net_device *netdev, const u8 *buf,
-                          size_t len, gfp_t gfp, int uapsd_queues,
-                          const u8 *req_ies, size_t req_ies_len)
+                          struct net_device *netdev,
+                          struct cfg80211_rx_assoc_resp *data)
 {
-       nl80211_send_mlme_event(rdev, netdev, buf, len,
-                               NL80211_CMD_ASSOCIATE, gfp, uapsd_queues,
-                               req_ies, req_ies_len, false);
+       nl80211_send_mlme_event(rdev, netdev, data->buf, data->len,
+                               NL80211_CMD_ASSOCIATE, GFP_KERNEL,
+                               data->uapsd_queues,
+                               data->req_ies, data->req_ies_len, false);
 }
 
 void nl80211_send_deauth(struct cfg80211_registered_device *rdev,
index d642e3be4ee78cdfe26b30d7a3fbc9363a4a1c66..a7e8e0917c1cbc6185439fa1c677bbb28792e542 100644 (file)
@@ -60,9 +60,7 @@ void nl80211_send_rx_auth(struct cfg80211_registered_device *rdev,
                          const u8 *buf, size_t len, gfp_t gfp);
 void nl80211_send_rx_assoc(struct cfg80211_registered_device *rdev,
                           struct net_device *netdev,
-                          const u8 *buf, size_t len, gfp_t gfp,
-                          int uapsd_queues,
-                          const u8 *req_ies, size_t req_ies_len);
+                          struct cfg80211_rx_assoc_resp *data);
 void nl80211_send_deauth(struct cfg80211_registered_device *rdev,
                         struct net_device *netdev,
                         const u8 *buf, size_t len,