mirror of https://github.com/hak5/openwrt.git
hostapd: reduce to a single instance per service
Signed-off-by: Daniel Golle <daniel@makrotopia.org>master
parent
35f208da3c
commit
f37d634236
|
@ -526,9 +526,9 @@ define Install/supplicant
|
|||
endef
|
||||
|
||||
define Package/hostapd-common/install
|
||||
$(INSTALL_DIR) $(1)/lib/netifd $(1)/etc/rc.button $(1)/etc/hotplug.d/ieee80211
|
||||
$(INSTALL_DIR) $(1)/lib/netifd $(1)/etc/rc.button $(1)/etc/hotplug.d/ieee80211 $(1)/etc/init.d
|
||||
$(INSTALL_DATA) ./files/hostapd.sh $(1)/lib/netifd/hostapd.sh
|
||||
$(INSTALL_BIN) ./files/hostapd.hotplug $(1)/etc/hotplug.d/ieee80211/20-hostapd
|
||||
$(INSTALL_BIN) ./files/wpad.init $(1)/etc/init.d/wpad
|
||||
$(INSTALL_BIN) ./files/wps-hotplug.sh $(1)/etc/rc.button/wps
|
||||
endef
|
||||
|
||||
|
|
|
@ -1,46 +0,0 @@
|
|||
#!/bin/sh
|
||||
|
||||
initscript="$0"
|
||||
|
||||
. /lib/functions.sh
|
||||
. /lib/functions/procd.sh
|
||||
|
||||
cd /sys/class/ieee80211
|
||||
|
||||
procd_lock() {
|
||||
return 0
|
||||
}
|
||||
|
||||
service_triggers() {
|
||||
return 0
|
||||
}
|
||||
|
||||
service_data() {
|
||||
return 0
|
||||
}
|
||||
|
||||
procd_open_service hostapd
|
||||
|
||||
for phy in *; do
|
||||
[ -d "$phy" ] || continue
|
||||
|
||||
mkdir -p /var/run/wpa_supplicant-$phy /var/run/hostapd-$phy
|
||||
|
||||
if [ -x "/usr/sbin/hostapd" ]; then
|
||||
procd_open_instance hostapd-$phy
|
||||
procd_set_param command /usr/sbin/hostapd -s -n $phy -g /var/run/hostapd-${phy}/global
|
||||
procd_set_param CREATE_TIME="$(date -r $phy)" # force restart on recreated phy
|
||||
procd_set_param respawn
|
||||
procd_close_instance
|
||||
fi
|
||||
|
||||
if [ -x "/usr/sbin/wpa_supplicant" ]; then
|
||||
procd_open_instance supplicant-$phy
|
||||
procd_set_param command /usr/sbin/wpa_supplicant -s -n $phy -g /var/run/wpa_supplicant-${phy}/global
|
||||
procd_set_param CREATE_TIME="$(date -r $phy)" # force restart on recreated phy
|
||||
procd_set_param respawn
|
||||
procd_close_instance
|
||||
fi
|
||||
done
|
||||
|
||||
procd_close_service set
|
|
@ -1075,8 +1075,8 @@ wpa_supplicant_run() {
|
|||
|
||||
_wpa_supplicant_common "$ifname"
|
||||
|
||||
ubus wait_for wpa_supplicant.$phy
|
||||
ubus call wpa_supplicant.$phy config_add "{ \
|
||||
ubus wait_for wpa_supplicant
|
||||
ubus call wpa_supplicant config_add "{ \
|
||||
\"driver\": \"${_w_driver:-wext}\", \"ctrl\": \"$_rpath\", \
|
||||
\"iface\": \"$ifname\", \"config\": \"$_config\" \
|
||||
${network_bridge:+, \"bridge\": \"$network_bridge\"} \
|
||||
|
@ -1087,7 +1087,7 @@ wpa_supplicant_run() {
|
|||
|
||||
[ "$ret" != 0 ] && wireless_setup_vif_failed WPA_SUPPLICANT_FAILED
|
||||
|
||||
local supplicant_pid=$(ubus call service list '{"name": "hostapd"}' | jsonfilter -l 1 -e "@['hostapd'].instances['supplicant-${phy}'].pid")
|
||||
local supplicant_pid=$(ubus call service list '{"name": "hostapd"}' | jsonfilter -l 1 -e "@['hostapd'].instances['supplicant'].pid")
|
||||
wireless_add_process "$supplicant_pid" "/usr/sbin/wpa_supplicant" 1
|
||||
|
||||
return $ret
|
||||
|
|
|
@ -0,0 +1,25 @@
|
|||
#!/bin/sh /etc/rc.common
|
||||
|
||||
START=19
|
||||
STOP=21
|
||||
|
||||
USE_PROCD=1
|
||||
NAME=wpad
|
||||
|
||||
start_service() {
|
||||
if [ -x "/usr/sbin/hostapd" ]; then
|
||||
mkdir -p /var/run/hostapd
|
||||
procd_open_instance hostapd
|
||||
procd_set_param command /usr/sbin/hostapd -s -g /var/run/hostapd/global
|
||||
procd_set_param respawn
|
||||
procd_close_instance
|
||||
fi
|
||||
|
||||
if [ -x "/usr/sbin/wpa_supplicant" ]; then
|
||||
mkdir -p /var/run/wpa_supplicant
|
||||
procd_open_instance supplicant
|
||||
procd_set_param command /usr/sbin/wpa_supplicant -n -s -g /var/run/wpa_supplicant/global
|
||||
procd_set_param respawn
|
||||
procd_close_instance
|
||||
fi
|
||||
}
|
|
@ -22,16 +22,15 @@
|
|||
|
||||
#define OCE_STA_CFON_ENABLED(hapd) \
|
||||
((hapd->conf->oce & OCE_STA_CFON) && \
|
||||
@@ -72,6 +73,8 @@ struct hapd_interfaces {
|
||||
@@ -72,6 +73,7 @@ struct hapd_interfaces {
|
||||
#ifdef CONFIG_DPP
|
||||
struct dpp_global *dpp;
|
||||
#endif /* CONFIG_DPP */
|
||||
+ struct ubus_object ubus;
|
||||
+ char *name;
|
||||
};
|
||||
|
||||
enum hostapd_chan_status {
|
||||
@@ -145,6 +148,7 @@ struct hostapd_data {
|
||||
@@ -145,6 +147,7 @@ struct hostapd_data {
|
||||
struct hostapd_iface *iface;
|
||||
struct hostapd_config *iconf;
|
||||
struct hostapd_bss_config *conf;
|
||||
|
@ -39,7 +38,7 @@
|
|||
int interface_added; /* virtual interface added for this BSS */
|
||||
unsigned int started:1;
|
||||
unsigned int disabled:1;
|
||||
@@ -580,6 +584,7 @@ hostapd_alloc_bss_data(struct hostapd_if
|
||||
@@ -580,6 +583,7 @@ hostapd_alloc_bss_data(struct hostapd_if
|
||||
struct hostapd_bss_config *bss);
|
||||
int hostapd_setup_interface(struct hostapd_iface *iface);
|
||||
int hostapd_setup_interface_complete(struct hostapd_iface *iface, int err);
|
||||
|
@ -315,16 +314,7 @@
|
|||
/* Remove interface from the global list of interfaces */
|
||||
prev = global->ifaces;
|
||||
if (prev == wpa_s) {
|
||||
@@ -6520,6 +6524,8 @@ struct wpa_global * wpa_supplicant_init(
|
||||
if (params->override_ctrl_interface)
|
||||
global->params.override_ctrl_interface =
|
||||
os_strdup(params->override_ctrl_interface);
|
||||
+ if (params->name)
|
||||
+ global->params.name = os_strdup(params->name);
|
||||
#ifdef CONFIG_MATCH_IFACE
|
||||
global->params.match_iface_count = params->match_iface_count;
|
||||
if (params->match_iface_count) {
|
||||
@@ -6626,8 +6632,12 @@ int wpa_supplicant_run(struct wpa_global
|
||||
@@ -6626,8 +6630,12 @@ int wpa_supplicant_run(struct wpa_global
|
||||
eloop_register_signal_terminate(wpa_supplicant_terminate, global);
|
||||
eloop_register_signal_reconfig(wpa_supplicant_reconfig, global);
|
||||
|
||||
|
@ -337,14 +327,6 @@
|
|||
return 0;
|
||||
}
|
||||
|
||||
@@ -6687,6 +6697,7 @@ void wpa_supplicant_deinit(struct wpa_gl
|
||||
#ifdef CONFIG_MATCH_IFACE
|
||||
os_free(global->params.match_ifaces);
|
||||
#endif /* CONFIG_MATCH_IFACE */
|
||||
+ os_free(global->params.name);
|
||||
#ifdef CONFIG_P2P
|
||||
os_free(global->params.conf_p2p_dev);
|
||||
#endif /* CONFIG_P2P */
|
||||
--- a/wpa_supplicant/wpa_supplicant_i.h
|
||||
+++ b/wpa_supplicant/wpa_supplicant_i.h
|
||||
@@ -17,6 +17,7 @@
|
||||
|
@ -355,16 +337,7 @@
|
|||
|
||||
extern const char *const wpa_supplicant_version;
|
||||
extern const char *const wpa_supplicant_license;
|
||||
@@ -246,6 +247,8 @@ struct wpa_params {
|
||||
*/
|
||||
int match_iface_count;
|
||||
#endif /* CONFIG_MATCH_IFACE */
|
||||
+
|
||||
+ char *name;
|
||||
};
|
||||
|
||||
struct p2p_srv_bonjour {
|
||||
@@ -306,6 +309,8 @@ struct wpa_global {
|
||||
@@ -306,6 +307,8 @@ struct wpa_global {
|
||||
#endif /* CONFIG_WIFI_DISPLAY */
|
||||
|
||||
struct psk_list_entry *add_psk; /* From group formation */
|
||||
|
@ -373,7 +346,7 @@
|
|||
};
|
||||
|
||||
|
||||
@@ -506,6 +511,7 @@ struct wpa_supplicant {
|
||||
@@ -506,6 +509,7 @@ struct wpa_supplicant {
|
||||
unsigned char own_addr[ETH_ALEN];
|
||||
unsigned char perm_addr[ETH_ALEN];
|
||||
char ifname[100];
|
||||
|
@ -402,25 +375,7 @@
|
|||
|
||||
--- a/hostapd/main.c
|
||||
+++ b/hostapd/main.c
|
||||
@@ -688,7 +688,7 @@ int main(int argc, char *argv[])
|
||||
wpa_supplicant_event = hostapd_wpa_event;
|
||||
wpa_supplicant_event_global = hostapd_wpa_event_global;
|
||||
for (;;) {
|
||||
- c = getopt(argc, argv, "b:Bde:f:hi:KP:sSTtu:g:G:v::");
|
||||
+ c = getopt(argc, argv, "b:Bde:f:hi:KP:sSTtu:g:G:n:v::");
|
||||
if (c < 0)
|
||||
break;
|
||||
switch (c) {
|
||||
@@ -763,6 +763,8 @@ int main(int argc, char *argv[])
|
||||
if (hostapd_get_interface_names(&if_names,
|
||||
&if_names_size, optarg))
|
||||
goto out;
|
||||
+ case 'n':
|
||||
+ interfaces.name = optarg;
|
||||
break;
|
||||
default:
|
||||
usage();
|
||||
@@ -894,6 +896,7 @@ int main(int argc, char *argv[])
|
||||
@@ -894,6 +894,7 @@ int main(int argc, char *argv[])
|
||||
}
|
||||
|
||||
hostapd_global_ctrl_iface_init(&interfaces);
|
||||
|
@ -428,7 +383,7 @@
|
|||
|
||||
if (hostapd_global_run(&interfaces, daemonize, pid_file)) {
|
||||
wpa_printf(MSG_ERROR, "Failed to start eloop");
|
||||
@@ -903,6 +906,7 @@ int main(int argc, char *argv[])
|
||||
@@ -903,6 +904,7 @@ int main(int argc, char *argv[])
|
||||
ret = 0;
|
||||
|
||||
out:
|
||||
|
@ -443,16 +398,15 @@
|
|||
for (;;) {
|
||||
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:hH:i:I:KLMm:n:No:O:p:P:qsTtuv::W");
|
||||
+ "b:Bc:C:D:de:f:g:G:hH:i:I:KLMm:nNo:O:p:P:qsTtuv::W");
|
||||
if (c < 0)
|
||||
break;
|
||||
switch (c) {
|
||||
@@ -271,6 +271,10 @@ int main(int argc, char *argv[])
|
||||
@@ -271,6 +271,9 @@ int main(int argc, char *argv[])
|
||||
params.conf_p2p_dev = optarg;
|
||||
break;
|
||||
#endif /* CONFIG_P2P */
|
||||
+ case 'n':
|
||||
+ params.name = optarg;
|
||||
+ iface_count = 0;
|
||||
+ break;
|
||||
case 'o':
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
Index: hostapd-2019-08-08-ca8c2bd2/hostapd/config_file.c
|
||||
===================================================================
|
||||
--- hostapd-2019-08-08-ca8c2bd2.orig/hostapd/config_file.c
|
||||
+++ hostapd-2019-08-08-ca8c2bd2/hostapd/config_file.c
|
||||
--- a/hostapd/config_file.c
|
||||
+++ b/hostapd/config_file.c
|
||||
@@ -2470,6 +2470,8 @@ static int hostapd_config_fill(struct ho
|
||||
bss->isolate = atoi(pos);
|
||||
} else if (os_strcmp(buf, "ap_max_inactivity") == 0) {
|
||||
|
@ -20,10 +18,8 @@ Index: hostapd-2019-08-08-ca8c2bd2/hostapd/config_file.c
|
|||
} else if (os_strcmp(buf, "channel") == 0) {
|
||||
if (os_strcmp(pos, "acs_survey") == 0) {
|
||||
#ifndef CONFIG_ACS
|
||||
Index: hostapd-2019-08-08-ca8c2bd2/src/ap/ap_config.c
|
||||
===================================================================
|
||||
--- hostapd-2019-08-08-ca8c2bd2.orig/src/ap/ap_config.c
|
||||
+++ hostapd-2019-08-08-ca8c2bd2/src/ap/ap_config.c
|
||||
--- a/src/ap/ap_config.c
|
||||
+++ b/src/ap/ap_config.c
|
||||
@@ -698,6 +698,7 @@ void hostapd_config_free_bss(struct host
|
||||
os_free(conf->radius_req_attr_sqlite);
|
||||
os_free(conf->rsn_preauth_interfaces);
|
||||
|
@ -40,10 +36,8 @@ Index: hostapd-2019-08-08-ca8c2bd2/src/ap/ap_config.c
|
|||
os_free(conf->bss);
|
||||
os_free(conf->supported_rates);
|
||||
os_free(conf->basic_rates);
|
||||
Index: hostapd-2019-08-08-ca8c2bd2/src/ap/ap_config.h
|
||||
===================================================================
|
||||
--- hostapd-2019-08-08-ca8c2bd2.orig/src/ap/ap_config.h
|
||||
+++ hostapd-2019-08-08-ca8c2bd2/src/ap/ap_config.h
|
||||
--- a/src/ap/ap_config.h
|
||||
+++ b/src/ap/ap_config.h
|
||||
@@ -829,6 +829,7 @@ struct hostapd_bss_config {
|
||||
*/
|
||||
u8 mka_psk_set;
|
||||
|
@ -60,10 +54,8 @@ Index: hostapd-2019-08-08-ca8c2bd2/src/ap/ap_config.h
|
|||
};
|
||||
|
||||
|
||||
Index: hostapd-2019-08-08-ca8c2bd2/src/ap/hostapd.c
|
||||
===================================================================
|
||||
--- hostapd-2019-08-08-ca8c2bd2.orig/src/ap/hostapd.c
|
||||
+++ hostapd-2019-08-08-ca8c2bd2/src/ap/hostapd.c
|
||||
--- a/src/ap/hostapd.c
|
||||
+++ b/src/ap/hostapd.c
|
||||
@@ -206,6 +206,10 @@ static int hostapd_iface_conf_changed(st
|
||||
{
|
||||
size_t i;
|
||||
|
@ -150,10 +142,8 @@ Index: hostapd-2019-08-08-ca8c2bd2/src/ap/hostapd.c
|
|||
if (conf)
|
||||
hapd->driver = conf->driver;
|
||||
hapd->ctrl_sock = -1;
|
||||
Index: hostapd-2019-08-08-ca8c2bd2/src/ap/hostapd.h
|
||||
===================================================================
|
||||
--- hostapd-2019-08-08-ca8c2bd2.orig/src/ap/hostapd.h
|
||||
+++ hostapd-2019-08-08-ca8c2bd2/src/ap/hostapd.h
|
||||
--- a/src/ap/hostapd.h
|
||||
+++ b/src/ap/hostapd.h
|
||||
@@ -42,7 +42,7 @@ struct mesh_conf;
|
||||
struct hostapd_iface;
|
||||
|
||||
|
@ -163,7 +153,7 @@ Index: hostapd-2019-08-08-ca8c2bd2/src/ap/hostapd.h
|
|||
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);
|
||||
@@ -149,6 +149,7 @@ struct hostapd_data {
|
||||
@@ -148,6 +148,7 @@ struct hostapd_data {
|
||||
struct hostapd_config *iconf;
|
||||
struct hostapd_bss_config *conf;
|
||||
struct hostapd_ubus_bss ubus;
|
||||
|
@ -171,7 +161,7 @@ Index: hostapd-2019-08-08-ca8c2bd2/src/ap/hostapd.h
|
|||
int interface_added; /* virtual interface added for this BSS */
|
||||
unsigned int started:1;
|
||||
unsigned int disabled:1;
|
||||
@@ -576,7 +577,7 @@ struct hostapd_iface {
|
||||
@@ -575,7 +576,7 @@ struct hostapd_iface {
|
||||
int hostapd_for_each_interface(struct hapd_interfaces *interfaces,
|
||||
int (*cb)(struct hostapd_iface *iface,
|
||||
void *ctx), void *ctx);
|
||||
|
@ -180,10 +170,8 @@ Index: hostapd-2019-08-08-ca8c2bd2/src/ap/hostapd.h
|
|||
void hostapd_reconfig_encryption(struct hostapd_data *hapd);
|
||||
struct hostapd_data *
|
||||
hostapd_alloc_bss_data(struct hostapd_iface *hapd_iface,
|
||||
Index: hostapd-2019-08-08-ca8c2bd2/src/drivers/driver_nl80211.c
|
||||
===================================================================
|
||||
--- hostapd-2019-08-08-ca8c2bd2.orig/src/drivers/driver_nl80211.c
|
||||
+++ hostapd-2019-08-08-ca8c2bd2/src/drivers/driver_nl80211.c
|
||||
--- a/src/drivers/driver_nl80211.c
|
||||
+++ b/src/drivers/driver_nl80211.c
|
||||
@@ -4295,6 +4295,9 @@ static int wpa_driver_nl80211_set_ap(voi
|
||||
if (ret) {
|
||||
wpa_printf(MSG_DEBUG, "nl80211: Beacon set failed: %d (%s)",
|
||||
|
@ -194,10 +182,8 @@ Index: hostapd-2019-08-08-ca8c2bd2/src/drivers/driver_nl80211.c
|
|||
} else {
|
||||
bss->beacon_set = 1;
|
||||
nl80211_set_bss(bss, params->cts_protect, params->preamble,
|
||||
Index: hostapd-2019-08-08-ca8c2bd2/hostapd/ctrl_iface.c
|
||||
===================================================================
|
||||
--- hostapd-2019-08-08-ca8c2bd2.orig/hostapd/ctrl_iface.c
|
||||
+++ hostapd-2019-08-08-ca8c2bd2/hostapd/ctrl_iface.c
|
||||
--- a/hostapd/ctrl_iface.c
|
||||
+++ b/hostapd/ctrl_iface.c
|
||||
@@ -182,7 +182,7 @@ static int hostapd_ctrl_iface_update(str
|
||||
iface->interfaces->config_read_cb = hostapd_ctrl_iface_config_read;
|
||||
reload_opts = txt;
|
||||
|
@ -207,10 +193,8 @@ Index: hostapd-2019-08-08-ca8c2bd2/hostapd/ctrl_iface.c
|
|||
|
||||
iface->interfaces->config_read_cb = config_read_cb;
|
||||
}
|
||||
Index: hostapd-2019-08-08-ca8c2bd2/hostapd/main.c
|
||||
===================================================================
|
||||
--- hostapd-2019-08-08-ca8c2bd2.orig/hostapd/main.c
|
||||
+++ hostapd-2019-08-08-ca8c2bd2/hostapd/main.c
|
||||
--- a/hostapd/main.c
|
||||
+++ b/hostapd/main.c
|
||||
@@ -320,7 +320,7 @@ static void handle_term(int sig, void *s
|
||||
|
||||
static int handle_reload_iface(struct hostapd_iface *iface, void *ctx)
|
||||
|
@ -220,10 +204,8 @@ Index: hostapd-2019-08-08-ca8c2bd2/hostapd/main.c
|
|||
wpa_printf(MSG_WARNING, "Failed to read new configuration "
|
||||
"file - continuing with old.");
|
||||
}
|
||||
Index: hostapd-2019-08-08-ca8c2bd2/src/ap/wps_hostapd.c
|
||||
===================================================================
|
||||
--- hostapd-2019-08-08-ca8c2bd2.orig/src/ap/wps_hostapd.c
|
||||
+++ hostapd-2019-08-08-ca8c2bd2/src/ap/wps_hostapd.c
|
||||
--- a/src/ap/wps_hostapd.c
|
||||
+++ b/src/ap/wps_hostapd.c
|
||||
@@ -275,7 +275,7 @@ static void wps_reload_config(void *eloo
|
||||
|
||||
wpa_printf(MSG_DEBUG, "WPS: Reload configuration data");
|
||||
|
|
|
@ -1115,24 +1115,12 @@ static struct ubus_object_type daemon_object_type =
|
|||
void hostapd_ubus_add(struct hapd_interfaces *interfaces)
|
||||
{
|
||||
struct ubus_object *obj = &interfaces->ubus;
|
||||
char *name;
|
||||
int name_len;
|
||||
int ret;
|
||||
|
||||
if (!hostapd_ubus_init())
|
||||
return;
|
||||
|
||||
name_len = strlen("hostapd") + 1;
|
||||
if (interfaces->name)
|
||||
name_len += strlen(interfaces->name) + 1;
|
||||
|
||||
name = malloc(name_len);
|
||||
strcpy(name, "hostapd");
|
||||
if (interfaces->name) {
|
||||
strcat(name, ".");
|
||||
strcat(name, interfaces->name);
|
||||
}
|
||||
obj->name = name;
|
||||
obj->name = strdup("hostapd");
|
||||
|
||||
obj->type = &daemon_object_type;
|
||||
obj->methods = daemon_object_type.methods;
|
||||
|
|
|
@ -322,27 +322,12 @@ static struct ubus_object_type wpas_daemon_object_type =
|
|||
void wpas_ubus_add(struct wpa_global *global)
|
||||
{
|
||||
struct ubus_object *obj = &global->ubus_global;
|
||||
char *name;
|
||||
int name_len;
|
||||
int ret;
|
||||
|
||||
if (!wpas_ubus_init())
|
||||
return;
|
||||
|
||||
name_len = strlen("wpa_supplicant") + 1;
|
||||
if (global->params.name)
|
||||
name_len += strlen(global->params.name) + 1;
|
||||
|
||||
name = malloc(name_len);
|
||||
strcpy(name, "wpa_supplicant");
|
||||
|
||||
if (global->params.name)
|
||||
{
|
||||
strcat(name, ".");
|
||||
strcat(name, global->params.name);
|
||||
}
|
||||
|
||||
obj->name = name;
|
||||
obj->name = strdup("wpa_supplicant");
|
||||
|
||||
obj->type = &wpas_daemon_object_type;
|
||||
obj->methods = wpas_daemon_object_type.methods;
|
||||
|
|
Loading…
Reference in New Issue