aboutsummaryrefslogtreecommitdiffstats
path: root/package/network/services/hostapd/patches
diff options
context:
space:
mode:
Diffstat (limited to 'package/network/services/hostapd/patches')
-rw-r--r--package/network/services/hostapd/patches/000-nl80211-Report-new-station-assoc-event-for-the-corre.patch37
-rw-r--r--package/network/services/hostapd/patches/100-madwifi_key_fixes.patch34
-rw-r--r--package/network/services/hostapd/patches/110-bool_fix.patch2
-rw-r--r--package/network/services/hostapd/patches/120-daemonize_fix.patch2
-rw-r--r--package/network/services/hostapd/patches/130-no_eapol_fix.patch2
-rw-r--r--package/network/services/hostapd/patches/200-multicall.patch54
-rw-r--r--package/network/services/hostapd/patches/300-noscan.patch14
-rw-r--r--package/network/services/hostapd/patches/310-rescan_immediately.patch4
-rw-r--r--package/network/services/hostapd/patches/320-optional_rfkill.patch8
-rw-r--r--package/network/services/hostapd/patches/330-nl80211_fix_set_freq.patch16
-rw-r--r--package/network/services/hostapd/patches/340-reload_freq_change.patch5
-rw-r--r--package/network/services/hostapd/patches/350-nl80211_del_beacon_bss.patch74
-rw-r--r--package/network/services/hostapd/patches/360-ctrl_iface_reload.patch36
-rw-r--r--package/network/services/hostapd/patches/370-ap_sta_support.patch32
-rw-r--r--package/network/services/hostapd/patches/380-disable_ctrl_iface_mib.patch45
-rw-r--r--package/network/services/hostapd/patches/390-wpa_ie_cap_workaround.patch4
-rw-r--r--package/network/services/hostapd/patches/400-wps_single_auth_enc_type.patch6
-rw-r--r--package/network/services/hostapd/patches/410-limit_debug_messages.patch22
-rw-r--r--package/network/services/hostapd/patches/420-indicate-features.patch4
-rw-r--r--package/network/services/hostapd/patches/430-hostapd_cli_ifdef.patch6
-rw-r--r--package/network/services/hostapd/patches/431-wpa_cli_ifdef.patch2
-rw-r--r--package/network/services/hostapd/patches/440-max_num_sta_probe.patch2
-rw-r--r--package/network/services/hostapd/patches/450-scan_wait.patch8
-rw-r--r--package/network/services/hostapd/patches/460-wpa_supplicant-add-new-config-params-to-be-used-with.patch15
-rw-r--r--package/network/services/hostapd/patches/461-driver_nl80211-use-new-parameters-during-ibss-join.patch28
-rw-r--r--package/network/services/hostapd/patches/462-wpa_s-support-htmode-param.patch22
-rw-r--r--package/network/services/hostapd/patches/600-ubus_support.patch46
-rw-r--r--package/network/services/hostapd/patches/700-Add-os_snprintf_error-helper.patch29
-rw-r--r--package/network/services/hostapd/patches/710-Add-network-specific-BSSID-black-and-white-lists.patch649
29 files changed, 240 insertions, 968 deletions
diff --git a/package/network/services/hostapd/patches/000-nl80211-Report-new-station-assoc-event-for-the-corre.patch b/package/network/services/hostapd/patches/000-nl80211-Report-new-station-assoc-event-for-the-corre.patch
deleted file mode 100644
index 8fe4a0e9db..0000000000
--- a/package/network/services/hostapd/patches/000-nl80211-Report-new-station-assoc-event-for-the-corre.patch
+++ /dev/null
@@ -1,37 +0,0 @@
---- a/src/drivers/driver_nl80211.c
-+++ b/src/drivers/driver_nl80211.c
-@@ -2640,6 +2640,7 @@ static void nl80211_new_peer_candidate(s
-
-
- static void nl80211_new_station_event(struct wpa_driver_nl80211_data *drv,
-+ struct i802_bss *bss,
- struct nlattr **tb)
- {
- u8 *addr;
-@@ -2658,7 +2659,7 @@ static void nl80211_new_station_event(st
- ies_len = nla_len(tb[NL80211_ATTR_IE]);
- }
- wpa_hexdump(MSG_DEBUG, "nl80211: Assoc Req IEs", ies, ies_len);
-- drv_event_assoc(drv->ctx, addr, ies, ies_len, 0);
-+ drv_event_assoc(bss->ctx, addr, ies, ies_len, 0);
- return;
- }
-
-@@ -2667,7 +2668,7 @@ static void nl80211_new_station_event(st
-
- os_memset(&data, 0, sizeof(data));
- os_memcpy(data.ibss_rsn_start.peer, addr, ETH_ALEN);
-- wpa_supplicant_event(drv->ctx, EVENT_IBSS_RSN_START, &data);
-+ wpa_supplicant_event(bss->ctx, EVENT_IBSS_RSN_START, &data);
- }
-
-
-@@ -3309,7 +3310,7 @@ static void do_process_drv_event(struct
- &data);
- break;
- case NL80211_CMD_NEW_STATION:
-- nl80211_new_station_event(drv, tb);
-+ nl80211_new_station_event(drv, bss, tb);
- break;
- case NL80211_CMD_DEL_STATION:
- nl80211_del_station_event(drv, tb);
diff --git a/package/network/services/hostapd/patches/100-madwifi_key_fixes.patch b/package/network/services/hostapd/patches/100-madwifi_key_fixes.patch
deleted file mode 100644
index a46943b442..0000000000
--- a/package/network/services/hostapd/patches/100-madwifi_key_fixes.patch
+++ /dev/null
@@ -1,34 +0,0 @@
---- a/src/drivers/driver_madwifi.c
-+++ b/src/drivers/driver_madwifi.c
-@@ -449,7 +449,9 @@ wpa_driver_madwifi_set_key(const char *i
-
- memset(&wk, 0, sizeof(wk));
- wk.ik_type = cipher;
-- wk.ik_flags = IEEE80211_KEY_RECV | IEEE80211_KEY_XMIT;
-+ wk.ik_flags = IEEE80211_KEY_RECV;
-+ if (set_tx)
-+ wk.ik_flags |= IEEE80211_KEY_XMIT;
- if (addr == NULL || is_broadcast_ether_addr(addr)) {
- memset(wk.ik_macaddr, 0xff, IEEE80211_ADDR_LEN);
- wk.ik_keyix = key_idx;
-@@ -461,6 +463,20 @@ wpa_driver_madwifi_set_key(const char *i
- wk.ik_keylen = key_len;
- memcpy(wk.ik_keydata, key, key_len);
-
-+#ifdef WORDS_BIGENDIAN
-+#define WPA_KEY_RSC_LEN 8
-+ {
-+ size_t i;
-+ u8 tmp[WPA_KEY_RSC_LEN];
-+ os_memset(tmp, 0, sizeof(tmp));
-+ for (i = 0; i < seq_len; i++)
-+ tmp[WPA_KEY_RSC_LEN - i - 1] = seq[i];
-+ os_memcpy(&wk.ik_keyrsc, tmp, WPA_KEY_RSC_LEN);
-+ }
-+#else /* WORDS_BIGENDIAN */
-+ os_memcpy(&wk.ik_keyrsc, seq, seq_len);
-+#endif /* WORDS_BIGENDIAN */
-+
- ret = set80211priv(drv, IEEE80211_IOCTL_SETKEY, &wk, sizeof(wk));
- if (ret < 0) {
- wpa_printf(MSG_DEBUG, "%s: Failed to set key (addr %s"
diff --git a/package/network/services/hostapd/patches/110-bool_fix.patch b/package/network/services/hostapd/patches/110-bool_fix.patch
index 9cab8abdb1..865c014ee3 100644
--- a/package/network/services/hostapd/patches/110-bool_fix.patch
+++ b/package/network/services/hostapd/patches/110-bool_fix.patch
@@ -1,6 +1,6 @@
--- a/src/ap/ieee802_1x.c
+++ b/src/ap/ieee802_1x.c
-@@ -2232,9 +2232,9 @@ void ieee802_1x_notify_pre_auth(struct e
+@@ -2332,9 +2332,9 @@ void ieee802_1x_notify_pre_auth(struct e
}
diff --git a/package/network/services/hostapd/patches/120-daemonize_fix.patch b/package/network/services/hostapd/patches/120-daemonize_fix.patch
index 54ace76793..07a146d1a0 100644
--- a/package/network/services/hostapd/patches/120-daemonize_fix.patch
+++ b/package/network/services/hostapd/patches/120-daemonize_fix.patch
@@ -66,8 +66,8 @@
-#else /* __APPLE__ */
-#define os_daemon daemon
-#endif /* __APPLE__ */
-
-
+
-int os_daemonize(const char *pid_file)
-{
-#if defined(__uClinux__) || defined(__sun__)
diff --git a/package/network/services/hostapd/patches/130-no_eapol_fix.patch b/package/network/services/hostapd/patches/130-no_eapol_fix.patch
index 3c19cb3cc4..d23b47b03c 100644
--- a/package/network/services/hostapd/patches/130-no_eapol_fix.patch
+++ b/package/network/services/hostapd/patches/130-no_eapol_fix.patch
@@ -1,6 +1,6 @@
--- a/wpa_supplicant/wpa_supplicant.c
+++ b/wpa_supplicant/wpa_supplicant.c
-@@ -247,9 +247,10 @@ void wpa_supplicant_cancel_auth_timeout(
+@@ -252,9 +252,10 @@ void wpa_supplicant_cancel_auth_timeout(
*/
void wpa_supplicant_initiate_eapol(struct wpa_supplicant *wpa_s)
{
diff --git a/package/network/services/hostapd/patches/200-multicall.patch b/package/network/services/hostapd/patches/200-multicall.patch
index 23180b924a..de4a3a8e7f 100644
--- a/package/network/services/hostapd/patches/200-multicall.patch
+++ b/package/network/services/hostapd/patches/200-multicall.patch
@@ -1,6 +1,6 @@
--- a/hostapd/Makefile
+++ b/hostapd/Makefile
-@@ -14,6 +14,7 @@ CFLAGS += -I$(abspath ../src/utils)
+@@ -17,6 +17,7 @@ export BINDIR ?= /usr/local/bin/
# CFLAGS += -DUSE_KERNEL_HEADERS -I/usr/src/linux/include
-include .config
@@ -8,7 +8,7 @@
ifdef CONFIG_TESTING_OPTIONS
CFLAGS += -DCONFIG_TESTING_OPTIONS
-@@ -224,10 +225,14 @@ ifdef CONFIG_IEEE80211AC
+@@ -242,10 +243,14 @@ ifdef CONFIG_IEEE80211AC
CFLAGS += -DCONFIG_IEEE80211AC
endif
@@ -26,7 +26,7 @@
LIBS += $(DRV_AP_LIBS)
ifdef CONFIG_L2_PACKET
-@@ -914,6 +919,12 @@ install: all
+@@ -941,6 +946,12 @@ install: $(addprefix $(DESTDIR)$(BINDIR)
BCHECK=../src/drivers/build.hostapd
@@ -39,7 +39,7 @@
hostapd: $(BCHECK) $(OBJS)
$(Q)$(CC) $(LDFLAGS) -o hostapd $(OBJS) $(LIBS)
@$(E) " LD " $@
-@@ -952,6 +963,12 @@ HOBJS += ../src/crypto/aes-internal.o
+@@ -980,6 +991,12 @@ HOBJS += ../src/crypto/aes-internal.o
HOBJS += ../src/crypto/aes-internal-enc.o
endif
@@ -54,7 +54,7 @@
@$(E) " LD " $@
--- a/wpa_supplicant/Makefile
+++ b/wpa_supplicant/Makefile
-@@ -14,6 +14,7 @@ CFLAGS += -I$(abspath ../src)
+@@ -15,6 +15,7 @@ CFLAGS += -I$(abspath ../src)
CFLAGS += -I$(abspath ../src/utils)
-include .config
@@ -62,7 +62,7 @@
ifdef CONFIG_TESTING_OPTIONS
CFLAGS += -DCONFIG_TESTING_OPTIONS
-@@ -745,6 +746,10 @@ ifdef CONFIG_DYNAMIC_EAP_METHODS
+@@ -773,6 +774,10 @@ ifdef CONFIG_DYNAMIC_EAP_METHODS
CFLAGS += -DCONFIG_DYNAMIC_EAP_METHODS
LIBS += -ldl -rdynamic
endif
@@ -73,7 +73,7 @@
endif
ifdef CONFIG_MACSEC
-@@ -765,9 +770,11 @@ NEED_EAP_COMMON=y
+@@ -793,9 +798,11 @@ NEED_EAP_COMMON=y
NEED_RSN_AUTHENTICATOR=y
CFLAGS += -DCONFIG_AP
OBJS += ap.o
@@ -85,7 +85,7 @@
OBJS += ../src/ap/hostapd.o
OBJS += ../src/ap/wpa_auth_glue.o
OBJS += ../src/ap/utils.o
-@@ -830,10 +837,18 @@ endif
+@@ -858,10 +865,18 @@ endif
ifdef CONFIG_HS20
OBJS += ../src/ap/hs20.o
endif
@@ -104,7 +104,7 @@
NEED_AES_WRAP=y
OBJS += ../src/ap/wpa_auth.o
OBJS += ../src/ap/wpa_auth_ie.o
-@@ -1589,6 +1604,12 @@ wpa_priv: $(BCHECK) $(OBJS_priv)
+@@ -1603,6 +1618,12 @@ wpa_priv: $(BCHECK) $(OBJS_priv)
$(OBJS_c) $(OBJS_t) $(OBJS_t2) $(OBJS) $(BCHECK) $(EXTRA_progs): .config
@@ -117,9 +117,9 @@
wpa_supplicant: $(BCHECK) $(OBJS) $(EXTRA_progs)
$(Q)$(LDO) $(LDFLAGS) -o wpa_supplicant $(OBJS) $(LIBS) $(EXTRALIBS)
@$(E) " LD " $@
-@@ -1669,6 +1690,12 @@ endif
- %@.service: %.service.arg.in
- sed -e 's|\@BINDIR\@|$(BINDIR)|g' $< >$@
+@@ -1694,6 +1715,12 @@ endif
+ $(Q)sed -e 's|\@BINDIR\@|$(BINDIR)|g' $< >$@
+ @$(E) " sed" $<
+dump_cflags:
+ @echo -n $(CFLAGS) " "
@@ -132,7 +132,7 @@
wpa_cli.exe: wpa_cli
--- a/src/drivers/driver.h
+++ b/src/drivers/driver.h
-@@ -4294,8 +4294,8 @@ union wpa_event_data {
+@@ -4581,8 +4581,8 @@ union wpa_event_data {
* Driver wrapper code should call this function whenever an event is received
* from the driver.
*/
@@ -145,7 +145,7 @@
/*
--- a/src/ap/drv_callbacks.c
+++ b/src/ap/drv_callbacks.c
-@@ -989,8 +989,8 @@ static void hostapd_event_dfs_nop_finish
+@@ -1075,8 +1075,8 @@ static void hostapd_event_dfs_cac_starte
#endif /* NEED_AP_MLME */
@@ -158,7 +158,7 @@
#ifndef CONFIG_NO_STDOUT_DEBUG
--- a/wpa_supplicant/wpa_priv.c
+++ b/wpa_supplicant/wpa_priv.c
-@@ -815,8 +815,8 @@ static void wpa_priv_send_ft_response(st
+@@ -819,8 +819,8 @@ static void wpa_priv_send_ft_response(st
}
@@ -169,7 +169,7 @@
{
struct wpa_priv_interface *iface = ctx;
-@@ -956,6 +956,7 @@ int main(int argc, char *argv[])
+@@ -961,6 +961,7 @@ int main(int argc, char *argv[])
if (os_program_init())
return -1;
@@ -179,7 +179,7 @@
for (;;) {
--- a/wpa_supplicant/events.c
+++ b/wpa_supplicant/events.c
-@@ -2924,8 +2924,8 @@ static void wpa_supplicant_event_assoc_a
+@@ -3138,8 +3138,8 @@ static void wpa_supplicant_event_assoc_a
}
@@ -192,7 +192,7 @@
--- a/wpa_supplicant/wpa_supplicant.c
+++ b/wpa_supplicant/wpa_supplicant.c
-@@ -3980,6 +3980,9 @@ static void wpa_supplicant_deinit_iface(
+@@ -4300,6 +4300,9 @@ static void wpa_supplicant_deinit_iface(
os_free(wpa_s);
}
@@ -202,17 +202,17 @@
/**
* wpa_supplicant_add_iface - Add a new network interface
-@@ -4181,6 +4184,7 @@ struct wpa_global * wpa_supplicant_init(
+@@ -4526,6 +4529,7 @@ 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 */
-
+ wpa_supplicant_event = supplicant_event;
- wpa_debug_open_file(params->wpa_debug_file_path);
- if (params->wpa_debug_syslog)
- wpa_debug_open_syslog();
+
+ if (params->wpa_debug_file_path)
+ wpa_debug_open_file(params->wpa_debug_file_path);
--- a/hostapd/main.c
+++ b/hostapd/main.c
-@@ -504,6 +504,9 @@ static int hostapd_get_ctrl_iface_group(
+@@ -511,6 +511,9 @@ static int hostapd_get_ctrl_iface_group(
return 0;
}
@@ -222,7 +222,7 @@
#ifdef CONFIG_WPS
static int gen_uuid(const char *txt_addr)
-@@ -555,6 +558,7 @@ int main(int argc, char *argv[])
+@@ -562,6 +565,7 @@ int main(int argc, char *argv[])
interfaces.global_iface_name = NULL;
interfaces.global_ctrl_sock = -1;
@@ -257,7 +257,7 @@
struct wpa_driver_ops *wpa_drivers[] = { NULL };
-@@ -1194,6 +1198,8 @@ static void usage(void)
+@@ -1203,6 +1207,8 @@ static void usage(void)
"option several times.\n");
}
@@ -266,7 +266,7 @@
int main(int argc, char *argv[])
{
-@@ -1212,6 +1218,7 @@ int main(int argc, char *argv[])
+@@ -1221,6 +1227,7 @@ int main(int argc, char *argv[])
if (os_program_init())
return -1;
diff --git a/package/network/services/hostapd/patches/300-noscan.patch b/package/network/services/hostapd/patches/300-noscan.patch
index 9910f89b7b..5b30abcc60 100644
--- a/package/network/services/hostapd/patches/300-noscan.patch
+++ b/package/network/services/hostapd/patches/300-noscan.patch
@@ -1,6 +1,6 @@
--- a/hostapd/config_file.c
+++ b/hostapd/config_file.c
-@@ -2651,6 +2651,8 @@ static int hostapd_config_fill(struct ho
+@@ -2771,6 +2771,8 @@ static int hostapd_config_fill(struct ho
}
#endif /* CONFIG_IEEE80211W */
#ifdef CONFIG_IEEE80211N
@@ -11,7 +11,7 @@
} else if (os_strcmp(buf, "ht_capab") == 0) {
--- a/src/ap/ap_config.h
+++ b/src/ap/ap_config.h
-@@ -605,6 +605,7 @@ struct hostapd_config {
+@@ -619,6 +619,7 @@ struct hostapd_config {
int ht_op_mode_fixed;
u16 ht_capab;
@@ -21,7 +21,7 @@
int require_ht;
--- a/src/ap/hw_features.c
+++ b/src/ap/hw_features.c
-@@ -690,7 +690,7 @@ static int ieee80211n_check_40mhz(struct
+@@ -461,7 +461,7 @@ static int ieee80211n_check_40mhz(struct
struct wpa_driver_scan_params params;
int ret;
@@ -32,17 +32,17 @@
hostapd_set_state(iface, HAPD_IFACE_HT_SCAN);
--- a/src/ap/ieee802_11_ht.c
+++ b/src/ap/ieee802_11_ht.c
-@@ -220,6 +220,9 @@ void hostapd_2040_coex_action(struct hos
+@@ -221,6 +221,9 @@ void hostapd_2040_coex_action(struct hos
if (!(iface->conf->ht_capab & HT_CAP_INFO_SUPP_CHANNEL_WIDTH_SET))
return;
+ if (iface->conf->noscan)
+ return;
+
- if (len < IEEE80211_HDRLEN + 1)
+ if (len < IEEE80211_HDRLEN + 2 + sizeof(*bc_ie))
return;
- data++;
-@@ -317,6 +320,9 @@ void ht40_intolerant_add(struct hostapd_
+
+@@ -346,6 +349,9 @@ void ht40_intolerant_add(struct hostapd_
if (iface->current_mode->mode != HOSTAPD_MODE_IEEE80211G)
return;
diff --git a/package/network/services/hostapd/patches/310-rescan_immediately.patch b/package/network/services/hostapd/patches/310-rescan_immediately.patch
index 878b61a655..7be8c32e3b 100644
--- a/package/network/services/hostapd/patches/310-rescan_immediately.patch
+++ b/package/network/services/hostapd/patches/310-rescan_immediately.patch
@@ -1,11 +1,11 @@
--- a/wpa_supplicant/wpa_supplicant.c
+++ b/wpa_supplicant/wpa_supplicant.c
-@@ -2914,7 +2914,7 @@ static struct wpa_supplicant * wpa_suppl
+@@ -3249,7 +3249,7 @@ wpa_supplicant_alloc(struct wpa_supplica
if (wpa_s == NULL)
return NULL;
wpa_s->scan_req = INITIAL_SCAN_REQ;
- wpa_s->scan_interval = 5;
+ wpa_s->scan_interval = 1;
wpa_s->new_connection = 1;
- wpa_s->parent = wpa_s;
+ wpa_s->parent = parent ? parent : wpa_s;
wpa_s->sched_scanning = 0;
diff --git a/package/network/services/hostapd/patches/320-optional_rfkill.patch b/package/network/services/hostapd/patches/320-optional_rfkill.patch
index 5cf80e52d5..75b4b07f82 100644
--- a/package/network/services/hostapd/patches/320-optional_rfkill.patch
+++ b/package/network/services/hostapd/patches/320-optional_rfkill.patch
@@ -1,6 +1,6 @@
--- a/src/drivers/drivers.mak
+++ b/src/drivers/drivers.mak
-@@ -30,7 +30,6 @@ NEED_SME=y
+@@ -34,7 +34,6 @@ NEED_SME=y
NEED_AP_MLME=y
NEED_NETLINK=y
NEED_LINUX_IOCTL=y
@@ -8,7 +8,7 @@
ifdef CONFIG_LIBNL32
DRV_LIBS += -lnl-3
-@@ -115,7 +114,6 @@ DRV_WPA_CFLAGS += -DCONFIG_DRIVER_WEXT
+@@ -116,7 +115,6 @@ DRV_WPA_CFLAGS += -DCONFIG_DRIVER_WEXT
CONFIG_WIRELESS_EXTENSION=y
NEED_NETLINK=y
NEED_LINUX_IOCTL=y
@@ -16,7 +16,7 @@
endif
ifdef CONFIG_DRIVER_NDIS
-@@ -141,7 +139,6 @@ endif
+@@ -142,7 +140,6 @@ endif
ifdef CONFIG_WIRELESS_EXTENSION
DRV_WPA_CFLAGS += -DCONFIG_WIRELESS_EXTENSION
DRV_WPA_OBJS += ../src/drivers/driver_wext.o
@@ -24,7 +24,7 @@
endif
ifdef NEED_NETLINK
-@@ -154,6 +151,7 @@ endif
+@@ -155,6 +152,7 @@ endif
ifdef NEED_RFKILL
DRV_OBJS += ../src/drivers/rfkill.o
diff --git a/package/network/services/hostapd/patches/330-nl80211_fix_set_freq.patch b/package/network/services/hostapd/patches/330-nl80211_fix_set_freq.patch
index 097f5c8383..dd90877e90 100644
--- a/package/network/services/hostapd/patches/330-nl80211_fix_set_freq.patch
+++ b/package/network/services/hostapd/patches/330-nl80211_fix_set_freq.patch
@@ -1,11 +1,11 @@
--- a/src/drivers/driver_nl80211.c
+++ b/src/drivers/driver_nl80211.c
-@@ -7840,7 +7840,7 @@ static int nl80211_set_channel(struct i8
- nl80211_cmd(drv, msg, 0, set_chan ? NL80211_CMD_SET_CHANNEL :
- NL80211_CMD_SET_WIPHY);
-
-- NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, drv->ifindex);
-+ NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, bss->ifindex);
- if (nl80211_put_freq_params(msg, freq) < 0)
- goto nla_put_failure;
+@@ -3616,7 +3616,7 @@ static int nl80211_set_channel(struct i8
+ freq->freq, freq->ht_enabled, freq->vht_enabled,
+ freq->bandwidth, freq->center_freq1, freq->center_freq2);
+- msg = nl80211_drv_msg(drv, 0, set_chan ? NL80211_CMD_SET_CHANNEL :
++ msg = nl80211_bss_msg(bss, 0, set_chan ? NL80211_CMD_SET_CHANNEL :
+ NL80211_CMD_SET_WIPHY);
+ if (!msg || nl80211_put_freq_params(msg, freq) < 0) {
+ nlmsg_free(msg);
diff --git a/package/network/services/hostapd/patches/340-reload_freq_change.patch b/package/network/services/hostapd/patches/340-reload_freq_change.patch
index 72ff21cc61..91b61964dd 100644
--- a/package/network/services/hostapd/patches/340-reload_freq_change.patch
+++ b/package/network/services/hostapd/patches/340-reload_freq_change.patch
@@ -1,6 +1,6 @@
--- a/src/ap/hostapd.c
+++ b/src/ap/hostapd.c
-@@ -71,6 +71,16 @@ static void hostapd_reload_bss(struct ho
+@@ -76,6 +76,16 @@ static void hostapd_reload_bss(struct ho
#endif /* CONFIG_NO_RADIUS */
ssid = &hapd->conf->ssid;
@@ -17,7 +17,7 @@
if (!ssid->wpa_psk_set && ssid->wpa_psk && !ssid->wpa_psk->next &&
ssid->wpa_passphrase_set && ssid->wpa_passphrase) {
/*
-@@ -171,20 +181,12 @@ int hostapd_reload_config(struct hostapd
+@@ -175,21 +185,12 @@ int hostapd_reload_config(struct hostapd
oldconf = hapd->iconf;
iface->conf = newconf;
@@ -28,6 +28,7 @@
hapd = iface->bss[j];
hapd->iconf = newconf;
- hapd->iconf->channel = oldconf->channel;
+- hapd->iconf->acs = oldconf->acs;
- hapd->iconf->secondary_channel = oldconf->secondary_channel;
- hapd->iconf->ieee80211n = oldconf->ieee80211n;
- hapd->iconf->ieee80211ac = oldconf->ieee80211ac;
diff --git a/package/network/services/hostapd/patches/350-nl80211_del_beacon_bss.patch b/package/network/services/hostapd/patches/350-nl80211_del_beacon_bss.patch
index 46f0a2531c..a14fa03527 100644
--- a/package/network/services/hostapd/patches/350-nl80211_del_beacon_bss.patch
+++ b/package/network/services/hostapd/patches/350-nl80211_del_beacon_bss.patch
@@ -1,50 +1,72 @@
--- a/src/drivers/driver_nl80211.c
+++ b/src/drivers/driver_nl80211.c
-@@ -5083,18 +5083,20 @@ wpa_driver_nl80211_finish_drv_init(struc
+@@ -2254,13 +2254,18 @@ wpa_driver_nl80211_finish_drv_init(struc
}
-static int wpa_driver_nl80211_del_beacon(struct wpa_driver_nl80211_data *drv)
-+static int wpa_driver_nl80211_del_bss_beacon(struct i802_bss *bss)
++static int wpa_driver_nl80211_del_beacon(struct i802_bss *bss)
{
+ struct wpa_driver_nl80211_data *drv = bss->drv;
struct nl_msg *msg;
- msg = nlmsg_alloc();
- if (!msg)
- return -ENOMEM;
-
++ if (!bss->beacon_set)
++ return 0;
++
+ bss->beacon_set = 0;
wpa_printf(MSG_DEBUG, "nl80211: Remove beacon (ifindex=%d)",
- drv->ifindex);
+- msg = nl80211_drv_msg(drv, 0, NL80211_CMD_DEL_BEACON);
+ bss->ifindex);
- nl80211_cmd(drv, msg, 0, NL80211_CMD_DEL_BEACON);
-- NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, drv->ifindex);
-+ NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, bss->ifindex);
-
++ msg = nl80211_bss_msg(bss, 0, NL80211_CMD_DEL_BEACON);
return send_and_recv_msgs(drv, msg, NULL, NULL);
- nla_put_failure:
-@@ -5102,6 +5104,15 @@ static int wpa_driver_nl80211_del_beacon
- return -ENOBUFS;
}
-+static int wpa_driver_nl80211_del_beacon(struct wpa_driver_nl80211_data *drv)
-+{
-+ struct i802_bss *bss;
-+
-+ for (bss = drv->first_bss; bss; bss = bss->next)
-+ wpa_driver_nl80211_del_bss_beacon(bss);
-+
-+ return 0;
-+}
+@@ -2311,7 +2316,7 @@ static void wpa_driver_nl80211_deinit(st
+ nl80211_remove_monitor_interface(drv);
+
+ if (is_ap_interface(drv->nlmode))
+- wpa_driver_nl80211_del_beacon(drv);
++ wpa_driver_nl80211_del_beacon(bss);
+
+ if (drv->eapol_sock >= 0) {
+ eloop_unregister_read_sock(drv->eapol_sock);
+@@ -4140,8 +4145,7 @@ static void nl80211_teardown_ap(struct i
+ nl80211_remove_monitor_interface(drv);
+ else
+ nl80211_mgmt_unsubscribe(bss, "AP teardown");
+-
+- bss->beacon_set = 0;
++ wpa_driver_nl80211_del_beacon(bss);
+ }
+
+
+@@ -6066,8 +6070,6 @@ static int wpa_driver_nl80211_if_remove(
+ } else {
+ wpa_printf(MSG_DEBUG, "nl80211: First BSS - reassign context");
+ nl80211_teardown_ap(bss);
+- if (!bss->added_if && !drv->first_bss->next)
+- wpa_driver_nl80211_del_beacon(drv);
+ nl80211_destroy_bss(bss);
+ if (!bss->added_if)
+ i802_set_iface_flags(bss, 0);
+@@ -6389,8 +6391,7 @@ static int wpa_driver_nl80211_deinit_ap(
+ struct wpa_driver_nl80211_data *drv = bss->drv;
+ if (!is_ap_interface(drv->nlmode))
+ return -1;
+- wpa_driver_nl80211_del_beacon(drv);
+- bss->beacon_set = 0;
++ wpa_driver_nl80211_del_beacon(bss);
- /**
- * wpa_driver_nl80211_deinit - Deinitialize nl80211 driver interface
-@@ -11147,7 +11158,6 @@ static int wpa_driver_nl80211_stop_ap(vo
+ /*
+ * If the P2P GO interface was dynamically added, then it is
+@@ -6409,8 +6410,7 @@ static int wpa_driver_nl80211_stop_ap(vo
+ struct wpa_driver_nl80211_data *drv = bss->drv;
if (!is_ap_interface(drv->nlmode))
return -1;
- wpa_driver_nl80211_del_beacon(drv);
+- wpa_driver_nl80211_del_beacon(drv);
- bss->beacon_set = 0;
++ wpa_driver_nl80211_del_beacon(bss);
return 0;
}
diff --git a/package/network/services/hostapd/patches/360-ctrl_iface_reload.patch b/package/network/services/hostapd/patches/360-ctrl_iface_reload.patch
index f5557fd8ed..06b005ea3a 100644
--- a/package/network/services/hostapd/patches/360-ctrl_iface_reload.patch
+++ b/package/network/services/hostapd/patches/360-ctrl_iface_reload.patch
@@ -1,6 +1,6 @@
--- a/hostapd/ctrl_iface.c
+++ b/hostapd/ctrl_iface.c
-@@ -43,6 +43,7 @@
+@@ -45,6 +45,7 @@
#include "wps/wps.h"
#include "config_file.h"
#include "ctrl_iface.h"
@@ -8,7 +8,7 @@
struct wpa_ctrl_dst {
-@@ -53,6 +54,7 @@ struct wpa_ctrl_dst {
+@@ -55,6 +56,7 @@ struct wpa_ctrl_dst {
int errors;
};
@@ -16,17 +16,10 @@
static void hostapd_ctrl_iface_send(struct hostapd_data *hapd, int level,
const char *buf, size_t len);
-@@ -162,6 +164,68 @@ static int hostapd_ctrl_iface_new_sta(st
+@@ -164,6 +166,61 @@ static int hostapd_ctrl_iface_new_sta(st
return 0;
}
-+static int hostapd_ctrl_iface_set_down(struct hostapd_data *hapd)
-+{
-+ if (hapd->driver->stop_ap)
-+ hapd->driver->stop_ap(hapd->drv_priv);
-+ return 0;
-+}
-+
+static char *get_option(char *opt, char *str)
+{
+ int len = strlen(str);
@@ -85,14 +78,27 @@
#ifdef CONFIG_IEEE80211W
#ifdef NEED_AP_MLME
-@@ -1761,6 +1825,10 @@ static void hostapd_ctrl_iface_receive(i
+@@ -2086,6 +2143,8 @@ static void hostapd_ctrl_iface_receive(i
} else if (os_strncmp(buf, "VENDOR ", 7) == 0) {
reply_len = hostapd_ctrl_iface_vendor(hapd, buf + 7, reply,
reply_size);
-+ } else if (os_strcmp(buf, "DOWN") == 0) {
-+ hostapd_ctrl_iface_set_down(hapd);
+ } else if (os_strncmp(buf, "UPDATE ", 7) == 0) {
+ hostapd_ctrl_iface_update(hapd, buf + 7);
+ } else if (os_strcmp(buf, "ERP_FLUSH") == 0) {
+ ieee802_1x_erp_flush(hapd);
+ #ifdef RADIUS_SERVER
+--- a/src/ap/ctrl_iface_ap.c
++++ b/src/ap/ctrl_iface_ap.c
+@@ -541,5 +541,11 @@ int hostapd_parse_csa_settings(const cha
- } else {
- os_memcpy(reply, "UNKNOWN COMMAND\n", 16);
+ int hostapd_ctrl_iface_stop_ap(struct hostapd_data *hapd)
+ {
+- return hostapd_drv_stop_ap(hapd);
++ struct hostapd_iface *iface = hapd->iface;
++ int i;
++
++ for (i = 0; i < iface->num_bss; i++)
++ hostapd_drv_stop_ap(iface->bss[i]);
++
++ return 0;
+ }
diff --git a/package/network/services/hostapd/patches/370-ap_sta_support.patch b/package/network/services/hostapd/patches/370-ap_sta_support.patch
index 2f2c2d6054..6b0fbe6e57 100644
--- a/package/network/services/hostapd/patches/370-ap_sta_support.patch
+++ b/package/network/services/hostapd/patches/370-ap_sta_support.patch
@@ -1,6 +1,6 @@
--- a/wpa_supplicant/wpa_supplicant_i.h
+++ b/wpa_supplicant/wpa_supplicant_i.h
-@@ -109,6 +109,11 @@ struct wpa_interface {
+@@ -110,6 +110,11 @@ struct wpa_interface {
const char *ifname;
/**
@@ -12,7 +12,7 @@
* bridge_ifname - Optional bridge interface name
*
* If the driver interface (ifname) is included in a Linux bridge
-@@ -406,6 +411,8 @@ struct wpa_supplicant {
+@@ -442,6 +447,8 @@ struct wpa_supplicant {
#endif /* CONFIG_CTRL_IFACE_DBUS_NEW */
char bridge_ifname[16];
@@ -23,7 +23,7 @@
--- a/wpa_supplicant/Makefile
+++ b/wpa_supplicant/Makefile
-@@ -13,6 +13,10 @@ PKG_CONFIG ?= pkg-config
+@@ -14,6 +14,10 @@ CFLAGS += $(EXTRA_CFLAGS)
CFLAGS += -I$(abspath ../src)
CFLAGS += -I$(abspath ../src/utils)
@@ -34,9 +34,9 @@
-include .config
-include $(if $(MULTICALL),../hostapd/.config)
-@@ -82,6 +86,8 @@ OBJS_c = wpa_cli.o ../src/common/wpa_ctr
- OBJS_c += ../src/utils/wpa_debug.o
+@@ -84,6 +88,8 @@ OBJS_c += ../src/utils/wpa_debug.o
OBJS_c += ../src/utils/common.o
+ OBJS += wmm_ac.o
+OBJS += ../src/common/wpa_ctrl.o
+
@@ -45,13 +45,13 @@
CONFIG_OS=win32
--- a/wpa_supplicant/wpa_supplicant.c
+++ b/wpa_supplicant/wpa_supplicant.c
-@@ -105,6 +105,55 @@ const char *wpa_supplicant_full_license5
+@@ -107,6 +107,55 @@ const char *wpa_supplicant_full_license5
"\n";
#endif /* CONFIG_NO_STDOUT_DEBUG */
+static int hostapd_stop(struct wpa_supplicant *wpa_s)
+{
-+ const char *cmd = "DOWN";
++ const char *cmd = "STOP_AP";
+ char buf[256];
+ int len = sizeof(buf);
+
@@ -101,7 +101,7 @@
/* Configure default/group WEP keys for static WEP */
int wpa_set_wep_keys(struct wpa_supplicant *wpa_s, struct wpa_ssid *ssid)
{
-@@ -731,8 +780,12 @@ void wpa_supplicant_set_state(struct wpa
+@@ -743,8 +792,12 @@ void wpa_supplicant_set_state(struct wpa
wpas_p2p_completed(wpa_s);
sme_sched_obss_scan(wpa_s, 1);
@@ -114,12 +114,12 @@
wpa_s->new_connection = 1;
wpa_drv_set_operstate(wpa_s, 0);
#ifndef IEEE8021X_EAPOL
-@@ -3753,6 +3806,20 @@ static int wpa_supplicant_init_iface(str
+@@ -4038,6 +4091,20 @@ static int wpa_supplicant_init_iface(str
sizeof(wpa_s->bridge_ifname));
}
+ if (iface->hostapd_ctrl) {
-+ char *cmd = "DOWN";
++ char *cmd = "STOP_AP";
+ char buf[256];
+ int len = sizeof(buf);
+
@@ -135,7 +135,7 @@
/* RSNA Supplicant Key Management - INITIALIZE */
eapol_sm_notify_portEnabled(wpa_s->eapol, FALSE);
eapol_sm_notify_portValid(wpa_s->eapol, FALSE);
-@@ -3967,6 +4034,11 @@ static void wpa_supplicant_deinit_iface(
+@@ -4280,6 +4347,11 @@ static void wpa_supplicant_deinit_iface(
if (terminate)
wpa_msg(wpa_s, MSG_INFO, WPA_EVENT_TERMINATING);
@@ -157,7 +157,7 @@
#include "drivers/driver.h"
#include "wpa_supplicant_i.h"
#include "config.h"
-@@ -247,6 +248,10 @@ static void calculate_update_time(const
+@@ -277,6 +278,10 @@ static void calculate_update_time(const
static void wpa_bss_copy_res(struct wpa_bss *dst, struct wpa_scan_res *src,
struct os_reltime *fetch_time)
{
@@ -168,9 +168,9 @@
dst->flags = src->flags;
os_memcpy(dst->bssid, src->bssid, ETH_ALEN);
dst->freq = src->freq;
-@@ -257,6 +262,15 @@ static void wpa_bss_copy_res(struct wpa_
- dst->level = src->level;
- dst->tsf = src->tsf;
+@@ -289,6 +294,15 @@ static void wpa_bss_copy_res(struct wpa_
+ dst->est_throughput = src->est_throughput;
+ dst->snr = src->snr;
+ memset(&elems, 0, sizeof(elems));
+ ieee802_11_parse_elems((u8 *) (src + 1), src->ie_len, &elems, 0);
@@ -224,7 +224,7 @@
break;
--- a/wpa_supplicant/bss.h
+++ b/wpa_supplicant/bss.h
-@@ -70,6 +70,10 @@ struct wpa_bss {
+@@ -72,6 +72,10 @@ struct wpa_bss {
u8 ssid[32];
/** Length of SSID */
size_t ssid_len;
diff --git a/package/network/services/hostapd/patches/380-disable_ctrl_iface_mib.patch b/package/network/services/hostapd/patches/380-disable_ctrl_iface_mib.patch
index ef4f961bfc..3a41b8219e 100644
--- a/package/network/services/hostapd/patches/380-disable_ctrl_iface_mib.patch
+++ b/package/network/services/hostapd/patches/380-disable_ctrl_iface_mib.patch
@@ -1,6 +1,6 @@
--- a/hostapd/Makefile
+++ b/hostapd/Makefile
-@@ -164,6 +164,9 @@ endif
+@@ -168,6 +168,9 @@ endif
ifdef CONFIG_NO_CTRL_IFACE
CFLAGS += -DCONFIG_NO_CTRL_IFACE
else
@@ -12,7 +12,7 @@
endif
--- a/hostapd/ctrl_iface.c
+++ b/hostapd/ctrl_iface.c
-@@ -1653,6 +1653,7 @@ static void hostapd_ctrl_iface_receive(i
+@@ -1953,6 +1953,7 @@ static void hostapd_ctrl_iface_receive(i
reply_size);
} else if (os_strcmp(buf, "STATUS-DRIVER") == 0) {
reply_len = hostapd_drv_status(hapd, reply, reply_size);
@@ -20,7 +20,7 @@
} else if (os_strcmp(buf, "MIB") == 0) {
reply_len = ieee802_11_get_mib(hapd, reply, reply_size);
if (reply_len >= 0) {
-@@ -1694,6 +1695,7 @@ static void hostapd_ctrl_iface_receive(i
+@@ -1994,6 +1995,7 @@ static void hostapd_ctrl_iface_receive(i
} else if (os_strncmp(buf, "STA-NEXT ", 9) == 0) {
reply_len = hostapd_ctrl_iface_sta_next(hapd, buf + 9, reply,
reply_size);
@@ -30,7 +30,7 @@
reply_len = -1;
--- a/wpa_supplicant/Makefile
+++ b/wpa_supplicant/Makefile
-@@ -809,6 +809,9 @@ ifdef CONFIG_WNM
+@@ -837,6 +837,9 @@ ifdef CONFIG_WNM
OBJS += ../src/ap/wnm_ap.o
endif
ifdef CONFIG_CTRL_IFACE
@@ -42,7 +42,7 @@
--- a/wpa_supplicant/ctrl_iface.c
+++ b/wpa_supplicant/ctrl_iface.c
-@@ -1628,7 +1628,7 @@ static int wpa_supplicant_ctrl_iface_sta
+@@ -1795,7 +1795,7 @@ static int wpa_supplicant_ctrl_iface_sta
pos += ret;
}
@@ -51,7 +51,7 @@
if (wpa_s->ap_iface) {
pos += ap_ctrl_iface_wpa_get_status(wpa_s, pos,
end - pos,
-@@ -6720,6 +6720,7 @@ char * wpa_supplicant_ctrl_iface_process
+@@ -7896,6 +7896,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);
@@ -59,15 +59,15 @@
} else if (os_strcmp(buf, "MIB") == 0) {
reply_len = wpa_sm_get_mib(wpa_s->wpa, reply, reply_size);
if (reply_len >= 0) {
-@@ -6731,6 +6732,7 @@ char * wpa_supplicant_ctrl_iface_process
- else
- reply_len += res;
+@@ -7903,6 +7904,7 @@ char * wpa_supplicant_ctrl_iface_process
+ reply + reply_len,
+ reply_size - reply_len);
}
+#endif
} else if (os_strncmp(buf, "STATUS", 6) == 0) {
reply_len = wpa_supplicant_ctrl_iface_status(
wpa_s, buf + 6, reply, reply_size);
-@@ -7140,6 +7142,7 @@ char * wpa_supplicant_ctrl_iface_process
+@@ -8353,6 +8355,7 @@ char * wpa_supplicant_ctrl_iface_process
reply_len = wpa_supplicant_ctrl_iface_bss(
wpa_s, buf + 4, reply, reply_size);
#ifdef CONFIG_AP
@@ -75,7 +75,7 @@
} 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) {
-@@ -7148,12 +7151,15 @@ char * wpa_supplicant_ctrl_iface_process
+@@ -8361,12 +8364,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);
@@ -93,7 +93,7 @@
reply_len = -1;
--- a/src/ap/ctrl_iface_ap.c
+++ b/src/ap/ctrl_iface_ap.c
-@@ -21,6 +21,7 @@
+@@ -22,6 +22,7 @@
#include "ctrl_iface_ap.h"
#include "ap_drv_ops.h"
@@ -101,7 +101,7 @@
static int hostapd_get_sta_tx_rx(struct hostapd_data *hapd,
struct sta_info *sta,
-@@ -214,6 +215,7 @@ int hostapd_ctrl_iface_sta_next(struct h
+@@ -224,6 +225,7 @@ int hostapd_ctrl_iface_sta_next(struct h
return hostapd_ctrl_iface_sta_mib(hapd, sta->next, buf, buflen);
}
@@ -109,14 +109,9 @@
#ifdef CONFIG_P2P_MANAGER
static int p2p_manager_disconnect(struct hostapd_data *hapd, u16 stype,
-@@ -527,3 +529,4 @@ int hostapd_parse_csa_settings(const cha
-
- return 0;
- }
-+
--- a/src/ap/ieee802_1x.c
+++ b/src/ap/ieee802_1x.c
-@@ -2237,6 +2237,7 @@ static const char * bool_txt(Boolean boo
+@@ -2337,6 +2337,7 @@ static const char * bool_txt(Boolean boo
return bool_val ? "TRUE" : "FALSE";
}
@@ -124,7 +119,7 @@
int ieee802_1x_get_mib(struct hostapd_data *hapd, char *buf, size_t buflen)
{
-@@ -2404,6 +2405,7 @@ int ieee802_1x_get_mib_sta(struct hostap
+@@ -2512,6 +2513,7 @@ int ieee802_1x_get_mib_sta(struct hostap
return len;
}
@@ -134,7 +129,7 @@
struct sta_info *sta, int success,
--- a/src/ap/wpa_auth.c
+++ b/src/ap/wpa_auth.c
-@@ -2835,6 +2835,7 @@ static const char * wpa_bool_txt(int boo
+@@ -2999,6 +2999,7 @@ static const char * wpa_bool_txt(int boo
return bool ? "TRUE" : "FALSE";
}
@@ -142,7 +137,7 @@
#define RSN_SUITE "%02x-%02x-%02x-%d"
#define RSN_SUITE_ARG(s) \
-@@ -2979,7 +2980,7 @@ int wpa_get_mib_sta(struct wpa_state_mac
+@@ -3143,7 +3144,7 @@ int wpa_get_mib_sta(struct wpa_state_mac
return len;
}
@@ -153,7 +148,7 @@
{
--- a/src/rsn_supp/wpa.c
+++ b/src/rsn_supp/wpa.c
-@@ -1928,6 +1928,8 @@ static u32 wpa_key_mgmt_suite(struct wpa
+@@ -2032,6 +2032,8 @@ static u32 wpa_key_mgmt_suite(struct wpa
}
@@ -162,7 +157,7 @@
#define RSN_SUITE "%02x-%02x-%02x-%d"
#define RSN_SUITE_ARG(s) \
((s) >> 24) & 0xff, ((s) >> 16) & 0xff, ((s) >> 8) & 0xff, (s) & 0xff
-@@ -2011,6 +2013,7 @@ int wpa_sm_get_mib(struct wpa_sm *sm, ch
+@@ -2115,6 +2117,7 @@ int wpa_sm_get_mib(struct wpa_sm *sm, ch
return (int) len;
}
@@ -172,7 +167,7 @@
--- a/wpa_supplicant/ap.c
+++ b/wpa_supplicant/ap.c
-@@ -975,7 +975,7 @@ int wpas_ap_wps_nfc_report_handover(stru
+@@ -1015,7 +1015,7 @@ int wpas_ap_wps_nfc_report_handover(stru
#endif /* CONFIG_WPS */
diff --git a/package/network/services/hostapd/patches/390-wpa_ie_cap_workaround.patch b/package/network/services/hostapd/patches/390-wpa_ie_cap_workaround.patch
index 21f6ec0208..1065a7f125 100644
--- a/package/network/services/hostapd/patches/390-wpa_ie_cap_workaround.patch
+++ b/package/network/services/hostapd/patches/390-wpa_ie_cap_workaround.patch
@@ -1,6 +1,6 @@
--- a/src/common/wpa_common.c
+++ b/src/common/wpa_common.c
-@@ -1026,6 +1026,31 @@ u32 wpa_akm_to_suite(int akm)
+@@ -1228,6 +1228,31 @@ u32 wpa_akm_to_suite(int akm)
}
@@ -32,7 +32,7 @@
int wpa_compare_rsn_ie(int ft_initial_assoc,
const u8 *ie1, size_t ie1len,
const u8 *ie2, size_t ie2len)
-@@ -1033,8 +1058,19 @@ int wpa_compare_rsn_ie(int ft_initial_as
+@@ -1235,8 +1260,19 @@ int wpa_compare_rsn_ie(int ft_initial_as
if (ie1 == NULL || ie2 == NULL)
return -1;
diff --git a/package/network/services/hostapd/patches/400-wps_single_auth_enc_type.patch b/package/network/services/hostapd/patches/400-wps_single_auth_enc_type.patch
index 8dae52b277..083af5b450 100644
--- a/package/network/services/hostapd/patches/400-wps_single_auth_enc_type.patch
+++ b/package/network/services/hostapd/patches/400-wps_single_auth_enc_type.patch
@@ -1,8 +1,8 @@
--- a/src/ap/wps_hostapd.c
+++ b/src/ap/wps_hostapd.c
-@@ -1051,11 +1051,9 @@ int hostapd_init_wps(struct hostapd_data
+@@ -1052,11 +1052,9 @@ int hostapd_init_wps(struct hostapd_data
- if (conf->rsn_pairwise & WPA_CIPHER_CCMP)
+ if (conf->rsn_pairwise & (WPA_CIPHER_CCMP | WPA_CIPHER_GCMP))
wps->encr_types |= WPS_ENCR_AES;
- if (conf->rsn_pairwise & WPA_CIPHER_TKIP)
+ else if (conf->rsn_pairwise & WPA_CIPHER_TKIP)
@@ -14,7 +14,7 @@
if (conf->wpa_key_mgmt & WPA_KEY_MGMT_PSK)
wps->auth_types |= WPS_AUTH_WPAPSK;
if (conf->wpa_key_mgmt & WPA_KEY_MGMT_IEEE8021X)
-@@ -1063,7 +1061,7 @@ int hostapd_init_wps(struct hostapd_data
+@@ -1064,7 +1062,7 @@ int hostapd_init_wps(struct hostapd_data
if (conf->wpa_pairwise & WPA_CIPHER_CCMP)
wps->encr_types |= WPS_ENCR_AES;
diff --git a/package/network/services/hostapd/patches/410-limit_debug_messages.patch b/package/network/services/hostapd/patches/410-limit_debug_messages.patch
index 4643140eba..b56e5e1632 100644
--- a/package/network/services/hostapd/patches/410-limit_debug_messages.patch
+++ b/package/network/services/hostapd/patches/410-limit_debug_messages.patch
@@ -64,7 +64,7 @@
#ifdef CONFIG_DEBUG_FILE
static char *last_path = NULL;
#endif /* CONFIG_DEBUG_FILE */
-@@ -594,7 +568,7 @@ void wpa_msg_register_ifname_cb(wpa_msg_
+@@ -602,7 +576,7 @@ void wpa_msg_register_ifname_cb(wpa_msg_
}
@@ -73,7 +73,7 @@
{
va_list ap;
char *buf;
-@@ -632,7 +606,7 @@ void wpa_msg(void *ctx, int level, const
+@@ -640,7 +614,7 @@ void wpa_msg(void *ctx, int level, const
}
@@ -84,9 +84,9 @@
char *buf;
--- a/src/utils/wpa_debug.h
+++ b/src/utils/wpa_debug.h
-@@ -47,6 +47,17 @@ int wpa_debug_open_file(const char *path
- int wpa_debug_reopen_file(void);
+@@ -49,6 +49,17 @@ int wpa_debug_reopen_file(void);
void wpa_debug_close_file(void);
+ void wpa_debug_setup_stdout(void);
+/* internal */
+void _wpa_hexdump(int level, const char *title, const u8 *buf,
@@ -102,7 +102,7 @@
/**
* wpa_debug_printf_timestamp - Print timestamp for debug output
*
-@@ -67,9 +78,15 @@ void wpa_debug_print_timestamp(void);
+@@ -69,9 +80,15 @@ void wpa_debug_print_timestamp(void);
*
* Note: New line '\n' is added to the end of the text when printing to stdout.
*/
@@ -119,7 +119,7 @@
/**
* wpa_hexdump - conditional hex dump
* @level: priority level (MSG_*) of the message
-@@ -81,7 +98,13 @@ PRINTF_FORMAT(2, 3);
+@@ -83,7 +100,13 @@ PRINTF_FORMAT(2, 3);
* output may be directed to stdout, stderr, and/or syslog based on
* configuration. The contents of buf is printed out has hex dump.
*/
@@ -134,7 +134,7 @@
static inline void wpa_hexdump_buf(int level, const char *title,
const struct wpabuf *buf)
-@@ -103,7 +126,13 @@ static inline void wpa_hexdump_buf(int l
+@@ -105,7 +128,13 @@ static inline void wpa_hexdump_buf(int l
* like wpa_hexdump(), but by default, does not include secret keys (passwords,
* etc.) in debug output.
*/
@@ -149,7 +149,7 @@
static inline void wpa_hexdump_buf_key(int level, const char *title,
const struct wpabuf *buf)
-@@ -125,8 +154,14 @@ static inline void wpa_hexdump_buf_key(i
+@@ -127,8 +156,14 @@ static inline void wpa_hexdump_buf_key(i
* the hex numbers and ASCII characters (for printable range) are shown. 16
* bytes per line will be shown.
*/
@@ -166,7 +166,7 @@
/**
* wpa_hexdump_ascii_key - conditional hex dump, hide keys
-@@ -142,8 +177,14 @@ void wpa_hexdump_ascii(int level, const
+@@ -144,8 +179,14 @@ void wpa_hexdump_ascii(int level, const
* bytes per line will be shown. This works like wpa_hexdump_ascii(), but by
* default, does not include secret keys (passwords, etc.) in debug output.
*/
@@ -183,7 +183,7 @@
/*
* wpa_dbg() behaves like wpa_msg(), but it can be removed from build to reduce
-@@ -179,7 +220,12 @@ void wpa_hexdump_ascii_key(int level, co
+@@ -181,7 +222,12 @@ void wpa_hexdump_ascii_key(int level, co
*
* Note: New line '\n' is added to the end of the text when printing to stdout.
*/
@@ -197,7 +197,7 @@
/**
* wpa_msg_ctrl - Conditional printf for ctrl_iface monitors
-@@ -193,8 +239,13 @@ void wpa_msg(void *ctx, int level, const
+@@ -195,8 +241,13 @@ void wpa_msg(void *ctx, int level, const
* attached ctrl_iface monitors. In other words, it can be used for frequent
* events that do not need to be sent to syslog.
*/
diff --git a/package/network/services/hostapd/patches/420-indicate-features.patch b/package/network/services/hostapd/patches/420-indicate-features.patch
index b20947ee87..64c92df6bb 100644
--- a/package/network/services/hostapd/patches/420-indicate-features.patch
+++ b/package/network/services/hostapd/patches/420-indicate-features.patch
@@ -8,7 +8,7 @@
#include "crypto/random.h"
#include "crypto/tls.h"
#include "common/version.h"
-@@ -560,7 +561,7 @@ int main(int argc, char *argv[])
+@@ -567,7 +568,7 @@ int main(int argc, char *argv[])
wpa_supplicant_event = hostapd_wpa_event;
for (;;) {
@@ -17,7 +17,7 @@
if (c < 0)
break;
switch (c) {
-@@ -597,6 +598,8 @@ int main(int argc, char *argv[])
+@@ -604,6 +605,8 @@ int main(int argc, char *argv[])
break;
#endif /* CONFIG_DEBUG_LINUX_TRACING */
case 'v':
diff --git a/package/network/services/hostapd/patches/430-hostapd_cli_ifdef.patch b/package/network/services/hostapd/patches/430-hostapd_cli_ifdef.patch
index 1cf3fee862..85d2e1603b 100644
--- a/package/network/services/hostapd/patches/430-hostapd_cli_ifdef.patch
+++ b/package/network/services/hostapd/patches/430-hostapd_cli_ifdef.patch
@@ -32,7 +32,7 @@
static int hostapd_cli_cmd_disassoc_imminent(struct wpa_ctrl *ctrl, int argc,
-@@ -993,7 +989,6 @@ static struct hostapd_cli_cmd hostapd_cl
+@@ -1027,7 +1023,6 @@ static struct hostapd_cli_cmd hostapd_cl
#ifdef CONFIG_IEEE80211W
{ "sa_query", hostapd_cli_cmd_sa_query },
#endif /* CONFIG_IEEE80211W */
@@ -40,11 +40,11 @@
{ "wps_pin", hostapd_cli_cmd_wps_pin },
{ "wps_check_pin", hostapd_cli_cmd_wps_check_pin },
{ "wps_pbc", hostapd_cli_cmd_wps_pbc },
-@@ -1007,7 +1002,6 @@ static struct hostapd_cli_cmd hostapd_cl
+@@ -1041,7 +1036,6 @@ static struct hostapd_cli_cmd hostapd_cl
{ "wps_ap_pin", hostapd_cli_cmd_wps_ap_pin },
{ "wps_config", hostapd_cli_cmd_wps_config },
{ "wps_get_status", hostapd_cli_cmd_wps_get_status },
-#endif /* CONFIG_WPS */
{ "disassoc_imminent", hostapd_cli_cmd_disassoc_imminent },
{ "ess_disassoc", hostapd_cli_cmd_ess_disassoc },
- { "get_config", hostapd_cli_cmd_get_config },
+ { "bss_tm_req", hostapd_cli_cmd_bss_tm_req },
diff --git a/package/network/services/hostapd/patches/431-wpa_cli_ifdef.patch b/package/network/services/hostapd/patches/431-wpa_cli_ifdef.patch
index 36b5a441f9..874ff4bccc 100644
--- a/package/network/services/hostapd/patches/431-wpa_cli_ifdef.patch
+++ b/package/network/services/hostapd/patches/431-wpa_cli_ifdef.patch
@@ -10,4 +10,4 @@
+
static const char *wpa_cli_version =
"wpa_cli v" VERSION_STR "\n"
- "Copyright (c) 2004-2014, Jouni Malinen <j@w1.fi> and contributors";
+ "Copyright (c) 2004-2015, Jouni Malinen <j@w1.fi> and contributors";
diff --git a/package/network/services/hostapd/patches/440-max_num_sta_probe.patch b/package/network/services/hostapd/patches/440-max_num_sta_probe.patch
index 059a2d3522..74aef26d64 100644
--- a/package/network/services/hostapd/patches/440-max_num_sta_probe.patch
+++ b/package/network/services/hostapd/patches/440-max_num_sta_probe.patch
@@ -1,6 +1,6 @@
--- a/src/ap/beacon.c
+++ b/src/ap/beacon.c
-@@ -614,6 +614,10 @@ void handle_probe_req(struct hostapd_dat
+@@ -664,6 +664,10 @@ void handle_probe_req(struct hostapd_dat
return;
}
diff --git a/package/network/services/hostapd/patches/450-scan_wait.patch b/package/network/services/hostapd/patches/450-scan_wait.patch
index 629786d9c6..bce4929d9b 100644
--- a/package/network/services/hostapd/patches/450-scan_wait.patch
+++ b/package/network/services/hostapd/patches/450-scan_wait.patch
@@ -33,7 +33,7 @@
/* Initialize the driver interface */
if (!(b[0] | b[1] | b[2] | b[3] | b[4] | b[5]))
b = NULL;
-@@ -374,8 +386,6 @@ static void hostapd_global_deinit(const
+@@ -381,8 +393,6 @@ static void hostapd_global_deinit(const
#endif /* CONFIG_NATIVE_WINDOWS */
eap_server_unregister_methods();
@@ -42,19 +42,19 @@
}
-@@ -401,11 +411,6 @@ static int hostapd_global_run(struct hap
+@@ -408,11 +418,6 @@ static int hostapd_global_run(struct hap
}
#endif /* EAP_SERVER_TNC */
- if (daemonize && os_daemonize(pid_file)) {
-- perror("daemon");
+- wpa_printf(MSG_ERROR, "daemon: %s", strerror(errno));
- return -1;
- }
-
eloop_run();
return 0;
-@@ -535,8 +540,7 @@ int main(int argc, char *argv[])
+@@ -542,8 +547,7 @@ int main(int argc, char *argv[])
struct hapd_interfaces interfaces;
int ret = 1;
size_t i, j;
diff --git a/package/network/services/hostapd/patches/460-wpa_supplicant-add-new-config-params-to-be-used-with.patch b/package/network/services/hostapd/patches/460-wpa_supplicant-add-new-config-params-to-be-used-with.patch
index 2dad2738f0..217e701501 100644
--- a/package/network/services/hostapd/patches/460-wpa_supplicant-add-new-config-params-to-be-used-with.patch
+++ b/package/network/services/hostapd/patches/460-wpa_supplicant-add-new-config-params-to-be-used-with.patch
@@ -22,12 +22,10 @@ Signed-hostap: Antonio Quartulli <ordex@autistici.org>
#include "common/defs.h"
#include "utils/list.h"
-@@ -442,6 +443,11 @@ struct wpa_driver_associate_params {
+@@ -538,6 +539,9 @@ struct wpa_driver_associate_params {
* responsible for selecting with which BSS to associate. */
const u8 *bssid;
-+ int beacon_interval;
-+ int fixed_freq;
+ unsigned char rates[NL80211_MAX_SUPP_RATES];
+ int mcast_rate;
+
@@ -44,9 +42,9 @@ Signed-hostap: Antonio Quartulli <ordex@autistici.org>
#include "config.h"
-@@ -1576,6 +1577,97 @@ static char * wpa_config_write_psk_list(
+@@ -1722,6 +1723,97 @@ static char * wpa_config_write_mesh_basi
+ #endif /* CONFIG_MESH */
- #endif /* CONFIG_P2P */
+static int wpa_config_parse_mcast_rate(const struct parse_data *data,
+ struct wpa_ssid *ssid, int line,
@@ -142,7 +140,7 @@ Signed-hostap: Antonio Quartulli <ordex@autistici.org>
/* Helper macros for network block parser */
#ifdef OFFSET
-@@ -1788,6 +1880,9 @@ static const struct parse_data ssid_fiel
+@@ -1947,6 +2039,9 @@ static const struct parse_data ssid_fiel
{ INT(ap_max_inactivity) },
{ INT(dtim_period) },
{ INT(beacon_int) },
@@ -162,11 +160,10 @@ Signed-hostap: Antonio Quartulli <ordex@autistici.org>
#define MAX_SSID_LEN 32
-@@ -640,6 +641,10 @@ struct wpa_ssid {
+@@ -675,6 +676,9 @@ struct wpa_ssid {
*/
void *parent_cred;
-+ int fixed_freq;
+ unsigned char rates[NL80211_MAX_SUPP_RATES];
+ double mcast_rate;
+
@@ -175,7 +172,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
-@@ -1949,6 +1949,13 @@ static void wpas_start_assoc_cb(struct w
+@@ -2266,6 +2266,13 @@ static void wpas_start_assoc_cb(struct w
params.beacon_int = ssid->beacon_int;
else
params.beacon_int = wpa_s->conf->beacon_int;
diff --git a/package/network/services/hostapd/patches/461-driver_nl80211-use-new-parameters-during-ibss-join.patch b/package/network/services/hostapd/patches/461-driver_nl80211-use-new-parameters-during-ibss-join.patch
index 46a0ef162e..730cc31650 100644
--- a/package/network/services/hostapd/patches/461-driver_nl80211-use-new-parameters-during-ibss-join.patch
+++ b/package/network/services/hostapd/patches/461-driver_nl80211-use-new-parameters-during-ibss-join.patch
@@ -10,7 +10,7 @@ Signed-hostap: Antonio Quartulli <ordex@autistici.org>
--- a/src/drivers/driver_nl80211.c
+++ b/src/drivers/driver_nl80211.c
-@@ -9023,7 +9023,7 @@ static int wpa_driver_nl80211_ibss(struc
+@@ -4398,7 +4398,7 @@ static int wpa_driver_nl80211_ibss(struc
struct wpa_driver_associate_params *params)
{
struct nl_msg *msg;
@@ -19,20 +19,20 @@ Signed-hostap: Antonio Quartulli <ordex@autistici.org>
int count = 0;
wpa_printf(MSG_DEBUG, "nl80211: Join IBSS (ifindex=%d)", drv->ifindex);
-@@ -9069,6 +9069,37 @@ retry:
- params->beacon_int);
- }
+@@ -4425,6 +4425,37 @@ retry:
+ nl80211_put_beacon_int(msg, params->beacon_int))
+ goto fail;
+ if (params->fixed_freq) {
+ wpa_printf(MSG_DEBUG, " * fixed_freq");
-+ NLA_PUT_FLAG(msg, NL80211_ATTR_FREQ_FIXED);
++ nla_put_flag(msg, NL80211_ATTR_FREQ_FIXED);
+ }
+
-+ if (params->beacon_interval > 0) {
-+ wpa_printf(MSG_DEBUG, " * beacon_interval=%d",
-+ params->beacon_interval);
-+ NLA_PUT_U32(msg, NL80211_ATTR_BEACON_INTERVAL,
-+ params->beacon_interval);
++ if (params->beacon_int > 0) {
++ wpa_printf(MSG_DEBUG, " * beacon_int=%d",
++ params->beacon_int);
++ nla_put_u32(msg, NL80211_ATTR_BEACON_INTERVAL,
++ params->beacon_int);
+ }
+
+ if (params->rates[0] > 0) {
@@ -44,16 +44,16 @@ Signed-hostap: Antonio Quartulli <ordex@autistici.org>
+ (double)params->rates[i] / 2);
+ i++;
+ }
-+ NLA_PUT(msg, NL80211_ATTR_BSS_BASIC_RATES, i,
++ nla_put(msg, NL80211_ATTR_BSS_BASIC_RATES, i,
+ params->rates);
+ }
+
+ if (params->mcast_rate > 0) {
-+ wpa_printf(MSG_DEBUG, " * mcast_rates=%.1f",
++ wpa_printf(MSG_DEBUG, " * mcast_rate=%.1f",
+ (double)params->mcast_rate / 10);
-+ NLA_PUT_U32(msg, NL80211_ATTR_MCAST_RATE, params->mcast_rate);
++ nla_put_u32(msg, NL80211_ATTR_MCAST_RATE, params->mcast_rate);
+ }
+
ret = nl80211_set_conn_keys(params, msg);
if (ret)
- goto nla_put_failure;
+ goto fail;
diff --git a/package/network/services/hostapd/patches/462-wpa_s-support-htmode-param.patch b/package/network/services/hostapd/patches/462-wpa_s-support-htmode-param.patch
index 543e2a6193..30bb2dc14c 100644
--- a/package/network/services/hostapd/patches/462-wpa_s-support-htmode-param.patch
+++ b/package/network/services/hostapd/patches/462-wpa_s-support-htmode-param.patch
@@ -16,8 +16,8 @@ Signed-off-by: Antonio Quartulli <ordex@autistici.org>
--- a/src/drivers/driver.h
+++ b/src/drivers/driver.h
-@@ -447,6 +447,8 @@ struct wpa_driver_associate_params {
- int fixed_freq;
+@@ -541,6 +541,8 @@ struct wpa_driver_associate_params {
+
unsigned char rates[NL80211_MAX_SUPP_RATES];
int mcast_rate;
+ int ht_set;
@@ -27,8 +27,8 @@ Signed-off-by: Antonio Quartulli <ordex@autistici.org>
* bssid_hint - BSSID of a proposed AP
--- a/src/drivers/driver_nl80211.c
+++ b/src/drivers/driver_nl80211.c
-@@ -9100,6 +9100,22 @@ retry:
- NLA_PUT_U32(msg, NL80211_ATTR_MCAST_RATE, params->mcast_rate);
+@@ -4456,6 +4456,22 @@ retry:
+ nla_put_u32(msg, NL80211_ATTR_MCAST_RATE, params->mcast_rate);
}
+ if (params->ht_set) {
@@ -43,16 +43,16 @@ Signed-off-by: Antonio Quartulli <ordex@autistici.org>
+ wpa_printf(MSG_DEBUG, " * ht=HT40-");
+ break;
+ }
-+ NLA_PUT_U32(msg, NL80211_ATTR_WIPHY_CHANNEL_TYPE,
++ nla_put_u32(msg, NL80211_ATTR_WIPHY_CHANNEL_TYPE,
+ params->htmode);
+ }
+
ret = nl80211_set_conn_keys(params, msg);
if (ret)
- goto nla_put_failure;
+ goto fail;
--- a/wpa_supplicant/config.c
+++ b/wpa_supplicant/config.c
-@@ -1608,6 +1608,71 @@ static char * wpa_config_write_mcast_rat
+@@ -1754,6 +1754,71 @@ static char * wpa_config_write_mcast_rat
}
#endif /* NO_CONFIG_WRITE */
@@ -124,7 +124,7 @@ Signed-off-by: Antonio Quartulli <ordex@autistici.org>
static int wpa_config_parse_rates(const struct parse_data *data,
struct wpa_ssid *ssid, int line,
const char *value)
-@@ -1883,6 +1948,7 @@ static const struct parse_data ssid_fiel
+@@ -2042,6 +2107,7 @@ static const struct parse_data ssid_fiel
{ INT_RANGE(fixed_freq, 0, 1) },
{ FUNC(rates) },
{ FUNC(mcast_rate) },
@@ -134,8 +134,8 @@ Signed-off-by: Antonio Quartulli <ordex@autistici.org>
#endif /* CONFIG_MACSEC */
--- a/wpa_supplicant/config_ssid.h
+++ b/wpa_supplicant/config_ssid.h
-@@ -644,6 +644,8 @@ struct wpa_ssid {
- int fixed_freq;
+@@ -678,6 +678,8 @@ struct wpa_ssid {
+
unsigned char rates[NL80211_MAX_SUPP_RATES];
double mcast_rate;
+ int ht_set;
@@ -145,7 +145,7 @@ Signed-off-by: Antonio Quartulli <ordex@autistici.org>
/**
--- a/wpa_supplicant/wpa_supplicant.c
+++ b/wpa_supplicant/wpa_supplicant.c
-@@ -1956,6 +1956,8 @@ static void wpas_start_assoc_cb(struct w
+@@ -2273,6 +2273,8 @@ static void wpas_start_assoc_cb(struct w
i++;
}
params.mcast_rate = ssid->mcast_rate;
diff --git a/package/network/services/hostapd/patches/600-ubus_support.patch b/package/network/services/hostapd/patches/600-ubus_support.patch
index fcaddbc4ce..41792a6dd5 100644
--- a/package/network/services/hostapd/patches/600-ubus_support.patch
+++ b/package/network/services/hostapd/patches/600-ubus_support.patch
@@ -1,6 +1,6 @@
--- a/hostapd/Makefile
+++ b/hostapd/Makefile
-@@ -117,6 +117,11 @@ OBJS += ../src/common/wpa_common.o
+@@ -121,6 +121,11 @@ OBJS += ../src/common/hw_features_common
OBJS += ../src/eapol_auth/eapol_auth_sm.o
@@ -14,23 +14,23 @@
CFLAGS += -O0 -fprofile-arcs -ftest-coverage
--- a/src/ap/hostapd.h
+++ b/src/ap/hostapd.h
-@@ -12,6 +12,7 @@
- #include "common/defs.h"
+@@ -13,6 +13,7 @@
+ #include "utils/list.h"
#include "ap_config.h"
#include "drivers/driver.h"
+#include "ubus.h"
struct wpa_ctrl_dst;
struct radius_server_data;
-@@ -102,6 +103,7 @@ struct hostapd_data {
+@@ -103,6 +104,7 @@ struct hostapd_data {
struct hostapd_iface *iface;
struct hostapd_config *iconf;
struct hostapd_bss_config *conf;
+ struct hostapd_ubus_bss ubus;
int interface_added; /* virtual interface added for this BSS */
unsigned int started:1;
-
-@@ -275,6 +277,8 @@ struct hostapd_iface {
+ unsigned int disabled:1;
+@@ -286,6 +288,8 @@ struct hostapd_iface {
struct hostapd_config *conf;
char phy[16]; /* Name of the PHY (radio) */
@@ -533,7 +533,7 @@
+#endif
--- a/src/ap/hostapd.c
+++ b/src/ap/hostapd.c
-@@ -263,6 +263,7 @@ static void hostapd_free_hapd_data(struc
+@@ -277,6 +277,7 @@ static void hostapd_free_hapd_data(struc
hapd->started = 0;
wpa_printf(MSG_DEBUG, "%s(%s)", __func__, hapd->conf->iface);
@@ -541,7 +541,7 @@
iapp_deinit(hapd->iapp);
hapd->iapp = NULL;
accounting_deinit(hapd);
-@@ -907,6 +908,8 @@ static int hostapd_setup_bss(struct host
+@@ -1098,6 +1099,8 @@ static int hostapd_setup_bss(struct host
if (hapd->driver && hapd->driver->set_operstate)
hapd->driver->set_operstate(hapd->drv_priv, 1);
@@ -550,7 +550,7 @@
return 0;
}
-@@ -1192,6 +1195,7 @@ int hostapd_setup_interface_complete(str
+@@ -1384,6 +1387,7 @@ int hostapd_setup_interface_complete(str
if (err)
goto fail;
@@ -558,7 +558,7 @@
wpa_printf(MSG_DEBUG, "Completing interface initialization");
if (iface->conf->channel) {
#ifdef NEED_AP_MLME
-@@ -1322,6 +1326,7 @@ int hostapd_setup_interface_complete(str
+@@ -1544,6 +1548,7 @@ dfs_offload:
fail:
wpa_printf(MSG_ERROR, "Interface initialization failed");
@@ -566,7 +566,7 @@
hostapd_set_state(iface, HAPD_IFACE_DISABLED);
wpa_msg(hapd->msg_ctx, MSG_INFO, AP_EVENT_DISABLED);
if (iface->interfaces && iface->interfaces->terminate_on_error)
-@@ -1648,6 +1653,7 @@ void hostapd_interface_deinit_free(struc
+@@ -1873,6 +1878,7 @@ void hostapd_interface_deinit_free(struc
(unsigned int) iface->conf->num_bss);
driver = iface->bss[0]->driver;
drv_priv = iface->bss[0]->drv_priv;
@@ -576,7 +576,7 @@
__func__, driver, drv_priv);
--- a/src/ap/ieee802_11.c
+++ b/src/ap/ieee802_11.c
-@@ -545,7 +545,8 @@ failed:
+@@ -881,7 +881,8 @@ int auth_sae_init_committed(struct hosta
static void handle_auth(struct hostapd_data *hapd,
@@ -586,10 +586,10 @@
{
u16 auth_alg, auth_transaction, status_code;
u16 resp = WLAN_STATUS_SUCCESS;
-@@ -560,6 +561,11 @@ static void handle_auth(struct hostapd_d
- size_t resp_ies_len = 0;
+@@ -897,6 +898,11 @@ static void handle_auth(struct hostapd_d
char *identity = NULL;
char *radius_cui = NULL;
+ u16 seq_ctrl;
+ struct hostapd_ubus_request req = {
+ .type = HOSTAPD_UBUS_AUTH_REQ,
+ .mgmt_frame = mgmt,
@@ -598,7 +598,7 @@
if (len < IEEE80211_HDRLEN + sizeof(mgmt->u.auth)) {
wpa_printf(MSG_INFO, "handle_auth - too short payload (len=%lu)",
-@@ -643,6 +649,14 @@ static void handle_auth(struct hostapd_d
+@@ -983,6 +989,14 @@ static void handle_auth(struct hostapd_d
resp = WLAN_STATUS_UNSPECIFIED_FAILURE;
goto fail;
}
@@ -613,14 +613,14 @@
if (res == HOSTAPD_ACL_PENDING) {
wpa_printf(MSG_DEBUG, "Authentication frame from " MACSTR
" waiting for an external authentication",
-@@ -1289,13 +1303,18 @@ static void send_assoc_resp(struct hosta
+@@ -1694,13 +1708,18 @@ static void send_assoc_resp(struct hosta
static void handle_assoc(struct hostapd_data *hapd,
const struct ieee80211_mgmt *mgmt, size_t len,
- int reassoc)
+ int reassoc, struct hostapd_frame_info *fi)
{
- u16 capab_info, listen_interval;
+ u16 capab_info, listen_interval, seq_ctrl, fc;
u16 resp = WLAN_STATUS_SUCCESS;
const u8 *pos;
int left, i;
@@ -633,7 +633,7 @@
if (len < IEEE80211_HDRLEN + (reassoc ? sizeof(mgmt->u.reassoc_req) :
sizeof(mgmt->u.assoc_req))) {
-@@ -1394,6 +1413,13 @@ static void handle_assoc(struct hostapd_
+@@ -1820,6 +1839,13 @@ static void handle_assoc(struct hostapd_
goto fail;
}
@@ -647,7 +647,7 @@
sta->capability = capab_info;
sta->listen_interval = listen_interval;
-@@ -1785,7 +1811,7 @@ int ieee802_11_mgmt(struct hostapd_data
+@@ -2236,7 +2262,7 @@ int ieee802_11_mgmt(struct hostapd_data
if (stype == WLAN_FC_STYPE_PROBE_REQ) {
@@ -656,7 +656,7 @@
return 1;
}
-@@ -1800,17 +1826,17 @@ int ieee802_11_mgmt(struct hostapd_data
+@@ -2251,17 +2277,17 @@ int ieee802_11_mgmt(struct hostapd_data
switch (stype) {
case WLAN_FC_STYPE_AUTH:
wpa_printf(MSG_DEBUG, "mgmt::auth");
@@ -679,7 +679,7 @@
case WLAN_FC_STYPE_DISASSOC:
--- a/src/ap/beacon.c
+++ b/src/ap/beacon.c
-@@ -513,7 +513,7 @@ static enum ssid_match_result ssid_match
+@@ -542,7 +542,7 @@ static enum ssid_match_result ssid_match
void handle_probe_req(struct hostapd_data *hapd,
const struct ieee80211_mgmt *mgmt, size_t len,
@@ -688,7 +688,7 @@
{
u8 *resp;
struct ieee802_11_elems elems;
-@@ -521,8 +521,14 @@ void handle_probe_req(struct hostapd_dat
+@@ -550,8 +550,14 @@ void handle_probe_req(struct hostapd_dat
size_t ie_len;
struct sta_info *sta = NULL;
size_t i, resp_len;
@@ -703,7 +703,7 @@
ie = mgmt->u.probe_req.variable;
if (len < IEEE80211_HDRLEN + sizeof(mgmt->u.probe_req))
-@@ -660,6 +666,12 @@ void handle_probe_req(struct hostapd_dat
+@@ -710,6 +716,12 @@ void handle_probe_req(struct hostapd_dat
}
#endif /* CONFIG_P2P */
diff --git a/package/network/services/hostapd/patches/700-Add-os_snprintf_error-helper.patch b/package/network/services/hostapd/patches/700-Add-os_snprintf_error-helper.patch
deleted file mode 100644
index 51ad1c4d70..0000000000
--- a/package/network/services/hostapd/patches/700-Add-os_snprintf_error-helper.patch
+++ /dev/null
@@ -1,29 +0,0 @@
-Add os_snprintf_error() helper
-
-This can be used to check os_snprintf() return value more consistently.
-
-Signed-off-by: Jouni Malinen <j@w1.fi>
----
- src/utils/os.h | 6 ++++++
- 1 file changed, 6 insertions(+)
-
-diff --git a/src/utils/os.h b/src/utils/os.h
-index b9247d8..77250d6 100644
---- a/src/utils/os.h
-+++ b/src/utils/os.h
-@@ -549,6 +549,12 @@ char * os_strdup(const char *s);
- #endif /* OS_NO_C_LIB_DEFINES */
-
-
-+static inline int os_snprintf_error(size_t size, int res)
-+{
-+ return res < 0 || (unsigned int) res >= size;
-+}
-+
-+
- static inline void * os_realloc_array(void *ptr, size_t nmemb, size_t size)
- {
- if (size && nmemb > (~(size_t) 0) / size)
---
-2.1.3
-
diff --git a/package/network/services/hostapd/patches/710-Add-network-specific-BSSID-black-and-white-lists.patch b/package/network/services/hostapd/patches/710-Add-network-specific-BSSID-black-and-white-lists.patch
deleted file mode 100644
index 5b42158a4b..0000000000
--- a/package/network/services/hostapd/patches/710-Add-network-specific-BSSID-black-and-white-lists.patch
+++ /dev/null
@@ -1,649 +0,0 @@
-Add network specific BSSID black and white lists
-
-This change adds the configuration options "bssid_whitelist" and
-"bssid_blacklist" used to limit the AP selection of a network to a
-specified (finite) set or discard certain APs.
-
-This can be useful for environments where multiple networks operate
-using the same SSID and roaming between those is not desired. It is also
-useful to ignore a faulty or otherwise unwanted AP.
-
-In many applications it is useful not just to enumerate a group of well
-known access points, but to use a address/mask notation to match an
-entire set of addresses (ca:ff:ee:00:00:00/ff:ff:ff:00:00:00).
-
-This change expands the data structures used by MAC lists to include a
-mask indicating the significant (non-masked) portions of an address and
-extends the list parser to recognize mask suffixes.
-
-Signed-off-by: Stefan Tomanek <stefan.tomanek@wertarbyte.de>
----
- src/utils/common.c | 86 ++++++++++++--
- src/utils/common.h | 3 +
- wpa_supplicant/config.c | 223 ++++++++++++++++++++++++-------------
- wpa_supplicant/config_ssid.h | 12 ++
- wpa_supplicant/events.c | 45 ++++++++
- wpa_supplicant/p2p_supplicant.c | 40 ++++---
- wpa_supplicant/wpa_supplicant.conf | 15 +++
- 7 files changed, 323 insertions(+), 101 deletions(-)
-
-diff --git a/src/utils/common.c b/src/utils/common.c
-index 9902004..dd6e4aa 100644
---- a/src/utils/common.c
-+++ b/src/utils/common.c
-@@ -36,6 +36,25 @@ int hex2byte(const char *hex)
- }
-
-
-+static const char * hwaddr_parse(const char *txt, u8 *addr)
-+{
-+ size_t i;
-+
-+ for (i = 0; i < ETH_ALEN; i++) {
-+ int a;
-+
-+ a = hex2byte(txt);
-+ if (a < 0)
-+ return NULL;
-+ txt += 2;
-+ addr[i] = a;
-+ if (i < ETH_ALEN - 1 && *txt++ != ':')
-+ return NULL;
-+ }
-+ return txt;
-+}
-+
-+
- /**
- * hwaddr_aton - Convert ASCII string to MAC address (colon-delimited format)
- * @txt: MAC address as a string (e.g., "00:11:22:33:44:55")
-@@ -44,25 +63,46 @@ int hex2byte(const char *hex)
- */
- int hwaddr_aton(const char *txt, u8 *addr)
- {
-- int i;
-+ return hwaddr_parse(txt, addr) ? 0 : -1;
-+}
-
-- for (i = 0; i < 6; i++) {
-- int a, b;
-
-- a = hex2num(*txt++);
-- if (a < 0)
-- return -1;
-- b = hex2num(*txt++);
-- if (b < 0)
-- return -1;
-- *addr++ = (a << 4) | b;
-- if (i < 5 && *txt++ != ':')
-+/**
-+ * hwaddr_masked_aton - Convert ASCII string with optional mask to MAC address (colon-delimited format)
-+ * @txt: MAC address with optional mask as a string (e.g., "00:11:22:33:44:55/ff:ff:ff:ff:00:00")
-+ * @addr: Buffer for the MAC address (ETH_ALEN = 6 bytes)
-+ * @mask: Buffer for the MAC address mask (ETH_ALEN = 6 bytes)
-+ * @maskable: Flag to indicate whether a mask is allowed
-+ * Returns: 0 on success, -1 on failure (e.g., string not a MAC address)
-+ */
-+int hwaddr_masked_aton(const char *txt, u8 *addr, u8 *mask, u8 maskable)
-+{
-+ const char *r;
-+
-+ /* parse address part */
-+ r = hwaddr_parse(txt, addr);
-+ if (!r)
-+ return -1;
-+
-+ /* check for optional mask */
-+ if (*r == '\0' || isspace(*r)) {
-+ /* no mask specified, assume default */
-+ os_memset(mask, 0xff, ETH_ALEN);
-+ } else if (maskable && *r == '/') {
-+ /* mask specified and allowed */
-+ r = hwaddr_parse(r + 1, mask);
-+ /* parser error? */
-+ if (!r)
- return -1;
-+ } else {
-+ /* mask specified but not allowed or trailing garbage */
-+ return -1;
- }
-
- return 0;
- }
-
-+
- /**
- * hwaddr_compact_aton - Convert ASCII string to MAC address (no colon delimitors format)
- * @txt: MAC address as a string (e.g., "001122334455")
-@@ -144,6 +184,30 @@ int hexstr2bin(const char *hex, u8 *buf, size_t len)
- }
-
-
-+int hwaddr_mask_txt(char *buf, size_t len, const u8 *addr, const u8 *mask)
-+{
-+ size_t i;
-+ int print_mask = 0;
-+ int res;
-+
-+ for (i = 0; i < ETH_ALEN; i++) {
-+ if (mask[i] != 0xff) {
-+ print_mask = 1;
-+ break;
-+ }
-+ }
-+
-+ if (print_mask)
-+ res = os_snprintf(buf, len, MACSTR "/" MACSTR,
-+ MAC2STR(addr), MAC2STR(mask));
-+ else
-+ res = os_snprintf(buf, len, MACSTR, MAC2STR(addr));
-+ if (os_snprintf_error(len, res))
-+ return -1;
-+ return res;
-+}
-+
-+
- /**
- * inc_byte_array - Increment arbitrary length byte array by one
- * @counter: Pointer to byte array
-diff --git a/src/utils/common.h b/src/utils/common.h
-index 14d9ad1..1127074 100644
---- a/src/utils/common.h
-+++ b/src/utils/common.h
-@@ -468,6 +468,7 @@ typedef u64 __bitwise le64;
- #endif /* __must_check */
-
- int hwaddr_aton(const char *txt, u8 *addr);
-+int hwaddr_masked_aton(const char *txt, u8 *addr, u8 *mask, u8 maskable);
- int hwaddr_compact_aton(const char *txt, u8 *addr);
- int hwaddr_aton2(const char *txt, u8 *addr);
- int hex2byte(const char *hex);
-@@ -478,6 +479,8 @@ int wpa_snprintf_hex(char *buf, size_t buf_size, const u8 *data, size_t len);
- int wpa_snprintf_hex_uppercase(char *buf, size_t buf_size, const u8 *data,
- size_t len);
-
-+int hwaddr_mask_txt(char *buf, size_t len, const u8 *addr, const u8 *mask);
-+
- #ifdef CONFIG_NATIVE_WINDOWS
- void wpa_unicode2ascii_inplace(TCHAR *str);
- TCHAR * wpa_strdup_tchar(const char *str);
-diff --git a/wpa_supplicant/config.c b/wpa_supplicant/config.c
-index 8d1e1e0..7f742cb 100644
---- a/wpa_supplicant/config.c
-+++ b/wpa_supplicant/config.c
-@@ -235,6 +235,99 @@ static char * wpa_config_write_int(const struct parse_data *data,
- #endif /* NO_CONFIG_WRITE */
-
-
-+static int wpa_config_parse_addr_list(const struct parse_data *data,
-+ int line, const char *value,
-+ u8 **list, size_t *num, char *name,
-+ u8 abort_on_error, u8 masked)
-+{
-+ const char *pos;
-+ u8 *buf, *n, addr[2 * ETH_ALEN];
-+ size_t count;
-+
-+ buf = NULL;
-+ count = 0;
-+
-+ pos = value;
-+ while (pos && *pos) {
-+ while (*pos == ' ')
-+ pos++;
-+
-+ if (hwaddr_masked_aton(pos, addr, &addr[ETH_ALEN], masked)) {
-+ if (abort_on_error || count == 0) {
-+ wpa_printf(MSG_ERROR,
-+ "Line %d: Invalid %s address '%s'",
-+ line, name, value);
-+ os_free(buf);
-+ return -1;
-+ }
-+ /* continue anyway since this could have been from a
-+ * truncated configuration file line */
-+ wpa_printf(MSG_INFO,
-+ "Line %d: Ignore likely truncated %s address '%s'",
-+ line, name, pos);
-+ } else {
-+ n = os_realloc_array(buf, count + 1, 2 * ETH_ALEN);
-+ if (n == NULL) {
-+ os_free(buf);
-+ return -1;
-+ }
-+ buf = n;
-+ os_memmove(buf + 2 * ETH_ALEN, buf,
-+ count * 2 * ETH_ALEN);
-+ os_memcpy(buf, addr, 2 * ETH_ALEN);
-+ count++;
-+ wpa_printf(MSG_MSGDUMP,
-+ "%s: addr=" MACSTR " mask=" MACSTR,
-+ name, MAC2STR(addr),
-+ MAC2STR(&addr[ETH_ALEN]));
-+ }
-+
-+ pos = os_strchr(pos, ' ');
-+ }
-+
-+ os_free(*list);
-+ *list = buf;
-+ *num = count;
-+
-+ return 0;
-+}
-+
-+
-+#ifndef NO_CONFIG_WRITE
-+static char * wpa_config_write_addr_list(const struct parse_data *data,
-+ const u8 *list, size_t num, char *name)
-+{
-+ char *value, *end, *pos;
-+ int res;
-+ size_t i;
-+
-+ if (list == NULL || num == 0)
-+ return NULL;
-+
-+ value = os_malloc(2 * 20 * num);
-+ if (value == NULL)
-+ return NULL;
-+ pos = value;
-+ end = value + 2 * 20 * num;
-+
-+ for (i = num; i > 0; i--) {
-+ const u8 *a = list + (i - 1) * 2 * ETH_ALEN;
-+ const u8 *m = a + ETH_ALEN;
-+
-+ if (i < num)
-+ *pos++ = ' ';
-+ res = hwaddr_mask_txt(pos, end - pos, a, m);
-+ if (res < 0) {
-+ os_free(value);
-+ return NULL;
-+ }
-+ pos += res;
-+ }
-+
-+ return value;
-+}
-+#endif /* NO_CONFIG_WRITE */
-+
- static int wpa_config_parse_bssid(const struct parse_data *data,
- struct wpa_ssid *ssid, int line,
- const char *value)
-@@ -280,6 +373,50 @@ static char * wpa_config_write_bssid(const struct parse_data *data,
- #endif /* NO_CONFIG_WRITE */
-
-
-+static int wpa_config_parse_bssid_blacklist(const struct parse_data *data,
-+ struct wpa_ssid *ssid, int line,
-+ const char *value)
-+{
-+ return wpa_config_parse_addr_list(data, line, value,
-+ &ssid->bssid_blacklist,
-+ &ssid->num_bssid_blacklist,
-+ "bssid_blacklist", 1, 1);
-+}
-+
-+
-+#ifndef NO_CONFIG_WRITE
-+static char * wpa_config_write_bssid_blacklist(const struct parse_data *data,
-+ struct wpa_ssid *ssid)
-+{
-+ return wpa_config_write_addr_list(data, ssid->bssid_blacklist,
-+ ssid->num_bssid_blacklist,
-+ "bssid_blacklist");
-+}
-+#endif /* NO_CONFIG_WRITE */
-+
-+
-+static int wpa_config_parse_bssid_whitelist(const struct parse_data *data,
-+ struct wpa_ssid *ssid, int line,
-+ const char *value)
-+{
-+ return wpa_config_parse_addr_list(data, line, value,
-+ &ssid->bssid_whitelist,
-+ &ssid->num_bssid_whitelist,
-+ "bssid_whitelist", 1, 1);
-+}
-+
-+
-+#ifndef NO_CONFIG_WRITE
-+static char * wpa_config_write_bssid_whitelist(const struct parse_data *data,
-+ struct wpa_ssid *ssid)
-+{
-+ return wpa_config_write_addr_list(data, ssid->bssid_whitelist,
-+ ssid->num_bssid_whitelist,
-+ "bssid_whitelist");
-+}
-+#endif /* NO_CONFIG_WRITE */
-+
-+
- static int wpa_config_parse_psk(const struct parse_data *data,
- struct wpa_ssid *ssid, int line,
- const char *value)
-@@ -1435,53 +1572,10 @@ static int wpa_config_parse_p2p_client_list(const struct parse_data *data,
- struct wpa_ssid *ssid, int line,
- const char *value)
- {
-- const char *pos;
-- u8 *buf, *n, addr[ETH_ALEN];
-- size_t count;
--
-- buf = NULL;
-- count = 0;
--
-- pos = value;
-- while (pos && *pos) {
-- while (*pos == ' ')
-- pos++;
--
-- if (hwaddr_aton(pos, addr)) {
-- if (count == 0) {
-- wpa_printf(MSG_ERROR, "Line %d: Invalid "
-- "p2p_client_list address '%s'.",
-- line, value);
-- os_free(buf);
-- return -1;
-- }
-- /* continue anyway since this could have been from a
-- * truncated configuration file line */
-- wpa_printf(MSG_INFO, "Line %d: Ignore likely "
-- "truncated p2p_client_list address '%s'",
-- line, pos);
-- } else {
-- n = os_realloc_array(buf, count + 1, ETH_ALEN);
-- if (n == NULL) {
-- os_free(buf);
-- return -1;
-- }
-- buf = n;
-- os_memmove(buf + ETH_ALEN, buf, count * ETH_ALEN);
-- os_memcpy(buf, addr, ETH_ALEN);
-- count++;
-- wpa_hexdump(MSG_MSGDUMP, "p2p_client_list",
-- addr, ETH_ALEN);
-- }
--
-- pos = os_strchr(pos, ' ');
-- }
--
-- os_free(ssid->p2p_client_list);
-- ssid->p2p_client_list = buf;
-- ssid->num_p2p_clients = count;
--
-- return 0;
-+ return wpa_config_parse_addr_list(data, line, value,
-+ &ssid->p2p_client_list,
-+ &ssid->num_p2p_clients,
-+ "p2p_client_list", 0, 0);
- }
-
-
-@@ -1489,34 +1583,9 @@ static int wpa_config_parse_p2p_client_list(const struct parse_data *data,
- static char * wpa_config_write_p2p_client_list(const struct parse_data *data,
- struct wpa_ssid *ssid)
- {
-- char *value, *end, *pos;
-- int res;
-- size_t i;
--
-- if (ssid->p2p_client_list == NULL || ssid->num_p2p_clients == 0)
-- return NULL;
--
-- value = os_malloc(20 * ssid->num_p2p_clients);
-- if (value == NULL)
-- return NULL;
-- pos = value;
-- end = value + 20 * ssid->num_p2p_clients;
--
-- for (i = ssid->num_p2p_clients; i > 0; i--) {
-- res = os_snprintf(pos, end - pos, MACSTR " ",
-- MAC2STR(ssid->p2p_client_list +
-- (i - 1) * ETH_ALEN));
-- if (res < 0 || res >= end - pos) {
-- os_free(value);
-- return NULL;
-- }
-- pos += res;
-- }
--
-- if (pos > value)
-- pos[-1] = '\0';
--
-- return value;
-+ return wpa_config_write_addr_list(data, ssid->p2p_client_list,
-+ ssid->num_p2p_clients,
-+ "p2p_client_list");
- }
- #endif /* NO_CONFIG_WRITE */
-
-@@ -1667,6 +1736,8 @@ static const struct parse_data ssid_fields[] = {
- { STR_RANGE(ssid, 0, MAX_SSID_LEN) },
- { INT_RANGE(scan_ssid, 0, 1) },
- { FUNC(bssid) },
-+ { FUNC(bssid_blacklist) },
-+ { FUNC(bssid_whitelist) },
- { FUNC_KEY(psk) },
- { FUNC(proto) },
- { FUNC(key_mgmt) },
-@@ -1971,6 +2042,8 @@ void wpa_config_free_ssid(struct wpa_ssid *ssid)
- os_free(ssid->freq_list);
- os_free(ssid->bgscan);
- os_free(ssid->p2p_client_list);
-+ os_free(ssid->bssid_blacklist);
-+ os_free(ssid->bssid_whitelist);
- #ifdef CONFIG_HT_OVERRIDES
- os_free(ssid->ht_mcs);
- #endif /* CONFIG_HT_OVERRIDES */
-diff --git a/wpa_supplicant/config_ssid.h b/wpa_supplicant/config_ssid.h
-index a4910d0..7443207 100644
---- a/wpa_supplicant/config_ssid.h
-+++ b/wpa_supplicant/config_ssid.h
-@@ -128,6 +128,18 @@ struct wpa_ssid {
- u8 bssid[ETH_ALEN];
-
- /**
-+ * bssid_blacklist - List of inacceptable BSSIDs
-+ */
-+ u8 *bssid_blacklist;
-+ size_t num_bssid_blacklist;
-+
-+ /**
-+ * bssid_blacklist - List of acceptable BSSIDs
-+ */
-+ u8 *bssid_whitelist;
-+ size_t num_bssid_whitelist;
-+
-+ /**
- * bssid_set - Whether BSSID is configured for this network
- */
- int bssid_set;
-diff --git a/wpa_supplicant/events.c b/wpa_supplicant/events.c
-index 6761c1a..855653c 100644
---- a/wpa_supplicant/events.c
-+++ b/wpa_supplicant/events.c
-@@ -703,6 +703,33 @@ static int bss_is_ess(struct wpa_bss *bss)
- }
-
-
-+static int match_mac_mask(const u8 *addr_a, const u8 *addr_b, const u8 *mask)
-+{
-+ size_t i;
-+
-+ for (i = 0; i < ETH_ALEN; i++) {
-+ if ((addr_a[i] & mask[i]) != (addr_b[i] & mask[i]))
-+ return 0;
-+ }
-+ return 1;
-+}
-+
-+
-+static int addr_in_list(const u8 *addr, const u8 *list, size_t num)
-+{
-+ size_t i;
-+
-+ for (i = 0; i < num; i++) {
-+ const u8 *a = list + i * ETH_ALEN * 2;
-+ const u8 *m = a + ETH_ALEN;
-+
-+ if (match_mac_mask(a, addr, m))
-+ return 1;
-+ }
-+ return 0;
-+}
-+
-+
- static struct wpa_ssid * wpa_scan_res_match(struct wpa_supplicant *wpa_s,
- int i, struct wpa_bss *bss,
- struct wpa_ssid *group,
-@@ -827,6 +854,24 @@ static struct wpa_ssid * wpa_scan_res_match(struct wpa_supplicant *wpa_s,
- continue;
- }
-
-+ /* check blacklist */
-+ if (ssid->num_bssid_blacklist &&
-+ addr_in_list(bss->bssid, ssid->bssid_blacklist,
-+ ssid->num_bssid_blacklist)) {
-+ wpa_dbg(wpa_s, MSG_DEBUG,
-+ " skip - BSSID blacklisted");
-+ continue;
-+ }
-+
-+ /* if there is a whitelist, only accept those APs */
-+ if (ssid->num_bssid_whitelist &&
-+ !addr_in_list(bss->bssid, ssid->bssid_whitelist,
-+ ssid->num_bssid_whitelist)) {
-+ wpa_dbg(wpa_s, MSG_DEBUG,
-+ " skip - BSSID not in whitelist");
-+ continue;
-+ }
-+
- if (!wpa_supplicant_ssid_bss_match(wpa_s, ssid, bss))
- continue;
-
-diff --git a/wpa_supplicant/p2p_supplicant.c b/wpa_supplicant/p2p_supplicant.c
-index 8cd43df..60dcb5d 100644
---- a/wpa_supplicant/p2p_supplicant.c
-+++ b/wpa_supplicant/p2p_supplicant.c
-@@ -831,7 +831,7 @@ static void wpas_p2p_add_persistent_group_client(struct wpa_supplicant *wpa_s,
- return;
-
- for (i = 0; s->p2p_client_list && i < s->num_p2p_clients; i++) {
-- if (os_memcmp(s->p2p_client_list + i * ETH_ALEN, addr,
-+ if (os_memcmp(s->p2p_client_list + i * 2 * ETH_ALEN, addr,
- ETH_ALEN) != 0)
- continue;
-
-@@ -839,32 +839,42 @@ static void wpas_p2p_add_persistent_group_client(struct wpa_supplicant *wpa_s,
- return; /* already the most recent entry */
-
- /* move the entry to mark it most recent */
-- os_memmove(s->p2p_client_list + i * ETH_ALEN,
-- s->p2p_client_list + (i + 1) * ETH_ALEN,
-- (s->num_p2p_clients - i - 1) * ETH_ALEN);
-+ os_memmove(s->p2p_client_list + i * 2 * ETH_ALEN,
-+ s->p2p_client_list + (i + 1) * 2 * ETH_ALEN,
-+ (s->num_p2p_clients - i - 1) * 2 * ETH_ALEN);
- os_memcpy(s->p2p_client_list +
-- (s->num_p2p_clients - 1) * ETH_ALEN, addr, ETH_ALEN);
-+ (s->num_p2p_clients - 1) * 2 * ETH_ALEN, addr,
-+ ETH_ALEN);
-+ os_memset(s->p2p_client_list +
-+ (s->num_p2p_clients - 1) * 2 * ETH_ALEN + ETH_ALEN,
-+ 0xff, ETH_ALEN);
- found = 1;
- break;
- }
-
- if (!found && s->num_p2p_clients < P2P_MAX_STORED_CLIENTS) {
- n = os_realloc_array(s->p2p_client_list,
-- s->num_p2p_clients + 1, ETH_ALEN);
-+ s->num_p2p_clients + 1, 2 * ETH_ALEN);
- if (n == NULL)
- return;
-- os_memcpy(n + s->num_p2p_clients * ETH_ALEN, addr, ETH_ALEN);
-+ os_memcpy(n + s->num_p2p_clients * 2 * ETH_ALEN, addr,
-+ ETH_ALEN);
-+ os_memset(n + s->num_p2p_clients * 2 * ETH_ALEN + ETH_ALEN,
-+ 0xff, ETH_ALEN);
- s->p2p_client_list = n;
- s->num_p2p_clients++;
- } else if (!found && s->p2p_client_list) {
- /* Not enough room for an additional entry - drop the oldest
- * entry */
- os_memmove(s->p2p_client_list,
-- s->p2p_client_list + ETH_ALEN,
-- (s->num_p2p_clients - 1) * ETH_ALEN);
-+ s->p2p_client_list + 2 * ETH_ALEN,
-+ (s->num_p2p_clients - 1) * 2 * ETH_ALEN);
- os_memcpy(s->p2p_client_list +
-- (s->num_p2p_clients - 1) * ETH_ALEN,
-+ (s->num_p2p_clients - 1) * 2 * ETH_ALEN,
- addr, ETH_ALEN);
-+ os_memset(s->p2p_client_list +
-+ (s->num_p2p_clients - 1) * 2 * ETH_ALEN + ETH_ALEN,
-+ 0xff, ETH_ALEN);
- }
-
- if (wpa_s->parent->conf->update_config &&
-@@ -3276,7 +3286,7 @@ static void wpas_remove_persistent_peer(struct wpa_supplicant *wpa_s,
- return;
-
- for (i = 0; ssid->p2p_client_list && i < ssid->num_p2p_clients; i++) {
-- if (os_memcmp(ssid->p2p_client_list + i * ETH_ALEN, peer,
-+ if (os_memcmp(ssid->p2p_client_list + i * 2 * ETH_ALEN, peer,
- ETH_ALEN) == 0)
- break;
- }
-@@ -3296,9 +3306,9 @@ static void wpas_remove_persistent_peer(struct wpa_supplicant *wpa_s,
- "group %d client list%s",
- MAC2STR(peer), ssid->id,
- inv ? " due to invitation result" : "");
-- os_memmove(ssid->p2p_client_list + i * ETH_ALEN,
-- ssid->p2p_client_list + (i + 1) * ETH_ALEN,
-- (ssid->num_p2p_clients - i - 1) * ETH_ALEN);
-+ os_memmove(ssid->p2p_client_list + i * 2 * ETH_ALEN,
-+ ssid->p2p_client_list + (i + 1) * 2 * ETH_ALEN,
-+ (ssid->num_p2p_clients - i - 1) * 2 * ETH_ALEN);
- ssid->num_p2p_clients--;
- if (wpa_s->parent->conf->update_config &&
- wpa_config_write(wpa_s->parent->confname, wpa_s->parent->conf))
-@@ -6925,7 +6935,7 @@ struct wpa_ssid * wpas_p2p_get_persistent(struct wpa_supplicant *wpa_s,
- if (s->mode != WPAS_MODE_P2P_GO || s->p2p_client_list == NULL)
- continue;
- for (i = 0; i < s->num_p2p_clients; i++) {
-- if (os_memcmp(s->p2p_client_list + i * ETH_ALEN,
-+ if (os_memcmp(s->p2p_client_list + i * 2 * ETH_ALEN,
- addr, ETH_ALEN) == 0)
- return s; /* peer is P2P client in persistent
- * group */
-diff --git a/wpa_supplicant/wpa_supplicant.conf b/wpa_supplicant/wpa_supplicant.conf
-index 0e8a28a..4bc08db 100644
---- a/wpa_supplicant/wpa_supplicant.conf
-+++ b/wpa_supplicant/wpa_supplicant.conf
-@@ -1408,6 +1408,21 @@ network={
- key_mgmt=NONE
- }
-
-+# Example configuration blacklisting two APs - these will be ignored
-+# for this network.
-+network={
-+ ssid="example"
-+ psk="very secret passphrase"
-+ bssid_blacklist=02:11:22:33:44:55 02:22:aa:44:55:66
-+}
-+
-+# Example configuration limiting AP selection to a specific set of APs;
-+# any other AP not matching the masked address will be ignored.
-+network={
-+ ssid="example"
-+ psk="very secret passphrase"
-+ bssid_whitelist=02:55:ae:bc:00:00/ff:ff:ff:ff:00:00 00:00:77:66:55:44/00:00:ff:ff:ff:ff
-+}
-
- # Example config file that will only scan on channel 36.
- freq_list=5180
---
-2.1.3
-