mirror of
https://github.com/hanwckf/immortalwrt-mt798x.git
synced 2025-01-10 19:12:33 +08:00
77667a7eb6
If authentication fails repeatedly e.g. because of a weak signal, the link can end up in blocked state. If one of the nodes tries to establish a link again before it is unblocked on the other side, it will block the link to that other side. The same happens on the other side when it unblocks the link. In that scenario, the link never recovers on its own. To fix this, allow restarting authentication even if the link is in blocked state, but don't initiate the attempt until the blocked period is over. Signed-off-by: Felix Fietkau <nbd@nbd.name> (cherry-picked from commit f84053af5c0b0a159ea4d3e90b0c06574b4fde8d)
117 lines
3.6 KiB
Diff
117 lines
3.6 KiB
Diff
From 53f8fdb534d5222a0e852e38afde3f49832ace06 Mon Sep 17 00:00:00 2001
|
|
From: =?UTF-8?q?Rapha=C3=ABl=20M=C3=A9lotte?= <raphael.melotte@mind.be>
|
|
Date: Thu, 26 Nov 2020 09:27:40 +0100
|
|
Subject: [PATCH] hostapd: Add an option to notify management frames on
|
|
ctrl_iface
|
|
MIME-Version: 1.0
|
|
Content-Type: text/plain; charset=UTF-8
|
|
Content-Transfer-Encoding: 8bit
|
|
|
|
In some contexts (e.g. Multi-AP) it can be useful to have access to
|
|
some of the management frames in upper layers (e.g. to be able to
|
|
process the content of association requests externally).
|
|
|
|
Add 'notify_mgmt_frames'. When enabled, it will notify the ctrl_iface
|
|
when a management frame arrives using 'AP_MGMT_FRAME_RECEIVED'.
|
|
|
|
Note that to avoid completely flooding the ctrl_iface, not all
|
|
management frames are included (e.g. beacons are excluded).
|
|
|
|
Signed-off-by: Raphaël Mélotte <raphael.melotte@mind.be>
|
|
---
|
|
hostapd/config_file.c | 2 ++
|
|
hostapd/hostapd.conf | 4 ++++
|
|
src/ap/ap_config.h | 2 ++
|
|
src/ap/ieee802_11.c | 25 +++++++++++++++++++++++++
|
|
src/common/wpa_ctrl.h | 3 +++
|
|
5 files changed, 36 insertions(+)
|
|
|
|
--- a/hostapd/config_file.c
|
|
+++ b/hostapd/config_file.c
|
|
@@ -4456,6 +4456,8 @@ static int hostapd_config_fill(struct ho
|
|
bss->multicast_to_unicast = atoi(pos);
|
|
} else if (os_strcmp(buf, "broadcast_deauth") == 0) {
|
|
bss->broadcast_deauth = atoi(pos);
|
|
+ } else if (os_strcmp(buf, "notify_mgmt_frames") == 0) {
|
|
+ conf->notify_mgmt_frames = atoi(pos);
|
|
#ifdef CONFIG_DPP
|
|
} else if (os_strcmp(buf, "dpp_name") == 0) {
|
|
os_free(bss->dpp_name);
|
|
--- a/hostapd/hostapd.conf
|
|
+++ b/hostapd/hostapd.conf
|
|
@@ -571,6 +571,10 @@ wmm_ac_vo_acm=0
|
|
# Default: 1 (enabled)
|
|
#broadcast_deauth=1
|
|
|
|
+# Get notifications for management frames:
|
|
+# Default: 0 (disabled)
|
|
+#notify_mgmt_frames=0
|
|
+
|
|
##### IEEE 802.11n related configuration ######################################
|
|
|
|
# ieee80211n: Whether IEEE 802.11n (HT) is enabled
|
|
--- a/src/ap/ap_config.h
|
|
+++ b/src/ap/ap_config.h
|
|
@@ -1060,6 +1060,8 @@ struct hostapd_config {
|
|
unsigned int airtime_update_interval;
|
|
#define AIRTIME_MODE_MAX (__AIRTIME_MODE_MAX - 1)
|
|
#endif /* CONFIG_AIRTIME_POLICY */
|
|
+
|
|
+ u8 notify_mgmt_frames;
|
|
};
|
|
|
|
|
|
--- a/src/ap/ieee802_11.c
|
|
+++ b/src/ap/ieee802_11.c
|
|
@@ -4869,6 +4869,28 @@ static int handle_action(struct hostapd_
|
|
return 1;
|
|
}
|
|
|
|
+/**
|
|
+ * notify_mgmt_frame - notify of management frames on the control interface.
|
|
+ * @hapd: hostapd BSS data structure (the BSS to which the management frame was
|
|
+ * sent to)
|
|
+ * @buf: management frame data (starting from IEEE 802.11 header)
|
|
+ * @len: length of frame data in octets
|
|
+ *
|
|
+ * Notify the control interface of any management frame.
|
|
+ */
|
|
+static void notify_mgmt_frame(struct hostapd_data *hapd, const u8 *buf,
|
|
+ size_t len)
|
|
+{
|
|
+
|
|
+ int hex_len = len * 2 + 1;
|
|
+ char *hex = os_malloc(hex_len);
|
|
+
|
|
+ if (hex) {
|
|
+ wpa_snprintf_hex(hex, hex_len, buf, len);
|
|
+ wpa_msg_ctrl(hapd->msg_ctx, MSG_INFO, AP_MGMT_FRAME_RECEIVED "buf=%s", hex);
|
|
+ os_free(hex);
|
|
+ }
|
|
+}
|
|
|
|
/**
|
|
* ieee802_11_mgmt - process incoming IEEE 802.11 management frames
|
|
@@ -4960,6 +4982,9 @@ int ieee802_11_mgmt(struct hostapd_data
|
|
if (hapd->iconf->track_sta_max_num)
|
|
sta_track_add(hapd->iface, mgmt->sa, ssi_signal);
|
|
|
|
+ if (hapd->iconf->notify_mgmt_frames)
|
|
+ notify_mgmt_frame(hapd, buf, len);
|
|
+
|
|
switch (stype) {
|
|
case WLAN_FC_STYPE_AUTH:
|
|
wpa_printf(MSG_DEBUG, "mgmt::auth");
|
|
--- a/src/common/wpa_ctrl.h
|
|
+++ b/src/common/wpa_ctrl.h
|
|
@@ -396,6 +396,9 @@ extern "C" {
|
|
#define BIT(x) (1U << (x))
|
|
#endif
|
|
|
|
+/* Event triggered for received management frame */
|
|
+#define AP_MGMT_FRAME_RECEIVED "AP-MGMT-FRAME-RECEIVED "
|
|
+
|
|
/* BSS command information masks */
|
|
|
|
#define WPA_BSS_MASK_ALL 0xFFFDFFFF
|