LCOV - code coverage report
Current view: top level - src/ap - ap_config.c (source / functions) Hit Total Coverage
Test: wpa_supplicant hwsim test run 1388613141 Lines: 230 493 46.7 %
Date: 2014-01-02 Functions: 13 24 54.2 %
Branches: 48 266 18.0 %

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

Generated by: LCOV version 1.9