OSDN Git Service

mac80211: mlme: find auth challenge directly
authorJohannes Berg <johannes.berg@intel.com>
Mon, 20 Sep 2021 13:40:09 +0000 (15:40 +0200)
committerJohannes Berg <johannes.berg@intel.com>
Thu, 23 Sep 2021 14:26:52 +0000 (16:26 +0200)
There's no need to parse all elements etc. just to find the
authentication challenge - use cfg80211_find_elem() instead.
This also allows us to remove WLAN_EID_CHALLENGE handling
from the element parsing entirely.

Link: https://lore.kernel.org/r/20210920154009.45f9b3a15722.Ice3159ffad03a007d6154cbf1fb3a8c48489e86f@changeid
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
net/mac80211/ieee80211_i.h
net/mac80211/mlme.c
net/mac80211/util.c

index 6a129a0..7a9e529 100644 (file)
@@ -1517,7 +1517,6 @@ struct ieee802_11_elems {
        const u8 *supp_rates;
        const u8 *ds_params;
        const struct ieee80211_tim_ie *tim;
-       const u8 *challenge;
        const u8 *rsn;
        const u8 *rsnx;
        const u8 *erp_info;
@@ -1571,7 +1570,6 @@ struct ieee802_11_elems {
        u8 ssid_len;
        u8 supp_rates_len;
        u8 tim_len;
-       u8 challenge_len;
        u8 rsn_len;
        u8 rsnx_len;
        u8 ext_supp_rates_len;
index 39b3ed8..e18bd07 100644 (file)
@@ -2870,17 +2870,17 @@ static void ieee80211_auth_challenge(struct ieee80211_sub_if_data *sdata,
 {
        struct ieee80211_local *local = sdata->local;
        struct ieee80211_mgd_auth_data *auth_data = sdata->u.mgd.auth_data;
+       const struct element *challenge;
        u8 *pos;
-       struct ieee802_11_elems elems;
        u32 tx_flags = 0;
        struct ieee80211_prep_tx_info info = {
                .subtype = IEEE80211_STYPE_AUTH,
        };
 
        pos = mgmt->u.auth.variable;
-       ieee802_11_parse_elems(pos, len - (pos - (u8 *)mgmt), false, &elems,
-                              mgmt->bssid, auth_data->bss->bssid);
-       if (!elems.challenge)
+       challenge = cfg80211_find_elem(WLAN_EID_CHALLENGE, pos,
+                                      len - (pos - (u8 *)mgmt));
+       if (!challenge)
                return;
        auth_data->expected_transaction = 4;
        drv_mgd_prepare_tx(sdata->local, sdata, &info);
@@ -2888,7 +2888,8 @@ static void ieee80211_auth_challenge(struct ieee80211_sub_if_data *sdata,
                tx_flags = IEEE80211_TX_CTL_REQ_TX_STATUS |
                           IEEE80211_TX_INTFL_MLME_CONN_TX;
        ieee80211_send_auth(sdata, 3, auth_data->algorithm, 0,
-                           elems.challenge - 2, elems.challenge_len + 2,
+                           (void *)challenge,
+                           challenge->datalen + sizeof(*challenge),
                            auth_data->bss->bssid, auth_data->bss->bssid,
                            auth_data->key, auth_data->key_len,
                            auth_data->key_idx, tx_flags);
index 43ccad8..dce8412 100644 (file)
@@ -1112,10 +1112,6 @@ _ieee802_11_parse_elems_crc(const u8 *start, size_t len, bool action,
                        } else
                                elem_parse_failed = true;
                        break;
-               case WLAN_EID_CHALLENGE:
-                       elems->challenge = pos;
-                       elems->challenge_len = elen;
-                       break;
                case WLAN_EID_VENDOR_SPECIFIC:
                        if (elen >= 4 && pos[0] == 0x00 && pos[1] == 0x50 &&
                            pos[2] == 0xf2) {