--- a/hostapd/ctrl_iface.c +++ b/hostapd/ctrl_iface.c @@ -39,6 +39,7 @@ #include "wps/wps_defs.h" #include "wps/wps.h" #include "ctrl_iface.h" +#include "config_file.h" struct wpa_ctrl_dst { @@ -49,6 +50,7 @@ struct wpa_ctrl_dst { int errors; }; +static char *reload_opts = NULL; static void hostapd_ctrl_iface_send(struct hostapd_data *hapd, int level, const char *buf, size_t len); @@ -323,6 +325,66 @@ static int hostapd_ctrl_iface_disassocia return 0; } +static int hostapd_ctrl_iface_set_down(struct hostapd_data *hapd) +{ + if (hapd->driver->stop_ap) + hapd->driver->stop_ap(hapd->drv_priv); + return 0; +} + +static char *get_option(char *opt, char *str) +{ + int len = strlen(str); + + 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, "hwmode="))) + 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_reload(struct hostapd_data *hapd, char *txt) +{ + struct hostapd_iface *iface = hapd->iface; + + iface->config_read_cb = hostapd_ctrl_iface_config_read; + reload_opts = txt; + + hostapd_reload_config(iface); + + iface->config_read_cb = hostapd_config_read; +} #ifdef CONFIG_IEEE80211W #ifdef NEED_AP_MLME @@ -822,6 +884,10 @@ static void hostapd_ctrl_iface_receive(i reply_len += res; } #endif /* CONFIG_NO_RADIUS */ + } else if (os_strcmp(buf, "DOWN") == 0) { + hostapd_ctrl_iface_set_down(hapd); + } else if (os_strncmp(buf, "RELOAD ", 7) == 0) { + hostapd_ctrl_iface_reload(hapd, buf + 7); } else if (os_strcmp(buf, "STA-FIRST") == 0) { reply_len = hostapd_ctrl_iface_sta_first(hapd, reply, reply_size);