wifi: mac80211: convert ieee80211_ie_build_eht_cap() to SKB use
authorJohannes Berg <johannes.berg@intel.com>
Mon, 29 Jan 2024 19:19:36 +0000 (20:19 +0100)
committerJohannes Berg <johannes.berg@intel.com>
Thu, 8 Feb 2024 14:00:44 +0000 (15:00 +0100)
Convert ieee80211_ie_build_eht_cap() to the SKB-put function
style, renaming it to ieee80211_put_eht_cap().

Link: https://msgid.link/20240129202041.ece9769e3c94.Ibd17bea6311f0c7ba56f6c1803fa3208abaaebb9@changeid
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
net/mac80211/ieee80211_i.h
net/mac80211/mesh.c
net/mac80211/mlme.c
net/mac80211/tdls.c
net/mac80211/util.c

index de0fdbd366c5fce21d9048999e372eff5de960e7..f3edb1a148a7fbb82163d1b3488a801104d0c374 100644 (file)
@@ -2527,6 +2527,10 @@ int ieee80211_put_he_cap(struct sk_buff *skb,
 int ieee80211_put_he_6ghz_cap(struct sk_buff *skb,
                              struct ieee80211_sub_if_data *sdata,
                              enum ieee80211_smps_mode smps_mode);
+int ieee80211_put_eht_cap(struct sk_buff *skb,
+                         struct ieee80211_sub_if_data *sdata,
+                         const struct ieee80211_supported_band *sband,
+                         const struct ieee80211_conn_settings *conn);
 
 /* channel management */
 bool ieee80211_chandef_ht_oper(const struct ieee80211_ht_operation *ht_oper,
@@ -2651,12 +2655,6 @@ void ieee80211_init_frag_cache(struct ieee80211_fragment_cache *cache);
 void ieee80211_destroy_frag_cache(struct ieee80211_fragment_cache *cache);
 
 u8 ieee80211_ie_len_eht_cap(struct ieee80211_sub_if_data *sdata);
-u8 *ieee80211_ie_build_eht_cap(const struct ieee80211_conn_settings *conn,
-                              u8 *pos,
-                              const struct ieee80211_sta_he_cap *he_cap,
-                              const struct ieee80211_sta_eht_cap *eht_cap,
-                              u8 *end,
-                              bool for_ap);
 
 void
 ieee80211_eht_cap_ie_to_sta_eht_cap(struct ieee80211_sub_if_data *sdata,
index cb217657c42e83447ec326bfccc711a67538afb3..49f79512c14442b767e5ffa8017d38801fd3e154 100644 (file)
@@ -636,31 +636,18 @@ int mesh_add_he_6ghz_cap_ie(struct ieee80211_sub_if_data *sdata,
 int mesh_add_eht_cap_ie(struct ieee80211_sub_if_data *sdata,
                        struct sk_buff *skb, u8 ie_len)
 {
-       const struct ieee80211_sta_he_cap *he_cap;
-       const struct ieee80211_sta_eht_cap *eht_cap;
        struct ieee80211_supported_band *sband;
-       u8 *pos;
 
        sband = ieee80211_get_sband(sdata);
        if (!sband)
                return -EINVAL;
 
-       he_cap = ieee80211_get_he_iftype_cap(sband, NL80211_IFTYPE_MESH_POINT);
-       eht_cap = ieee80211_get_eht_iftype_cap(sband, NL80211_IFTYPE_MESH_POINT);
-       if (!he_cap || !eht_cap ||
-           sdata->vif.bss_conf.chanreq.oper.width == NL80211_CHAN_WIDTH_20_NOHT ||
+       if (sdata->vif.bss_conf.chanreq.oper.width == NL80211_CHAN_WIDTH_20_NOHT ||
            sdata->vif.bss_conf.chanreq.oper.width == NL80211_CHAN_WIDTH_5 ||
            sdata->vif.bss_conf.chanreq.oper.width == NL80211_CHAN_WIDTH_10)
                return 0;
 
-       if (skb_tailroom(skb) < ie_len)
-               return -ENOMEM;
-
-       pos = skb_put(skb, ie_len);
-       ieee80211_ie_build_eht_cap(NULL, pos, he_cap, eht_cap, pos + ie_len,
-                                  false);
-
-       return 0;
+       return ieee80211_put_eht_cap(skb, sdata, sband, NULL);
 }
 
 int mesh_add_eht_oper_ie(struct ieee80211_sub_if_data *sdata, struct sk_buff *skb)
index de3d0e08ca2a03b2dfbcd8e4d74ebd2a728fb959..dd97f402a62418a2aa29e92a75e0d9f7d721ad10 100644 (file)
@@ -1038,41 +1038,6 @@ static bool ieee80211_add_vht_ie(struct ieee80211_sub_if_data *sdata,
        return mu_mimo_owner;
 }
 
-static void ieee80211_add_eht_ie(struct ieee80211_sub_if_data *sdata,
-                                struct sk_buff *skb,
-                                struct ieee80211_supported_band *sband,
-                                const struct ieee80211_conn_settings *conn)
-{
-       u8 *pos, *pre_eht_pos;
-       const struct ieee80211_sta_he_cap *he_cap;
-       const struct ieee80211_sta_eht_cap *eht_cap;
-       u8 eht_cap_size;
-
-       he_cap = ieee80211_get_he_iftype_cap_vif(sband, &sdata->vif);
-       eht_cap = ieee80211_get_eht_iftype_cap_vif(sband, &sdata->vif);
-
-       /*
-        * EHT capabilities element is only added if the HE capabilities element
-        * was added so assume that 'he_cap' is valid and don't check it.
-        */
-       if (WARN_ON(!he_cap || !eht_cap))
-               return;
-
-       eht_cap_size =
-               2 + 1 + sizeof(eht_cap->eht_cap_elem) +
-               ieee80211_eht_mcs_nss_size(&he_cap->he_cap_elem,
-                                          &eht_cap->eht_cap_elem,
-                                          false) +
-               ieee80211_eht_ppe_size(eht_cap->eht_ppe_thres[0],
-                                      eht_cap->eht_cap_elem.phy_cap_info);
-       pos = skb_put(skb, eht_cap_size);
-       pre_eht_pos = pos;
-       pos = ieee80211_ie_build_eht_cap(conn, pos, he_cap, eht_cap,
-                                        pos + eht_cap_size, false);
-       /* trim excess if any */
-       skb_trim(skb, skb->len - (pre_eht_pos + eht_cap_size - pos));
-}
-
 static void ieee80211_assoc_add_rates(struct sk_buff *skb,
                                      enum nl80211_chan_width width,
                                      struct ieee80211_supported_band *sband,
@@ -1393,8 +1358,8 @@ static size_t ieee80211_assoc_link_elems(struct ieee80211_sub_if_data *sdata,
        present_elems = NULL;
 
        if (assoc_data->link[link_id].conn.mode >= IEEE80211_CONN_MODE_EHT)
-               ieee80211_add_eht_ie(sdata, skb, sband,
-                                    &assoc_data->link[link_id].conn);
+               ieee80211_put_eht_cap(skb, sdata, sband,
+                                     &assoc_data->link[link_id].conn);
 
        if (sband->band == NL80211_BAND_S1GHZ) {
                ieee80211_add_aid_request_ie(sdata, skb);
index 3f9c2b2771c6a0b129d1296056b89961a4f97098..42d9c06cbb845556bdd5e83ef3bc6257b7a49440 100644 (file)
@@ -575,22 +575,10 @@ ieee80211_tdls_add_setup_start_ies(struct ieee80211_link_data *link,
        }
 
        /* build the EHT-cap from sband */
-       if (he_cap && eht_cap &&
-           (action_code == WLAN_TDLS_SETUP_REQUEST ||
-            action_code == WLAN_TDLS_SETUP_RESPONSE ||
-            action_code == WLAN_PUB_ACTION_TDLS_DISCOVER_RES)) {
-               u8 cap_size;
-
-               cap_size =
-                       2 + 1 + sizeof(eht_cap->eht_cap_elem) +
-                       ieee80211_eht_mcs_nss_size(&he_cap->he_cap_elem,
-                                                  &eht_cap->eht_cap_elem, false) +
-                       ieee80211_eht_ppe_size(eht_cap->eht_ppe_thres[0],
-                                              eht_cap->eht_cap_elem.phy_cap_info);
-               pos = skb_put(skb, cap_size);
-               ieee80211_ie_build_eht_cap(NULL, pos, he_cap, eht_cap,
-                                          pos + cap_size, false);
-       }
+       if (action_code == WLAN_TDLS_SETUP_REQUEST ||
+           action_code == WLAN_TDLS_SETUP_RESPONSE ||
+           action_code == WLAN_PUB_ACTION_TDLS_DISCOVER_RES)
+               ieee80211_put_eht_cap(skb, sdata, sband, NULL);
 
        /* add any remaining IEs */
        if (extra_ies_len) {
index 4dcb62e9d4c65295e2532bc5431257ef44a92298..627bd5a8bda5289aa4cbe400709219aa5b0fc560 100644 (file)
@@ -1199,8 +1199,6 @@ static int ieee80211_put_preq_ies_band(struct sk_buff *skb,
 {
        struct ieee80211_local *local = sdata->local;
        struct ieee80211_supported_band *sband;
-       const struct ieee80211_sta_he_cap *he_cap;
-       const struct ieee80211_sta_eht_cap *eht_cap;
        int i, err;
        size_t noffset;
        u32 rate_flags;
@@ -1359,22 +1357,12 @@ static int ieee80211_put_preq_ies_band(struct sk_buff *skb,
                        return err;
        }
 
-       he_cap = ieee80211_get_he_iftype_cap_vif(sband, &sdata->vif);
-       eht_cap = ieee80211_get_eht_iftype_cap_vif(sband, &sdata->vif);
-
-       if (eht_cap &&
-           cfg80211_any_usable_channels(local->hw.wiphy, BIT(sband->band),
+       if (cfg80211_any_usable_channels(local->hw.wiphy, BIT(sband->band),
                                         IEEE80211_CHAN_NO_HE |
                                         IEEE80211_CHAN_NO_EHT)) {
-               u8 *pos = skb_tail_pointer(skb);
-               u8 *end = pos + skb_tailroom(skb);
-
-               pos = ieee80211_ie_build_eht_cap(NULL, pos, he_cap, eht_cap,
-                                                end,
-                                                sdata->vif.type == NL80211_IFTYPE_AP);
-               if (!pos)
-                       return -ENOBUFS;
-               skb_put(skb, pos - skb_tail_pointer(skb));
+               err = ieee80211_put_eht_cap(skb, sdata, sband, NULL);
+               if (err)
+                       return err;
        }
 
        err = ieee80211_put_he_6ghz_cap(skb, sdata, IEEE80211_SMPS_OFF);
@@ -4175,7 +4163,7 @@ u16 ieee80211_encode_usf(int listen_interval)
        return (u16) listen_interval;
 }
 
-/* this may return more than ieee80211_ie_build_eht_cap() will need */
+/* this may return more than ieee80211_put_eht_cap() will need */
 u8 ieee80211_ie_len_eht_cap(struct ieee80211_sub_if_data *sdata)
 {
        const struct ieee80211_sta_he_cap *he_cap;
@@ -4205,25 +4193,28 @@ u8 ieee80211_ie_len_eht_cap(struct ieee80211_sub_if_data *sdata)
        return 0;
 }
 
-u8 *ieee80211_ie_build_eht_cap(const struct ieee80211_conn_settings *conn,
-                              u8 *pos,
-                              const struct ieee80211_sta_he_cap *he_cap,
-                              const struct ieee80211_sta_eht_cap *eht_cap,
-                              u8 *end, bool for_ap)
+int ieee80211_put_eht_cap(struct sk_buff *skb,
+                         struct ieee80211_sub_if_data *sdata,
+                         const struct ieee80211_supported_band *sband,
+                         const struct ieee80211_conn_settings *conn)
 {
-       struct ieee80211_eht_cap_elem_fixed fixed, *out;
+       const struct ieee80211_sta_he_cap *he_cap =
+               ieee80211_get_he_iftype_cap_vif(sband, &sdata->vif);
+       const struct ieee80211_sta_eht_cap *eht_cap =
+               ieee80211_get_eht_iftype_cap_vif(sband, &sdata->vif);
+       bool for_ap = sdata->vif.type == NL80211_IFTYPE_AP;
+       struct ieee80211_eht_cap_elem_fixed fixed;
        struct ieee80211_he_cap_elem he;
        u8 mcs_nss_len, ppet_len;
        u8 orig_mcs_nss_len;
        u8 ie_len;
-       u8 *orig_pos = pos;
 
        if (!conn)
                conn = &ieee80211_conn_settings_unlimited;
 
        /* Make sure we have place for the IE */
        if (!he_cap || !eht_cap)
-               return orig_pos;
+               return 0;
 
        orig_mcs_nss_len = ieee80211_eht_mcs_nss_size(&he_cap->he_cap_elem,
                                                      &eht_cap->eht_cap_elem,
@@ -4266,16 +4257,13 @@ u8 *ieee80211_ie_build_eht_cap(const struct ieee80211_conn_settings *conn,
                                          fixed.phy_cap_info);
 
        ie_len = 2 + 1 + sizeof(eht_cap->eht_cap_elem) + mcs_nss_len + ppet_len;
-       if ((end - pos) < ie_len)
-               return orig_pos;
-
-       *pos++ = WLAN_EID_EXTENSION;
-       *pos++ = ie_len - 2;
-       *pos++ = WLAN_EID_EXT_EHT_CAPABILITY;
+       if (skb_tailroom(skb) < ie_len)
+               return -ENOBUFS;
 
-       out = (void *)pos;
-       *out = fixed;
-       pos += sizeof(*out);
+       skb_put_u8(skb, WLAN_EID_EXTENSION);
+       skb_put_u8(skb, ie_len - 2);
+       skb_put_u8(skb, WLAN_EID_EXT_EHT_CAPABILITY);
+       skb_put_data(skb, &fixed, sizeof(fixed));
 
        if (mcs_nss_len == 4 && orig_mcs_nss_len != 4) {
                /*
@@ -4284,21 +4272,18 @@ u8 *ieee80211_ie_build_eht_cap(const struct ieee80211_conn_settings *conn,
                 * the groups 0-7, 8-9, 10-11, 12-13 rather than just 0-9,
                 * 10-11, 12-13. Thus, use 0-9 for 0-7 and 8-9.
                 */
-               *pos++ = eht_cap->eht_mcs_nss_supp.bw._80.rx_tx_mcs9_max_nss;
-               *pos++ = eht_cap->eht_mcs_nss_supp.bw._80.rx_tx_mcs9_max_nss;
-               *pos++ = eht_cap->eht_mcs_nss_supp.bw._80.rx_tx_mcs11_max_nss;
-               *pos++ = eht_cap->eht_mcs_nss_supp.bw._80.rx_tx_mcs13_max_nss;
+               skb_put_u8(skb, eht_cap->eht_mcs_nss_supp.bw._80.rx_tx_mcs9_max_nss);
+               skb_put_u8(skb, eht_cap->eht_mcs_nss_supp.bw._80.rx_tx_mcs9_max_nss);
+               skb_put_u8(skb, eht_cap->eht_mcs_nss_supp.bw._80.rx_tx_mcs11_max_nss);
+               skb_put_u8(skb, eht_cap->eht_mcs_nss_supp.bw._80.rx_tx_mcs13_max_nss);
        } else {
-               memcpy(pos, &eht_cap->eht_mcs_nss_supp, mcs_nss_len);
-               pos += mcs_nss_len;
+               skb_put_data(skb, &eht_cap->eht_mcs_nss_supp, mcs_nss_len);
        }
 
-       if (ppet_len) {
-               memcpy(pos, &eht_cap->eht_ppe_thres, ppet_len);
-               pos += ppet_len;
-       }
+       if (ppet_len)
+               skb_put_data(skb, &eht_cap->eht_ppe_thres, ppet_len);
 
-       return pos;
+       return 0;
 }
 
 const char *ieee80211_conn_mode_str(enum ieee80211_conn_mode mode)