hostapd: more hot-reload backports

Signed-off-by: John Crispin <john@phrozen.org>
This commit is contained in:
John Crispin
2023-08-14 15:15:22 +02:00
parent 44aef94d82
commit 09ebd5f406
100 changed files with 953 additions and 1308 deletions

View File

@@ -1203,9 +1203,6 @@ hostapd_set_bss_options() {
append bss_conf "$val" "$N" append bss_conf "$val" "$N"
done done
bss_md5sum=$(echo $bss_conf | md5sum | cut -d" " -f1)
append bss_conf "config_id=$bss_md5sum" "$N"
append "$var" "$bss_conf" "$N" append "$var" "$bss_conf" "$N"
return 0 return 0
} }

View File

@@ -66,10 +66,12 @@ function iface_restart(phy, config, old_config)
if (err) if (err)
hostapd.printf(`Failed to create ${bss.ifname} on phy ${phy}: ${err}`); hostapd.printf(`Failed to create ${bss.ifname} on phy ${phy}: ${err}`);
let config_inline = iface_gen_config(phy, config); let config_inline = iface_gen_config(phy, config);
if (hostapd.add_iface(`bss_config=${bss.ifname}:${config_inline}`) < 0) {
let ubus = hostapd.data.ubus;
ubus.call("wpa_supplicant", "phy_set_state", { phy: phy, stop: true });
if (hostapd.add_iface(`bss_config=${bss.ifname}:${config_inline}`) < 0)
hostapd.printf(`hostapd.add_iface failed for phy ${phy} ifname=${bss.ifname}`); hostapd.printf(`hostapd.add_iface failed for phy ${phy} ifname=${bss.ifname}`);
return; ubus.call("wpa_supplicant", "phy_set_state", { phy: phy, stop: false });
}
} }
function array_to_obj(arr, key, start) function array_to_obj(arr, key, start)
@@ -123,30 +125,37 @@ function iface_reload_config(phy, config, old_config)
if (config.bss[0].ifname != old_config.bss[0].ifname) if (config.bss[0].ifname != old_config.bss[0].ifname)
return false; return false;
let iface = hostapd.interfaces[config.bss[0].ifname]; let iface_name = config.bss[0].ifname;
let iface = hostapd.interfaces[iface_name];
if (!iface) if (!iface)
return false; return false;
let first_bss = hostapd.bss[iface_name];
if (!first_bss)
return false;
let config_inline = iface_gen_config(phy, config); let config_inline = iface_gen_config(phy, config);
bss_reload_psk(iface.bss[0], config.bss[0], old_config.bss[0]); bss_reload_psk(first_bss, config.bss[0], old_config.bss[0]);
if (!is_equal(config.bss[0], old_config.bss[0])) { if (!is_equal(config.bss[0], old_config.bss[0])) {
if (phy_is_fullmac(phy)) if (phy_is_fullmac(phy))
return false; return false;
if (config.bss[0].bssid != old_config.bss[0].bssid)
return false;
hostapd.printf(`Reload config for bss '${config.bss[0].ifname}' on phy '${phy}'`); hostapd.printf(`Reload config for bss '${config.bss[0].ifname}' on phy '${phy}'`);
if (iface.bss[0].set_config(config_inline, 0) < 0) { if (first_bss.set_config(config_inline, 0) < 0) {
hostapd.printf(`Failed to set config`); hostapd.printf(`Failed to set config`);
return false; return false;
} }
} }
let bss_list = array_to_obj(iface.bss, "name", 1);
let new_cfg = array_to_obj(config.bss, "ifname", 1); let new_cfg = array_to_obj(config.bss, "ifname", 1);
let old_cfg = array_to_obj(old_config.bss, "ifname", 1); let old_cfg = array_to_obj(old_config.bss, "ifname", 1);
for (let name in old_cfg) { for (let name in old_cfg) {
let bss = bss_list[name]; let bss = hostapd.bss[name];
if (!bss) { if (!bss) {
hostapd.printf(`bss '${name}' not found`); hostapd.printf(`bss '${name}' not found`);
return false; return false;
@@ -267,6 +276,9 @@ function iface_load_config(filename)
if (!val[0]) if (!val[0])
continue; continue;
if (val[0] == "bssid")
bss.bssid = val[1];
if (val[0] == "bss") { if (val[0] == "bss") {
bss = config_add_bss(config, val[1]); bss = config_add_bss(config, val[1]);
continue; continue;
@@ -305,6 +317,78 @@ let main_obj = {
return 0; return 0;
} }
}, },
apsta_state: {
args: {
phy: "",
up: true,
frequency: 0,
sec_chan_offset: 0,
csa: true,
csa_count: 0,
},
call: function(req) {
if (req.args.up == null || !req.args.phy)
return libubus.STATUS_INVALID_ARGUMENT;
let phy = req.args.phy;
let config = hostapd.data.config[phy];
if (!config || !config.bss || !config.bss[0] || !config.bss[0].ifname)
return 0;
let iface = hostapd.interfaces[config.bss[0].ifname];
if (!iface)
return 0;
if (!req.args.up) {
iface.stop();
return 0;
}
let freq = req.args.frequency;
if (!freq)
return libubus.STATUS_INVALID_ARGUMENT;
let sec_offset = req.args.sec_chan_offset;
if (sec_offset != -1 && sec_offset != 1)
sec_offset = 0;
let width = 0;
for (let line in config.radio.data) {
if (!sec_offset && match(line, /^ht_capab=.*HT40/)) {
sec_offset = null; // auto-detect
continue;
}
let val = match(line, /^(vht_oper_chwidth|he_oper_chwidth)=(\d+)/);
if (!val)
continue;
val = int(val[2]);
if (val > width)
width = val;
}
if (freq < 4000)
width = 0;
let freq_info = hostapd.freq_info(freq, sec_offset, width);
if (!freq_info)
return libubus.STATUS_UNKNOWN_ERROR;
let ret;
if (req.args.csa) {
freq_info.csa_count = req.args.csa_count ?? 10;
ret = iface.switch_channel(freq_info);
} else {
iface.stop();
ret = iface.start(freq_info);
}
if (!ret)
return libubus.STATUS_UNKNOWN_ERROR;
return 0;
}
},
config_set: { config_set: {
args: { args: {
phy: "", phy: "",

View File

@@ -5,11 +5,16 @@ import { wdev_create, wdev_remove, is_equal, vlist_new } from "common";
let ubus = libubus.connect(); let ubus = libubus.connect();
wpas.data.config = {}; wpas.data.config = {};
wpas.data.iface_phy = {};
function iface_stop(iface) function iface_stop(iface)
{ {
let ifname = iface.config.iface; let ifname = iface.config.iface;
if (!iface.running)
return;
delete wpas.data.iface_phy[ifname];
wpas.remove_iface(ifname); wpas.remove_iface(ifname);
wdev_remove(ifname); wdev_remove(ifname);
iface.running = false; iface.running = false;
@@ -22,6 +27,7 @@ function iface_start(phy, iface)
let ifname = iface.config.iface; let ifname = iface.config.iface;
wpas.data.iface_phy[ifname] = phy;
wdev_remove(ifname); wdev_remove(ifname);
let ret = wdev_create(phy, ifname, iface.config); let ret = wdev_create(phy, ifname, iface.config);
if (ret) if (ret)
@@ -37,7 +43,7 @@ function iface_cb(new_if, old_if)
return; return;
} }
if (old_if && old_if.running) if (old_if)
iface_stop(old_if); iface_stop(old_if);
} }
@@ -73,6 +79,33 @@ function start_pending(phy_name)
} }
let main_obj = { let main_obj = {
phy_set_state: {
args: {
phy: "",
stop: true,
},
call: function(req) {
if (!req.args.phy || req.args.stop == null)
return libubus.STATUS_INVALID_ARGUMENT;
let phy = wpas.data.config[req.args.phy];
if (!phy)
return libubus.STATUS_NOT_FOUND;
try {
if (req.args.stop) {
for (let ifname in phy.data)
iface_stop(phy.data[ifname]);
} else {
start_pending(req.args.phy);
}
} catch (e) {
wpas.printf(`Error chaging state: ${e}\n${e.stacktrace[0].context}`);
return libubus.STATUS_INVALID_ARGUMENT;
}
return 0;
}
},
config_set: { config_set: {
args: { args: {
phy: "", phy: "",
@@ -146,6 +179,46 @@ function iface_event(type, name, data) {
ubus.call("service", "event", { type: `wpa_supplicant.${name}.${type}`, data: {} }); ubus.call("service", "event", { type: `wpa_supplicant.${name}.${type}`, data: {} });
} }
function iface_hostapd_notify(phy, ifname, iface, state)
{
let ubus = wpas.data.ubus;
let status = iface.status();
let msg = { phy: phy };
switch (state) {
case "DISCONNECTED":
case "AUTHENTICATING":
msg.up = false;
break;
case "INTERFACE_DISABLED":
case "INACTIVE":
msg.up = true;
break;
case "COMPLETED":
msg.up = true;
msg.frequency = status.frequency;
msg.sec_chan_offset = status.sec_chan_offset;
break;
default:
return;
}
ubus.call("hostapd", "apsta_state", msg);
}
function iface_channel_switch(phy, ifname, iface, info)
{
let msg = {
phy: phy,
up: true,
csa: true,
csa_count: info.csa_count ? info.csa_count - 1 : 0,
frequency: info.frequency,
sec_chan_offset: info.sec_chan_offset,
};
ubus.call("hostapd", "apsta_state", msg);
}
return { return {
shutdown: function() { shutdown: function() {
for (let phy in wpas.data.config) for (let phy in wpas.data.config)
@@ -157,5 +230,24 @@ return {
}, },
iface_remove: function(name, obj) { iface_remove: function(name, obj) {
iface_event("remove", name); iface_event("remove", name);
},
state: function(ifname, iface, state) {
let phy = wpas.data.iface_phy[ifname];
if (!phy) {
wpas.printf(`no PHY for ifname ${ifname}`);
return;
}
iface_hostapd_notify(phy, ifname, iface, state);
},
event: function(ifname, iface, ev, info) {
let phy = wpas.data.iface_phy[ifname];
if (!phy) {
wpas.printf(`no PHY for ifname ${ifname}`);
return;
}
if (ev == "CH_SWITCH_STARTED")
iface_channel_switch(phy, ifname, iface, info);
} }
}; };

View File

@@ -68,7 +68,7 @@ Signed-off-by: Markus Theil <markus.theil@tu-ilmenau.de>
if (!chan) { if (!chan) {
--- a/src/drivers/driver_nl80211.c --- a/src/drivers/driver_nl80211.c
+++ b/src/drivers/driver_nl80211.c +++ b/src/drivers/driver_nl80211.c
@@ -9872,6 +9872,10 @@ static int nl80211_switch_channel(void * @@ -9797,6 +9797,10 @@ static int nl80211_switch_channel(void *
if (ret) if (ret)
goto error; goto error;

View File

@@ -31,7 +31,7 @@ Signed-off-by: Daniel Golle <daniel@makrotopia.org>
}; };
#define MAX_STA_COUNT 2007 #define MAX_STA_COUNT 2007
@@ -696,6 +697,7 @@ struct hostapd_bss_config { @@ -694,6 +695,7 @@ struct hostapd_bss_config {
#define MESH_ENABLED BIT(0) #define MESH_ENABLED BIT(0)
int mesh; int mesh;
@@ -59,7 +59,7 @@ Signed-off-by: Daniel Golle <daniel@makrotopia.org>
--- a/src/drivers/driver_nl80211.c --- a/src/drivers/driver_nl80211.c
+++ b/src/drivers/driver_nl80211.c +++ b/src/drivers/driver_nl80211.c
@@ -10456,6 +10456,9 @@ static int nl80211_put_mesh_config(struc @@ -10381,6 +10381,9 @@ static int nl80211_put_mesh_config(struc
if (((params->flags & WPA_DRIVER_MESH_CONF_FLAG_AUTO_PLINKS) && if (((params->flags & WPA_DRIVER_MESH_CONF_FLAG_AUTO_PLINKS) &&
nla_put_u8(msg, NL80211_MESHCONF_AUTO_OPEN_PLINKS, nla_put_u8(msg, NL80211_MESHCONF_AUTO_OPEN_PLINKS,
params->auto_plinks)) || params->auto_plinks)) ||

View File

@@ -1,6 +1,6 @@
--- a/src/ap/ieee802_11.c --- a/src/ap/ieee802_11.c
+++ b/src/ap/ieee802_11.c +++ b/src/ap/ieee802_11.c
@@ -4942,6 +4942,13 @@ static int add_associated_sta(struct hos @@ -4810,6 +4810,13 @@ static int add_associated_sta(struct hos
* drivers to accept the STA parameter configuration. Since this is * 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 * after a new FT-over-DS exchange, a new TK has been derived, so key
* reinstallation is not a concern for this case. * reinstallation is not a concern for this case.
@@ -14,7 +14,7 @@
*/ */
wpa_printf(MSG_DEBUG, "Add associated STA " MACSTR 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)", " (added_unassoc=%d auth_alg=%u ft_over_ds=%u reassoc=%d authorized=%d ft_tk=%d fils_tk=%d)",
@@ -4955,7 +4962,8 @@ static int add_associated_sta(struct hos @@ -4823,7 +4830,8 @@ static int add_associated_sta(struct hos
(!(sta->flags & WLAN_STA_AUTHORIZED) || (!(sta->flags & WLAN_STA_AUTHORIZED) ||
(reassoc && sta->ft_over_ds && sta->auth_alg == WLAN_AUTH_FT) || (reassoc && sta->ft_over_ds && sta->auth_alg == WLAN_AUTH_FT) ||
(!wpa_auth_sta_ft_tk_already_set(sta->wpa_sm) && (!wpa_auth_sta_ft_tk_already_set(sta->wpa_sm) &&

View File

@@ -14,7 +14,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
--- a/src/ap/hostapd.c --- a/src/ap/hostapd.c
+++ b/src/ap/hostapd.c +++ b/src/ap/hostapd.c
@@ -3431,7 +3431,7 @@ static int hostapd_change_config_freq(st @@ -3403,7 +3403,7 @@ static int hostapd_change_config_freq(st
struct hostapd_freq_params *old_params) struct hostapd_freq_params *old_params)
{ {
int channel; int channel;

View File

@@ -20,7 +20,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
#include <linux/rtnetlink.h> #include <linux/rtnetlink.h>
#include <netpacket/packet.h> #include <netpacket/packet.h>
#include <linux/errqueue.h> #include <linux/errqueue.h>
@@ -5284,26 +5281,29 @@ fail: @@ -5233,26 +5230,29 @@ fail:
static void rtnl_neigh_delete_fdb_entry(struct i802_bss *bss, const u8 *addr) static void rtnl_neigh_delete_fdb_entry(struct i802_bss *bss, const u8 *addr)
{ {
@@ -64,7 +64,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
if (err < 0) { if (err < 0) {
wpa_printf(MSG_DEBUG, "nl80211: bridge FDB entry delete for " wpa_printf(MSG_DEBUG, "nl80211: bridge FDB entry delete for "
MACSTR " ifindex=%d failed: %s", MAC2STR(addr), MACSTR " ifindex=%d failed: %s", MAC2STR(addr),
@@ -5313,9 +5313,8 @@ static void rtnl_neigh_delete_fdb_entry( @@ -5262,9 +5262,8 @@ static void rtnl_neigh_delete_fdb_entry(
MACSTR, MAC2STR(addr)); MACSTR, MAC2STR(addr));
} }
@@ -76,7 +76,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
} }
@@ -7691,7 +7690,6 @@ static void *i802_init(struct hostapd_da @@ -7633,7 +7632,6 @@ static void *i802_init(struct hostapd_da
(params->num_bridge == 0 || !params->bridge[0])) (params->num_bridge == 0 || !params->bridge[0]))
add_ifidx(drv, br_ifindex, drv->ifindex); add_ifidx(drv, br_ifindex, drv->ifindex);
@@ -84,7 +84,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
if (bss->added_if_into_bridge || bss->already_in_bridge) { if (bss->added_if_into_bridge || bss->already_in_bridge) {
int err; int err;
@@ -7708,7 +7706,6 @@ static void *i802_init(struct hostapd_da @@ -7650,7 +7648,6 @@ static void *i802_init(struct hostapd_da
goto failed; goto failed;
} }
} }
@@ -92,7 +92,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
if (drv->capa.flags2 & WPA_DRIVER_FLAGS2_CONTROL_PORT_RX) { if (drv->capa.flags2 & WPA_DRIVER_FLAGS2_CONTROL_PORT_RX) {
wpa_printf(MSG_DEBUG, wpa_printf(MSG_DEBUG,
@@ -10655,13 +10652,14 @@ static int wpa_driver_br_add_ip_neigh(vo @@ -10581,13 +10578,14 @@ static int wpa_driver_br_add_ip_neigh(vo
const u8 *ipaddr, int prefixlen, const u8 *ipaddr, int prefixlen,
const u8 *addr) const u8 *addr)
{ {
@@ -112,7 +112,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
int res; int res;
if (!ipaddr || prefixlen == 0 || !addr) if (!ipaddr || prefixlen == 0 || !addr)
@@ -10680,85 +10678,66 @@ static int wpa_driver_br_add_ip_neigh(vo @@ -10606,85 +10604,66 @@ static int wpa_driver_br_add_ip_neigh(vo
} }
if (version == 4) { if (version == 4) {
@@ -220,7 +220,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
addrsize = 16; addrsize = 16;
} else { } else {
return -EINVAL; return -EINVAL;
@@ -10776,41 +10755,30 @@ static int wpa_driver_br_delete_ip_neigh @@ -10702,41 +10681,30 @@ static int wpa_driver_br_delete_ip_neigh
return -1; return -1;
} }

View File

@@ -72,7 +72,7 @@
include ../src/build.rules include ../src/build.rules
ifdef LIBS ifdef LIBS
@@ -359,7 +360,9 @@ endif @@ -354,7 +355,9 @@ endif
ifdef CONFIG_IBSS_RSN ifdef CONFIG_IBSS_RSN
NEED_RSN_AUTHENTICATOR=y NEED_RSN_AUTHENTICATOR=y
CFLAGS += -DCONFIG_IBSS_RSN CFLAGS += -DCONFIG_IBSS_RSN
@@ -82,7 +82,7 @@
OBJS += ibss_rsn.o OBJS += ibss_rsn.o
endif endif
@@ -897,6 +900,10 @@ ifdef CONFIG_DYNAMIC_EAP_METHODS @@ -886,6 +889,10 @@ ifdef CONFIG_DYNAMIC_EAP_METHODS
CFLAGS += -DCONFIG_DYNAMIC_EAP_METHODS CFLAGS += -DCONFIG_DYNAMIC_EAP_METHODS
LIBS += -ldl -rdynamic LIBS += -ldl -rdynamic
endif endif
@@ -93,7 +93,7 @@
endif endif
ifdef CONFIG_AP ifdef CONFIG_AP
@@ -904,9 +911,11 @@ NEED_EAP_COMMON=y @@ -893,9 +900,11 @@ NEED_EAP_COMMON=y
NEED_RSN_AUTHENTICATOR=y NEED_RSN_AUTHENTICATOR=y
CFLAGS += -DCONFIG_AP CFLAGS += -DCONFIG_AP
OBJS += ap.o OBJS += ap.o
@@ -105,7 +105,7 @@
OBJS += ../src/ap/hostapd.o OBJS += ../src/ap/hostapd.o
OBJS += ../src/ap/wpa_auth_glue.o OBJS += ../src/ap/wpa_auth_glue.o
OBJS += ../src/ap/utils.o OBJS += ../src/ap/utils.o
@@ -986,6 +995,12 @@ endif @@ -975,6 +984,12 @@ endif
ifdef CONFIG_HS20 ifdef CONFIG_HS20
OBJS += ../src/ap/hs20.o OBJS += ../src/ap/hs20.o
endif endif
@@ -118,7 +118,7 @@
endif endif
ifdef CONFIG_MBO ifdef CONFIG_MBO
@@ -994,7 +1009,9 @@ CFLAGS += -DCONFIG_MBO @@ -983,7 +998,9 @@ CFLAGS += -DCONFIG_MBO
endif endif
ifdef NEED_RSN_AUTHENTICATOR ifdef NEED_RSN_AUTHENTICATOR
@@ -128,7 +128,7 @@
NEED_AES_WRAP=y NEED_AES_WRAP=y
OBJS += ../src/ap/wpa_auth.o OBJS += ../src/ap/wpa_auth.o
OBJS += ../src/ap/wpa_auth_ie.o OBJS += ../src/ap/wpa_auth_ie.o
@@ -1889,6 +1906,12 @@ wpa_priv: $(BCHECK) $(OBJS_priv) @@ -1878,6 +1895,12 @@ wpa_priv: $(BCHECK) $(OBJS_priv)
_OBJS_VAR := OBJS _OBJS_VAR := OBJS
include ../src/objs.mk include ../src/objs.mk
@@ -141,7 +141,7 @@
wpa_supplicant: $(BCHECK) $(OBJS) $(EXTRA_progs) wpa_supplicant: $(BCHECK) $(OBJS) $(EXTRA_progs)
$(Q)$(LDO) $(LDFLAGS) -o wpa_supplicant $(OBJS) $(LIBS) $(EXTRALIBS) $(Q)$(LDO) $(LDFLAGS) -o wpa_supplicant $(OBJS) $(LIBS) $(EXTRALIBS)
@$(E) " LD " $@ @$(E) " LD " $@
@@ -2021,6 +2044,12 @@ eap_gpsk.so: $(SRC_EAP_GPSK) @@ -1983,6 +2006,12 @@ eap_eke.so: ../src/eap_peer/eap_eke.c ..
$(Q)sed -e 's|\@BINDIR\@|$(BINDIR)|g' $< >$@ $(Q)sed -e 's|\@BINDIR\@|$(BINDIR)|g' $< >$@
@$(E) " sed" $< @$(E) " sed" $<
@@ -156,7 +156,7 @@
wpa_cli.exe: wpa_cli wpa_cli.exe: wpa_cli
--- a/src/drivers/driver.h --- a/src/drivers/driver.h
+++ b/src/drivers/driver.h +++ b/src/drivers/driver.h
@@ -6025,8 +6025,8 @@ union wpa_event_data { @@ -6018,8 +6018,8 @@ union wpa_event_data {
* Driver wrapper code should call this function whenever an event is received * Driver wrapper code should call this function whenever an event is received
* from the driver. * from the driver.
*/ */
@@ -167,7 +167,7 @@
/** /**
* wpa_supplicant_event_global - Report a driver event for wpa_supplicant * wpa_supplicant_event_global - Report a driver event for wpa_supplicant
@@ -6038,7 +6038,7 @@ void wpa_supplicant_event(void *ctx, enu @@ -6031,7 +6031,7 @@ void wpa_supplicant_event(void *ctx, enu
* Same as wpa_supplicant_event(), but we search for the interface in * Same as wpa_supplicant_event(), but we search for the interface in
* wpa_global. * wpa_global.
*/ */
@@ -178,7 +178,7 @@
/* /*
--- a/src/ap/drv_callbacks.c --- a/src/ap/drv_callbacks.c
+++ b/src/ap/drv_callbacks.c +++ b/src/ap/drv_callbacks.c
@@ -1836,8 +1836,8 @@ err: @@ -1827,8 +1827,8 @@ err:
#endif /* CONFIG_OWE */ #endif /* CONFIG_OWE */
@@ -189,7 +189,7 @@
{ {
struct hostapd_data *hapd = ctx; struct hostapd_data *hapd = ctx;
#ifndef CONFIG_NO_STDOUT_DEBUG #ifndef CONFIG_NO_STDOUT_DEBUG
@@ -2082,7 +2082,7 @@ void wpa_supplicant_event(void *ctx, enu @@ -2073,7 +2073,7 @@ void wpa_supplicant_event(void *ctx, enu
} }
@@ -231,7 +231,7 @@
os_memset(&global, 0, sizeof(global)); os_memset(&global, 0, sizeof(global));
--- a/wpa_supplicant/events.c --- a/wpa_supplicant/events.c
+++ b/wpa_supplicant/events.c +++ b/wpa_supplicant/events.c
@@ -4665,8 +4665,8 @@ static void wpas_event_unprot_beacon(str @@ -4666,8 +4666,8 @@ static void wpas_event_unprot_beacon(str
} }
@@ -242,7 +242,7 @@
{ {
struct wpa_supplicant *wpa_s = ctx; struct wpa_supplicant *wpa_s = ctx;
int resched; int resched;
@@ -5511,7 +5511,7 @@ void wpa_supplicant_event(void *ctx, enu @@ -5512,7 +5512,7 @@ void wpa_supplicant_event(void *ctx, enu
} }
@@ -253,7 +253,7 @@
struct wpa_supplicant *wpa_s; struct wpa_supplicant *wpa_s;
--- a/wpa_supplicant/wpa_supplicant.c --- a/wpa_supplicant/wpa_supplicant.c
+++ b/wpa_supplicant/wpa_supplicant.c +++ b/wpa_supplicant/wpa_supplicant.c
@@ -6819,7 +6819,6 @@ struct wpa_interface * wpa_supplicant_ma @@ -6814,7 +6814,6 @@ struct wpa_interface * wpa_supplicant_ma
return NULL; return NULL;
} }
@@ -261,7 +261,7 @@
/** /**
* wpa_supplicant_match_existing - Match existing interfaces * wpa_supplicant_match_existing - Match existing interfaces
* @global: Pointer to global data from wpa_supplicant_init() * @global: Pointer to global data from wpa_supplicant_init()
@@ -6854,6 +6853,11 @@ static int wpa_supplicant_match_existing @@ -6849,6 +6848,11 @@ static int wpa_supplicant_match_existing
#endif /* CONFIG_MATCH_IFACE */ #endif /* CONFIG_MATCH_IFACE */
@@ -273,7 +273,7 @@
/** /**
* wpa_supplicant_add_iface - Add a new network interface * wpa_supplicant_add_iface - Add a new network interface
@@ -7110,6 +7114,8 @@ struct wpa_global * wpa_supplicant_init( @@ -7105,6 +7109,8 @@ struct wpa_global * wpa_supplicant_init(
#ifndef CONFIG_NO_WPA_MSG #ifndef CONFIG_NO_WPA_MSG
wpa_msg_register_ifname_cb(wpa_supplicant_msg_ifname_cb); wpa_msg_register_ifname_cb(wpa_supplicant_msg_ifname_cb);
#endif /* CONFIG_NO_WPA_MSG */ #endif /* CONFIG_NO_WPA_MSG */
@@ -333,7 +333,7 @@
const struct wpa_driver_ops *const wpa_drivers[] = { NULL }; const struct wpa_driver_ops *const wpa_drivers[] = { NULL };
@@ -1291,6 +1296,10 @@ static void usage(void) @@ -1292,6 +1297,10 @@ static void usage(void)
"option several times.\n"); "option several times.\n");
} }
@@ -344,7 +344,7 @@
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
@@ -1311,6 +1320,8 @@ int main(int argc, char *argv[]) @@ -1312,6 +1321,8 @@ int main(int argc, char *argv[])
if (os_program_init()) if (os_program_init())
return -1; return -1;

View File

@@ -1,6 +1,6 @@
--- a/hostapd/config_file.c --- a/hostapd/config_file.c
+++ b/hostapd/config_file.c +++ b/hostapd/config_file.c
@@ -3459,6 +3459,10 @@ static int hostapd_config_fill(struct ho @@ -3439,6 +3439,10 @@ static int hostapd_config_fill(struct ho
if (bss->ocv && !bss->ieee80211w) if (bss->ocv && !bss->ieee80211w)
bss->ieee80211w = 1; bss->ieee80211w = 1;
#endif /* CONFIG_OCV */ #endif /* CONFIG_OCV */
@@ -13,7 +13,7 @@
} else if (os_strcmp(buf, "ht_capab") == 0) { } else if (os_strcmp(buf, "ht_capab") == 0) {
--- a/src/ap/ap_config.h --- a/src/ap/ap_config.h
+++ b/src/ap/ap_config.h +++ b/src/ap/ap_config.h
@@ -1009,6 +1009,8 @@ struct hostapd_config { @@ -995,6 +995,8 @@ struct hostapd_config {
int ht_op_mode_fixed; int ht_op_mode_fixed;
u16 ht_capab; u16 ht_capab;

View File

@@ -1,6 +1,6 @@
--- a/wpa_supplicant/wpa_supplicant.c --- a/wpa_supplicant/wpa_supplicant.c
+++ b/wpa_supplicant/wpa_supplicant.c +++ b/wpa_supplicant/wpa_supplicant.c
@@ -5154,7 +5154,7 @@ wpa_supplicant_alloc(struct wpa_supplica @@ -5147,7 +5147,7 @@ wpa_supplicant_alloc(struct wpa_supplica
if (wpa_s == NULL) if (wpa_s == NULL)
return NULL; return NULL;
wpa_s->scan_req = INITIAL_SCAN_REQ; wpa_s->scan_req = INITIAL_SCAN_REQ;

View File

@@ -1,6 +1,6 @@
--- a/src/drivers/drivers.mak --- a/src/drivers/drivers.mak
+++ b/src/drivers/drivers.mak +++ b/src/drivers/drivers.mak
@@ -54,7 +54,6 @@ NEED_SME=y @@ -50,7 +50,6 @@ NEED_SME=y
NEED_AP_MLME=y NEED_AP_MLME=y
NEED_NETLINK=y NEED_NETLINK=y
NEED_LINUX_IOCTL=y NEED_LINUX_IOCTL=y
@@ -8,7 +8,7 @@
NEED_RADIOTAP=y NEED_RADIOTAP=y
NEED_LIBNL=y NEED_LIBNL=y
endif endif
@@ -111,7 +110,6 @@ DRV_WPA_CFLAGS += -DCONFIG_DRIVER_WEXT @@ -107,7 +106,6 @@ DRV_WPA_CFLAGS += -DCONFIG_DRIVER_WEXT
CONFIG_WIRELESS_EXTENSION=y CONFIG_WIRELESS_EXTENSION=y
NEED_NETLINK=y NEED_NETLINK=y
NEED_LINUX_IOCTL=y NEED_LINUX_IOCTL=y
@@ -16,7 +16,7 @@
endif endif
ifdef CONFIG_DRIVER_NDIS ifdef CONFIG_DRIVER_NDIS
@@ -137,7 +135,6 @@ endif @@ -133,7 +131,6 @@ endif
ifdef CONFIG_WIRELESS_EXTENSION ifdef CONFIG_WIRELESS_EXTENSION
DRV_WPA_CFLAGS += -DCONFIG_WIRELESS_EXTENSION DRV_WPA_CFLAGS += -DCONFIG_WIRELESS_EXTENSION
DRV_WPA_OBJS += ../src/drivers/driver_wext.o DRV_WPA_OBJS += ../src/drivers/driver_wext.o
@@ -24,7 +24,7 @@
endif endif
ifdef NEED_NETLINK ifdef NEED_NETLINK
@@ -146,6 +143,7 @@ endif @@ -142,6 +139,7 @@ endif
ifdef NEED_RFKILL ifdef NEED_RFKILL
DRV_OBJS += ../src/drivers/rfkill.o DRV_OBJS += ../src/drivers/rfkill.o

View File

@@ -1,6 +1,6 @@
--- a/src/drivers/driver_nl80211.c --- a/src/drivers/driver_nl80211.c
+++ b/src/drivers/driver_nl80211.c +++ b/src/drivers/driver_nl80211.c
@@ -4973,7 +4973,7 @@ static int nl80211_set_channel(struct i8 @@ -4919,7 +4919,7 @@ static int nl80211_set_channel(struct i8
freq->freq, freq->ht_enabled, freq->vht_enabled, freq->he_enabled, freq->freq, freq->ht_enabled, freq->vht_enabled, freq->he_enabled,
freq->bandwidth, freq->center_freq1, freq->center_freq2); freq->bandwidth, freq->center_freq1, freq->center_freq2);

View File

@@ -1,75 +0,0 @@
--- a/src/ap/hostapd.c
+++ b/src/ap/hostapd.c
@@ -115,6 +115,28 @@ static void hostapd_reload_bss(struct ho
#endif /* CONFIG_NO_RADIUS */
ssid = &hapd->conf->ssid;
+
+ hostapd_set_freq(hapd, hapd->iconf->hw_mode, hapd->iface->freq,
+ hapd->iconf->channel,
+ hapd->iconf->enable_edmg,
+ hapd->iconf->edmg_channel,
+ hapd->iconf->ieee80211n,
+ hapd->iconf->ieee80211ac,
+ hapd->iconf->ieee80211ax,
+ hapd->iconf->secondary_channel,
+ hostapd_get_oper_chwidth(hapd->iconf),
+ hostapd_get_oper_centr_freq_seg0_idx(hapd->iconf),
+ hostapd_get_oper_centr_freq_seg1_idx(hapd->iconf));
+
+ if (hapd->iface->current_mode) {
+ if (hostapd_prepare_rates(hapd->iface, hapd->iface->current_mode)) {
+ wpa_printf(MSG_ERROR, "Failed to prepare rates table.");
+ hostapd_logger(hapd, NULL, HOSTAPD_MODULE_IEEE80211,
+ HOSTAPD_LEVEL_WARNING,
+ "Failed to prepare rates table.");
+ }
+ }
+
if (!ssid->wpa_psk_set && ssid->wpa_psk && !ssid->wpa_psk->next &&
ssid->wpa_passphrase_set && ssid->wpa_passphrase) {
/*
@@ -216,6 +238,7 @@ int hostapd_reload_config(struct hostapd
struct hostapd_data *hapd = iface->bss[0];
struct hostapd_config *newconf, *oldconf;
size_t j;
+ int i;
if (iface->config_fname == NULL) {
/* Only in-memory config in use - assume it has been updated */
@@ -266,24 +289,20 @@ int hostapd_reload_config(struct hostapd
}
iface->conf = newconf;
+ for (i = 0; i < iface->num_hw_features; i++) {
+ struct hostapd_hw_modes *mode = &iface->hw_features[i];
+ if (mode->mode == iface->conf->hw_mode) {
+ iface->current_mode = mode;
+ break;
+ }
+ }
+
+ if (iface->conf->channel)
+ iface->freq = hostapd_hw_get_freq(hapd, iface->conf->channel);
+
for (j = 0; j < iface->num_bss; j++) {
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;
- hapd->iconf->ht_capab = oldconf->ht_capab;
- hapd->iconf->vht_capab = oldconf->vht_capab;
- hostapd_set_oper_chwidth(hapd->iconf,
- hostapd_get_oper_chwidth(oldconf));
- hostapd_set_oper_centr_freq_seg0_idx(
- hapd->iconf,
- hostapd_get_oper_centr_freq_seg0_idx(oldconf));
- hostapd_set_oper_centr_freq_seg1_idx(
- hapd->iconf,
- hostapd_get_oper_centr_freq_seg1_idx(oldconf));
hapd->conf = newconf->bss[j];
hostapd_reload_bss(hapd);
}

View File

@@ -1,6 +1,6 @@
--- a/src/drivers/driver_nl80211.c --- a/src/drivers/driver_nl80211.c
+++ b/src/drivers/driver_nl80211.c +++ b/src/drivers/driver_nl80211.c
@@ -2918,10 +2918,15 @@ static int wpa_driver_nl80211_del_beacon @@ -2891,10 +2891,15 @@ static int wpa_driver_nl80211_del_beacon
struct nl_msg *msg; struct nl_msg *msg;
struct wpa_driver_nl80211_data *drv = bss->drv; struct wpa_driver_nl80211_data *drv = bss->drv;
@@ -18,7 +18,7 @@
return send_and_recv_msgs(drv, msg, NULL, NULL, NULL, NULL); return send_and_recv_msgs(drv, msg, NULL, NULL, NULL, NULL);
} }
@@ -5602,7 +5607,7 @@ static void nl80211_teardown_ap(struct i @@ -5550,7 +5555,7 @@ static void nl80211_teardown_ap(struct i
nl80211_mgmt_unsubscribe(bss, "AP teardown"); nl80211_mgmt_unsubscribe(bss, "AP teardown");
nl80211_put_wiphy_data_ap(bss); nl80211_put_wiphy_data_ap(bss);
@@ -27,7 +27,7 @@
} }
@@ -8051,8 +8056,6 @@ static int wpa_driver_nl80211_if_remove( @@ -7990,8 +7995,6 @@ static int wpa_driver_nl80211_if_remove(
} else { } else {
wpa_printf(MSG_DEBUG, "nl80211: First BSS - reassign context"); wpa_printf(MSG_DEBUG, "nl80211: First BSS - reassign context");
nl80211_teardown_ap(bss); nl80211_teardown_ap(bss);
@@ -36,7 +36,7 @@
nl80211_destroy_bss(bss); nl80211_destroy_bss(bss);
if (!bss->added_if) if (!bss->added_if)
i802_set_iface_flags(bss, 0); i802_set_iface_flags(bss, 0);
@@ -8449,7 +8452,6 @@ static int wpa_driver_nl80211_deinit_ap( @@ -8388,7 +8391,6 @@ static int wpa_driver_nl80211_deinit_ap(
if (!is_ap_interface(drv->nlmode)) if (!is_ap_interface(drv->nlmode))
return -1; return -1;
wpa_driver_nl80211_del_beacon(bss); wpa_driver_nl80211_del_beacon(bss);
@@ -44,7 +44,7 @@
/* /*
* If the P2P GO interface was dynamically added, then it is * If the P2P GO interface was dynamically added, then it is
@@ -8469,7 +8471,6 @@ static int wpa_driver_nl80211_stop_ap(vo @@ -8408,7 +8410,6 @@ static int wpa_driver_nl80211_stop_ap(vo
if (!is_ap_interface(drv->nlmode)) if (!is_ap_interface(drv->nlmode))
return -1; return -1;
wpa_driver_nl80211_del_beacon(bss); wpa_driver_nl80211_del_beacon(bss);

View File

@@ -1,106 +0,0 @@
--- a/hostapd/ctrl_iface.c
+++ b/hostapd/ctrl_iface.c
@@ -67,6 +67,7 @@
#include "fst/fst_ctrl_iface.h"
#include "config_file.h"
#include "ctrl_iface.h"
+#include "config_file.h"
#define HOSTAPD_CLI_DUP_VALUE_MAX_LEN 256
@@ -82,6 +83,7 @@ static void hostapd_ctrl_iface_send(stru
enum wpa_msg_type type,
const char *buf, size_t len);
+static char *reload_opts = NULL;
static int hostapd_ctrl_iface_attach(struct hostapd_data *hapd,
struct sockaddr_storage *from,
@@ -133,6 +135,61 @@ static int hostapd_ctrl_iface_new_sta(st
return 0;
}
+static char *get_option(char *opt, char *str)
+{
+ int len = strlen(str);
+
+ if (!strncmp(opt, str, len))
+ return opt + len;
+ else
+ return NULL;
+}
+
+static struct hostapd_config *hostapd_ctrl_iface_config_read(const char *fname)
+{
+ struct hostapd_config *conf;
+ char *opt, *val;
+
+ conf = hostapd_config_read(fname);
+ if (!conf)
+ return NULL;
+
+ for (opt = strtok(reload_opts, " ");
+ opt;
+ opt = strtok(NULL, " ")) {
+
+ if ((val = get_option(opt, "channel=")))
+ conf->channel = atoi(val);
+ else if ((val = get_option(opt, "ht_capab=")))
+ conf->ht_capab = atoi(val);
+ else if ((val = get_option(opt, "ht_capab_mask=")))
+ conf->ht_capab &= atoi(val);
+ else if ((val = get_option(opt, "sec_chan=")))
+ conf->secondary_channel = atoi(val);
+ else if ((val = get_option(opt, "hw_mode=")))
+ conf->hw_mode = atoi(val);
+ else if ((val = get_option(opt, "ieee80211n=")))
+ conf->ieee80211n = atoi(val);
+ else
+ break;
+ }
+
+ return conf;
+}
+
+static int hostapd_ctrl_iface_update(struct hostapd_data *hapd, char *txt)
+{
+ struct hostapd_config * (*config_read_cb)(const char *config_fname);
+ struct hostapd_iface *iface = hapd->iface;
+
+ config_read_cb = iface->interfaces->config_read_cb;
+ iface->interfaces->config_read_cb = hostapd_ctrl_iface_config_read;
+ reload_opts = txt;
+
+ hostapd_reload_config(iface);
+
+ iface->interfaces->config_read_cb = config_read_cb;
+}
#ifdef NEED_AP_MLME
static int hostapd_ctrl_iface_sa_query(struct hostapd_data *hapd,
@@ -3754,6 +3811,8 @@ static int hostapd_ctrl_iface_receive_pr
} else if (os_strncmp(buf, "VENDOR ", 7) == 0) {
reply_len = hostapd_ctrl_iface_vendor(hapd, buf + 7, reply,
reply_size);
+ } 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
@@ -919,7 +919,13 @@ int hostapd_parse_csa_settings(const cha
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;
}

View File

@@ -1,414 +0,0 @@
Index: hostapd-2021-02-20-59e9794c/wpa_supplicant/Makefile
===================================================================
--- hostapd-2021-02-20-59e9794c.orig/wpa_supplicant/Makefile
+++ hostapd-2021-02-20-59e9794c/wpa_supplicant/Makefile
@@ -103,6 +103,8 @@ OBJS_c += ../src/utils/common.o
OBJS_c += ../src/common/cli.o
OBJS += wmm_ac.o
+OBJS += ../src/common/wpa_ctrl.o
+
ifndef CONFIG_OS
ifdef CONFIG_NATIVE_WINDOWS
CONFIG_OS=win32
Index: hostapd-2021-02-20-59e9794c/wpa_supplicant/bss.c
===================================================================
--- hostapd-2021-02-20-59e9794c.orig/wpa_supplicant/bss.c
+++ hostapd-2021-02-20-59e9794c/wpa_supplicant/bss.c
@@ -11,6 +11,7 @@
#include "utils/common.h"
#include "utils/eloop.h"
#include "common/ieee802_11_defs.h"
+#include "common/ieee802_11_common.h"
#include "drivers/driver.h"
#include "eap_peer/eap.h"
#include "wpa_supplicant_i.h"
@@ -282,6 +283,10 @@ void calculate_update_time(const struct
static void wpa_bss_copy_res(struct wpa_bss *dst, struct wpa_scan_res *src,
struct os_reltime *fetch_time)
{
+ struct ieee80211_ht_capabilities *capab;
+ struct ieee80211_ht_operation *oper;
+ struct ieee802_11_elems elems;
+
dst->flags = src->flags;
os_memcpy(dst->bssid, src->bssid, ETH_ALEN);
dst->freq = src->freq;
@@ -294,6 +299,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);
+ capab = (struct ieee80211_ht_capabilities *) elems.ht_capabilities;
+ oper = (struct ieee80211_ht_operation *) elems.ht_operation;
+ if (capab)
+ dst->ht_capab = le_to_host16(capab->ht_capabilities_info);
+ if (oper)
+ dst->ht_param = oper->ht_param;
+
calculate_update_time(fetch_time, src->age, &dst->last_update);
}
Index: hostapd-2021-02-20-59e9794c/wpa_supplicant/bss.h
===================================================================
--- hostapd-2021-02-20-59e9794c.orig/wpa_supplicant/bss.h
+++ hostapd-2021-02-20-59e9794c/wpa_supplicant/bss.h
@@ -94,6 +94,10 @@ struct wpa_bss {
u8 ssid[SSID_MAX_LEN];
/** Length of SSID */
size_t ssid_len;
+ /** HT capabilities */
+ u16 ht_capab;
+ /* Five octets of HT Operation Information */
+ u8 ht_param;
/** Frequency of the channel in MHz (e.g., 2412 = channel 1) */
int freq;
/** Beacon interval in TUs (host byte order) */
Index: hostapd-2021-02-20-59e9794c/wpa_supplicant/main.c
===================================================================
--- hostapd-2021-02-20-59e9794c.orig/wpa_supplicant/main.c
+++ hostapd-2021-02-20-59e9794c/wpa_supplicant/main.c
@@ -34,7 +34,7 @@ static void usage(void)
"vW] [-P<pid file>] "
"[-g<global ctrl>] \\\n"
" [-G<group>] \\\n"
- " -i<ifname> -c<config file> [-C<ctrl>] [-D<driver>] "
+ " -i<ifname> -c<config file> [-C<ctrl>] [-D<driver>] [-H<hostapd path>] "
"[-p<driver_param>] \\\n"
" [-b<br_ifname>] [-e<entropy file>]"
#ifdef CONFIG_DEBUG_FILE
@@ -74,6 +74,7 @@ static void usage(void)
" -g = global ctrl_interface\n"
" -G = global ctrl_interface group\n"
" -h = show this help text\n"
+ " -H = connect to a hostapd instance to manage state changes\n"
" -i = interface name\n"
" -I = additional configuration file\n"
" -K = include keys (passwords, etc.) in debug output\n"
@@ -201,7 +202,7 @@ int main(int argc, char *argv[])
for (;;) {
c = getopt(argc, argv,
- "b:Bc:C:D:de:f:g:G:hi:I:KLMm:No:O:p:P:qsTtuvW");
+ "b:Bc:C:D:de:f:g:G:hH:i:I:KLMm:No:O:p:P:qsTtuvW");
if (c < 0)
break;
switch (c) {
@@ -248,6 +249,9 @@ int main(int argc, char *argv[])
usage();
exitcode = 0;
goto out;
+ case 'H':
+ iface->hostapd_ctrl = optarg;
+ break;
case 'i':
iface->ifname = optarg;
break;
Index: hostapd-2021-02-20-59e9794c/wpa_supplicant/wpa_supplicant.c
===================================================================
--- hostapd-2021-02-20-59e9794c.orig/wpa_supplicant/wpa_supplicant.c
+++ hostapd-2021-02-20-59e9794c/wpa_supplicant/wpa_supplicant.c
@@ -130,6 +130,54 @@ static void wpas_update_fils_connect_par
static void wpas_update_owe_connect_params(struct wpa_supplicant *wpa_s);
#endif /* CONFIG_OWE */
+static int hostapd_stop(struct wpa_supplicant *wpa_s)
+{
+ const char *cmd = "STOP_AP";
+ char buf[256];
+ size_t len = sizeof(buf);
+
+ if (wpa_ctrl_request(wpa_s->hostapd, cmd, os_strlen(cmd), buf, &len, NULL) < 0) {
+ wpa_printf(MSG_ERROR, "\nFailed to stop hostapd AP interfaces\n");
+ return -1;
+ }
+ return 0;
+}
+
+static int hostapd_reload(struct wpa_supplicant *wpa_s, struct wpa_bss *bss)
+{
+ char *cmd = NULL;
+ char buf[256];
+ size_t len = sizeof(buf);
+ enum hostapd_hw_mode hw_mode;
+ u8 channel;
+ int sec_chan = 0;
+ int ret;
+
+ if (!bss)
+ return -1;
+
+ if (bss->ht_param & HT_INFO_HT_PARAM_STA_CHNL_WIDTH) {
+ int sec = bss->ht_param & HT_INFO_HT_PARAM_SECONDARY_CHNL_OFF_MASK;
+ if (sec == HT_INFO_HT_PARAM_SECONDARY_CHNL_ABOVE)
+ sec_chan = 1;
+ else if (sec == HT_INFO_HT_PARAM_SECONDARY_CHNL_BELOW)
+ sec_chan = -1;
+ }
+
+ hw_mode = ieee80211_freq_to_chan(bss->freq, &channel);
+ if (asprintf(&cmd, "UPDATE channel=%d sec_chan=%d hw_mode=%d",
+ channel, sec_chan, hw_mode) < 0)
+ return -1;
+
+ ret = wpa_ctrl_request(wpa_s->hostapd, cmd, os_strlen(cmd), buf, &len, NULL);
+ free(cmd);
+
+ if (ret < 0) {
+ wpa_printf(MSG_ERROR, "\nFailed to reload hostapd AP interfaces\n");
+ return -1;
+ }
+ return 0;
+}
#ifdef CONFIG_WEP
/* Configure default/group WEP keys for static WEP */
@@ -1007,6 +1055,8 @@ void wpa_supplicant_set_state(struct wpa
sme_sched_obss_scan(wpa_s, 1);
+ if (wpa_s->hostapd)
+ hostapd_reload(wpa_s, wpa_s->current_bss);
#if defined(CONFIG_FILS) && defined(IEEE8021X_EAPOL)
if (!fils_hlp_sent && ssid && ssid->eap.erp)
update_fils_connect_params = true;
@@ -1017,6 +1067,8 @@ void wpa_supplicant_set_state(struct wpa
#endif /* CONFIG_OWE */
} else if (state == WPA_DISCONNECTED || state == WPA_ASSOCIATING ||
state == WPA_ASSOCIATED) {
+ if (wpa_s->hostapd)
+ hostapd_stop(wpa_s);
wpa_s->new_connection = 1;
wpa_drv_set_operstate(wpa_s, 0);
#ifndef IEEE8021X_EAPOL
@@ -2276,6 +2328,8 @@ void wpa_supplicant_associate(struct wpa
return;
}
wpa_s->current_bss = bss;
+ if (wpa_s->hostapd)
+ hostapd_reload(wpa_s, wpa_s->current_bss);
#else /* CONFIG_MESH */
wpa_msg(wpa_s, MSG_ERROR,
"mesh mode support not included in the build");
@@ -6419,6 +6473,16 @@ static int wpa_supplicant_init_iface(str
sizeof(wpa_s->bridge_ifname));
}
+ if (iface->hostapd_ctrl) {
+ wpa_s->hostapd = wpa_ctrl_open(iface->hostapd_ctrl);
+ if (!wpa_s->hostapd) {
+ wpa_printf(MSG_ERROR, "\nFailed to connect to hostapd\n");
+ return -1;
+ }
+ if (hostapd_stop(wpa_s) < 0)
+ return -1;
+ }
+
/* RSNA Supplicant Key Management - INITIALIZE */
eapol_sm_notify_portEnabled(wpa_s->eapol, false);
eapol_sm_notify_portValid(wpa_s->eapol, false);
@@ -6756,6 +6820,11 @@ static void wpa_supplicant_deinit_iface(
if (terminate)
wpa_msg(wpa_s, MSG_INFO, WPA_EVENT_TERMINATING);
+ if (wpa_s->hostapd) {
+ wpa_ctrl_close(wpa_s->hostapd);
+ wpa_s->hostapd = NULL;
+ }
+
if (wpa_s->ctrl_iface) {
wpa_supplicant_ctrl_iface_deinit(wpa_s->ctrl_iface);
wpa_s->ctrl_iface = NULL;
Index: hostapd-2021-02-20-59e9794c/wpa_supplicant/wpa_supplicant_i.h
===================================================================
--- hostapd-2021-02-20-59e9794c.orig/wpa_supplicant/wpa_supplicant_i.h
+++ hostapd-2021-02-20-59e9794c/wpa_supplicant/wpa_supplicant_i.h
@@ -103,6 +103,11 @@ struct wpa_interface {
const char *ifname;
/**
+ * hostapd_ctrl - path to hostapd control socket for notification
+ */
+ const char *hostapd_ctrl;
+
+ /**
* bridge_ifname - Optional bridge interface name
*
* If the driver interface (ifname) is included in a Linux bridge
@@ -611,6 +616,8 @@ struct wpa_supplicant {
#endif /* CONFIG_CTRL_IFACE_BINDER */
char bridge_ifname[16];
+ struct wpa_ctrl *hostapd;
+
char *confname;
char *confanother;
Index: hostapd-2021-02-20-59e9794c/hostapd/ctrl_iface.c
===================================================================
--- hostapd-2021-02-20-59e9794c.orig/hostapd/ctrl_iface.c
+++ hostapd-2021-02-20-59e9794c/hostapd/ctrl_iface.c
@@ -2781,6 +2781,11 @@ static int hostapd_ctrl_iface_chan_switc
return 0;
}
+ if (os_strstr(pos, " auto-ht")) {
+ settings.freq_params.ht_enabled = iface->conf->ieee80211n;
+ settings.freq_params.vht_enabled = iface->conf->ieee80211ac;
+ }
+
for (i = 0; i < iface->num_bss; i++) {
/* Save CHAN_SWITCH VHT and HE config */
Index: hostapd-2021-02-20-59e9794c/src/ap/beacon.c
===================================================================
--- hostapd-2021-02-20-59e9794c.orig/src/ap/beacon.c
+++ hostapd-2021-02-20-59e9794c/src/ap/beacon.c
@@ -1753,11 +1753,6 @@ int ieee802_11_set_beacon(struct hostapd
struct wpabuf *beacon, *proberesp, *assocresp;
int res, ret = -1;
- if (hapd->csa_in_progress) {
- wpa_printf(MSG_ERROR, "Cannot set beacons during CSA period");
- return -1;
- }
-
hapd->beacon_set_done = 1;
if (ieee802_11_build_ap_params(hapd, &params) < 0)
Index: hostapd-2021-02-20-59e9794c/wpa_supplicant/events.c
===================================================================
--- hostapd-2021-02-20-59e9794c.orig/wpa_supplicant/events.c
+++ hostapd-2021-02-20-59e9794c/wpa_supplicant/events.c
@@ -4666,6 +4666,60 @@ static void wpas_event_unprot_beacon(str
}
+static void
+supplicant_ch_switch_started(struct wpa_supplicant *wpa_s,
+ union wpa_event_data *data)
+{
+ char buf[256];
+ size_t len = sizeof(buf);
+ char *cmd = NULL;
+ int width = 20;
+ int ret;
+
+ if (!wpa_s->hostapd)
+ return;
+
+ wpa_msg(wpa_s, MSG_INFO, WPA_EVENT_CHANNEL_SWITCH
+ "count=%d freq=%d ht_enabled=%d ch_offset=%d ch_width=%s cf1=%d cf2=%d",
+ data->ch_switch.count,
+ data->ch_switch.freq,
+ data->ch_switch.ht_enabled,
+ data->ch_switch.ch_offset,
+ channel_width_to_string(data->ch_switch.ch_width),
+ data->ch_switch.cf1,
+ data->ch_switch.cf2);
+
+ switch (data->ch_switch.ch_width) {
+ case CHAN_WIDTH_20_NOHT:
+ case CHAN_WIDTH_20:
+ width = 20;
+ break;
+ case CHAN_WIDTH_40:
+ width = 40;
+ break;
+ case CHAN_WIDTH_80:
+ width = 80;
+ break;
+ case CHAN_WIDTH_160:
+ case CHAN_WIDTH_80P80:
+ width = 160;
+ break;
+ }
+
+ asprintf(&cmd, "CHAN_SWITCH %d %d sec_channel_offset=%d center_freq1=%d center_freq2=%d, bandwidth=%d auto-ht\n",
+ data->ch_switch.count - 1,
+ data->ch_switch.freq,
+ data->ch_switch.ch_offset,
+ data->ch_switch.cf1,
+ data->ch_switch.cf2,
+ width);
+ ret = wpa_ctrl_request(wpa_s->hostapd, cmd, os_strlen(cmd), buf, &len, NULL);
+ free(cmd);
+
+ if (ret < 0)
+ wpa_printf(MSG_ERROR, "\nFailed to reload hostapd AP interfaces\n");
+}
+
void supplicant_event(void *ctx, enum wpa_event_type event,
union wpa_event_data *data)
{
@@ -4981,8 +5035,10 @@ void supplicant_event(void *ctx, enum wp
channel_width_to_string(data->ch_switch.ch_width),
data->ch_switch.cf1,
data->ch_switch.cf2);
- if (event == EVENT_CH_SWITCH_STARTED)
+ if (event == EVENT_CH_SWITCH_STARTED) {
+ supplicant_ch_switch_started(wpa_s, data);
break;
+ }
wpa_s->assoc_freq = data->ch_switch.freq;
wpa_s->current_ssid->frequency = data->ch_switch.freq;
Index: hostapd-2021-02-20-59e9794c/src/drivers/driver.h
===================================================================
--- hostapd-2021-02-20-59e9794c.orig/src/drivers/driver.h
+++ hostapd-2021-02-20-59e9794c/src/drivers/driver.h
@@ -5822,6 +5822,7 @@ union wpa_event_data {
/**
* struct ch_switch
+ * @count: Count until channel switch activates
* @freq: Frequency of new channel in MHz
* @ht_enabled: Whether this is an HT channel
* @ch_offset: Secondary channel offset
@@ -5830,6 +5831,7 @@ union wpa_event_data {
* @cf2: Center frequency 2
*/
struct ch_switch {
+ int count;
int freq;
int ht_enabled;
int ch_offset;
Index: hostapd-2021-02-20-59e9794c/src/drivers/driver_nl80211_event.c
===================================================================
--- hostapd-2021-02-20-59e9794c.orig/src/drivers/driver_nl80211_event.c
+++ hostapd-2021-02-20-59e9794c/src/drivers/driver_nl80211_event.c
@@ -655,7 +655,7 @@ static void mlme_event_ch_switch(struct
struct nlattr *ifindex, struct nlattr *freq,
struct nlattr *type, struct nlattr *bw,
struct nlattr *cf1, struct nlattr *cf2,
- int finished)
+ struct nlattr *count, int finished)
{
struct i802_bss *bss;
union wpa_event_data data;
@@ -714,6 +714,8 @@ static void mlme_event_ch_switch(struct
data.ch_switch.cf1 = nla_get_u32(cf1);
if (cf2)
data.ch_switch.cf2 = nla_get_u32(cf2);
+ if (count)
+ data.ch_switch.count = nla_get_u32(count);
if (finished)
bss->freq = data.ch_switch.freq;
@@ -2886,6 +2888,7 @@ static void do_process_drv_event(struct
tb[NL80211_ATTR_CHANNEL_WIDTH],
tb[NL80211_ATTR_CENTER_FREQ1],
tb[NL80211_ATTR_CENTER_FREQ2],
+ tb[NL80211_ATTR_CH_SWITCH_COUNT],
0);
break;
case NL80211_CMD_CH_SWITCH_NOTIFY:
@@ -2896,6 +2899,7 @@ static void do_process_drv_event(struct
tb[NL80211_ATTR_CHANNEL_WIDTH],
tb[NL80211_ATTR_CENTER_FREQ1],
tb[NL80211_ATTR_CENTER_FREQ2],
+ NULL,
1);
break;
case NL80211_CMD_DISCONNECT:

View File

@@ -12,7 +12,7 @@
else else
--- a/hostapd/ctrl_iface.c --- a/hostapd/ctrl_iface.c
+++ b/hostapd/ctrl_iface.c +++ b/hostapd/ctrl_iface.c
@@ -3569,6 +3569,7 @@ static int hostapd_ctrl_iface_receive_pr @@ -3388,6 +3388,7 @@ static int hostapd_ctrl_iface_receive_pr
reply_size); reply_size);
} else if (os_strcmp(buf, "STATUS-DRIVER") == 0) { } else if (os_strcmp(buf, "STATUS-DRIVER") == 0) {
reply_len = hostapd_drv_status(hapd, reply, reply_size); reply_len = hostapd_drv_status(hapd, reply, reply_size);
@@ -20,7 +20,7 @@
} else if (os_strcmp(buf, "MIB") == 0) { } else if (os_strcmp(buf, "MIB") == 0) {
reply_len = ieee802_11_get_mib(hapd, reply, reply_size); reply_len = ieee802_11_get_mib(hapd, reply, reply_size);
if (reply_len >= 0) { if (reply_len >= 0) {
@@ -3610,6 +3611,7 @@ static int hostapd_ctrl_iface_receive_pr @@ -3429,6 +3430,7 @@ static int hostapd_ctrl_iface_receive_pr
} else if (os_strncmp(buf, "STA-NEXT ", 9) == 0) { } else if (os_strncmp(buf, "STA-NEXT ", 9) == 0) {
reply_len = hostapd_ctrl_iface_sta_next(hapd, buf + 9, reply, reply_len = hostapd_ctrl_iface_sta_next(hapd, buf + 9, reply,
reply_size); reply_size);
@@ -30,7 +30,7 @@
reply_len = -1; reply_len = -1;
--- a/wpa_supplicant/Makefile --- a/wpa_supplicant/Makefile
+++ b/wpa_supplicant/Makefile +++ b/wpa_supplicant/Makefile
@@ -955,6 +955,9 @@ ifdef CONFIG_FILS @@ -942,6 +942,9 @@ ifdef CONFIG_FILS
OBJS += ../src/ap/fils_hlp.o OBJS += ../src/ap/fils_hlp.o
endif endif
ifdef CONFIG_CTRL_IFACE ifdef CONFIG_CTRL_IFACE
@@ -42,7 +42,7 @@
--- a/wpa_supplicant/ctrl_iface.c --- a/wpa_supplicant/ctrl_iface.c
+++ b/wpa_supplicant/ctrl_iface.c +++ b/wpa_supplicant/ctrl_iface.c
@@ -2308,7 +2308,7 @@ static int wpa_supplicant_ctrl_iface_sta @@ -2294,7 +2294,7 @@ static int wpa_supplicant_ctrl_iface_sta
pos += ret; pos += ret;
} }
@@ -51,7 +51,7 @@
if (wpa_s->ap_iface) { if (wpa_s->ap_iface) {
pos += ap_ctrl_iface_wpa_get_status(wpa_s, pos, pos += ap_ctrl_iface_wpa_get_status(wpa_s, pos,
end - pos, end - pos,
@@ -10919,6 +10919,7 @@ char * wpa_supplicant_ctrl_iface_process @@ -10602,6 +10602,7 @@ char * wpa_supplicant_ctrl_iface_process
reply_len = -1; reply_len = -1;
} else if (os_strncmp(buf, "NOTE ", 5) == 0) { } else if (os_strncmp(buf, "NOTE ", 5) == 0) {
wpa_printf(MSG_INFO, "NOTE: %s", buf + 5); wpa_printf(MSG_INFO, "NOTE: %s", buf + 5);
@@ -59,7 +59,7 @@
} else if (os_strcmp(buf, "MIB") == 0) { } else if (os_strcmp(buf, "MIB") == 0) {
reply_len = wpa_sm_get_mib(wpa_s->wpa, reply, reply_size); reply_len = wpa_sm_get_mib(wpa_s->wpa, reply, reply_size);
if (reply_len >= 0) { if (reply_len >= 0) {
@@ -10931,6 +10932,7 @@ char * wpa_supplicant_ctrl_iface_process @@ -10614,6 +10615,7 @@ char * wpa_supplicant_ctrl_iface_process
reply_size - reply_len); reply_size - reply_len);
#endif /* CONFIG_MACSEC */ #endif /* CONFIG_MACSEC */
} }
@@ -67,7 +67,7 @@
} else if (os_strncmp(buf, "STATUS", 6) == 0) { } else if (os_strncmp(buf, "STATUS", 6) == 0) {
reply_len = wpa_supplicant_ctrl_iface_status( reply_len = wpa_supplicant_ctrl_iface_status(
wpa_s, buf + 6, reply, reply_size); wpa_s, buf + 6, reply, reply_size);
@@ -11419,6 +11421,7 @@ char * wpa_supplicant_ctrl_iface_process @@ -11102,6 +11104,7 @@ char * wpa_supplicant_ctrl_iface_process
reply_len = wpa_supplicant_ctrl_iface_bss( reply_len = wpa_supplicant_ctrl_iface_bss(
wpa_s, buf + 4, reply, reply_size); wpa_s, buf + 4, reply, reply_size);
#ifdef CONFIG_AP #ifdef CONFIG_AP
@@ -75,7 +75,7 @@
} else if (os_strcmp(buf, "STA-FIRST") == 0) { } else if (os_strcmp(buf, "STA-FIRST") == 0) {
reply_len = ap_ctrl_iface_sta_first(wpa_s, reply, reply_size); reply_len = ap_ctrl_iface_sta_first(wpa_s, reply, reply_size);
} else if (os_strncmp(buf, "STA ", 4) == 0) { } else if (os_strncmp(buf, "STA ", 4) == 0) {
@@ -11427,12 +11430,15 @@ char * wpa_supplicant_ctrl_iface_process @@ -11110,12 +11113,15 @@ char * wpa_supplicant_ctrl_iface_process
} else if (os_strncmp(buf, "STA-NEXT ", 9) == 0) { } else if (os_strncmp(buf, "STA-NEXT ", 9) == 0) {
reply_len = ap_ctrl_iface_sta_next(wpa_s, buf + 9, reply, reply_len = ap_ctrl_iface_sta_next(wpa_s, buf + 9, reply,
reply_size); reply_size);
@@ -144,7 +144,7 @@
static void ieee802_1x_wnm_notif_send(void *eloop_ctx, void *timeout_ctx) static void ieee802_1x_wnm_notif_send(void *eloop_ctx, void *timeout_ctx)
--- a/src/ap/wpa_auth.c --- a/src/ap/wpa_auth.c
+++ b/src/ap/wpa_auth.c +++ b/src/ap/wpa_auth.c
@@ -4519,6 +4519,7 @@ static const char * wpa_bool_txt(int val @@ -4503,6 +4503,7 @@ static const char * wpa_bool_txt(int val
return val ? "TRUE" : "FALSE"; return val ? "TRUE" : "FALSE";
} }
@@ -152,7 +152,7 @@
#define RSN_SUITE "%02x-%02x-%02x-%d" #define RSN_SUITE "%02x-%02x-%02x-%d"
#define RSN_SUITE_ARG(s) \ #define RSN_SUITE_ARG(s) \
@@ -4669,7 +4670,7 @@ int wpa_get_mib_sta(struct wpa_state_mac @@ -4653,7 +4654,7 @@ int wpa_get_mib_sta(struct wpa_state_mac
return len; return len;
} }
@@ -163,7 +163,7 @@
{ {
--- a/src/rsn_supp/wpa.c --- a/src/rsn_supp/wpa.c
+++ b/src/rsn_supp/wpa.c +++ b/src/rsn_supp/wpa.c
@@ -2767,6 +2767,8 @@ static u32 wpa_key_mgmt_suite(struct wpa @@ -2763,6 +2763,8 @@ static u32 wpa_key_mgmt_suite(struct wpa
} }
@@ -172,7 +172,7 @@
#define RSN_SUITE "%02x-%02x-%02x-%d" #define RSN_SUITE "%02x-%02x-%02x-%d"
#define RSN_SUITE_ARG(s) \ #define RSN_SUITE_ARG(s) \
((s) >> 24) & 0xff, ((s) >> 16) & 0xff, ((s) >> 8) & 0xff, (s) & 0xff ((s) >> 24) & 0xff, ((s) >> 16) & 0xff, ((s) >> 8) & 0xff, (s) & 0xff
@@ -2848,6 +2850,7 @@ int wpa_sm_get_mib(struct wpa_sm *sm, ch @@ -2844,6 +2846,7 @@ int wpa_sm_get_mib(struct wpa_sm *sm, ch
return (int) len; return (int) len;
} }

View File

@@ -36,16 +36,16 @@
#include "fst/fst.h" #include "fst/fst.h"
#include "wpa_supplicant_i.h" #include "wpa_supplicant_i.h"
#include "driver_i.h" #include "driver_i.h"
@@ -202,7 +203,7 @@ int main(int argc, char *argv[]) @@ -201,7 +202,7 @@ int main(int argc, char *argv[])
for (;;) { for (;;) {
c = getopt(argc, argv, c = getopt(argc, argv,
- "b:Bc:C:D:de:f:g:G:hH:i:I:KLMm:No:O:p:P:qsTtuvW"); - "b:Bc:C:D:de:f:g:G:hi:I:KLMm:No:O:p:P:qsTtuvW");
+ "b:Bc:C:D:de:f:g:G:hH:i:I:KLMm:No:O:p:P:qsTtuv::W"); + "b:Bc:C:D:de:f:g:G:hi:I:KLMm:No:O:p:P:qsTtuv::W");
if (c < 0) if (c < 0)
break; break;
switch (c) { switch (c) {
@@ -305,8 +306,12 @@ int main(int argc, char *argv[]) @@ -301,8 +302,12 @@ int main(int argc, char *argv[])
break; break;
#endif /* CONFIG_CTRL_IFACE_DBUS_NEW */ #endif /* CONFIG_CTRL_IFACE_DBUS_NEW */
case 'v': case 'v':

View File

@@ -32,7 +32,7 @@
static int hostapd_cli_cmd_disassoc_imminent(struct wpa_ctrl *ctrl, int argc, static int hostapd_cli_cmd_disassoc_imminent(struct wpa_ctrl *ctrl, int argc,
@@ -1579,13 +1575,10 @@ static const struct hostapd_cli_cmd host @@ -1571,13 +1567,10 @@ static const struct hostapd_cli_cmd host
{ "disassociate", hostapd_cli_cmd_disassociate, { "disassociate", hostapd_cli_cmd_disassociate,
hostapd_complete_stations, hostapd_complete_stations,
"<addr> = disassociate a station" }, "<addr> = disassociate a station" },
@@ -46,7 +46,7 @@
{ "wps_pin", hostapd_cli_cmd_wps_pin, NULL, { "wps_pin", hostapd_cli_cmd_wps_pin, NULL,
"<uuid> <pin> [timeout] [addr] = add WPS Enrollee PIN" }, "<uuid> <pin> [timeout] [addr] = add WPS Enrollee PIN" },
{ "wps_check_pin", hostapd_cli_cmd_wps_check_pin, NULL, { "wps_check_pin", hostapd_cli_cmd_wps_check_pin, NULL,
@@ -1610,7 +1603,6 @@ static const struct hostapd_cli_cmd host @@ -1602,7 +1595,6 @@ static const struct hostapd_cli_cmd host
"<SSID> <auth> <encr> <key> = configure AP" }, "<SSID> <auth> <encr> <key> = configure AP" },
{ "wps_get_status", hostapd_cli_cmd_wps_get_status, NULL, { "wps_get_status", hostapd_cli_cmd_wps_get_status, NULL,
"= show current WPS status" }, "= show current WPS status" },

View File

@@ -1,73 +0,0 @@
--- a/hostapd/main.c
+++ b/hostapd/main.c
@@ -39,6 +39,8 @@ struct hapd_global {
};
static struct hapd_global global;
+static int daemonize = 0;
+static char *pid_file = NULL;
#ifndef CONFIG_NO_HOSTAPD_LOGGER
@@ -146,6 +148,14 @@ static void hostapd_logger_cb(void *ctx,
}
#endif /* CONFIG_NO_HOSTAPD_LOGGER */
+static void hostapd_setup_complete_cb(void *ctx)
+{
+ if (daemonize && os_daemonize(pid_file)) {
+ perror("daemon");
+ return;
+ }
+ daemonize = 0;
+}
/**
* hostapd_driver_init - Preparate driver interface
@@ -164,6 +174,8 @@ static int hostapd_driver_init(struct ho
return -1;
}
+ hapd->setup_complete_cb = hostapd_setup_complete_cb;
+
/* Initialize the driver interface */
if (!(b[0] | b[1] | b[2] | b[3] | b[4] | b[5]))
b = NULL;
@@ -404,8 +416,6 @@ static void hostapd_global_deinit(const
#endif /* CONFIG_NATIVE_WINDOWS */
eap_server_unregister_methods();
-
- os_daemonize_terminate(pid_file);
}
@@ -431,18 +441,6 @@ static int hostapd_global_run(struct hap
}
#endif /* EAP_SERVER_TNC */
- if (daemonize) {
- if (os_daemonize(pid_file)) {
- wpa_printf(MSG_ERROR, "daemon: %s", strerror(errno));
- return -1;
- }
- if (eloop_sock_requeue()) {
- wpa_printf(MSG_ERROR, "eloop_sock_requeue: %s",
- strerror(errno));
- return -1;
- }
- }
-
eloop_run();
return 0;
@@ -645,8 +643,7 @@ int main(int argc, char *argv[])
struct hapd_interfaces interfaces;
int ret = 1;
size_t i, j;
- int c, debug = 0, daemonize = 0;
- char *pid_file = NULL;
+ int c, debug = 0;
const char *log_file = NULL;
const char *entropy_file = NULL;
char **bss_config = NULL, **tmp_bss;

View File

@@ -174,7 +174,7 @@ Signed-hostap: Antonio Quartulli <ordex@autistici.org>
* macsec_policy - Determines the policy for MACsec secure session * macsec_policy - Determines the policy for MACsec secure session
--- a/wpa_supplicant/wpa_supplicant.c --- a/wpa_supplicant/wpa_supplicant.c
+++ b/wpa_supplicant/wpa_supplicant.c +++ b/wpa_supplicant/wpa_supplicant.c
@@ -3726,6 +3726,12 @@ static void wpas_start_assoc_cb(struct w @@ -3673,6 +3673,12 @@ static void wpas_start_assoc_cb(struct w
params.beacon_int = ssid->beacon_int; params.beacon_int = ssid->beacon_int;
else else
params.beacon_int = wpa_s->conf->beacon_int; params.beacon_int = wpa_s->conf->beacon_int;

View File

@@ -10,7 +10,7 @@ Signed-hostap: Antonio Quartulli <ordex@autistici.org>
--- a/src/drivers/driver_nl80211.c --- a/src/drivers/driver_nl80211.c
+++ b/src/drivers/driver_nl80211.c +++ b/src/drivers/driver_nl80211.c
@@ -5951,7 +5951,7 @@ static int wpa_driver_nl80211_ibss(struc @@ -5886,7 +5886,7 @@ static int wpa_driver_nl80211_ibss(struc
struct wpa_driver_associate_params *params) struct wpa_driver_associate_params *params)
{ {
struct nl_msg *msg; struct nl_msg *msg;
@@ -19,7 +19,7 @@ Signed-hostap: Antonio Quartulli <ordex@autistici.org>
int count = 0; int count = 0;
wpa_printf(MSG_DEBUG, "nl80211: Join IBSS (ifindex=%d)", drv->ifindex); wpa_printf(MSG_DEBUG, "nl80211: Join IBSS (ifindex=%d)", drv->ifindex);
@@ -5978,6 +5978,37 @@ retry: @@ -5913,6 +5913,37 @@ retry:
nl80211_put_beacon_int(msg, params->beacon_int)) nl80211_put_beacon_int(msg, params->beacon_int))
goto fail; goto fail;

View File

@@ -29,7 +29,7 @@ Tested-by: Simon Wunderlich <simon.wunderlich@openmesh.com>
struct wpa_driver_set_key_params { struct wpa_driver_set_key_params {
--- a/src/drivers/driver_nl80211.c --- a/src/drivers/driver_nl80211.c
+++ b/src/drivers/driver_nl80211.c +++ b/src/drivers/driver_nl80211.c
@@ -10476,6 +10476,18 @@ static int nl80211_put_mesh_id(struct nl @@ -10398,6 +10398,18 @@ static int nl80211_put_mesh_id(struct nl
} }
@@ -48,7 +48,7 @@ Tested-by: Simon Wunderlich <simon.wunderlich@openmesh.com>
static int nl80211_put_mesh_config(struct nl_msg *msg, static int nl80211_put_mesh_config(struct nl_msg *msg,
struct wpa_driver_mesh_bss_params *params) struct wpa_driver_mesh_bss_params *params)
{ {
@@ -10537,6 +10549,7 @@ static int nl80211_join_mesh(struct i802 @@ -10459,6 +10471,7 @@ static int nl80211_join_mesh(struct i802
nl80211_put_basic_rates(msg, params->basic_rates) || nl80211_put_basic_rates(msg, params->basic_rates) ||
nl80211_put_mesh_id(msg, params->meshid, params->meshid_len) || nl80211_put_mesh_id(msg, params->meshid, params->meshid_len) ||
nl80211_put_beacon_int(msg, params->beacon_int) || nl80211_put_beacon_int(msg, params->beacon_int) ||

View File

@@ -1,6 +1,6 @@
--- a/wpa_supplicant/wpa_supplicant.c --- a/wpa_supplicant/wpa_supplicant.c
+++ b/wpa_supplicant/wpa_supplicant.c +++ b/wpa_supplicant/wpa_supplicant.c
@@ -2457,11 +2457,13 @@ void ibss_mesh_setup_freq(struct wpa_sup @@ -2403,11 +2403,13 @@ void ibss_mesh_setup_freq(struct wpa_sup
for (j = 0; j < wpa_s->last_scan_res_used; j++) { for (j = 0; j < wpa_s->last_scan_res_used; j++) {
struct wpa_bss *bss = wpa_s->last_scan_res[j]; struct wpa_bss *bss = wpa_s->last_scan_res[j];

View File

@@ -20,7 +20,7 @@
total = survey->channel_time; total = survey->channel_time;
@@ -422,20 +416,19 @@ static int acs_usable_bw160_chan(const s @@ -415,20 +409,19 @@ static int acs_usable_vht160_chan(const
static int acs_survey_is_sufficient(struct freq_survey *survey) static int acs_survey_is_sufficient(struct freq_survey *survey)
{ {
if (!(survey->filled & SURVEY_HAS_NF)) { if (!(survey->filled & SURVEY_HAS_NF)) {

View File

@@ -20,7 +20,7 @@
NOBJS = nt_password_hash.o ../src/crypto/ms_funcs.o $(SHA1OBJS) NOBJS = nt_password_hash.o ../src/crypto/ms_funcs.o $(SHA1OBJS)
--- a/wpa_supplicant/Makefile --- a/wpa_supplicant/Makefile
+++ b/wpa_supplicant/Makefile +++ b/wpa_supplicant/Makefile
@@ -1918,31 +1918,31 @@ wpa_supplicant_multi.a: .config $(BCHECK @@ -1905,31 +1905,31 @@ wpa_supplicant_multi.a: .config $(BCHECK
@$(AR) cr $@ wpa_supplicant_multi.o $(OBJS) @$(AR) cr $@ wpa_supplicant_multi.o $(OBJS)
wpa_supplicant: $(BCHECK) $(OBJS) $(EXTRA_progs) wpa_supplicant: $(BCHECK) $(OBJS) $(EXTRA_progs)

View File

@@ -19,7 +19,7 @@ Signed-off-by: David Bauer <mail@david-bauer.net>
--- a/hostapd/ctrl_iface.c --- a/hostapd/ctrl_iface.c
+++ b/hostapd/ctrl_iface.c +++ b/hostapd/ctrl_iface.c
@@ -897,7 +897,7 @@ static int hostapd_ctrl_iface_bss_tm_req @@ -840,7 +840,7 @@ static int hostapd_ctrl_iface_bss_tm_req
const char *pos, *end; const char *pos, *end;
int disassoc_timer = 0; int disassoc_timer = 0;
struct sta_info *sta; struct sta_info *sta;
@@ -28,7 +28,7 @@ Signed-off-by: David Bauer <mail@david-bauer.net>
u8 bss_term_dur[12]; u8 bss_term_dur[12];
char *url = NULL; char *url = NULL;
int ret; int ret;
@@ -935,6 +935,12 @@ static int hostapd_ctrl_iface_bss_tm_req @@ -878,6 +878,12 @@ static int hostapd_ctrl_iface_bss_tm_req
valid_int = atoi(pos); valid_int = atoi(pos);
} }
@@ -41,7 +41,7 @@ Signed-off-by: David Bauer <mail@david-bauer.net>
pos = os_strstr(cmd, " bss_term="); pos = os_strstr(cmd, " bss_term=");
if (pos) { if (pos) {
pos += 10; pos += 10;
@@ -1041,7 +1047,7 @@ static int hostapd_ctrl_iface_bss_tm_req @@ -984,7 +990,7 @@ static int hostapd_ctrl_iface_bss_tm_req
#endif /* CONFIG_MBO */ #endif /* CONFIG_MBO */
ret = wnm_send_bss_tm_req(hapd, sta, req_mode, disassoc_timer, ret = wnm_send_bss_tm_req(hapd, sta, req_mode, disassoc_timer,

View File

@@ -1,6 +1,6 @@
--- a/src/ap/hostapd.h --- a/src/ap/hostapd.h
+++ b/src/ap/hostapd.h +++ b/src/ap/hostapd.h
@@ -150,6 +150,21 @@ struct hostapd_sae_commit_queue { @@ -148,6 +148,21 @@ struct hostapd_sae_commit_queue {
}; };
/** /**
@@ -22,7 +22,7 @@
* struct hostapd_data - hostapd per-BSS data structure * struct hostapd_data - hostapd per-BSS data structure
*/ */
struct hostapd_data { struct hostapd_data {
@@ -163,6 +178,9 @@ struct hostapd_data { @@ -161,6 +176,9 @@ struct hostapd_data {
u8 own_addr[ETH_ALEN]; u8 own_addr[ETH_ALEN];
@@ -71,7 +71,7 @@
if (disassoc_timer) { if (disassoc_timer) {
/* send disassociation frame after time-out */ /* send disassociation frame after time-out */
set_disassoc_timer(hapd, sta, disassoc_timer); set_disassoc_timer(hapd, sta, disassoc_timer);
@@ -857,6 +862,7 @@ int wnm_send_bss_tm_req(struct hostapd_d @@ -856,6 +861,7 @@ int wnm_send_bss_tm_req(struct hostapd_d
} }
os_free(buf); os_free(buf);

View File

@@ -41,7 +41,7 @@
struct hostapd_iface * hostapd_alloc_iface(void); struct hostapd_iface * hostapd_alloc_iface(void);
--- a/src/ap/hostapd.c --- a/src/ap/hostapd.c
+++ b/src/ap/hostapd.c +++ b/src/ap/hostapd.c
@@ -395,6 +395,7 @@ void hostapd_free_hapd_data(struct hosta @@ -376,6 +376,7 @@ void hostapd_free_hapd_data(struct hosta
hapd->beacon_set_done = 0; hapd->beacon_set_done = 0;
wpa_printf(MSG_DEBUG, "%s(%s)", __func__, hapd->conf->iface); wpa_printf(MSG_DEBUG, "%s(%s)", __func__, hapd->conf->iface);
@@ -49,7 +49,7 @@
accounting_deinit(hapd); accounting_deinit(hapd);
hostapd_deinit_wpa(hapd); hostapd_deinit_wpa(hapd);
vlan_deinit(hapd); vlan_deinit(hapd);
@@ -1417,6 +1418,8 @@ static int hostapd_setup_bss(struct host @@ -1398,6 +1399,8 @@ static int hostapd_setup_bss(struct host
if (hapd->driver && hapd->driver->set_operstate) if (hapd->driver && hapd->driver->set_operstate)
hapd->driver->set_operstate(hapd->drv_priv, 1); hapd->driver->set_operstate(hapd->drv_priv, 1);
@@ -58,7 +58,7 @@
return 0; return 0;
} }
@@ -2002,6 +2005,7 @@ static int hostapd_setup_interface_compl @@ -1983,6 +1986,7 @@ static int hostapd_setup_interface_compl
if (err) if (err)
goto fail; goto fail;
@@ -66,7 +66,7 @@
wpa_printf(MSG_DEBUG, "Completing interface initialization"); wpa_printf(MSG_DEBUG, "Completing interface initialization");
if (iface->freq) { if (iface->freq) {
#ifdef NEED_AP_MLME #ifdef NEED_AP_MLME
@@ -2199,6 +2203,7 @@ dfs_offload: @@ -2180,6 +2184,7 @@ dfs_offload:
fail: fail:
wpa_printf(MSG_ERROR, "Interface initialization failed"); wpa_printf(MSG_ERROR, "Interface initialization failed");
@@ -74,7 +74,7 @@
hostapd_set_state(iface, HAPD_IFACE_DISABLED); hostapd_set_state(iface, HAPD_IFACE_DISABLED);
wpa_msg(hapd->msg_ctx, MSG_INFO, AP_EVENT_DISABLED); wpa_msg(hapd->msg_ctx, MSG_INFO, AP_EVENT_DISABLED);
#ifdef CONFIG_FST #ifdef CONFIG_FST
@@ -2672,6 +2677,7 @@ void hostapd_interface_deinit_free(struc @@ -2653,6 +2658,7 @@ void hostapd_interface_deinit_free(struc
(unsigned int) iface->conf->num_bss); (unsigned int) iface->conf->num_bss);
driver = iface->bss[0]->driver; driver = iface->bss[0]->driver;
drv_priv = iface->bss[0]->drv_priv; drv_priv = iface->bss[0]->drv_priv;
@@ -316,7 +316,7 @@
--- a/wpa_supplicant/Makefile --- a/wpa_supplicant/Makefile
+++ b/wpa_supplicant/Makefile +++ b/wpa_supplicant/Makefile
@@ -171,6 +171,13 @@ ifdef CONFIG_EAPOL_TEST @@ -169,6 +169,13 @@ ifdef CONFIG_EAPOL_TEST
CFLAGS += -Werror -DEAPOL_TEST CFLAGS += -Werror -DEAPOL_TEST
endif endif
@@ -330,7 +330,7 @@
ifdef CONFIG_CODE_COVERAGE ifdef CONFIG_CODE_COVERAGE
CFLAGS += -O0 -fprofile-arcs -ftest-coverage CFLAGS += -O0 -fprofile-arcs -ftest-coverage
LIBS += -lgcov LIBS += -lgcov
@@ -948,6 +955,9 @@ ifdef CONFIG_CTRL_IFACE_MIB @@ -946,6 +953,9 @@ ifdef CONFIG_CTRL_IFACE_MIB
CFLAGS += -DCONFIG_CTRL_IFACE_MIB CFLAGS += -DCONFIG_CTRL_IFACE_MIB
endif endif
OBJS += ../src/ap/ctrl_iface_ap.o OBJS += ../src/ap/ctrl_iface_ap.o
@@ -342,7 +342,7 @@
CFLAGS += -DEAP_SERVER -DEAP_SERVER_IDENTITY CFLAGS += -DEAP_SERVER -DEAP_SERVER_IDENTITY
--- a/wpa_supplicant/wpa_supplicant.c --- a/wpa_supplicant/wpa_supplicant.c
+++ b/wpa_supplicant/wpa_supplicant.c +++ b/wpa_supplicant/wpa_supplicant.c
@@ -7012,6 +7012,8 @@ struct wpa_supplicant * wpa_supplicant_a @@ -6943,6 +6943,8 @@ struct wpa_supplicant * wpa_supplicant_a
} }
#endif /* CONFIG_P2P */ #endif /* CONFIG_P2P */
@@ -351,7 +351,7 @@
return wpa_s; return wpa_s;
} }
@@ -7038,6 +7040,8 @@ int wpa_supplicant_remove_iface(struct w @@ -6969,6 +6971,8 @@ int wpa_supplicant_remove_iface(struct w
struct wpa_supplicant *parent = wpa_s->parent; struct wpa_supplicant *parent = wpa_s->parent;
#endif /* CONFIG_MESH */ #endif /* CONFIG_MESH */
@@ -360,7 +360,7 @@
/* Remove interface from the global list of interfaces */ /* Remove interface from the global list of interfaces */
prev = global->ifaces; prev = global->ifaces;
if (prev == wpa_s) { if (prev == wpa_s) {
@@ -7341,8 +7345,12 @@ int wpa_supplicant_run(struct wpa_global @@ -7272,8 +7276,12 @@ int wpa_supplicant_run(struct wpa_global
eloop_register_signal_terminate(wpa_supplicant_terminate, global); eloop_register_signal_terminate(wpa_supplicant_terminate, global);
eloop_register_signal_reconfig(wpa_supplicant_reconfig, global); eloop_register_signal_reconfig(wpa_supplicant_reconfig, global);
@@ -383,7 +383,7 @@
extern const char *const wpa_supplicant_version; extern const char *const wpa_supplicant_version;
extern const char *const wpa_supplicant_license; extern const char *const wpa_supplicant_license;
@@ -321,6 +322,8 @@ struct wpa_global { @@ -316,6 +317,8 @@ struct wpa_global {
#endif /* CONFIG_WIFI_DISPLAY */ #endif /* CONFIG_WIFI_DISPLAY */
struct psk_list_entry *add_psk; /* From group formation */ struct psk_list_entry *add_psk; /* From group formation */
@@ -392,7 +392,7 @@
}; };
@@ -601,6 +604,7 @@ struct wpa_supplicant { @@ -596,6 +599,7 @@ struct wpa_supplicant {
unsigned char own_addr[ETH_ALEN]; unsigned char own_addr[ETH_ALEN];
unsigned char perm_addr[ETH_ALEN]; unsigned char perm_addr[ETH_ALEN];
char ifname[100]; char ifname[100];
@@ -421,16 +421,16 @@
--- a/wpa_supplicant/main.c --- a/wpa_supplicant/main.c
+++ b/wpa_supplicant/main.c +++ b/wpa_supplicant/main.c
@@ -203,7 +203,7 @@ int main(int argc, char *argv[]) @@ -202,7 +202,7 @@ int main(int argc, char *argv[])
for (;;) { for (;;) {
c = getopt(argc, argv, c = getopt(argc, argv,
- "b:Bc:C:D:de:f:g:G:hH:i:I:KLMm:No:O:p:P:qsTtuv::W"); - "b:Bc:C:D:de:f:g:G:hi:I:KLMm:No:O:p:P:qsTtuv::W");
+ "b:Bc:C:D:de:f:g:G:hH:i:I:KLMm:nNo:O:p:P:qsTtuv::W"); + "b:Bc:C:D:de:f:g:G:hi:I:KLMm:nNo:O:p:P:qsTtuv::W");
if (c < 0) if (c < 0)
break; break;
switch (c) { switch (c) {
@@ -271,6 +271,9 @@ int main(int argc, char *argv[]) @@ -267,6 +267,9 @@ int main(int argc, char *argv[])
params.conf_p2p_dev = optarg; params.conf_p2p_dev = optarg;
break; break;
#endif /* CONFIG_P2P */ #endif /* CONFIG_P2P */

View File

@@ -26,7 +26,7 @@
ifdef CONFIG_CODE_COVERAGE ifdef CONFIG_CODE_COVERAGE
--- a/hostapd/main.c --- a/hostapd/main.c
+++ b/hostapd/main.c +++ b/hostapd/main.c
@@ -895,6 +895,7 @@ int main(int argc, char *argv[]) @@ -898,6 +898,7 @@ int main(int argc, char *argv[])
} }
hostapd_global_ctrl_iface_init(&interfaces); hostapd_global_ctrl_iface_init(&interfaces);
@@ -34,7 +34,7 @@
if (hostapd_global_run(&interfaces, daemonize, pid_file)) { if (hostapd_global_run(&interfaces, daemonize, pid_file)) {
wpa_printf(MSG_ERROR, "Failed to start eloop"); wpa_printf(MSG_ERROR, "Failed to start eloop");
@@ -904,6 +905,7 @@ int main(int argc, char *argv[]) @@ -907,6 +908,7 @@ int main(int argc, char *argv[])
ret = 0; ret = 0;
out: out:
@@ -79,18 +79,27 @@
void *owner; void *owner;
char *config_fname; char *config_fname;
struct hostapd_config *conf; struct hostapd_config *conf;
@@ -637,6 +644,8 @@ struct hostapd_iface * hostapd_init(stru
struct hostapd_iface *
hostapd_interface_init_bss(struct hapd_interfaces *interfaces, const char *phy,
const char *config_fname, int debug);
+int hostapd_setup_bss(struct hostapd_data *hapd, int first, bool start_beacon);
+void hostapd_bss_deinit(struct hostapd_data *hapd);
void hostapd_new_assoc_sta(struct hostapd_data *hapd, struct sta_info *sta,
int reassoc);
void hostapd_interface_deinit_free(struct hostapd_iface *iface);
--- a/src/ap/hostapd.c --- a/src/ap/hostapd.c
+++ b/src/ap/hostapd.c +++ b/src/ap/hostapd.c
@@ -239,6 +239,8 @@ int hostapd_reload_config(struct hostapd @@ -216,6 +216,8 @@ int hostapd_reload_config(struct hostapd
struct hostapd_config *newconf, *oldconf;
size_t j; size_t j;
int i;
+ hostapd_ucode_reload_bss(hapd, reconf); + hostapd_ucode_reload_bss(hapd);
+ +
if (iface->config_fname == NULL) { if (iface->config_fname == NULL) {
/* Only in-memory config in use - assume it has been updated */ /* Only in-memory config in use - assume it has been updated */
hostapd_clear_old(iface); hostapd_clear_old(iface);
@@ -395,6 +397,7 @@ void hostapd_free_hapd_data(struct hosta @@ -376,6 +378,7 @@ void hostapd_free_hapd_data(struct hosta
hapd->beacon_set_done = 0; hapd->beacon_set_done = 0;
wpa_printf(MSG_DEBUG, "%s(%s)", __func__, hapd->conf->iface); wpa_printf(MSG_DEBUG, "%s(%s)", __func__, hapd->conf->iface);
@@ -98,7 +107,7 @@
hostapd_ubus_free_bss(hapd); hostapd_ubus_free_bss(hapd);
accounting_deinit(hapd); accounting_deinit(hapd);
hostapd_deinit_wpa(hapd); hostapd_deinit_wpa(hapd);
@@ -549,6 +552,7 @@ void hostapd_cleanup_iface_partial(struc @@ -530,6 +533,7 @@ void hostapd_cleanup_iface_partial(struc
static void hostapd_cleanup_iface(struct hostapd_iface *iface) static void hostapd_cleanup_iface(struct hostapd_iface *iface)
{ {
wpa_printf(MSG_DEBUG, "%s(%p)", __func__, iface); wpa_printf(MSG_DEBUG, "%s(%p)", __func__, iface);
@@ -106,7 +115,16 @@
eloop_cancel_timeout(channel_list_update_timeout, iface, NULL); eloop_cancel_timeout(channel_list_update_timeout, iface, NULL);
eloop_cancel_timeout(hostapd_interface_setup_failure_handler, iface, eloop_cancel_timeout(hostapd_interface_setup_failure_handler, iface,
NULL); NULL);
@@ -1419,6 +1423,7 @@ static int hostapd_setup_bss(struct host @@ -1104,7 +1108,7 @@ static int db_table_create_radius_attrib
* initialized. Most of the modules that are initialized here will be
* deinitialized in hostapd_cleanup().
*/
-static int hostapd_setup_bss(struct hostapd_data *hapd, int first)
+int hostapd_setup_bss(struct hostapd_data *hapd, int first, bool set_beacon)
{
struct hostapd_bss_config *conf = hapd->conf;
u8 ssid[SSID_MAX_LEN + 1];
@@ -1400,6 +1404,7 @@ static int hostapd_setup_bss(struct host
hapd->driver->set_operstate(hapd->drv_priv, 1); hapd->driver->set_operstate(hapd->drv_priv, 1);
hostapd_ubus_add_bss(hapd); hostapd_ubus_add_bss(hapd);
@@ -114,9 +132,36 @@
return 0; return 0;
} }
@@ -2090,7 +2095,7 @@ static int hostapd_setup_interface_compl
hapd = iface->bss[j];
if (j)
os_memcpy(hapd->own_addr, prev_addr, ETH_ALEN);
- if (hostapd_setup_bss(hapd, j == 0)) {
+ if (hostapd_setup_bss(hapd, j == 0, true)) {
for (;;) {
hapd = iface->bss[j];
hostapd_bss_deinit_no_free(hapd);
@@ -2368,7 +2373,7 @@ hostapd_alloc_bss_data(struct hostapd_if
}
-static void hostapd_bss_deinit(struct hostapd_data *hapd)
+void hostapd_bss_deinit(struct hostapd_data *hapd)
{
if (!hapd)
return;
@@ -2985,7 +2990,7 @@ int hostapd_add_iface(struct hapd_interf
if (start_ctrl_iface_bss(hapd) < 0 ||
(hapd_iface->state == HAPD_IFACE_ENABLED &&
- hostapd_setup_bss(hapd, -1))) {
+ hostapd_setup_bss(hapd, -1, true))) {
hostapd_cleanup(hapd);
hapd_iface->bss[hapd_iface->num_bss - 1] = NULL;
hapd_iface->conf->num_bss--;
--- a/wpa_supplicant/Makefile --- a/wpa_supplicant/Makefile
+++ b/wpa_supplicant/Makefile +++ b/wpa_supplicant/Makefile
@@ -174,8 +174,20 @@ endif @@ -172,8 +172,20 @@ endif
ifdef CONFIG_UBUS ifdef CONFIG_UBUS
CFLAGS += -DUBUS_SUPPORT CFLAGS += -DUBUS_SUPPORT
OBJS += ubus.o OBJS += ubus.o
@@ -138,9 +183,27 @@
endif endif
ifdef CONFIG_CODE_COVERAGE ifdef CONFIG_CODE_COVERAGE
@@ -956,6 +968,9 @@ OBJS += ../src/ap/ctrl_iface_ap.o
ifdef CONFIG_UBUS
OBJS += ../src/ap/ubus.o
endif
+ifdef CONFIG_UCODE
+OBJS += ../src/ap/ucode.o
+endif
endif
CFLAGS += -DEAP_SERVER -DEAP_SERVER_IDENTITY
--- a/wpa_supplicant/wpa_supplicant.c --- a/wpa_supplicant/wpa_supplicant.c
+++ b/wpa_supplicant/wpa_supplicant.c +++ b/wpa_supplicant/wpa_supplicant.c
@@ -7013,6 +7013,7 @@ struct wpa_supplicant * wpa_supplicant_a @@ -1025,6 +1025,7 @@ void wpa_supplicant_set_state(struct wpa
sme_sched_obss_scan(wpa_s, 0);
}
wpa_s->wpa_state = state;
+ wpas_ucode_update_state(wpa_s);
#ifdef CONFIG_BGSCAN
if (state == WPA_COMPLETED && wpa_s->current_ssid != wpa_s->bgscan_ssid)
@@ -6944,6 +6945,7 @@ struct wpa_supplicant * wpa_supplicant_a
#endif /* CONFIG_P2P */ #endif /* CONFIG_P2P */
wpas_ubus_add_bss(wpa_s); wpas_ubus_add_bss(wpa_s);
@@ -148,7 +211,7 @@
return wpa_s; return wpa_s;
} }
@@ -7040,6 +7041,7 @@ int wpa_supplicant_remove_iface(struct w @@ -6971,6 +6973,7 @@ int wpa_supplicant_remove_iface(struct w
struct wpa_supplicant *parent = wpa_s->parent; struct wpa_supplicant *parent = wpa_s->parent;
#endif /* CONFIG_MESH */ #endif /* CONFIG_MESH */
@@ -156,7 +219,7 @@
wpas_ubus_free_bss(wpa_s); wpas_ubus_free_bss(wpa_s);
/* Remove interface from the global list of interfaces */ /* Remove interface from the global list of interfaces */
@@ -7307,6 +7309,7 @@ struct wpa_global * wpa_supplicant_init( @@ -7238,6 +7241,7 @@ struct wpa_global * wpa_supplicant_init(
eloop_register_timeout(WPA_SUPPLICANT_CLEANUP_INTERVAL, 0, eloop_register_timeout(WPA_SUPPLICANT_CLEANUP_INTERVAL, 0,
wpas_periodic, global, NULL); wpas_periodic, global, NULL);
@@ -164,7 +227,7 @@
return global; return global;
} }
@@ -7345,12 +7348,8 @@ int wpa_supplicant_run(struct wpa_global @@ -7276,12 +7280,8 @@ int wpa_supplicant_run(struct wpa_global
eloop_register_signal_terminate(wpa_supplicant_terminate, global); eloop_register_signal_terminate(wpa_supplicant_terminate, global);
eloop_register_signal_reconfig(wpa_supplicant_reconfig, global); eloop_register_signal_reconfig(wpa_supplicant_reconfig, global);
@@ -177,7 +240,7 @@
return 0; return 0;
} }
@@ -7383,6 +7382,8 @@ void wpa_supplicant_deinit(struct wpa_gl @@ -7314,6 +7314,8 @@ void wpa_supplicant_deinit(struct wpa_gl
wpas_notify_supplicant_deinitialized(global); wpas_notify_supplicant_deinitialized(global);
@@ -196,7 +259,7 @@
extern const char *const wpa_supplicant_version; extern const char *const wpa_supplicant_version;
extern const char *const wpa_supplicant_license; extern const char *const wpa_supplicant_license;
@@ -605,6 +606,7 @@ struct wpa_supplicant { @@ -600,6 +601,7 @@ struct wpa_supplicant {
unsigned char perm_addr[ETH_ALEN]; unsigned char perm_addr[ETH_ALEN];
char ifname[100]; char ifname[100];
struct wpas_ubus_bss ubus; struct wpas_ubus_bss ubus;
@@ -206,7 +269,7 @@
#endif /* CONFIG_MATCH_IFACE */ #endif /* CONFIG_MATCH_IFACE */
--- a/hostapd/ctrl_iface.c --- a/hostapd/ctrl_iface.c
+++ b/hostapd/ctrl_iface.c +++ b/hostapd/ctrl_iface.c
@@ -4941,6 +4941,7 @@ try_again: @@ -4877,6 +4877,7 @@ try_again:
return -1; return -1;
} }
@@ -214,7 +277,7 @@
wpa_msg_register_cb(hostapd_ctrl_iface_msg_cb); wpa_msg_register_cb(hostapd_ctrl_iface_msg_cb);
return 0; return 0;
@@ -5042,6 +5043,7 @@ fail: @@ -4978,6 +4979,7 @@ fail:
os_free(fname); os_free(fname);
interface->global_ctrl_sock = s; interface->global_ctrl_sock = s;
@@ -222,3 +285,66 @@
eloop_register_read_sock(s, hostapd_global_ctrl_iface_receive, eloop_register_read_sock(s, hostapd_global_ctrl_iface_receive,
interface, NULL); interface, NULL);
--- a/src/drivers/driver.h
+++ b/src/drivers/driver.h
@@ -5827,6 +5827,7 @@ union wpa_event_data {
/**
* struct ch_switch
+ * @count: Count until channel switch activates
* @freq: Frequency of new channel in MHz
* @ht_enabled: Whether this is an HT channel
* @ch_offset: Secondary channel offset
@@ -5835,6 +5836,7 @@ union wpa_event_data {
* @cf2: Center frequency 2
*/
struct ch_switch {
+ int count;
int freq;
int ht_enabled;
int ch_offset;
--- a/src/drivers/driver_nl80211_event.c
+++ b/src/drivers/driver_nl80211_event.c
@@ -655,6 +655,7 @@ static void mlme_event_ch_switch(struct
struct nlattr *ifindex, struct nlattr *freq,
struct nlattr *type, struct nlattr *bw,
struct nlattr *cf1, struct nlattr *cf2,
+ struct nlattr *count,
int finished)
{
struct i802_bss *bss;
@@ -714,6 +715,8 @@ static void mlme_event_ch_switch(struct
data.ch_switch.cf1 = nla_get_u32(cf1);
if (cf2)
data.ch_switch.cf2 = nla_get_u32(cf2);
+ if (count)
+ data.ch_switch.count = nla_get_u32(count);
if (finished)
bss->freq = data.ch_switch.freq;
@@ -2886,6 +2889,7 @@ static void do_process_drv_event(struct
tb[NL80211_ATTR_CHANNEL_WIDTH],
tb[NL80211_ATTR_CENTER_FREQ1],
tb[NL80211_ATTR_CENTER_FREQ2],
+ tb[NL80211_ATTR_CH_SWITCH_COUNT],
0);
break;
case NL80211_CMD_CH_SWITCH_NOTIFY:
@@ -2896,6 +2900,7 @@ static void do_process_drv_event(struct
tb[NL80211_ATTR_CHANNEL_WIDTH],
tb[NL80211_ATTR_CENTER_FREQ1],
tb[NL80211_ATTR_CENTER_FREQ2],
+ NULL,
1);
break;
case NL80211_CMD_DISCONNECT:
--- a/wpa_supplicant/events.c
+++ b/wpa_supplicant/events.c
@@ -4702,6 +4702,7 @@ void supplicant_event(void *ctx, enum wp
event_to_string(event), event);
#endif /* CONFIG_NO_STDOUT_DEBUG */
+ wpas_ucode_event(wpa_s, event, data);
switch (event) {
case EVENT_AUTH:
#ifdef CONFIG_FST

View File

@@ -1,328 +0,0 @@
--- a/hostapd/config_file.c
+++ b/hostapd/config_file.c
@@ -2437,8 +2437,13 @@ static int hostapd_config_fill(struct ho
bss->isolate = atoi(pos);
} else if (os_strcmp(buf, "ap_max_inactivity") == 0) {
bss->ap_max_inactivity = atoi(pos);
+ } else if (os_strcmp(buf, "config_id") == 0) {
+ bss->config_id = os_strdup(pos);
} else if (os_strcmp(buf, "skip_inactivity_poll") == 0) {
bss->skip_inactivity_poll = atoi(pos);
+ } else if (os_strcmp(buf, "config_id") == 0) {
+ os_free(bss->config_id);
+ bss->config_id = os_strdup(pos);
} else if (os_strcmp(buf, "country_code") == 0) {
if (pos[0] < 'A' || pos[0] > 'Z' ||
pos[1] < 'A' || pos[1] > 'Z') {
@@ -3133,6 +3138,8 @@ static int hostapd_config_fill(struct ho
}
} else if (os_strcmp(buf, "acs_exclude_dfs") == 0) {
conf->acs_exclude_dfs = atoi(pos);
+ } else if (os_strcmp(buf, "radio_config_id") == 0) {
+ conf->config_id = os_strdup(pos);
} else if (os_strcmp(buf, "op_class") == 0) {
conf->op_class = atoi(pos);
} else if (os_strcmp(buf, "channel") == 0) {
--- a/src/ap/ap_config.c
+++ b/src/ap/ap_config.c
@@ -785,6 +785,7 @@ void hostapd_config_free_bss(struct host
os_free(conf->radius_req_attr_sqlite);
os_free(conf->rsn_preauth_interfaces);
os_free(conf->ctrl_interface);
+ os_free(conf->config_id);
os_free(conf->ca_cert);
os_free(conf->server_cert);
os_free(conf->server_cert2);
@@ -981,6 +982,7 @@ void hostapd_config_free(struct hostapd_
for (i = 0; i < conf->num_bss; i++)
hostapd_config_free_bss(conf->bss[i]);
+ os_free(conf->config_id);
os_free(conf->bss);
os_free(conf->supported_rates);
os_free(conf->basic_rates);
--- a/src/ap/ap_config.h
+++ b/src/ap/ap_config.h
@@ -882,6 +882,7 @@ struct hostapd_bss_config {
#endif /* CONFIG_PASN */
unsigned int unsol_bcast_probe_resp_interval;
+ char *config_id;
};
/**
@@ -924,6 +925,7 @@ struct spatial_reuse {
struct hostapd_config {
struct hostapd_bss_config **bss, *last_bss;
size_t num_bss;
+ char *config_id;
u16 beacon_int;
int rts_threshold;
--- a/src/ap/hostapd.c
+++ b/src/ap/hostapd.c
@@ -99,7 +99,7 @@ void hostapd_reconfig_encryption(struct
}
-static void hostapd_reload_bss(struct hostapd_data *hapd)
+void hostapd_reload_bss(struct hostapd_data *hapd)
{
struct hostapd_ssid *ssid;
@@ -189,27 +189,34 @@ static void hostapd_reload_bss(struct ho
}
-static void hostapd_clear_old(struct hostapd_iface *iface)
+static void hostapd_clear_old_bss(struct hostapd_data *bss)
{
- size_t j;
+ wpa_printf(MSG_DEBUG, "BSS %s changed - clear old state",
+ bss->conf->iface);
/*
* Deauthenticate all stations since the new configuration may not
* allow them to use the BSS anymore.
*/
- for (j = 0; j < iface->num_bss; j++) {
- hostapd_flush_old_stations(iface->bss[j],
- WLAN_REASON_PREV_AUTH_NOT_VALID);
+ hostapd_flush_old_stations(bss, WLAN_REASON_PREV_AUTH_NOT_VALID);
#ifdef CONFIG_WEP
- hostapd_broadcast_wep_clear(iface->bss[j]);
+ hostapd_broadcast_wep_clear(bss);
#endif /* CONFIG_WEP */
#ifndef CONFIG_NO_RADIUS
- /* TODO: update dynamic data based on changed configuration
- * items (e.g., open/close sockets, etc.) */
- radius_client_flush(iface->bss[j]->radius, 0);
+ /* TODO: update dynamic data based on changed configuration
+ * items (e.g., open/close sockets, etc.) */
+ radius_client_flush(bss->radius, 0);
#endif /* CONFIG_NO_RADIUS */
- }
+}
+
+
+static void hostapd_clear_old(struct hostapd_iface *iface)
+{
+ size_t j;
+
+ for (j = 0; j < iface->num_bss; j++)
+ hostapd_clear_old_bss(iface->bss[j]);
}
@@ -218,6 +225,10 @@ static int hostapd_iface_conf_changed(st
{
size_t i;
+ if (newconf->config_id != oldconf->config_id)
+ if (strcmp(newconf->config_id, oldconf->config_id))
+ return 1;
+
if (newconf->num_bss != oldconf->num_bss)
return 1;
@@ -231,7 +242,7 @@ static int hostapd_iface_conf_changed(st
}
-int hostapd_reload_config(struct hostapd_iface *iface)
+int hostapd_reload_config(struct hostapd_iface *iface, int reconf)
{
struct hapd_interfaces *interfaces = iface->interfaces;
struct hostapd_data *hapd = iface->bss[0];
@@ -256,13 +267,16 @@ int hostapd_reload_config(struct hostapd
if (newconf == NULL)
return -1;
- hostapd_clear_old(iface);
-
oldconf = hapd->iconf;
if (hostapd_iface_conf_changed(newconf, oldconf)) {
char *fname;
int res;
+ if (reconf)
+ return -1;
+
+ hostapd_clear_old(iface);
+
wpa_printf(MSG_DEBUG,
"Configuration changes include interface/BSS modification - force full disable+enable sequence");
fname = os_strdup(iface->config_fname);
@@ -287,6 +301,24 @@ int hostapd_reload_config(struct hostapd
wpa_printf(MSG_ERROR,
"Failed to enable interface on config reload");
return res;
+ } else {
+ for (j = 0; j < iface->num_bss; j++) {
+ hapd = iface->bss[j];
+ if (!hapd->config_id || strcmp(hapd->config_id, newconf->bss[j]->config_id)) {
+ hostapd_flush_old_stations(iface->bss[j],
+ WLAN_REASON_PREV_AUTH_NOT_VALID);
+#ifdef CONFIG_WEP
+ hostapd_broadcast_wep_clear(iface->bss[j]);
+#endif
+
+#ifndef CONFIG_NO_RADIUS
+ /* TODO: update dynamic data based on changed configuration
+ * items (e.g., open/close sockets, etc.) */
+ radius_client_flush(iface->bss[j]->radius, 0);
+#endif /* CONFIG_NO_RADIUS */
+ wpa_printf(MSG_INFO, "bss %zu changed", j);
+ }
+ }
}
iface->conf = newconf;
@@ -303,6 +335,16 @@ int hostapd_reload_config(struct hostapd
for (j = 0; j < iface->num_bss; j++) {
hapd = iface->bss[j];
+ if (hapd->config_id) {
+ os_free(hapd->config_id);
+ hapd->config_id = NULL;
+ }
+ if (newconf->bss[j]->config_id)
+ hapd->config_id = strdup(newconf->bss[j]->config_id);
+ if (!hapd->conf->config_id || !newconf->bss[j]->config_id ||
+ os_strcmp(hapd->conf->config_id,
+ newconf->bss[j]->config_id) != 0)
+ hostapd_clear_old_bss(hapd);
hapd->iconf = newconf;
hapd->conf = newconf->bss[j];
hostapd_reload_bss(hapd);
@@ -1127,7 +1169,7 @@ static int db_table_create_radius_attrib
* initialized. Most of the modules that are initialized here will be
* deinitialized in hostapd_cleanup().
*/
-static int hostapd_setup_bss(struct hostapd_data *hapd, int first)
+int hostapd_setup_bss(struct hostapd_data *hapd, int first, bool set_beacon)
{
struct hostapd_bss_config *conf = hapd->conf;
u8 ssid[SSID_MAX_LEN + 1];
@@ -2114,7 +2156,7 @@ static int hostapd_setup_interface_compl
hapd = iface->bss[j];
if (j)
os_memcpy(hapd->own_addr, prev_addr, ETH_ALEN);
- if (hostapd_setup_bss(hapd, j == 0)) {
+ if (hostapd_setup_bss(hapd, j == 0, true)) {
for (;;) {
hapd = iface->bss[j];
hostapd_bss_deinit_no_free(hapd);
@@ -2374,6 +2416,10 @@ hostapd_alloc_bss_data(struct hostapd_if
hapd->iconf = conf;
hapd->conf = bss;
hapd->iface = hapd_iface;
+ if (bss && bss->config_id)
+ hapd->config_id = strdup(bss->config_id);
+ else
+ hapd->config_id = NULL;
if (conf)
hapd->driver = conf->driver;
hapd->ctrl_sock = -1;
@@ -2392,7 +2438,7 @@ hostapd_alloc_bss_data(struct hostapd_if
}
-static void hostapd_bss_deinit(struct hostapd_data *hapd)
+void hostapd_bss_deinit(struct hostapd_data *hapd)
{
if (!hapd)
return;
@@ -3009,7 +3055,7 @@ int hostapd_add_iface(struct hapd_interf
if (start_ctrl_iface_bss(hapd) < 0 ||
(hapd_iface->state == HAPD_IFACE_ENABLED &&
- hostapd_setup_bss(hapd, -1))) {
+ hostapd_setup_bss(hapd, -1, true))) {
hostapd_cleanup(hapd);
hapd_iface->bss[hapd_iface->num_bss - 1] = NULL;
hapd_iface->conf->num_bss--;
--- a/hostapd/ctrl_iface.c
+++ b/hostapd/ctrl_iface.c
@@ -186,7 +186,7 @@ static int hostapd_ctrl_iface_update(str
iface->interfaces->config_read_cb = hostapd_ctrl_iface_config_read;
reload_opts = txt;
- hostapd_reload_config(iface);
+ hostapd_reload_config(iface, 0);
iface->interfaces->config_read_cb = config_read_cb;
}
--- a/hostapd/main.c
+++ b/hostapd/main.c
@@ -317,7 +317,7 @@ static void handle_term(int sig, void *s
static int handle_reload_iface(struct hostapd_iface *iface, void *ctx)
{
- if (hostapd_reload_config(iface) < 0) {
+ if (hostapd_reload_config(iface, 0) < 0) {
wpa_printf(MSG_WARNING, "Failed to read new configuration "
"file - continuing with old.");
}
--- a/src/ap/hostapd.h
+++ b/src/ap/hostapd.h
@@ -47,7 +47,7 @@ struct mesh_conf;
struct hostapd_iface;
struct hapd_interfaces {
- int (*reload_config)(struct hostapd_iface *iface);
+ int (*reload_config)(struct hostapd_iface *iface, int reconf);
struct hostapd_config * (*config_read_cb)(const char *config_fname);
int (*ctrl_iface_init)(struct hostapd_data *hapd);
void (*ctrl_iface_deinit)(struct hostapd_data *hapd);
@@ -177,6 +177,7 @@ struct hostapd_data {
struct hostapd_bss_config *conf;
struct hostapd_ubus_bss ubus;
struct hostapd_ucode_bss ucode;
+ char *config_id;
int interface_added; /* virtual interface added for this BSS */
unsigned int started:1;
unsigned int disabled:1;
@@ -627,7 +628,9 @@ struct hostapd_iface {
int hostapd_for_each_interface(struct hapd_interfaces *interfaces,
int (*cb)(struct hostapd_iface *iface,
void *ctx), void *ctx);
-int hostapd_reload_config(struct hostapd_iface *iface);
+int hostapd_reload_config(struct hostapd_iface *iface, int reconf);
+void hostapd_reload_bss(struct hostapd_data *hapd);
+void hostapd_bss_deinit(struct hostapd_data *hapd);
void hostapd_reconfig_encryption(struct hostapd_data *hapd);
struct hostapd_data *
hostapd_alloc_bss_data(struct hostapd_iface *hapd_iface,
@@ -644,6 +647,7 @@ struct hostapd_iface * hostapd_init(stru
struct hostapd_iface *
hostapd_interface_init_bss(struct hapd_interfaces *interfaces, const char *phy,
const char *config_fname, int debug);
+int hostapd_setup_bss(struct hostapd_data *hapd, int first, bool set_beacon);
void hostapd_new_assoc_sta(struct hostapd_data *hapd, struct sta_info *sta,
int reassoc);
void hostapd_interface_deinit_free(struct hostapd_iface *iface);
--- a/src/ap/wps_hostapd.c
+++ b/src/ap/wps_hostapd.c
@@ -315,7 +315,7 @@ static void wps_reload_config(void *eloo
wpa_printf(MSG_DEBUG, "WPS: Reload configuration data");
if (iface->interfaces == NULL ||
- iface->interfaces->reload_config(iface) < 0) {
+ iface->interfaces->reload_config(iface, 1) < 0) {
wpa_printf(MSG_WARNING, "WPS: Failed to reload the updated "
"configuration");
}
--- a/src/drivers/driver_nl80211.c
+++ b/src/drivers/driver_nl80211.c
@@ -4766,6 +4766,9 @@ static int wpa_driver_nl80211_set_ap(voi
if (ret) {
wpa_printf(MSG_DEBUG, "nl80211: Beacon set failed: %d (%s)",
ret, strerror(-ret));
+ if (!bss->beacon_set)
+ ret = 0;
+ bss->beacon_set = 0;
} else {
bss->beacon_set = 1;
nl80211_set_bss(bss, params->cts_protect, params->preamble,

View File

@@ -1,6 +1,6 @@
--- a/hostapd/config_file.c --- a/hostapd/config_file.c
+++ b/hostapd/config_file.c +++ b/hostapd/config_file.c
@@ -4706,7 +4706,12 @@ struct hostapd_config * hostapd_config_r @@ -4699,7 +4699,12 @@ struct hostapd_config * hostapd_config_r
int errors = 0; int errors = 0;
size_t i; size_t i;

View File

@@ -30,7 +30,7 @@
--- a/hostapd/config_file.c --- a/hostapd/config_file.c
+++ b/hostapd/config_file.c +++ b/hostapd/config_file.c
@@ -3349,6 +3349,8 @@ static int hostapd_config_fill(struct ho @@ -3342,6 +3342,8 @@ static int hostapd_config_fill(struct ho
#ifndef CONFIG_NO_VLAN #ifndef CONFIG_NO_VLAN
} else if (os_strcmp(buf, "dynamic_vlan") == 0) { } else if (os_strcmp(buf, "dynamic_vlan") == 0) {
bss->ssid.dynamic_vlan = atoi(pos); bss->ssid.dynamic_vlan = atoi(pos);

View File

@@ -1,6 +1,6 @@
--- a/hostapd/config_file.c --- a/hostapd/config_file.c
+++ b/hostapd/config_file.c +++ b/hostapd/config_file.c
@@ -2858,6 +2858,14 @@ static int hostapd_config_fill(struct ho @@ -2853,6 +2853,14 @@ static int hostapd_config_fill(struct ho
line, bss->max_num_sta, MAX_STA_COUNT); line, bss->max_num_sta, MAX_STA_COUNT);
return 1; return 1;
} }
@@ -17,7 +17,7 @@
} else if (os_strcmp(buf, "extended_key_id") == 0) { } else if (os_strcmp(buf, "extended_key_id") == 0) {
--- a/src/ap/hostapd.h --- a/src/ap/hostapd.h
+++ b/src/ap/hostapd.h +++ b/src/ap/hostapd.h
@@ -674,6 +674,7 @@ void hostapd_cleanup_cs_params(struct ho @@ -672,6 +672,7 @@ void hostapd_cleanup_cs_params(struct ho
void hostapd_periodic_iface(struct hostapd_iface *iface); void hostapd_periodic_iface(struct hostapd_iface *iface);
int hostapd_owe_trans_get_info(struct hostapd_data *hapd); int hostapd_owe_trans_get_info(struct hostapd_data *hapd);
void hostapd_ocv_check_csa_sa_query(void *eloop_ctx, void *timeout_ctx); void hostapd_ocv_check_csa_sa_query(void *eloop_ctx, void *timeout_ctx);
@@ -27,7 +27,7 @@
int hostapd_register_probereq_cb(struct hostapd_data *hapd, int hostapd_register_probereq_cb(struct hostapd_data *hapd,
--- a/src/ap/hostapd.c --- a/src/ap/hostapd.c
+++ b/src/ap/hostapd.c +++ b/src/ap/hostapd.c
@@ -242,6 +242,30 @@ static int hostapd_iface_conf_changed(st @@ -209,6 +209,30 @@ static int hostapd_iface_conf_changed(st
} }
@@ -55,7 +55,7 @@
+ return 0; + return 0;
+} +}
+ +
int hostapd_reload_config(struct hostapd_iface *iface, int reconf) int hostapd_reload_config(struct hostapd_iface *iface)
{ {
struct hapd_interfaces *interfaces = iface->interfaces; struct hapd_interfaces *interfaces = iface->interfaces;
--- a/src/ap/beacon.c --- a/src/ap/beacon.c
@@ -71,7 +71,7 @@
" since no room for additional STA", " since no room for additional STA",
--- a/src/ap/ap_config.h --- a/src/ap/ap_config.h
+++ b/src/ap/ap_config.h +++ b/src/ap/ap_config.h
@@ -961,6 +961,8 @@ struct hostapd_config { @@ -959,6 +959,8 @@ struct hostapd_config {
unsigned int track_sta_max_num; unsigned int track_sta_max_num;
unsigned int track_sta_max_age; unsigned int track_sta_max_age;

View File

@@ -1,6 +1,6 @@
--- a/hostapd/config_file.c --- a/hostapd/config_file.c
+++ b/hostapd/config_file.c +++ b/hostapd/config_file.c
@@ -3016,6 +3016,8 @@ static int hostapd_config_fill(struct ho @@ -3011,6 +3011,8 @@ static int hostapd_config_fill(struct ho
wpa_printf(MSG_INFO, wpa_printf(MSG_INFO,
"Line %d: Obsolete peerkey parameter ignored", line); "Line %d: Obsolete peerkey parameter ignored", line);
#ifdef CONFIG_IEEE80211R_AP #ifdef CONFIG_IEEE80211R_AP

View File

@@ -98,7 +98,7 @@
hapd->conf->own_ip_addr.af == AF_INET && hapd->conf->own_ip_addr.af == AF_INET &&
--- a/hostapd/config_file.c --- a/hostapd/config_file.c
+++ b/hostapd/config_file.c +++ b/hostapd/config_file.c
@@ -2701,6 +2701,8 @@ static int hostapd_config_fill(struct ho @@ -2696,6 +2696,8 @@ static int hostapd_config_fill(struct ho
} else if (os_strcmp(buf, "iapp_interface") == 0) { } else if (os_strcmp(buf, "iapp_interface") == 0) {
wpa_printf(MSG_INFO, "DEPRECATED: iapp_interface not used"); wpa_printf(MSG_INFO, "DEPRECATED: iapp_interface not used");
#endif /* CONFIG_IAPP */ #endif /* CONFIG_IAPP */

View File

@@ -9,7 +9,7 @@
#include "utils/common.h" #include "utils/common.h"
#include "utils/eloop.h" #include "utils/eloop.h"
#include "utils/crc32.h" #include "utils/crc32.h"
@@ -1259,6 +1261,22 @@ int hostapd_setup_bss(struct hostapd_dat @@ -1198,6 +1200,22 @@ int hostapd_setup_bss(struct hostapd_dat
os_memcpy(hapd->own_addr, if_addr, ETH_ALEN); os_memcpy(hapd->own_addr, if_addr, ETH_ALEN);
} }

View File

@@ -10,7 +10,7 @@
unsigned int time_window; unsigned int time_window;
--- a/src/ap/hostapd.c --- a/src/ap/hostapd.c
+++ b/src/ap/hostapd.c +++ b/src/ap/hostapd.c
@@ -1386,6 +1386,7 @@ int hostapd_setup_bss(struct hostapd_dat @@ -1325,6 +1325,7 @@ int hostapd_setup_bss(struct hostapd_dat
struct radius_das_conf das_conf; struct radius_das_conf das_conf;
os_memset(&das_conf, 0, sizeof(das_conf)); os_memset(&das_conf, 0, sizeof(das_conf));
das_conf.port = conf->radius_das_port; das_conf.port = conf->radius_das_port;

View File

@@ -21,7 +21,7 @@
--- a/src/ap/ubus.c --- a/src/ap/ubus.c
+++ b/src/ap/ubus.c +++ b/src/ap/ubus.c
@@ -428,6 +428,9 @@ hostapd_bss_get_status(struct ubus_conte @@ -424,6 +424,9 @@ hostapd_bss_get_status(struct ubus_conte
hapd->iface->cac_started ? hapd->iface->dfs_cac_ms / 1000 - now.sec : 0); hapd->iface->cac_started ? hapd->iface->dfs_cac_ms / 1000 - now.sec : 0);
blobmsg_close_table(&b, dfs_table); blobmsg_close_table(&b, dfs_table);
@@ -38,6 +38,6 @@
os_free(conf->rsn_preauth_interfaces); os_free(conf->rsn_preauth_interfaces);
os_free(conf->ctrl_interface); os_free(conf->ctrl_interface);
+ os_free(conf->uci_section); + os_free(conf->uci_section);
os_free(conf->config_id);
os_free(conf->ca_cert); os_free(conf->ca_cert);
os_free(conf->server_cert); os_free(conf->server_cert);
os_free(conf->server_cert2);

View File

@@ -13,7 +13,7 @@
struct hostapd_sta_add_params { struct hostapd_sta_add_params {
--- a/src/drivers/driver_nl80211.c --- a/src/drivers/driver_nl80211.c
+++ b/src/drivers/driver_nl80211.c +++ b/src/drivers/driver_nl80211.c
@@ -7013,6 +7013,8 @@ static int get_sta_handler(struct nl_msg @@ -7010,6 +7010,8 @@ static int get_sta_handler(struct nl_msg
[NL80211_RATE_INFO_VHT_MCS] = { .type = NLA_U8 }, [NL80211_RATE_INFO_VHT_MCS] = { .type = NLA_U8 },
[NL80211_RATE_INFO_SHORT_GI] = { .type = NLA_FLAG }, [NL80211_RATE_INFO_SHORT_GI] = { .type = NLA_FLAG },
[NL80211_RATE_INFO_VHT_NSS] = { .type = NLA_U8 }, [NL80211_RATE_INFO_VHT_NSS] = { .type = NLA_U8 },
@@ -22,7 +22,7 @@
}; };
nla_parse(tb, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0), nla_parse(tb, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0),
@@ -7105,6 +7107,10 @@ static int get_sta_handler(struct nl_msg @@ -7102,6 +7104,10 @@ static int get_sta_handler(struct nl_msg
nla_get_u8(rate[NL80211_RATE_INFO_VHT_NSS]); nla_get_u8(rate[NL80211_RATE_INFO_VHT_NSS]);
data->flags |= STA_DRV_DATA_TX_VHT_NSS; data->flags |= STA_DRV_DATA_TX_VHT_NSS;
} }
@@ -33,7 +33,7 @@
} }
if (stats[NL80211_STA_INFO_RX_BITRATE] && if (stats[NL80211_STA_INFO_RX_BITRATE] &&
@@ -7135,11 +7141,16 @@ static int get_sta_handler(struct nl_msg @@ -7132,11 +7138,16 @@ static int get_sta_handler(struct nl_msg
nla_get_u8(rate[NL80211_RATE_INFO_VHT_NSS]); nla_get_u8(rate[NL80211_RATE_INFO_VHT_NSS]);
data->flags |= STA_DRV_DATA_RX_VHT_NSS; data->flags |= STA_DRV_DATA_RX_VHT_NSS;
} }
@@ -52,7 +52,7 @@
--- a/src/ap/ubus.c --- a/src/ap/ubus.c
+++ b/src/ap/ubus.c +++ b/src/ap/ubus.c
@@ -310,6 +310,36 @@ hostapd_bss_get_clients(struct ubus_cont @@ -306,6 +306,36 @@ hostapd_bss_get_clients(struct ubus_cont
blobmsg_add_u32(&b, "tx", sta_driver_data.current_tx_rate * 100); blobmsg_add_u32(&b, "tx", sta_driver_data.current_tx_rate * 100);
blobmsg_close_table(&b, r); blobmsg_close_table(&b, r);
blobmsg_add_u32(&b, "signal", sta_driver_data.signal); blobmsg_add_u32(&b, "signal", sta_driver_data.signal);

View File

@@ -1,6 +1,6 @@
--- a/hostapd/config_file.c --- a/hostapd/config_file.c
+++ b/hostapd/config_file.c +++ b/hostapd/config_file.c
@@ -3344,6 +3344,8 @@ static int hostapd_config_fill(struct ho @@ -3337,6 +3337,8 @@ static int hostapd_config_fill(struct ho
bss->ignore_broadcast_ssid = atoi(pos); bss->ignore_broadcast_ssid = atoi(pos);
} else if (os_strcmp(buf, "no_probe_resp_if_max_sta") == 0) { } else if (os_strcmp(buf, "no_probe_resp_if_max_sta") == 0) {
bss->no_probe_resp_if_max_sta = atoi(pos); bss->no_probe_resp_if_max_sta = atoi(pos);

View File

@@ -63,7 +63,7 @@
--- a/src/ap/ubus.c --- a/src/ap/ubus.c
+++ b/src/ap/ubus.c +++ b/src/ap/ubus.c
@@ -340,6 +340,9 @@ hostapd_bss_get_clients(struct ubus_cont @@ -336,6 +336,9 @@ hostapd_bss_get_clients(struct ubus_cont
blobmsg_add_u32(&b, "tx", sta_driver_data.tx_mcs); blobmsg_add_u32(&b, "tx", sta_driver_data.tx_mcs);
} }
blobmsg_close_table(&b, r); blobmsg_close_table(&b, r);
@@ -73,7 +73,7 @@
} }
hostapd_parse_capab_blobmsg(sta); hostapd_parse_capab_blobmsg(sta);
@@ -461,6 +464,9 @@ hostapd_bss_get_status(struct ubus_conte @@ -457,6 +460,9 @@ hostapd_bss_get_status(struct ubus_conte
if (hapd->conf->uci_section) if (hapd->conf->uci_section)
blobmsg_add_string(&b, "uci_section", hapd->conf->uci_section); blobmsg_add_string(&b, "uci_section", hapd->conf->uci_section);
@@ -85,7 +85,7 @@
return 0; return 0;
--- a/src/ap/hostapd.h --- a/src/ap/hostapd.h
+++ b/src/ap/hostapd.h +++ b/src/ap/hostapd.h
@@ -452,6 +452,7 @@ struct hostapd_data { @@ -451,6 +451,7 @@ struct hostapd_data {
#ifdef CONFIG_CTRL_IFACE_UDP #ifdef CONFIG_CTRL_IFACE_UDP
unsigned char ctrl_iface_cookie[CTRL_IFACE_COOKIE_LEN]; unsigned char ctrl_iface_cookie[CTRL_IFACE_COOKIE_LEN];
#endif /* CONFIG_CTRL_IFACE_UDP */ #endif /* CONFIG_CTRL_IFACE_UDP */

View File

@@ -1,6 +1,6 @@
--- a/hostapd/config_file.c --- a/hostapd/config_file.c
+++ b/hostapd/config_file.c +++ b/hostapd/config_file.c
@@ -2465,6 +2465,8 @@ static int hostapd_config_fill(struct ho @@ -2460,6 +2460,8 @@ static int hostapd_config_fill(struct ho
conf->ieee80211d = atoi(pos); conf->ieee80211d = atoi(pos);
} else if (os_strcmp(buf, "ieee80211h") == 0) { } else if (os_strcmp(buf, "ieee80211h") == 0) {
conf->ieee80211h = atoi(pos); conf->ieee80211h = atoi(pos);
@@ -11,7 +11,7 @@
} else if (os_strcmp(buf, "eapol_version") == 0) { } else if (os_strcmp(buf, "eapol_version") == 0) {
--- a/src/ap/ap_config.h --- a/src/ap/ap_config.h
+++ b/src/ap/ap_config.h +++ b/src/ap/ap_config.h
@@ -981,6 +981,7 @@ struct hostapd_config { @@ -979,6 +979,7 @@ struct hostapd_config {
int ieee80211d; int ieee80211d;
int ieee80211h; /* DFS */ int ieee80211h; /* DFS */
@@ -143,7 +143,7 @@
int hostapd_dfs_complete_cac(struct hostapd_iface *iface, int success, int freq, int hostapd_dfs_complete_cac(struct hostapd_iface *iface, int success, int freq,
--- a/src/ap/hostapd.c --- a/src/ap/hostapd.c
+++ b/src/ap/hostapd.c +++ b/src/ap/hostapd.c
@@ -2901,6 +2901,7 @@ int hostapd_disable_iface(struct hostapd @@ -2836,6 +2836,7 @@ int hostapd_disable_iface(struct hostapd
hostapd_cleanup_cs_params(hapd_iface->bss[j]); hostapd_cleanup_cs_params(hapd_iface->bss[j]);
#endif /* NEED_AP_MLME */ #endif /* NEED_AP_MLME */

View File

@@ -1,6 +1,6 @@
--- a/hostapd/ctrl_iface.c --- a/hostapd/ctrl_iface.c
+++ b/hostapd/ctrl_iface.c +++ b/hostapd/ctrl_iface.c
@@ -3246,6 +3246,92 @@ set: @@ -3184,6 +3184,92 @@ set:
return ret; return ret;
} }
@@ -93,7 +93,7 @@
static int hostapd_ctrl_iface_remove_neighbor(struct hostapd_data *hapd, static int hostapd_ctrl_iface_remove_neighbor(struct hostapd_data *hapd,
char *buf) char *buf)
@@ -3931,6 +4017,10 @@ static int hostapd_ctrl_iface_receive_pr @@ -3867,6 +3953,10 @@ static int hostapd_ctrl_iface_receive_pr
if (radius_server_dac_request(hapd->radius_srv, buf + 12) < 0) if (radius_server_dac_request(hapd->radius_srv, buf + 12) < 0)
reply_len = -1; reply_len = -1;
#endif /* RADIUS_SERVER */ #endif /* RADIUS_SERVER */

View File

@@ -1,6 +1,6 @@
--- a/hostapd/config_file.c --- a/hostapd/config_file.c
+++ b/hostapd/config_file.c +++ b/hostapd/config_file.c
@@ -4338,6 +4338,8 @@ static int hostapd_config_fill(struct ho @@ -4331,6 +4331,8 @@ static int hostapd_config_fill(struct ho
} else if (os_strcmp(buf, "wowlan_triggers") == 0) { } else if (os_strcmp(buf, "wowlan_triggers") == 0) {
os_free(bss->wowlan_triggers); os_free(bss->wowlan_triggers);
bss->wowlan_triggers = os_strdup(pos); bss->wowlan_triggers = os_strdup(pos);
@@ -11,7 +11,7 @@
size_t len = os_strlen(pos); size_t len = os_strlen(pos);
--- a/src/ap/ap_config.h --- a/src/ap/ap_config.h
+++ b/src/ap/ap_config.h +++ b/src/ap/ap_config.h
@@ -1049,6 +1049,7 @@ struct hostapd_config { @@ -1047,6 +1047,7 @@ struct hostapd_config {
} *acs_chan_bias; } *acs_chan_bias;
unsigned int num_acs_chan_bias; unsigned int num_acs_chan_bias;
#endif /* CONFIG_ACS */ #endif /* CONFIG_ACS */

View File

@@ -1,6 +1,6 @@
--- a/wpa_supplicant/wpa_supplicant.c --- a/wpa_supplicant/wpa_supplicant.c
+++ b/wpa_supplicant/wpa_supplicant.c +++ b/wpa_supplicant/wpa_supplicant.c
@@ -2745,7 +2745,7 @@ skip_ht40: @@ -2692,7 +2692,7 @@ skip_ht40:
if (hostapd_set_freq_params(&vht_freq, mode->mode, freq->freq, if (hostapd_set_freq_params(&vht_freq, mode->mode, freq->freq,
freq->channel, ssid->enable_edmg, freq->channel, ssid->enable_edmg,
ssid->edmg_channel, freq->ht_enabled, ssid->edmg_channel, freq->ht_enabled,

View File

@@ -1,6 +1,6 @@
--- a/hostapd/config_file.c --- a/hostapd/config_file.c
+++ b/hostapd/config_file.c +++ b/hostapd/config_file.c
@@ -4172,10 +4172,12 @@ static int hostapd_config_fill(struct ho @@ -4165,10 +4165,12 @@ static int hostapd_config_fill(struct ho
#ifdef CONFIG_MBO #ifdef CONFIG_MBO
} else if (os_strcmp(buf, "mbo") == 0) { } else if (os_strcmp(buf, "mbo") == 0) {
bss->mbo_enabled = atoi(pos); bss->mbo_enabled = atoi(pos);
@@ -17,7 +17,7 @@
#define PARSE_TEST_PROBABILITY(_val) \ #define PARSE_TEST_PROBABILITY(_val) \
--- a/hostapd/ctrl_iface.c --- a/hostapd/ctrl_iface.c
+++ b/hostapd/ctrl_iface.c +++ b/hostapd/ctrl_iface.c
@@ -945,10 +945,11 @@ static int hostapd_ctrl_iface_bss_tm_req @@ -888,10 +888,11 @@ static int hostapd_ctrl_iface_bss_tm_req
if (pos) { if (pos) {
pos += 10; pos += 10;
req_mode |= WNM_BSS_TM_REQ_BSS_TERMINATION_INCLUDED; req_mode |= WNM_BSS_TM_REQ_BSS_TERMINATION_INCLUDED;
@@ -31,7 +31,7 @@
end = os_strchr(pos, ','); end = os_strchr(pos, ',');
if (end == NULL) { if (end == NULL) {
wpa_printf(MSG_DEBUG, "Invalid bss_term data"); wpa_printf(MSG_DEBUG, "Invalid bss_term data");
@@ -958,7 +959,7 @@ static int hostapd_ctrl_iface_bss_tm_req @@ -901,7 +902,7 @@ static int hostapd_ctrl_iface_bss_tm_req
WPA_PUT_LE16(&bss_term_dur[10], atoi(end)); WPA_PUT_LE16(&bss_term_dur[10], atoi(end));
} }

View File

@@ -13,7 +13,7 @@ Signed-off-by: Lavanya Suresh <lavaks@codeaurora.org>
--- a/src/ap/hostapd.c --- a/src/ap/hostapd.c
+++ b/src/ap/hostapd.c +++ b/src/ap/hostapd.c
@@ -3600,6 +3600,9 @@ static int hostapd_fill_csa_settings(str @@ -3535,6 +3535,9 @@ static int hostapd_fill_csa_settings(str
if (!iface || !iface->freq || hapd->csa_in_progress) if (!iface || !iface->freq || hapd->csa_in_progress)
return -1; return -1;

View File

@@ -10,7 +10,7 @@
* *
--- a/wpa_supplicant/wpa_supplicant.c --- a/wpa_supplicant/wpa_supplicant.c
+++ b/wpa_supplicant/wpa_supplicant.c +++ b/wpa_supplicant/wpa_supplicant.c
@@ -2521,16 +2521,14 @@ void ibss_mesh_setup_freq(struct wpa_sup @@ -2468,16 +2468,14 @@ void ibss_mesh_setup_freq(struct wpa_sup
return; return;
/* Allow HE on 2.4 GHz without VHT: see nl80211_put_freq_params() */ /* Allow HE on 2.4 GHz without VHT: see nl80211_put_freq_params() */
@@ -33,7 +33,7 @@
for (chan_idx = 0; chan_idx < mode->num_channels; chan_idx++) { for (chan_idx = 0; chan_idx < mode->num_channels; chan_idx++) {
pri_chan = &mode->channels[chan_idx]; pri_chan = &mode->channels[chan_idx];
@@ -2626,6 +2624,11 @@ void ibss_mesh_setup_freq(struct wpa_sup @@ -2573,6 +2571,11 @@ void ibss_mesh_setup_freq(struct wpa_sup
wpa_scan_results_free(scan_res); wpa_scan_results_free(scan_res);
} }
@@ -45,7 +45,7 @@
#ifdef CONFIG_HT_OVERRIDES #ifdef CONFIG_HT_OVERRIDES
skip_ht40: skip_ht40:
@@ -2658,6 +2661,11 @@ skip_ht40: @@ -2605,6 +2608,11 @@ skip_ht40:
/* Enable HE with VHT for 5 GHz */ /* Enable HE with VHT for 5 GHz */
freq->he_enabled = mode->he_capab[ieee80211_mode].he_supported; freq->he_enabled = mode->he_capab[ieee80211_mode].he_supported;

View File

@@ -1,6 +1,6 @@
--- a/hostapd/config_file.c --- a/hostapd/config_file.c
+++ b/hostapd/config_file.c +++ b/hostapd/config_file.c
@@ -3517,6 +3517,8 @@ static int hostapd_config_fill(struct ho @@ -3510,6 +3510,8 @@ static int hostapd_config_fill(struct ho
conf->he_phy_capab.he_su_beamformee = atoi(pos); conf->he_phy_capab.he_su_beamformee = atoi(pos);
} else if (os_strcmp(buf, "he_mu_beamformer") == 0) { } else if (os_strcmp(buf, "he_mu_beamformer") == 0) {
conf->he_phy_capab.he_mu_beamformer = atoi(pos); conf->he_phy_capab.he_mu_beamformer = atoi(pos);
@@ -37,7 +37,7 @@
conf->he_op.he_bss_color = 1; conf->he_op.he_bss_color = 1;
--- a/src/ap/ap_config.h --- a/src/ap/ap_config.h
+++ b/src/ap/ap_config.h +++ b/src/ap/ap_config.h
@@ -903,6 +903,7 @@ struct he_phy_capabilities_info { @@ -902,6 +902,7 @@ struct he_phy_capabilities_info {
bool he_su_beamformer; bool he_su_beamformer;
bool he_su_beamformee; bool he_su_beamformee;
bool he_mu_beamformer; bool he_mu_beamformer;

View File

@@ -50,7 +50,7 @@ Signed-off-by: Karthikeyan Kathirvel <kathirve@codeaurora.org>
switch (sm->key_mgmt) { switch (sm->key_mgmt) {
--- a/src/drivers/driver_nl80211.c --- a/src/drivers/driver_nl80211.c
+++ b/src/drivers/driver_nl80211.c +++ b/src/drivers/driver_nl80211.c
@@ -5058,7 +5058,7 @@ static int wpa_driver_nl80211_sta_add(vo @@ -5055,7 +5055,7 @@ static int wpa_driver_nl80211_sta_add(vo
if (params->he_capab) { if (params->he_capab) {
wpa_hexdump(MSG_DEBUG, " * he_capab", wpa_hexdump(MSG_DEBUG, " * he_capab",

View File

@@ -22,7 +22,7 @@ Signed-off-by: Pradeep Kumar Chitrapu <pradeepc@codeaurora.org>
--- a/src/drivers/driver_nl80211.c --- a/src/drivers/driver_nl80211.c
+++ b/src/drivers/driver_nl80211.c +++ b/src/drivers/driver_nl80211.c
@@ -10923,7 +10923,8 @@ static int add_acs_ch_list(struct nl_msg @@ -10920,7 +10920,8 @@ static int add_acs_ch_list(struct nl_msg
* compatibility. * compatibility.
*/ */
if (!(freq >= 2412 && freq <= 2484) && if (!(freq >= 2412 && freq <= 2484) &&
@@ -182,7 +182,7 @@ Signed-off-by: Pradeep Kumar Chitrapu <pradeepc@codeaurora.org>
wpa_printf(MSG_DEBUG, wpa_printf(MSG_DEBUG,
--- a/src/ap/hostapd.c --- a/src/ap/hostapd.c
+++ b/src/ap/hostapd.c +++ b/src/ap/hostapd.c
@@ -1800,6 +1800,10 @@ static int setup_interface2(struct hosta @@ -1739,6 +1739,10 @@ static int setup_interface2(struct hosta
ch_width = op_class_to_ch_width(iface->conf->op_class); ch_width = op_class_to_ch_width(iface->conf->op_class);
hostapd_set_oper_chwidth(iface->conf, ch_width); hostapd_set_oper_chwidth(iface->conf, ch_width);

View File

@@ -87,7 +87,7 @@
/** /**
--- a/src/drivers/driver_nl80211_event.c --- a/src/drivers/driver_nl80211_event.c
+++ b/src/drivers/driver_nl80211_event.c +++ b/src/drivers/driver_nl80211_event.c
@@ -2682,6 +2682,35 @@ static void nl80211_sta_opmode_change_ev @@ -2683,6 +2683,35 @@ static void nl80211_sta_opmode_change_ev
wpa_supplicant_event(drv->ctx, EVENT_STATION_OPMODE_CHANGED, &ed); wpa_supplicant_event(drv->ctx, EVENT_STATION_OPMODE_CHANGED, &ed);
} }
@@ -123,7 +123,7 @@
static void nl80211_control_port_frame(struct wpa_driver_nl80211_data *drv, static void nl80211_control_port_frame(struct wpa_driver_nl80211_data *drv,
struct nlattr **tb) struct nlattr **tb)
@@ -2739,7 +2768,6 @@ nl80211_control_port_frame_tx_status(str @@ -2740,7 +2769,6 @@ nl80211_control_port_frame_tx_status(str
wpa_supplicant_event(drv->ctx, EVENT_EAPOL_TX_STATUS, &event); wpa_supplicant_event(drv->ctx, EVENT_EAPOL_TX_STATUS, &event);
} }
@@ -131,7 +131,7 @@
static void do_process_drv_event(struct i802_bss *bss, int cmd, static void do_process_drv_event(struct i802_bss *bss, int cmd,
struct nlattr **tb) struct nlattr **tb)
{ {
@@ -2988,6 +3016,9 @@ static void do_process_drv_event(struct @@ -2989,6 +3017,9 @@ static void do_process_drv_event(struct
tb[NL80211_ATTR_ACK], tb[NL80211_ATTR_ACK],
tb[NL80211_ATTR_COOKIE]); tb[NL80211_ATTR_COOKIE]);
break; break;
@@ -193,7 +193,7 @@
return "UNKNOWN"; return "UNKNOWN";
--- a/src/ap/hostapd.c --- a/src/ap/hostapd.c
+++ b/src/ap/hostapd.c +++ b/src/ap/hostapd.c
@@ -3659,6 +3659,10 @@ static int hostapd_fill_csa_settings(str @@ -3594,6 +3594,10 @@ static int hostapd_fill_csa_settings(str
hapd->cs_count = settings->cs_count; hapd->cs_count = settings->cs_count;
hapd->cs_block_tx = settings->block_tx; hapd->cs_block_tx = settings->block_tx;
@@ -206,7 +206,7 @@
free_beacon_data(&settings->beacon_after); free_beacon_data(&settings->beacon_after);
--- a/hostapd/ctrl_iface.c --- a/hostapd/ctrl_iface.c
+++ b/hostapd/ctrl_iface.c +++ b/hostapd/ctrl_iface.c
@@ -1590,6 +1590,11 @@ static int hostapd_ctrl_iface_set(struct @@ -1533,6 +1533,11 @@ static int hostapd_ctrl_iface_set(struct
} else if (os_strncmp(cmd, "wme_ac_", 7) == 0 || } else if (os_strncmp(cmd, "wme_ac_", 7) == 0 ||
os_strncmp(cmd, "wmm_ac_", 7) == 0) { os_strncmp(cmd, "wmm_ac_", 7) == 0) {
hapd->parameter_set_count++; hapd->parameter_set_count++;

View File

@@ -264,7 +264,7 @@ Signed-off-by: Aloka Dixit <alokad@codeaurora.org>
ret = send_and_recv_msgs_owner(drv, msg, get_connect_handle(bss), 1, ret = send_and_recv_msgs_owner(drv, msg, get_connect_handle(bss), 1,
NULL, NULL, NULL, NULL); NULL, NULL, NULL, NULL);
if (ret) { if (ret) {
@@ -4776,6 +4809,13 @@ static int wpa_driver_nl80211_set_ap(voi @@ -4773,6 +4806,13 @@ static int wpa_driver_nl80211_set_ap(voi
params->isolate, params->basic_rates); params->isolate, params->basic_rates);
nl80211_set_multicast_to_unicast(bss, nl80211_set_multicast_to_unicast(bss,
params->multicast_to_unicast); params->multicast_to_unicast);

View File

@@ -1,6 +1,6 @@
--- a/hostapd/config_file.c --- a/hostapd/config_file.c
+++ b/hostapd/config_file.c +++ b/hostapd/config_file.c
@@ -4692,6 +4692,8 @@ static int hostapd_config_fill(struct ho @@ -4685,6 +4685,8 @@ static int hostapd_config_fill(struct ho
} }
bss->mka_psk_set |= MKA_PSK_SET_CKN; bss->mka_psk_set |= MKA_PSK_SET_CKN;
#endif /* CONFIG_MACSEC */ #endif /* CONFIG_MACSEC */
@@ -11,7 +11,7 @@
} else if (os_strcmp(buf, "disable_11ac") == 0) { } else if (os_strcmp(buf, "disable_11ac") == 0) {
--- a/src/ap/ap_config.h --- a/src/ap/ap_config.h
+++ b/src/ap/ap_config.h +++ b/src/ap/ap_config.h
@@ -1027,6 +1027,8 @@ struct hostapd_config { @@ -1025,6 +1025,8 @@ struct hostapd_config {
u8 vht_oper_centr_freq_seg1_idx; u8 vht_oper_centr_freq_seg1_idx;
u8 ht40_plus_minus_allowed; u8 ht40_plus_minus_allowed;
@@ -49,7 +49,7 @@
void hostapd_reconfig_encryption(struct hostapd_data *hapd) void hostapd_reconfig_encryption(struct hostapd_data *hapd)
{ {
if (hapd->wpa_auth) if (hapd->wpa_auth)
@@ -1223,6 +1243,13 @@ int hostapd_setup_bss(struct hostapd_dat @@ -1162,6 +1182,13 @@ int hostapd_setup_bss(struct hostapd_dat
if (!first || first == -1) { if (!first || first == -1) {
u8 *addr = hapd->own_addr; u8 *addr = hapd->own_addr;
@@ -63,7 +63,7 @@
if (!is_zero_ether_addr(conf->bssid)) { if (!is_zero_ether_addr(conf->bssid)) {
/* Allocate the configured BSSID. */ /* Allocate the configured BSSID. */
@@ -1250,7 +1277,7 @@ int hostapd_setup_bss(struct hostapd_dat @@ -1189,7 +1216,7 @@ int hostapd_setup_bss(struct hostapd_dat
conf->iface, addr, hapd, conf->iface, addr, hapd,
&hapd->drv_priv, force_ifname, if_addr, &hapd->drv_priv, force_ifname, if_addr,
conf->bridge[0] ? conf->bridge : NULL, conf->bridge[0] ? conf->bridge : NULL,
@@ -74,15 +74,15 @@
hapd->interface_added = 0; hapd->interface_added = 0;
--- a/src/ap/hostapd.h --- a/src/ap/hostapd.h
+++ b/src/ap/hostapd.h +++ b/src/ap/hostapd.h
@@ -629,6 +629,8 @@ struct hostapd_iface { @@ -628,6 +628,8 @@ struct hostapd_iface {
int hostapd_for_each_interface(struct hapd_interfaces *interfaces, int hostapd_for_each_interface(struct hapd_interfaces *interfaces,
int (*cb)(struct hostapd_iface *iface, int (*cb)(struct hostapd_iface *iface,
void *ctx), void *ctx); void *ctx), void *ctx);
+int hostapd_get_bss_index(struct hostapd_data *hapd); +int hostapd_get_bss_index(struct hostapd_data *hapd);
+struct hostapd_data * hostapd_get_primary_bss(struct hostapd_data *hapd); +struct hostapd_data * hostapd_get_primary_bss(struct hostapd_data *hapd);
int hostapd_reload_config(struct hostapd_iface *iface, int reconf); int hostapd_reload_config(struct hostapd_iface *iface);
void hostapd_reload_bss(struct hostapd_data *hapd); void hostapd_reconfig_encryption(struct hostapd_data *hapd);
void hostapd_bss_deinit(struct hostapd_data *hapd); struct hostapd_data *
--- a/src/ap/ap_drv_ops.c --- a/src/ap/ap_drv_ops.c
+++ b/src/ap/ap_drv_ops.c +++ b/src/ap/ap_drv_ops.c
@@ -321,7 +321,7 @@ int hostapd_vlan_if_add(struct hostapd_d @@ -321,7 +321,7 @@ int hostapd_vlan_if_add(struct hostapd_d
@@ -193,7 +193,7 @@
#ifdef CONFIG_FILS #ifdef CONFIG_FILS
os_free(params->fd_frame_tmpl); os_free(params->fd_frame_tmpl);
params->fd_frame_tmpl = NULL; params->fd_frame_tmpl = NULL;
@@ -1804,6 +1818,22 @@ int ieee802_11_set_beacon(struct hostapd @@ -1809,6 +1823,22 @@ int ieee802_11_set_beacon(struct hostapd
params.unsol_bcast_probe_resp_tmpl = params.unsol_bcast_probe_resp_tmpl =
hostapd_unsol_bcast_probe_resp(hapd, &params); hostapd_unsol_bcast_probe_resp(hapd, &params);
#endif /* CONFIG_IEEE80211AX */ #endif /* CONFIG_IEEE80211AX */
@@ -320,7 +320,7 @@
ret = send_and_recv_msgs_owner(drv, msg, get_connect_handle(bss), 1, ret = send_and_recv_msgs_owner(drv, msg, get_connect_handle(bss), 1,
NULL, NULL, NULL, NULL); NULL, NULL, NULL, NULL);
if (ret) { if (ret) {
@@ -5405,13 +5426,13 @@ const char * nl80211_iftype_str(enum nl8 @@ -5402,13 +5423,13 @@ const char * nl80211_iftype_str(enum nl8
} }
} }
@@ -336,7 +336,7 @@
{ {
struct nl_msg *msg; struct nl_msg *msg;
int ifidx; int ifidx;
@@ -5440,6 +5461,17 @@ static int nl80211_create_iface_once(str @@ -5437,6 +5458,17 @@ static int nl80211_create_iface_once(str
goto fail; goto fail;
} }
@@ -354,7 +354,7 @@
/* /*
* Tell cfg80211 that the interface belongs to the socket that created * Tell cfg80211 that the interface belongs to the socket that created
* it, and the interface should be deleted when the socket is closed. * it, and the interface should be deleted when the socket is closed.
@@ -5497,12 +5529,15 @@ int nl80211_create_iface(struct wpa_driv @@ -5494,12 +5526,15 @@ int nl80211_create_iface(struct wpa_driv
const char *ifname, enum nl80211_iftype iftype, const char *ifname, enum nl80211_iftype iftype,
const u8 *addr, int wds, const u8 *addr, int wds,
int (*handler)(struct nl_msg *, void *), int (*handler)(struct nl_msg *, void *),
@@ -372,7 +372,7 @@
/* if error occurred and interface exists already */ /* if error occurred and interface exists already */
if (ret == -ENFILE && if_nametoindex(ifname)) { if (ret == -ENFILE && if_nametoindex(ifname)) {
@@ -5528,7 +5563,9 @@ int nl80211_create_iface(struct wpa_driv @@ -5525,7 +5560,9 @@ int nl80211_create_iface(struct wpa_driv
/* Try to create the interface again */ /* Try to create the interface again */
ret = nl80211_create_iface_once(drv, ifname, iftype, addr, ret = nl80211_create_iface_once(drv, ifname, iftype, addr,
@@ -383,7 +383,7 @@
} }
if (ret >= 0 && is_p2p_net_interface(iftype)) { if (ret >= 0 && is_p2p_net_interface(iftype)) {
@@ -7529,7 +7566,7 @@ static int i802_set_wds_sta(void *priv, @@ -7526,7 +7563,7 @@ static int i802_set_wds_sta(void *priv,
if (!if_nametoindex(name)) { if (!if_nametoindex(name)) {
if (nl80211_create_iface(drv, name, if (nl80211_create_iface(drv, name,
NL80211_IFTYPE_AP_VLAN, NL80211_IFTYPE_AP_VLAN,
@@ -392,7 +392,7 @@
0) 0)
return -1; return -1;
if (bridge_ifname && if (bridge_ifname &&
@@ -7874,7 +7911,9 @@ static int wpa_driver_nl80211_if_add(voi @@ -7871,7 +7908,9 @@ static int wpa_driver_nl80211_if_add(voi
void *bss_ctx, void **drv_priv, void *bss_ctx, void **drv_priv,
char *force_ifname, u8 *if_addr, char *force_ifname, u8 *if_addr,
const char *bridge, int use_existing, const char *bridge, int use_existing,
@@ -403,7 +403,7 @@
{ {
enum nl80211_iftype nlmode; enum nl80211_iftype nlmode;
struct i802_bss *bss = priv; struct i802_bss *bss = priv;
@@ -7891,7 +7930,8 @@ static int wpa_driver_nl80211_if_add(voi @@ -7888,7 +7927,8 @@ static int wpa_driver_nl80211_if_add(voi
os_memset(&p2pdev_info, 0, sizeof(p2pdev_info)); os_memset(&p2pdev_info, 0, sizeof(p2pdev_info));
ifidx = nl80211_create_iface(drv, ifname, nlmode, addr, ifidx = nl80211_create_iface(drv, ifname, nlmode, addr,
0, nl80211_wdev_handler, 0, nl80211_wdev_handler,
@@ -413,7 +413,7 @@
if (!p2pdev_info.wdev_id_set || ifidx != 0) { if (!p2pdev_info.wdev_id_set || ifidx != 0) {
wpa_printf(MSG_ERROR, "nl80211: Failed to create a P2P Device interface %s", wpa_printf(MSG_ERROR, "nl80211: Failed to create a P2P Device interface %s",
ifname); ifname);
@@ -7907,7 +7947,9 @@ static int wpa_driver_nl80211_if_add(voi @@ -7904,7 +7944,9 @@ static int wpa_driver_nl80211_if_add(voi
(long long unsigned int) p2pdev_info.wdev_id); (long long unsigned int) p2pdev_info.wdev_id);
} else { } else {
ifidx = nl80211_create_iface(drv, ifname, nlmode, addr, ifidx = nl80211_create_iface(drv, ifname, nlmode, addr,

View File

@@ -45,7 +45,7 @@ Signed-off-by: John Crispin <john@phrozen.org>
#include "common/ieee802_11_defs.h" #include "common/ieee802_11_defs.h"
#include "common/wpa_ctrl.h" #include "common/wpa_ctrl.h"
#include "common/hw_features_common.h" #include "common/hw_features_common.h"
@@ -1356,12 +1355,6 @@ int hostapd_setup_bss(struct hostapd_dat @@ -1295,12 +1294,6 @@ int hostapd_setup_bss(struct hostapd_dat
os_memcpy(conf->ssid.ssid, ssid, conf->ssid.ssid_len); os_memcpy(conf->ssid.ssid, ssid, conf->ssid.ssid_len);
} }

View File

@@ -18,7 +18,7 @@ Signed-off-by: John Crispin <john@phrozen.org>
--- a/hostapd/ctrl_iface.c --- a/hostapd/ctrl_iface.c
+++ b/hostapd/ctrl_iface.c +++ b/hostapd/ctrl_iface.c
@@ -3157,6 +3157,7 @@ static int hostapd_ctrl_iface_set_neighb @@ -3095,6 +3095,7 @@ static int hostapd_ctrl_iface_set_neighb
u8 bssid[ETH_ALEN]; u8 bssid[ETH_ALEN];
struct wpabuf *nr, *lci = NULL, *civic = NULL; struct wpabuf *nr, *lci = NULL, *civic = NULL;
int stationary = 0; int stationary = 0;
@@ -26,7 +26,7 @@ Signed-off-by: John Crispin <john@phrozen.org>
char *tmp; char *tmp;
int ret; int ret;
@@ -3241,9 +3242,22 @@ static int hostapd_ctrl_iface_set_neighb @@ -3179,9 +3180,22 @@ static int hostapd_ctrl_iface_set_neighb
if (os_strstr(buf, "stat")) if (os_strstr(buf, "stat"))
stationary = 1; stationary = 1;

View File

@@ -21,7 +21,7 @@ Signed-off-by: Pradeep Kumar Chitrapu <pradeepc@codeaurora.org>
--- a/hostapd/config_file.c --- a/hostapd/config_file.c
+++ b/hostapd/config_file.c +++ b/hostapd/config_file.c
@@ -4701,6 +4701,8 @@ static int hostapd_config_fill(struct ho @@ -4694,6 +4694,8 @@ static int hostapd_config_fill(struct ho
#endif /* CONFIG_MACSEC */ #endif /* CONFIG_MACSEC */
} else if (os_strcmp(buf, "multiple_bssid") == 0) { } else if (os_strcmp(buf, "multiple_bssid") == 0) {
conf->multiple_bssid = atoi(pos); conf->multiple_bssid = atoi(pos);
@@ -49,9 +49,9 @@ Signed-off-by: Pradeep Kumar Chitrapu <pradeepc@codeaurora.org>
unsigned int unsol_bcast_probe_resp_interval; unsigned int unsol_bcast_probe_resp_interval;
+ u8 rnr_beacon; + u8 rnr_beacon;
char *config_id;
}; };
/**
--- a/src/ap/beacon.c --- a/src/ap/beacon.c
+++ b/src/ap/beacon.c +++ b/src/ap/beacon.c
@@ -1469,6 +1469,7 @@ int ieee802_11_build_ap_params(struct ho @@ -1469,6 +1469,7 @@ int ieee802_11_build_ap_params(struct ho

View File

@@ -15,7 +15,7 @@
ifmsh->conf = conf; ifmsh->conf = conf;
--- a/wpa_supplicant/wpa_supplicant.c --- a/wpa_supplicant/wpa_supplicant.c
+++ b/wpa_supplicant/wpa_supplicant.c +++ b/wpa_supplicant/wpa_supplicant.c
@@ -2440,7 +2440,9 @@ void ibss_mesh_setup_freq(struct wpa_sup @@ -2387,7 +2387,9 @@ void ibss_mesh_setup_freq(struct wpa_sup
struct hostapd_hw_modes *mode = NULL; struct hostapd_hw_modes *mode = NULL;
int ht40plus[] = { 1, 2, 3, 4, 5, 6, 36, 44, 52, 60, 100, 108, 116, 124, 132, 149, 157, int ht40plus[] = { 1, 2, 3, 4, 5, 6, 36, 44, 52, 60, 100, 108, 116, 124, 132, 149, 157,
184, 192 }; 184, 192 };
@@ -26,7 +26,7 @@
struct hostapd_channel_data *pri_chan = NULL, *sec_chan = NULL; struct hostapd_channel_data *pri_chan = NULL, *sec_chan = NULL;
u8 channel; u8 channel;
int i, chan_idx, ht40 = -1, res, obss_scan = !(ssid->noscan); int i, chan_idx, ht40 = -1, res, obss_scan = !(ssid->noscan);
@@ -2448,7 +2450,7 @@ void ibss_mesh_setup_freq(struct wpa_sup @@ -2395,7 +2397,7 @@ void ibss_mesh_setup_freq(struct wpa_sup
struct hostapd_freq_params vht_freq; struct hostapd_freq_params vht_freq;
int chwidth, seg0, seg1; int chwidth, seg0, seg1;
u32 vht_caps = 0; u32 vht_caps = 0;
@@ -35,7 +35,7 @@
int dfs_enabled = wpa_s->conf->country[0] && int dfs_enabled = wpa_s->conf->country[0] &&
(wpa_s->drv_flags & WPA_DRIVER_FLAGS_RADAR); (wpa_s->drv_flags & WPA_DRIVER_FLAGS_RADAR);
@@ -2506,9 +2508,16 @@ void ibss_mesh_setup_freq(struct wpa_sup @@ -2453,9 +2455,16 @@ void ibss_mesh_setup_freq(struct wpa_sup
freq->channel = channel; freq->channel = channel;
@@ -52,7 +52,7 @@
#ifdef CONFIG_HT_OVERRIDES #ifdef CONFIG_HT_OVERRIDES
if (ssid->disable_ht) { if (ssid->disable_ht) {
freq->ht_enabled = 0; freq->ht_enabled = 0;
@@ -2645,8 +2654,6 @@ skip_ht40: @@ -2592,8 +2601,6 @@ skip_ht40:
!(wpa_s->drv_flags & WPA_DRIVER_FLAGS_VHT_IBSS)) !(wpa_s->drv_flags & WPA_DRIVER_FLAGS_VHT_IBSS))
return; return;
@@ -61,7 +61,7 @@
#ifdef CONFIG_VHT_OVERRIDES #ifdef CONFIG_VHT_OVERRIDES
if (ssid->disable_vht) { if (ssid->disable_vht) {
freq->vht_enabled = 0; freq->vht_enabled = 0;
@@ -2654,12 +2661,16 @@ skip_ht40: @@ -2601,12 +2608,16 @@ skip_ht40:
} }
#endif /* CONFIG_VHT_OVERRIDES */ #endif /* CONFIG_VHT_OVERRIDES */
@@ -80,7 +80,7 @@
#ifdef CONFIG_HE_OVERRIDES #ifdef CONFIG_HE_OVERRIDES
if (is_24ghz) if (is_24ghz)
@@ -2667,16 +2678,14 @@ skip_ht40: @@ -2614,16 +2625,14 @@ skip_ht40:
#endif /* CONFIG_HE_OVERRIDES */ #endif /* CONFIG_HE_OVERRIDES */
/* setup center_freq1, bandwidth */ /* setup center_freq1, bandwidth */
@@ -101,7 +101,7 @@
struct hostapd_channel_data *chan; struct hostapd_channel_data *chan;
chan = hw_get_channel_chan(mode, i, NULL); chan = hw_get_channel_chan(mode, i, NULL);
@@ -2692,16 +2701,20 @@ skip_ht40: @@ -2639,16 +2648,20 @@ skip_ht40:
} }
chwidth = CHANWIDTH_80MHZ; chwidth = CHANWIDTH_80MHZ;
@@ -126,7 +126,7 @@
struct hostapd_channel_data *chan; struct hostapd_channel_data *chan;
chan = hw_get_channel_chan(mode, i, NULL); chan = hw_get_channel_chan(mode, i, NULL);
@@ -2717,9 +2730,10 @@ skip_ht40: @@ -2664,9 +2677,10 @@ skip_ht40:
/* Found a suitable second segment for 80+80 */ /* Found a suitable second segment for 80+80 */
chwidth = CHANWIDTH_80P80MHZ; chwidth = CHANWIDTH_80P80MHZ;
@@ -140,7 +140,7 @@
} }
if (chwidth == CHANWIDTH_80P80MHZ) if (chwidth == CHANWIDTH_80P80MHZ)
@@ -2737,7 +2751,7 @@ skip_ht40: @@ -2684,7 +2698,7 @@ skip_ht40:
} }
} else if (ssid->max_oper_chwidth == CHANWIDTH_USE_HT) { } else if (ssid->max_oper_chwidth == CHANWIDTH_USE_HT) {
chwidth = CHANWIDTH_USE_HT; chwidth = CHANWIDTH_USE_HT;

View File

@@ -1,6 +1,6 @@
--- a/wpa_supplicant/wpa_supplicant.c --- a/wpa_supplicant/wpa_supplicant.c
+++ b/wpa_supplicant/wpa_supplicant.c +++ b/wpa_supplicant/wpa_supplicant.c
@@ -2430,6 +2430,22 @@ static int drv_supports_vht(struct wpa_s @@ -2377,6 +2377,22 @@ static int drv_supports_vht(struct wpa_s
return mode->vht_capab != 0; return mode->vht_capab != 0;
} }
@@ -23,7 +23,7 @@
void ibss_mesh_setup_freq(struct wpa_supplicant *wpa_s, void ibss_mesh_setup_freq(struct wpa_supplicant *wpa_s,
const struct wpa_ssid *ssid, const struct wpa_ssid *ssid,
@@ -2443,6 +2459,7 @@ void ibss_mesh_setup_freq(struct wpa_sup @@ -2390,6 +2406,7 @@ void ibss_mesh_setup_freq(struct wpa_sup
unsigned int bw80[] = { 5180, 5260, 5500, 5580, 5660, 5745, 5955, unsigned int bw80[] = { 5180, 5260, 5500, 5580, 5660, 5745, 5955,
6035, 6115, 6195, 6275, 6355, 6435, 6515, 6035, 6115, 6195, 6275, 6355, 6435, 6515,
6595, 6675, 6755, 6835, 6915, 6995 }; 6595, 6675, 6755, 6835, 6915, 6995 };
@@ -31,7 +31,7 @@
struct hostapd_channel_data *pri_chan = NULL, *sec_chan = NULL; struct hostapd_channel_data *pri_chan = NULL, *sec_chan = NULL;
u8 channel; u8 channel;
int i, chan_idx, ht40 = -1, res, obss_scan = !(ssid->noscan); int i, chan_idx, ht40 = -1, res, obss_scan = !(ssid->noscan);
@@ -2685,25 +2702,34 @@ skip_to_6ghz: @@ -2632,25 +2649,34 @@ skip_to_6ghz:
if (j == ARRAY_SIZE(bw80)) if (j == ARRAY_SIZE(bw80))
return; return;

View File

@@ -97,7 +97,7 @@ Signed-off-by: Aloka Dixit <alokad@codeaurora.org>
return 0; return 0;
} }
@@ -1820,22 +1846,6 @@ int ieee802_11_set_beacon(struct hostapd @@ -1825,22 +1851,6 @@ int ieee802_11_set_beacon(struct hostapd
params.unsol_bcast_probe_resp_tmpl = params.unsol_bcast_probe_resp_tmpl =
hostapd_unsol_bcast_probe_resp(hapd, &params); hostapd_unsol_bcast_probe_resp(hapd, &params);
#endif /* CONFIG_IEEE80211AX */ #endif /* CONFIG_IEEE80211AX */

View File

@@ -25,7 +25,7 @@ Signed-off-by: Aloka Dixit <alokad@codeaurora.org>
--- a/hostapd/config_file.c --- a/hostapd/config_file.c
+++ b/hostapd/config_file.c +++ b/hostapd/config_file.c
@@ -4701,6 +4701,8 @@ static int hostapd_config_fill(struct ho @@ -4694,6 +4694,8 @@ static int hostapd_config_fill(struct ho
#endif /* CONFIG_MACSEC */ #endif /* CONFIG_MACSEC */
} else if (os_strcmp(buf, "multiple_bssid") == 0) { } else if (os_strcmp(buf, "multiple_bssid") == 0) {
conf->multiple_bssid = atoi(pos); conf->multiple_bssid = atoi(pos);
@@ -36,7 +36,7 @@ Signed-off-by: Aloka Dixit <alokad@codeaurora.org>
} else if (os_strcmp(buf, "disable_11n") == 0) { } else if (os_strcmp(buf, "disable_11n") == 0) {
--- a/src/ap/ap_config.c --- a/src/ap/ap_config.c
+++ b/src/ap/ap_config.c +++ b/src/ap/ap_config.c
@@ -1489,6 +1489,12 @@ int hostapd_config_check(struct hostapd_ @@ -1487,6 +1487,12 @@ int hostapd_config_check(struct hostapd_
return -1; return -1;
} }
@@ -51,7 +51,7 @@ Signed-off-by: Aloka Dixit <alokad@codeaurora.org>
return -1; return -1;
--- a/src/ap/ap_config.h --- a/src/ap/ap_config.h
+++ b/src/ap/ap_config.h +++ b/src/ap/ap_config.h
@@ -1029,6 +1029,7 @@ struct hostapd_config { @@ -1027,6 +1027,7 @@ struct hostapd_config {
u8 ht40_plus_minus_allowed; u8 ht40_plus_minus_allowed;
u8 multiple_bssid; u8 multiple_bssid;

View File

@@ -43,7 +43,7 @@ Signed-off-by: Aloka Dixit <alokad@codeaurora.org>
return 0; return 0;
--- a/src/ap/hostapd.c --- a/src/ap/hostapd.c
+++ b/src/ap/hostapd.c +++ b/src/ap/hostapd.c
@@ -1203,11 +1203,52 @@ static int db_table_create_radius_attrib @@ -1142,11 +1142,52 @@ static int db_table_create_radius_attrib
#endif /* CONFIG_NO_RADIUS */ #endif /* CONFIG_NO_RADIUS */
@@ -96,7 +96,7 @@ Signed-off-by: Aloka Dixit <alokad@codeaurora.org>
* *
* This function is used to initialize all per-BSS data structures and * This function is used to initialize all per-BSS data structures and
* resources. This gets called in a loop for each BSS when an interface is * resources. This gets called in a loop for each BSS when an interface is
@@ -1503,32 +1544,8 @@ int hostapd_setup_bss(struct hostapd_dat @@ -1442,32 +1483,8 @@ int hostapd_setup_bss(struct hostapd_dat
return -1; return -1;
} }
@@ -131,7 +131,7 @@ Signed-off-by: Aloka Dixit <alokad@codeaurora.org>
return 0; return 0;
} }
@@ -2223,7 +2240,8 @@ static int hostapd_setup_interface_compl @@ -2162,7 +2179,8 @@ static int hostapd_setup_interface_compl
hapd = iface->bss[j]; hapd = iface->bss[j];
if (j) if (j)
os_memcpy(hapd->own_addr, prev_addr, ETH_ALEN); os_memcpy(hapd->own_addr, prev_addr, ETH_ALEN);
@@ -141,7 +141,7 @@ Signed-off-by: Aloka Dixit <alokad@codeaurora.org>
for (;;) { for (;;) {
hapd = iface->bss[j]; hapd = iface->bss[j];
hostapd_bss_deinit_no_free(hapd); hostapd_bss_deinit_no_free(hapd);
@@ -2237,6 +2255,24 @@ static int hostapd_setup_interface_compl @@ -2176,6 +2194,24 @@ static int hostapd_setup_interface_compl
if (is_zero_ether_addr(hapd->conf->bssid)) if (is_zero_ether_addr(hapd->conf->bssid))
prev_addr = hapd->own_addr; prev_addr = hapd->own_addr;
} }
@@ -166,7 +166,7 @@ Signed-off-by: Aloka Dixit <alokad@codeaurora.org>
hapd = iface->bss[0]; hapd = iface->bss[0];
hostapd_tx_queue_params(iface); hostapd_tx_queue_params(iface);
@@ -3123,7 +3159,7 @@ int hostapd_add_iface(struct hapd_interf @@ -3058,7 +3094,7 @@ int hostapd_add_iface(struct hapd_interf
if (start_ctrl_iface_bss(hapd) < 0 || if (start_ctrl_iface_bss(hapd) < 0 ||
(hapd_iface->state == HAPD_IFACE_ENABLED && (hapd_iface->state == HAPD_IFACE_ENABLED &&

View File

@@ -15,7 +15,7 @@ Signed-off-by: John Crispin <john@phrozen.org>
--- a/hostapd/config_file.c --- a/hostapd/config_file.c
+++ b/hostapd/config_file.c +++ b/hostapd/config_file.c
@@ -3671,6 +3671,8 @@ static int hostapd_config_fill(struct ho @@ -3664,6 +3664,8 @@ static int hostapd_config_fill(struct ho
return 1; return 1;
} }
bss->unsol_bcast_probe_resp_interval = val; bss->unsol_bcast_probe_resp_interval = val;
@@ -38,7 +38,7 @@ Signed-off-by: John Crispin <john@phrozen.org>
# ieee80211n: Whether IEEE 802.11n (HT) is enabled # ieee80211n: Whether IEEE 802.11n (HT) is enabled
--- a/src/ap/ap_config.h --- a/src/ap/ap_config.h
+++ b/src/ap/ap_config.h +++ b/src/ap/ap_config.h
@@ -1078,6 +1078,7 @@ struct hostapd_config { @@ -1076,6 +1076,7 @@ struct hostapd_config {
u8 he_6ghz_max_ampdu_len_exp; u8 he_6ghz_max_ampdu_len_exp;
u8 he_6ghz_rx_ant_pat; u8 he_6ghz_rx_ant_pat;
u8 he_6ghz_tx_ant_pat; u8 he_6ghz_tx_ant_pat;

View File

@@ -47,7 +47,7 @@ Signed-off-by: John Crispin <john@phrozen.org>
int hostapd_for_each_interface(struct hapd_interfaces *interfaces, int hostapd_for_each_interface(struct hapd_interfaces *interfaces,
@@ -568,6 +570,9 @@ void hostapd_free_hapd_data(struct hosta @@ -507,6 +509,9 @@ void hostapd_free_hapd_data(struct hosta
} }
eloop_cancel_timeout(auth_sae_process_commit, hapd, NULL); eloop_cancel_timeout(auth_sae_process_commit, hapd, NULL);
#endif /* CONFIG_SAE */ #endif /* CONFIG_SAE */
@@ -57,7 +57,7 @@ Signed-off-by: John Crispin <john@phrozen.org>
} }
@@ -3850,6 +3855,119 @@ hostapd_switch_channel_fallback(struct h @@ -3785,6 +3790,119 @@ hostapd_switch_channel_fallback(struct h
hostapd_enable_iface(iface); hostapd_enable_iface(iface);
} }
@@ -179,7 +179,7 @@ Signed-off-by: John Crispin <john@phrozen.org>
--- a/src/ap/hostapd.h --- a/src/ap/hostapd.h
+++ b/src/ap/hostapd.h +++ b/src/ap/hostapd.h
@@ -321,6 +321,16 @@ struct hostapd_data { @@ -320,6 +320,16 @@ struct hostapd_data {
unsigned int cs_c_off_ecsa_beacon; unsigned int cs_c_off_ecsa_beacon;
unsigned int cs_c_off_ecsa_proberesp; unsigned int cs_c_off_ecsa_proberesp;
@@ -196,7 +196,7 @@ Signed-off-by: John Crispin <john@phrozen.org>
#ifdef CONFIG_P2P #ifdef CONFIG_P2P
struct p2p_data *p2p; struct p2p_data *p2p;
struct p2p_group *p2p_group; struct p2p_group *p2p_group;
@@ -681,6 +691,12 @@ int hostapd_owe_trans_get_info(struct ho @@ -679,6 +689,12 @@ int hostapd_owe_trans_get_info(struct ho
void hostapd_ocv_check_csa_sa_query(void *eloop_ctx, void *timeout_ctx); void hostapd_ocv_check_csa_sa_query(void *eloop_ctx, void *timeout_ctx);
int hostapd_check_max_sta(struct hostapd_data *hapd); int hostapd_check_max_sta(struct hostapd_data *hapd);

View File

@@ -168,7 +168,7 @@ Signed-off-by: Nishant Pandey <nishpand@codeaurora.org>
#endif /* CONFIG_FILE_H */ #endif /* CONFIG_FILE_H */
--- a/hostapd/ctrl_iface.c --- a/hostapd/ctrl_iface.c
+++ b/hostapd/ctrl_iface.c +++ b/hostapd/ctrl_iface.c
@@ -1420,42 +1420,6 @@ static int hostapd_ctrl_iface_get_config @@ -1363,42 +1363,6 @@ static int hostapd_ctrl_iface_get_config
} }
@@ -211,7 +211,7 @@ Signed-off-by: Nishant Pandey <nishpand@codeaurora.org>
static int hostapd_ctrl_iface_set_band(struct hostapd_data *hapd, static int hostapd_ctrl_iface_set_band(struct hostapd_data *hapd,
const char *bands) const char *bands)
@@ -3435,81 +3399,6 @@ static int hostapd_ctrl_driver_flags2(st @@ -3373,81 +3337,6 @@ static int hostapd_ctrl_driver_flags2(st
return pos - buf; return pos - buf;
} }

View File

@@ -81,7 +81,7 @@ Signed-off-by: Nishant Pandey <nishpand@codeaurora.org>
#include "uuid.h" #include "uuid.h"
#include "common/ieee802_1x_defs.h" #include "common/ieee802_1x_defs.h"
#include "p2p/p2p.h" #include "p2p/p2p.h"
@@ -818,6 +821,9 @@ static void wpa_config_write_network(FIL @@ -823,6 +826,9 @@ static void wpa_config_write_network(FIL
write_int(f, "mac_addr", ssid->mac_addr, -1); write_int(f, "mac_addr", ssid->mac_addr, -1);
#ifdef CONFIG_MESH #ifdef CONFIG_MESH
STR(mesh_basic_rates); STR(mesh_basic_rates);

View File

@@ -15,7 +15,7 @@ Signed-off-by: John Crispin <john@phrozen.org>
--- a/src/drivers/driver_nl80211.c --- a/src/drivers/driver_nl80211.c
+++ b/src/drivers/driver_nl80211.c +++ b/src/drivers/driver_nl80211.c
@@ -9961,6 +9961,82 @@ error: @@ -9958,6 +9958,82 @@ error:
} }
@@ -98,7 +98,7 @@ Signed-off-by: John Crispin <john@phrozen.org>
static int nl80211_add_ts(void *priv, u8 tsid, const u8 *addr, static int nl80211_add_ts(void *priv, u8 tsid, const u8 *addr,
u8 user_priority, u16 admitted_time) u8 user_priority, u16 admitted_time)
{ {
@@ -12121,6 +12197,9 @@ const struct wpa_driver_ops wpa_driver_n @@ -12118,6 +12194,9 @@ const struct wpa_driver_ops wpa_driver_n
.get_survey = wpa_driver_nl80211_get_survey, .get_survey = wpa_driver_nl80211_get_survey,
.status = wpa_driver_nl80211_status, .status = wpa_driver_nl80211_status,
.switch_channel = nl80211_switch_channel, .switch_channel = nl80211_switch_channel,

View File

@@ -153,7 +153,7 @@ Signed-off-by: John Crispin <john@phrozen.org>
default: default:
return "NL80211_CMD_UNKNOWN"; return "NL80211_CMD_UNKNOWN";
} }
@@ -2745,6 +2748,51 @@ static void nl80211_control_port_frame(s @@ -2746,6 +2749,51 @@ static void nl80211_control_port_frame(s
} }
} }
@@ -205,7 +205,7 @@ Signed-off-by: John Crispin <john@phrozen.org>
static void static void
nl80211_control_port_frame_tx_status(struct wpa_driver_nl80211_data *drv, nl80211_control_port_frame_tx_status(struct wpa_driver_nl80211_data *drv,
@@ -3019,6 +3067,20 @@ static void do_process_drv_event(struct @@ -3020,6 +3068,20 @@ static void do_process_drv_event(struct
case NL80211_CMD_UPDATE_HE_MUEDCA_PARAMS: case NL80211_CMD_UPDATE_HE_MUEDCA_PARAMS:
nl80211_update_muedca_params_event(drv, tb); nl80211_update_muedca_params_event(drv, tb);
break; break;

View File

@@ -14,7 +14,7 @@ Signed-off-by: John Crispin <john@phrozen.org>
--- a/hostapd/config_file.c --- a/hostapd/config_file.c
+++ b/hostapd/config_file.c +++ b/hostapd/config_file.c
@@ -3412,8 +3412,11 @@ static int hostapd_config_fill(struct ho @@ -3405,8 +3405,11 @@ static int hostapd_config_fill(struct ho
} else if (os_strcmp(buf, "he_ul_mumimo") == 0) { } else if (os_strcmp(buf, "he_ul_mumimo") == 0) {
conf->he_phy_capab.he_ul_mumimo = atoi(pos); conf->he_phy_capab.he_ul_mumimo = atoi(pos);
} else if (os_strcmp(buf, "he_bss_color") == 0) { } else if (os_strcmp(buf, "he_bss_color") == 0) {

View File

@@ -95,7 +95,7 @@ Signed-off-by: Karthikeyan Periyasamy <periyasa@codeaurora.org>
#endif /* AP_LIST_H */ #endif /* AP_LIST_H */
--- a/src/ap/hostapd.c --- a/src/ap/hostapd.c
+++ b/src/ap/hostapd.c +++ b/src/ap/hostapd.c
@@ -3906,6 +3906,7 @@ hostapd_switch_color_timeout_handler(voi @@ -3841,6 +3841,7 @@ hostapd_switch_color_timeout_handler(voi
struct cca_settings settings; struct cca_settings settings;
struct os_time now; struct os_time now;
int i, r, b, ret; int i, r, b, ret;
@@ -103,7 +103,7 @@ Signed-off-by: Karthikeyan Periyasamy <periyasa@codeaurora.org>
if (os_get_time(&now)) if (os_get_time(&now))
return; return;
@@ -3914,11 +3915,16 @@ hostapd_switch_color_timeout_handler(voi @@ -3849,11 +3850,16 @@ hostapd_switch_color_timeout_handler(voi
if (now.sec - hapd->last_color_collision.sec > 50) if (now.sec - hapd->last_color_collision.sec > 50)
return; return;

View File

@@ -1,6 +1,6 @@
--- a/hostapd/ctrl_iface.c --- a/hostapd/ctrl_iface.c
+++ b/hostapd/ctrl_iface.c +++ b/hostapd/ctrl_iface.c
@@ -2679,6 +2679,59 @@ static int hostapd_ctrl_check_freq_param @@ -2622,6 +2622,59 @@ static int hostapd_ctrl_check_freq_param
} }
#endif /* NEED_AP_MLME */ #endif /* NEED_AP_MLME */
@@ -60,7 +60,7 @@
static int hostapd_ctrl_iface_chan_switch(struct hostapd_iface *iface, static int hostapd_ctrl_iface_chan_switch(struct hostapd_iface *iface,
char *pos) char *pos)
@@ -3688,6 +3741,9 @@ static int hostapd_ctrl_iface_receive_pr @@ -3626,6 +3679,9 @@ static int hostapd_ctrl_iface_receive_pr
} else if (os_strncmp(buf, "CHAN_SWITCH ", 12) == 0) { } else if (os_strncmp(buf, "CHAN_SWITCH ", 12) == 0) {
if (hostapd_ctrl_iface_chan_switch(hapd->iface, buf + 12)) if (hostapd_ctrl_iface_chan_switch(hapd->iface, buf + 12))
reply_len = -1; reply_len = -1;
@@ -128,7 +128,7 @@
len += ret; len += ret;
--- a/src/ap/hostapd.c --- a/src/ap/hostapd.c
+++ b/src/ap/hostapd.c +++ b/src/ap/hostapd.c
@@ -3477,7 +3477,7 @@ int hostapd_csa_in_progress(struct hosta @@ -3412,7 +3412,7 @@ int hostapd_csa_in_progress(struct hosta
#ifdef NEED_AP_MLME #ifdef NEED_AP_MLME
@@ -137,7 +137,7 @@
{ {
os_free(beacon->head); os_free(beacon->head);
beacon->head = NULL; beacon->head = NULL;
@@ -3867,7 +3867,7 @@ void hostapd_cleanup_cca_params(struct h @@ -3802,7 +3802,7 @@ void hostapd_cleanup_cca_params(struct h
} }
@@ -148,7 +148,7 @@
struct hostapd_iface *iface = hapd->iface; struct hostapd_iface *iface = hapd->iface;
--- a/src/ap/hostapd.h --- a/src/ap/hostapd.h
+++ b/src/ap/hostapd.h +++ b/src/ap/hostapd.h
@@ -690,11 +690,13 @@ void hostapd_periodic_iface(struct hosta @@ -688,11 +688,13 @@ void hostapd_periodic_iface(struct hosta
int hostapd_owe_trans_get_info(struct hostapd_data *hapd); int hostapd_owe_trans_get_info(struct hostapd_data *hapd);
void hostapd_ocv_check_csa_sa_query(void *eloop_ctx, void *timeout_ctx); void hostapd_ocv_check_csa_sa_query(void *eloop_ctx, void *timeout_ctx);
int hostapd_check_max_sta(struct hostapd_data *hapd); int hostapd_check_max_sta(struct hostapd_data *hapd);

View File

@@ -52,7 +52,7 @@ Signed-off-by: Lavanya Suresh <lavaks@codeaurora.org>
wpa_printf(MSG_DEBUG, "CCA aborted on %s for cca_color: %d", hapd->conf->iface, hapd->cca_color); wpa_printf(MSG_DEBUG, "CCA aborted on %s for cca_color: %d", hapd->conf->iface, hapd->cca_color);
--- a/src/ap/hostapd.c --- a/src/ap/hostapd.c
+++ b/src/ap/hostapd.c +++ b/src/ap/hostapd.c
@@ -3879,12 +3879,18 @@ int hostapd_fill_cca_settings(struct hos @@ -3814,12 +3814,18 @@ int hostapd_fill_cca_settings(struct hos
old_color = iface->conf->he_op.he_bss_color; old_color = iface->conf->he_op.he_bss_color;
iface->conf->he_op.he_bss_color = hapd->cca_color; iface->conf->he_op.he_bss_color = hapd->cca_color;
@@ -75,7 +75,7 @@ Signed-off-by: Lavanya Suresh <lavaks@codeaurora.org>
if (ret) { if (ret) {
--- a/src/ap/hostapd.h --- a/src/ap/hostapd.h
+++ b/src/ap/hostapd.h +++ b/src/ap/hostapd.h
@@ -323,6 +323,7 @@ struct hostapd_data { @@ -322,6 +322,7 @@ struct hostapd_data {
#ifdef CONFIG_IEEE80211AX #ifdef CONFIG_IEEE80211AX
int cca_in_progress; int cca_in_progress;

View File

@@ -15,7 +15,7 @@ Signed-off-by: Lavanya Suresh <lavaks@codeaurora.org>
--- a/src/ap/hostapd.c --- a/src/ap/hostapd.c
+++ b/src/ap/hostapd.c +++ b/src/ap/hostapd.c
@@ -3918,11 +3918,12 @@ hostapd_switch_color_timeout_handler(voi @@ -3853,11 +3853,12 @@ hostapd_switch_color_timeout_handler(voi
return; return;
/* check if there has been a recent collision */ /* check if there has been a recent collision */
@@ -30,7 +30,7 @@ Signed-off-by: Lavanya Suresh <lavaks@codeaurora.org>
r = os_random() % HE_OPERATION_BSS_COLOR_MAX - 1; r = os_random() % HE_OPERATION_BSS_COLOR_MAX - 1;
r++; r++;
@@ -3934,13 +3935,26 @@ hostapd_switch_color_timeout_handler(voi @@ -3869,13 +3870,26 @@ hostapd_switch_color_timeout_handler(voi
} }
if (i == HE_OPERATION_BSS_COLOR_MAX) { if (i == HE_OPERATION_BSS_COLOR_MAX) {
/* there are no free colors so turn bss coloring off */ /* there are no free colors so turn bss coloring off */
@@ -60,7 +60,7 @@ Signed-off-by: Lavanya Suresh <lavaks@codeaurora.org>
--- a/src/ap/hostapd.h --- a/src/ap/hostapd.h
+++ b/src/ap/hostapd.h +++ b/src/ap/hostapd.h
@@ -324,6 +324,7 @@ struct hostapd_data { @@ -323,6 +323,7 @@ struct hostapd_data {
#ifdef CONFIG_IEEE80211AX #ifdef CONFIG_IEEE80211AX
int cca_in_progress; int cca_in_progress;
int cca_zero_count; int cca_zero_count;

View File

@@ -25,7 +25,7 @@ Signed-off-by: John Crispin <john@phrozen.org>
--- a/hostapd/config_file.c --- a/hostapd/config_file.c
+++ b/hostapd/config_file.c +++ b/hostapd/config_file.c
@@ -4591,8 +4591,8 @@ static int hostapd_config_fill(struct ho @@ -4584,8 +4584,8 @@ static int hostapd_config_fill(struct ho
#endif /* CONFIG_MACSEC */ #endif /* CONFIG_MACSEC */
} else if (os_strcmp(buf, "multiple_bssid") == 0) { } else if (os_strcmp(buf, "multiple_bssid") == 0) {
conf->multiple_bssid = atoi(pos); conf->multiple_bssid = atoi(pos);
@@ -38,7 +38,7 @@ Signed-off-by: John Crispin <john@phrozen.org>
} else if (os_strcmp(buf, "disable_11n") == 0) { } else if (os_strcmp(buf, "disable_11n") == 0) {
--- a/hostapd/ctrl_iface.c --- a/hostapd/ctrl_iface.c
+++ b/hostapd/ctrl_iface.c +++ b/hostapd/ctrl_iface.c
@@ -2827,6 +2827,9 @@ static int hostapd_ctrl_iface_chan_switc @@ -2765,6 +2765,9 @@ static int hostapd_ctrl_iface_chan_switc
* submitting multi-BSS CSA requests? */ * submitting multi-BSS CSA requests? */
return ret; return ret;
} }
@@ -50,7 +50,7 @@ Signed-off-by: John Crispin <john@phrozen.org>
return 0; return 0;
--- a/src/ap/ap_config.c --- a/src/ap/ap_config.c
+++ b/src/ap/ap_config.c +++ b/src/ap/ap_config.c
@@ -1489,7 +1489,7 @@ int hostapd_config_check(struct hostapd_ @@ -1487,7 +1487,7 @@ int hostapd_config_check(struct hostapd_
return -1; return -1;
} }
@@ -61,7 +61,7 @@ Signed-off-by: John Crispin <john@phrozen.org>
return -1; return -1;
--- a/src/ap/ap_config.h --- a/src/ap/ap_config.h
+++ b/src/ap/ap_config.h +++ b/src/ap/ap_config.h
@@ -1029,7 +1029,7 @@ struct hostapd_config { @@ -1027,7 +1027,7 @@ struct hostapd_config {
u8 ht40_plus_minus_allowed; u8 ht40_plus_minus_allowed;
u8 multiple_bssid; u8 multiple_bssid;
@@ -200,7 +200,7 @@ Signed-off-by: John Crispin <john@phrozen.org>
} }
if (params->multiple_bssid_ie_len) { if (params->multiple_bssid_ie_len) {
@@ -5461,17 +5471,6 @@ static int nl80211_create_iface_once(str @@ -5458,17 +5468,6 @@ static int nl80211_create_iface_once(str
goto fail; goto fail;
} }

View File

@@ -22,7 +22,7 @@ Signed-off-by: Aloka Dixit <alokad@codeaurora.org>
--- a/hostapd/ctrl_iface.c --- a/hostapd/ctrl_iface.c
+++ b/hostapd/ctrl_iface.c +++ b/hostapd/ctrl_iface.c
@@ -2827,9 +2827,6 @@ static int hostapd_ctrl_iface_chan_switc @@ -2765,9 +2765,6 @@ static int hostapd_ctrl_iface_chan_switc
* submitting multi-BSS CSA requests? */ * submitting multi-BSS CSA requests? */
return ret; return ret;
} }

View File

@@ -14,7 +14,7 @@ Signed-off-by: P Praneesh <ppranees@codeaurora.org>
--- a/wpa_supplicant/wpa_supplicant.c --- a/wpa_supplicant/wpa_supplicant.c
+++ b/wpa_supplicant/wpa_supplicant.c +++ b/wpa_supplicant/wpa_supplicant.c
@@ -2431,6 +2431,57 @@ static int drv_supports_vht(struct wpa_s @@ -2378,6 +2378,57 @@ static int drv_supports_vht(struct wpa_s
return mode->vht_capab != 0; return mode->vht_capab != 0;
} }
@@ -72,7 +72,7 @@ Signed-off-by: P Praneesh <ppranees@codeaurora.org>
static bool ibss_mesh_is_80mhz_avail(int channel, struct hostapd_hw_modes *mode) static bool ibss_mesh_is_80mhz_avail(int channel, struct hostapd_hw_modes *mode)
{ {
int i; int i;
@@ -2555,6 +2606,11 @@ void ibss_mesh_setup_freq(struct wpa_sup @@ -2502,6 +2553,11 @@ void ibss_mesh_setup_freq(struct wpa_sup
else else
#endif /* CONFIG_HE_OVERRIDES */ #endif /* CONFIG_HE_OVERRIDES */
freq->he_enabled = mode->he_capab[ieee80211_mode].he_supported; freq->he_enabled = mode->he_capab[ieee80211_mode].he_supported;
@@ -110,7 +110,7 @@ Signed-off-by: P Praneesh <ppranees@codeaurora.org>
#undef OFFSET #undef OFFSET
--- a/wpa_supplicant/config_file.c --- a/wpa_supplicant/config_file.c
+++ b/wpa_supplicant/config_file.c +++ b/wpa_supplicant/config_file.c
@@ -887,7 +887,7 @@ static void wpa_config_write_network(FIL @@ -892,7 +892,7 @@ static void wpa_config_write_network(FIL
#ifdef CONFIG_HE_OVERRIDES #ifdef CONFIG_HE_OVERRIDES
INT(disable_he); INT(disable_he);
#endif /* CONFIG_HE_OVERRIDES */ #endif /* CONFIG_HE_OVERRIDES */

View File

@@ -25,7 +25,7 @@ Signed-off-by: Lavanya Suresh <lavaks@codeaurora.org>
--- a/src/ap/ap_config.c --- a/src/ap/ap_config.c
+++ b/src/ap/ap_config.c +++ b/src/ap/ap_config.c
@@ -1239,6 +1239,9 @@ static int hostapd_config_check_bss(stru @@ -1237,6 +1237,9 @@ static int hostapd_config_check_bss(stru
} }
#endif /* CONFIG_WEP */ #endif /* CONFIG_WEP */
@@ -37,7 +37,7 @@ Signed-off-by: Lavanya Suresh <lavaks@codeaurora.org>
bss->macaddr_acl != USE_EXTERNAL_RADIUS_AUTH) { bss->macaddr_acl != USE_EXTERNAL_RADIUS_AUTH) {
--- a/src/ap/hostapd.c --- a/src/ap/hostapd.c
+++ b/src/ap/hostapd.c +++ b/src/ap/hostapd.c
@@ -130,7 +130,7 @@ void hostapd_reload_bss(struct hostapd_d @@ -130,7 +130,7 @@ static void hostapd_reload_bss(struct ho
return; return;
if (hapd->conf->wmm_enabled < 0) if (hapd->conf->wmm_enabled < 0)
@@ -46,7 +46,7 @@ Signed-off-by: Lavanya Suresh <lavaks@codeaurora.org>
#ifndef CONFIG_NO_RADIUS #ifndef CONFIG_NO_RADIUS
radius_client_reconfig(hapd->radius, hapd->conf->radius); radius_client_reconfig(hapd->radius, hapd->conf->radius);
@@ -1350,7 +1350,7 @@ int hostapd_setup_bss(struct hostapd_dat @@ -1289,7 +1289,7 @@ int hostapd_setup_bss(struct hostapd_dat
} }
if (conf->wmm_enabled < 0) if (conf->wmm_enabled < 0)

View File

@@ -29,7 +29,7 @@ Signed-off-by: Aloka Dixit <alokad@codeaurora.org>
{ {
struct wpa_driver_ap_params params; struct wpa_driver_ap_params params;
struct hostapd_freq_params freq; struct hostapd_freq_params freq;
@@ -1963,12 +1963,47 @@ int ieee802_11_set_beacon(struct hostapd @@ -1968,12 +1968,47 @@ int ieee802_11_set_beacon(struct hostapd
wpa_printf(MSG_ERROR, "Failed to set beacon parameters"); wpa_printf(MSG_ERROR, "Failed to set beacon parameters");
else else
ret = 0; ret = 0;

View File

@@ -1,6 +1,6 @@
--- a/hostapd/config_file.c --- a/hostapd/config_file.c
+++ b/hostapd/config_file.c +++ b/hostapd/config_file.c
@@ -4601,6 +4601,15 @@ static int hostapd_config_fill(struct ho @@ -4594,6 +4594,15 @@ static int hostapd_config_fill(struct ho
bss->disable_11ac = !!atoi(pos); bss->disable_11ac = !!atoi(pos);
} else if (os_strcmp(buf, "disable_11ax") == 0) { } else if (os_strcmp(buf, "disable_11ax") == 0) {
bss->disable_11ax = !!atoi(pos); bss->disable_11ax = !!atoi(pos);
@@ -23,9 +23,9 @@
unsigned int unsol_bcast_probe_resp_interval; unsigned int unsol_bcast_probe_resp_interval;
u8 rnr_beacon; u8 rnr_beacon;
+ int beacon_tx_mode; + int beacon_tx_mode;
char *config_id;
}; };
/**
--- a/src/ap/beacon.c --- a/src/ap/beacon.c
+++ b/src/ap/beacon.c +++ b/src/ap/beacon.c
@@ -1863,6 +1863,8 @@ int ieee802_11_build_ap_params(struct ho @@ -1863,6 +1863,8 @@ int ieee802_11_build_ap_params(struct ho
@@ -95,7 +95,7 @@
goto fail; goto fail;
if (params->proberesp && params->proberesp_len) { if (params->proberesp && params->proberesp_len) {
wpa_hexdump(MSG_DEBUG, "nl80211: proberesp (offload)", wpa_hexdump(MSG_DEBUG, "nl80211: proberesp (offload)",
@@ -10674,7 +10677,9 @@ static int nl80211_join_mesh(struct i802 @@ -10671,7 +10674,9 @@ static int nl80211_join_mesh(struct i802
nl80211_put_mesh_id(msg, params->meshid, params->meshid_len) || nl80211_put_mesh_id(msg, params->meshid, params->meshid_len) ||
nl80211_put_beacon_int(msg, params->beacon_int) || nl80211_put_beacon_int(msg, params->beacon_int) ||
nl80211_put_mcast_rate(msg, params->mcast_rate) || nl80211_put_mcast_rate(msg, params->mcast_rate) ||
@@ -174,7 +174,7 @@
--- a/wpa_supplicant/config_file.c --- a/wpa_supplicant/config_file.c
+++ b/wpa_supplicant/config_file.c +++ b/wpa_supplicant/config_file.c
@@ -888,6 +888,7 @@ static void wpa_config_write_network(FIL @@ -893,6 +893,7 @@ static void wpa_config_write_network(FIL
INT(disable_he); INT(disable_he);
#endif /* CONFIG_HE_OVERRIDES */ #endif /* CONFIG_HE_OVERRIDES */
INT(disable_40mhz_scan); INT(disable_40mhz_scan);

View File

@@ -25,7 +25,7 @@ Signed-off-by: Muna Sinada <msinada@codeaurora.org>
conf->wmm_ac_params[0] = ac_be; conf->wmm_ac_params[0] = ac_be;
conf->wmm_ac_params[1] = ac_bk; conf->wmm_ac_params[1] = ac_bk;
@@ -1474,7 +1476,7 @@ int hostapd_config_check(struct hostapd_ @@ -1472,7 +1474,7 @@ int hostapd_config_check(struct hostapd_
return -1; return -1;
} }

View File

@@ -18,7 +18,7 @@ Signed-off-by: Pradeep Kumar Chitrapu <pradeepc@codeaurora.org>
--- a/hostapd/config_file.c --- a/hostapd/config_file.c
+++ b/hostapd/config_file.c +++ b/hostapd/config_file.c
@@ -3535,6 +3535,8 @@ static int hostapd_config_fill(struct ho @@ -3528,6 +3528,8 @@ static int hostapd_config_fill(struct ho
line, pos); line, pos);
return 1; return 1;
} }
@@ -45,7 +45,7 @@ Signed-off-by: Pradeep Kumar Chitrapu <pradeepc@codeaurora.org>
# ieee80211n: Whether IEEE 802.11n (HT) is enabled # ieee80211n: Whether IEEE 802.11n (HT) is enabled
--- a/src/ap/ap_config.h --- a/src/ap/ap_config.h
+++ b/src/ap/ap_config.h +++ b/src/ap/ap_config.h
@@ -1081,6 +1081,9 @@ struct hostapd_config { @@ -1079,6 +1079,9 @@ struct hostapd_config {
u8 he_6ghz_rx_ant_pat; u8 he_6ghz_rx_ant_pat;
u8 he_6ghz_tx_ant_pat; u8 he_6ghz_tx_ant_pat;
bool he_co_locate; bool he_co_locate;
@@ -55,7 +55,7 @@ Signed-off-by: Pradeep Kumar Chitrapu <pradeepc@codeaurora.org>
#endif /* CONFIG_IEEE80211AX */ #endif /* CONFIG_IEEE80211AX */
/* VHT enable/disable config from CHAN_SWITCH */ /* VHT enable/disable config from CHAN_SWITCH */
@@ -1110,6 +1113,15 @@ struct hostapd_config { @@ -1108,6 +1111,15 @@ struct hostapd_config {
#endif /* CONFIG_AIRTIME_POLICY */ #endif /* CONFIG_AIRTIME_POLICY */
}; };

View File

@@ -22,7 +22,7 @@ Signed-off-by: Lavanya Suresh <lavaks@codeaurora.org>
--- a/src/ap/ap_config.h --- a/src/ap/ap_config.h
+++ b/src/ap/ap_config.h +++ b/src/ap/ap_config.h
@@ -1083,6 +1083,7 @@ struct hostapd_config { @@ -1081,6 +1081,7 @@ struct hostapd_config {
bool he_co_locate; bool he_co_locate;
#define AP_TYPE_6GHZ_INDOOR_AP 0 #define AP_TYPE_6GHZ_INDOOR_AP 0
#define AP_TYPE_6GHZ_STANDARD_POWER_AP 1 #define AP_TYPE_6GHZ_STANDARD_POWER_AP 1

View File

@@ -11,7 +11,7 @@ Signed-off-by: Tamizh Chelvam <tamizhr@codeaurora.org>
--- a/src/drivers/driver_nl80211.c --- a/src/drivers/driver_nl80211.c
+++ b/src/drivers/driver_nl80211.c +++ b/src/drivers/driver_nl80211.c
@@ -5171,7 +5171,7 @@ static int wpa_driver_nl80211_sta_add(vo @@ -5168,7 +5168,7 @@ static int wpa_driver_nl80211_sta_add(vo
if (params->he_6ghz_capab) { if (params->he_6ghz_capab) {
wpa_hexdump(MSG_DEBUG, " * he_6ghz_capab", wpa_hexdump(MSG_DEBUG, " * he_6ghz_capab",

View File

@@ -11,7 +11,7 @@
--- a/wpa_supplicant/wpa_supplicant.c --- a/wpa_supplicant/wpa_supplicant.c
+++ b/wpa_supplicant/wpa_supplicant.c +++ b/wpa_supplicant/wpa_supplicant.c
@@ -2507,8 +2507,8 @@ void ibss_mesh_setup_freq(struct wpa_sup @@ -2454,8 +2454,8 @@ void ibss_mesh_setup_freq(struct wpa_sup
enum hostapd_hw_mode hw_mode; enum hostapd_hw_mode hw_mode;
struct hostapd_hw_modes *mode = NULL; struct hostapd_hw_modes *mode = NULL;
int ht40plus[] = { 1, 2, 3, 4, 5, 6, 36, 44, 52, 60, 100, 108, 116, 124, 132, 149, 157, int ht40plus[] = { 1, 2, 3, 4, 5, 6, 36, 44, 52, 60, 100, 108, 116, 124, 132, 149, 157,

View File

@@ -11,7 +11,7 @@ Signed-off-by: Hari Chandrakanthan <haric@codeaurora.org>
--- a/hostapd/ctrl_iface.c --- a/hostapd/ctrl_iface.c
+++ b/hostapd/ctrl_iface.c +++ b/hostapd/ctrl_iface.c
@@ -3283,75 +3283,202 @@ set: @@ -3221,75 +3221,202 @@ set:
return ret; return ret;
} }
@@ -262,7 +262,7 @@ Signed-off-by: Hari Chandrakanthan <haric@codeaurora.org>
{ {
struct hostapd_data *hapd = iface->bss[0]; struct hostapd_data *hapd = iface->bss[0];
struct hostapd_hw_modes *mode; struct hostapd_hw_modes *mode;
@@ -3363,11 +3490,12 @@ static int hostapd_ctrl_iface_ht40_allow @@ -3301,11 +3428,12 @@ static int hostapd_ctrl_iface_ht40_allow
&dfs_domain); &dfs_domain);
if (mode->mode != HOSTAPD_MODE_IEEE80211A) if (mode->mode != HOSTAPD_MODE_IEEE80211A)
@@ -277,7 +277,7 @@ Signed-off-by: Hari Chandrakanthan <haric@codeaurora.org>
} }
static int hostapd_ctrl_iface_remove_neighbor(struct hostapd_data *hapd, static int hostapd_ctrl_iface_remove_neighbor(struct hostapd_data *hapd,
@@ -3982,10 +4110,9 @@ static int hostapd_ctrl_iface_receive_pr @@ -3918,10 +4046,9 @@ static int hostapd_ctrl_iface_receive_pr
if (radius_server_dac_request(hapd->radius_srv, buf + 12) < 0) if (radius_server_dac_request(hapd->radius_srv, buf + 12) < 0)
reply_len = -1; reply_len = -1;
#endif /* RADIUS_SERVER */ #endif /* RADIUS_SERVER */

View File

@@ -19,7 +19,7 @@ Signed-off-by: leiwei <leiwei@codeaurora.org>
--- a/hostapd/config_file.c --- a/hostapd/config_file.c
+++ b/hostapd/config_file.c +++ b/hostapd/config_file.c
@@ -4561,6 +4561,16 @@ static int hostapd_config_fill(struct ho @@ -4554,6 +4554,16 @@ static int hostapd_config_fill(struct ho
return 1; return 1;
} }
bss->mka_priority = mka_priority; bss->mka_priority = mka_priority;

View File

@@ -18,7 +18,7 @@ Signed-off-by: Anilkumar Kolli <akolli@codeaurora.org>
--- a/hostapd/ctrl_iface.c --- a/hostapd/ctrl_iface.c
+++ b/hostapd/ctrl_iface.c +++ b/hostapd/ctrl_iface.c
@@ -2591,6 +2591,16 @@ static int hostapd_ctrl_get_pmk(struct h @@ -2534,6 +2534,16 @@ static int hostapd_ctrl_get_pmk(struct h
#ifdef NEED_AP_MLME #ifdef NEED_AP_MLME
static int hostapd_ctrl_check_freq_params(struct hostapd_freq_params *params) static int hostapd_ctrl_check_freq_params(struct hostapd_freq_params *params)
{ {

View File

@@ -16,7 +16,7 @@ Signed-off-by: Karthikeyan Kathirvel <kathirve@codeaurora.org>
--- a/src/drivers/driver_nl80211.c --- a/src/drivers/driver_nl80211.c
+++ b/src/drivers/driver_nl80211.c +++ b/src/drivers/driver_nl80211.c
@@ -4980,7 +4980,7 @@ static int nl80211_put_freq_params(struc @@ -4977,7 +4977,7 @@ static int nl80211_put_freq_params(struc
nla_put_u32(msg, NL80211_ATTR_CENTER_FREQ2, nla_put_u32(msg, NL80211_ATTR_CENTER_FREQ2,
freq->center_freq2))) freq->center_freq2)))
return -ENOBUFS; return -ENOBUFS;

View File

@@ -18,7 +18,7 @@ Signed-off-by: Seevalamuthu Mariappan <seevalam@codeaurora.org>
--- a/hostapd/config_file.c --- a/hostapd/config_file.c
+++ b/hostapd/config_file.c +++ b/hostapd/config_file.c
@@ -3378,6 +3378,8 @@ static int hostapd_config_fill(struct ho @@ -3371,6 +3371,8 @@ static int hostapd_config_fill(struct ho
conf->require_ht = atoi(pos); conf->require_ht = atoi(pos);
} else if (os_strcmp(buf, "obss_interval") == 0) { } else if (os_strcmp(buf, "obss_interval") == 0) {
conf->obss_interval = atoi(pos); conf->obss_interval = atoi(pos);
@@ -29,7 +29,7 @@ Signed-off-by: Seevalamuthu Mariappan <seevalam@codeaurora.org>
conf->ieee80211ac = atoi(pos); conf->ieee80211ac = atoi(pos);
--- a/src/ap/ap_config.h --- a/src/ap/ap_config.h
+++ b/src/ap/ap_config.h +++ b/src/ap/ap_config.h
@@ -1042,6 +1042,7 @@ struct hostapd_config { @@ -1040,6 +1040,7 @@ struct hostapd_config {
/* Use driver-generated interface addresses when adding multiple BSSs */ /* Use driver-generated interface addresses when adding multiple BSSs */
u8 use_driver_iface_addr; u8 use_driver_iface_addr;

View File

@@ -28,7 +28,7 @@ Signed-off-by: Jouni Malinen <j@w1.fi>
--- a/hostapd/config_file.c --- a/hostapd/config_file.c
+++ b/hostapd/config_file.c +++ b/hostapd/config_file.c
@@ -2865,7 +2865,8 @@ static int hostapd_config_fill(struct ho @@ -2860,7 +2860,8 @@ static int hostapd_config_fill(struct ho
bss->wpa_psk_radius = atoi(pos); bss->wpa_psk_radius = atoi(pos);
if (bss->wpa_psk_radius != PSK_RADIUS_IGNORED && if (bss->wpa_psk_radius != PSK_RADIUS_IGNORED &&
bss->wpa_psk_radius != PSK_RADIUS_ACCEPTED && bss->wpa_psk_radius != PSK_RADIUS_ACCEPTED &&
@@ -67,7 +67,7 @@ Signed-off-by: Jouni Malinen <j@w1.fi>
* *
* This software may be distributed under the terms of the BSD license. * This software may be distributed under the terms of the BSD license.
* See README for more details. * See README for more details.
@@ -1246,6 +1246,7 @@ static int hostapd_config_check_bss(stru @@ -1244,6 +1244,7 @@ static int hostapd_config_check_bss(stru
if (full_config && bss->wpa && if (full_config && bss->wpa &&
bss->wpa_psk_radius != PSK_RADIUS_IGNORED && bss->wpa_psk_radius != PSK_RADIUS_IGNORED &&
@@ -75,7 +75,7 @@ Signed-off-by: Jouni Malinen <j@w1.fi>
bss->macaddr_acl != USE_EXTERNAL_RADIUS_AUTH) { bss->macaddr_acl != USE_EXTERNAL_RADIUS_AUTH) {
wpa_printf(MSG_ERROR, "WPA-PSK using RADIUS enabled, but no " wpa_printf(MSG_ERROR, "WPA-PSK using RADIUS enabled, but no "
"RADIUS checking (macaddr_acl=2) enabled."); "RADIUS checking (macaddr_acl=2) enabled.");
@@ -1255,6 +1256,7 @@ static int hostapd_config_check_bss(stru @@ -1253,6 +1254,7 @@ static int hostapd_config_check_bss(stru
if (full_config && bss->wpa && (bss->wpa_key_mgmt & WPA_KEY_MGMT_PSK) && if (full_config && bss->wpa && (bss->wpa_key_mgmt & WPA_KEY_MGMT_PSK) &&
bss->ssid.wpa_psk == NULL && bss->ssid.wpa_passphrase == NULL && bss->ssid.wpa_psk == NULL && bss->ssid.wpa_passphrase == NULL &&
bss->ssid.wpa_psk_file == NULL && bss->ssid.wpa_psk_file == NULL &&

View File

@@ -163,7 +163,7 @@ hostapd_bss_reload(struct ubus_context *ctx, struct ubus_object *obj,
{ {
struct hostapd_data *hapd = container_of(obj, struct hostapd_data, ubus.obj); struct hostapd_data *hapd = container_of(obj, struct hostapd_data, ubus.obj);
return hostapd_reload_config(hapd->iface, 1); return hostapd_reload_config(hapd->iface);
} }

View File

@@ -4,6 +4,8 @@
#include "utils/common.h" #include "utils/common.h"
#include "utils/ucode.h" #include "utils/ucode.h"
#include "hostapd.h" #include "hostapd.h"
#include "beacon.h"
#include "hw_features.h"
#include "ap_drv_ops.h" #include "ap_drv_ops.h"
#include <libubox/uloop.h> #include <libubox/uloop.h>
@@ -21,7 +23,7 @@ hostapd_ucode_bss_get_uval(struct hostapd_data *hapd)
return wpa_ucode_registry_get(bss_registry, hapd->ucode.idx); return wpa_ucode_registry_get(bss_registry, hapd->ucode.idx);
val = uc_resource_new(bss_type, hapd); val = uc_resource_new(bss_type, hapd);
wpa_ucode_registry_add(bss_registry, val, &hapd->ucode.idx); hapd->ucode.idx = wpa_ucode_registry_add(bss_registry, val);
return val; return val;
} }
@@ -35,46 +37,46 @@ hostapd_ucode_iface_get_uval(struct hostapd_iface *hapd)
return wpa_ucode_registry_get(iface_registry, hapd->ucode.idx); return wpa_ucode_registry_get(iface_registry, hapd->ucode.idx);
val = uc_resource_new(iface_type, hapd); val = uc_resource_new(iface_type, hapd);
wpa_ucode_registry_add(iface_registry, val, &hapd->ucode.idx); hapd->ucode.idx = wpa_ucode_registry_add(iface_registry, val);
return val; return val;
} }
static void static void
hostapd_ucode_update_bss_list(struct hostapd_iface *iface) hostapd_ucode_update_bss_list(struct hostapd_iface *iface, uc_value_t *if_bss, uc_value_t *bss)
{ {
uc_value_t *ifval, *list; uc_value_t *list;
int i; int i;
list = ucv_array_new(vm); list = ucv_array_new(vm);
for (i = 0; i < iface->num_bss; i++) { for (i = 0; i < iface->num_bss; i++) {
struct hostapd_data *hapd = iface->bss[i]; struct hostapd_data *hapd = iface->bss[i];
uc_value_t *val = hostapd_ucode_bss_get_uval(hapd); uc_value_t *val = hostapd_ucode_bss_get_uval(hapd);
uc_value_t *proto = ucv_prototype_get(val);
ucv_object_add(proto, "name", ucv_get(ucv_string_new(hapd->conf->iface))); ucv_array_set(list, i, ucv_get(ucv_string_new(hapd->conf->iface)));
ucv_object_add(proto, "index", ucv_int64_new(i)); ucv_object_add(bss, hapd->conf->iface, ucv_get(val));
ucv_array_set(list, i, ucv_get(val));
} }
ucv_object_add(if_bss, iface->phy, ucv_get(list));
ifval = hostapd_ucode_iface_get_uval(iface);
ucv_object_add(ucv_prototype_get(ifval), "bss", ucv_get(list));
} }
static void static void
hostapd_ucode_update_interfaces(void) hostapd_ucode_update_interfaces(void)
{ {
uc_value_t *ifs = ucv_object_new(vm); uc_value_t *ifs = ucv_object_new(vm);
uc_value_t *if_bss = ucv_array_new(vm);
uc_value_t *bss = ucv_object_new(vm);
int i; int i;
for (i = 0; i < interfaces->count; i++) { for (i = 0; i < interfaces->count; i++) {
struct hostapd_iface *iface = interfaces->iface[i]; struct hostapd_iface *iface = interfaces->iface[i];
ucv_object_add(ifs, iface->phy, ucv_get(hostapd_ucode_iface_get_uval(iface))); ucv_object_add(ifs, iface->phy, ucv_get(hostapd_ucode_iface_get_uval(iface)));
hostapd_ucode_update_bss_list(iface); hostapd_ucode_update_bss_list(iface, if_bss, bss);
} }
ucv_object_add(ucv_prototype_get(global), "interfaces", ucv_get(ifs)); ucv_object_add(ucv_prototype_get(global), "interfaces", ucv_get(ifs));
ucv_object_add(ucv_prototype_get(global), "interface_bss", ucv_get(if_bss));
ucv_object_add(ucv_prototype_get(global), "bss", ucv_get(bss));
ucv_gc(vm); ucv_gc(vm);
} }
@@ -130,18 +132,18 @@ uc_hostapd_bss_set_config(uc_vm_t *vm, size_t nargs)
if (!conf || idx > conf->num_bss || !conf->bss[idx]) if (!conf || idx > conf->num_bss || !conf->bss[idx])
goto out; goto out;
hostapd_bss_deinit_no_free(hapd);
hostapd_drv_stop_ap(hapd);
hostapd_free_hapd_data(hapd);
old_bss = hapd->conf; old_bss = hapd->conf;
for (i = 0; i < iface->conf->num_bss; i++) for (i = 0; i < iface->conf->num_bss; i++)
if (iface->conf->bss[i] == hapd->conf) if (iface->conf->bss[i] == hapd->conf)
iface->conf->bss[i] = conf->bss[idx]; iface->conf->bss[i] = conf->bss[idx];
hapd->conf = conf->bss[idx]; hapd->conf = conf->bss[idx];
conf->bss[idx] = NULL; conf->bss[idx] = old_bss;
hostapd_config_free(conf); hostapd_config_free(conf);
hostapd_bss_deinit_no_free(hapd);
hostapd_drv_stop_ap(hapd);
hostapd_free_hapd_data(hapd);
hostapd_config_free_bss(old_bss);
hostapd_setup_bss(hapd, hapd == iface->bss[0], !iface->conf->multiple_bssid); hostapd_setup_bss(hapd, hapd == iface->bss[0], !iface->conf->multiple_bssid);
ret = 0; ret = 0;
@@ -197,7 +199,7 @@ uc_hostapd_bss_delete(uc_vm_t *vm, size_t nargs)
hostapd_config_free_bss(hapd->conf); hostapd_config_free_bss(hapd->conf);
os_free(hapd); os_free(hapd);
hostapd_ucode_update_bss_list(iface); hostapd_ucode_update_interfaces();
ucv_gc(vm); ucv_gc(vm);
return NULL; return NULL;
@@ -250,7 +252,7 @@ uc_hostapd_iface_add_bss(uc_vm_t *vm, size_t nargs)
iface->conf->bss[iface->conf->num_bss] = bss; iface->conf->bss[iface->conf->num_bss] = bss;
conf->bss[idx] = NULL; conf->bss[idx] = NULL;
ret = hostapd_ucode_bss_get_uval(hapd); ret = hostapd_ucode_bss_get_uval(hapd);
hostapd_ucode_update_bss_list(iface); hostapd_ucode_update_interfaces();
goto out; goto out;
deinit_ctrl: deinit_ctrl:
@@ -289,12 +291,158 @@ uc_hostapd_bss_ctrl(uc_vm_t *vm, size_t nargs)
return ucv_string_new_length(reply, reply_len); return ucv_string_new_length(reply, reply_len);
} }
static uc_value_t *
uc_hostapd_iface_stop(uc_vm_t *vm, size_t nargs)
{
struct hostapd_iface *iface = uc_fn_thisval("hostapd.iface");
int i;
for (i = 0; i < iface->num_bss; i++) {
struct hostapd_data *hapd = iface->bss[i];
hostapd_drv_stop_ap(hapd);
hapd->started = 0;
}
}
static uc_value_t *
uc_hostapd_iface_start(uc_vm_t *vm, size_t nargs)
{
struct hostapd_iface *iface = uc_fn_thisval("hostapd.iface");
uc_value_t *info = uc_fn_arg(0);
struct hostapd_config *conf;
uint64_t intval;
int i;
if (!iface)
return NULL;
if (!info)
goto out;
if (ucv_type(info) != UC_OBJECT)
return NULL;
conf = iface->conf;
if ((intval = ucv_int64_get(ucv_object_get(info, "op_class", NULL))) && !errno)
conf->op_class = intval;
if ((intval = ucv_int64_get(ucv_object_get(info, "hw_mode", NULL))) && !errno)
conf->hw_mode = intval;
if ((intval = ucv_int64_get(ucv_object_get(info, "channel", NULL))) && !errno)
conf->channel = intval;
if ((intval = ucv_int64_get(ucv_object_get(info, "sec_channel", NULL))) && !errno)
conf->secondary_channel = intval;
#ifdef CONFIG_IEEE80211AC
if ((intval = ucv_int64_get(ucv_object_get(info, "center_seg0_idx", NULL))) && !errno) {
conf->vht_oper_centr_freq_seg0_idx = intval;
#ifdef CONFIG_IEEE80211AX
conf->he_oper_centr_freq_seg0_idx = intval;
#endif
#ifdef CONFIG_IEEE80211BE
conf->eht_oper_centr_freq_seg0_idx = intval;
#endif
}
if ((intval = ucv_int64_get(ucv_object_get(info, "center_seg1_idx", NULL))) && !errno) {
conf->vht_oper_centr_freq_seg1_idx = intval;
#ifdef CONFIG_IEEE80211AX
conf->he_oper_centr_freq_seg1_idx = intval;
#endif
#ifdef CONFIG_IEEE80211BE
conf->eht_oper_centr_freq_seg1_idx = intval;
#endif
}
intval = ucv_int64_get(ucv_object_get(info, "oper_chwidth", NULL));
if (!errno) {
conf->vht_oper_chwidth = intval;
#ifdef CONFIG_IEEE80211AX
conf->he_oper_chwidth = intval;
#endif
#ifdef CONFIG_IEEE80211BE
conf->eht_oper_chwidth = intval;
#endif
}
#endif
out:
if (conf->channel)
iface->freq = hostapd_hw_get_freq(iface->bss[0], conf->channel);
for (i = 0; i < iface->num_bss; i++) {
struct hostapd_data *hapd = iface->bss[i];
int ret;
hapd->started = 1;
hostapd_set_freq(hapd, conf->hw_mode, iface->freq,
conf->channel,
conf->enable_edmg,
conf->edmg_channel,
conf->ieee80211n,
conf->ieee80211ac,
conf->ieee80211ax,
conf->secondary_channel,
hostapd_get_oper_chwidth(conf),
hostapd_get_oper_centr_freq_seg0_idx(conf),
hostapd_get_oper_centr_freq_seg1_idx(conf));
ieee802_11_set_beacon(hapd);
}
return ucv_boolean_new(true);
}
static uc_value_t *
uc_hostapd_iface_switch_channel(uc_vm_t *vm, size_t nargs)
{
struct hostapd_iface *iface = uc_fn_thisval("hostapd.iface");
uc_value_t *info = uc_fn_arg(0);
struct hostapd_config *conf;
struct csa_settings csa = {};
uint64_t intval;
int i, ret = 0;
if (!iface || ucv_type(info) != UC_OBJECT)
return NULL;
conf = iface->conf;
if ((intval = ucv_int64_get(ucv_object_get(info, "csa_count", NULL))) && !errno)
csa.cs_count = intval;
if ((intval = ucv_int64_get(ucv_object_get(info, "sec_channel", NULL))) && !errno)
csa.freq_params.sec_channel_offset = intval;
csa.freq_params.ht_enabled = conf->ieee80211n;
csa.freq_params.vht_enabled = conf->ieee80211ac;
csa.freq_params.he_enabled = conf->ieee80211ax;
#ifdef CONFIG_IEEE80211BE
csa.freq_params.eht_enabled = conf->ieee80211be;
#endif
intval = ucv_int64_get(ucv_object_get(info, "oper_chwidth", NULL));
if (errno)
intval = hostapd_get_oper_chwidth(conf);
if (intval)
csa.freq_params.bandwidth = 40 << intval;
else
csa.freq_params.bandwidth = csa.freq_params.sec_channel_offset ? 40 : 20;
if ((intval = ucv_int64_get(ucv_object_get(info, "frequency", NULL))) && !errno)
csa.freq_params.freq = intval;
if ((intval = ucv_int64_get(ucv_object_get(info, "center_freq1", NULL))) && !errno)
csa.freq_params.center_freq1 = intval;
if ((intval = ucv_int64_get(ucv_object_get(info, "center_freq2", NULL))) && !errno)
csa.freq_params.center_freq2 = intval;
for (i = 0; i < iface->num_bss; i++)
ret = hostapd_switch_channel(iface->bss[i], &csa);
return ucv_boolean_new(!ret);
}
int hostapd_ucode_init(struct hapd_interfaces *ifaces) int hostapd_ucode_init(struct hapd_interfaces *ifaces)
{ {
static const uc_function_list_t global_fns[] = { static const uc_function_list_t global_fns[] = {
{ "printf", uc_wpa_printf }, { "printf", uc_wpa_printf },
{ "getpid", uc_wpa_getpid }, { "getpid", uc_wpa_getpid },
{ "sha1", uc_wpa_sha1 }, { "sha1", uc_wpa_sha1 },
{ "freq_info", uc_wpa_freq_info },
{ "add_iface", uc_hostapd_add_iface }, { "add_iface", uc_hostapd_add_iface },
{ "remove_iface", uc_hostapd_remove_iface }, { "remove_iface", uc_hostapd_remove_iface },
}; };
@@ -304,7 +452,10 @@ int hostapd_ucode_init(struct hapd_interfaces *ifaces)
{ "delete", uc_hostapd_bss_delete }, { "delete", uc_hostapd_bss_delete },
}; };
static const uc_function_list_t iface_fns[] = { static const uc_function_list_t iface_fns[] = {
{ "add_bss", uc_hostapd_iface_add_bss } { "add_bss", uc_hostapd_iface_add_bss },
{ "stop", uc_hostapd_iface_stop },
{ "start", uc_hostapd_iface_start },
{ "switch_channel", uc_hostapd_iface_switch_channel },
}; };
uc_value_t *data, *proto; uc_value_t *data, *proto;
@@ -360,7 +511,7 @@ void hostapd_ucode_add_bss(struct hostapd_data *hapd)
ucv_gc(vm); ucv_gc(vm);
} }
void hostapd_ucode_reload_bss(struct hostapd_data *hapd, int reconf) void hostapd_ucode_reload_bss(struct hostapd_data *hapd)
{ {
uc_value_t *val; uc_value_t *val;
@@ -370,8 +521,7 @@ void hostapd_ucode_reload_bss(struct hostapd_data *hapd, int reconf)
val = hostapd_ucode_bss_get_uval(hapd); val = hostapd_ucode_bss_get_uval(hapd);
uc_value_push(ucv_get(ucv_string_new(hapd->conf->iface))); uc_value_push(ucv_get(ucv_string_new(hapd->conf->iface)));
uc_value_push(ucv_get(val)); uc_value_push(ucv_get(val));
uc_value_push(ucv_int64_new(reconf)); ucv_put(wpa_ucode_call(2));
ucv_put(wpa_ucode_call(3));
ucv_gc(vm); ucv_gc(vm);
} }

View File

@@ -25,7 +25,7 @@ void hostapd_ucode_free(void);
void hostapd_ucode_free_iface(struct hostapd_iface *iface); void hostapd_ucode_free_iface(struct hostapd_iface *iface);
void hostapd_ucode_add_bss(struct hostapd_data *hapd); void hostapd_ucode_add_bss(struct hostapd_data *hapd);
void hostapd_ucode_free_bss(struct hostapd_data *hapd); void hostapd_ucode_free_bss(struct hostapd_data *hapd);
void hostapd_ucode_reload_bss(struct hostapd_data *hapd, int reconf); void hostapd_ucode_reload_bss(struct hostapd_data *hapd);
#else #else
@@ -39,7 +39,7 @@ static inline void hostapd_ucode_free(void)
static inline void hostapd_ucode_free_iface(struct hostapd_iface *iface) static inline void hostapd_ucode_free_iface(struct hostapd_iface *iface)
{ {
} }
static inline void hostapd_ucode_reload_bss(struct hostapd_data *hapd, int reconf) static inline void hostapd_ucode_reload_bss(struct hostapd_data *hapd)
{ {
} }
static inline void hostapd_ucode_add_bss(struct hostapd_data *hapd) static inline void hostapd_ucode_add_bss(struct hostapd_data *hapd)

View File

@@ -3,6 +3,7 @@
#include "utils/eloop.h" #include "utils/eloop.h"
#include "crypto/crypto.h" #include "crypto/crypto.h"
#include "crypto/sha1.h" #include "crypto/sha1.h"
#include "common/ieee802_11_common.h"
#include <libubox/uloop.h> #include <libubox/uloop.h>
#include <ucode/compiler.h> #include <ucode/compiler.h>
@@ -45,6 +46,97 @@ uc_value_t *uc_wpa_printf(uc_vm_t *vm, size_t nargs)
return NULL; return NULL;
} }
uc_value_t *uc_wpa_freq_info(uc_vm_t *vm, size_t nargs)
{
uc_value_t *freq = uc_fn_arg(0);
uc_value_t *sec = uc_fn_arg(1);
int width = ucv_uint64_get(uc_fn_arg(2));
int freq_val, center_idx, center_ofs;
enum hostapd_hw_mode hw_mode;
u8 op_class, channel, tmp_channel;
const char *modestr;
int sec_channel = 0;
uc_value_t *ret;
int chanwidth;
if (ucv_type(freq) != UC_INTEGER)
return NULL;
freq_val = ucv_int64_get(freq);
if (ucv_type(sec) == UC_INTEGER)
sec_channel = ucv_int64_get(sec);
else if (sec)
return NULL;
else if (freq_val > 4000)
sec_channel = (freq_val / 20) & 1 ? 1 : -1;
else
sec_channel = freq_val < 2442 ? 1 : -1;
if (sec_channel != -1 && sec_channel != 1 && sec_channel != 0)
return NULL;
switch (width) {
case 0:
chanwidth = CHANWIDTH_USE_HT;
break;
case 1:
chanwidth = CHANWIDTH_80MHZ;
break;
case 2:
chanwidth = CHANWIDTH_160MHZ;
break;
default:
return NULL;
}
hw_mode = ieee80211_freq_to_channel_ext(freq_val, sec_channel,
chanwidth, &op_class, &channel);
switch (hw_mode) {
case HOSTAPD_MODE_IEEE80211B:
modestr = "b";
break;
case HOSTAPD_MODE_IEEE80211G:
modestr = "g";
break;
case HOSTAPD_MODE_IEEE80211A:
modestr = "a";
break;
case HOSTAPD_MODE_IEEE80211AD:
modestr = "ad";
break;
default:
return NULL;
}
ret = ucv_object_new(vm);
ucv_object_add(ret, "op_class", ucv_int64_new(op_class));
ucv_object_add(ret, "channel", ucv_int64_new(channel));
ucv_object_add(ret, "hw_mode", ucv_int64_new(hw_mode));
ucv_object_add(ret, "hw_mode_str", ucv_get(ucv_string_new(modestr)));
ucv_object_add(ret, "sec_channel", ucv_int64_new(sec_channel));
ucv_object_add(ret, "frequency", ucv_int64_new(freq_val));
if (!sec_channel)
return ret;
if (freq_val >= 5900)
center_ofs = 0;
else if (freq_val >= 5745)
center_ofs = 20;
else
center_ofs = 35;
tmp_channel = channel - center_ofs;
tmp_channel &= ~((8 << width) - 1);
center_idx = tmp_channel + center_ofs + (4 << width) - 1;
ucv_object_add(ret, "center_seg0_idx", ucv_int64_new(center_idx));
center_idx = (center_idx - channel) * 5 + freq_val;
ucv_object_add(ret, "center_freq1", ucv_int64_new(center_idx));
out:
return ret;
}
uc_value_t *uc_wpa_getpid(uc_vm_t *vm, size_t nargs) uc_value_t *uc_wpa_getpid(uc_vm_t *vm, size_t nargs)
{ {
return ucv_int64_new(getpid()); return ucv_int64_new(getpid());
@@ -179,7 +271,7 @@ uc_value_t *wpa_ucode_global_init(const char *name, uc_resource_type_t *global_t
return global; return global;
} }
void wpa_ucode_registry_add(uc_value_t *reg, uc_value_t *val, int *idx) int wpa_ucode_registry_add(uc_value_t *reg, uc_value_t *val)
{ {
uc_value_t *data; uc_value_t *data;
int i = 0; int i = 0;
@@ -189,10 +281,7 @@ void wpa_ucode_registry_add(uc_value_t *reg, uc_value_t *val, int *idx)
ucv_array_set(reg, i, ucv_get(val)); ucv_array_set(reg, i, ucv_get(val));
data = ucv_object_new(&vm); return i + 1;
ucv_object_add(ucv_prototype_get(val), "data", ucv_get(data));
*idx = i + 1;
} }
uc_value_t *wpa_ucode_registry_get(uc_value_t *reg, int idx) uc_value_t *wpa_ucode_registry_get(uc_value_t *reg, int idx)

View File

@@ -17,12 +17,13 @@ void wpa_ucode_free_vm(void);
uc_value_t *wpa_ucode_global_init(const char *name, uc_resource_type_t *global_type); uc_value_t *wpa_ucode_global_init(const char *name, uc_resource_type_t *global_type);
void wpa_ucode_registry_add(uc_value_t *reg, uc_value_t *val, int *idx); int wpa_ucode_registry_add(uc_value_t *reg, uc_value_t *val);
uc_value_t *wpa_ucode_registry_get(uc_value_t *reg, int idx); uc_value_t *wpa_ucode_registry_get(uc_value_t *reg, int idx);
uc_value_t *wpa_ucode_registry_remove(uc_value_t *reg, int idx); uc_value_t *wpa_ucode_registry_remove(uc_value_t *reg, int idx);
uc_value_t *uc_wpa_printf(uc_vm_t *vm, size_t nargs); uc_value_t *uc_wpa_printf(uc_vm_t *vm, size_t nargs);
uc_value_t *uc_wpa_getpid(uc_vm_t *vm, size_t nargs); uc_value_t *uc_wpa_getpid(uc_vm_t *vm, size_t nargs);
uc_value_t *uc_wpa_sha1(uc_vm_t *vm, size_t nargs); uc_value_t *uc_wpa_sha1(uc_vm_t *vm, size_t nargs);
uc_value_t *uc_wpa_freq_info(uc_vm_t *vm, size_t nargs);
#endif #endif

View File

@@ -1,8 +1,10 @@
#include "utils/includes.h" #include "utils/includes.h"
#include "utils/common.h" #include "utils/common.h"
#include "utils/ucode.h" #include "utils/ucode.h"
#include "drivers/driver.h"
#include "wpa_supplicant_i.h" #include "wpa_supplicant_i.h"
#include "wps_supplicant.h" #include "wps_supplicant.h"
#include "bss.h"
#include "ucode.h" #include "ucode.h"
static struct wpa_global *wpa_global; static struct wpa_global *wpa_global;
@@ -19,7 +21,7 @@ wpas_ucode_iface_get_uval(struct wpa_supplicant *wpa_s)
return wpa_ucode_registry_get(iface_registry, wpa_s->ucode.idx); return wpa_ucode_registry_get(iface_registry, wpa_s->ucode.idx);
val = uc_resource_new(iface_type, wpa_s); val = uc_resource_new(iface_type, wpa_s);
wpa_ucode_registry_add(iface_registry, val, &wpa_s->ucode.idx); wpa_s->ucode.idx = wpa_ucode_registry_add(iface_registry, val);
return val; return val;
} }
@@ -63,12 +65,65 @@ void wpas_ucode_free_bss(struct wpa_supplicant *wpa_s)
if (wpa_ucode_call_prepare("iface_remove")) if (wpa_ucode_call_prepare("iface_remove"))
return; return;
uc_value_push(ucv_string_new(wpa_s->ifname)); uc_value_push(ucv_get(ucv_string_new(wpa_s->ifname)));
uc_value_push(ucv_get(val)); uc_value_push(ucv_get(val));
ucv_put(wpa_ucode_call(2)); ucv_put(wpa_ucode_call(2));
ucv_gc(vm); ucv_gc(vm);
} }
void wpas_ucode_update_state(struct wpa_supplicant *wpa_s)
{
const char *state;
uc_value_t *val;
val = wpa_ucode_registry_get(iface_registry, wpa_s->ucode.idx);
if (!val)
return;
if (wpa_ucode_call_prepare("state"))
return;
state = wpa_supplicant_state_txt(wpa_s->wpa_state);
uc_value_push(ucv_get(ucv_string_new(wpa_s->ifname)));
uc_value_push(ucv_get(val));
uc_value_push(ucv_get(ucv_string_new(state)));
ucv_put(wpa_ucode_call(3));
ucv_gc(vm);
}
void wpas_ucode_event(struct wpa_supplicant *wpa_s, int event, union wpa_event_data *data)
{
const char *state;
uc_value_t *val;
if (event != EVENT_CH_SWITCH_STARTED)
return;
val = wpa_ucode_registry_get(iface_registry, wpa_s->ucode.idx);
if (!val)
return;
if (wpa_ucode_call_prepare("event"))
return;
uc_value_push(ucv_get(ucv_string_new(wpa_s->ifname)));
uc_value_push(ucv_get(val));
uc_value_push(ucv_get(ucv_string_new(event_to_string(event))));
val = ucv_object_new(vm);
uc_value_push(ucv_get(val));
if (event == EVENT_CH_SWITCH_STARTED) {
ucv_object_add(val, "csa_count", ucv_int64_new(data->ch_switch.count));
ucv_object_add(val, "frequency", ucv_int64_new(data->ch_switch.freq));
ucv_object_add(val, "sec_chan_offset", ucv_int64_new(data->ch_switch.ch_offset));
ucv_object_add(val, "center_freq1", ucv_int64_new(data->ch_switch.cf1));
ucv_object_add(val, "center_freq2", ucv_int64_new(data->ch_switch.cf2));
}
ucv_put(wpa_ucode_call(4));
ucv_gc(vm);
}
static const char *obj_stringval(uc_value_t *obj, const char *name) static const char *obj_stringval(uc_value_t *obj, const char *name)
{ {
uc_value_t *val = ucv_object_get(obj, name, NULL); uc_value_t *val = ucv_object_get(obj, name, NULL);
@@ -84,7 +139,6 @@ uc_wpas_add_iface(uc_vm_t *vm, size_t nargs)
uc_value_t *bridge = ucv_object_get(info, "bridge", NULL); uc_value_t *bridge = ucv_object_get(info, "bridge", NULL);
uc_value_t *config = ucv_object_get(info, "config", NULL); uc_value_t *config = ucv_object_get(info, "config", NULL);
uc_value_t *ctrl = ucv_object_get(info, "ctrl", NULL); uc_value_t *ctrl = ucv_object_get(info, "ctrl", NULL);
uc_value_t *hapd_ctrl = ucv_object_get(info, "hostapd_ctrl", NULL);
struct wpa_interface iface; struct wpa_interface iface;
int ret = -1; int ret = -1;
@@ -97,7 +151,6 @@ uc_wpas_add_iface(uc_vm_t *vm, size_t nargs)
.bridge_ifname = ucv_string_get(bridge), .bridge_ifname = ucv_string_get(bridge),
.confname = ucv_string_get(config), .confname = ucv_string_get(config),
.ctrl_interface = ucv_string_get(ctrl), .ctrl_interface = ucv_string_get(ctrl),
.hostapd_ctrl = ucv_string_get(hapd_ctrl),
}; };
if (!iface.ifname || !iface.confname) if (!iface.ifname || !iface.confname)
@@ -135,6 +188,45 @@ out:
return ucv_int64_new(ret); return ucv_int64_new(ret);
} }
static uc_value_t *
uc_wpas_iface_status(uc_vm_t *vm, size_t nargs)
{
struct wpa_supplicant *wpa_s = uc_fn_thisval("wpas.iface");
struct wpa_bss *bss;
uc_value_t *ret, *val;
if (!wpa_s)
return NULL;
ret = ucv_object_new(vm);
val = ucv_string_new(wpa_supplicant_state_txt(wpa_s->wpa_state));
ucv_object_add(ret, "state", ucv_get(val));
bss = wpa_s->current_bss;
if (bss) {
int sec_chan = 0;
const u8 *ie;
ie = wpa_bss_get_ie(bss, WLAN_EID_HT_OPERATION);
if (ie && ie[1] >= 2) {
const struct ieee80211_ht_operation *ht_oper;
ht_oper = (const void *) (ie + 2);
if (ht_oper->ht_param & HT_INFO_HT_PARAM_SECONDARY_CHNL_ABOVE)
sec_chan = 1;
else if (ht_oper->ht_param &
HT_INFO_HT_PARAM_SECONDARY_CHNL_BELOW)
sec_chan = -1;
}
ucv_object_add(ret, "sec_chan_offset", ucv_int64_new(sec_chan));
ucv_object_add(ret, "frequency", ucv_int64_new(bss->freq));
}
return ret;
}
int wpas_ucode_init(struct wpa_global *gl) int wpas_ucode_init(struct wpa_global *gl)
{ {
static const uc_function_list_t global_fns[] = { static const uc_function_list_t global_fns[] = {
@@ -144,6 +236,7 @@ int wpas_ucode_init(struct wpa_global *gl)
{ "remove_iface", uc_wpas_remove_iface }, { "remove_iface", uc_wpas_remove_iface },
}; };
static const uc_function_list_t iface_fns[] = { static const uc_function_list_t iface_fns[] = {
{ "status", uc_wpas_iface_status },
}; };
uc_value_t *data, *proto; uc_value_t *data, *proto;
@@ -151,10 +244,10 @@ int wpas_ucode_init(struct wpa_global *gl)
vm = wpa_ucode_create_vm(); vm = wpa_ucode_create_vm();
global_type = uc_type_declare(vm, "wpas.global", global_fns, NULL); global_type = uc_type_declare(vm, "wpas.global", global_fns, NULL);
iface_type = uc_type_declare(vm, "hostapd.iface", iface_fns, NULL); iface_type = uc_type_declare(vm, "wpas.iface", iface_fns, NULL);
iface_registry = ucv_array_new(vm); iface_registry = ucv_array_new(vm);
uc_vm_registry_set(vm, "hostap.iface_registry", iface_registry); uc_vm_registry_set(vm, "wpas.iface_registry", iface_registry);
global = wpa_ucode_global_init("wpas", global_type); global = wpa_ucode_global_init("wpas", global_type);

View File

@@ -4,6 +4,7 @@
#include "utils/ucode.h" #include "utils/ucode.h"
struct wpa_global; struct wpa_global;
union wpa_event_data;
struct wpa_supplicant; struct wpa_supplicant;
struct wpas_ucode_bss { struct wpas_ucode_bss {
@@ -17,6 +18,8 @@ int wpas_ucode_init(struct wpa_global *gl);
void wpas_ucode_free(void); void wpas_ucode_free(void);
void wpas_ucode_add_bss(struct wpa_supplicant *wpa_s); void wpas_ucode_add_bss(struct wpa_supplicant *wpa_s);
void wpas_ucode_free_bss(struct wpa_supplicant *wpa_s); void wpas_ucode_free_bss(struct wpa_supplicant *wpa_s);
void wpas_ucode_update_state(struct wpa_supplicant *wpa_s);
void wpas_ucode_event(struct wpa_supplicant *wpa_s, int event, union wpa_event_data *data);
#else #else
static inline int wpas_ucode_init(struct wpa_global *gl) static inline int wpas_ucode_init(struct wpa_global *gl)
{ {
@@ -33,6 +36,14 @@ static inline void wpas_ucode_free_bss(struct wpa_supplicant *wpa_s)
{ {
} }
static inline void wpas_ucode_update_state(struct wpa_supplicant *wpa_s)
{
}
static inline void wpas_ucode_event(struct wpa_supplicant *wpa_s, int event, union wpa_event_data *data)
{
}
#endif #endif
#endif #endif

View File

@@ -492,8 +492,6 @@ $base_cfg
EOF EOF
json_select .. json_select ..
radio_md5sum=$(md5sum $hostapd_conf_file | cut -d" " -f1)
echo "radio_config_id=${radio_md5sum}" >> $hostapd_conf_file
} }
mac80211_hostapd_setup_bss() { mac80211_hostapd_setup_bss() {