EAP peer: Add framework for external SIM/USIM processing
[mech_eap.git] / wpa_supplicant / config_file.c
index f29f7a6..b8fff70 100644 (file)
@@ -158,6 +158,7 @@ static struct wpa_ssid * wpa_config_read_network(FILE *f, int *line, int id)
        ssid = os_zalloc(sizeof(*ssid));
        if (ssid == NULL)
                return NULL;
+       dl_list_init(&ssid->psk_list);
        ssid->id = id;
 
        wpa_config_set_network_defaults(ssid);
@@ -345,7 +346,7 @@ static int wpa_config_process_blob(struct wpa_config *config, FILE *f,
 #endif /* CONFIG_NO_CONFIG_BLOBS */
 
 
-struct wpa_config * wpa_config_read(const char *name)
+struct wpa_config * wpa_config_read(const char *name, struct wpa_config *cfgp)
 {
        FILE *f;
        char buf[512], *pos;
@@ -356,12 +357,19 @@ struct wpa_config * wpa_config_read(const char *name)
        int id = 0;
        int cred_id = 0;
 
-       config = wpa_config_alloc_empty(NULL, NULL);
+       if (name == NULL)
+               return NULL;
+       if (cfgp)
+               config = cfgp;
+       else
+               config = wpa_config_alloc_empty(NULL, NULL);
        if (config == NULL) {
                wpa_printf(MSG_ERROR, "Failed to allocate config file "
                           "structure");
                return NULL;
        }
+       head = config->ssid;
+       cred_head = config->cred;
 
        wpa_printf(MSG_DEBUG, "Reading configuration file '%s'", name);
        f = fopen(name, "r");
@@ -597,6 +605,7 @@ static void write_wep_key(FILE *f, int idx, struct wpa_ssid *ssid)
 
 
 #ifdef CONFIG_P2P
+
 static void write_p2p_client_list(FILE *f, struct wpa_ssid *ssid)
 {
        char *value = wpa_config_get(ssid, "p2p_client_list");
@@ -605,6 +614,20 @@ static void write_p2p_client_list(FILE *f, struct wpa_ssid *ssid)
        fprintf(f, "\tp2p_client_list=%s\n", value);
        os_free(value);
 }
+
+
+static void write_psk_list(FILE *f, struct wpa_ssid *ssid)
+{
+       struct psk_list_entry *psk;
+       char hex[32 * 2 + 1];
+
+       dl_list_for_each(psk, &ssid->psk_list, struct psk_list_entry, list) {
+               wpa_snprintf_hex(hex, sizeof(hex), psk->psk, sizeof(psk->psk));
+               fprintf(f, "\tpsk_list=%s" MACSTR "-%s\n",
+                       psk->p2p ? "P2P-" : "", MAC2STR(psk->addr), hex);
+       }
+}
+
 #endif /* CONFIG_P2P */
 
 
@@ -630,6 +653,7 @@ static void wpa_config_write_network(FILE *f, struct wpa_ssid *ssid)
        write_auth_alg(f, ssid);
        STR(bgscan);
        STR(autoscan);
+       STR(scan_freq);
 #ifdef IEEE8021X_EAPOL
        write_eap(f, ssid);
        STR(identity);
@@ -643,6 +667,7 @@ static void wpa_config_write_network(FILE *f, struct wpa_ssid *ssid)
        STR(dh_file);
        STR(subject_match);
        STR(altsubject_match);
+       STR(domain_suffix_match);
        STR(ca_cert2);
        STR(ca_path2);
        STR(client_cert2);
@@ -651,6 +676,7 @@ static void wpa_config_write_network(FILE *f, struct wpa_ssid *ssid)
        STR(dh_file2);
        STR(subject_match2);
        STR(altsubject_match2);
+       STR(domain_suffix_match2);
        STR(phase1);
        STR(phase2);
        STR(pcsc);
@@ -689,7 +715,10 @@ static void wpa_config_write_network(FILE *f, struct wpa_ssid *ssid)
        STR(id_str);
 #ifdef CONFIG_P2P
        write_p2p_client_list(f, ssid);
+       write_psk_list(f, ssid);
 #endif /* CONFIG_P2P */
+       INT(dtim_period);
+       INT(beacon_int);
 
 #undef STR
 #undef INT
@@ -699,6 +728,8 @@ static void wpa_config_write_network(FILE *f, struct wpa_ssid *ssid)
 
 static void wpa_config_write_cred(FILE *f, struct wpa_cred *cred)
 {
+       size_t i;
+
        if (cred->priority)
                fprintf(f, "\tpriority=%d\n", cred->priority);
        if (cred->pcsc)
@@ -724,10 +755,12 @@ static void wpa_config_write_cred(FILE *f, struct wpa_cred *cred)
                fprintf(f, "\timsi=\"%s\"\n", cred->imsi);
        if (cred->milenage)
                fprintf(f, "\tmilenage=\"%s\"\n", cred->milenage);
-       if (cred->domain)
-               fprintf(f, "\tdomain=\"%s\"\n", cred->domain);
+       for (i = 0; i < cred->num_domain; i++)
+               fprintf(f, "\tdomain=\"%s\"\n", cred->domain[i]);
+       if (cred->domain_suffix_match)
+               fprintf(f, "\tdomain_suffix_match=\"%s\"",
+                       cred->domain_suffix_match);
        if (cred->roaming_consortium_len) {
-               size_t i;
                fprintf(f, "\troaming_consortium=");
                for (i = 0; i < cred->roaming_consortium_len; i++)
                        fprintf(f, "%02x", cred->roaming_consortium[i]);
@@ -744,7 +777,7 @@ static void wpa_config_write_cred(FILE *f, struct wpa_cred *cred)
        if (cred->phase2)
                fprintf(f, "\tphase2=\"%s\"\n", cred->phase2);
        if (cred->excluded_ssid) {
-               size_t i, j;
+               size_t j;
                for (i = 0; i < cred->num_excluded_ssid; i++) {
                        struct excluded_ssid *e = &cred->excluded_ssid[i];
                        fprintf(f, "\texcluded_ssid=");
@@ -915,6 +948,9 @@ static void wpa_config_write_global(FILE *f, struct wpa_config *config)
        if (config->p2p_no_group_iface)
                fprintf(f, "p2p_no_group_iface=%u\n",
                        config->p2p_no_group_iface);
+       if (config->p2p_ignore_shared_freq)
+               fprintf(f, "p2p_ignore_shared_freq=%u\n",
+                       config->p2p_ignore_shared_freq);
 #endif /* CONFIG_P2P */
        if (config->country[0] && config->country[1]) {
                fprintf(f, "country=%c%c\n",
@@ -974,6 +1010,10 @@ static void wpa_config_write_global(FILE *f, struct wpa_config *config)
                fprintf(f, "okc=%d\n", config->okc);
        if (config->pmf)
                fprintf(f, "pmf=%d\n", config->pmf);
+       if (config->dtim_period)
+               fprintf(f, "dtim_period=%d\n", config->dtim_period);
+       if (config->beacon_int)
+               fprintf(f, "beacon_int=%d\n", config->beacon_int);
 
        if (config->sae_groups) {
                int i;
@@ -984,6 +1024,40 @@ static void wpa_config_write_global(FILE *f, struct wpa_config *config)
                }
                fprintf(f, "\n");
        }
+
+       if (config->ap_vendor_elements) {
+               int i, len = wpabuf_len(config->ap_vendor_elements);
+               const u8 *p = wpabuf_head_u8(config->ap_vendor_elements);
+               if (len > 0) {
+                       fprintf(f, "ap_vendor_elements=");
+                       for (i = 0; i < len; i++)
+                               fprintf(f, "%02x", *p++);
+                       fprintf(f, "\n");
+               }
+       }
+
+       if (config->ignore_old_scan_res)
+               fprintf(f, "ignore_old_scan_res=%d\n",
+                       config->ignore_old_scan_res);
+
+       if (config->freq_list && config->freq_list[0]) {
+               int i;
+               fprintf(f, "freq_list=");
+               for (i = 0; config->freq_list[i]; i++) {
+                       fprintf(f, "%s%u", i > 0 ? " " : "",
+                               config->freq_list[i]);
+               }
+               fprintf(f, "\n");
+       }
+       if (config->scan_cur_freq != DEFAULT_SCAN_CUR_FREQ)
+               fprintf(f, "scan_cur_freq=%d\n", config->scan_cur_freq);
+
+       if (config->sched_scan_interval)
+               fprintf(f, "sched_scan_interval=%u\n",
+                       config->sched_scan_interval);
+
+       if (config->external_sim)
+               fprintf(f, "external_sim=%d\n", config->external_sim);
 }
 
 #endif /* CONFIG_NO_CONFIG_WRITE */