--- a/hostapd/ctrl_iface.c +++ b/hostapd/ctrl_iface.c @@ -37,6 +37,7 @@ #include "wps/wps.h" #include "config_file.h" #include "ctrl_iface.h" +#include "config_file.h" struct wpa_ctrl_dst { @@ -47,6 +48,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); @@ -156,6 +158,68 @@ static int hostapd_ctrl_iface_new_sta(st return 0; } +static int hostapd_ctrl_iface_set_down(struct hostapd_data *hapd) +{ + if (hapd->driver->stop_ap) + hapd->driver->stop_ap(hapd->drv_priv); + return 0; +} + +static char *get_option(char *opt, char *str) +{ + int len = strlen(str); + + 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 CONFIG_IEEE80211W #ifdef NEED_AP_MLME @@ -1546,6 +1610,10 @@ static void hostapd_ctrl_iface_receive(i } else if (os_strncmp(buf, "VENDOR ", 7) == 0) { reply_len = hostapd_ctrl_iface_vendor(hapd, buf + 7, reply, reply_size); + } else if (os_strcmp(buf, "DOWN") == 0) { + hostapd_ctrl_iface_set_down(hapd); + } else if (os_strncmp(buf, "UPDATE ", 7) == 0) { + hostapd_ctrl_iface_update(hapd, buf + 7); } else { os_memcpy(reply, "UNKNOWN COMMAND\n", 16);