PKG_SOURCE_URL:=https://w1.fi/hostap.git
PKG_SOURCE_PROTO:=git
-PKG_SOURCE_DATE:=2025-06-27
-PKG_SOURCE_VERSION:=ea08700a762f13c415e319993720bed83ad9aa2c
-PKG_MIRROR_HASH:=8bfd23188058611a7efb3b0064a7601f8073ceedbf1538a99f93abc743608d46
+PKG_SOURCE_DATE:=2025-08-26
+PKG_SOURCE_VERSION:=ca266cc24d8705eb1a2a0857ad326e48b1408b20
+PKG_MIRROR_HASH:=59ac677093f524ff98588abd9f33805a336a6e929d6814222f0d784c854f2343
PKG_MAINTAINER:=Felix Fietkau <nbd@nbd.name>
PKG_LICENSE:=BSD-3-Clause
--- a/wpa_supplicant/wpa_supplicant.c
+++ b/wpa_supplicant/wpa_supplicant.c
-@@ -2974,7 +2974,7 @@ static int drv_supports_vht(struct wpa_s
+@@ -2976,7 +2976,7 @@ static int drv_supports_vht(struct wpa_s
}
{
int i;
-@@ -2983,7 +2983,10 @@ static bool ibss_mesh_is_80mhz_avail(int
+@@ -2985,7 +2985,10 @@ static bool ibss_mesh_is_80mhz_avail(int
chan = hw_get_channel_chan(mode, i, NULL);
if (!chan ||
return false;
}
-@@ -3110,7 +3113,7 @@ static void ibss_mesh_select_40mhz(struc
+@@ -3112,7 +3115,7 @@ static void ibss_mesh_select_40mhz(struc
const struct wpa_ssid *ssid,
struct hostapd_hw_modes *mode,
struct hostapd_freq_params *freq,
{
int chan_idx;
struct hostapd_channel_data *pri_chan = NULL, *sec_chan = NULL;
-@@ -3141,8 +3144,11 @@ static void ibss_mesh_select_40mhz(struc
+@@ -3143,8 +3146,11 @@ static void ibss_mesh_select_40mhz(struc
return;
/* Check primary channel flags */
#ifdef CONFIG_HT_OVERRIDES
if (ssid->disable_ht40)
-@@ -3177,8 +3183,11 @@ static void ibss_mesh_select_40mhz(struc
+@@ -3179,8 +3185,11 @@ static void ibss_mesh_select_40mhz(struc
return;
/* Check secondary channel flags */
if (freq->ht_enabled) {
if (ht40 == -1) {
-@@ -3256,7 +3265,7 @@ static bool ibss_mesh_select_80_160mhz(s
+@@ -3258,7 +3267,7 @@ static bool ibss_mesh_select_80_160mhz(s
const struct wpa_ssid *ssid,
struct hostapd_hw_modes *mode,
struct hostapd_freq_params *freq,
static const int bw80[] = {
5180, 5260, 5500, 5580, 5660, 5745, 5825,
5955, 6035, 6115, 6195, 6275, 6355, 6435,
-@@ -3309,7 +3318,7 @@ static bool ibss_mesh_select_80_160mhz(s
+@@ -3311,7 +3320,7 @@ static bool ibss_mesh_select_80_160mhz(s
goto skip_80mhz;
/* Use 40 MHz if channel not usable */
goto skip_80mhz;
chwidth = CONF_OPER_CHWIDTH_80MHZ;
-@@ -3351,7 +3360,7 @@ static bool ibss_mesh_select_80_160mhz(s
+@@ -3353,7 +3362,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) &&
for (j = 0; j < ARRAY_SIZE(bw160); j++) {
u8 start_chan;
-@@ -3374,11 +3383,11 @@ static bool ibss_mesh_select_80_160mhz(s
+@@ -3376,11 +3385,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 -
for (j = 0; j < ARRAY_SIZE(bw320); j += 2) {
if (freq->freq >= bw320[j] &&
freq->freq <= bw320[j + 1]) {
-@@ -3407,10 +3416,12 @@ static bool ibss_mesh_select_80_160mhz(s
+@@ -3409,10 +3418,12 @@ static bool ibss_mesh_select_80_160mhz(s
if (!chan)
continue;
/* Found a suitable second segment for 80+80 */
chwidth = CONF_OPER_CHWIDTH_80P80MHZ;
-@@ -3465,6 +3476,7 @@ void ibss_mesh_setup_freq(struct wpa_sup
+@@ -3467,6 +3478,7 @@ void ibss_mesh_setup_freq(struct wpa_sup
int obss_scan = 1;
u8 channel;
bool is_6ghz, is_24ghz;
freq->freq = ssid->frequency;
-@@ -3508,9 +3520,9 @@ void ibss_mesh_setup_freq(struct wpa_sup
+@@ -3510,9 +3522,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,
chan_idx, num_available_chandefs);
--- a/src/drivers/driver_nl80211.c
+++ b/src/drivers/driver_nl80211.c
-@@ -11658,6 +11658,10 @@ static int nl80211_switch_channel(void *
+@@ -11668,6 +11668,10 @@ static int nl80211_switch_channel(void *
if (ret)
goto error;
--- a/src/ap/ieee802_11.c
+++ b/src/ap/ieee802_11.c
-@@ -5076,6 +5076,13 @@ static int add_associated_sta(struct hos
+@@ -5136,6 +5136,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.
*/
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)",
-@@ -5089,7 +5096,8 @@ static int add_associated_sta(struct hos
+@@ -5149,7 +5156,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) &&
return drv;
}
return NULL;
-@@ -8583,7 +8585,7 @@ static void add_ifidx(struct wpa_driver_
+@@ -8586,7 +8588,7 @@ static void add_ifidx(struct wpa_driver_
wpa_printf(MSG_DEBUG,
"nl80211: Add own interface ifindex %d (ifidx_reason %d)",
ifidx, ifidx_reason);
wpa_printf(MSG_DEBUG, "nl80211: ifindex %d already in the list",
ifidx);
return;
-@@ -8643,7 +8645,7 @@ static void del_ifidx(struct wpa_driver_
+@@ -8646,7 +8648,7 @@ static void del_ifidx(struct wpa_driver_
}
int ifidx_reason)
{
int i;
-@@ -8750,7 +8752,7 @@ static void handle_eapol(int sock, void
+@@ -8753,7 +8755,7 @@ static void handle_eapol(int sock, void
return;
}
--- a/src/drivers/driver.h
+++ b/src/drivers/driver.h
-@@ -2442,6 +2442,9 @@ struct wpa_driver_capa {
+@@ -2447,6 +2447,9 @@ struct wpa_driver_capa {
/** Maximum number of iterations in a single scan plan */
u32 max_sched_scan_plan_iterations;
heavy_groups = [14, 15, 16]
suitable_groups = [15, 16, 17, 18, 19, 20, 21]
groups = [str(g) for g in sae_groups]
-@@ -2285,6 +2290,8 @@ def run_sae_pwe_group(dev, apdev, group)
+@@ -2387,6 +2392,8 @@ def run_sae_pwe_group(dev, apdev, group)
logger.info("Add Brainpool EC groups since OpenSSL is new enough")
elif tls.startswith("wolfSSL"):
logger.info("Make sure Brainpool EC groups were enabled when compiling wolfSSL")
if (c < 0)
--- a/src/ap/drv_callbacks.c
+++ b/src/ap/drv_callbacks.c
-@@ -2566,8 +2566,8 @@ static void hostapd_mld_iface_disable(st
+@@ -2561,8 +2561,8 @@ static void hostapd_mld_iface_disable(st
#endif /* CONFIG_IEEE80211BE */
{
struct hostapd_data *hapd = ctx;
struct sta_info *sta;
-@@ -2925,7 +2925,7 @@ void wpa_supplicant_event(void *ctx, enu
+@@ -2920,7 +2920,7 @@ void wpa_supplicant_event(void *ctx, enu
}
struct hapd_interfaces *interfaces = ctx;
--- a/src/drivers/driver.h
+++ b/src/drivers/driver.h
-@@ -7161,8 +7161,8 @@ union wpa_event_data {
+@@ -7166,8 +7166,8 @@ union wpa_event_data {
* Driver wrapper code should call this function whenever an event is received
* from the driver.
*/
/**
* wpa_supplicant_event_global - Report a driver event for wpa_supplicant
-@@ -7174,7 +7174,7 @@ void wpa_supplicant_event(void *ctx, enu
+@@ -7179,7 +7179,7 @@ void wpa_supplicant_event(void *ctx, enu
* Same as wpa_supplicant_event(), but we search for the interface in
* wpa_global.
*/
os_memset(&eapol_test, 0, sizeof(eapol_test));
--- a/wpa_supplicant/events.c
+++ b/wpa_supplicant/events.c
-@@ -6255,8 +6255,8 @@ static int wpas_pasn_auth(struct wpa_sup
+@@ -6257,8 +6257,8 @@ static int wpas_pasn_auth(struct wpa_sup
#endif /* CONFIG_PASN */
{
struct wpa_supplicant *wpa_s = ctx;
int resched;
-@@ -7228,7 +7228,7 @@ void wpa_supplicant_event(void *ctx, enu
+@@ -7232,7 +7232,7 @@ void wpa_supplicant_event(void *ctx, enu
}
os_memset(&global, 0, sizeof(global));
--- a/wpa_supplicant/wpa_supplicant.c
+++ b/wpa_supplicant/wpa_supplicant.c
-@@ -8128,7 +8128,6 @@ struct wpa_interface * wpa_supplicant_ma
+@@ -8156,7 +8156,6 @@ struct wpa_interface * wpa_supplicant_ma
return NULL;
}
/**
* wpa_supplicant_match_existing - Match existing interfaces
* @global: Pointer to global data from wpa_supplicant_init()
-@@ -8163,6 +8162,11 @@ static int wpa_supplicant_match_existing
+@@ -8191,6 +8190,11 @@ static int wpa_supplicant_match_existing
#endif /* CONFIG_MATCH_IFACE */
/**
* wpa_supplicant_add_iface - Add a new network interface
-@@ -8419,6 +8423,8 @@ struct wpa_global * wpa_supplicant_init(
+@@ -8447,6 +8451,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 */
--- a/wpa_supplicant/ctrl_iface.c
+++ b/wpa_supplicant/ctrl_iface.c
-@@ -13678,7 +13678,7 @@ char * wpa_supplicant_ctrl_iface_process
+@@ -13676,7 +13676,7 @@ char * wpa_supplicant_ctrl_iface_process
if (wpas_ctrl_iface_coloc_intf_report(wpa_s, buf + 18))
reply_len = -1;
#endif /* CONFIG_WNM */
} else if (os_strncmp(buf, "DISASSOC_IMMINENT ", 18) == 0) {
if (ap_ctrl_iface_disassoc_imminent(wpa_s, buf + 18))
reply_len = -1;
-@@ -13688,7 +13688,7 @@ char * wpa_supplicant_ctrl_iface_process
+@@ -13686,7 +13686,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;
else
--- a/hostapd/ctrl_iface.c
+++ b/hostapd/ctrl_iface.c
-@@ -4096,6 +4096,7 @@ static int hostapd_ctrl_iface_receive_pr
+@@ -4115,6 +4115,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);
} else if (os_strcmp(buf, "MIB") == 0) {
reply_len = ieee802_11_get_mib(hapd, reply, reply_size);
if (reply_len >= 0) {
-@@ -4137,6 +4138,7 @@ static int hostapd_ctrl_iface_receive_pr
+@@ -4156,6 +4157,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);
if (os_snprintf_error(buflen - len, ret))
--- a/src/ap/ieee802_1x.c
+++ b/src/ap/ieee802_1x.c
-@@ -2831,6 +2831,7 @@ static const char * bool_txt(bool val)
+@@ -2836,6 +2836,7 @@ static const char * bool_txt(bool val)
return val ? "TRUE" : "FALSE";
}
int ieee802_1x_get_mib(struct hostapd_data *hapd, char *buf, size_t buflen)
{
-@@ -3017,6 +3018,7 @@ int ieee802_1x_get_mib_sta(struct hostap
+@@ -3022,6 +3023,7 @@ int ieee802_1x_get_mib_sta(struct hostap
return len;
}
--- a/wpa_supplicant/ap.c
+++ b/wpa_supplicant/ap.c
-@@ -1523,7 +1523,7 @@ int wpas_ap_wps_nfc_report_handover(stru
+@@ -1525,7 +1525,7 @@ int wpas_ap_wps_nfc_report_handover(stru
#endif /* CONFIG_WPS */
if (wpa_s->ap_iface) {
pos += ap_ctrl_iface_wpa_get_status(wpa_s, pos,
end - pos,
-@@ -13007,6 +13007,7 @@ char * wpa_supplicant_ctrl_iface_process
+@@ -13005,6 +13005,7 @@ char * wpa_supplicant_ctrl_iface_process
reply_len = -1;
} else if (os_strncmp(buf, "NOTE ", 5) == 0) {
wpa_printf(MSG_INFO, "NOTE: %s", buf + 5);
} else if (os_strcmp(buf, "MIB") == 0) {
reply_len = wpa_sm_get_mib(wpa_s->wpa, reply, reply_size);
if (reply_len >= 0) {
-@@ -13019,6 +13020,7 @@ char * wpa_supplicant_ctrl_iface_process
+@@ -13017,6 +13018,7 @@ char * wpa_supplicant_ctrl_iface_process
reply_size - reply_len);
#endif /* CONFIG_MACSEC */
}
} else if (os_strncmp(buf, "STATUS", 6) == 0) {
reply_len = wpa_supplicant_ctrl_iface_status(
wpa_s, buf + 6, reply, reply_size);
-@@ -13506,6 +13508,7 @@ char * wpa_supplicant_ctrl_iface_process
+@@ -13504,6 +13506,7 @@ char * wpa_supplicant_ctrl_iface_process
reply_len = wpa_supplicant_ctrl_iface_bss(
wpa_s, buf + 4, reply, reply_size);
#ifdef CONFIG_AP
} 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) {
-@@ -13514,12 +13517,15 @@ char * wpa_supplicant_ctrl_iface_process
+@@ -13512,12 +13515,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);
{ STR(id_str) },
--- a/wpa_supplicant/config_file.c
+++ b/wpa_supplicant/config_file.c
-@@ -868,6 +868,7 @@ static void wpa_config_write_network(FIL
+@@ -869,6 +869,7 @@ static void wpa_config_write_network(FIL
INT(mode);
#ifdef CONFIG_MESH
INT(no_auto_peer);
/*
--- a/wpa_supplicant/wpa_supplicant.c
+++ b/wpa_supplicant/wpa_supplicant.c
-@@ -3046,7 +3046,7 @@ static bool ibss_mesh_can_use_vht(struct
+@@ -3048,7 +3048,7 @@ static bool ibss_mesh_can_use_vht(struct
const struct wpa_ssid *ssid,
struct hostapd_hw_modes *mode)
{
return false;
if (!drv_supports_vht(wpa_s, ssid))
-@@ -3120,7 +3120,7 @@ static void ibss_mesh_select_40mhz(struc
+@@ -3122,7 +3122,7 @@ static void ibss_mesh_select_40mhz(struc
int i, res;
unsigned int j;
static const int ht40plus_5ghz[] = {
149, 157, 165, 173, 184, 192
};
static const int ht40plus_6ghz[] = {
-@@ -3473,7 +3473,7 @@ void ibss_mesh_setup_freq(struct wpa_sup
+@@ -3475,7 +3475,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;
u8 channel;
bool is_6ghz, is_24ghz;
bool dfs_enabled = wpa_s->conf->country[0] && (wpa_s->drv_flags & WPA_DRIVER_FLAGS_RADAR);
-@@ -3517,6 +3517,8 @@ void ibss_mesh_setup_freq(struct wpa_sup
+@@ -3519,6 +3519,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;
--- a/wpa_supplicant/wpa_supplicant.c
+++ b/wpa_supplicant/wpa_supplicant.c
-@@ -6401,7 +6401,7 @@ wpa_supplicant_alloc(struct wpa_supplica
+@@ -6404,7 +6404,7 @@ wpa_supplicant_alloc(struct wpa_supplica
if (wpa_s == NULL)
return NULL;
wpa_s->scan_req = INITIAL_SCAN_REQ;
--- a/wpa_supplicant/ap.c
+++ b/wpa_supplicant/ap.c
-@@ -1849,17 +1849,37 @@ int ap_switch_channel(struct wpa_supplic
+@@ -1851,17 +1851,37 @@ int ap_switch_channel(struct wpa_supplic
#ifdef CONFIG_CTRL_IFACE
}
if (ret >= 0 && is_p2p_net_interface(iftype)) {
-@@ -8685,8 +8707,8 @@ static int i802_set_wds_sta(void *priv,
+@@ -8688,8 +8710,8 @@ static int i802_set_wds_sta(void *priv,
if (!if_nametoindex(name)) {
if (nl80211_create_iface(drv, name,
NL80211_IFTYPE_AP_VLAN,
return -1;
if (bridge_ifname)
-@@ -9057,7 +9079,8 @@ static int wpa_driver_nl80211_if_add(voi
+@@ -9060,7 +9082,8 @@ static int wpa_driver_nl80211_if_add(voi
os_memset(&p2pdev_info, 0, sizeof(p2pdev_info));
ifidx = nl80211_create_iface(drv, ifname, nlmode, addr,
&p2pdev_info, use_existing);
if (!p2pdev_info.wdev_id_set || ifidx != 0) {
wpa_printf(MSG_ERROR, "nl80211: Failed to create a P2P Device interface %s",
-@@ -9074,7 +9097,8 @@ static int wpa_driver_nl80211_if_add(voi
+@@ -9077,7 +9100,8 @@ static int wpa_driver_nl80211_if_add(voi
(long long unsigned int) p2pdev_info.wdev_id);
} else {
ifidx = nl80211_create_iface(drv, ifname, nlmode, addr,
if (use_existing && ifidx == -ENFILE) {
added = 0;
ifidx = if_nametoindex(ifname);
-@@ -9144,6 +9168,8 @@ static int wpa_driver_nl80211_if_add(voi
+@@ -9147,6 +9171,8 @@ static int wpa_driver_nl80211_if_add(voi
new_bss->ctx = bss_ctx;
new_bss->added_if = added;
* macsec_policy - Determines the policy for MACsec secure session
--- a/wpa_supplicant/wpa_supplicant.c
+++ b/wpa_supplicant/wpa_supplicant.c
-@@ -4685,6 +4685,12 @@ static void wpas_start_assoc_cb(struct w
+@@ -4687,6 +4687,12 @@ static void wpas_start_assoc_cb(struct w
params.beacon_int = ssid->beacon_int;
else
params.beacon_int = wpa_s->conf->beacon_int;
--- a/src/drivers/driver.h
+++ b/src/drivers/driver.h
-@@ -1960,6 +1960,7 @@ struct wpa_driver_mesh_join_params {
+@@ -1965,6 +1965,7 @@ struct wpa_driver_mesh_join_params {
#define WPA_DRIVER_MESH_FLAG_AMPE 0x00000008
unsigned int flags;
bool handle_dfs;
struct wpa_driver_set_key_params {
--- a/src/drivers/driver_nl80211.c
+++ b/src/drivers/driver_nl80211.c
-@@ -12363,6 +12363,18 @@ static int nl80211_put_mesh_id(struct nl
+@@ -12373,6 +12373,18 @@ static int nl80211_put_mesh_id(struct nl
}
static int nl80211_put_mesh_config(struct nl_msg *msg,
struct wpa_driver_mesh_bss_params *params)
{
-@@ -12424,6 +12436,7 @@ static int nl80211_join_mesh(struct i802
+@@ -12434,6 +12446,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) ||
--- a/wpa_supplicant/wpa_supplicant.c
+++ b/wpa_supplicant/wpa_supplicant.c
-@@ -3480,6 +3480,10 @@ void ibss_mesh_setup_freq(struct wpa_sup
+@@ -3482,6 +3482,10 @@ void ibss_mesh_setup_freq(struct wpa_sup
freq->freq = ssid->frequency;
#ifdef CONFIG_P2P
if (elems.p2p) {
wpabuf_free(sta->p2p_ie);
-@@ -1414,6 +1424,7 @@ void hostapd_event_ch_switch(struct host
+@@ -1409,6 +1419,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);
struct hostapd_iface * hostapd_alloc_iface(void);
--- a/src/ap/ieee802_11.c
+++ b/src/ap/ieee802_11.c
-@@ -3091,7 +3091,7 @@ static void handle_auth(struct hostapd_d
+@@ -3134,7 +3134,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;
u16 fc;
const u8 *challenge = NULL;
u8 resp_ies[2 + WLAN_AUTH_CHALLENGE_LEN];
-@@ -3102,6 +3102,11 @@ static void handle_auth(struct hostapd_d
+@@ -3145,6 +3145,11 @@ static void handle_auth(struct hostapd_d
#ifdef CONFIG_IEEE80211BE
bool mld_sta = false;
#endif /* CONFIG_IEEE80211BE */
if (len < IEEE80211_HDRLEN + sizeof(mgmt->u.auth)) {
wpa_printf(MSG_INFO, "handle_auth - too short payload (len=%lu)",
-@@ -3298,6 +3303,13 @@ static void handle_auth(struct hostapd_d
+@@ -3341,6 +3346,13 @@ static void handle_auth(struct hostapd_d
resp = WLAN_STATUS_UNSPECIFIED_FAILURE;
goto fail;
}
if (res == HOSTAPD_ACL_PENDING)
return;
-@@ -5659,7 +5671,7 @@ static void handle_assoc(struct hostapd_
+@@ -5723,7 +5735,7 @@ static void handle_assoc(struct hostapd_
int resp = WLAN_STATUS_SUCCESS;
u16 reply_res = WLAN_STATUS_UNSPECIFIED_FAILURE;
const u8 *pos;
struct sta_info *sta;
u8 *tmp = NULL;
#ifdef CONFIG_FILS
-@@ -5901,6 +5913,11 @@ static void handle_assoc(struct hostapd_
+@@ -5965,6 +5977,11 @@ static void handle_assoc(struct hostapd_
left = res;
}
#endif /* CONFIG_FILS */
/* followed by SSID and Supported rates; and HT capabilities if 802.11n
* is used */
-@@ -6009,6 +6026,13 @@ static void handle_assoc(struct hostapd_
+@@ -6073,6 +6090,13 @@ static void handle_assoc(struct hostapd_
if (set_beacon)
ieee802_11_update_beacons(hapd->iface);
fail:
/*
-@@ -6238,6 +6262,7 @@ static void handle_disassoc(struct hosta
+@@ -6302,6 +6326,7 @@ static void handle_disassoc(struct hosta
(unsigned long) len);
return;
}
sta = ap_get_sta(hapd, mgmt->sa);
if (!sta) {
-@@ -6269,6 +6294,8 @@ static void handle_deauth(struct hostapd
+@@ -6333,6 +6358,8 @@ static void handle_deauth(struct hostapd
/* Clear the PTKSA cache entries for PASN */
ptksa_cache_flush(hapd->ptksa, mgmt->sa, WPA_CIPHER_NONE);
ap_free_sta(hapd, sta);
break;
}
-@@ -1590,15 +1592,28 @@ void ap_sta_set_authorized_event(struct
+@@ -1590,17 +1592,30 @@ void ap_sta_set_authorized_event(struct
os_snprintf(buf, sizeof(buf), MACSTR, MAC2STR(sta->addr));
if (authorized) {
char dpp_pkhash_buf[100];
char keyid_buf[100];
char ip_addr[100];
+ char vlanid_buf[20];
+ char alg_buf[100];
dpp_pkhash_buf[0] = '\0';
keyid_buf[0] = '\0';
ip_addr[0] = '\0';
+ vlanid_buf[0] = '\0';
+ alg_buf[0] = '\0';
+
#ifdef CONFIG_P2P
if (wpa_auth_get_ip_addr(sta->wpa_sm, ip_addr_buf) == 0) {
- os_snprintf(ip_addr, sizeof(ip_addr),
-@@ -1609,6 +1624,13 @@ void ap_sta_set_authorized_event(struct
+@@ -1612,6 +1627,13 @@ void ap_sta_set_authorized_event(struct
}
#endif /* CONFIG_P2P */
keyid = ap_sta_wpa_get_keyid(hapd, sta);
if (keyid) {
os_snprintf(keyid_buf, sizeof(keyid_buf),
-@@ -1627,17 +1649,19 @@ void ap_sta_set_authorized_event(struct
- dpp_pkhash, SHA256_MAC_LEN);
- }
+@@ -1636,17 +1658,19 @@ void ap_sta_set_authorized_event(struct
+ " vlanid=%u", sta->vlan_id);
+ #endif /* CONFIG_NO_VLAN */
-- wpa_msg(hapd->msg_ctx, MSG_INFO, AP_STA_CONNECTED "%s%s%s%s",
-- buf, ip_addr, keyid_buf, dpp_pkhash_buf);
+- wpa_msg(hapd->msg_ctx, MSG_INFO, AP_STA_CONNECTED "%s%s%s%s%s",
+- buf, ip_addr, keyid_buf, dpp_pkhash_buf, vlanid_buf);
+ hostapd_ubus_notify_authorized(hapd, sta, auth_alg);
-+ wpa_msg(hapd->msg_ctx, MSG_INFO, AP_STA_CONNECTED "%s%s%s%s%s",
-+ buf, ip_addr, keyid_buf, dpp_pkhash_buf, alg_buf);
++ wpa_msg(hapd->msg_ctx, MSG_INFO, AP_STA_CONNECTED "%s%s%s%s%s%s",
++ buf, ip_addr, keyid_buf, dpp_pkhash_buf, vlanid_buf, alg_buf);
if (hapd->msg_ctx_parent &&
hapd->msg_ctx_parent != hapd->msg_ctx)
wpa_msg_no_global(hapd->msg_ctx_parent, MSG_INFO,
-- AP_STA_CONNECTED "%s%s%s%s",
-+ AP_STA_CONNECTED "%s%s%s%s%s",
+- AP_STA_CONNECTED "%s%s%s%s%s",
++ AP_STA_CONNECTED "%s%s%s%s%s%s",
buf, ip_addr, keyid_buf,
-- dpp_pkhash_buf);
-+ dpp_pkhash_buf, alg_buf);
+- dpp_pkhash_buf, vlanid_buf);
++ dpp_pkhash_buf, vlanid_buf, alg_buf);
} else {
wpa_msg(hapd->msg_ctx, MSG_INFO, AP_STA_DISCONNECTED "%s", buf);
+ hostapd_ubus_notify(hapd, "disassoc", sta->addr);
break;
--- a/wpa_supplicant/wpa_supplicant.c
+++ b/wpa_supplicant/wpa_supplicant.c
-@@ -8261,6 +8261,8 @@ struct wpa_supplicant * wpa_supplicant_a
+@@ -8289,6 +8289,8 @@ struct wpa_supplicant * wpa_supplicant_a
}
#endif /* CONFIG_P2P */
return wpa_s;
}
-@@ -8287,6 +8289,8 @@ int wpa_supplicant_remove_iface(struct w
+@@ -8315,6 +8317,8 @@ int wpa_supplicant_remove_iface(struct w
struct wpa_supplicant *parent = wpa_s->parent;
#endif /* CONFIG_MESH */
/* Remove interface from the global list of interfaces */
prev = global->ifaces;
if (prev == wpa_s) {
-@@ -8633,8 +8637,12 @@ int wpa_supplicant_run(struct wpa_global
+@@ -8661,8 +8665,12 @@ int wpa_supplicant_run(struct wpa_global
eloop_register_signal_terminate(wpa_supplicant_terminate, global);
eloop_register_signal_reconfig(wpa_supplicant_reconfig, global);
ifdef CONFIG_CODE_COVERAGE
--- a/hostapd/ctrl_iface.c
+++ b/hostapd/ctrl_iface.c
-@@ -6037,6 +6037,7 @@ try_again:
+@@ -6061,6 +6061,7 @@ try_again:
return -1;
}
wpa_msg_register_cb(hostapd_ctrl_iface_msg_cb);
return 0;
-@@ -6138,6 +6139,7 @@ fail:
+@@ -6162,6 +6163,7 @@ fail:
os_free(fname);
interface->global_ctrl_sock = s;
void hostapd_switch_color(struct hostapd_data *hapd, u64 bitmap);
--- a/src/drivers/driver.h
+++ b/src/drivers/driver.h
-@@ -4067,6 +4067,25 @@ struct wpa_driver_ops {
+@@ -4072,6 +4072,25 @@ struct wpa_driver_ops {
const char *ifname);
/**
* 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)
-@@ -6896,6 +6915,7 @@ union wpa_event_data {
+@@ -6901,6 +6920,7 @@ union wpa_event_data {
/**
* struct ch_switch
* @freq: Frequency of new channel in MHz
* @ht_enabled: Whether this is an HT channel
* @ch_offset: Secondary channel offset
-@@ -6906,6 +6926,7 @@ union wpa_event_data {
+@@ -6911,6 +6931,7 @@ union wpa_event_data {
* @punct_bitmap: Puncturing bitmap
*/
struct ch_switch {
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,
-@@ -8851,6 +8872,7 @@ static void *i802_init(struct hostapd_da
+@@ -8854,6 +8875,7 @@ static void *i802_init(struct hostapd_da
char master_ifname[IFNAMSIZ];
int ifindex, br_ifindex = 0;
int br_added = 0;
bss = wpa_driver_nl80211_drv_init(hapd, params->ifname,
params->global_priv, 1,
-@@ -8911,21 +8933,17 @@ static void *i802_init(struct hostapd_da
+@@ -8914,21 +8936,17 @@ static void *i802_init(struct hostapd_da
(params->num_bridge == 0 || !params->bridge[0]))
add_ifidx(drv, br_ifindex, drv->ifindex);
}
if (drv->capa.flags2 & WPA_DRIVER_FLAGS2_CONTROL_PORT_RX) {
-@@ -9304,6 +9322,50 @@ static int wpa_driver_nl80211_if_remove(
+@@ -9307,6 +9325,50 @@ static int wpa_driver_nl80211_if_remove(
return 0;
}
static int cookie_handler(struct nl_msg *msg, void *arg)
{
-@@ -11182,6 +11244,37 @@ static bool nl80211_is_drv_shared(void *
+@@ -11192,6 +11254,37 @@ static bool nl80211_is_drv_shared(void *
#endif /* CONFIG_IEEE80211BE */
static int driver_nl80211_send_mlme(void *priv, const u8 *data,
size_t data_len, int noack,
unsigned int freq,
-@@ -15001,6 +15094,8 @@ const struct wpa_driver_ops wpa_driver_n
+@@ -15011,6 +15104,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,
CFLAGS += -DEAP_SERVER -DEAP_SERVER_IDENTITY
--- a/wpa_supplicant/events.c
+++ b/wpa_supplicant/events.c
-@@ -6291,6 +6291,7 @@ void supplicant_event(void *ctx, enum wp
+@@ -6293,6 +6293,7 @@ void supplicant_event(void *ctx, enum wp
event_to_string(event), event);
#endif /* CONFIG_NO_STDOUT_DEBUG */
#ifdef CONFIG_FST
--- a/wpa_supplicant/wpa_supplicant.c
+++ b/wpa_supplicant/wpa_supplicant.c
-@@ -1276,6 +1276,7 @@ void wpa_supplicant_set_state(struct wpa
+@@ -1278,6 +1278,7 @@ void wpa_supplicant_set_state(struct wpa
sme_sched_obss_scan(wpa_s, 0);
}
wpa_s->wpa_state = state;
#ifndef CONFIG_NO_ROBUST_AV
if (state == WPA_COMPLETED && dl_list_len(&wpa_s->active_scs_ids) &&
-@@ -8262,6 +8263,7 @@ struct wpa_supplicant * wpa_supplicant_a
+@@ -8290,6 +8291,7 @@ struct wpa_supplicant * wpa_supplicant_a
#endif /* CONFIG_P2P */
wpas_ubus_add_bss(wpa_s);
return wpa_s;
}
-@@ -8289,6 +8291,7 @@ int wpa_supplicant_remove_iface(struct w
+@@ -8317,6 +8319,7 @@ int wpa_supplicant_remove_iface(struct w
struct wpa_supplicant *parent = wpa_s->parent;
#endif /* CONFIG_MESH */
wpas_ubus_free_bss(wpa_s);
/* Remove interface from the global list of interfaces */
-@@ -8599,6 +8602,7 @@ struct wpa_global * wpa_supplicant_init(
+@@ -8627,6 +8630,7 @@ struct wpa_global * wpa_supplicant_init(
eloop_register_timeout(WPA_SUPPLICANT_CLEANUP_INTERVAL, 0,
wpas_periodic, global, NULL);
return global;
}
-@@ -8637,12 +8641,8 @@ int wpa_supplicant_run(struct wpa_global
+@@ -8665,12 +8669,8 @@ int wpa_supplicant_run(struct wpa_global
eloop_register_signal_terminate(wpa_supplicant_terminate, global);
eloop_register_signal_reconfig(wpa_supplicant_reconfig, global);
return 0;
}
-@@ -8675,6 +8675,8 @@ void wpa_supplicant_deinit(struct wpa_gl
+@@ -8703,6 +8703,8 @@ void wpa_supplicant_deinit(struct wpa_gl
wpas_notify_supplicant_deinitialized(global);
#endif /* CONFIG_MATCH_IFACE */
--- a/src/ap/ieee802_11.c
+++ b/src/ap/ieee802_11.c
-@@ -631,12 +631,17 @@ const char * sae_get_password(struct hos
+@@ -659,12 +659,17 @@ const char * sae_get_password(struct hos
struct sae_pt **s_pt,
const struct sae_pk **s_pk)
{
/* With sae_track_password functionality enabled, try to first find the
* next viable wildcard-address password if a password identifier was
* not used. Select an wildcard-addr entry if the STA is known to have
-@@ -697,12 +702,30 @@ const char * sae_get_password(struct hos
+@@ -725,12 +730,30 @@ const char * sae_get_password(struct hos
pt = hapd->conf->ssid.pt;
}
}
}
-@@ -3446,6 +3469,12 @@ static void handle_auth(struct hostapd_d
+@@ -3489,6 +3512,12 @@ static void handle_auth(struct hostapd_d
goto fail;
}
if (vlan_id)
*vlan_id = 0;
if (psk_len)
-@@ -438,13 +439,18 @@ static const u8 * hostapd_wpa_auth_get_p
+@@ -442,13 +443,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)
*/
if (pos->is_passphrase) {
if (pbkdf2_sha1(pos->passphrase,
hapd->conf->ssid.ssid,
-@@ -458,9 +464,13 @@ static const u8 * hostapd_wpa_auth_get_p
+@@ -462,9 +468,13 @@ static const u8 * hostapd_wpa_auth_get_p
}
if (pos->psk == prev_psk) {
psk = pos->next ? pos->next->psk : NULL;
int bridge_hairpin; /* hairpin_mode on bridge members */
--- a/src/ap/wpa_auth_glue.c
+++ b/src/ap/wpa_auth_glue.c
-@@ -1844,8 +1844,12 @@ int hostapd_setup_wpa(struct hostapd_dat
+@@ -1848,8 +1848,12 @@ int hostapd_setup_wpa(struct hostapd_dat
wpa_key_mgmt_ft(hapd->conf->wpa_key_mgmt)) {
const char *ft_iface;
hapd->x_snoop_initialized = false;
--- a/src/drivers/driver.h
+++ b/src/drivers/driver.h
-@@ -4493,7 +4493,7 @@ struct wpa_driver_ops {
+@@ -4498,7 +4498,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,
* get_wowlan - Get wake-on-wireless status
--- a/src/drivers/driver_nl80211.c
+++ b/src/drivers/driver_nl80211.c
-@@ -12883,7 +12883,7 @@ static const char * drv_br_net_param_str
+@@ -12893,7 +12893,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,
{
struct i802_bss *bss = priv;
char path[128];
-@@ -12909,8 +12909,11 @@ static int wpa_driver_br_set_net_param(v
+@@ -12919,8 +12919,11 @@ static int wpa_driver_br_set_net_param(v
return -EINVAL;
}
int radius_require_message_authenticator;
--- a/src/ap/ieee802_1x.c
+++ b/src/ap/ieee802_1x.c
-@@ -597,6 +597,10 @@ int add_common_radius_attr(struct hostap
+@@ -602,6 +602,10 @@ int add_common_radius_attr(struct hostap
struct hostapd_radius_attr *attr;
int len;
--- a/src/ap/ieee802_1x.c
+++ b/src/ap/ieee802_1x.c
-@@ -2000,6 +2000,25 @@ static int ieee802_1x_update_vlan(struct
+@@ -2005,6 +2005,25 @@ static int ieee802_1x_update_vlan(struct
}
#endif /* CONFIG_NO_VLAN */
/**
* ieee802_1x_receive_auth - Process RADIUS frames from Authentication Server
-@@ -2116,6 +2135,7 @@ ieee802_1x_receive_auth(struct radius_ms
+@@ -2121,6 +2140,7 @@ ieee802_1x_receive_auth(struct radius_ms
ieee802_1x_check_hs20(hapd, sta, msg,
session_timeout_set ?
(int) session_timeout : -1);
#ifdef CONFIG_FILS
static struct wpabuf *
-@@ -3837,8 +3840,8 @@ static u16 check_multi_ap(struct hostapd
+@@ -3880,8 +3883,8 @@ static u16 check_multi_ap(struct hostapd
}
{
/* Supported rates not used in IEEE 802.11ad/DMG */
if (hapd->iface->current_mode &&
-@@ -4283,7 +4286,7 @@ static int __check_assoc_ies(struct host
+@@ -4326,7 +4329,7 @@ static int __check_assoc_ies(struct host
elems->ext_capab_len);
if (resp != WLAN_STATUS_SUCCESS)
return resp;
if (resp != WLAN_STATUS_SUCCESS)
return resp;
-@@ -6358,6 +6361,11 @@ static void handle_beacon(struct hostapd
+@@ -6422,6 +6425,11 @@ static void handle_beacon(struct hostapd
0);
ap_list_process_beacon(hapd->iface, mgmt, &elems, fi);
u16 copy_sta_vendor_vht(struct hostapd_data *hapd, struct sta_info *sta,
--- a/src/drivers/driver.h
+++ b/src/drivers/driver.h
-@@ -4187,7 +4187,7 @@ struct wpa_driver_ops {
+@@ -4192,7 +4192,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,
* send_action - Transmit an Action frame
--- a/src/drivers/driver_nl80211.c
+++ b/src/drivers/driver_nl80211.c
-@@ -8703,25 +8703,15 @@ static int have_ifidx(struct wpa_driver_
+@@ -8706,25 +8706,15 @@ static int have_ifidx(struct wpa_driver_
static int i802_set_wds_sta(void *priv, const u8 *addr, int aid, int val,
--- a/src/ap/sta_info.c
+++ b/src/ap/sta_info.c
-@@ -1972,3 +1972,22 @@ void ap_sta_free_sta_profile(struct mld_
+@@ -1981,3 +1981,22 @@ void ap_sta_free_sta_profile(struct mld_
}
}
#endif /* CONFIG_IEEE80211BE */