|
@@ -917,6 +917,87 @@ static char * wpa_config_write_auth_alg(const struct parse_data *data,
|
|
|
#endif /* NO_CONFIG_WRITE */
|
|
|
|
|
|
|
|
|
+static int wpa_config_parse_scan_freq(const struct parse_data *data,
|
|
|
+ struct wpa_ssid *ssid, int line,
|
|
|
+ const char *value)
|
|
|
+{
|
|
|
+ int *freqs;
|
|
|
+ size_t used, len;
|
|
|
+ const char *pos;
|
|
|
+
|
|
|
+ used = 0;
|
|
|
+ len = 10;
|
|
|
+ freqs = os_zalloc((len + 1) * sizeof(int));
|
|
|
+ if (freqs == NULL)
|
|
|
+ return -1;
|
|
|
+
|
|
|
+ pos = value;
|
|
|
+ while (pos) {
|
|
|
+ while (*pos == ' ')
|
|
|
+ pos++;
|
|
|
+ if (used == len) {
|
|
|
+ int *n;
|
|
|
+ size_t i;
|
|
|
+ n = os_realloc(freqs, (len * 2 + 1) * sizeof(int));
|
|
|
+ if (n == NULL) {
|
|
|
+ os_free(freqs);
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+ for (i = len; i <= len * 2; i++)
|
|
|
+ n[i] = 0;
|
|
|
+ freqs = n;
|
|
|
+ len *= 2;
|
|
|
+ }
|
|
|
+
|
|
|
+ freqs[used] = atoi(pos);
|
|
|
+ if (freqs[used] == 0)
|
|
|
+ break;
|
|
|
+ used++;
|
|
|
+ pos = os_strchr(pos + 1, ' ');
|
|
|
+ }
|
|
|
+
|
|
|
+ os_free(ssid->scan_freq);
|
|
|
+ ssid->scan_freq = freqs;
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+#ifndef NO_CONFIG_WRITE
|
|
|
+static char * wpa_config_write_scan_freq(const struct parse_data *data,
|
|
|
+ struct wpa_ssid *ssid)
|
|
|
+{
|
|
|
+ char *buf, *pos, *end;
|
|
|
+ int i, ret;
|
|
|
+ size_t count;
|
|
|
+
|
|
|
+ if (ssid->scan_freq == NULL)
|
|
|
+ return NULL;
|
|
|
+
|
|
|
+ count = 0;
|
|
|
+ for (i = 0; ssid->scan_freq[i]; i++)
|
|
|
+ count++;
|
|
|
+
|
|
|
+ pos = buf = os_zalloc(10 * count + 1);
|
|
|
+ if (buf == NULL)
|
|
|
+ return NULL;
|
|
|
+ end = buf + 10 * count + 1;
|
|
|
+
|
|
|
+ for (i = 0; ssid->scan_freq[i]; i++) {
|
|
|
+ ret = os_snprintf(pos, end - pos, "%s%u",
|
|
|
+ i == 0 ? "" : " ", ssid->scan_freq[i]);
|
|
|
+ if (ret < 0 || ret >= end - pos) {
|
|
|
+ end[-1] = '\0';
|
|
|
+ return buf;
|
|
|
+ }
|
|
|
+ pos += ret;
|
|
|
+ }
|
|
|
+
|
|
|
+ return buf;
|
|
|
+}
|
|
|
+#endif /* NO_CONFIG_WRITE */
|
|
|
+
|
|
|
+
|
|
|
#ifdef IEEE8021X_EAPOL
|
|
|
static int wpa_config_parse_eap(const struct parse_data *data,
|
|
|
struct wpa_ssid *ssid, int line,
|
|
@@ -1317,6 +1398,7 @@ static const struct parse_data ssid_fields[] = {
|
|
|
{ FUNC(pairwise) },
|
|
|
{ FUNC(group) },
|
|
|
{ FUNC(auth_alg) },
|
|
|
+ { FUNC(scan_freq) },
|
|
|
#ifdef IEEE8021X_EAPOL
|
|
|
{ FUNC(eap) },
|
|
|
{ STR_LENe(identity) },
|
|
@@ -1540,6 +1622,7 @@ void wpa_config_free_ssid(struct wpa_ssid *ssid)
|
|
|
eap_peer_config_free(&ssid->eap);
|
|
|
#endif /* IEEE8021X_EAPOL */
|
|
|
os_free(ssid->id_str);
|
|
|
+ os_free(ssid->scan_freq);
|
|
|
os_free(ssid);
|
|
|
}
|
|
|
|