]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
PASN: Store PASN authentication frames 1 and 2
authorShivani Baranwal <quic_shivbara@quicinc.com>
Sun, 4 Aug 2024 21:13:59 +0000 (02:43 +0530)
committerJouni Malinen <j@w1.fi>
Fri, 27 Sep 2024 09:44:30 +0000 (12:44 +0300)
These are needed for P2P2 support.

Signed-off-by: Shivani Baranwal <quic_shivbara@quicinc.com>
src/ap/ieee802_11.c
src/pasn/pasn_common.c
src/pasn/pasn_common.h
src/pasn/pasn_initiator.c
src/pasn/pasn_responder.c
wpa_supplicant/pasn_supplicant.c

index 10b59348f743d5a179f36328cf054cdd669bd34c..3d5674d2fe38e1d0c0f9d0fac4d361e9f1e116b1 100644 (file)
@@ -2507,6 +2507,8 @@ static void pasn_fils_auth_resp(struct hostapd_data *hapd,
        fils->erp_resp = erp_resp;
        ret = handle_auth_pasn_resp(sta->pasn, hapd->own_addr, sta->addr, NULL,
                                    WLAN_STATUS_SUCCESS);
+       wpabuf_free(pasn->frame);
+       pasn->frame = NULL;
        fils->erp_resp = NULL;
 
        if (ret) {
@@ -2820,6 +2822,8 @@ static void handle_auth_pasn(struct hostapd_data *hapd, struct sta_info *sta,
                             const struct ieee80211_mgmt *mgmt, size_t len,
                             u16 trans_seq, u16 status)
 {
+       int ret;
+
        if (hapd->conf->wpa != WPA_PROTO_RSN) {
                wpa_printf(MSG_INFO, "PASN: RSN is not configured");
                return;
@@ -2851,8 +2855,11 @@ static void handle_auth_pasn(struct hostapd_data *hapd, struct sta_info *sta,
                hapd_initialize_pasn(hapd, sta);
 
                hapd_pasn_update_params(hapd, sta, mgmt, len);
-               if (handle_auth_pasn_1(sta->pasn, hapd->own_addr,
-                                      sta->addr, mgmt, len, false) < 0)
+               ret = handle_auth_pasn_1(sta->pasn, hapd->own_addr, sta->addr,
+                                        mgmt, len, false);
+               wpabuf_free(sta->pasn->frame);
+               sta->pasn->frame = NULL;
+               if (ret < 0)
                        ap_free_sta(hapd, sta);
        } else if (trans_seq == 3) {
                if (!sta->pasn) {
index b5dd1758df37ae5fafd1b10ffe981f6660bbd582..8a42e09410d9072103bea6ea7b1e477ae3388045 100644 (file)
@@ -33,6 +33,7 @@ void pasn_data_deinit(struct pasn_data *pasn)
        if (!pasn)
                return;
        os_free(pasn->rsnxe_ie);
+       wpabuf_free(pasn->frame);
        bin_clear_free(pasn, sizeof(struct pasn_data));
 }
 
index 4a5baf0cabae79dc70aeb948bd07aa3e8dcdc471..449746f0f908f1a16986237a0f35026a223308e4 100644 (file)
@@ -130,6 +130,7 @@ struct pasn_data {
        struct os_reltime last_comeback_key_update;
        u16 comeback_idx;
        u16 *comeback_pending_idx;
+       struct wpabuf *frame;
 
        /**
         * send_mgmt - Function handler to transmit a Management frame
index 432e0c8402c0b7a42e6a4418ce9dd602012c8942..b0b9019166257f131fd1113f796a728e3b563030 100644 (file)
@@ -823,6 +823,9 @@ void wpa_pasn_reset(struct pasn_data *pasn)
                os_free((u8 *) pasn->extra_ies);
                pasn->extra_ies = NULL;
        }
+
+       wpabuf_free(pasn->frame);
+       pasn->frame = NULL;
 }
 
 
@@ -993,16 +996,20 @@ static int wpas_pasn_send_auth_1(struct pasn_data *pasn, const u8 *own_addr,
                goto fail;
        }
 
+       wpabuf_free(pasn->frame);
+       pasn->frame = NULL;
+
        ret = pasn->send_mgmt(pasn->cb_ctx,
                              wpabuf_head(frame), wpabuf_len(frame), 0,
                              pasn->freq, 1000);
 
-       wpabuf_free(frame);
        if (ret) {
                wpa_printf(MSG_DEBUG, "PASN: Failed sending 1st auth frame");
+               wpabuf_free(frame);
                goto fail;
        }
 
+       pasn->frame = frame;
        return 0;
 
 fail:
@@ -1403,15 +1410,19 @@ int wpa_pasn_auth_rx(struct pasn_data *pasn, const u8 *data, size_t len,
                goto fail;
        }
 
+       wpabuf_free(pasn->frame);
+       pasn->frame = NULL;
+
        ret = pasn->send_mgmt(pasn->cb_ctx,
                              wpabuf_head(frame), wpabuf_len(frame), 0,
                              pasn->freq, 100);
-       wpabuf_free(frame);
        if (ret) {
                wpa_printf(MSG_DEBUG, "PASN: Failed sending 3st auth frame");
+               wpabuf_free(frame);
                goto fail;
        }
 
+       pasn->frame = frame;
        wpa_printf(MSG_DEBUG, "PASN: Success sending last frame. Store PTK");
 
        pasn->status = WLAN_STATUS_SUCCESS;
index 12d00ef3e5b9666965e55f1dad31c2cb0844afe1..8e2049289d2da77ae63418d6e3569e8e7763878f 100644 (file)
@@ -639,6 +639,8 @@ done:
        wpa_printf(MSG_DEBUG,
                   "PASN: Building frame 2: success; resp STA=" MACSTR,
                   MAC2STR(peer_addr));
+       wpabuf_free(pasn->frame);
+       pasn->frame = NULL;
 
        ret = pasn->send_mgmt(pasn->cb_ctx, wpabuf_head_u8(buf),
                              wpabuf_len(buf), 0, pasn->freq, 0);
@@ -646,7 +648,7 @@ done:
                wpa_printf(MSG_INFO, "send_auth_reply: Send failed");
 
        wpabuf_free(rsn_buf);
-       wpabuf_free(buf);
+       pasn->frame = buf;
        return ret;
 fail:
        wpabuf_free(wrapped_data_buf);
index 89edad49e5e2615e4262532676d6e47422e49bf7..a46fe46b1ff9fb4ea787d8612a3e86374a114f6d 100644 (file)
@@ -806,6 +806,9 @@ int wpas_pasn_auth_rx(struct wpa_supplicant *wpa_s,
        if (!wpa_s->pasn_auth_work)
                return -2;
 
+       wpabuf_free(pasn->frame);
+       pasn->frame = NULL;
+
        pasn_register_callbacks(pasn, wpa_s, wpas_pasn_send_mlme, NULL);
        ret = wpa_pasn_auth_rx(pasn, (const u8 *) mgmt, len, &pasn_data);
        if (ret == 0) {