aboutsummaryrefslogtreecommitdiffstats
path: root/hostapd/config_file.c
diff options
context:
space:
mode:
authorDmitry Shmidt <dimitrysh@google.com>2013-11-04 18:44:24 -0800
committerDmitry Shmidt <dimitrysh@google.com>2013-11-04 18:44:24 -0800
commitcce06667447b5aec83452adb0c15100ada531095 (patch)
treedb6df7284213a7942b7f3adf46afd525f4b2166f /hostapd/config_file.c
parente6c91e4c8125a2e7b31d176a52644aa9cab146f1 (diff)
downloadandroid_external_wpa_supplicant_8-cce06667447b5aec83452adb0c15100ada531095.tar.gz
android_external_wpa_supplicant_8-cce06667447b5aec83452adb0c15100ada531095.tar.bz2
android_external_wpa_supplicant_8-cce06667447b5aec83452adb0c15100ada531095.zip
Cumulative patch from commit d4f1a347ceca31fd9cf14070fd000235d5f4e9c1
d4f1a34 Allow AP mode configuration with VHT enabled on 2.4 GHz bb337dd DFS: Do not use cf1 to override freq for 20 MHz channels 0dfd2c6 Document AP mode startup functions fee947b hostapd: Use correct wpa_printf verbosity level for message 2fe210c hostapd: Fix multi-BSS configuration file parsing regression e4ba031 hostapd: Use start_ctrl_iface() from hostapd_add_iface() bf7f09b Fix AP mode QoS Map configuration to be per-BSS dc036d9 DFS: Convert hostapd_data use to hostapd_iface 2db938e hostapd: Fill in phyname automatically 5ae6449 hostapd: Add ctrl_iface STATUS command afadaff Optimize 40 MHz HT co-ex scan on AP 7d6d737 hostapd: Add AP-ENABLED/DISABLED ctrl_iface events e1c5faf hostapd: Track interface state f0793bf hostapd: Wait for channel list update after country code change ae134e1 hostapd: Add ctrl_iface events for ACS ad08e14 hostapd: Move ctrl_iface initialization to happen earlier c20cb02 hostapd: Remove hostapd_interface_init2() 4a5deb9 hostapd: Simplify interface initialization 186c905 DFS: Add control interface events for various DFS events ddf5517 hostapd: Add control interface test commands for radar detection 884f1a3 nl80211: Verify radar event attributes exist before using them 71cdf6b hostapd: Fix ENABLE failure to not remove interface 18ca733 SAE: Fix group selection 65015b2 Replace unnecessary UTF-8 characters with ASCII versions 61323e7 Convert perror/printf calls to wpa_printf 3f134b4 hostapd: Accept RELOG from global control interface b253e6f hostapd: Use wpa_printf() for hostapd_logger() to stdout c092d83 P2P: Clear pending group formation data on group removal 9100b66 P2P: Debug print reason for specific SSID for scan 2aec4f3 Allow add-BSS operation to re-use existing netdev 5592065 hostapd: Allow a single BSS to be removed from an interface 2e2fff3 hostapd: Allow a single BSS to be added to an interface a1fb569 hostapd: Make hostapd_interface_init_bss() available externally 66936c6 hostapd: Make hostapd_init() available externally 390e489 hostapd: Allow the first BSS in a multi-BSS setup to be removed 834ee56 nl80211: Make wpa_driver_nl80211_data::first_bss pointer 748c0ac nl80211: Fix monitor interface reference counting 08e55eb nl80211: Add a debug print for DEL_BEACON 33b0b33 hostapd: Fix error path in hostapd_add_iface() 770ecdf ACS: Do not get stuck while failing to do a subsequent scan 813d4ba DFS: Add support for multi-BSS 954e71d DFS: Reset cac_started properly 6a398dd DFS: Sanitize channel availability checks 32595da DFS: Fix HT40/VHT calculation 0648c3b hostapd: Add -T Linux tracing option 392e68e Set GTK rekey offload information after initial group key handshake bbc706a nl80211: Add debug prints for NL80211_CMD_SET_STATION 731ca63 Update regulatory change to all virtual interface for the phy 6f2db2f hostapd: Validate configuration parameters on RELOAD command eff0fd1 hostapd: Move generic configuration functions into src/ap 5afaa06 hostapd: Allow per-BSS (vif) configuration files ebd79f0 hostapd: Make hostapd_config::bss array of pointers a781e21 hostapd: Force PSK to be derived again on BSS reload 9f104b0 hostapd: Reuse hostapd_clear_old() for RELOAD command Change-Id: I7fbb26cbd4a2960af66a4373c0e6bbe5390a4940 Signed-off-by: Dmitry Shmidt <dimitrysh@google.com>
Diffstat (limited to 'hostapd/config_file.c')
-rw-r--r--hostapd/config_file.c242
1 files changed, 21 insertions, 221 deletions
diff --git a/hostapd/config_file.c b/hostapd/config_file.c
index 0b05ab25..ef0d647e 100644
--- a/hostapd/config_file.c
+++ b/hostapd/config_file.c
@@ -748,30 +748,32 @@ static int hostapd_parse_intlist(int **int_list, char *val)
static int hostapd_config_bss(struct hostapd_config *conf, const char *ifname)
{
- struct hostapd_bss_config *bss;
+ struct hostapd_bss_config **all, *bss;
if (*ifname == '\0')
return -1;
- bss = os_realloc_array(conf->bss, conf->num_bss + 1,
- sizeof(struct hostapd_bss_config));
- if (bss == NULL) {
+ all = os_realloc_array(conf->bss, conf->num_bss + 1,
+ sizeof(struct hostapd_bss_config *));
+ if (all == NULL) {
wpa_printf(MSG_ERROR, "Failed to allocate memory for "
"multi-BSS entry");
return -1;
}
- conf->bss = bss;
+ conf->bss = all;
- bss = &(conf->bss[conf->num_bss]);
- os_memset(bss, 0, sizeof(*bss));
+ bss = os_zalloc(sizeof(*bss));
+ if (bss == NULL)
+ return -1;
bss->radius = os_zalloc(sizeof(*bss->radius));
if (bss->radius == NULL) {
wpa_printf(MSG_ERROR, "Failed to allocate memory for "
"multi-BSS RADIUS data");
+ os_free(bss);
return -1;
}
- conf->num_bss++;
+ conf->bss[conf->num_bss++] = bss;
conf->last_bss = bss;
hostapd_config_defaults_bss(bss);
@@ -1094,165 +1096,6 @@ static int hostapd_config_vht_capab(struct hostapd_config *conf,
#endif /* CONFIG_IEEE80211AC */
-static int hostapd_config_check_bss(struct hostapd_bss_config *bss,
- struct hostapd_config *conf)
-{
- if (bss->ieee802_1x && !bss->eap_server &&
- !bss->radius->auth_servers) {
- wpa_printf(MSG_ERROR, "Invalid IEEE 802.1X configuration (no "
- "EAP authenticator configured).");
- return -1;
- }
-
- if (bss->wpa) {
- int wep, i;
-
- wep = bss->default_wep_key_len > 0 ||
- bss->individual_wep_key_len > 0;
- for (i = 0; i < NUM_WEP_KEYS; i++) {
- if (bss->ssid.wep.keys_set) {
- wep = 1;
- break;
- }
- }
-
- if (wep) {
- wpa_printf(MSG_ERROR, "WEP configuration in a WPA network is not supported");
- return -1;
- }
- }
-
- if (bss->wpa && bss->wpa_psk_radius != PSK_RADIUS_IGNORED &&
- bss->macaddr_acl != USE_EXTERNAL_RADIUS_AUTH) {
- wpa_printf(MSG_ERROR, "WPA-PSK using RADIUS enabled, but no "
- "RADIUS checking (macaddr_acl=2) enabled.");
- return -1;
- }
-
- if (bss->wpa && (bss->wpa_key_mgmt & WPA_KEY_MGMT_PSK) &&
- bss->ssid.wpa_psk == NULL && bss->ssid.wpa_passphrase == NULL &&
- bss->ssid.wpa_psk_file == NULL &&
- (bss->wpa_psk_radius != PSK_RADIUS_REQUIRED ||
- bss->macaddr_acl != USE_EXTERNAL_RADIUS_AUTH)) {
- wpa_printf(MSG_ERROR, "WPA-PSK enabled, but PSK or passphrase "
- "is not configured.");
- return -1;
- }
-
- if (hostapd_mac_comp_empty(bss->bssid) != 0) {
- size_t i;
-
- for (i = 0; i < conf->num_bss; i++) {
- if ((&conf->bss[i] != bss) &&
- (hostapd_mac_comp(conf->bss[i].bssid,
- bss->bssid) == 0)) {
- wpa_printf(MSG_ERROR, "Duplicate BSSID " MACSTR
- " on interface '%s' and '%s'.",
- MAC2STR(bss->bssid),
- conf->bss[i].iface, bss->iface);
- return -1;
- }
- }
- }
-
-#ifdef CONFIG_IEEE80211R
- if (wpa_key_mgmt_ft(bss->wpa_key_mgmt) &&
- (bss->nas_identifier == NULL ||
- os_strlen(bss->nas_identifier) < 1 ||
- os_strlen(bss->nas_identifier) > FT_R0KH_ID_MAX_LEN)) {
- wpa_printf(MSG_ERROR, "FT (IEEE 802.11r) requires "
- "nas_identifier to be configured as a 1..48 octet "
- "string");
- return -1;
- }
-#endif /* CONFIG_IEEE80211R */
-
-#ifdef CONFIG_IEEE80211N
- if (conf->ieee80211n && conf->hw_mode == HOSTAPD_MODE_IEEE80211B) {
- bss->disable_11n = 1;
- wpa_printf(MSG_ERROR, "HT (IEEE 802.11n) in 11b mode is not "
- "allowed, disabling HT capabilites");
- }
-
- if (conf->ieee80211n &&
- bss->ssid.security_policy == SECURITY_STATIC_WEP) {
- bss->disable_11n = 1;
- wpa_printf(MSG_ERROR, "HT (IEEE 802.11n) with WEP is not "
- "allowed, disabling HT capabilities");
- }
-
- if (conf->ieee80211n && bss->wpa &&
- !(bss->wpa_pairwise & WPA_CIPHER_CCMP) &&
- !(bss->rsn_pairwise & (WPA_CIPHER_CCMP | WPA_CIPHER_GCMP))) {
- bss->disable_11n = 1;
- wpa_printf(MSG_ERROR, "HT (IEEE 802.11n) with WPA/WPA2 "
- "requires CCMP/GCMP to be enabled, disabling HT "
- "capabilities");
- }
-#endif /* CONFIG_IEEE80211N */
-
-#ifdef CONFIG_WPS2
- if (bss->wps_state && bss->ignore_broadcast_ssid) {
- wpa_printf(MSG_INFO, "WPS: ignore_broadcast_ssid "
- "configuration forced WPS to be disabled");
- bss->wps_state = 0;
- }
-
- if (bss->wps_state && bss->ssid.wep.keys_set && bss->wpa == 0) {
- wpa_printf(MSG_INFO, "WPS: WEP configuration forced WPS to be "
- "disabled");
- bss->wps_state = 0;
- }
-
- if (bss->wps_state && bss->wpa &&
- (!(bss->wpa & 2) ||
- !(bss->rsn_pairwise & WPA_CIPHER_CCMP))) {
- wpa_printf(MSG_INFO, "WPS: WPA/TKIP configuration without "
- "WPA2/CCMP forced WPS to be disabled");
- bss->wps_state = 0;
- }
-#endif /* CONFIG_WPS2 */
-
-#ifdef CONFIG_HS20
- if (bss->hs20 &&
- (!(bss->wpa & 2) ||
- !(bss->rsn_pairwise & (WPA_CIPHER_CCMP | WPA_CIPHER_GCMP)))) {
- wpa_printf(MSG_ERROR, "HS 2.0: WPA2-Enterprise/CCMP "
- "configuration is required for Hotspot 2.0 "
- "functionality");
- return -1;
- }
-#endif /* CONFIG_HS20 */
-
- return 0;
-}
-
-
-static int hostapd_config_check(struct hostapd_config *conf)
-{
- size_t i;
-
- if (conf->ieee80211d && (!conf->country[0] || !conf->country[1])) {
- wpa_printf(MSG_ERROR, "Cannot enable IEEE 802.11d without "
- "setting the country_code");
- return -1;
- }
-
- if (conf->ieee80211h && !conf->ieee80211d) {
- wpa_printf(MSG_ERROR, "Cannot enable IEEE 802.11h without "
- "IEEE 802.11d enabled");
- return -1;
- }
-
- for (i = 0; i < conf->num_bss; i++) {
- if (hostapd_config_check_bss(&conf->bss[i], conf))
- return -1;
- }
-
- return 0;
-}
-
-
#ifdef CONFIG_INTERWORKING
static int parse_roaming_consortium(struct hostapd_bss_config *bss, char *pos,
int line)
@@ -1752,8 +1595,8 @@ static int hostapd_config_fill(struct hostapd_config *conf,
{
if (os_strcmp(buf, "interface") == 0) {
- os_strlcpy(conf->bss[0].iface, pos,
- sizeof(conf->bss[0].iface));
+ os_strlcpy(conf->bss[0]->iface, pos,
+ sizeof(conf->bss[0]->iface));
} else if (os_strcmp(buf, "bridge") == 0) {
os_strlcpy(bss->bridge, pos, sizeof(bss->bridge));
} else if (os_strcmp(buf, "vlan_bridge") == 0) {
@@ -2181,8 +2024,11 @@ static int hostapd_config_fill(struct hostapd_config *conf,
} else {
os_free(bss->ssid.wpa_passphrase);
bss->ssid.wpa_passphrase = os_strdup(pos);
- os_free(bss->ssid.wpa_psk);
- bss->ssid.wpa_psk = NULL;
+ if (bss->ssid.wpa_passphrase) {
+ os_free(bss->ssid.wpa_psk);
+ bss->ssid.wpa_psk = NULL;
+ bss->ssid.wpa_passphrase_set = 1;
+ }
}
} else if (os_strcmp(buf, "wpa_psk") == 0) {
os_free(bss->ssid.wpa_psk);
@@ -2200,6 +2046,7 @@ static int hostapd_config_fill(struct hostapd_config *conf,
bss->ssid.wpa_psk->group = 1;
os_free(bss->ssid.wpa_passphrase);
bss->ssid.wpa_passphrase = NULL;
+ bss->ssid.wpa_psk_set = 1;
}
} else if (os_strcmp(buf, "wpa_psk_file") == 0) {
os_free(bss->ssid.wpa_psk_file);
@@ -3069,53 +2916,6 @@ static int hostapd_config_fill(struct hostapd_config *conf,
}
-static void hostapd_set_security_params(struct hostapd_bss_config *bss)
-{
- if (bss->individual_wep_key_len == 0) {
- /* individual keys are not use; can use key idx0 for
- * broadcast keys */
- bss->broadcast_key_idx_min = 0;
- }
-
- if ((bss->wpa & 2) && bss->rsn_pairwise == 0)
- bss->rsn_pairwise = bss->wpa_pairwise;
- bss->wpa_group = wpa_select_ap_group_cipher(bss->wpa, bss->wpa_pairwise,
- bss->rsn_pairwise);
-
- bss->radius->auth_server = bss->radius->auth_servers;
- bss->radius->acct_server = bss->radius->acct_servers;
-
- if (bss->wpa && bss->ieee802_1x) {
- bss->ssid.security_policy = SECURITY_WPA;
- } else if (bss->wpa) {
- bss->ssid.security_policy = SECURITY_WPA_PSK;
- } else if (bss->ieee802_1x) {
- int cipher = WPA_CIPHER_NONE;
- bss->ssid.security_policy = SECURITY_IEEE_802_1X;
- bss->ssid.wep.default_len = bss->default_wep_key_len;
- if (bss->default_wep_key_len)
- cipher = bss->default_wep_key_len >= 13 ?
- WPA_CIPHER_WEP104 : WPA_CIPHER_WEP40;
- bss->wpa_group = cipher;
- bss->wpa_pairwise = cipher;
- bss->rsn_pairwise = cipher;
- } else if (bss->ssid.wep.keys_set) {
- int cipher = WPA_CIPHER_WEP40;
- if (bss->ssid.wep.len[0] >= 13)
- cipher = WPA_CIPHER_WEP104;
- bss->ssid.security_policy = SECURITY_STATIC_WEP;
- bss->wpa_group = cipher;
- bss->wpa_pairwise = cipher;
- bss->rsn_pairwise = cipher;
- } else {
- bss->ssid.security_policy = SECURITY_PLAINTEXT;
- bss->wpa_group = WPA_CIPHER_NONE;
- bss->wpa_pairwise = WPA_CIPHER_NONE;
- bss->rsn_pairwise = WPA_CIPHER_NONE;
- }
-}
-
-
/**
* hostapd_config_read - Read and parse a configuration file
* @fname: Configuration file name (including path, if needed)
@@ -3153,7 +2953,7 @@ struct hostapd_config * hostapd_config_read(const char *fname)
return NULL;
}
- bss = conf->last_bss = conf->bss;
+ bss = conf->last_bss = conf->bss[0];
while (fgets(buf, sizeof(buf), f)) {
bss = conf->last_bss;
@@ -3187,7 +2987,7 @@ struct hostapd_config * hostapd_config_read(const char *fname)
fclose(f);
for (i = 0; i < conf->num_bss; i++)
- hostapd_set_security_params(&conf->bss[i]);
+ hostapd_set_security_params(conf->bss[i]);
if (hostapd_config_check(conf))
errors++;
@@ -3219,7 +3019,7 @@ int hostapd_set_iface(struct hostapd_config *conf,
}
for (i = 0; i < conf->num_bss; i++)
- hostapd_set_security_params(&conf->bss[i]);
+ hostapd_set_security_params(conf->bss[i]);
if (hostapd_config_check(conf)) {
wpa_printf(MSG_ERROR, "Configuration check failed");