hostapd: update to 2026-07-09

Update to latest version from 2.12 branch

Manually edit patches:
- 110-mbedtls-TLS-crypto-option-initial-port.patch
- 140-tests-Makefile-make-run-tests-with-CONFIG_TLS.patch
- 780-Implement-APuP-Access-Point-Micro-Peering.patch

Restored previously removed patch:
- 060-nl80211-fix-reporting-spurious-frame-events.patch

Removed upstreamed patches:
- 001-AP-MLD-Fix-link-ID-validation-in-Basic-MLE-parsing.patch
- 002-BSS-Add-bounds-check-for-link_id-in-Basic-MLE-parsin.patch
- 003-MLD-Validate-MLE-Link-ID-fields-in-association-rejec.patch
- 004-Verify-MLD-link-ID-validity-in-get_basic_mle_link_id.patch
- 005-MLD-Verify-link-ID-validity-in-MLE-in-reconfiguratio.patch
- 006-AP-MLD-Verify-AP-MLD-link-ID-validity-before-updatin.patch
- 007-MLD-Fix-length-check-in-common-info-for-association-.patch
- 008-BSS-Fix-validation-of-ML-common-info-length-during-s.patch

All other patches refreshed automatically

Fixes: https://github.com/openwrt/openwrt/issues/23867
Fixes: https://github.com/openwrt/openwrt/commit/89f57d48f945579fd45566240113be04f9431467

Runtime tested on: mt7622/Xiaomi redmi ax6s (openssl), mt76x8/Asus AC1200 (mbedtls) with 802.11r configuration.

Signed-off-by: Ivan Pavlov <AuthorReflex@gmail.com>
Link: https://github.com/openwrt/openwrt/pull/24142
Signed-off-by: Jonas Jelonek <jelonek.jonas@gmail.com>
This commit is contained in:
Ivan Pavlov authored and Jonas Jelonek committed 2026-07-26 00:12:45 +02:00
1 parent 067c7603a6
commit 345404476a
44 files changed
+264 -587

No files matched your search

+3 -3
View File
@@ -9,9 +9,9 @@ PKG_RELEASE:=2
PKG_SOURCE_URL:=https://w1.fi/hostap.git
PKG_SOURCE_PROTO:=git
PKG_SOURCE_DATE:=2026-04-02
PKG_SOURCE_VERSION:=b004de0bf1b54d669d358b7f33d6f474bd9719a6
PKG_MIRROR_HASH:=0b0184e600c994a1f0415f52e8af26b39f13e376a30cdf0b4f3ca1a206e52fc8
PKG_SOURCE_DATE:=2026-07-09
PKG_SOURCE_VERSION:=f08f2749aa696c4e47c5c0f591dda99951bf9fac
PKG_MIRROR_HASH:=c1a978092c8a6e43a9e1bd47e1f334637b9c4969ca741c30ff45c24539132ca4
PKG_MAINTAINER:=Felix Fietkau <nbd@nbd.name>
PKG_LICENSE:=BSD-3-Clause
@@ -1,43 +0,0 @@
From 46dd5a4ffc9bcf44cf8fc45120b3e1e5ec922187 Mon Sep 17 00:00:00 2001
From: Jouni Malinen <jouni.malinen@oss.qualcomm.com>
Date: Tue, 31 Mar 2026 23:24:04 +0300
Subject: AP MLD: Fix link ID validation in Basic MLE parsing
Link ID 15 can be indicated in the field, but that is not a valid value
and must be rejected to avoid issues pointing beyond the array of links
for a non-AP MLD. Without this, an invalid MLE could result in writing
beyond the end of the buffer and causing process termination or
unexpected behavior.
Fixes: 5f5db9366cde ("AP: MLO: Process Multi-Link element from (Re)Association Request frame")
Signed-off-by: Jouni Malinen <jouni.malinen@oss.qualcomm.com>
---
src/ap/ieee802_11_eht.c | 10 ++++++++--
1 file changed, 8 insertions(+), 2 deletions(-)
--- a/src/ap/ieee802_11_eht.c
+++ b/src/ap/ieee802_11_eht.c
@@ -1382,6 +1382,7 @@ u16 hostapd_process_ml_assoc_req(struct
u16 control;
const u8 *sub_elem_end;
int num_frag_subelems;
+ u8 link_id;
num_frag_subelems =
ieee802_11_defrag_mle_subelem(mlbuf, pos,
@@ -1433,8 +1434,13 @@ u16 hostapd_process_ml_assoc_req(struct
goto out;
}
control = WPA_GET_LE16(pos);
- link_info = &info->links[control &
- BASIC_MLE_STA_CTRL_LINK_ID_MASK];
+ link_id = control & BASIC_MLE_STA_CTRL_LINK_ID_MASK;
+ if (link_id >= MAX_NUM_MLD_LINKS) {
+ wpa_printf(MSG_DEBUG,
+ "MLD: Invalid Link ID in Per-STA Profile subelement");
+ goto out;
+ }
+ link_info = &info->links[link_id];
pos += 2;
if (!(control & BASIC_MLE_STA_CTRL_COMPLETE_PROFILE)) {
@@ -1,38 +0,0 @@
From aa9d345887389a251c63a3781d2ad2940d079193 Mon Sep 17 00:00:00 2001
From: Amarnath Hullur Subramanyam <amarnathhs@google.com>
Date: Thu, 30 Apr 2026 18:24:35 -0700
Subject: BSS: Add bounds check for link_id in Basic MLE parsing
In wpa_bss_parse_basic_ml_element() in bss.c, an extracted link_id is
used without validation against the maximum allowed links
(MAX_NUM_MLD_LINKS). Processing a malformed Basic Multi-Link element
(MLE) with an out-of-bounds link_id could lead to memory corruption.
However, the modified location is within the body of the received frame
and as such, this does not result in additional issues since that area
is controlled by the transmitter of the frame. In any case, it is better
to be explicit with validating the Link ID value.
This commit introduces a strict bounds check immediately after link_id
extraction. If link_id exceeds or equals MAX_NUM_MLD_LINKS, parsing is
gracefully aborted with a debug log entry.
Fixes: de5e01010cb2 ("wpa_supplicant: Support ML probe request")
Signed-off-by: Amarnath Hullur Subramanyam <amarnathhs@google.com>
---
wpa_supplicant/bss.c | 5 +++++
1 file changed, 5 insertions(+)
--- a/wpa_supplicant/bss.c
+++ b/wpa_supplicant/bss.c
@@ -2055,6 +2055,11 @@ void wpa_bss_parse_basic_ml_element(stru
goto out;
link_id = ml_basic_common_info->variable[0] & EHT_ML_LINK_ID_MSK;
+ if (link_id >= MAX_NUM_MLD_LINKS) {
+ wpa_printf(MSG_DEBUG, "MLD: Invalid link ID %u in Basic MLE",
+ link_id);
+ goto out;
+ }
os_memcpy(bss->mld_addr, ml_basic_common_info->mld_addr, ETH_ALEN);
@@ -1,45 +0,0 @@
From a8531e3d871e6fa72f2f85d91e9f787326b2af8b Mon Sep 17 00:00:00 2001
From: Jouni Malinen <jouni.malinen@oss.qualcomm.com>
Date: Tue, 31 Mar 2026 23:16:08 +0300
Subject: MLD: Validate MLE Link ID fields in association rejection case
The Link ID Info field in the Common Info field needs to ignore the
reserved bits to be more extensible for future. Both that link ID for
the association link and the link IDs for other links need to be
verified to be within the valid range (0-14), so check that here. The
parsed link ID was not used for anything yet, but it is better to make
sure this in theory common parser is not exposing invalid data to the
caller should it be used for additional purposes in the future.
Signed-off-by: Jouni Malinen <jouni.malinen@oss.qualcomm.com>
---
wpa_supplicant/events.c | 11 ++++++++++-
1 file changed, 10 insertions(+), 1 deletion(-)
--- a/wpa_supplicant/events.c
+++ b/wpa_supplicant/events.c
@@ -4318,7 +4318,12 @@ static unsigned int wpas_ml_parse_assoc(
pos = common_info->variable;
/* Store the information for the association link */
- ml_info[i].link_id = *pos;
+ ml_info[i].link_id = *pos & EHT_ML_LINK_ID_MSK;
+ if (ml_info[i].link_id >= MAX_NUM_MLD_LINKS) {
+ wpa_printf(MSG_DEBUG,
+ "MLD: Invalid Link ID value for assoc link");
+ goto out;
+ }
pos++;
/* Skip the BSS Parameters Change Count */
@@ -4474,6 +4479,10 @@ static unsigned int wpas_ml_parse_assoc(
MAC2STR(pos + 1), nstr_bitmap_len);
ml_info[i].link_id = ctrl & BASIC_MLE_STA_CTRL_LINK_ID_MASK;
+ if (ml_info[i].link_id >= MAX_NUM_MLD_LINKS) {
+ wpa_printf(MSG_DEBUG, "MLD: Invalid Link ID value");
+ goto out;
+ }
os_memcpy(ml_info[i].bssid, pos + 1, ETH_ALEN);
pos += sta_info_len;
@@ -1,38 +0,0 @@
From 56216d113909650ae59621dc2dd16157afb94948 Mon Sep 17 00:00:00 2001
From: Jouni Malinen <jouni.malinen@oss.qualcomm.com>
Date: Mon, 18 May 2026 11:57:02 +0300
Subject: Verify MLD link ID validity in get_basic_mle_link_id()
Link ID is 0..14, so ignore value 15 if an invalid frame is processed.
It does not look like the returned value was actually used to reference
any local array, but in any case, it is better to not return an invalid
value to reduce risk for unexpected behavior in the future.
Signed-off-by: Jouni Malinen <jouni.malinen@oss.qualcomm.com>
---
src/common/ieee802_11_common.c | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
--- a/src/common/ieee802_11_common.c
+++ b/src/common/ieee802_11_common.c
@@ -3714,6 +3714,7 @@ int get_basic_mle_link_id(const u8 *buf,
ETH_ALEN; /* MLD MAC Address field (Basic) */
size_t common_info_limit;
u8 common_info_len;
+ u8 link_id;
if (len < MULTI_LINK_CONTROL_LEN)
return -1;
@@ -3735,7 +3736,11 @@ int get_basic_mle_link_id(const u8 *buf,
if (link_id_pos + EHT_ML_LINK_ID_LEN > common_info_limit)
return -1;
- return buf[link_id_pos] & BASIC_MLE_STA_CTRL_LINK_ID_MASK;
+ link_id = buf[link_id_pos] & BASIC_MLE_STA_CTRL_LINK_ID_MASK;
+ if (link_id >= MAX_NUM_MLD_LINKS)
+ return -1;
+
+ return link_id;
}
@@ -1,49 +0,0 @@
From e4bd3442c2223802bf8c4a4d868e3b9443c7caf4 Mon Sep 17 00:00:00 2001
From: Jouni Malinen <jouni.malinen@oss.qualcomm.com>
Date: Mon, 18 May 2026 12:13:21 +0300
Subject: MLD: Verify link ID validity in MLE in reconfiguration cases
Ignore or reject invalid link ID value 15 in ML reconfiguration.
Signed-off-by: Jouni Malinen <jouni.malinen@oss.qualcomm.com>
---
src/ap/ieee802_11_eht.c | 2 ++
wpa_supplicant/bss.c | 3 ++-
wpa_supplicant/wnm_sta.c | 3 ++-
3 files changed, 6 insertions(+), 2 deletions(-)
--- a/src/ap/ieee802_11_eht.c
+++ b/src/ap/ieee802_11_eht.c
@@ -2166,6 +2166,8 @@ hostapd_parse_link_reconf_req_sta_profil
link_id = sta_control & EHT_PER_STA_RECONF_CTRL_LINK_ID_MSK;
wpa_printf(MSG_DEBUG, "MLD: Per-STA profile for link=%u", link_id);
+ if (link_id >= MAX_NUM_MLD_LINKS)
+ goto out;
reconf_type_mask =
sta_control & EHT_PER_STA_RECONF_CTRL_OP_UPDATE_TYPE_MSK;
--- a/wpa_supplicant/bss.c
+++ b/wpa_supplicant/bss.c
@@ -2243,7 +2243,8 @@ u16 wpa_bss_parse_reconf_ml_element(stru
u8 link_id;
link_id = control & EHT_PER_STA_RECONF_CTRL_LINK_ID_MSK;
- removed_links |= BIT(link_id);
+ if (link_id < MAX_NUM_MLD_LINKS)
+ removed_links |= BIT(link_id);
}
pos += 2 + sub_elem_len;
--- a/wpa_supplicant/wnm_sta.c
+++ b/wpa_supplicant/wnm_sta.c
@@ -546,7 +546,8 @@ static void wnm_parse_neighbor_report_mu
control = le_to_host16(sta_prof->sta_control);
link_id = control & EHT_PER_STA_RECONF_CTRL_LINK_ID_MSK;
- rep->mld_links |= BIT(link_id);
+ if (link_id < MAX_NUM_MLD_LINKS)
+ rep->mld_links |= BIT(link_id);
}
pos += 2 + sub_elem_len;
@@ -1,37 +0,0 @@
From ce1a8612e309fe86133ecf05ffb452b0bdf3b035 Mon Sep 17 00:00:00 2001
From: Jouni Malinen <jouni.malinen@oss.qualcomm.com>
Date: Mon, 18 May 2026 15:45:15 +0300
Subject: AP MLD: Verify AP MLD link ID validity before updating bitmap of
links
Link ID is 0..14, so ignore value 15 if an invalid frame is processed.
It does not look like the invalid value was actually used to reference
any local array, but in any case, it is better to not mark an invalid
link as being specified.
Signed-off-by: Jouni Malinen <jouni.malinen@oss.qualcomm.com>
---
src/ap/beacon.c | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
--- a/src/ap/beacon.c
+++ b/src/ap/beacon.c
@@ -1411,6 +1411,7 @@ static bool parse_ml_probe_req(const str
for_each_element_id(sub, 0, pos, len) {
const struct ieee80211_eht_per_sta_profile *sta;
u16 sta_control;
+ u8 link_id;
if (*links == 0xffff)
*links = 0;
@@ -1430,7 +1431,9 @@ static bool parse_ml_probe_req(const str
* partial profile was requested.
*/
sta_control = le_to_host16(sta->sta_control);
- *links |= BIT(sta_control & BASIC_MLE_STA_CTRL_LINK_ID_MASK);
+ link_id = sta_control & BASIC_MLE_STA_CTRL_LINK_ID_MASK;
+ if (link_id < MAX_NUM_MLD_LINKS)
+ *links |= BIT(link_id);
}
if (!for_each_element_completed(sub, pos, len)) {
@@ -1,37 +0,0 @@
From 41c86a2ebed50567c73de23c102c2bf83eb883f2 Mon Sep 17 00:00:00 2001
From: Jouni Malinen <jouni.malinen@oss.qualcomm.com>
Date: Tue, 31 Mar 2026 17:47:03 +0300
Subject: MLD: Fix length check in common info for association failure cases
It is not sufficient to check that the indicated common info length is
sufficiently large to contain the information; there needs to be a check
for the indicated value to not be too large to go beyond the end of the
MLE as well. Without this, invalid MLE might result in ml_len wrapping
around to a huge value and reading beyond the end of the buffer for the
received frame. This could result in process termination.
Add the missed check for the Common Info field not being truncated in
the MLE in association failure cases.
Fixes: a58a0c592e20 ("MLD: Fix Multi-Link element parsing for association failures")
Signed-off-by: Jouni Malinen <jouni.malinen@oss.qualcomm.com>
---
wpa_supplicant/events.c | 7 +++++++
1 file changed, 7 insertions(+)
--- a/wpa_supplicant/events.c
+++ b/wpa_supplicant/events.c
@@ -4306,6 +4306,13 @@ static unsigned int wpas_ml_parse_assoc(
goto out;
}
+ if (sizeof(*ml) + common_info->len > ml_len) {
+ wpa_printf(MSG_DEBUG,
+ "MLD: Truncated common info (common_info->len=%u ml_len=%zu)",
+ common_info->len, ml_len);
+ goto out;
+ }
+
wpa_printf(MSG_DEBUG, "MLD: address: " MACSTR,
MAC2STR(common_info->mld_addr));
@@ -1,55 +0,0 @@
From 595194d0305189922a057e8ea8b743a1bd8d2d29 Mon Sep 17 00:00:00 2001
From: Jouni Malinen <jouni.malinen@oss.qualcomm.com>
Date: Mon, 18 May 2026 16:17:15 +0300
Subject: BSS: Fix validation of ML common info length during scan result
parsing
The validation of the ML common info length before use allowed reading
beyond the end of the element when the MSD info and EML capabilities
were claimed to be present but were not actually inclued. While this was
noticed after reading these fields and further processing of the element
was stopped, this could result in reading two bytes beyond the end of
the buffer.
Avoid this by checking the remaining length explicitly for the optiional
fields.
Fixes: 1b07e8baca13 ("BSS: Use correct AP MLD ID")
Signed-off-by: Jouni Malinen <jouni.malinen@oss.qualcomm.com>
---
wpa_supplicant/bss.c | 11 ++++++++++-
1 file changed, 10 insertions(+), 1 deletion(-)
--- a/wpa_supplicant/bss.c
+++ b/wpa_supplicant/bss.c
@@ -2006,13 +2006,20 @@ void wpa_bss_parse_basic_ml_element(stru
/* Medium Synchronization Delay Information */
if (le_to_host16(eht_ml->ml_control) &
- BASIC_MULTI_LINK_CTRL_PRES_MSD_INFO)
+ BASIC_MULTI_LINK_CTRL_PRES_MSD_INFO) {
+ if (ml_basic_common_info->len <
+ sizeof(*ml_basic_common_info) + pos + 2)
+ goto out;
pos += 2;
+ }
/* EML Capabilities */
bss->eml_capa = 0;
if (le_to_host16(eht_ml->ml_control) &
BASIC_MULTI_LINK_CTRL_PRES_EML_CAPA) {
+ if (ml_basic_common_info->len <
+ sizeof(*ml_basic_common_info) + pos + 2)
+ goto out;
bss->eml_capa =
WPA_GET_LE16(&ml_basic_common_info->variable[pos]);
pos += 2;
@@ -2020,6 +2027,8 @@ void wpa_bss_parse_basic_ml_element(stru
/* MLD Capabilities And Operations (always present, see
* control/control_mask) */
+ if (ml_basic_common_info->len < sizeof(*ml_basic_common_info) + pos + 2)
+ goto out;
bss->mld_capa = WPA_GET_LE16(&ml_basic_common_info->variable[pos]);
pos += 2;
@@ -14,7 +14,7 @@ Signed-off-by: Peter Oh <peter.oh@bowerswilkins.com>
--- a/wpa_supplicant/wpa_supplicant.c
+++ b/wpa_supplicant/wpa_supplicant.c
@@ -3048,7 +3048,7 @@ static int drv_supports_vht(struct wpa_s
@@ -3062,7 +3062,7 @@ static int drv_supports_vht(struct wpa_s
}
@@ -23,7 +23,7 @@ Signed-off-by: Peter Oh <peter.oh@bowerswilkins.com>
{
int i;
@@ -3057,7 +3057,10 @@ static bool ibss_mesh_is_80mhz_avail(int
@@ -3071,7 +3071,10 @@ static bool ibss_mesh_is_80mhz_avail(int
chan = hw_get_channel_chan(mode, i, NULL);
if (!chan ||
@@ -35,7 +35,7 @@ Signed-off-by: Peter Oh <peter.oh@bowerswilkins.com>
return false;
}
@@ -3184,7 +3187,7 @@ static void ibss_mesh_select_40mhz(struc
@@ -3198,7 +3201,7 @@ static void ibss_mesh_select_40mhz(struc
const struct wpa_ssid *ssid,
struct hostapd_hw_modes *mode,
struct hostapd_freq_params *freq,
@@ -44,7 +44,7 @@ Signed-off-by: Peter Oh <peter.oh@bowerswilkins.com>
{
int chan_idx;
struct hostapd_channel_data *pri_chan = NULL, *sec_chan = NULL;
@@ -3215,8 +3218,11 @@ static void ibss_mesh_select_40mhz(struc
@@ -3229,8 +3232,11 @@ static void ibss_mesh_select_40mhz(struc
return;
/* Check primary channel flags */
@@ -58,7 +58,7 @@ Signed-off-by: Peter Oh <peter.oh@bowerswilkins.com>
#ifdef CONFIG_HT_OVERRIDES
if (ssid->disable_ht40)
@@ -3251,8 +3257,11 @@ static void ibss_mesh_select_40mhz(struc
@@ -3265,8 +3271,11 @@ static void ibss_mesh_select_40mhz(struc
return;
/* Check secondary channel flags */
@@ -72,7 +72,7 @@ Signed-off-by: Peter Oh <peter.oh@bowerswilkins.com>
if (freq->ht_enabled) {
if (ht40 == -1) {
@@ -3330,7 +3339,7 @@ static bool ibss_mesh_select_80_160mhz(s
@@ -3344,7 +3353,7 @@ static bool ibss_mesh_select_80_160mhz(s
const struct wpa_ssid *ssid,
struct hostapd_hw_modes *mode,
struct hostapd_freq_params *freq,
@@ -81,7 +81,7 @@ Signed-off-by: Peter Oh <peter.oh@bowerswilkins.com>
static const int bw80[] = {
5180, 5260, 5500, 5580, 5660, 5745, 5825,
5955, 6035, 6115, 6195, 6275, 6355, 6435,
@@ -3383,7 +3392,7 @@ static bool ibss_mesh_select_80_160mhz(s
@@ -3397,7 +3406,7 @@ static bool ibss_mesh_select_80_160mhz(s
goto skip_80mhz;
/* Use 40 MHz if channel not usable */
@@ -90,7 +90,7 @@ Signed-off-by: Peter Oh <peter.oh@bowerswilkins.com>
goto skip_80mhz;
chwidth = CONF_OPER_CHWIDTH_80MHZ;
@@ -3425,7 +3434,7 @@ static bool ibss_mesh_select_80_160mhz(s
@@ -3439,7 +3448,7 @@ static bool ibss_mesh_select_80_160mhz(s
HE_PHYCAP_CHANNEL_WIDTH_SET_160MHZ_IN_5G) &&
(ssid->max_oper_chwidth == CONF_OPER_CHWIDTH_160MHZ ||
ssid->max_oper_chwidth == CONF_OPER_CHWIDTH_320MHZ) &&
@@ -99,7 +99,7 @@ Signed-off-by: Peter Oh <peter.oh@bowerswilkins.com>
for (j = 0; j < ARRAY_SIZE(bw160); j++) {
u8 start_chan;
@@ -3448,11 +3457,11 @@ static bool ibss_mesh_select_80_160mhz(s
@@ -3462,11 +3471,11 @@ static bool ibss_mesh_select_80_160mhz(s
EHT_PHYCAP_320MHZ_IN_6GHZ_SUPPORT_MASK) && is_6ghz &&
ssid->max_oper_chwidth == CONF_OPER_CHWIDTH_320MHZ &&
ibss_mesh_is_80mhz_avail(channel + 16 -
@@ -114,7 +114,7 @@ Signed-off-by: Peter Oh <peter.oh@bowerswilkins.com>
for (j = 0; j < ARRAY_SIZE(bw320); j += 2) {
if (freq->freq >= bw320[j] &&
freq->freq <= bw320[j + 1]) {
@@ -3481,10 +3490,12 @@ static bool ibss_mesh_select_80_160mhz(s
@@ -3495,10 +3504,12 @@ static bool ibss_mesh_select_80_160mhz(s
if (!chan)
continue;
@@ -131,7 +131,7 @@ Signed-off-by: Peter Oh <peter.oh@bowerswilkins.com>
/* Found a suitable second segment for 80+80 */
chwidth = CONF_OPER_CHWIDTH_80P80MHZ;
@@ -3539,6 +3550,7 @@ void ibss_mesh_setup_freq(struct wpa_sup
@@ -3553,6 +3564,7 @@ void ibss_mesh_setup_freq(struct wpa_sup
int obss_scan = 1;
u8 channel;
bool is_6ghz, is_24ghz;
@@ -139,7 +139,7 @@ Signed-off-by: Peter Oh <peter.oh@bowerswilkins.com>
freq->freq = ssid->frequency;
@@ -3582,9 +3594,9 @@ void ibss_mesh_setup_freq(struct wpa_sup
@@ -3596,9 +3608,9 @@ void ibss_mesh_setup_freq(struct wpa_sup
/* Setup higher BW only for 5 and 6 GHz */
if (mode->mode == HOSTAPD_MODE_IEEE80211A) {
ibss_mesh_select_40mhz(wpa_s, ssid, mode, freq, obss_scan,
@@ -68,7 +68,7 @@ Signed-off-by: Markus Theil <markus.theil@tu-ilmenau.de>
chan_idx, num_available_chandefs);
--- a/src/drivers/driver_nl80211.c
+++ b/src/drivers/driver_nl80211.c
@@ -12012,6 +12012,10 @@ static int nl80211_switch_channel(void *
@@ -12349,6 +12349,10 @@ static int nl80211_switch_channel(void *
if (ret)
goto error;
@@ -4,7 +4,7 @@ Subject: [PATCH] fix adding back stations after a missed deauth/disassoc
--- a/src/ap/ieee802_11.c
+++ b/src/ap/ieee802_11.c
@@ -6370,6 +6370,13 @@ static int add_associated_sta(struct hos
@@ -6511,6 +6511,13 @@ static int add_associated_sta(struct hos
* drivers to accept the STA parameter configuration. Since this is
* after a new FT-over-DS exchange, a new TK has been derived, so key
* reinstallation is not a concern for this case.
@@ -18,7 +18,7 @@ Subject: [PATCH] fix adding back stations after a missed deauth/disassoc
*/
wpa_printf(MSG_DEBUG, "Add associated STA " MACSTR
" (added_unassoc=%d auth_alg=%u ft_over_ds=%u reassoc=%d authorized=%d ft_tk=%d fils_tk=%d)",
@@ -6383,7 +6390,8 @@ static int add_associated_sta(struct hos
@@ -6524,7 +6531,8 @@ static int add_associated_sta(struct hos
(!(sta->flags & WLAN_STA_AUTHORIZED) ||
(reassoc && sta->ft_over_ds && sta->auth_alg == WLAN_AUTH_FT) ||
(!wpa_auth_sta_ft_tk_already_set(sta->wpa_sm) &&
@@ -26,7 +26,7 @@ Signed-off-by: David Bauer <mail@david-bauer.net>
--- a/src/drivers/driver.h
+++ b/src/drivers/driver.h
@@ -2469,6 +2469,9 @@ struct wpa_driver_capa {
@@ -2595,6 +2595,9 @@ struct wpa_driver_capa {
/** Maximum number of iterations in a single scan plan */
u32 max_sched_scan_plan_iterations;
@@ -38,7 +38,7 @@ Signed-off-by: David Bauer <mail@david-bauer.net>
--- a/src/drivers/driver_nl80211_capa.c
+++ b/src/drivers/driver_nl80211_capa.c
@@ -1004,6 +1004,10 @@ static int wiphy_info_handler(struct nl_
@@ -1370,6 +1370,10 @@ static int wiphy_info_handler(struct nl_
nla_get_u32(tb[NL80211_ATTR_MAX_SCAN_PLAN_ITERATIONS]);
}
@@ -0,0 +1,22 @@
From: Felix Fietkau <nbd@nbd.name>
Date: Tue, 26 Aug 2025 22:04:57 +0200
Subject: [PATCH] nl80211: fix reporting spurious frame events
When the nl80211 driver is shared across multiple interfaces (on the same
wiphy), nl80211_spurious_frame can send the event to the wrong interface by
using drv->ctx. Fix this by using bss->ctx instead.
Signed-off-by: Felix Fietkau <nbd@nbd.name>
---
--- a/src/drivers/driver_nl80211_event.c
+++ b/src/drivers/driver_nl80211_event.c
@@ -2874,7 +2874,7 @@ static void nl80211_spurious_frame(struc
event.rx_from_unknown.link_id = tb[NL80211_ATTR_MLO_LINK_ID] ?
nla_get_u8(tb[NL80211_ATTR_MLO_LINK_ID]) : -1;
- wpa_supplicant_event(drv->ctx, EVENT_RX_FROM_UNKNOWN, &event);
+ wpa_supplicant_event(bss->ctx, EVENT_RX_FROM_UNKNOWN, &event);
}
@@ -283,13 +283,15 @@ Signed-off-by: Glenn Strauss <gstrauss@gluelogic.com>
ifdef CONFIG_INTERNAL_AES
HOBJS += ../src/crypto/aes-internal.o
HOBJS += ../src/crypto/aes-internal-enc.o
@@ -1402,18 +1489,24 @@ SOBJS += ../src/common/sae.o
@@ -1402,6 +1489,7 @@ SOBJS += ../src/common/sae.o
SOBJS += ../src/common/sae_pk.o
SOBJS += ../src/common/dragonfly.o
SOBJS += $(AESOBJS)
+ifneq ($(CONFIG_TLS), mbedtls)
SOBJS += ../src/crypto/sha384.o
SOBJS += ../src/crypto/sha512.o
ifneq ($(CONFIG_TLS), openssl)
ifneq ($(CONFIG_TLS), linux)
ifneq ($(CONFIG_TLS), gnutls)
@@ -1415,17 +1503,22 @@ endif
SOBJS += ../src/crypto/sha256-prf.o
SOBJS += ../src/crypto/sha384-prf.o
SOBJS += ../src/crypto/sha512-prf.o
@@ -301,7 +303,11 @@ Signed-off-by: Glenn Strauss <gstrauss@gluelogic.com>
SOBJS += ../src/crypto/sha512-kdf.o
+endif
SOBJS += ../src/common/wpa_common.o
ifdef CONFIG_NO_RANDOM_POOL
CFLAGS += -DCONFIG_NO_RANDOM_POOL
else
SOBJS += ../src/crypto/random.o
endif
+ifneq ($(CONFIG_TLS), mbedtls)
SOBJS += ../src/crypto/sha1-prf.o
+endif
@@ -7770,7 +7776,7 @@ Signed-off-by: Glenn Strauss <gstrauss@gluelogic.com>
CONFIG_SIM_SIMULATOR=y
--- a/wpa_supplicant/Makefile
+++ b/wpa_supplicant/Makefile
@@ -1271,6 +1271,29 @@ endif
@@ -1276,6 +1276,29 @@ endif
CFLAGS += -DTLS_DEFAULT_CIPHERS=\"$(CONFIG_TLS_DEFAULT_CIPHERS)\"
endif
@@ -7800,7 +7806,7 @@ Signed-off-by: Glenn Strauss <gstrauss@gluelogic.com>
ifeq ($(CONFIG_TLS), gnutls)
ifndef CONFIG_CRYPTO
# default to libgcrypt
@@ -1463,9 +1486,11 @@ endif
@@ -1468,9 +1491,11 @@ endif
ifneq ($(CONFIG_TLS), openssl)
ifneq ($(CONFIG_TLS), wolfssl)
@@ -7812,7 +7818,7 @@ Signed-off-by: Glenn Strauss <gstrauss@gluelogic.com>
ifdef CONFIG_OPENSSL_INTERNAL_AES_WRAP
# Seems to be needed at least with BoringSSL
NEED_INTERNAL_AES_WRAP=y
@@ -1479,9 +1504,11 @@ endif
@@ -1484,9 +1509,11 @@ endif
ifdef NEED_INTERNAL_AES_WRAP
ifneq ($(CONFIG_TLS), linux)
@@ -7824,7 +7830,7 @@ Signed-off-by: Glenn Strauss <gstrauss@gluelogic.com>
ifdef NEED_AES_EAX
AESOBJS += ../src/crypto/aes-eax.o
NEED_AES_CTR=y
@@ -1491,35 +1518,45 @@ AESOBJS += ../src/crypto/aes-siv.o
@@ -1496,35 +1523,45 @@ AESOBJS += ../src/crypto/aes-siv.o
NEED_AES_CTR=y
endif
ifdef NEED_AES_CTR
@@ -7870,7 +7876,7 @@ Signed-off-by: Glenn Strauss <gstrauss@gluelogic.com>
ifdef NEED_AES_ENC
ifdef CONFIG_INTERNAL_AES
AESOBJS += ../src/crypto/aes-internal-enc.o
@@ -1534,12 +1571,16 @@ ifneq ($(CONFIG_TLS), openssl)
@@ -1539,12 +1576,16 @@ ifneq ($(CONFIG_TLS), openssl)
ifneq ($(CONFIG_TLS), linux)
ifneq ($(CONFIG_TLS), gnutls)
ifneq ($(CONFIG_TLS), wolfssl)
@@ -7887,7 +7893,7 @@ Signed-off-by: Glenn Strauss <gstrauss@gluelogic.com>
ifdef CONFIG_INTERNAL_SHA1
SHA1OBJS += ../src/crypto/sha1-internal.o
ifdef NEED_FIPS186_2_PRF
@@ -1551,29 +1592,37 @@ CFLAGS += -DCONFIG_NO_PBKDF2
@@ -1556,29 +1597,37 @@ CFLAGS += -DCONFIG_NO_PBKDF2
else
ifneq ($(CONFIG_TLS), openssl)
ifneq ($(CONFIG_TLS), wolfssl)
@@ -7925,7 +7931,7 @@ Signed-off-by: Glenn Strauss <gstrauss@gluelogic.com>
ifdef NEED_MD5
ifdef CONFIG_INTERNAL_MD5
MD5OBJS += ../src/crypto/md5-internal.o
@@ -1628,12 +1677,17 @@ ifneq ($(CONFIG_TLS), openssl)
@@ -1633,12 +1682,17 @@ ifneq ($(CONFIG_TLS), openssl)
ifneq ($(CONFIG_TLS), linux)
ifneq ($(CONFIG_TLS), gnutls)
ifneq ($(CONFIG_TLS), wolfssl)
@@ -7943,7 +7949,7 @@ Signed-off-by: Glenn Strauss <gstrauss@gluelogic.com>
ifdef CONFIG_INTERNAL_SHA256
SHA256OBJS += ../src/crypto/sha256-internal.o
endif
@@ -1646,50 +1700,68 @@ CFLAGS += -DCONFIG_INTERNAL_SHA512
@@ -1651,50 +1705,68 @@ CFLAGS += -DCONFIG_INTERNAL_SHA512
SHA256OBJS += ../src/crypto/sha512-internal.o
endif
ifdef NEED_TLS_PRF_SHA256
@@ -8012,7 +8018,7 @@ Signed-off-by: Glenn Strauss <gstrauss@gluelogic.com>
ifdef NEED_ASN1
OBJS += ../src/tls/asn1.o
@@ -1864,10 +1936,12 @@ ifdef CONFIG_FIPS
@@ -1869,10 +1941,12 @@ ifdef CONFIG_FIPS
CFLAGS += -DCONFIG_FIPS
ifneq ($(CONFIG_TLS), openssl)
ifneq ($(CONFIG_TLS), wolfssl)
@@ -101,7 +101,7 @@ Signed-off-by: Glenn Strauss <gstrauss@gluelogic.com>
--- a/wpa_supplicant/Makefile
+++ b/wpa_supplicant/Makefile
@@ -1282,10 +1282,6 @@ endif
@@ -1287,10 +1287,6 @@ endif
OBJS += ../src/crypto/crypto_$(CONFIG_CRYPTO).o
OBJS_p += ../src/crypto/crypto_$(CONFIG_CRYPTO).o
OBJS_priv += ../src/crypto/crypto_$(CONFIG_CRYPTO).o
@@ -695,7 +695,7 @@ Signed-off-by: Glenn Strauss <gstrauss@gluelogic.com>
tls = dev.request("GET tls_library")
+ if tls.startswith("mbed TLS"):
+ raise HwsimSkip("TLS v1.3 not supported")
ok = ['run=OpenSSL 1.1.1', 'run=OpenSSL 3.', 'wolfSSL']
ok = ['run=OpenSSL', 'wolfSSL']
for s in ok:
if s in tls:
@@ -121,11 +160,15 @@ def check_pkcs12_support(dev):
@@ -979,7 +979,7 @@ Signed-off-by: Glenn Strauss <gstrauss@gluelogic.com>
raise HwsimSkip("Crypto library does not support Brainpool curves: " + tls)
capa = dev.request("GET_CAPABILITY dpp")
ver = 1
@@ -3940,6 +3941,9 @@ def test_dpp_proto_auth_req_no_i_proto_k
@@ -3968,6 +3969,9 @@ def test_dpp_proto_auth_req_no_i_proto_k
def test_dpp_proto_auth_req_invalid_i_proto_key(dev, apdev):
"""DPP protocol testing - invalid I-proto key in Auth Req"""
@@ -989,7 +989,7 @@ Signed-off-by: Glenn Strauss <gstrauss@gluelogic.com>
run_dpp_proto_auth_req_missing(dev, 66, "Invalid Initiator Protocol Key")
def test_dpp_proto_auth_req_no_i_nonce(dev, apdev):
@@ -4035,7 +4039,12 @@ def test_dpp_proto_auth_resp_no_r_proto_
@@ -4063,7 +4067,12 @@ def test_dpp_proto_auth_resp_no_r_proto_
def test_dpp_proto_auth_resp_invalid_r_proto_key(dev, apdev):
"""DPP protocol testing - invalid R-Proto Key in Auth Resp"""
@@ -1003,7 +1003,7 @@ Signed-off-by: Glenn Strauss <gstrauss@gluelogic.com>
def test_dpp_proto_auth_resp_no_r_nonce(dev, apdev):
"""DPP protocol testing - no R-nonce in Auth Resp"""
@@ -4397,11 +4406,17 @@ def test_dpp_proto_pkex_exchange_resp_in
@@ -4425,11 +4434,17 @@ def test_dpp_proto_pkex_exchange_resp_in
def test_dpp_proto_pkex_cr_req_invalid_bootstrap_key(dev, apdev):
"""DPP protocol testing - invalid Bootstrap Key in PKEX Commit-Reveal Request"""
@@ -1088,7 +1088,7 @@ Signed-off-by: Glenn Strauss <gstrauss@gluelogic.com>
+ raise HwsimSkip("Brainpool EC group 27 not supported by mbed TLS")
+ return
if int(group) in [25]:
if not (tls.startswith("OpenSSL") and ("build=OpenSSL 1.0.2" in tls or "build=OpenSSL 1.1" in tls or "build=OpenSSL 3." in tls) and ("run=OpenSSL 1.0.2" in tls or "run=OpenSSL 1.1" in tls or "run=OpenSSL 3." in tls)):
if not (tls.startswith("OpenSSL") and ("build=OpenSSL" in tls) and ("run=OpenSSL" in tls)):
raise HwsimSkip("EC group not supported")
--- a/tests/hwsim/test_pmksa_cache.py
+++ b/tests/hwsim/test_pmksa_cache.py
@@ -1141,10 +1141,10 @@ Signed-off-by: Glenn Strauss <gstrauss@gluelogic.com>
return
+ if tls.startswith("mbed TLS"):
+ return
if not tls.startswith("OpenSSL"):
raise HwsimSkip("TLS library not supported for Suite B: " + tls)
supported = False
@@ -539,6 +541,7 @@ def test_suite_b_192_rsa_insufficient_dh
if tls.startswith("OpenSSL"):
return
raise HwsimSkip("TLS library not supported for Suite B: " + tls)
@@ -530,6 +532,7 @@ def test_suite_b_192_rsa_insufficient_dh
dev[0].connect("test-suite-b", key_mgmt="WPA-EAP-SUITE-B-192",
ieee80211w="2",
@@ -1289,7 +1289,7 @@ Signed-off-by: Glenn Strauss <gstrauss@gluelogic.com>
if (need_more_data) {
--- a/wpa_supplicant/Makefile
+++ b/wpa_supplicant/Makefile
@@ -1229,6 +1229,7 @@ TLS_FUNCS=y
@@ -1234,6 +1234,7 @@ TLS_FUNCS=y
endif
ifeq ($(CONFIG_TLS), wolfssl)
@@ -1297,7 +1297,7 @@ Signed-off-by: Glenn Strauss <gstrauss@gluelogic.com>
CFLAGS += -DCRYPTO_RSA_OAEP_SHA256
ifdef TLS_FUNCS
CFLAGS += -DWOLFSSL_DER_LOAD
@@ -1245,6 +1246,7 @@ LIBS_p += -lwolfssl -lm
@@ -1250,6 +1251,7 @@ LIBS_p += -lwolfssl -lm
endif
ifeq ($(CONFIG_TLS), openssl)
@@ -1305,7 +1305,7 @@ Signed-off-by: Glenn Strauss <gstrauss@gluelogic.com>
CFLAGS += -DCRYPTO_RSA_OAEP_SHA256
ifdef TLS_FUNCS
CFLAGS += -DEAP_TLS_OPENSSL
@@ -1272,6 +1274,7 @@ CFLAGS += -DTLS_DEFAULT_CIPHERS=\"$(CONF
@@ -1277,6 +1279,7 @@ CFLAGS += -DTLS_DEFAULT_CIPHERS=\"$(CONF
endif
ifeq ($(CONFIG_TLS), mbedtls)
@@ -1313,7 +1313,7 @@ Signed-off-by: Glenn Strauss <gstrauss@gluelogic.com>
ifndef CONFIG_CRYPTO
CONFIG_CRYPTO=mbedtls
endif
@@ -1291,6 +1294,7 @@ endif
@@ -1296,6 +1299,7 @@ endif
endif
ifeq ($(CONFIG_TLS), gnutls)
@@ -1321,7 +1321,7 @@ Signed-off-by: Glenn Strauss <gstrauss@gluelogic.com>
ifndef CONFIG_CRYPTO
# default to libgcrypt
CONFIG_CRYPTO=gnutls
@@ -1321,6 +1325,7 @@ endif
@@ -1326,6 +1330,7 @@ endif
endif
ifeq ($(CONFIG_TLS), internal)
@@ -1329,7 +1329,7 @@ Signed-off-by: Glenn Strauss <gstrauss@gluelogic.com>
ifndef CONFIG_CRYPTO
CONFIG_CRYPTO=internal
endif
@@ -1401,6 +1406,7 @@ endif
@@ -1406,6 +1411,7 @@ endif
endif
ifeq ($(CONFIG_TLS), linux)
@@ -12,7 +12,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
--- a/wpa_supplicant/dpp_supplicant.c
+++ b/wpa_supplicant/dpp_supplicant.c
@@ -5132,7 +5132,10 @@ static void wpas_dpp_chirp_start(struct
@@ -5135,7 +5135,10 @@ static void wpas_dpp_chirp_start(struct
wpa_s->own_addr, broadcast,
wpabuf_head(msg), wpabuf_len(msg),
2000, wpas_dpp_chirp_tx_status, 0) < 0)
@@ -130,7 +130,7 @@ Signed-off-by: P Praneesh <ppranees@codeaurora.org>
#undef VHT_CAP_CHECK_MAX
--- a/src/common/ieee802_11_defs.h
+++ b/src/common/ieee802_11_defs.h
@@ -1468,6 +1468,8 @@ struct ieee80211_ampe_ie {
@@ -1469,6 +1469,8 @@ struct ieee80211_ampe_ie {
#define VHT_CAP_VHT_LINK_ADAPTATION_VHT_MRQ_MFB ((u32) BIT(26) | BIT(27))
#define VHT_CAP_RX_ANTENNA_PATTERN ((u32) BIT(28))
#define VHT_CAP_TX_ANTENNA_PATTERN ((u32) BIT(29))
@@ -9,7 +9,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
--- a/hostapd/config_file.c
+++ b/hostapd/config_file.c
@@ -4959,6 +4959,8 @@ static int hostapd_config_fill(struct ho
@@ -4974,6 +4974,8 @@ static int hostapd_config_fill(struct ho
conf->punct_acs_threshold = val;
} else if (os_strcmp(buf, "mld_ap") == 0) {
bss->mld_ap = !!atoi(pos);
@@ -20,7 +20,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
wpa_printf(MSG_ERROR, "Line %d: Invalid mld_addr",
--- a/src/ap/ap_config.c
+++ b/src/ap/ap_config.c
@@ -179,6 +179,9 @@ void hostapd_config_defaults_bss(struct
@@ -180,6 +180,9 @@ void hostapd_config_defaults_bss(struct
#endif /* CONFIG_PASN */
bss->urnm_mfpr_x20 = -1;
bss->urnm_mfpr = -1;
@@ -32,7 +32,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
bss->pmksa_caching_privacy = 0;
--- a/src/ap/ap_config.h
+++ b/src/ap/ap_config.h
@@ -979,6 +979,8 @@ struct hostapd_bss_config {
@@ -991,6 +991,8 @@ struct hostapd_bss_config {
/* The AP's MLD MAC address within the AP MLD */
u8 mld_addr[ETH_ALEN];
@@ -56,7 +56,7 @@ This allows building both hostapd and wpa_supplicant as a single binary
hostapd: $(OBJS)
$(Q)$(CC) $(LDFLAGS) -o hostapd $(OBJS) $(LIBS)
@$(E) " LD " $@
@@ -1518,6 +1530,12 @@ include ../src/objs.mk
@@ -1530,6 +1542,12 @@ include ../src/objs.mk
_OBJS_VAR := SOBJS
include ../src/objs.mk
@@ -71,7 +71,7 @@ This allows building both hostapd and wpa_supplicant as a single binary
@$(E) " LD " $@
--- a/hostapd/main.c
+++ b/hostapd/main.c
@@ -744,6 +744,11 @@ fail:
@@ -749,6 +749,11 @@ fail:
return -1;
}
@@ -83,7 +83,7 @@ This allows building both hostapd and wpa_supplicant as a single binary
#ifdef CONFIG_WPS
static int gen_uuid(const char *txt_addr)
@@ -868,6 +873,8 @@ int main(int argc, char *argv[])
@@ -873,6 +878,8 @@ int main(int argc, char *argv[])
return -1;
#endif /* CONFIG_DPP */
@@ -94,7 +94,7 @@ This allows building both hostapd and wpa_supplicant as a single binary
if (c < 0)
--- a/src/ap/drv_callbacks.c
+++ b/src/ap/drv_callbacks.c
@@ -2596,8 +2596,8 @@ static void hostapd_mld_iface_disable(st
@@ -2599,8 +2599,8 @@ static void hostapd_mld_iface_disable(st
#endif /* CONFIG_IEEE80211BE */
@@ -105,7 +105,7 @@ This allows building both hostapd and wpa_supplicant as a single binary
{
struct hostapd_data *hapd = ctx;
struct sta_info *sta;
@@ -2967,7 +2967,7 @@ void wpa_supplicant_event(void *ctx, enu
@@ -2970,7 +2970,7 @@ void wpa_supplicant_event(void *ctx, enu
}
@@ -116,7 +116,7 @@ This allows building both hostapd and wpa_supplicant as a single binary
struct hapd_interfaces *interfaces = ctx;
--- a/src/drivers/driver.h
+++ b/src/drivers/driver.h
@@ -7313,8 +7313,8 @@ union wpa_event_data {
@@ -7804,8 +7804,8 @@ union wpa_event_data {
* Driver wrapper code should call this function whenever an event is received
* from the driver.
*/
@@ -127,7 +127,7 @@ This allows building both hostapd and wpa_supplicant as a single binary
/**
* wpa_supplicant_event_global - Report a driver event for wpa_supplicant
@@ -7326,7 +7326,7 @@ void wpa_supplicant_event(void *ctx, enu
@@ -7817,7 +7817,7 @@ void wpa_supplicant_event(void *ctx, enu
* Same as wpa_supplicant_event(), but we search for the interface in
* wpa_global.
*/
@@ -159,7 +159,7 @@ This allows building both hostapd and wpa_supplicant as a single binary
include ../src/build.rules
ifdef CONFIG_BUILD_PASN_SO
@@ -411,7 +412,9 @@ endif
@@ -415,7 +416,9 @@ endif
ifdef CONFIG_IBSS_RSN
NEED_RSN_AUTHENTICATOR=y
CFLAGS += -DCONFIG_IBSS_RSN
@@ -169,7 +169,7 @@ This allows building both hostapd and wpa_supplicant as a single binary
OBJS += ibss_rsn.o
endif
@@ -1020,6 +1023,10 @@ ifdef CONFIG_DYNAMIC_EAP_METHODS
@@ -1025,6 +1028,10 @@ ifdef CONFIG_DYNAMIC_EAP_METHODS
CFLAGS += -DCONFIG_DYNAMIC_EAP_METHODS
LIBS += -ldl -rdynamic
endif
@@ -180,7 +180,7 @@ This allows building both hostapd and wpa_supplicant as a single binary
endif
ifdef CONFIG_AP
@@ -1027,9 +1034,11 @@ NEED_EAP_COMMON=y
@@ -1032,9 +1039,11 @@ NEED_EAP_COMMON=y
NEED_RSN_AUTHENTICATOR=y
CFLAGS += -DCONFIG_AP
OBJS += ap.o
@@ -192,7 +192,7 @@ This allows building both hostapd and wpa_supplicant as a single binary
OBJS += ../src/ap/hostapd.o
OBJS += ../src/ap/wpa_auth_glue.o
OBJS += ../src/ap/utils.o
@@ -1121,6 +1130,12 @@ endif
@@ -1126,6 +1135,12 @@ endif
ifdef CONFIG_HS20
OBJS += ../src/ap/hs20.o
endif
@@ -205,7 +205,7 @@ This allows building both hostapd and wpa_supplicant as a single binary
endif
ifdef CONFIG_MBO
@@ -1130,7 +1145,9 @@ NEED_GAS=y
@@ -1135,7 +1150,9 @@ NEED_GAS=y
endif
ifdef NEED_RSN_AUTHENTICATOR
@@ -215,7 +215,7 @@ This allows building both hostapd and wpa_supplicant as a single binary
NEED_AES_WRAP=y
OBJS += ../src/ap/wpa_auth.o
OBJS += ../src/ap/wpa_auth_ie.o
@@ -2130,6 +2147,12 @@ wpa_priv: $(BCHECK) $(OBJS_priv)
@@ -2135,6 +2152,12 @@ wpa_priv: $(BCHECK) $(OBJS_priv)
_OBJS_VAR := OBJS
include ../src/objs.mk
@@ -228,7 +228,7 @@ This allows building both hostapd and wpa_supplicant as a single binary
wpa_supplicant: $(BCHECK) $(OBJS) $(EXTRA_progs)
$(Q)$(LDO) $(LDFLAGS) -o wpa_supplicant $(OBJS) $(LIBS) $(EXTRALIBS)
@$(E) " LD " $@
@@ -2262,6 +2285,12 @@ eap_gpsk.so: $(SRC_EAP_GPSK)
@@ -2267,6 +2290,12 @@ eap_gpsk.so: $(SRC_EAP_GPSK)
$(Q)sed -e 's|\@BINDIR\@|$(BINDIR)|g' $< >$@
@$(E) " sed" $<
@@ -278,7 +278,7 @@ This allows building both hostapd and wpa_supplicant as a single binary
os_memset(&eapol_test, 0, sizeof(eapol_test));
--- a/wpa_supplicant/events.c
+++ b/wpa_supplicant/events.c
@@ -6643,8 +6643,8 @@ static int wpas_pasn_auth(struct wpa_sup
@@ -6703,8 +6703,8 @@ static int wpas_pasn_auth(struct wpa_sup
#endif /* CONFIG_PASN */
@@ -289,7 +289,7 @@ This allows building both hostapd and wpa_supplicant as a single binary
{
struct wpa_supplicant *wpa_s = ctx;
int resched;
@@ -7638,7 +7638,7 @@ void wpa_supplicant_event(void *ctx, enu
@@ -7742,7 +7742,7 @@ void wpa_supplicant_event(void *ctx, enu
}
@@ -331,7 +331,7 @@ This allows building both hostapd and wpa_supplicant as a single binary
os_memset(&global, 0, sizeof(global));
--- a/wpa_supplicant/wpa_supplicant.c
+++ b/wpa_supplicant/wpa_supplicant.c
@@ -8259,7 +8259,6 @@ struct wpa_interface * wpa_supplicant_ma
@@ -8303,7 +8303,6 @@ struct wpa_interface * wpa_supplicant_ma
return NULL;
}
@@ -339,7 +339,7 @@ This allows building both hostapd and wpa_supplicant as a single binary
/**
* wpa_supplicant_match_existing - Match existing interfaces
* @global: Pointer to global data from wpa_supplicant_init()
@@ -8294,6 +8293,11 @@ static int wpa_supplicant_match_existing
@@ -8338,6 +8337,11 @@ static int wpa_supplicant_match_existing
#endif /* CONFIG_MATCH_IFACE */
@@ -351,7 +351,7 @@ This allows building both hostapd and wpa_supplicant as a single binary
/**
* wpa_supplicant_add_iface - Add a new network interface
@@ -8550,6 +8554,8 @@ struct wpa_global * wpa_supplicant_init(
@@ -8594,6 +8598,8 @@ struct wpa_global * wpa_supplicant_init(
#ifndef CONFIG_NO_WPA_MSG
wpa_msg_register_ifname_cb(wpa_supplicant_msg_ifname_cb);
#endif /* CONFIG_NO_WPA_MSG */
@@ -25,7 +25,7 @@ Subject: [PATCH] hostapd: build with LTO enabled (using jobserver for parallel
NOBJS = nt_password_hash.o ../src/crypto/ms_funcs.o $(SHA1OBJS)
--- a/wpa_supplicant/Makefile
+++ b/wpa_supplicant/Makefile
@@ -2154,31 +2154,31 @@ wpa_supplicant_multi.a: .config $(BCHECK
@@ -2159,31 +2159,31 @@ wpa_supplicant_multi.a: .config $(BCHECK
@$(AR) cr $@ wpa_supplicant_multi.o $(OBJS)
wpa_supplicant: $(BCHECK) $(OBJS) $(EXTRA_progs)
@@ -13,7 +13,7 @@ Signed-off-by: David Bauer <mail@david-bauer.net>
--- a/wpa_supplicant/ctrl_iface.c
+++ b/wpa_supplicant/ctrl_iface.c
@@ -14007,7 +14007,7 @@ char * wpa_supplicant_ctrl_iface_process
@@ -14234,7 +14234,7 @@ char * wpa_supplicant_ctrl_iface_process
if (wpas_ctrl_iface_coloc_intf_report(wpa_s, buf + 18))
reply_len = -1;
#endif /* CONFIG_WNM */
@@ -22,7 +22,7 @@ Signed-off-by: David Bauer <mail@david-bauer.net>
} else if (os_strncmp(buf, "DISASSOC_IMMINENT ", 18) == 0) {
if (ap_ctrl_iface_disassoc_imminent(wpa_s, buf + 18))
reply_len = -1;
@@ -14017,7 +14017,7 @@ char * wpa_supplicant_ctrl_iface_process
@@ -14244,7 +14244,7 @@ char * wpa_supplicant_ctrl_iface_process
} else if (os_strncmp(buf, "BSS_TM_REQ ", 11) == 0) {
if (ap_ctrl_iface_bss_tm_req(wpa_s, buf + 11))
reply_len = -1;
@@ -15,7 +15,7 @@ Subject: [PATCH] hostapd: support optional argument for the -v switch of
struct hapd_global {
void **drv_priv;
@@ -876,7 +876,7 @@ int main(int argc, char *argv[])
@@ -881,7 +881,7 @@ int main(int argc, char *argv[])
wpa_supplicant_event = hostapd_wpa_event;
wpa_supplicant_event_global = hostapd_wpa_event_global;
for (;;) {
@@ -24,7 +24,7 @@ Subject: [PATCH] hostapd: support optional argument for the -v switch of
if (c < 0)
break;
switch (c) {
@@ -913,6 +913,8 @@ int main(int argc, char *argv[])
@@ -918,6 +918,8 @@ int main(int argc, char *argv[])
break;
#endif /* CONFIG_DEBUG_LINUX_TRACING */
case 'v':
@@ -52,7 +52,7 @@ Subject: [PATCH] hostapd: support optional argument for the -v switch of
if (c < 0)
break;
switch (c) {
@@ -313,8 +314,12 @@ int main(int argc, char *argv[])
@@ -314,8 +315,12 @@ int main(int argc, char *argv[])
break;
#endif /* CONFIG_CTRL_IFACE_DBUS_NEW */
case 'v':
@@ -5,7 +5,7 @@ Subject: [PATCH] hostapd: support wps in hostapd_cli even when built from the
--- a/hostapd/hostapd_cli.c
+++ b/hostapd/hostapd_cli.c
@@ -409,7 +409,6 @@ static int hostapd_cli_cmd_disassociate(
@@ -411,7 +411,6 @@ static int hostapd_cli_cmd_disassociate(
}
@@ -13,7 +13,7 @@ Subject: [PATCH] hostapd: support wps in hostapd_cli even when built from the
static int hostapd_cli_cmd_signature(struct wpa_ctrl *ctrl, int argc,
char *argv[])
{
@@ -422,7 +421,6 @@ static int hostapd_cli_cmd_signature(str
@@ -424,7 +423,6 @@ static int hostapd_cli_cmd_signature(str
os_snprintf(buf, sizeof(buf), "SIGNATURE %s", argv[0]);
return wpa_ctrl_command(ctrl, buf);
}
@@ -21,7 +21,7 @@ Subject: [PATCH] hostapd: support wps in hostapd_cli even when built from the
static int hostapd_cli_cmd_sa_query(struct wpa_ctrl *ctrl, int argc,
@@ -439,7 +437,6 @@ static int hostapd_cli_cmd_sa_query(stru
@@ -441,7 +439,6 @@ static int hostapd_cli_cmd_sa_query(stru
}
@@ -29,7 +29,7 @@ Subject: [PATCH] hostapd: support wps in hostapd_cli even when built from the
static int hostapd_cli_cmd_wps_pin(struct wpa_ctrl *ctrl, int argc,
char *argv[])
{
@@ -665,7 +662,6 @@ static int hostapd_cli_cmd_wps_config(st
@@ -667,7 +664,6 @@ static int hostapd_cli_cmd_wps_config(st
ssid_hex, argv[1]);
return wpa_ctrl_command(ctrl, buf);
}
@@ -37,7 +37,7 @@ Subject: [PATCH] hostapd: support wps in hostapd_cli even when built from the
static int hostapd_cli_cmd_disassoc_imminent(struct wpa_ctrl *ctrl, int argc,
@@ -1715,13 +1711,10 @@ static const struct hostapd_cli_cmd host
@@ -1717,13 +1713,10 @@ static const struct hostapd_cli_cmd host
{ "disassociate", hostapd_cli_cmd_disassociate,
hostapd_complete_stations,
"<addr> = disassociate a station" },
@@ -51,7 +51,7 @@ Subject: [PATCH] hostapd: support wps in hostapd_cli even when built from the
{ "wps_pin", hostapd_cli_cmd_wps_pin, NULL,
"<uuid> <pin> [timeout] [addr] = add WPS Enrollee PIN" },
{ "wps_check_pin", hostapd_cli_cmd_wps_check_pin, NULL,
@@ -1746,7 +1739,6 @@ static const struct hostapd_cli_cmd host
@@ -1748,7 +1741,6 @@ static const struct hostapd_cli_cmd host
"<SSID> <auth> <encr> <key> = configure AP" },
{ "wps_get_status", hostapd_cli_cmd_wps_get_status, NULL,
"= show current WPS status" },
@@ -16,7 +16,7 @@ Subject: [PATCH] Remove some unnecessary control interface functionality
else
--- a/hostapd/ctrl_iface.c
+++ b/hostapd/ctrl_iface.c
@@ -3978,6 +3978,7 @@ static int hostapd_ctrl_iface_receive_pr
@@ -3987,6 +3987,7 @@ static int hostapd_ctrl_iface_receive_pr
reply_size);
} else if (os_strcmp(buf, "STATUS-DRIVER") == 0) {
reply_len = hostapd_drv_status(hapd, reply, reply_size);
@@ -24,7 +24,7 @@ Subject: [PATCH] Remove some unnecessary control interface functionality
} else if (os_strcmp(buf, "MIB") == 0) {
reply_len = ieee802_11_get_mib(hapd, reply, reply_size);
if (reply_len >= 0) {
@@ -4019,6 +4020,7 @@ static int hostapd_ctrl_iface_receive_pr
@@ -4028,6 +4029,7 @@ static int hostapd_ctrl_iface_receive_pr
} else if (os_strncmp(buf, "STA-NEXT ", 9) == 0) {
reply_len = hostapd_ctrl_iface_sta_next(hapd, buf + 9, reply,
reply_size);
@@ -131,7 +131,7 @@ Subject: [PATCH] Remove some unnecessary control interface functionality
static void ieee802_1x_wnm_notif_send(void *eloop_ctx, void *timeout_ctx)
--- a/src/ap/wpa_auth.c
+++ b/src/ap/wpa_auth.c
@@ -6544,6 +6544,7 @@ static const char * wpa_bool_txt(int val
@@ -6548,6 +6548,7 @@ static const char * wpa_bool_txt(int val
return val ? "TRUE" : "FALSE";
}
@@ -139,7 +139,7 @@ Subject: [PATCH] Remove some unnecessary control interface functionality
#define RSN_SUITE "%02x-%02x-%02x-%d"
#define RSN_SUITE_ARG(s) \
@@ -6696,7 +6697,7 @@ int wpa_get_mib_sta(struct wpa_state_mac
@@ -6700,7 +6701,7 @@ int wpa_get_mib_sta(struct wpa_state_mac
return len;
}
@@ -150,7 +150,7 @@ Subject: [PATCH] Remove some unnecessary control interface functionality
{
--- a/src/rsn_supp/wpa.c
+++ b/src/rsn_supp/wpa.c
@@ -4272,6 +4272,8 @@ static u32 wpa_key_mgmt_suite(struct wpa
@@ -4301,6 +4301,8 @@ static u32 wpa_key_mgmt_suite(struct wpa
}
@@ -159,7 +159,7 @@ Subject: [PATCH] Remove some unnecessary control interface functionality
#define RSN_SUITE "%02x-%02x-%02x-%d"
#define RSN_SUITE_ARG(s) \
((s) >> 24) & 0xff, ((s) >> 16) & 0xff, ((s) >> 8) & 0xff, (s) & 0xff
@@ -4353,6 +4355,7 @@ int wpa_sm_get_mib(struct wpa_sm *sm, ch
@@ -4382,6 +4384,7 @@ int wpa_sm_get_mib(struct wpa_sm *sm, ch
return (int) len;
}
@@ -169,7 +169,7 @@ Subject: [PATCH] Remove some unnecessary control interface functionality
--- a/wpa_supplicant/Makefile
+++ b/wpa_supplicant/Makefile
@@ -1078,6 +1078,9 @@ ifdef CONFIG_FILS
@@ -1083,6 +1083,9 @@ ifdef CONFIG_FILS
OBJS += ../src/ap/fils_hlp.o
endif
ifdef CONFIG_CTRL_IFACE
@@ -181,7 +181,7 @@ Subject: [PATCH] Remove some unnecessary control interface functionality
--- a/wpa_supplicant/ap.c
+++ b/wpa_supplicant/ap.c
@@ -1535,7 +1535,7 @@ int wpas_ap_wps_nfc_report_handover(stru
@@ -1538,7 +1538,7 @@ int wpas_ap_wps_nfc_report_handover(stru
#endif /* CONFIG_WPS */
@@ -201,7 +201,7 @@ Subject: [PATCH] Remove some unnecessary control interface functionality
if (wpa_s->ap_iface) {
pos += ap_ctrl_iface_wpa_get_status(wpa_s, pos,
end - pos,
@@ -13336,6 +13336,7 @@ char * wpa_supplicant_ctrl_iface_process
@@ -13563,6 +13563,7 @@ char * wpa_supplicant_ctrl_iface_process
} else if (os_strncmp(buf, "NOTE ", 5) == 0) {
wpa_printf(MSG_INFO, "NOTE: %s", buf + 5);
wpa_trace_set_context(buf + 5);
@@ -209,7 +209,7 @@ Subject: [PATCH] Remove some unnecessary control interface functionality
} else if (os_strcmp(buf, "MIB") == 0) {
reply_len = wpa_sm_get_mib(wpa_s->wpa, reply, reply_size);
if (reply_len >= 0) {
@@ -13348,6 +13349,7 @@ char * wpa_supplicant_ctrl_iface_process
@@ -13575,6 +13576,7 @@ char * wpa_supplicant_ctrl_iface_process
reply_size - reply_len);
#endif /* CONFIG_MACSEC */
}
@@ -217,7 +217,7 @@ Subject: [PATCH] Remove some unnecessary control interface functionality
} else if (os_strncmp(buf, "STATUS", 6) == 0) {
reply_len = wpa_supplicant_ctrl_iface_status(
wpa_s, buf + 6, reply, reply_size);
@@ -13835,6 +13837,7 @@ char * wpa_supplicant_ctrl_iface_process
@@ -14062,6 +14064,7 @@ char * wpa_supplicant_ctrl_iface_process
reply_len = wpa_supplicant_ctrl_iface_bss(
wpa_s, buf + 4, reply, reply_size);
#ifdef CONFIG_AP
@@ -225,7 +225,7 @@ Subject: [PATCH] Remove some unnecessary control interface functionality
} else if (os_strcmp(buf, "STA-FIRST") == 0) {
reply_len = ap_ctrl_iface_sta_first(wpa_s, reply, reply_size);
} else if (os_strncmp(buf, "STA ", 4) == 0) {
@@ -13843,12 +13846,15 @@ char * wpa_supplicant_ctrl_iface_process
@@ -14070,12 +14073,15 @@ char * wpa_supplicant_ctrl_iface_process
} else if (os_strncmp(buf, "STA-NEXT ", 9) == 0) {
reply_len = ap_ctrl_iface_sta_next(wpa_s, buf + 9, reply,
reply_size);
@@ -18,7 +18,7 @@ Subject: [PATCH] Add noscan, no_ht_coex config options
} else if (os_strcmp(buf, "ht_capab") == 0) {
--- a/src/ap/ap_config.h
+++ b/src/ap/ap_config.h
@@ -1119,6 +1119,8 @@ struct hostapd_config {
@@ -1131,6 +1131,8 @@ struct hostapd_config {
int ht_op_mode_fixed;
u16 ht_capab;
@@ -5,7 +5,7 @@ Subject: [PATCH] Allow HT40 also on 2.4GHz if noscan option is set, which also
--- a/wpa_supplicant/config.c
+++ b/wpa_supplicant/config.c
@@ -2795,6 +2795,7 @@ static const struct parse_data ssid_fiel
@@ -2827,6 +2827,7 @@ static const struct parse_data ssid_fiel
#else /* CONFIG_MESH */
{ INT_RANGE(mode, 0, 4) },
#endif /* CONFIG_MESH */
@@ -47,7 +47,7 @@ Subject: [PATCH] Allow HT40 also on 2.4GHz if noscan option is set, which also
/*
--- a/wpa_supplicant/wpa_supplicant.c
+++ b/wpa_supplicant/wpa_supplicant.c
@@ -3120,7 +3120,7 @@ static bool ibss_mesh_can_use_vht(struct
@@ -3134,7 +3134,7 @@ static bool ibss_mesh_can_use_vht(struct
const struct wpa_ssid *ssid,
struct hostapd_hw_modes *mode)
{
@@ -56,7 +56,7 @@ Subject: [PATCH] Allow HT40 also on 2.4GHz if noscan option is set, which also
return false;
if (!drv_supports_vht(wpa_s, ssid))
@@ -3194,7 +3194,7 @@ static void ibss_mesh_select_40mhz(struc
@@ -3208,7 +3208,7 @@ static void ibss_mesh_select_40mhz(struc
int i, res;
unsigned int j;
static const int ht40plus_5ghz[] = {
@@ -65,7 +65,7 @@ Subject: [PATCH] Allow HT40 also on 2.4GHz if noscan option is set, which also
149, 157, 165, 173, 184, 192
};
static const int ht40plus_6ghz[] = {
@@ -3547,7 +3547,7 @@ void ibss_mesh_setup_freq(struct wpa_sup
@@ -3561,7 +3561,7 @@ void ibss_mesh_setup_freq(struct wpa_sup
int ieee80211_mode = wpas_mode_to_ieee80211_mode(ssid->mode);
enum hostapd_hw_mode hw_mode;
struct hostapd_hw_modes *mode = NULL;
@@ -74,7 +74,7 @@ Subject: [PATCH] Allow HT40 also on 2.4GHz if noscan option is set, which also
u8 channel;
bool is_6ghz, is_24ghz;
bool dfs_enabled = wpa_s->conf->country[0] && (wpa_s->drv_flags & WPA_DRIVER_FLAGS_RADAR);
@@ -3591,6 +3591,8 @@ void ibss_mesh_setup_freq(struct wpa_sup
@@ -3605,6 +3605,8 @@ void ibss_mesh_setup_freq(struct wpa_sup
freq->he_enabled = ibss_mesh_can_use_he(wpa_s, ssid, mode,
ieee80211_mode);
freq->channel = channel;
@@ -5,7 +5,7 @@ Subject: [PATCH] rescan_immediately.patch
--- a/wpa_supplicant/wpa_supplicant.c
+++ b/wpa_supplicant/wpa_supplicant.c
@@ -6481,7 +6481,7 @@ wpa_supplicant_alloc(struct wpa_supplica
@@ -6519,7 +6519,7 @@ wpa_supplicant_alloc(struct wpa_supplica
if (wpa_s == NULL)
return NULL;
wpa_s->scan_req = INITIAL_SCAN_REQ;
@@ -5,7 +5,7 @@ Subject: [PATCH] wpa_supplicant: fix calling channel switch via wpa_cli on
--- a/wpa_supplicant/ap.c
+++ b/wpa_supplicant/ap.c
@@ -1863,6 +1863,21 @@ int ap_switch_channel(struct wpa_supplic
@@ -1866,6 +1866,21 @@ int ap_switch_channel(struct wpa_supplic
#ifdef CONFIG_CTRL_IFACE
@@ -27,7 +27,7 @@ Subject: [PATCH] wpa_supplicant: fix calling channel switch via wpa_cli on
int ap_ctrl_iface_chanswitch(struct wpa_supplicant *wpa_s, const char *pos)
{
struct csa_settings settings;
@@ -1882,12 +1897,18 @@ int ap_ctrl_iface_chanswitch(struct wpa_
@@ -1885,12 +1900,18 @@ int ap_ctrl_iface_chanswitch(struct wpa_
return -1;
ret = hostapd_parse_csa_settings(iface, pos, &settings);
@@ -1,6 +1,6 @@
--- a/src/drivers/driver_nl80211.h
+++ b/src/drivers/driver_nl80211.h
@@ -95,6 +95,7 @@ struct i802_bss {
@@ -99,6 +99,7 @@ struct i802_bss {
u64 wdev_id;
char ifname[IFNAMSIZ + 1];
char brname[IFNAMSIZ];
@@ -8,7 +8,7 @@
unsigned int added_if_into_bridge:1;
unsigned int already_in_bridge:1;
unsigned int added_bridge:1;
@@ -346,7 +347,7 @@ send_and_recv_resp(struct wpa_driver_nl8
@@ -354,7 +355,7 @@ send_and_recv_resp(struct wpa_driver_nl8
int nl80211_create_iface(struct wpa_driver_nl80211_data *drv,
const char *ifname, enum nl80211_iftype iftype,
@@ -19,17 +19,17 @@
void nl80211_remove_iface(struct wpa_driver_nl80211_data *drv, int ifidx);
--- a/src/drivers/driver_nl80211.c
+++ b/src/drivers/driver_nl80211.c
@@ -887,6 +887,7 @@ struct wiphy_idx_data {
enum nl80211_iftype nlmode;
u8 *macaddr;
@@ -894,6 +894,7 @@ struct wiphy_idx_data {
u8 use_4addr;
u64 wdev_id;
bool wdev_id_set;
+ u32 radio_mask;
};
@@ -912,6 +913,9 @@ static int netdev_info_handler(struct nl
if (tb[NL80211_ATTR_4ADDR])
info->use_4addr = nla_get_u8(tb[NL80211_ATTR_4ADDR]);
@@ -924,6 +925,9 @@ static int netdev_info_handler(struct nl
info->wdev_id_set = true;
}
+ if (tb[NL80211_ATTR_VIF_RADIO_MASK])
+ info->radio_mask = nla_get_u32(tb[NL80211_ATTR_VIF_RADIO_MASK]);
@@ -37,7 +37,7 @@
return NL_SKIP;
}
@@ -978,6 +982,20 @@ static int nl80211_get_4addr(struct i802
@@ -990,6 +994,20 @@ static int nl80211_get_4addr(struct i802
}
@@ -58,7 +58,7 @@
static int nl80211_register_beacons(struct wpa_driver_nl80211_data *drv,
struct nl80211_wiphy_data *w)
{
@@ -2584,6 +2602,8 @@ static void * wpa_driver_nl80211_drv_ini
@@ -2608,6 +2626,8 @@ static void * wpa_driver_nl80211_drv_ini
p2p_mode))
goto failed;
@@ -67,7 +67,7 @@
if (drv->capa.flags2 & WPA_DRIVER_FLAGS2_CONTROL_PORT_TX_STATUS) {
drv->control_port_ap = 1;
goto skip_wifi_status;
@@ -6531,7 +6551,7 @@ const char * nl80211_iftype_str(enum nl8
@@ -6797,7 +6817,7 @@ const char * nl80211_iftype_str(enum nl8
static int nl80211_create_iface_once(struct wpa_driver_nl80211_data *drv,
const char *ifname,
enum nl80211_iftype iftype,
@@ -76,7 +76,7 @@
int (*handler)(struct nl_msg *, void *),
void *arg)
{
@@ -6551,6 +6571,10 @@ static int nl80211_create_iface_once(str
@@ -6817,6 +6837,10 @@ static int nl80211_create_iface_once(str
if (wds && nla_put_u8(msg, NL80211_ATTR_4ADDR, wds))
goto fail;
@@ -87,7 +87,7 @@
/*
* Tell cfg80211 that the interface belongs to the socket that created
* it, and the interface should be deleted when the socket is closed.
@@ -6643,14 +6667,14 @@ static int nl80211_create_iface_once(str
@@ -6910,14 +6934,14 @@ static int nl80211_create_iface_once(str
int nl80211_create_iface(struct wpa_driver_nl80211_data *drv,
const char *ifname, enum nl80211_iftype iftype,
@@ -105,7 +105,7 @@
/* if error occurred and interface exists already */
if (ret < 0 && if_nametoindex(ifname)) {
@@ -6676,7 +6700,7 @@ int nl80211_create_iface(struct wpa_driv
@@ -6943,7 +6967,7 @@ int nl80211_create_iface(struct wpa_driv
/* Try to create the interface again */
ret = nl80211_create_iface_once(drv, ifname, iftype, addr,
@@ -114,7 +114,7 @@
}
if (ret >= 0 && is_p2p_net_interface(iftype)) {
@@ -9012,8 +9036,8 @@ static int i802_set_wds_sta(void *priv,
@@ -9308,8 +9332,8 @@ static int i802_set_wds_sta(void *priv,
if (!if_nametoindex(name)) {
if (nl80211_create_iface(drv, name,
NL80211_IFTYPE_AP_VLAN,
@@ -125,7 +125,7 @@
return -1;
if (bridge_ifname)
@@ -9386,7 +9410,8 @@ static int wpa_driver_nl80211_if_add(voi
@@ -9686,7 +9710,8 @@ static int wpa_driver_nl80211_if_add(voi
os_memset(&nonnetdev_info, 0, sizeof(nonnetdev_info));
ifidx = nl80211_create_iface(drv, ifname, nlmode, addr,
@@ -135,7 +135,7 @@
&nonnetdev_info, use_existing);
if (!nonnetdev_info.wdev_id_set || ifidx != 0) {
wpa_printf(MSG_ERROR,
@@ -9405,7 +9430,8 @@ static int wpa_driver_nl80211_if_add(voi
@@ -9705,7 +9730,8 @@ static int wpa_driver_nl80211_if_add(voi
(long long unsigned int) nonnetdev_info.wdev_id);
} else {
ifidx = nl80211_create_iface(drv, ifname, nlmode, addr,
@@ -145,7 +145,7 @@
if (use_existing && ifidx == -ENFILE) {
added = 0;
ifidx = if_nametoindex(ifname);
@@ -9475,6 +9501,8 @@ static int wpa_driver_nl80211_if_add(voi
@@ -9775,6 +9801,8 @@ static int wpa_driver_nl80211_if_add(voi
new_bss->ctx = bss_ctx;
new_bss->added_if = added;
@@ -11,7 +11,7 @@ if CONFIG_CTRL_IFACE_MIB is not defined.
--- a/hostapd/hostapd_cli.c
+++ b/hostapd/hostapd_cli.c
@@ -761,7 +761,7 @@ static int wpa_ctrl_command_sta(struct w
@@ -763,7 +763,7 @@ static int wpa_ctrl_command_sta(struct w
}
buf[len] = '\0';
@@ -14,7 +14,7 @@ Signed-hostap: Antonio Quartulli <ordex@autistici.org>
--- a/src/drivers/driver.h
+++ b/src/drivers/driver.h
@@ -1023,6 +1023,9 @@ struct wpa_driver_associate_params {
@@ -1024,6 +1024,9 @@ struct wpa_driver_associate_params {
* responsible for selecting with which BSS to associate. */
const u8 *bssid;
@@ -34,8 +34,8 @@ Signed-hostap: Antonio Quartulli <ordex@autistici.org>
#include "config.h"
@@ -2561,6 +2562,97 @@ static char * wpa_config_write_mac_value
#endif /* NO_CONFIG_WRITE */
@@ -2593,6 +2594,97 @@ static char * wpa_config_write_pasn_grou
#endif /* CONFIG_PASN */
+static int wpa_config_parse_mcast_rate(const struct parse_data *data,
@@ -132,7 +132,7 @@ Signed-hostap: Antonio Quartulli <ordex@autistici.org>
/* Helper macros for network block parser */
#ifdef OFFSET
@@ -2871,6 +2963,8 @@ static const struct parse_data ssid_fiel
@@ -2903,6 +2995,8 @@ static const struct parse_data ssid_fiel
{ INT(ap_max_inactivity) },
{ INT(dtim_period) },
{ INT(beacon_int) },
@@ -155,7 +155,7 @@ Signed-hostap: Antonio Quartulli <ordex@autistici.org>
* macsec_policy - Determines the policy for MACsec secure session
--- a/wpa_supplicant/wpa_supplicant.c
+++ b/wpa_supplicant/wpa_supplicant.c
@@ -4759,6 +4759,12 @@ static void wpas_start_assoc_cb(struct w
@@ -4784,6 +4784,12 @@ static void wpas_start_assoc_cb(struct w
params.beacon_int = ssid->beacon_int;
else
params.beacon_int = wpa_s->conf->beacon_int;
@@ -19,7 +19,7 @@ Tested-by: Simon Wunderlich <simon.wunderlich@openmesh.com>
--- a/src/drivers/driver.h
+++ b/src/drivers/driver.h
@@ -1969,6 +1969,7 @@ struct wpa_driver_mesh_join_params {
@@ -1975,6 +1975,7 @@ struct wpa_driver_mesh_join_params {
#define WPA_DRIVER_MESH_FLAG_AMPE 0x00000008
unsigned int flags;
bool handle_dfs;
@@ -29,7 +29,7 @@ Tested-by: Simon Wunderlich <simon.wunderlich@openmesh.com>
struct wpa_driver_set_key_params {
--- a/src/drivers/driver_nl80211.c
+++ b/src/drivers/driver_nl80211.c
@@ -12718,6 +12718,18 @@ static int nl80211_put_mesh_id(struct nl
@@ -13055,6 +13055,18 @@ static int nl80211_put_mesh_id(struct nl
}
@@ -48,7 +48,7 @@ Tested-by: Simon Wunderlich <simon.wunderlich@openmesh.com>
static int nl80211_put_mesh_config(struct nl_msg *msg,
struct wpa_driver_mesh_bss_params *params)
{
@@ -12779,6 +12791,7 @@ static int nl80211_join_mesh(struct i802
@@ -13116,6 +13128,7 @@ static int nl80211_join_mesh(struct i802
nl80211_put_basic_rates(msg, params->basic_rates) ||
nl80211_put_mesh_id(msg, params->meshid, params->meshid_len) ||
nl80211_put_beacon_int(msg, params->beacon_int) ||
@@ -5,7 +5,7 @@ Subject: [PATCH] Fix issues with disabling obss scan when using fixed_freq on
--- a/wpa_supplicant/wpa_supplicant.c
+++ b/wpa_supplicant/wpa_supplicant.c
@@ -3554,6 +3554,10 @@ void ibss_mesh_setup_freq(struct wpa_sup
@@ -3568,6 +3568,10 @@ void ibss_mesh_setup_freq(struct wpa_sup
freq->freq = ssid->frequency;
@@ -39,7 +39,7 @@ probe/assoc/auth requests via object subscribe.
}
@@ -244,7 +250,10 @@ int airtime_policy_new_sta(struct hostap
@@ -249,7 +255,10 @@ int airtime_policy_new_sta(struct hostap
unsigned int weight;
if (hapd->iconf->airtime_mode == AIRTIME_MODE_STATIC) {
@@ -53,7 +53,7 @@ probe/assoc/auth requests via object subscribe.
}
--- a/src/ap/beacon.c
+++ b/src/ap/beacon.c
@@ -1467,6 +1467,12 @@ void handle_probe_req(struct hostapd_dat
@@ -1471,6 +1471,12 @@ void handle_probe_req(struct hostapd_dat
int mld_id;
u16 links;
#endif /* CONFIG_IEEE80211BE */
@@ -66,7 +66,7 @@ probe/assoc/auth requests via object subscribe.
if (hapd->iconf->rssi_ignore_probe_request && ssi_signal &&
ssi_signal < hapd->iconf->rssi_ignore_probe_request)
@@ -1674,6 +1680,12 @@ void handle_probe_req(struct hostapd_dat
@@ -1678,6 +1684,12 @@ void handle_probe_req(struct hostapd_dat
}
#endif /* CONFIG_P2P */
@@ -92,7 +92,7 @@ probe/assoc/auth requests via object subscribe.
/* Proceed only if DFS is not offloaded to the driver */
--- a/src/ap/drv_callbacks.c
+++ b/src/ap/drv_callbacks.c
@@ -333,6 +333,10 @@ int hostapd_notif_assoc(struct hostapd_d
@@ -335,6 +335,10 @@ int hostapd_notif_assoc(struct hostapd_d
#endif /* CONFIG_OWE */
bool updated = false;
bool driver_acl;
@@ -103,7 +103,7 @@ probe/assoc/auth requests via object subscribe.
#ifdef CONFIG_P2P
if (hapd->p2p_group && (!hapd->started || hapd->disabled)) {
@@ -528,6 +532,12 @@ int hostapd_notif_assoc(struct hostapd_d
@@ -530,6 +534,12 @@ int hostapd_notif_assoc(struct hostapd_d
}
#endif /* CONFIG_IEEE80211BE */
@@ -116,7 +116,7 @@ probe/assoc/auth requests via object subscribe.
#ifdef CONFIG_P2P
if (elems.p2p) {
wpabuf_free(sta->p2p_ie);
@@ -1425,6 +1435,7 @@ void hostapd_event_ch_switch(struct host
@@ -1428,6 +1438,7 @@ void hostapd_event_ch_switch(struct host
wpa_msg(hapd->msg_ctx, MSG_INFO, AP_CSA_FINISHED
"freq=%d dfs=%d", freq, is_dfs);
@@ -203,7 +203,7 @@ probe/assoc/auth requests via object subscribe.
if (sae_password_track_fail(hapd, sta)) {
wpa_printf(MSG_DEBUG,
"SAE: Reject mismatching Confirm so that another password can be attempted by "
@@ -4077,7 +4078,7 @@ static void handle_auth(struct hostapd_d
@@ -4218,7 +4219,7 @@ static void handle_auth(struct hostapd_d
u16 auth_alg, auth_transaction, status_code;
u16 resp = WLAN_STATUS_SUCCESS;
struct sta_info *sta = NULL;
@@ -212,7 +212,7 @@ probe/assoc/auth requests via object subscribe.
u16 fc;
const u8 *challenge = NULL;
u8 resp_ies[2 + WLAN_AUTH_CHALLENGE_LEN];
@@ -4116,6 +4117,11 @@ static void handle_auth(struct hostapd_d
@@ -4257,6 +4258,11 @@ static void handle_auth(struct hostapd_d
else
sa = mgmt->sa;
#endif /* CONFIG_IEEE80211BE */
@@ -224,7 +224,7 @@ probe/assoc/auth requests via object subscribe.
auth_alg = le_to_host16(mgmt->u.auth.auth_alg);
auth_transaction = le_to_host16(mgmt->u.auth.auth_transaction);
@@ -4306,6 +4312,13 @@ static void handle_auth(struct hostapd_d
@@ -4447,6 +4453,13 @@ static void handle_auth(struct hostapd_d
resp = WLAN_STATUS_UNSPECIFIED_FAILURE;
goto fail;
}
@@ -238,7 +238,7 @@ probe/assoc/auth requests via object subscribe.
if (res == HOSTAPD_ACL_PENDING)
return;
@@ -6999,7 +7012,7 @@ static void handle_assoc(struct hostapd_
@@ -7190,7 +7203,7 @@ static void handle_assoc(struct hostapd_
int resp = WLAN_STATUS_SUCCESS;
u16 reply_res = WLAN_STATUS_UNSPECIFIED_FAILURE;
const u8 *pos;
@@ -247,7 +247,7 @@ probe/assoc/auth requests via object subscribe.
struct sta_info *sta;
u8 *tmp = NULL;
#ifdef CONFIG_FILS
@@ -7255,6 +7268,11 @@ static void handle_assoc(struct hostapd_
@@ -7446,6 +7459,11 @@ static void handle_assoc(struct hostapd_
left = res;
}
#endif /* CONFIG_FILS */
@@ -259,7 +259,7 @@ probe/assoc/auth requests via object subscribe.
/* followed by SSID and Supported rates; and HT capabilities if 802.11n
* is used */
@@ -7347,6 +7365,7 @@ static void handle_assoc(struct hostapd_
@@ -7538,6 +7556,7 @@ static void handle_assoc(struct hostapd_
#ifdef CONFIG_TAXONOMY
taxonomy_sta_info_assoc_req(hapd, sta, pos, left);
@@ -267,7 +267,7 @@ probe/assoc/auth requests via object subscribe.
#endif /* CONFIG_TAXONOMY */
sta->pending_wds_enable = 0;
@@ -7360,6 +7379,13 @@ static void handle_assoc(struct hostapd_
@@ -7551,6 +7570,13 @@ static void handle_assoc(struct hostapd_
}
#endif /* CONFIG_FILS */
@@ -281,7 +281,7 @@ probe/assoc/auth requests via object subscribe.
fail:
/*
@@ -7598,6 +7624,7 @@ static void handle_disassoc(struct hosta
@@ -7798,6 +7824,7 @@ static void handle_disassoc(struct hosta
(unsigned long) len);
return;
}
@@ -289,7 +289,7 @@ probe/assoc/auth requests via object subscribe.
sta = ap_get_sta(hapd, mgmt->sa);
if (!sta) {
@@ -7629,6 +7656,8 @@ static void handle_deauth(struct hostapd
@@ -7829,6 +7856,8 @@ static void handle_deauth(struct hostapd
/* Clear the PTKSA cache entries for PASN */
ptksa_cache_flush(hapd->ptksa, mgmt->sa, WPA_CIPHER_NONE);
@@ -504,7 +504,7 @@ probe/assoc/auth requests via object subscribe.
}
--- a/src/ap/wpa_auth_glue.c
+++ b/src/ap/wpa_auth_glue.c
@@ -412,6 +412,7 @@ static void hostapd_wpa_auth_psk_failure
@@ -415,6 +415,7 @@ static void hostapd_wpa_auth_psk_failure
struct hostapd_data *hapd = ctx;
wpa_msg(hapd->msg_ctx, MSG_INFO, AP_STA_POSSIBLE_PSK_MISMATCH MACSTR,
MAC2STR(addr));
@@ -671,8 +671,8 @@ probe/assoc/auth requests via object subscribe.
if (c < 0)
break;
switch (c) {
@@ -279,6 +279,9 @@ int main(int argc, char *argv[])
params.conf_p2p_dev = optarg;
@@ -280,6 +280,9 @@ int main(int argc, char *argv[])
params.conf_p2p_dev = os_rel2abs_path(optarg);
break;
#endif /* CONFIG_P2P */
+ case 'n':
@@ -8,7 +8,7 @@ as adding/removing interfaces.
--- a/wpa_supplicant/wpa_supplicant.c
+++ b/wpa_supplicant/wpa_supplicant.c
@@ -1267,6 +1267,7 @@ void wpa_supplicant_set_state(struct wpa
@@ -1276,6 +1276,7 @@ void wpa_supplicant_set_state(struct wpa
sme_sched_obss_scan(wpa_s, 0);
}
wpa_s->wpa_state = state;
@@ -16,7 +16,7 @@ as adding/removing interfaces.
#ifndef CONFIG_NO_ROBUST_AV
if (state == WPA_COMPLETED && dl_list_len(&wpa_s->active_scs_ids) &&
@@ -8392,6 +8393,8 @@ struct wpa_supplicant * wpa_supplicant_a
@@ -8436,6 +8437,8 @@ struct wpa_supplicant * wpa_supplicant_a
}
#endif /* CONFIG_P2P */
@@ -25,7 +25,7 @@ as adding/removing interfaces.
return wpa_s;
}
@@ -8418,6 +8421,8 @@ int wpa_supplicant_remove_iface(struct w
@@ -8462,6 +8465,8 @@ int wpa_supplicant_remove_iface(struct w
struct wpa_supplicant *parent = wpa_s->parent;
#endif /* CONFIG_MESH */
@@ -34,7 +34,7 @@ as adding/removing interfaces.
/* Remove interface from the global list of interfaces */
prev = global->ifaces;
if (prev == wpa_s) {
@@ -8737,6 +8742,7 @@ struct wpa_global * wpa_supplicant_init(
@@ -8781,6 +8786,7 @@ struct wpa_global * wpa_supplicant_init(
eloop_register_timeout(WPA_SUPPLICANT_CLEANUP_INTERVAL, 0,
wpas_periodic, global, NULL);
@@ -42,7 +42,7 @@ as adding/removing interfaces.
return global;
}
@@ -8809,6 +8815,8 @@ void wpa_supplicant_deinit(struct wpa_gl
@@ -8853,6 +8859,8 @@ void wpa_supplicant_deinit(struct wpa_gl
wpas_notify_supplicant_deinitialized(global);
@@ -53,7 +53,7 @@ as adding/removing interfaces.
eap_server_unregister_methods();
--- a/wpa_supplicant/wpa_supplicant_i.h
+++ b/wpa_supplicant/wpa_supplicant_i.h
@@ -15,12 +15,14 @@
@@ -15,6 +15,7 @@
#include "common/sae.h"
#include "common/wpa_ctrl.h"
#include "common/dpp.h"
@@ -61,14 +61,15 @@ as adding/removing interfaces.
#include "crypto/sha384.h"
#include "eapol_supp/eapol_supp_sm.h"
#include "wps/wps_defs.h"
#include "config_ssid.h"
@@ -22,6 +23,7 @@
#include "wmm_ac.h"
#include "pasn/pasn_common.h"
#include "nan/nan.h"
+#include "ucode.h"
extern const char *const wpa_supplicant_version;
extern const char *const wpa_supplicant_license;
@@ -756,6 +758,7 @@ struct wpa_supplicant {
@@ -762,6 +764,7 @@ struct wpa_supplicant {
unsigned char own_addr[ETH_ALEN];
unsigned char perm_addr[ETH_ALEN];
char ifname[100];
@@ -76,7 +77,7 @@ as adding/removing interfaces.
u8 hw_dfs_domain;
#ifdef CONFIG_MATCH_IFACE
int matched;
@@ -1633,6 +1636,8 @@ struct wpa_supplicant {
@@ -1647,6 +1650,8 @@ struct wpa_supplicant {
unsigned int enabled_4addr_mode:1;
unsigned int multi_bss_support:1;
unsigned int drv_authorized_port:1;
@@ -164,7 +165,7 @@ as adding/removing interfaces.
ifdef CONFIG_CODE_COVERAGE
--- a/hostapd/ctrl_iface.c
+++ b/hostapd/ctrl_iface.c
@@ -5951,6 +5951,7 @@ try_again:
@@ -5960,6 +5960,7 @@ try_again:
return -1;
}
@@ -172,7 +173,7 @@ as adding/removing interfaces.
wpa_msg_register_cb(hostapd_ctrl_iface_msg_cb);
return 0;
@@ -6052,6 +6053,7 @@ fail:
@@ -6061,6 +6062,7 @@ fail:
os_free(fname);
interface->global_ctrl_sock = s;
@@ -182,7 +183,7 @@ as adding/removing interfaces.
--- a/hostapd/main.c
+++ b/hostapd/main.c
@@ -1097,6 +1097,7 @@ int main(int argc, char *argv[])
@@ -1102,6 +1102,7 @@ int main(int argc, char *argv[])
}
hostapd_global_ctrl_iface_init(&interfaces);
@@ -190,7 +191,7 @@ as adding/removing interfaces.
if (hostapd_global_run(&interfaces, daemonize, pid_file)) {
wpa_printf(MSG_ERROR, "Failed to start eloop");
@@ -1106,6 +1107,7 @@ int main(int argc, char *argv[])
@@ -1111,6 +1112,7 @@ int main(int argc, char *argv[])
ret = 0;
out:
@@ -268,21 +269,20 @@ as adding/removing interfaces.
return 0;
}
@@ -1415,8 +1420,7 @@ static int hostapd_bss_radius_init(struc
@@ -1415,7 +1420,7 @@ static int hostapd_bss_radius_init(struc
* initialized. Most of the modules that are initialized here will be
* deinitialized in hostapd_cleanup().
*/
-static int hostapd_setup_bss(struct hostapd_data *hapd, int first,
- bool start_beacon)
+int hostapd_setup_bss(struct hostapd_data *hapd, int first, bool start_beacon)
-static int hostapd_setup_bss(struct hostapd_data *hapd, bool first,
+int hostapd_setup_bss(struct hostapd_data *hapd, bool first,
bool start_beacon)
{
struct hostapd_bss_config *conf = hapd->conf;
u8 ssid[SSID_MAX_LEN + 1];
@@ -1458,12 +1462,17 @@ static int hostapd_setup_bss(struct host
@@ -1458,12 +1463,17 @@ static int hostapd_setup_bss(struct host
if (!first || first == -1) {
if (!first) {
u8 *addr = hapd->own_addr;
+ bool use_existing = first == -1;
+ bool use_existing = !first;
+#ifdef CONFIG_IEEE80211BE
+ if (hapd->conf->mld_ap)
@@ -297,7 +297,7 @@ as adding/removing interfaces.
hapd->iface->bss[0]->own_addr) ==
0) {
wpa_printf(MSG_ERROR, "BSS '%s' may not have "
@@ -1493,6 +1502,7 @@ static int hostapd_setup_bss(struct host
@@ -1493,6 +1503,7 @@ static int hostapd_setup_bss(struct host
hapd->mld_link_id, hapd->conf->iface);
goto setup_mld;
}
@@ -305,25 +305,16 @@ as adding/removing interfaces.
}
#endif /* CONFIG_IEEE80211BE */
@@ -1501,7 +1511,7 @@ static int hostapd_setup_bss(struct host
@@ -1501,7 +1512,7 @@ static int hostapd_setup_bss(struct host
conf->iface, addr, hapd,
&hapd->drv_priv, force_ifname, if_addr,
conf->bridge[0] ? conf->bridge : NULL,
- first == -1)) {
- 1)) {
+ use_existing)) {
wpa_printf(MSG_ERROR, "Failed to add BSS (BSSID="
MACSTR ")", MAC2STR(hapd->own_addr));
hapd->interface_added = 0;
@@ -1524,7 +1534,7 @@ static int hostapd_setup_bss(struct host
#ifdef CONFIG_IEEE80211BE
setup_mld:
- if (hapd->conf->mld_ap && !first) {
+ if (hapd->conf->mld_ap && first != 1) {
wpa_printf(MSG_DEBUG,
"MLD: Set link_id=%u, mld_addr=" MACSTR
", own_addr=" MACSTR,
@@ -1542,6 +1552,8 @@ setup_mld:
@@ -1542,6 +1553,8 @@ setup_mld:
}
#endif /* CONFIG_IEEE80211BE */
@@ -332,7 +323,7 @@ as adding/removing interfaces.
if (conf->wmm_enabled < 0)
conf->wmm_enabled = hapd->iconf->ieee80211n |
hapd->iconf->ieee80211ax;
@@ -1870,7 +1882,7 @@ int hostapd_set_acl(struct hostapd_data
@@ -1870,7 +1883,7 @@ int hostapd_set_acl(struct hostapd_data
}
@@ -341,7 +332,7 @@ as adding/removing interfaces.
{
#ifdef CONFIG_IEEE80211BE
int ret;
@@ -2543,7 +2555,7 @@ static int hostapd_owe_iface_iter2(struc
@@ -2543,7 +2556,7 @@ static int hostapd_owe_iface_iter2(struc
#endif /* CONFIG_OWE */
@@ -350,7 +341,7 @@ as adding/removing interfaces.
{
#ifdef CONFIG_OWE
/* Check whether the enabled BSS can complete OWE transition mode
@@ -3000,7 +3012,7 @@ hostapd_alloc_bss_data(struct hostapd_if
@@ -3000,7 +3013,7 @@ hostapd_alloc_bss_data(struct hostapd_if
}
@@ -359,7 +350,7 @@ as adding/removing interfaces.
{
if (!hapd)
return;
@@ -3208,7 +3220,7 @@ fail:
@@ -3208,7 +3221,7 @@ fail:
}
@@ -368,7 +359,7 @@ as adding/removing interfaces.
{
#ifdef CONFIG_IEEE80211BE
struct hostapd_mld *mld, **all_mld;
@@ -4089,7 +4101,8 @@ int hostapd_remove_iface(struct hapd_int
@@ -4089,7 +4102,8 @@ int hostapd_remove_iface(struct hapd_int
hapd_iface = interfaces->iface[i];
if (hapd_iface == NULL)
return -1;
@@ -420,7 +411,7 @@ as adding/removing interfaces.
hostapd_interface_init_bss(struct hapd_interfaces *interfaces, const char *phy,
const char *config_fname, int debug);
+int hostapd_set_ctrl_sock_iface(struct hostapd_data *hapd);
+int hostapd_setup_bss(struct hostapd_data *hapd, int first, bool start_beacon);
+int hostapd_setup_bss(struct hostapd_data *hapd, bool first, bool start_beacon);
+void hostapd_bss_link_deinit(struct hostapd_data *hapd);
+void hostapd_bss_deinit(struct hostapd_data *hapd);
void hostapd_bss_setup_multi_link(struct hostapd_data *hapd,
@@ -494,7 +485,7 @@ as adding/removing interfaces.
}
}
@@ -4467,6 +4490,12 @@ static void handle_auth(struct hostapd_d
@@ -4608,6 +4631,12 @@ static void handle_auth(struct hostapd_d
goto fail;
}
@@ -544,7 +535,7 @@ as adding/removing interfaces.
char *radius_cui; /* Chargeable-User-Identity from RADIUS */
--- a/src/ap/wpa_auth_glue.c
+++ b/src/ap/wpa_auth_glue.c
@@ -484,6 +484,7 @@ static const u8 * hostapd_wpa_auth_get_p
@@ -487,6 +487,7 @@ static const u8 * hostapd_wpa_auth_get_p
struct sta_info *sta = ap_get_sta(hapd, addr);
const u8 *psk;
@@ -552,7 +543,7 @@ as adding/removing interfaces.
if (vlan_id)
*vlan_id = 0;
if (psk_len)
@@ -534,13 +535,18 @@ static const u8 * hostapd_wpa_auth_get_p
@@ -537,13 +538,18 @@ static const u8 * hostapd_wpa_auth_get_p
* returned psk which should not be returned again.
* logic list (all hostapd_get_psk; all sta->psk)
*/
@@ -572,7 +563,7 @@ as adding/removing interfaces.
if (pos->is_passphrase) {
if (pbkdf2_sha1(pos->passphrase,
hapd->conf->ssid.ssid,
@@ -554,9 +560,13 @@ static const u8 * hostapd_wpa_auth_get_p
@@ -557,9 +563,13 @@ static const u8 * hostapd_wpa_auth_get_p
}
if (pos->psk == prev_psk) {
psk = pos->next ? pos->next->psk : NULL;
@@ -588,7 +579,7 @@ as adding/removing interfaces.
}
--- a/src/drivers/driver.h
+++ b/src/drivers/driver.h
@@ -4176,6 +4176,25 @@ struct wpa_driver_ops {
@@ -4429,6 +4429,25 @@ struct wpa_driver_ops {
const char *ifname);
/**
@@ -614,7 +605,7 @@ as adding/removing interfaces.
* set_sta_vlan - Bind a station into a specific interface (AP only)
* @priv: Private driver interface data
* @ifname: Interface (main or virtual BSS or VLAN)
@@ -7027,6 +7046,7 @@ union wpa_event_data {
@@ -7424,6 +7443,7 @@ union wpa_event_data {
/**
* struct ch_switch
@@ -622,7 +613,7 @@ as adding/removing interfaces.
* @freq: Frequency of new channel in MHz
* @ht_enabled: Whether this is an HT channel
* @ch_offset: Secondary channel offset
@@ -7037,6 +7057,7 @@ union wpa_event_data {
@@ -7434,6 +7454,7 @@ union wpa_event_data {
* @punct_bitmap: Puncturing bitmap
*/
struct ch_switch {
@@ -632,7 +623,7 @@ as adding/removing interfaces.
int ch_offset;
--- a/src/drivers/driver_nl80211.c
+++ b/src/drivers/driver_nl80211.c
@@ -77,6 +77,16 @@ enum nlmsgerr_attrs {
@@ -78,6 +78,16 @@ enum nlmsgerr_attrs {
#endif /* ANDROID */
@@ -649,7 +640,7 @@ as adding/removing interfaces.
static struct nl_sock * nl_create_handle(struct nl_cb *cb, const char *dbg)
{
@@ -449,6 +459,11 @@ static int no_seq_check(struct nl_msg *m
@@ -454,6 +464,11 @@ static int no_seq_check(struct nl_msg *m
return NL_OK;
}
@@ -661,7 +652,7 @@ as adding/removing interfaces.
static void nl80211_nlmsg_clear(struct nl_msg *msg)
{
@@ -633,6 +648,8 @@ int send_and_recv_glb(struct nl80211_glo
@@ -638,6 +653,8 @@ int send_and_recv_glb(struct nl80211_glo
if (!msg)
return -ENOMEM;
@@ -670,7 +661,7 @@ as adding/removing interfaces.
err.err = -ENOMEM;
s_nl_cb = nl_socket_get_cb(nl_handle);
@@ -677,6 +694,7 @@ int send_and_recv_glb(struct nl80211_glo
@@ -682,6 +699,7 @@ int send_and_recv_glb(struct nl80211_glo
err.err_info = err_info;
err.drv = drv;
@@ -678,7 +669,7 @@ as adding/removing interfaces.
nl_cb_err(cb, NL_CB_CUSTOM, error_handler, &err);
nl_cb_set(cb, NL_CB_FINISH, NL_CB_CUSTOM, finish_handler, &err.err);
if (ack_handler_custom) {
@@ -1105,6 +1123,7 @@ nl80211_get_wiphy_data_ap(struct i802_bs
@@ -1117,6 +1135,7 @@ nl80211_get_wiphy_data_ap(struct i802_bs
os_free(w);
return NULL;
}
@@ -686,7 +677,7 @@ as adding/removing interfaces.
nl_cb_set(w->nl_cb, NL_CB_SEQ_CHECK, NL_CB_CUSTOM,
no_seq_check, NULL);
nl_cb_set(w->nl_cb, NL_CB_VALID, NL_CB_CUSTOM,
@@ -2212,6 +2231,7 @@ static int wpa_driver_nl80211_init_nl_gl
@@ -2224,6 +2243,7 @@ static int wpa_driver_nl80211_init_nl_gl
/* Needs to be registered early so that process_global_event() calls
* the sync reply handler hook.
*/
@@ -694,7 +685,7 @@ as adding/removing interfaces.
nl_cb_set(global->nl_cb, NL_CB_SEQ_CHECK, NL_CB_CUSTOM,
no_seq_check, NULL);
nl_cb_set(global->nl_cb, NL_CB_VALID, NL_CB_CUSTOM,
@@ -2445,6 +2465,7 @@ static int nl80211_init_bss(struct i802_
@@ -2469,6 +2489,7 @@ static int nl80211_init_bss(struct i802_
if (!bss->nl_cb)
return -1;
@@ -702,7 +693,7 @@ as adding/removing interfaces.
nl_cb_set(bss->nl_cb, NL_CB_SEQ_CHECK, NL_CB_CUSTOM,
no_seq_check, NULL);
nl_cb_set(bss->nl_cb, NL_CB_VALID, NL_CB_CUSTOM,
@@ -9180,6 +9201,7 @@ static void *i802_init(struct hostapd_da
@@ -9476,6 +9497,7 @@ static void *i802_init(struct hostapd_da
char master_ifname[IFNAMSIZ];
int ifindex, br_ifindex = 0;
int br_added = 0;
@@ -710,7 +701,7 @@ as adding/removing interfaces.
bss = wpa_driver_nl80211_drv_init(hapd, params->ifname,
params->global_priv, 1,
@@ -9240,21 +9262,17 @@ static void *i802_init(struct hostapd_da
@@ -9536,21 +9558,17 @@ static void *i802_init(struct hostapd_da
(params->num_bridge == 0 || !params->bridge[0]))
add_ifidx(drv, br_ifindex, drv->ifindex);
@@ -742,7 +733,7 @@ as adding/removing interfaces.
}
if (drv->capa.flags2 & WPA_DRIVER_FLAGS2_CONTROL_PORT_RX) {
@@ -9641,6 +9659,50 @@ static int wpa_driver_nl80211_if_remove(
@@ -9941,6 +9959,50 @@ static int wpa_driver_nl80211_if_remove(
return 0;
}
@@ -793,7 +784,7 @@ as adding/removing interfaces.
static int cookie_handler(struct nl_msg *msg, void *arg)
{
@@ -11540,6 +11602,37 @@ static bool nl80211_is_drv_shared(void *
@@ -11877,6 +11939,37 @@ static bool nl80211_is_drv_shared(void *
#endif /* CONFIG_IEEE80211BE */
@@ -831,7 +822,7 @@ as adding/removing interfaces.
static int driver_nl80211_send_mlme(void *priv, const u8 *data,
size_t data_len, int noack,
unsigned int freq,
@@ -15546,6 +15639,8 @@ const struct wpa_driver_ops wpa_driver_n
@@ -16705,6 +16798,8 @@ const struct wpa_driver_ops wpa_driver_n
.set_acl = wpa_driver_nl80211_set_acl,
.if_add = wpa_driver_nl80211_if_add,
.if_remove = driver_nl80211_if_remove,
@@ -842,7 +833,7 @@ as adding/removing interfaces.
.sta_add = wpa_driver_nl80211_sta_add,
--- a/src/drivers/driver_nl80211_event.c
+++ b/src/drivers/driver_nl80211_event.c
@@ -1263,6 +1263,7 @@ static void mlme_event_ch_switch(struct
@@ -1276,6 +1276,7 @@ static void mlme_event_ch_switch(struct
struct nlattr *bw, struct nlattr *cf1,
struct nlattr *cf2,
struct nlattr *punct_bitmap,
@@ -850,7 +841,7 @@ as adding/removing interfaces.
int finished)
{
struct i802_bss *bss;
@@ -1328,6 +1329,8 @@ static void mlme_event_ch_switch(struct
@@ -1341,6 +1342,8 @@ static void mlme_event_ch_switch(struct
data.ch_switch.cf1 = nla_get_u32(cf1);
if (cf2)
data.ch_switch.cf2 = nla_get_u32(cf2);
@@ -859,7 +850,7 @@ as adding/removing interfaces.
if (link) {
data.ch_switch.link_id = nla_get_u8(link);
@@ -4423,6 +4426,7 @@ static void do_process_drv_event(struct
@@ -4970,6 +4973,7 @@ static void do_process_drv_event(struct
tb[NL80211_ATTR_CENTER_FREQ1],
tb[NL80211_ATTR_CENTER_FREQ2],
tb[NL80211_ATTR_PUNCT_BITMAP],
@@ -867,7 +858,7 @@ as adding/removing interfaces.
0);
break;
case NL80211_CMD_CH_SWITCH_NOTIFY:
@@ -4435,6 +4439,7 @@ static void do_process_drv_event(struct
@@ -4982,6 +4986,7 @@ static void do_process_drv_event(struct
tb[NL80211_ATTR_CENTER_FREQ1],
tb[NL80211_ATTR_CENTER_FREQ2],
tb[NL80211_ATTR_PUNCT_BITMAP],
@@ -941,7 +932,7 @@ as adding/removing interfaces.
ifdef CONFIG_CODE_COVERAGE
CFLAGS += -O0 -fprofile-arcs -ftest-coverage -U_FORTIFY_SOURCE
LIBS += -lgcov
@@ -1082,6 +1090,9 @@ ifdef CONFIG_CTRL_IFACE_MIB
@@ -1087,6 +1095,9 @@ ifdef CONFIG_CTRL_IFACE_MIB
CFLAGS += -DCONFIG_CTRL_IFACE_MIB
endif
OBJS += ../src/ap/ctrl_iface_ap.o
@@ -1001,7 +992,7 @@ as adding/removing interfaces.
MULTI_AP_FRONTHAUL_BSS);
wpa_s->multi_ap_ie = 1;
}
@@ -5873,6 +5880,13 @@ static void wpas_event_rx_mgmt_action(st
@@ -5916,6 +5923,13 @@ static void wpas_event_rx_mgmt_action(st
}
#endif /* CONFIG_WNM */
@@ -1015,7 +1006,7 @@ as adding/removing interfaces.
#ifdef CONFIG_GAS
if ((mgmt->u.action.category == WLAN_ACTION_PUBLIC ||
mgmt->u.action.category == WLAN_ACTION_PROTECTED_DUAL) &&
@@ -6679,6 +6693,7 @@ void supplicant_event(void *ctx, enum wp
@@ -6739,6 +6753,7 @@ void supplicant_event(void *ctx, enum wp
event_to_string(event), event);
#endif /* CONFIG_NO_STDOUT_DEBUG */
@@ -1051,7 +1042,7 @@ as adding/removing interfaces.
static void hostapd_dpp_reply_wait_timeout(void *eloop_ctx, void *timeout_ctx);
@@ -3017,6 +3018,9 @@ void hostapd_dpp_rx_action(struct hostap
@@ -3018,6 +3019,9 @@ void hostapd_dpp_rx_action(struct hostap
wpa_msg(hapd->msg_ctx, MSG_INFO, DPP_EVENT_RX "src=" MACSTR
" freq=%u type=%d", MAC2STR(src), freq, type);
@@ -1061,7 +1052,7 @@ as adding/removing interfaces.
#ifdef CONFIG_DPP2
if (dpp_relay_rx_action(hapd->iface->interfaces->dpp,
src, hdr, buf, len, freq, NULL, NULL,
@@ -3116,13 +3120,19 @@ void hostapd_dpp_rx_action(struct hostap
@@ -3117,13 +3121,19 @@ void hostapd_dpp_rx_action(struct hostap
struct wpabuf *
hostapd_dpp_gas_req_handler(struct hostapd_data *hapd, const u8 *sa,
@@ -1116,7 +1107,7 @@ as adding/removing interfaces.
static int wpas_dpp_listen_start(struct wpa_supplicant *wpa_s,
@@ -4119,6 +4120,9 @@ void wpas_dpp_rx_action(struct wpa_suppl
@@ -4122,6 +4123,9 @@ void wpas_dpp_rx_action(struct wpa_suppl
return;
}
wpa_hexdump(MSG_MSGDUMP, "DPP: Received message attributes", buf, len);
@@ -8,7 +8,7 @@ as adding/removing interfaces.
--- a/hostapd/config_file.c
+++ b/hostapd/config_file.c
@@ -5012,7 +5012,14 @@ struct hostapd_config * hostapd_config_r
@@ -5027,7 +5027,14 @@ struct hostapd_config * hostapd_config_r
int errors = 0;
size_t i;
@@ -43,7 +43,7 @@ as adding/removing interfaces.
wpa_printf(MSG_ERROR,
--- a/hostapd/main.c
+++ b/hostapd/main.c
@@ -407,7 +407,11 @@ hostapd_interface_init(struct hapd_inter
@@ -412,7 +412,11 @@ hostapd_interface_init(struct hapd_inter
struct hostapd_iface *iface;
int k;
@@ -58,7 +58,7 @@ as adding/removing interfaces.
return NULL;
--- a/src/ap/hostapd.c
+++ b/src/ap/hostapd.c
@@ -3413,8 +3413,13 @@ hostapd_interface_init_bss(struct hapd_i
@@ -3414,8 +3414,13 @@ hostapd_interface_init_bss(struct hapd_i
}
}
@@ -25,7 +25,7 @@ full device, e.g. in order to deal with hardware/driver limitations
} else if (os_strcmp(buf, "extended_key_id") == 0) {
--- a/src/ap/ap_config.h
+++ b/src/ap/ap_config.h
@@ -1083,6 +1083,8 @@ struct hostapd_config {
@@ -1095,6 +1095,8 @@ struct hostapd_config {
unsigned int track_sta_max_num;
unsigned int track_sta_max_age;
@@ -36,7 +36,7 @@ full device, e.g. in order to deal with hardware/driver limitations
* ' ' (ascii 32): all environments
--- a/src/ap/beacon.c
+++ b/src/ap/beacon.c
@@ -1704,7 +1704,7 @@ void handle_probe_req(struct hostapd_dat
@@ -1708,7 +1708,7 @@ void handle_probe_req(struct hostapd_dat
if (hapd->conf->no_probe_resp_if_max_sta &&
is_multicast_ether_addr(mgmt->da) &&
is_multicast_ether_addr(mgmt->bssid) &&
@@ -29,7 +29,7 @@ a VLAN interface on top of the bridge, instead of using the bridge directly
int bridge_hairpin; /* hairpin_mode on bridge members */
--- a/src/ap/wpa_auth_glue.c
+++ b/src/ap/wpa_auth_glue.c
@@ -1925,8 +1925,12 @@ int hostapd_setup_wpa(struct hostapd_dat
@@ -1928,8 +1928,12 @@ int hostapd_setup_wpa(struct hostapd_dat
wpa_key_mgmt_ft(hapd->conf->wpa_key_mgmt)) {
const char *ft_iface;
@@ -112,7 +112,7 @@ untagged DHCP packets
hapd->x_snoop_initialized = false;
--- a/src/drivers/driver.h
+++ b/src/drivers/driver.h
@@ -4590,7 +4590,7 @@ struct wpa_driver_ops {
@@ -4849,7 +4849,7 @@ struct wpa_driver_ops {
* Returns: 0 on success, negative (<0) on failure
*/
int (*br_set_net_param)(void *priv, enum drv_br_net_param param,
@@ -123,7 +123,7 @@ untagged DHCP packets
* get_wowlan - Get wake-on-wireless status
--- a/src/drivers/driver_nl80211.c
+++ b/src/drivers/driver_nl80211.c
@@ -13238,7 +13238,7 @@ static const char * drv_br_net_param_str
@@ -13575,7 +13575,7 @@ static const char * drv_br_net_param_str
static int wpa_driver_br_set_net_param(void *priv, enum drv_br_net_param param,
@@ -132,7 +132,7 @@ untagged DHCP packets
{
struct i802_bss *bss = priv;
char path[128];
@@ -13264,8 +13264,11 @@ static int wpa_driver_br_set_net_param(v
@@ -13601,8 +13601,11 @@ static int wpa_driver_br_set_net_param(v
return -EINVAL;
}
@@ -28,7 +28,7 @@ Signed-off-by: David Bauer <mail@david-bauer.net>
--- a/src/ap/beacon.c
+++ b/src/ap/beacon.c
@@ -1526,7 +1526,7 @@ void handle_probe_req(struct hostapd_dat
@@ -1530,7 +1530,7 @@ void handle_probe_req(struct hostapd_dat
* is less likely to see them (Probe Request frame sent on a
* neighboring, but partially overlapping, channel).
*/
@@ -29,7 +29,7 @@ handle reload.
#ifndef CONFIG_NO_HOSTAPD_LOGGER
static void hostapd_logger_cb(void *ctx, const u8 *addr, unsigned int module,
@@ -848,6 +849,11 @@ int main(int argc, char *argv[])
@@ -853,6 +854,11 @@ int main(int argc, char *argv[])
if (os_program_init())
return -1;
@@ -53,10 +53,10 @@ Hotfix-by: Sebastian Gottschall https://github.com/mirror/dd-wrt/commit/0c3001a6
--- a/hostapd/config_file.c
+++ b/hostapd/config_file.c
@@ -5003,6 +5003,15 @@ static int hostapd_config_fill(struct ho
conf->disable_mcs15_rx = atoi(pos);
#endif /* CONFIG_TESTING_OPTIONS */
@@ -5020,6 +5020,15 @@ static int hostapd_config_fill(struct ho
#endif /* CONFIG_IEEE80211BE */
} else if (os_strcmp(buf, "i2r_lmr_policy") == 0) {
conf->i2r_lmr_policy = atoi(pos);
+#ifdef CONFIG_APUP
+ } else if (os_strcmp(buf, "apup") == 0) {
+ bss->apup = !!atoi(pos);
@@ -66,15 +66,16 @@ Hotfix-by: Sebastian Gottschall https://github.com/mirror/dd-wrt/commit/0c3001a6
+ os_strlcpy(bss->apup_peer_ifname_prefix,
+ pos, sizeof(bss->apup_peer_ifname_prefix));
+#endif // def CONFIG_APUP
} else if (os_strcmp(buf, "i2r_lmr_policy") == 0) {
conf->i2r_lmr_policy = atoi(pos);
} else {
wpa_printf(MSG_ERROR,
"Line %d: unknown configuration item '%s'",
--- a/src/ap/ap_config.h
+++ b/src/ap/ap_config.h
@@ -1001,6 +1001,34 @@ struct hostapd_bss_config {
@@ -1013,6 +1013,35 @@ struct hostapd_bss_config {
unsigned int pmksa_caching_privacy:1;
unsigned int eap_using_authentication_frames:1;
#endif /* CONFIG_ENC_ASSOC */
+
+#ifdef CONFIG_APUP
+ /**
+ * Access Point Micro Peering
@@ -163,7 +164,7 @@ Hotfix-by: Sebastian Gottschall https://github.com/mirror/dd-wrt/commit/0c3001a6
int hostapd_sta_add(struct hostapd_data *hapd,
--- /dev/null
+++ b/src/ap/apup.c
@@ -0,0 +1,170 @@
@@ -0,0 +1,169 @@
+/*
+ * hostapd / APuP Access Point Micro Peering
+ *
@@ -225,9 +226,8 @@ Hotfix-by: Sebastian Gottschall https://github.com/mirror/dd-wrt/commit/0c3001a6
+ * understand what could be a proper implementation in this context too
+ */
+ const u8 *mld_link_addr = NULL;
+ bool mld_link_sta = false;
+ bool mld_link_sta = false, epp_sta = false;
+ u16 eml_cap = 0;
+ bool epp_sta = false;
+
+ /* First add the station without more information */
+ int aRet = hostapd_sta_add(
@@ -373,7 +373,7 @@ Hotfix-by: Sebastian Gottschall https://github.com/mirror/dd-wrt/commit/0c3001a6
#ifdef CONFIG_FILS
static struct wpabuf *
@@ -4869,8 +4872,8 @@ static u16 check_multi_ap(struct hostapd
@@ -5010,8 +5013,8 @@ static u16 check_multi_ap(struct hostapd
}
@@ -384,7 +384,7 @@ Hotfix-by: Sebastian Gottschall https://github.com/mirror/dd-wrt/commit/0c3001a6
{
/* Supported rates not used in IEEE 802.11ad/DMG */
if (hapd->iface->current_mode &&
@@ -5338,7 +5341,7 @@ static int __check_assoc_ies(struct host
@@ -5479,7 +5482,7 @@ static int __check_assoc_ies(struct host
elems->ext_capab_len);
if (resp != WLAN_STATUS_SUCCESS)
goto out;
@@ -393,7 +393,7 @@ Hotfix-by: Sebastian Gottschall https://github.com/mirror/dd-wrt/commit/0c3001a6
if (resp != WLAN_STATUS_SUCCESS)
goto out;
@@ -7720,6 +7723,11 @@ static void handle_beacon(struct hostapd
@@ -7920,6 +7923,11 @@ static void handle_beacon(struct hostapd
0);
ap_list_process_beacon(hapd->iface, mgmt, &elems, fi);
@@ -418,7 +418,7 @@ Hotfix-by: Sebastian Gottschall https://github.com/mirror/dd-wrt/commit/0c3001a6
u16 copy_sta_vendor_vht(struct hostapd_data *hapd, struct sta_info *sta,
--- a/src/drivers/driver.h
+++ b/src/drivers/driver.h
@@ -4284,7 +4284,7 @@ struct wpa_driver_ops {
@@ -4537,7 +4537,7 @@ struct wpa_driver_ops {
* Returns: 0 on success, -1 on failure
*/
int (*set_wds_sta)(void *priv, const u8 *addr, int aid, int val,
@@ -429,7 +429,7 @@ Hotfix-by: Sebastian Gottschall https://github.com/mirror/dd-wrt/commit/0c3001a6
* send_action - Transmit an Action frame
--- a/src/drivers/driver_nl80211.c
+++ b/src/drivers/driver_nl80211.c
@@ -9032,25 +9032,15 @@ int nl80211_has_ifidx(struct wpa_driver_
@@ -9328,25 +9328,15 @@ int nl80211_has_ifidx(struct wpa_driver_
static int i802_set_wds_sta(void *priv, const u8 *addr, int aid, int val,