diff mbox series

[04/12] nl80211: Allow Tx status for authentication frames

Message ID 20200224091437.15212-5-ilan.peer@intel.com
State Accepted
Headers show
Series Preparations for Pre association Security Negotiation(PASN) Support | expand

Commit Message

Peer, Ilan Feb. 24, 2020, 9:14 a.m. UTC
To support PASN authentication flow, where authentication
frames are sent by the wpa_supplicant using send_mlme() callback,
modify the logic in driver_nl80211 to also send EVENT_TX_STATUS
for authentication frames.

Signed-off-by: Ilan Peer <ilan.peer@intel.com>
---
 src/drivers/driver_nl80211_event.c | 39 ++++++++++++++++++------------
 1 file changed, 23 insertions(+), 16 deletions(-)
diff mbox series

Patch

diff --git a/src/drivers/driver_nl80211_event.c b/src/drivers/driver_nl80211_event.c
index 8327644fb1..ec2b643a7e 100644
--- a/src/drivers/driver_nl80211_event.c
+++ b/src/drivers/driver_nl80211_event.c
@@ -683,29 +683,36 @@  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 (WLAN_FC_GET_TYPE(fc) != WLAN_FC_TYPE_MGMT)
+		return;
+
 	if (!is_ap_interface(drv->nlmode)) {
-		u64 cookie_val;
+		if (WLAN_FC_GET_STYPE(fc) == WLAN_FC_STYPE_ACTION) {
+			u64 cookie_val;
 
-		if (!cookie)
-			return;
+			if (!cookie)
+				return;
 
-		cookie_val = nla_get_u64(cookie);
-		wpa_printf(MSG_DEBUG,
-			   "nl80211: Frame TX status: cookie=0x%llx%s (ack=%d)",
-			   (long long unsigned int) cookie_val,
-			   cookie_val == drv->send_frame_cookie ?
-			   " (match)" : " (unknown)", ack != NULL);
-		if (cookie_val != drv->send_frame_cookie)
-			return;
+			cookie_val = nla_get_u64(cookie);
+			wpa_printf(MSG_DEBUG,
+				   "nl80211: Frame TX status: cookie=0x%llx%s (ack=%d)",
+				   (long long unsigned int) cookie_val,
+				   cookie_val == drv->send_frame_cookie ?
+				   " (match)" : " (unknown)", ack != NULL);
+			if (cookie_val != drv->send_frame_cookie)
+				return;
+		} else if (WLAN_FC_GET_STYPE(fc) == WLAN_FC_STYPE_AUTH) {
+			wpa_printf(MSG_DEBUG,
+				   "nl80211: Auth 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);