Updated to hostap_2_6
[mech_eap.git] / libeap / src / ap / ap_config.c
index 9a96e50..228de2b 100644 (file)
@@ -38,6 +38,8 @@ static void hostapd_config_free_vlan(struct hostapd_bss_config *bss)
 
 void hostapd_config_defaults_bss(struct hostapd_bss_config *bss)
 {
+       dl_list_init(&bss->anqp_elem);
+
        bss->logger_syslog_level = HOSTAPD_LEVEL_INFO;
        bss->logger_stdout_level = HOSTAPD_LEVEL_INFO;
        bss->logger_syslog = (unsigned int) -1;
@@ -63,6 +65,7 @@ void hostapd_config_defaults_bss(struct hostapd_bss_config *bss)
        bss->dtim_period = 2;
 
        bss->radius_server_auth_port = 1812;
+       bss->eap_sim_db_timeout = 1;
        bss->ap_max_inactivity = AP_MAX_INACTIVITY;
        bss->eapol_version = EAPOL_VERSION;
 
@@ -180,6 +183,7 @@ struct hostapd_config * hostapd_config_defaults(void)
        conf->ignore_assoc_probability = 0.0;
        conf->ignore_reassoc_probability = 0.0;
        conf->corrupt_gtk_rekey_mic_probability = 0.0;
+       conf->ecsa_ie_only = 0;
 #endif /* CONFIG_TESTING_OPTIONS */
 
        conf->acs = 0;
@@ -198,13 +202,6 @@ int hostapd_mac_comp(const void *a, const void *b)
 }
 
 
-int hostapd_mac_comp_empty(const void *a)
-{
-       macaddr empty = { 0 };
-       return os_memcmp(a, empty, sizeof(macaddr));
-}
-
-
 static int hostapd_config_read_wpa_psk(const char *fname,
                                       struct hostapd_ssid *ssid)
 {
@@ -410,6 +407,19 @@ void hostapd_config_clear_wpa_psk(struct hostapd_wpa_psk **l)
 }
 
 
+static void hostapd_config_free_anqp_elem(struct hostapd_bss_config *conf)
+{
+       struct anqp_element *elem;
+
+       while ((elem = dl_list_first(&conf->anqp_elem, struct anqp_element,
+                                    list))) {
+               dl_list_del(&elem->list);
+               wpabuf_free(elem->payload);
+               os_free(elem);
+       }
+}
+
+
 void hostapd_config_free_bss(struct hostapd_bss_config *conf)
 {
        struct hostapd_eap_user *user, *prev_user;
@@ -454,6 +464,7 @@ void hostapd_config_free_bss(struct hostapd_bss_config *conf)
        os_free(conf->private_key);
        os_free(conf->private_key_passwd);
        os_free(conf->ocsp_stapling_response);
+       os_free(conf->ocsp_stapling_response_multi);
        os_free(conf->dh_file);
        os_free(conf->openssl_ciphers);
        os_free(conf->pac_opaque_encr_key);
@@ -523,6 +534,7 @@ void hostapd_config_free_bss(struct hostapd_bss_config *conf)
        os_free(conf->network_auth_type);
        os_free(conf->anqp_3gpp_cell_net);
        os_free(conf->domain_name);
+       hostapd_config_free_anqp_elem(conf);
 
 #ifdef CONFIG_RADIUS_TEST
        os_free(conf->dump_msk_file);
@@ -555,6 +567,7 @@ void hostapd_config_free_bss(struct hostapd_bss_config *conf)
 #endif /* CONFIG_HS20 */
 
        wpabuf_free(conf->vendor_elements);
+       wpabuf_free(conf->assocresp_elements);
 
        os_free(conf->sae_groups);
 
@@ -594,6 +607,8 @@ void hostapd_config_free(struct hostapd_config *conf)
 #ifdef CONFIG_ACS
        os_free(conf->acs_chan_bias);
 #endif /* CONFIG_ACS */
+       wpabuf_free(conf->lci);
+       wpabuf_free(conf->civic);
 
        os_free(conf);
 }
@@ -610,7 +625,7 @@ void hostapd_config_free(struct hostapd_config *conf)
  * Perform a binary search for given MAC address from a pre-sorted list.
  */
 int hostapd_maclist_found(struct mac_acl_entry *list, int num_entries,
-                         const u8 *addr, int *vlan_id)
+                         const u8 *addr, struct vlan_description *vlan_id)
 {
        int start, end, middle, res;
 
@@ -650,11 +665,26 @@ int hostapd_rate_found(int *list, int rate)
 }
 
 
-int hostapd_vlan_id_valid(struct hostapd_vlan *vlan, int vlan_id)
+int hostapd_vlan_valid(struct hostapd_vlan *vlan,
+                      struct vlan_description *vlan_desc)
 {
        struct hostapd_vlan *v = vlan;
+       int i;
+
+       if (!vlan_desc->notempty || vlan_desc->untagged < 0 ||
+           vlan_desc->untagged > MAX_VLAN_ID)
+               return 0;
+       for (i = 0; i < MAX_NUM_TAGGED_VLAN; i++) {
+               if (vlan_desc->tagged[i] < 0 ||
+                   vlan_desc->tagged[i] > MAX_VLAN_ID)
+                       return 0;
+       }
+       if (!vlan_desc->untagged && !vlan_desc->tagged[0])
+               return 0;
+
        while (v) {
-               if (v->vlan_id == vlan_id || v->vlan_id == VLAN_ID_WILDCARD)
+               if (!vlan_compare(&v->vlan_desc, vlan_desc) ||
+                   v->vlan_id == VLAN_ID_WILDCARD)
                        return 1;
                v = v->next;
        }
@@ -756,7 +786,7 @@ static int hostapd_config_check_bss(struct hostapd_bss_config *bss,
                return -1;
        }
 
-       if (full_config && hostapd_mac_comp_empty(bss->bssid) != 0) {
+       if (full_config && !is_zero_ether_addr(bss->bssid)) {
                size_t i;
 
                for (i = 0; i < conf->num_bss; i++) {
@@ -811,6 +841,15 @@ static int hostapd_config_check_bss(struct hostapd_bss_config *bss,
        }
 #endif /* CONFIG_IEEE80211N */
 
+#ifdef CONFIG_IEEE80211AC
+       if (full_config && conf->ieee80211ac &&
+           bss->ssid.security_policy == SECURITY_STATIC_WEP) {
+               bss->disable_11ac = 1;
+               wpa_printf(MSG_ERROR,
+                          "VHT (IEEE 802.11ac) with WEP is not allowed, disabling VHT capabilities");
+       }
+#endif /* CONFIG_IEEE80211AC */
+
 #ifdef CONFIG_WPS
        if (full_config && bss->wps_state && bss->ignore_broadcast_ssid) {
                wpa_printf(MSG_INFO, "WPS: ignore_broadcast_ssid "
@@ -847,6 +886,15 @@ static int hostapd_config_check_bss(struct hostapd_bss_config *bss,
        }
 #endif /* CONFIG_HS20 */
 
+#ifdef CONFIG_MBO
+       if (full_config && bss->mbo_enabled && (bss->wpa & 2) &&
+           bss->ieee80211w == NO_MGMT_FRAME_PROTECTION) {
+               wpa_printf(MSG_ERROR,
+                          "MBO: PMF needs to be enabled whenever using WPA2 with MBO");
+               return -1;
+       }
+#endif /* CONFIG_MBO */
+
        return 0;
 }