From patchwork Fri Jun 9 09:21:30 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Wojciech Dubowik X-Patchwork-Id: 773744 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from bombadil.infradead.org (bombadil.infradead.org [65.50.211.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3wkcK96HRcz9s8N for ; Fri, 9 Jun 2017 19:23:09 +1000 (AEST) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="n3DSz22e"; dkim-atps=neutral DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender: Content-Transfer-Encoding:Content-Type:MIME-Version:Cc:List-Subscribe: List-Help:List-Post:List-Archive:List-Unsubscribe:List-Id:Message-Id:Date: Subject:To:From:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:In-Reply-To: References:List-Owner; bh=h5e/odTpTJwuLDV3+8tCtFEn/VttXA9NM/r8a1ecgdc=; b=n3D Sz22emZL6eVRenDHc3Du3itJCRs3NUZwFJ9Rf18Kw8JhXMBjantZpvqNu1iNoqJfOEmjcNqWMvy+Q 4hGSsoy3b3xFoxRjB6Hr9aODmfw80RPfyibpxXtEFm3P2wRVgDWhnVZmQS0x+9W6cQ4PAfLS0kEPm 9eOXK6a+B7I6t1xRNFAyvKspAbL+n0n//+49A8lUB5kM4u6e1R93FviKzk3+5gEUOq0szHsCIANNT 2ficGBu+iZKgwBxddcHAkk+UCv6efk/XYdIz41lACpGeLi3Ndor97Le+Zb2rOKGkVF2XQDEeSjyOH MR2uos2GMs2O/8dTz1ixhw26bx6+k4w==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.87 #1 (Red Hat Linux)) id 1dJG7w-0005kL-RG; Fri, 09 Jun 2017 09:22:44 +0000 Received: from mail.neratec.com ([46.140.151.2]) by bombadil.infradead.org with esmtps (Exim 4.87 #1 (Red Hat Linux)) id 1dJG7N-00053l-2x for hostap@lists.infradead.org; Fri, 09 Jun 2017 09:22:25 +0000 Received: from localhost (localhost [127.0.0.1]) by mail.neratec.com (Postfix) with ESMTP id 2C3FACE02A6; Fri, 9 Jun 2017 11:21:39 +0200 (CEST) Received: from mail.neratec.com ([127.0.0.1]) by localhost (mail.neratec.com [127.0.0.1]) (amavisd-new, port 10032) with ESMTP id 5slFXByRCj0R; Fri, 9 Jun 2017 11:21:39 +0200 (CEST) Received: from localhost (localhost [127.0.0.1]) by mail.neratec.com (Postfix) with ESMTP id 0F057CE02A7; Fri, 9 Jun 2017 11:21:39 +0200 (CEST) X-Virus-Scanned: amavisd-new at neratec.com Received: from mail.neratec.com ([127.0.0.1]) by localhost (mail.neratec.com [127.0.0.1]) (amavisd-new, port 10026) with ESMTP id cUDh27Ebe1CY; Fri, 9 Jun 2017 11:21:38 +0200 (CEST) Received: from wlanTS2.neratec.local (unknown [192.168.11.196]) by mail.neratec.com (Postfix) with ESMTPSA id D7C10CE02A6; Fri, 9 Jun 2017 11:21:38 +0200 (CEST) From: Wojciech Dubowik To: hostap@lists.infradead.org Subject: [PATCH] wpa_supplicant: Use nl80211_send_eapol_data for station Date: Fri, 9 Jun 2017 11:21:30 +0200 Message-Id: <1497000090-21105-1-git-send-email-Wojciech.Dubowik@neratec.com> X-Mailer: git-send-email 2.7.4 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20170609_022209_642181_F059E7CE X-CRM114-Status: GOOD ( 11.36 ) X-Spam-Score: -1.9 (-) X-Spam-Report: SpamAssassin version 3.4.1 on bombadil.infradead.org summary: Content analysis details: (-1.9 points) pts rule name description ---- ---------------------- -------------------------------------------------- -0.0 T_RP_MATCHES_RCVD Envelope sender domain matches handover relay domain -0.0 SPF_PASS SPF: sender matches SPF record -1.9 BAYES_00 BODY: Bayes spam probability is 0 to 1% [score: 0.0000] X-BeenThere: hostap@lists.infradead.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Wojciech Dubowik MIME-Version: 1.0 Sender: "Hostap" Errors-To: hostap-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org Supplicant is using generic L2 send function for EAPOL messages which doesn't give back status whether frame has been acked or not. It can lead to wrong wpa states when EAPOL 4/4 is lost i.e. client is in connected state but keys aren't established on AP side. Fix that by using nl80211_send_eapol_data as for AP side and check in conneced state that 4/4 EAPOL has been acked. Signed-off-by: Wojciech Dubowik --- src/drivers/driver.h | 12 ++++++++++++ src/drivers/driver_nl80211.c | 11 +++++++++++ wpa_supplicant/driver_i.h | 10 ++++++++++ wpa_supplicant/events.c | 17 ++++++++++++++++- wpa_supplicant/wpas_glue.c | 6 ++++++ 5 files changed, 55 insertions(+), 1 deletion(-) diff --git a/src/drivers/driver.h b/src/drivers/driver.h index 9587d06..b73679d 100644 --- a/src/drivers/driver.h +++ b/src/drivers/driver.h @@ -2665,6 +2665,18 @@ struct wpa_driver_ops { const u8 *own_addr, u32 flags); /** + * send_eapol - Send an EAPOL packet (STA only) + * @priv: private driver interface data + * @addr: Destination MAC address + * @data: EAPOL packet starting with IEEE 802.1X header + * @data_len: Length of the EAPOL packet in octets + * + * Returns: 0 on success, -1 on failure + */ + int (*send_eapol)(void *priv, const u8 *addr, const u8 *data, + size_t data_len); + + /** * sta_deauth - Deauthenticate a station (AP only) * @priv: Private driver interface data * @own_addr: Source address and BSSID for the Deauthentication frame diff --git a/src/drivers/driver_nl80211.c b/src/drivers/driver_nl80211.c index 1b7be39..60185dd 100644 --- a/src/drivers/driver_nl80211.c +++ b/src/drivers/driver_nl80211.c @@ -4844,6 +4844,16 @@ static int wpa_driver_nl80211_hapd_send_eapol( return res; } +static int wpa_driver_nl80211_send_eapol( + void *priv, const u8 *addr, const u8 *data, + size_t data_len) +{ + struct i802_bss *bss = priv; + + return nl80211_send_eapol_data(bss, addr, data, data_len); +} + + static int wpa_driver_nl80211_sta_set_flags(void *priv, const u8 *addr, unsigned int total_flags, @@ -10186,6 +10196,7 @@ const struct wpa_driver_ops wpa_driver_nl80211_ops = { .sta_add = wpa_driver_nl80211_sta_add, .sta_remove = driver_nl80211_sta_remove, .hapd_send_eapol = wpa_driver_nl80211_hapd_send_eapol, + .send_eapol = wpa_driver_nl80211_send_eapol, .sta_set_flags = wpa_driver_nl80211_sta_set_flags, .hapd_init = i802_init, .hapd_deinit = i802_deinit, diff --git a/wpa_supplicant/driver_i.h b/wpa_supplicant/driver_i.h index fa2296b..e0a177c 100644 --- a/wpa_supplicant/driver_i.h +++ b/wpa_supplicant/driver_i.h @@ -349,6 +349,16 @@ static inline int wpa_drv_hapd_send_eapol(struct wpa_supplicant *wpa_s, return -1; } +static inline int wpa_drv_send_eapol(struct wpa_supplicant *wpa_s, + const u8 *addr, const u8 *data, + size_t data_len) +{ + if (wpa_s->driver->hapd_send_eapol) + return wpa_s->driver->send_eapol(wpa_s->drv_priv, addr, + data, data_len); + return -1; +} + static inline int wpa_drv_sta_set_flags(struct wpa_supplicant *wpa_s, const u8 *addr, int total_flags, int flags_or, int flags_and) diff --git a/wpa_supplicant/events.c b/wpa_supplicant/events.c index 3a2ec64..af9bf2a 100644 --- a/wpa_supplicant/events.c +++ b/wpa_supplicant/events.c @@ -3966,13 +3966,28 @@ void wpa_supplicant_event(void *ctx, enum wpa_event_type event, } #endif /* CONFIG_AP */ break; -#ifdef CONFIG_AP case EVENT_EAPOL_TX_STATUS: +#ifdef CONFIG_AP ap_eapol_tx_status(wpa_s, data->eapol_tx_status.dst, data->eapol_tx_status.data, data->eapol_tx_status.data_len, data->eapol_tx_status.ack); +#else + wpa_dbg(wpa_s, MSG_DEBUG, + "EAPOL_TX_STATUS: ACK(%d)", + data->eapol_tx_status.ack); + if (!data->eapol_tx_status.ack && + wpa_s->wpa_state == WPA_COMPLETED) { + wpa_dbg(wpa_s, MSG_DEBUG, + "EAPOL 4/4 Not acked, disconnecting"); + wpa_s->own_disconnect_req = 1; + wpa_supplicant_deauthenticate( + wpa_s, WLAN_REASON_4WAY_HANDSHAKE_TIMEOUT); + + } +#endif break; +#ifdef CONFIG_AP case EVENT_DRIVER_CLIENT_POLL_OK: ap_client_poll_ok(wpa_s, data->client_poll.addr); break; diff --git a/wpa_supplicant/wpas_glue.c b/wpa_supplicant/wpas_glue.c index ae246f9..da81ac0 100644 --- a/wpa_supplicant/wpas_glue.c +++ b/wpa_supplicant/wpas_glue.c @@ -97,6 +97,7 @@ static u8 * wpa_alloc_eapol(const struct wpa_supplicant *wpa_s, u8 type, static int wpa_ether_send(struct wpa_supplicant *wpa_s, const u8 *dest, u16 proto, const u8 *buf, size_t len) { + int ret; #ifdef CONFIG_TESTING_OPTIONS if (wpa_s->ext_eapol_frame_io && proto == ETH_P_EAPOL) { size_t hex_len = 2 * len + 1; @@ -111,6 +112,11 @@ static int wpa_ether_send(struct wpa_supplicant *wpa_s, const u8 *dest, return 0; } #endif /* CONFIG_TESTING_OPTIONS */ + ret = wpa_drv_send_eapol(wpa_s, dest, buf, len); + if (ret < 0) + wpa_printf(MSG_DEBUG, " (%d)", ret); + else + return ret; if (wpa_s->l2) { return l2_packet_send(wpa_s->l2, dest, proto, buf, len);