]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
nl80211: Allow TX status for Authentication frames
authorIlan Peer <ilan.peer@intel.com>
Mon, 24 Feb 2020 09:14:29 +0000 (11:14 +0200)
committerJouni Malinen <j@w1.fi>
Sat, 29 Feb 2020 21:18:28 +0000 (23:18 +0200)
To support PASN authentication flow, where Authentication frames are
sent by wpa_supplicant using the send_mlme() callback, modify the logic
to also send EVENT_TX_STATUS for Authentication frames.

Signed-off-by: Ilan Peer <ilan.peer@intel.com>
src/drivers/driver_nl80211_event.c

index 8327644fb137332f79f809fbd3eec153ec2e4149..f4b0580f40ce5c63ca5a8112176374021c834771 100644 (file)
@@ -683,11 +683,16 @@ static void mlme_event_mgmt_tx_status(struct wpa_driver_nl80211_data *drv,
                                      size_t len, struct nlattr *ack)
 {
        union wpa_event_data event;
-       const struct ieee80211_hdr *hdr;
-       u16 fc;
+       const struct ieee80211_hdr *hdr = (const struct ieee80211_hdr *) frame;
+       u16 fc = le_to_host16(hdr->frame_control);
 
        wpa_printf(MSG_DEBUG, "nl80211: Frame TX status event");
-       if (!is_ap_interface(drv->nlmode)) {
+
+       if (WLAN_FC_GET_TYPE(fc) != WLAN_FC_TYPE_MGMT)
+               return;
+
+       if (!is_ap_interface(drv->nlmode) &&
+           WLAN_FC_GET_STYPE(fc) == WLAN_FC_STYPE_ACTION) {
                u64 cookie_val;
 
                if (!cookie)
@@ -701,11 +706,13 @@ static void mlme_event_mgmt_tx_status(struct wpa_driver_nl80211_data *drv,
                           " (match)" : " (unknown)", ack != NULL);
                if (cookie_val != drv->send_frame_cookie)
                        return;
+       } else if (!is_ap_interface(drv->nlmode) &&
+                  WLAN_FC_GET_STYPE(fc) == WLAN_FC_STYPE_AUTH) {
+               wpa_printf(MSG_DEBUG,
+                          "nl80211: Authentication frame TX status: ack=%d",
+                          !!ack);
        }
 
-       hdr = (const struct ieee80211_hdr *) frame;
-       fc = le_to_host16(hdr->frame_control);
-
        os_memset(&event, 0, sizeof(event));
        event.tx_status.type = WLAN_FC_GET_TYPE(fc);
        event.tx_status.stype = WLAN_FC_GET_STYPE(fc);