LCOV - code coverage report
Current view: top level - src/ap - ap_config.c (source / functions) Hit Total Coverage
Test: wpa_supplicant/hostapd combined for hwsim test run 1393793999 Lines: 415 530 78.3 %
Date: 2014-03-02 Functions: 21 24 87.5 %
Branches: 215 314 68.5 %

           Branch data     Line data    Source code
       1                 :            : /*
       2                 :            :  * hostapd / Configuration helper functions
       3                 :            :  * Copyright (c) 2003-2014, Jouni Malinen <j@w1.fi>
       4                 :            :  *
       5                 :            :  * This software may be distributed under the terms of the BSD license.
       6                 :            :  * See README for more details.
       7                 :            :  */
       8                 :            : 
       9                 :            : #include "utils/includes.h"
      10                 :            : 
      11                 :            : #include "utils/common.h"
      12                 :            : #include "crypto/sha1.h"
      13                 :            : #include "radius/radius_client.h"
      14                 :            : #include "common/ieee802_11_defs.h"
      15                 :            : #include "common/eapol_common.h"
      16                 :            : #include "eap_common/eap_wsc_common.h"
      17                 :            : #include "eap_server/eap.h"
      18                 :            : #include "wpa_auth.h"
      19                 :            : #include "sta_info.h"
      20                 :            : #include "ap_config.h"
      21                 :            : 
      22                 :            : 
      23                 :        442 : static void hostapd_config_free_vlan(struct hostapd_bss_config *bss)
      24                 :            : {
      25                 :            :         struct hostapd_vlan *vlan, *prev;
      26                 :            : 
      27                 :        442 :         vlan = bss->vlan;
      28                 :        442 :         prev = NULL;
      29         [ -  + ]:        442 :         while (vlan) {
      30                 :          0 :                 prev = vlan;
      31                 :          0 :                 vlan = vlan->next;
      32                 :          0 :                 os_free(prev);
      33                 :            :         }
      34                 :            : 
      35                 :        442 :         bss->vlan = NULL;
      36                 :        442 : }
      37                 :            : 
      38                 :            : 
      39                 :        442 : void hostapd_config_defaults_bss(struct hostapd_bss_config *bss)
      40                 :            : {
      41                 :        442 :         bss->logger_syslog_level = HOSTAPD_LEVEL_INFO;
      42                 :        442 :         bss->logger_stdout_level = HOSTAPD_LEVEL_INFO;
      43                 :        442 :         bss->logger_syslog = (unsigned int) -1;
      44                 :        442 :         bss->logger_stdout = (unsigned int) -1;
      45                 :            : 
      46                 :        442 :         bss->auth_algs = WPA_AUTH_ALG_OPEN | WPA_AUTH_ALG_SHARED;
      47                 :            : 
      48                 :        442 :         bss->wep_rekeying_period = 300;
      49                 :            :         /* use key0 in individual key and key1 in broadcast key */
      50                 :        442 :         bss->broadcast_key_idx_min = 1;
      51                 :        442 :         bss->broadcast_key_idx_max = 2;
      52                 :        442 :         bss->eap_reauth_period = 3600;
      53                 :            : 
      54                 :        442 :         bss->wpa_group_rekey = 600;
      55                 :        442 :         bss->wpa_gmk_rekey = 86400;
      56                 :        442 :         bss->wpa_key_mgmt = WPA_KEY_MGMT_PSK;
      57                 :        442 :         bss->wpa_pairwise = WPA_CIPHER_TKIP;
      58                 :        442 :         bss->wpa_group = WPA_CIPHER_TKIP;
      59                 :        442 :         bss->rsn_pairwise = 0;
      60                 :            : 
      61                 :        442 :         bss->max_num_sta = MAX_STA_COUNT;
      62                 :            : 
      63                 :        442 :         bss->dtim_period = 2;
      64                 :            : 
      65                 :        442 :         bss->radius_server_auth_port = 1812;
      66                 :        442 :         bss->ap_max_inactivity = AP_MAX_INACTIVITY;
      67                 :        442 :         bss->eapol_version = EAPOL_VERSION;
      68                 :            : 
      69                 :        442 :         bss->max_listen_interval = 65535;
      70                 :            : 
      71                 :        442 :         bss->pwd_group = 19; /* ECC: GF(p=256) */
      72                 :            : 
      73                 :            : #ifdef CONFIG_IEEE80211W
      74                 :        442 :         bss->assoc_sa_query_max_timeout = 1000;
      75                 :        442 :         bss->assoc_sa_query_retry_timeout = 201;
      76                 :            : #endif /* CONFIG_IEEE80211W */
      77                 :            : #ifdef EAP_SERVER_FAST
      78                 :            :          /* both anonymous and authenticated provisioning */
      79                 :        356 :         bss->eap_fast_prov = 3;
      80                 :        356 :         bss->pac_key_lifetime = 7 * 24 * 60 * 60;
      81                 :        356 :         bss->pac_key_refresh_time = 1 * 24 * 60 * 60;
      82                 :            : #endif /* EAP_SERVER_FAST */
      83                 :            : 
      84                 :            :         /* Set to -1 as defaults depends on HT in setup */
      85                 :        442 :         bss->wmm_enabled = -1;
      86                 :            : 
      87                 :            : #ifdef CONFIG_IEEE80211R
      88                 :        442 :         bss->ft_over_ds = 1;
      89                 :            : #endif /* CONFIG_IEEE80211R */
      90                 :            : 
      91                 :        442 :         bss->radius_das_time_window = 300;
      92                 :            : 
      93                 :        442 :         bss->sae_anti_clogging_threshold = 5;
      94                 :        442 : }
      95                 :            : 
      96                 :            : 
      97                 :        432 : struct hostapd_config * hostapd_config_defaults(void)
      98                 :            : {
      99                 :            : #define ecw2cw(ecw) ((1 << (ecw)) - 1)
     100                 :            : 
     101                 :            :         struct hostapd_config *conf;
     102                 :            :         struct hostapd_bss_config *bss;
     103                 :        432 :         const int aCWmin = 4, aCWmax = 10;
     104                 :        432 :         const struct hostapd_wmm_ac_params ac_bk =
     105                 :            :                 { aCWmin, aCWmax, 7, 0, 0 }; /* background traffic */
     106                 :        432 :         const struct hostapd_wmm_ac_params ac_be =
     107                 :            :                 { aCWmin, aCWmax, 3, 0, 0 }; /* best effort traffic */
     108                 :        432 :         const struct hostapd_wmm_ac_params ac_vi = /* video traffic */
     109                 :        432 :                 { aCWmin - 1, aCWmin, 2, 3000 / 32, 0 };
     110                 :        864 :         const struct hostapd_wmm_ac_params ac_vo = /* voice traffic */
     111                 :        864 :                 { aCWmin - 2, aCWmin - 1, 2, 1500 / 32, 0 };
     112                 :       1296 :         const struct hostapd_tx_queue_params txq_bk =
     113                 :        864 :                 { 7, ecw2cw(aCWmin), ecw2cw(aCWmax), 0 };
     114                 :       1296 :         const struct hostapd_tx_queue_params txq_be =
     115                 :        864 :                 { 3, ecw2cw(aCWmin), 4 * (ecw2cw(aCWmin) + 1) - 1, 0};
     116                 :       1296 :         const struct hostapd_tx_queue_params txq_vi =
     117                 :        864 :                 { 1, (ecw2cw(aCWmin) + 1) / 2 - 1, ecw2cw(aCWmin), 30};
     118                 :       1296 :         const struct hostapd_tx_queue_params txq_vo =
     119                 :        432 :                 { 1, (ecw2cw(aCWmin) + 1) / 4 - 1,
     120                 :        432 :                   (ecw2cw(aCWmin) + 1) / 2 - 1, 15};
     121                 :            : 
     122                 :            : #undef ecw2cw
     123                 :            : 
     124                 :        432 :         conf = os_zalloc(sizeof(*conf));
     125                 :        432 :         bss = os_zalloc(sizeof(*bss));
     126 [ -  + ][ +  - ]:        432 :         if (conf == NULL || bss == NULL) {
     127                 :          0 :                 wpa_printf(MSG_ERROR, "Failed to allocate memory for "
     128                 :            :                            "configuration data.");
     129                 :          0 :                 os_free(conf);
     130                 :          0 :                 os_free(bss);
     131                 :          0 :                 return NULL;
     132                 :            :         }
     133                 :        432 :         conf->bss = os_calloc(1, sizeof(struct hostapd_bss_config *));
     134         [ -  + ]:        432 :         if (conf->bss == NULL) {
     135                 :          0 :                 os_free(conf);
     136                 :          0 :                 os_free(bss);
     137                 :          0 :                 return NULL;
     138                 :            :         }
     139                 :        432 :         conf->bss[0] = bss;
     140                 :            : 
     141                 :        432 :         bss->radius = os_zalloc(sizeof(*bss->radius));
     142         [ -  + ]:        432 :         if (bss->radius == NULL) {
     143                 :          0 :                 os_free(conf->bss);
     144                 :          0 :                 os_free(conf);
     145                 :          0 :                 os_free(bss);
     146                 :          0 :                 return NULL;
     147                 :            :         }
     148                 :            : 
     149                 :        432 :         hostapd_config_defaults_bss(bss);
     150                 :            : 
     151                 :        432 :         conf->num_bss = 1;
     152                 :            : 
     153                 :        432 :         conf->beacon_int = 100;
     154                 :        432 :         conf->rts_threshold = -1; /* use driver default: 2347 */
     155                 :        432 :         conf->fragm_threshold = -1; /* user driver default: 2346 */
     156                 :        432 :         conf->send_probe_response = 1;
     157                 :            :         /* Set to invalid value means do not add Power Constraint IE */
     158                 :        432 :         conf->local_pwr_constraint = -1;
     159                 :            : 
     160                 :        432 :         conf->wmm_ac_params[0] = ac_be;
     161                 :        432 :         conf->wmm_ac_params[1] = ac_bk;
     162                 :        432 :         conf->wmm_ac_params[2] = ac_vi;
     163                 :        432 :         conf->wmm_ac_params[3] = ac_vo;
     164                 :            : 
     165                 :        432 :         conf->tx_queue[0] = txq_vo;
     166                 :        432 :         conf->tx_queue[1] = txq_vi;
     167                 :        432 :         conf->tx_queue[2] = txq_be;
     168                 :        432 :         conf->tx_queue[3] = txq_bk;
     169                 :            : 
     170                 :        432 :         conf->ht_capab = HT_CAP_INFO_SMPS_DISABLED;
     171                 :            : 
     172                 :        432 :         conf->ap_table_max_size = 255;
     173                 :        432 :         conf->ap_table_expiration_time = 60;
     174                 :            : 
     175                 :            : #ifdef CONFIG_TESTING_OPTIONS
     176                 :        432 :         conf->ignore_probe_probability = 0.0d;
     177                 :        432 :         conf->ignore_auth_probability = 0.0d;
     178                 :        432 :         conf->ignore_assoc_probability = 0.0d;
     179                 :        432 :         conf->ignore_reassoc_probability = 0.0d;
     180                 :        432 :         conf->corrupt_gtk_rekey_mic_probability = 0.0d;
     181                 :            : #endif /* CONFIG_TESTING_OPTIONS */
     182                 :            : 
     183                 :            : #ifdef CONFIG_ACS
     184                 :        346 :         conf->acs_num_scans = 5;
     185                 :            : #endif /* CONFIG_ACS */
     186                 :            : 
     187                 :        432 :         return conf;
     188                 :            : }
     189                 :            : 
     190                 :            : 
     191                 :         41 : int hostapd_mac_comp(const void *a, const void *b)
     192                 :            : {
     193                 :         41 :         return os_memcmp(a, b, sizeof(macaddr));
     194                 :            : }
     195                 :            : 
     196                 :            : 
     197                 :       1231 : int hostapd_mac_comp_empty(const void *a)
     198                 :            : {
     199                 :       1231 :         macaddr empty = { 0 };
     200                 :       1231 :         return os_memcmp(a, empty, sizeof(macaddr));
     201                 :            : }
     202                 :            : 
     203                 :            : 
     204                 :          1 : static int hostapd_config_read_wpa_psk(const char *fname,
     205                 :            :                                        struct hostapd_ssid *ssid)
     206                 :            : {
     207                 :            :         FILE *f;
     208                 :            :         char buf[128], *pos;
     209                 :          1 :         int line = 0, ret = 0, len, ok;
     210                 :            :         u8 addr[ETH_ALEN];
     211                 :            :         struct hostapd_wpa_psk *psk;
     212                 :            : 
     213         [ -  + ]:          1 :         if (!fname)
     214                 :          0 :                 return 0;
     215                 :            : 
     216                 :          1 :         f = fopen(fname, "r");
     217         [ -  + ]:          1 :         if (!f) {
     218                 :          0 :                 wpa_printf(MSG_ERROR, "WPA PSK file '%s' not found.", fname);
     219                 :          0 :                 return -1;
     220                 :            :         }
     221                 :            : 
     222         [ +  + ]:          6 :         while (fgets(buf, sizeof(buf), f)) {
     223                 :          5 :                 line++;
     224                 :            : 
     225         [ -  + ]:          5 :                 if (buf[0] == '#')
     226                 :          0 :                         continue;
     227                 :          5 :                 pos = buf;
     228         [ +  - ]:        236 :                 while (*pos != '\0') {
     229         [ +  + ]:        236 :                         if (*pos == '\n') {
     230                 :          5 :                                 *pos = '\0';
     231                 :          5 :                                 break;
     232                 :            :                         }
     233                 :        231 :                         pos++;
     234                 :            :                 }
     235         [ -  + ]:          5 :                 if (buf[0] == '\0')
     236                 :          0 :                         continue;
     237                 :            : 
     238         [ -  + ]:          5 :                 if (hwaddr_aton(buf, addr)) {
     239                 :          0 :                         wpa_printf(MSG_ERROR, "Invalid MAC address '%s' on "
     240                 :            :                                    "line %d in '%s'", buf, line, fname);
     241                 :          0 :                         ret = -1;
     242                 :          0 :                         break;
     243                 :            :                 }
     244                 :            : 
     245                 :          5 :                 psk = os_zalloc(sizeof(*psk));
     246         [ -  + ]:          5 :                 if (psk == NULL) {
     247                 :          0 :                         wpa_printf(MSG_ERROR, "WPA PSK allocation failed");
     248                 :          0 :                         ret = -1;
     249                 :          0 :                         break;
     250                 :            :                 }
     251         [ +  + ]:          5 :                 if (is_zero_ether_addr(addr))
     252                 :          2 :                         psk->group = 1;
     253                 :            :                 else
     254                 :          3 :                         os_memcpy(psk->addr, addr, ETH_ALEN);
     255                 :            : 
     256                 :          5 :                 pos = buf + 17;
     257         [ -  + ]:          5 :                 if (*pos == '\0') {
     258                 :          0 :                         wpa_printf(MSG_ERROR, "No PSK on line %d in '%s'",
     259                 :            :                                    line, fname);
     260                 :          0 :                         os_free(psk);
     261                 :          0 :                         ret = -1;
     262                 :          0 :                         break;
     263                 :            :                 }
     264                 :          5 :                 pos++;
     265                 :            : 
     266                 :          5 :                 ok = 0;
     267                 :          5 :                 len = os_strlen(pos);
     268 [ +  + ][ +  - ]:          5 :                 if (len == 64 && hexstr2bin(pos, psk->psk, PMK_LEN) == 0)
     269                 :          1 :                         ok = 1;
     270 [ +  - ][ +  - ]:          4 :                 else if (len >= 8 && len < 64) {
     271                 :          4 :                         pbkdf2_sha1(pos, ssid->ssid, ssid->ssid_len,
     272                 :          4 :                                     4096, psk->psk, PMK_LEN);
     273                 :          4 :                         ok = 1;
     274                 :            :                 }
     275         [ -  + ]:          5 :                 if (!ok) {
     276                 :          0 :                         wpa_printf(MSG_ERROR, "Invalid PSK '%s' on line %d in "
     277                 :            :                                    "'%s'", pos, line, fname);
     278                 :          0 :                         os_free(psk);
     279                 :          0 :                         ret = -1;
     280                 :          0 :                         break;
     281                 :            :                 }
     282                 :            : 
     283                 :          5 :                 psk->next = ssid->wpa_psk;
     284                 :          5 :                 ssid->wpa_psk = psk;
     285                 :            :         }
     286                 :            : 
     287                 :          1 :         fclose(f);
     288                 :            : 
     289                 :          1 :         return ret;
     290                 :            : }
     291                 :            : 
     292                 :            : 
     293                 :        112 : static int hostapd_derive_psk(struct hostapd_ssid *ssid)
     294                 :            : {
     295                 :        112 :         ssid->wpa_psk = os_zalloc(sizeof(struct hostapd_wpa_psk));
     296         [ -  + ]:        112 :         if (ssid->wpa_psk == NULL) {
     297                 :          0 :                 wpa_printf(MSG_ERROR, "Unable to alloc space for PSK");
     298                 :          0 :                 return -1;
     299                 :            :         }
     300                 :        112 :         wpa_hexdump_ascii(MSG_DEBUG, "SSID",
     301                 :        112 :                           (u8 *) ssid->ssid, ssid->ssid_len);
     302                 :        112 :         wpa_hexdump_ascii_key(MSG_DEBUG, "PSK (ASCII passphrase)",
     303                 :        112 :                               (u8 *) ssid->wpa_passphrase,
     304                 :        112 :                               os_strlen(ssid->wpa_passphrase));
     305                 :        112 :         pbkdf2_sha1(ssid->wpa_passphrase,
     306                 :        112 :                     ssid->ssid, ssid->ssid_len,
     307                 :        112 :                     4096, ssid->wpa_psk->psk, PMK_LEN);
     308                 :        112 :         wpa_hexdump_key(MSG_DEBUG, "PSK (from passphrase)",
     309                 :        112 :                         ssid->wpa_psk->psk, PMK_LEN);
     310                 :        112 :         return 0;
     311                 :            : }
     312                 :            : 
     313                 :            : 
     314                 :        444 : int hostapd_setup_wpa_psk(struct hostapd_bss_config *conf)
     315                 :            : {
     316                 :        444 :         struct hostapd_ssid *ssid = &conf->ssid;
     317                 :            : 
     318         [ +  + ]:        444 :         if (ssid->wpa_passphrase != NULL) {
     319         [ -  + ]:        112 :                 if (ssid->wpa_psk != NULL) {
     320                 :          0 :                         wpa_printf(MSG_DEBUG, "Using pre-configured WPA PSK "
     321                 :            :                                    "instead of passphrase");
     322                 :            :                 } else {
     323                 :        112 :                         wpa_printf(MSG_DEBUG, "Deriving WPA PSK based on "
     324                 :            :                                    "passphrase");
     325         [ -  + ]:        112 :                         if (hostapd_derive_psk(ssid) < 0)
     326                 :          0 :                                 return -1;
     327                 :            :                 }
     328                 :        112 :                 ssid->wpa_psk->group = 1;
     329                 :            :         }
     330                 :            : 
     331         [ +  + ]:        444 :         if (ssid->wpa_psk_file) {
     332         [ -  + ]:          1 :                 if (hostapd_config_read_wpa_psk(ssid->wpa_psk_file,
     333                 :            :                                                 &conf->ssid))
     334                 :          0 :                         return -1;
     335                 :            :         }
     336                 :            : 
     337                 :        444 :         return 0;
     338                 :            : }
     339                 :            : 
     340                 :            : 
     341                 :          0 : int hostapd_wep_key_cmp(struct hostapd_wep_keys *a, struct hostapd_wep_keys *b)
     342                 :            : {
     343                 :            :         int i;
     344                 :            : 
     345 [ #  # ][ #  # ]:          0 :         if (a->idx != b->idx || a->default_len != b->default_len)
     346                 :          0 :                 return 1;
     347         [ #  # ]:          0 :         for (i = 0; i < NUM_WEP_KEYS; i++)
     348 [ #  # ][ #  # ]:          0 :                 if (a->len[i] != b->len[i] ||
     349                 :          0 :                     os_memcmp(a->key[i], b->key[i], a->len[i]) != 0)
     350                 :          0 :                         return 1;
     351                 :          0 :         return 0;
     352                 :            : }
     353                 :            : 
     354                 :            : 
     355                 :        884 : static void hostapd_config_free_radius(struct hostapd_radius_server *servers,
     356                 :            :                                        int num_servers)
     357                 :            : {
     358                 :            :         int i;
     359                 :            : 
     360         [ +  + ]:       1035 :         for (i = 0; i < num_servers; i++) {
     361                 :        151 :                 os_free(servers[i].shared_secret);
     362                 :            :         }
     363                 :        884 :         os_free(servers);
     364                 :        884 : }
     365                 :            : 
     366                 :            : 
     367                 :            : struct hostapd_radius_attr *
     368                 :       8484 : hostapd_config_get_radius_attr(struct hostapd_radius_attr *attr, u8 type)
     369                 :            : {
     370         [ -  + ]:       8484 :         for (; attr; attr = attr->next) {
     371         [ #  # ]:          0 :                 if (attr->type == type)
     372                 :          0 :                         return attr;
     373                 :            :         }
     374                 :       8484 :         return NULL;
     375                 :            : }
     376                 :            : 
     377                 :            : 
     378                 :        884 : static void hostapd_config_free_radius_attr(struct hostapd_radius_attr *attr)
     379                 :            : {
     380                 :            :         struct hostapd_radius_attr *prev;
     381                 :            : 
     382         [ -  + ]:        884 :         while (attr) {
     383                 :          0 :                 prev = attr;
     384                 :          0 :                 attr = attr->next;
     385                 :          0 :                 wpabuf_free(prev->val);
     386                 :          0 :                 os_free(prev);
     387                 :            :         }
     388                 :        884 : }
     389                 :            : 
     390                 :            : 
     391                 :        518 : static void hostapd_config_free_eap_user(struct hostapd_eap_user *user)
     392                 :            : {
     393                 :        518 :         os_free(user->identity);
     394                 :        518 :         os_free(user->password);
     395                 :        518 :         os_free(user);
     396                 :        518 : }
     397                 :            : 
     398                 :            : 
     399                 :        442 : static void hostapd_config_free_wep(struct hostapd_wep_keys *keys)
     400                 :            : {
     401                 :            :         int i;
     402         [ +  + ]:       2210 :         for (i = 0; i < NUM_WEP_KEYS; i++) {
     403                 :       1768 :                 os_free(keys->key[i]);
     404                 :       1768 :                 keys->key[i] = NULL;
     405                 :            :         }
     406                 :        442 : }
     407                 :            : 
     408                 :            : 
     409                 :        442 : void hostapd_config_free_bss(struct hostapd_bss_config *conf)
     410                 :            : {
     411                 :            :         struct hostapd_wpa_psk *psk, *prev;
     412                 :            :         struct hostapd_eap_user *user, *prev_user;
     413                 :            : 
     414         [ -  + ]:        442 :         if (conf == NULL)
     415                 :        442 :                 return;
     416                 :            : 
     417                 :        442 :         psk = conf->ssid.wpa_psk;
     418         [ +  + ]:        645 :         while (psk) {
     419                 :        203 :                 prev = psk;
     420                 :        203 :                 psk = psk->next;
     421                 :        203 :                 os_free(prev);
     422                 :            :         }
     423                 :            : 
     424                 :        442 :         os_free(conf->ssid.wpa_passphrase);
     425                 :        442 :         os_free(conf->ssid.wpa_psk_file);
     426                 :        442 :         hostapd_config_free_wep(&conf->ssid.wep);
     427                 :            : #ifdef CONFIG_FULL_DYNAMIC_VLAN
     428                 :        356 :         os_free(conf->ssid.vlan_tagged_interface);
     429                 :            : #endif /* CONFIG_FULL_DYNAMIC_VLAN */
     430                 :            : 
     431                 :        442 :         user = conf->eap_user;
     432         [ +  + ]:        960 :         while (user) {
     433                 :        518 :                 prev_user = user;
     434                 :        518 :                 user = user->next;
     435                 :        518 :                 hostapd_config_free_eap_user(prev_user);
     436                 :            :         }
     437                 :        442 :         os_free(conf->eap_user_sqlite);
     438                 :            : 
     439                 :        442 :         os_free(conf->eap_req_id_text);
     440                 :        442 :         os_free(conf->accept_mac);
     441                 :        442 :         os_free(conf->deny_mac);
     442                 :        442 :         os_free(conf->nas_identifier);
     443         [ +  - ]:        442 :         if (conf->radius) {
     444                 :        442 :                 hostapd_config_free_radius(conf->radius->auth_servers,
     445                 :        442 :                                            conf->radius->num_auth_servers);
     446                 :        442 :                 hostapd_config_free_radius(conf->radius->acct_servers,
     447                 :        442 :                                            conf->radius->num_acct_servers);
     448                 :            :         }
     449                 :        442 :         hostapd_config_free_radius_attr(conf->radius_auth_req_attr);
     450                 :        442 :         hostapd_config_free_radius_attr(conf->radius_acct_req_attr);
     451                 :        442 :         os_free(conf->rsn_preauth_interfaces);
     452                 :        442 :         os_free(conf->ctrl_interface);
     453                 :        442 :         os_free(conf->ca_cert);
     454                 :        442 :         os_free(conf->server_cert);
     455                 :        442 :         os_free(conf->private_key);
     456                 :        442 :         os_free(conf->private_key_passwd);
     457                 :        442 :         os_free(conf->ocsp_stapling_response);
     458                 :        442 :         os_free(conf->dh_file);
     459                 :        442 :         os_free(conf->pac_opaque_encr_key);
     460                 :        442 :         os_free(conf->eap_fast_a_id);
     461                 :        442 :         os_free(conf->eap_fast_a_id_info);
     462                 :        442 :         os_free(conf->eap_sim_db);
     463                 :        442 :         os_free(conf->radius_server_clients);
     464                 :        442 :         os_free(conf->test_socket);
     465                 :        442 :         os_free(conf->radius);
     466                 :        442 :         os_free(conf->radius_das_shared_secret);
     467                 :        442 :         hostapd_config_free_vlan(conf);
     468                 :        442 :         os_free(conf->time_zone);
     469                 :            : 
     470                 :            : #ifdef CONFIG_IEEE80211R
     471                 :            :         {
     472                 :            :                 struct ft_remote_r0kh *r0kh, *r0kh_prev;
     473                 :            :                 struct ft_remote_r1kh *r1kh, *r1kh_prev;
     474                 :            : 
     475                 :        442 :                 r0kh = conf->r0kh_list;
     476                 :        442 :                 conf->r0kh_list = NULL;
     477         [ +  + ]:        474 :                 while (r0kh) {
     478                 :         32 :                         r0kh_prev = r0kh;
     479                 :         32 :                         r0kh = r0kh->next;
     480                 :         32 :                         os_free(r0kh_prev);
     481                 :            :                 }
     482                 :            : 
     483                 :        442 :                 r1kh = conf->r1kh_list;
     484                 :        442 :                 conf->r1kh_list = NULL;
     485         [ +  + ]:        458 :                 while (r1kh) {
     486                 :         16 :                         r1kh_prev = r1kh;
     487                 :         16 :                         r1kh = r1kh->next;
     488                 :         16 :                         os_free(r1kh_prev);
     489                 :            :                 }
     490                 :            :         }
     491                 :            : #endif /* CONFIG_IEEE80211R */
     492                 :            : 
     493                 :            : #ifdef CONFIG_WPS
     494                 :        442 :         os_free(conf->wps_pin_requests);
     495                 :        442 :         os_free(conf->device_name);
     496                 :        442 :         os_free(conf->manufacturer);
     497                 :        442 :         os_free(conf->model_name);
     498                 :        442 :         os_free(conf->model_number);
     499                 :        442 :         os_free(conf->serial_number);
     500                 :        442 :         os_free(conf->config_methods);
     501                 :        442 :         os_free(conf->ap_pin);
     502                 :        442 :         os_free(conf->extra_cred);
     503                 :        442 :         os_free(conf->ap_settings);
     504                 :        442 :         os_free(conf->upnp_iface);
     505                 :        442 :         os_free(conf->friendly_name);
     506                 :        442 :         os_free(conf->manufacturer_url);
     507                 :        442 :         os_free(conf->model_description);
     508                 :        442 :         os_free(conf->model_url);
     509                 :        442 :         os_free(conf->upc);
     510                 :        442 :         wpabuf_free(conf->wps_nfc_dh_pubkey);
     511                 :        442 :         wpabuf_free(conf->wps_nfc_dh_privkey);
     512                 :        442 :         wpabuf_free(conf->wps_nfc_dev_pw);
     513                 :            : #endif /* CONFIG_WPS */
     514                 :            : 
     515                 :        442 :         os_free(conf->roaming_consortium);
     516                 :        442 :         os_free(conf->venue_name);
     517                 :        442 :         os_free(conf->nai_realm_data);
     518                 :        442 :         os_free(conf->network_auth_type);
     519                 :        442 :         os_free(conf->anqp_3gpp_cell_net);
     520                 :        442 :         os_free(conf->domain_name);
     521                 :            : 
     522                 :            : #ifdef CONFIG_RADIUS_TEST
     523                 :            :         os_free(conf->dump_msk_file);
     524                 :            : #endif /* CONFIG_RADIUS_TEST */
     525                 :            : 
     526                 :            : #ifdef CONFIG_HS20
     527                 :        442 :         os_free(conf->hs20_oper_friendly_name);
     528                 :        442 :         os_free(conf->hs20_wan_metrics);
     529                 :        442 :         os_free(conf->hs20_connection_capability);
     530                 :        442 :         os_free(conf->hs20_operating_class);
     531                 :        442 :         os_free(conf->hs20_icons);
     532         [ +  + ]:        442 :         if (conf->hs20_osu_providers) {
     533                 :            :                 size_t i;
     534         [ +  + ]:          4 :                 for (i = 0; i < conf->hs20_osu_providers_count; i++) {
     535                 :            :                         struct hs20_osu_provider *p;
     536                 :            :                         size_t j;
     537                 :          2 :                         p = &conf->hs20_osu_providers[i];
     538                 :          2 :                         os_free(p->friendly_name);
     539                 :          2 :                         os_free(p->server_uri);
     540                 :          2 :                         os_free(p->method_list);
     541         [ +  + ]:          4 :                         for (j = 0; j < p->icons_count; j++)
     542                 :          2 :                                 os_free(p->icons[j]);
     543                 :          2 :                         os_free(p->icons);
     544                 :          2 :                         os_free(p->osu_nai);
     545                 :          2 :                         os_free(p->service_desc);
     546                 :            :                 }
     547                 :          2 :                 os_free(conf->hs20_osu_providers);
     548                 :            :         }
     549                 :        442 :         os_free(conf->subscr_remediation_url);
     550                 :            : #endif /* CONFIG_HS20 */
     551                 :            : 
     552                 :        442 :         wpabuf_free(conf->vendor_elements);
     553                 :            : 
     554                 :        442 :         os_free(conf->sae_groups);
     555                 :            : 
     556                 :        442 :         os_free(conf->server_id);
     557                 :            : 
     558                 :        442 :         os_free(conf);
     559                 :            : }
     560                 :            : 
     561                 :            : 
     562                 :            : /**
     563                 :            :  * hostapd_config_free - Free hostapd configuration
     564                 :            :  * @conf: Configuration data from hostapd_config_read().
     565                 :            :  */
     566                 :        432 : void hostapd_config_free(struct hostapd_config *conf)
     567                 :            : {
     568                 :            :         size_t i;
     569                 :            : 
     570         [ -  + ]:        432 :         if (conf == NULL)
     571                 :        432 :                 return;
     572                 :            : 
     573         [ +  + ]:        858 :         for (i = 0; i < conf->num_bss; i++)
     574                 :        426 :                 hostapd_config_free_bss(conf->bss[i]);
     575                 :        432 :         os_free(conf->bss);
     576                 :        432 :         os_free(conf->supported_rates);
     577                 :        432 :         os_free(conf->basic_rates);
     578                 :            : 
     579                 :        432 :         os_free(conf);
     580                 :            : }
     581                 :            : 
     582                 :            : 
     583                 :            : /**
     584                 :            :  * hostapd_maclist_found - Find a MAC address from a list
     585                 :            :  * @list: MAC address list
     586                 :            :  * @num_entries: Number of addresses in the list
     587                 :            :  * @addr: Address to search for
     588                 :            :  * @vlan_id: Buffer for returning VLAN ID or %NULL if not needed
     589                 :            :  * Returns: 1 if address is in the list or 0 if not.
     590                 :            :  *
     591                 :            :  * Perform a binary search for given MAC address from a pre-sorted list.
     592                 :            :  */
     593                 :       1335 : int hostapd_maclist_found(struct mac_acl_entry *list, int num_entries,
     594                 :            :                           const u8 *addr, int *vlan_id)
     595                 :            : {
     596                 :            :         int start, end, middle, res;
     597                 :            : 
     598                 :       1335 :         start = 0;
     599                 :       1335 :         end = num_entries - 1;
     600                 :            : 
     601         [ +  + ]:       1335 :         while (start <= end) {
     602                 :         45 :                 middle = (start + end) / 2;
     603                 :         45 :                 res = os_memcmp(list[middle].addr, addr, ETH_ALEN);
     604         [ +  - ]:         45 :                 if (res == 0) {
     605         [ +  - ]:         45 :                         if (vlan_id)
     606                 :         45 :                                 *vlan_id = list[middle].vlan_id;
     607                 :         45 :                         return 1;
     608                 :            :                 }
     609         [ #  # ]:          0 :                 if (res < 0)
     610                 :          0 :                         start = middle + 1;
     611                 :            :                 else
     612                 :          0 :                         end = middle - 1;
     613                 :            :         }
     614                 :            : 
     615                 :       1335 :         return 0;
     616                 :            : }
     617                 :            : 
     618                 :            : 
     619                 :       5564 : int hostapd_rate_found(int *list, int rate)
     620                 :            : {
     621                 :            :         int i;
     622                 :            : 
     623         [ -  + ]:       5564 :         if (list == NULL)
     624                 :          0 :                 return 0;
     625                 :            : 
     626         [ +  + ]:      24349 :         for (i = 0; list[i] >= 0; i++)
     627         [ +  + ]:      20987 :                 if (list[i] == rate)
     628                 :       2202 :                         return 1;
     629                 :            : 
     630                 :       5564 :         return 0;
     631                 :            : }
     632                 :            : 
     633                 :            : 
     634                 :          0 : int hostapd_vlan_id_valid(struct hostapd_vlan *vlan, int vlan_id)
     635                 :            : {
     636                 :          0 :         struct hostapd_vlan *v = vlan;
     637         [ #  # ]:          0 :         while (v) {
     638 [ #  # ][ #  # ]:          0 :                 if (v->vlan_id == vlan_id || v->vlan_id == VLAN_ID_WILDCARD)
     639                 :          0 :                         return 1;
     640                 :          0 :                 v = v->next;
     641                 :            :         }
     642                 :          0 :         return 0;
     643                 :            : }
     644                 :            : 
     645                 :            : 
     646                 :          0 : const char * hostapd_get_vlan_id_ifname(struct hostapd_vlan *vlan, int vlan_id)
     647                 :            : {
     648                 :          0 :         struct hostapd_vlan *v = vlan;
     649         [ #  # ]:          0 :         while (v) {
     650         [ #  # ]:          0 :                 if (v->vlan_id == vlan_id)
     651                 :          0 :                         return v->ifname;
     652                 :          0 :                 v = v->next;
     653                 :            :         }
     654                 :          0 :         return NULL;
     655                 :            : }
     656                 :            : 
     657                 :            : 
     658                 :        699 : const u8 * hostapd_get_psk(const struct hostapd_bss_config *conf,
     659                 :            :                            const u8 *addr, const u8 *p2p_dev_addr,
     660                 :            :                            const u8 *prev_psk)
     661                 :            : {
     662                 :            :         struct hostapd_wpa_psk *psk;
     663                 :        699 :         int next_ok = prev_psk == NULL;
     664                 :            : 
     665         [ +  - ]:        699 :         if (p2p_dev_addr) {
     666                 :        699 :                 wpa_printf(MSG_DEBUG, "Searching a PSK for " MACSTR
     667                 :            :                            " p2p_dev_addr=" MACSTR " prev_psk=%p",
     668                 :       8388 :                            MAC2STR(addr), MAC2STR(p2p_dev_addr), prev_psk);
     669         [ +  + ]:        699 :                 if (!is_zero_ether_addr(p2p_dev_addr))
     670                 :        305 :                         addr = NULL; /* Use P2P Device Address for matching */
     671                 :            :         } else {
     672                 :          0 :                 wpa_printf(MSG_DEBUG, "Searching a PSK for " MACSTR
     673                 :            :                            " prev_psk=%p",
     674                 :          0 :                            MAC2STR(addr), prev_psk);
     675                 :            :         }
     676                 :            : 
     677         [ +  + ]:        805 :         for (psk = conf->ssid.wpa_psk; psk != NULL; psk = psk->next) {
     678 [ +  + ][ +  + ]:        777 :                 if (next_ok &&
     679         [ +  + ]:         51 :                     (psk->group ||
     680 [ +  + ][ +  + ]:         51 :                      (addr && os_memcmp(psk->addr, addr, ETH_ALEN) == 0) ||
     681 [ +  - ][ +  + ]:         30 :                      (!addr && p2p_dev_addr &&
     682                 :         30 :                       os_memcmp(psk->p2p_dev_addr, p2p_dev_addr, ETH_ALEN) ==
     683                 :            :                       0)))
     684                 :        671 :                         return psk->psk;
     685                 :            : 
     686         [ +  + ]:        106 :                 if (psk->psk == prev_psk)
     687                 :         39 :                         next_ok = 1;
     688                 :            :         }
     689                 :            : 
     690                 :        699 :         return NULL;
     691                 :            : }
     692                 :            : 
     693                 :            : 
     694                 :       7190 : static int hostapd_config_check_bss(struct hostapd_bss_config *bss,
     695                 :            :                                     struct hostapd_config *conf,
     696                 :            :                                     int full_config)
     697                 :            : {
     698 [ +  + ][ +  + ]:       7190 :         if (full_config && bss->ieee802_1x && !bss->eap_server &&
         [ +  + ][ -  + ]
     699                 :        147 :             !bss->radius->auth_servers) {
     700                 :          0 :                 wpa_printf(MSG_ERROR, "Invalid IEEE 802.1X configuration (no "
     701                 :            :                            "EAP authenticator configured).");
     702                 :          0 :                 return -1;
     703                 :            :         }
     704                 :            : 
     705         [ +  + ]:       7190 :         if (bss->wpa) {
     706                 :            :                 int wep, i;
     707                 :            : 
     708 [ +  - ][ -  + ]:       4238 :                 wep = bss->default_wep_key_len > 0 ||
     709                 :       4238 :                        bss->individual_wep_key_len > 0;
     710         [ +  + ]:      21190 :                 for (i = 0; i < NUM_WEP_KEYS; i++) {
     711         [ -  + ]:      16952 :                         if (bss->ssid.wep.keys_set) {
     712                 :          0 :                                 wep = 1;
     713                 :          0 :                                 break;
     714                 :            :                         }
     715                 :            :                 }
     716                 :            : 
     717         [ -  + ]:       4238 :                 if (wep) {
     718                 :          0 :                         wpa_printf(MSG_ERROR, "WEP configuration in a WPA network is not supported");
     719                 :          0 :                         return -1;
     720                 :            :                 }
     721                 :            :         }
     722                 :            : 
     723 [ +  + ][ +  + ]:       7190 :         if (full_config && bss->wpa &&
                 [ -  + ]
     724         [ #  # ]:          0 :             bss->wpa_psk_radius != PSK_RADIUS_IGNORED &&
     725                 :          0 :             bss->macaddr_acl != USE_EXTERNAL_RADIUS_AUTH) {
     726                 :          0 :                 wpa_printf(MSG_ERROR, "WPA-PSK using RADIUS enabled, but no "
     727                 :            :                            "RADIUS checking (macaddr_acl=2) enabled.");
     728                 :          0 :                 return -1;
     729                 :            :         }
     730                 :            : 
     731 [ +  + ][ +  + ]:       7190 :         if (full_config && bss->wpa && (bss->wpa_key_mgmt & WPA_KEY_MGMT_PSK) &&
         [ +  + ][ +  + ]
     732 [ -  + ][ #  # ]:         78 :             bss->ssid.wpa_psk == NULL && bss->ssid.wpa_passphrase == NULL &&
     733         [ #  # ]:          0 :             bss->ssid.wpa_psk_file == NULL &&
     734         [ #  # ]:          0 :             (bss->wpa_psk_radius != PSK_RADIUS_REQUIRED ||
     735                 :          0 :              bss->macaddr_acl != USE_EXTERNAL_RADIUS_AUTH)) {
     736                 :          0 :                 wpa_printf(MSG_ERROR, "WPA-PSK enabled, but PSK or passphrase "
     737                 :            :                            "is not configured.");
     738                 :          0 :                 return -1;
     739                 :            :         }
     740                 :            : 
     741 [ +  + ][ +  + ]:       7190 :         if (full_config && hostapd_mac_comp_empty(bss->bssid) != 0) {
     742                 :            :                 size_t i;
     743                 :            : 
     744         [ +  + ]:         88 :                 for (i = 0; i < conf->num_bss; i++) {
     745   [ +  +  -  + ]:         80 :                         if (conf->bss[i] != bss &&
     746                 :         24 :                             (hostapd_mac_comp(conf->bss[i]->bssid,
     747                 :         24 :                                               bss->bssid) == 0)) {
     748                 :          0 :                                 wpa_printf(MSG_ERROR, "Duplicate BSSID " MACSTR
     749                 :            :                                            " on interface '%s' and '%s'.",
     750                 :          0 :                                            MAC2STR(bss->bssid),
     751                 :          0 :                                            conf->bss[i]->iface, bss->iface);
     752                 :          0 :                                 return -1;
     753                 :            :                         }
     754                 :            :                 }
     755                 :            :         }
     756                 :            : 
     757                 :            : #ifdef CONFIG_IEEE80211R
     758 [ +  + ][ +  + ]:       7190 :         if (full_config && wpa_key_mgmt_ft(bss->wpa_key_mgmt) &&
                 [ +  - ]
     759         [ +  - ]:         16 :             (bss->nas_identifier == NULL ||
     760         [ -  + ]:         16 :              os_strlen(bss->nas_identifier) < 1 ||
     761                 :         16 :              os_strlen(bss->nas_identifier) > FT_R0KH_ID_MAX_LEN)) {
     762                 :          0 :                 wpa_printf(MSG_ERROR, "FT (IEEE 802.11r) requires "
     763                 :            :                            "nas_identifier to be configured as a 1..48 octet "
     764                 :            :                            "string");
     765                 :          0 :                 return -1;
     766                 :            :         }
     767                 :            : #endif /* CONFIG_IEEE80211R */
     768                 :            : 
     769                 :            : #ifdef CONFIG_IEEE80211N
     770 [ +  + ][ +  + ]:       7190 :         if (full_config && conf->ieee80211n &&
                 [ +  + ]
     771                 :        366 :             conf->hw_mode == HOSTAPD_MODE_IEEE80211B) {
     772                 :          1 :                 bss->disable_11n = 1;
     773                 :          1 :                 wpa_printf(MSG_ERROR, "HT (IEEE 802.11n) in 11b mode is not "
     774                 :            :                            "allowed, disabling HT capabilites");
     775                 :            :         }
     776                 :            : 
     777 [ +  + ][ +  + ]:       7190 :         if (full_config && conf->ieee80211n &&
                 [ +  + ]
     778                 :        366 :             bss->ssid.security_policy == SECURITY_STATIC_WEP) {
     779                 :          4 :                 bss->disable_11n = 1;
     780                 :          4 :                 wpa_printf(MSG_ERROR, "HT (IEEE 802.11n) with WEP is not "
     781                 :            :                            "allowed, disabling HT capabilities");
     782                 :            :         }
     783                 :            : 
     784 [ +  + ][ +  + ]:       7190 :         if (full_config && conf->ieee80211n && bss->wpa &&
         [ +  + ][ +  - ]
     785         [ +  + ]:        255 :             !(bss->wpa_pairwise & WPA_CIPHER_CCMP) &&
     786                 :        255 :             !(bss->rsn_pairwise & (WPA_CIPHER_CCMP | WPA_CIPHER_GCMP |
     787                 :            :                                    WPA_CIPHER_CCMP_256 | WPA_CIPHER_GCMP_256)))
     788                 :            :         {
     789                 :          5 :                 bss->disable_11n = 1;
     790                 :          5 :                 wpa_printf(MSG_ERROR, "HT (IEEE 802.11n) with WPA/WPA2 "
     791                 :            :                            "requires CCMP/GCMP to be enabled, disabling HT "
     792                 :            :                            "capabilities");
     793                 :            :         }
     794                 :            : #endif /* CONFIG_IEEE80211N */
     795                 :            : 
     796                 :            : #ifdef CONFIG_WPS2
     797 [ +  + ][ +  + ]:       7190 :         if (full_config && bss->wps_state && bss->ignore_broadcast_ssid) {
                 [ -  + ]
     798                 :          0 :                 wpa_printf(MSG_INFO, "WPS: ignore_broadcast_ssid "
     799                 :            :                            "configuration forced WPS to be disabled");
     800                 :          0 :                 bss->wps_state = 0;
     801                 :            :         }
     802                 :            : 
     803 [ +  + ][ +  + ]:       7190 :         if (full_config && bss->wps_state &&
                 [ -  + ]
     804         [ #  # ]:          0 :             bss->ssid.wep.keys_set && bss->wpa == 0) {
     805                 :          0 :                 wpa_printf(MSG_INFO, "WPS: WEP configuration forced WPS to be "
     806                 :            :                            "disabled");
     807                 :          0 :                 bss->wps_state = 0;
     808                 :            :         }
     809                 :            : 
     810 [ +  + ][ +  + ]:       7190 :         if (full_config && bss->wps_state && bss->wpa &&
         [ +  + ][ +  - ]
     811         [ -  + ]:         37 :             (!(bss->wpa & 2) ||
     812                 :         37 :              !(bss->rsn_pairwise & WPA_CIPHER_CCMP))) {
     813                 :          0 :                 wpa_printf(MSG_INFO, "WPS: WPA/TKIP configuration without "
     814                 :            :                            "WPA2/CCMP forced WPS to be disabled");
     815                 :          0 :                 bss->wps_state = 0;
     816                 :            :         }
     817                 :            : #endif /* CONFIG_WPS2 */
     818                 :            : 
     819                 :            : #ifdef CONFIG_HS20
     820 [ +  + ][ +  + ]:       7190 :         if (full_config && bss->hs20 &&
                 [ +  - ]
     821         [ -  + ]:         93 :             (!(bss->wpa & 2) ||
     822                 :         93 :              !(bss->rsn_pairwise & (WPA_CIPHER_CCMP | WPA_CIPHER_GCMP |
     823                 :            :                                     WPA_CIPHER_CCMP_256 |
     824                 :            :                                     WPA_CIPHER_GCMP_256)))) {
     825                 :          0 :                 wpa_printf(MSG_ERROR, "HS 2.0: WPA2-Enterprise/CCMP "
     826                 :            :                            "configuration is required for Hotspot 2.0 "
     827                 :            :                            "functionality");
     828                 :          0 :                 return -1;
     829                 :            :         }
     830                 :            : #endif /* CONFIG_HS20 */
     831                 :            : 
     832                 :       7190 :         return 0;
     833                 :            : }
     834                 :            : 
     835                 :            : 
     836                 :       7166 : int hostapd_config_check(struct hostapd_config *conf, int full_config)
     837                 :            : {
     838                 :            :         size_t i;
     839                 :            : 
     840 [ +  + ][ -  + ]:       7166 :         if (full_config && conf->ieee80211d &&
                 [ #  # ]
     841         [ #  # ]:          0 :             (!conf->country[0] || !conf->country[1])) {
     842                 :          0 :                 wpa_printf(MSG_ERROR, "Cannot enable IEEE 802.11d without "
     843                 :            :                            "setting the country_code");
     844                 :          0 :                 return -1;
     845                 :            :         }
     846                 :            : 
     847 [ +  + ][ -  + ]:       7166 :         if (full_config && conf->ieee80211h && !conf->ieee80211d) {
                 [ #  # ]
     848                 :          0 :                 wpa_printf(MSG_ERROR, "Cannot enable IEEE 802.11h without "
     849                 :            :                            "IEEE 802.11d enabled");
     850                 :          0 :                 return -1;
     851                 :            :         }
     852                 :            : 
     853 [ +  + ][ -  + ]:       7166 :         if (full_config && conf->local_pwr_constraint != -1 &&
                 [ #  # ]
     854                 :          0 :             !conf->ieee80211d) {
     855                 :          0 :                 wpa_printf(MSG_ERROR, "Cannot add Power Constraint element without Country element");
     856                 :          0 :                 return -1;
     857                 :            :         }
     858                 :            : 
     859 [ +  + ][ -  + ]:       7166 :         if (full_config && conf->spectrum_mgmt_required &&
                 [ #  # ]
     860                 :          0 :             conf->local_pwr_constraint == -1) {
     861                 :          0 :                 wpa_printf(MSG_ERROR, "Cannot set Spectrum Management bit without Country and Power Constraint elements");
     862                 :          0 :                 return -1;
     863                 :            :         }
     864                 :            : 
     865         [ +  + ]:      14356 :         for (i = 0; i < conf->num_bss; i++) {
     866         [ -  + ]:       7190 :                 if (hostapd_config_check_bss(conf->bss[i], conf, full_config))
     867                 :          0 :                         return -1;
     868                 :            :         }
     869                 :            : 
     870                 :       7166 :         return 0;
     871                 :            : }
     872                 :            : 
     873                 :            : 
     874                 :       6854 : void hostapd_set_security_params(struct hostapd_bss_config *bss)
     875                 :            : {
     876         [ +  + ]:       6854 :         if (bss->individual_wep_key_len == 0) {
     877                 :            :                 /* individual keys are not use; can use key idx0 for
     878                 :            :                  * broadcast keys */
     879                 :       6850 :                 bss->broadcast_key_idx_min = 0;
     880                 :            :         }
     881                 :            : 
     882 [ +  + ][ -  + ]:       6854 :         if ((bss->wpa & 2) && bss->rsn_pairwise == 0)
     883                 :          0 :                 bss->rsn_pairwise = bss->wpa_pairwise;
     884                 :       6854 :         bss->wpa_group = wpa_select_ap_group_cipher(bss->wpa, bss->wpa_pairwise,
     885                 :            :                                                     bss->rsn_pairwise);
     886                 :            : 
     887                 :       6854 :         bss->radius->auth_server = bss->radius->auth_servers;
     888                 :       6854 :         bss->radius->acct_server = bss->radius->acct_servers;
     889                 :            : 
     890 [ +  + ][ +  + ]:       6854 :         if (bss->wpa && bss->ieee802_1x) {
     891                 :       1555 :                 bss->ssid.security_policy = SECURITY_WPA;
     892         [ +  + ]:       5299 :         } else if (bss->wpa) {
     893                 :       2431 :                 bss->ssid.security_policy = SECURITY_WPA_PSK;
     894         [ +  + ]:       2868 :         } else if (bss->ieee802_1x) {
     895                 :         13 :                 int cipher = WPA_CIPHER_NONE;
     896                 :         13 :                 bss->ssid.security_policy = SECURITY_IEEE_802_1X;
     897                 :         13 :                 bss->ssid.wep.default_len = bss->default_wep_key_len;
     898         [ +  + ]:         13 :                 if (bss->default_wep_key_len)
     899                 :          8 :                         cipher = bss->default_wep_key_len >= 13 ?
     900         [ +  + ]:          8 :                                 WPA_CIPHER_WEP104 : WPA_CIPHER_WEP40;
     901                 :         13 :                 bss->wpa_group = cipher;
     902                 :         13 :                 bss->wpa_pairwise = cipher;
     903                 :         13 :                 bss->rsn_pairwise = cipher;
     904         [ +  + ]:       2855 :         } else if (bss->ssid.wep.keys_set) {
     905                 :          4 :                 int cipher = WPA_CIPHER_WEP40;
     906         [ +  + ]:          4 :                 if (bss->ssid.wep.len[0] >= 13)
     907                 :          2 :                         cipher = WPA_CIPHER_WEP104;
     908                 :          4 :                 bss->ssid.security_policy = SECURITY_STATIC_WEP;
     909                 :          4 :                 bss->wpa_group = cipher;
     910                 :          4 :                 bss->wpa_pairwise = cipher;
     911                 :          4 :                 bss->rsn_pairwise = cipher;
     912         [ +  + ]:       2851 :         } else if (bss->osen) {
     913                 :          1 :                 bss->ssid.security_policy = SECURITY_OSEN;
     914                 :          1 :                 bss->wpa_group = WPA_CIPHER_CCMP;
     915                 :          1 :                 bss->wpa_pairwise = 0;
     916                 :          1 :                 bss->rsn_pairwise = WPA_CIPHER_CCMP;
     917                 :            :         } else {
     918                 :       2850 :                 bss->ssid.security_policy = SECURITY_PLAINTEXT;
     919                 :       2850 :                 bss->wpa_group = WPA_CIPHER_NONE;
     920                 :       2850 :                 bss->wpa_pairwise = WPA_CIPHER_NONE;
     921                 :       2850 :                 bss->rsn_pairwise = WPA_CIPHER_NONE;
     922                 :            :         }
     923                 :       6854 : }

Generated by: LCOV version 1.9