From e122bb70b8e42b0743f3ad64b4a2d6966b9486e3 Mon Sep 17 00:00:00 2001 From: Jouni Malinen Date: Tue, 7 Aug 2012 16:27:40 +0300 Subject: [PATCH] hostapd: Add alternative format for configuring SSID The new ssid2 parameter can be used as an alternative mechanism for configuring SSID for hostapd. It uses the same formats that wpa_supplicant uses in the configuration file for strings. Signed-hostap: Jouni Malinen --- hostapd/config_file.c | 14 ++++++++++++++ hostapd/hostapd.conf | 5 +++++ src/ap/wps_hostapd.c | 16 ++++++++++++---- src/utils/common.c | 12 ++++++++++++ src/utils/common.h | 1 + wpa_supplicant/config.c | 12 ------------ 6 files changed, 44 insertions(+), 16 deletions(-) diff --git a/hostapd/config_file.c b/hostapd/config_file.c index 1f898dbb2..03f29ad53 100644 --- a/hostapd/config_file.c +++ b/hostapd/config_file.c @@ -1472,6 +1472,20 @@ static int hostapd_config_fill(struct hostapd_config *conf, bss->ssid.ssid_len); bss->ssid.ssid_set = 1; } + } else if (os_strcmp(buf, "ssid2") == 0) { + size_t slen; + char *str = wpa_config_parse_string(pos, &slen); + if (str == NULL || slen < 1 || + slen > HOSTAPD_MAX_SSID_LEN) { + wpa_printf(MSG_ERROR, "Line %d: invalid SSID " + "'%s'", line, pos); + errors++; + } else { + os_memcpy(bss->ssid.ssid, str, slen); + bss->ssid.ssid_len = slen; + bss->ssid.ssid_set = 1; + } + os_free(str); } else if (os_strcmp(buf, "macaddr_acl") == 0) { bss->macaddr_acl = atoi(pos); if (bss->macaddr_acl != ACCEPT_UNLESS_DENIED && diff --git a/hostapd/hostapd.conf b/hostapd/hostapd.conf index 74f64d0e4..7e4e5d247 100644 --- a/hostapd/hostapd.conf +++ b/hostapd/hostapd.conf @@ -84,6 +84,11 @@ ctrl_interface_group=0 # SSID to be used in IEEE 802.11 management frames ssid=test +# Alternative formats for configuring SSID +# (double quoted string, hexdump, printf-escaped string) +#ssid2="test" +#ssid2=74657374 +#ssid2=P"hello\nthere" # Country code (ISO/IEC 3166-1). Used to set regulatory domain. # Set as needed to indicate country in which device is operating. diff --git a/src/ap/wps_hostapd.c b/src/ap/wps_hostapd.c index 07ce06c10..a051dfa15 100644 --- a/src/ap/wps_hostapd.c +++ b/src/ap/wps_hostapd.c @@ -371,10 +371,17 @@ static int hapd_wps_cred_cb(struct hostapd_data *hapd, void *ctx) fprintf(nconf, "wps_state=2\n"); - fprintf(nconf, "ssid="); - for (i = 0; i < cred->ssid_len; i++) - fputc(cred->ssid[i], nconf); - fprintf(nconf, "\n"); + if (is_hex(cred->ssid, cred->ssid_len)) { + fprintf(nconf, "ssid2="); + for (i = 0; i < cred->ssid_len; i++) + fprintf(nconf, "%02x", cred->ssid[i]); + fprintf(nconf, "\n"); + } else { + fprintf(nconf, "ssid="); + for (i = 0; i < cred->ssid_len; i++) + fputc(cred->ssid[i], nconf); + fprintf(nconf, "\n"); + } if ((cred->auth_type & (WPS_AUTH_WPA2 | WPS_AUTH_WPA2PSK)) && (cred->auth_type & (WPS_AUTH_WPA | WPS_AUTH_WPAPSK))) @@ -464,6 +471,7 @@ static int hapd_wps_cred_cb(struct hostapd_data *hapd, void *ctx) multi_bss = 1; if (!multi_bss && (str_starts(buf, "ssid=") || + str_starts(buf, "ssid2=") || str_starts(buf, "auth_algs=") || str_starts(buf, "wep_default_key=") || str_starts(buf, "wep_key") || diff --git a/src/utils/common.c b/src/utils/common.c index e0d20d2c3..bae73faca 100644 --- a/src/utils/common.c +++ b/src/utils/common.c @@ -566,3 +566,15 @@ char * wpa_config_parse_string(const char *value, size_t *len) return (char *) str; } } + + +int is_hex(const u8 *data, size_t len) +{ + size_t i; + + for (i = 0; i < len; i++) { + if (data[i] < 32 || data[i] >= 127) + return 1; + } + return 0; +} diff --git a/src/utils/common.h b/src/utils/common.h index 3833ce264..18b76bd43 100644 --- a/src/utils/common.h +++ b/src/utils/common.h @@ -447,6 +447,7 @@ size_t printf_decode(u8 *buf, size_t maxlen, const char *str); const char * wpa_ssid_txt(const u8 *ssid, size_t ssid_len); char * wpa_config_parse_string(const char *value, size_t *len); +int is_hex(const u8 *data, size_t len); static inline int is_zero_ether_addr(const u8 *a) { diff --git a/wpa_supplicant/config.c b/wpa_supplicant/config.c index c3cbca6c0..e72ac3432 100644 --- a/wpa_supplicant/config.c +++ b/wpa_supplicant/config.c @@ -113,18 +113,6 @@ set: #ifndef NO_CONFIG_WRITE -static int is_hex(const u8 *data, size_t len) -{ - size_t i; - - for (i = 0; i < len; i++) { - if (data[i] < 32 || data[i] >= 127) - return 1; - } - return 0; -} - - static char * wpa_config_write_string_ascii(const u8 *value, size_t len) { char *buf;