config_file.c revision 8da800a193fb6f8832218715f82a7b4e2d2ad338
18d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/* 28d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * hostapd / Configuration file parser 3a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt * Copyright (c) 2003-2013, Jouni Malinen <j@w1.fi> 48d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 5c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * This software may be distributed under the terms of the BSD license. 6c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * See README for more details. 78d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 88d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 98d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "utils/includes.h" 108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifndef CONFIG_NATIVE_WINDOWS 118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include <grp.h> 128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_NATIVE_WINDOWS */ 138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "utils/common.h" 158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "utils/uuid.h" 168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "common/ieee802_11_defs.h" 178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "drivers/driver.h" 188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "eap_server/eap.h" 198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "radius/radius_client.h" 208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "ap/wpa_auth.h" 218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "ap/ap_config.h" 228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "config_file.h" 238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtextern struct wpa_driver_ops *wpa_drivers[]; 268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifndef CONFIG_NO_VLAN 298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int hostapd_config_read_vlan_file(struct hostapd_bss_config *bss, 308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *fname) 318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt FILE *f; 338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char buf[128], *pos, *pos2; 348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int line = 0, vlan_id; 358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct hostapd_vlan *vlan; 368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt f = fopen(fname, "r"); 388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!f) { 398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "VLAN file '%s' not readable.", fname); 408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (fgets(buf, sizeof(buf), f)) { 448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt line++; 458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (buf[0] == '#') 478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt continue; 488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos = buf; 498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (*pos != '\0') { 508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (*pos == '\n') { 518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *pos = '\0'; 528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos++; 558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (buf[0] == '\0') 578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt continue; 588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (buf[0] == '*') { 608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt vlan_id = VLAN_ID_WILDCARD; 618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos = buf + 1; 628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt vlan_id = strtol(buf, &pos, 10); 648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (buf == pos || vlan_id < 1 || 658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt vlan_id > MAX_VLAN_ID) { 668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Invalid VLAN ID at " 678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "line %d in '%s'", line, fname); 688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fclose(f); 698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (*pos == ' ' || *pos == '\t') 748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos++; 758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos2 = pos; 768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (*pos2 != ' ' && *pos2 != '\t' && *pos2 != '\0') 778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos2++; 788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *pos2 = '\0'; 798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (*pos == '\0' || os_strlen(pos) > IFNAMSIZ) { 808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Invalid VLAN ifname at line %d " 818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "in '%s'", line, fname); 828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fclose(f); 838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt vlan = os_malloc(sizeof(*vlan)); 878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (vlan == NULL) { 888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Out of memory while reading " 898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "VLAN interfaces from '%s'", fname); 908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fclose(f); 918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memset(vlan, 0, sizeof(*vlan)); 958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt vlan->vlan_id = vlan_id; 968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_strlcpy(vlan->ifname, pos, sizeof(vlan->ifname)); 978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (bss->vlan_tail) 988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->vlan_tail->next = vlan; 998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else 1008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->vlan = vlan; 1018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->vlan_tail = vlan; 1028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 1038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fclose(f); 1058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 1078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 1088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_NO_VLAN */ 1098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int hostapd_acl_comp(const void *a, const void *b) 1128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 1138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const struct mac_acl_entry *aa = a; 1148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const struct mac_acl_entry *bb = b; 1158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return os_memcmp(aa->addr, bb->addr, sizeof(macaddr)); 1168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 1178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int hostapd_config_read_maclist(const char *fname, 1208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct mac_acl_entry **acl, int *num) 1218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 1228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt FILE *f; 1238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char buf[128], *pos; 1248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int line = 0; 1258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt u8 addr[ETH_ALEN]; 1268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct mac_acl_entry *newacl; 1278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int vlan_id; 1288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!fname) 1308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 1318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt f = fopen(fname, "r"); 1338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!f) { 1348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "MAC list file '%s' not found.", fname); 1358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 1368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 1378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (fgets(buf, sizeof(buf), f)) { 1398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt line++; 1408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (buf[0] == '#') 1428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt continue; 1438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos = buf; 1448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (*pos != '\0') { 1458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (*pos == '\n') { 1468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *pos = '\0'; 1478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 1488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 1498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos++; 1508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 1518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (buf[0] == '\0') 1528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt continue; 1538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (hwaddr_aton(buf, addr)) { 1558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Invalid MAC address '%s' at " 1568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "line %d in '%s'", buf, line, fname); 1578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fclose(f); 1588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 1598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 1608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt vlan_id = 0; 1628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos = buf; 1638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (*pos != '\0' && *pos != ' ' && *pos != '\t') 1648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos++; 1658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (*pos == ' ' || *pos == '\t') 1668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos++; 1678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (*pos != '\0') 1688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt vlan_id = atoi(pos); 1698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt newacl = os_realloc_array(*acl, *num + 1, sizeof(**acl)); 1718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (newacl == NULL) { 1728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "MAC list reallocation failed"); 1738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fclose(f); 1748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 1758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 1768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *acl = newacl; 1788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memcpy((*acl)[*num].addr, addr, ETH_ALEN); 1798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt (*acl)[*num].vlan_id = vlan_id; 1808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt (*num)++; 1818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 1828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fclose(f); 1848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt qsort(*acl, *num, sizeof(**acl), hostapd_acl_comp); 1868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 1888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 1898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef EAP_SERVER 1928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int hostapd_config_read_eap_user(const char *fname, 1938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct hostapd_bss_config *conf) 1948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 1958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt FILE *f; 1968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char buf[512], *pos, *start, *pos2; 1978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int line = 0, ret = 0, num_methods; 1988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct hostapd_eap_user *user, *tail = NULL; 1998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!fname) 2018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 2028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 203d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt if (os_strncmp(fname, "sqlite:", 7) == 0) { 204d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt os_free(conf->eap_user_sqlite); 205d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt conf->eap_user_sqlite = os_strdup(fname + 7); 206d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt return 0; 207d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt } 208d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt 2098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt f = fopen(fname, "r"); 2108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!f) { 2118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "EAP user file '%s' not found.", fname); 2128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 2138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 2148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Lines: "user" METHOD,METHOD2 "password" (password optional) */ 2168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (fgets(buf, sizeof(buf), f)) { 2178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt line++; 2188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (buf[0] == '#') 2208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt continue; 2218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos = buf; 2228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (*pos != '\0') { 2238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (*pos == '\n') { 2248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *pos = '\0'; 2258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 2268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 2278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos++; 2288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 2298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (buf[0] == '\0') 2308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt continue; 2318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt user = NULL; 2338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (buf[0] != '"' && buf[0] != '*') { 2358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Invalid EAP identity (no \" in " 2368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "start) on line %d in '%s'", line, fname); 2378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto failed; 2388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 2398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt user = os_zalloc(sizeof(*user)); 2418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (user == NULL) { 2428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "EAP user allocation failed"); 2438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto failed; 2448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 2458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt user->force_version = -1; 2468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (buf[0] == '*') { 2488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos = buf; 2498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 2508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos = buf + 1; 2518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt start = pos; 2528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (*pos != '"' && *pos != '\0') 2538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos++; 2548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (*pos == '\0') { 2558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Invalid EAP identity " 2568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "(no \" in end) on line %d in '%s'", 2578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt line, fname); 2588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto failed; 2598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 2608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt user->identity = os_malloc(pos - start); 2628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (user->identity == NULL) { 2638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Failed to allocate " 2648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "memory for EAP identity"); 2658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto failed; 2668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 2678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memcpy(user->identity, start, pos - start); 2688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt user->identity_len = pos - start; 2698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (pos[0] == '"' && pos[1] == '*') { 2718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt user->wildcard_prefix = 1; 2728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos++; 2738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 2748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 2758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos++; 2768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (*pos == ' ' || *pos == '\t') 2778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos++; 2788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (*pos == '\0') { 2808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "No EAP method on line %d in " 2818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "'%s'", line, fname); 2828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto failed; 2838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 2848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt start = pos; 2868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (*pos != ' ' && *pos != '\t' && *pos != '\0') 2878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos++; 2888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (*pos == '\0') { 2898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos = NULL; 2908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 2918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *pos = '\0'; 2928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos++; 2938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 2948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt num_methods = 0; 2958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (*start) { 2968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *pos3 = os_strchr(start, ','); 2978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (pos3) { 2988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *pos3++ = '\0'; 2998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 3008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt user->methods[num_methods].method = 3018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt eap_server_get_type( 3028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt start, 3038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &user->methods[num_methods].vendor); 3048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (user->methods[num_methods].vendor == 3058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt EAP_VENDOR_IETF && 3068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt user->methods[num_methods].method == EAP_TYPE_NONE) 3078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { 3088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (os_strcmp(start, "TTLS-PAP") == 0) { 3098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt user->ttls_auth |= EAP_TTLS_AUTH_PAP; 3108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto skip_eap; 3118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 3128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (os_strcmp(start, "TTLS-CHAP") == 0) { 3138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt user->ttls_auth |= EAP_TTLS_AUTH_CHAP; 3148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto skip_eap; 3158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 3168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (os_strcmp(start, "TTLS-MSCHAP") == 0) { 3178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt user->ttls_auth |= 3188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt EAP_TTLS_AUTH_MSCHAP; 3198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto skip_eap; 3208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 3218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (os_strcmp(start, "TTLS-MSCHAPV2") == 0) { 3228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt user->ttls_auth |= 3238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt EAP_TTLS_AUTH_MSCHAPV2; 3248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto skip_eap; 3258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 3268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Unsupported EAP type " 3278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "'%s' on line %d in '%s'", 3288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt start, line, fname); 3298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto failed; 3308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 3318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt num_methods++; 3331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (num_methods >= EAP_MAX_METHODS) 3348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 3358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt skip_eap: 3368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (pos3 == NULL) 3378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 3388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt start = pos3; 3398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 3408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (num_methods == 0 && user->ttls_auth == 0) { 3418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "No EAP types configured on " 3428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "line %d in '%s'", line, fname); 3438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto failed; 3448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 3458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (pos == NULL) 3478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto done; 3488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (*pos == ' ' || *pos == '\t') 3508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos++; 3518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (*pos == '\0') 3528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto done; 3538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (os_strncmp(pos, "[ver=0]", 7) == 0) { 3558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt user->force_version = 0; 3568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto done; 3578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 3588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (os_strncmp(pos, "[ver=1]", 7) == 0) { 3608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt user->force_version = 1; 3618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto done; 3628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 3638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (os_strncmp(pos, "[2]", 3) == 0) { 3658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt user->phase2 = 1; 3668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto done; 3678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 3688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (*pos == '"') { 3708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos++; 3718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt start = pos; 3728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (*pos != '"' && *pos != '\0') 3738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos++; 3748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (*pos == '\0') { 3758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Invalid EAP password " 3768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "(no \" in end) on line %d in '%s'", 3778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt line, fname); 3788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto failed; 3798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 3808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt user->password = os_malloc(pos - start); 3828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (user->password == NULL) { 3838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Failed to allocate " 3848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "memory for EAP password"); 3858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto failed; 3868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 3878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memcpy(user->password, start, pos - start); 3888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt user->password_len = pos - start; 3898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos++; 3918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strncmp(pos, "hash:", 5) == 0) { 3928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos += 5; 3938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos2 = pos; 3948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (*pos2 != '\0' && *pos2 != ' ' && 3958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *pos2 != '\t' && *pos2 != '#') 3968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos2++; 3978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (pos2 - pos != 32) { 3988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Invalid password hash " 3998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "on line %d in '%s'", line, fname); 4008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto failed; 4018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 4028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt user->password = os_malloc(16); 4038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (user->password == NULL) { 4048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Failed to allocate " 4058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "memory for EAP password hash"); 4068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto failed; 4078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 4088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (hexstr2bin(pos, user->password, 16) < 0) { 4098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Invalid hash password " 4108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "on line %d in '%s'", line, fname); 4118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto failed; 4128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 4138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt user->password_len = 16; 4148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt user->password_hash = 1; 4158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos = pos2; 4168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 4178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos2 = pos; 4188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (*pos2 != '\0' && *pos2 != ' ' && 4198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *pos2 != '\t' && *pos2 != '#') 4208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos2++; 4218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if ((pos2 - pos) & 1) { 4228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Invalid hex password " 4238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "on line %d in '%s'", line, fname); 4248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto failed; 4258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 4268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt user->password = os_malloc((pos2 - pos) / 2); 4278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (user->password == NULL) { 4288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Failed to allocate " 4298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "memory for EAP password"); 4308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto failed; 4318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 4328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (hexstr2bin(pos, user->password, 4338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt (pos2 - pos) / 2) < 0) { 4348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Invalid hex password " 4358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "on line %d in '%s'", line, fname); 4368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto failed; 4378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 4388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt user->password_len = (pos2 - pos) / 2; 4398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos = pos2; 4408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 4418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (*pos == ' ' || *pos == '\t') 4438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos++; 4448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (os_strncmp(pos, "[2]", 3) == 0) { 4458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt user->phase2 = 1; 4468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 4478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt done: 4498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (tail == NULL) { 4508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt tail = conf->eap_user = user; 4518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 4528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt tail->next = user; 4538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt tail = user; 4548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 4558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt continue; 4568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt failed: 4588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (user) { 4598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(user->password); 4608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(user->identity); 4618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(user); 4628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 4638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ret = -1; 4648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 4658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 4668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fclose(f); 4688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return ret; 4708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 4718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* EAP_SERVER */ 4728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifndef CONFIG_NO_RADIUS 4758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int 4768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidthostapd_config_read_radius_addr(struct hostapd_radius_server **server, 4778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int *num_server, const char *val, int def_port, 4788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct hostapd_radius_server **curr_serv) 4798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 4808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct hostapd_radius_server *nserv; 4818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int ret; 4828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt static int server_index = 1; 4838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 48461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt nserv = os_realloc_array(*server, *num_server + 1, sizeof(*nserv)); 4858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (nserv == NULL) 4868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 4878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *server = nserv; 4898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt nserv = &nserv[*num_server]; 4908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt (*num_server)++; 4918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt (*curr_serv) = nserv; 4928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memset(nserv, 0, sizeof(*nserv)); 4948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt nserv->port = def_port; 4958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ret = hostapd_parse_ip_addr(val, &nserv->addr); 4968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt nserv->index = server_index++; 4978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return ret; 4998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 50004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 50104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 50204949598a23f501be6eec21697465fd46a28840aDmitry Shmidtstatic struct hostapd_radius_attr * 50304949598a23f501be6eec21697465fd46a28840aDmitry Shmidthostapd_parse_radius_attr(const char *value) 50404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{ 50504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt const char *pos; 50604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt char syntax; 50704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt struct hostapd_radius_attr *attr; 50804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt size_t len; 50904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 51004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt attr = os_zalloc(sizeof(*attr)); 51104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (attr == NULL) 51204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return NULL; 51304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 51404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt attr->type = atoi(value); 51504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 51604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt pos = os_strchr(value, ':'); 51704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (pos == NULL) { 51804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt attr->val = wpabuf_alloc(1); 51904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (attr->val == NULL) { 52004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt os_free(attr); 52104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return NULL; 52204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 52304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpabuf_put_u8(attr->val, 0); 52404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return attr; 52504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 52604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 52704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt pos++; 52804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (pos[0] == '\0' || pos[1] != ':') { 52904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt os_free(attr); 53004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return NULL; 53104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 53204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt syntax = *pos++; 53304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt pos++; 53404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 53504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt switch (syntax) { 53604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt case 's': 53704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt attr->val = wpabuf_alloc_copy(pos, os_strlen(pos)); 53804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt break; 53904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt case 'x': 54004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt len = os_strlen(pos); 54104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (len & 1) 54204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt break; 54304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt len /= 2; 54404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt attr->val = wpabuf_alloc(len); 54504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (attr->val == NULL) 54604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt break; 54704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (hexstr2bin(pos, wpabuf_put(attr->val, len), len) < 0) { 54804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpabuf_free(attr->val); 54904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt os_free(attr); 55004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return NULL; 55104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 55204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt break; 55304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt case 'd': 55404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt attr->val = wpabuf_alloc(4); 55504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (attr->val) 55604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpabuf_put_be32(attr->val, atoi(pos)); 55704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt break; 55804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt default: 55904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt os_free(attr); 56004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return NULL; 56104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 56204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 56304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (attr->val == NULL) { 56404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt os_free(attr); 56504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return NULL; 56604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 56704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 56804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return attr; 56904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt} 57004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 57104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 57204949598a23f501be6eec21697465fd46a28840aDmitry Shmidtstatic int hostapd_parse_das_client(struct hostapd_bss_config *bss, 57304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt const char *val) 57404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{ 57504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt char *secret; 57604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 57704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt secret = os_strchr(val, ' '); 57804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (secret == NULL) 57904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return -1; 58004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 58104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt secret++; 58204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 58304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (hostapd_parse_ip_addr(val, &bss->radius_das_client_addr)) 58404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return -1; 58504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 58604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt os_free(bss->radius_das_shared_secret); 58761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt bss->radius_das_shared_secret = (u8 *) os_strdup(secret); 58804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (bss->radius_das_shared_secret == NULL) 58904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return -1; 59061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt bss->radius_das_shared_secret_len = os_strlen(secret); 59104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 59204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return 0; 59304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt} 5948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_NO_RADIUS */ 5958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int hostapd_config_parse_key_mgmt(int line, const char *value) 5988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 5998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int val = 0, last; 6008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *start, *end, *buf; 6018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt buf = os_strdup(value); 6038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (buf == NULL) 6048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 6058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt start = buf; 6068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (*start != '\0') { 6088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (*start == ' ' || *start == '\t') 6098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt start++; 6108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (*start == '\0') 6118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 6128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt end = start; 6138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (*end != ' ' && *end != '\t' && *end != '\0') 6148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt end++; 6158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt last = *end == '\0'; 6168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *end = '\0'; 6178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (os_strcmp(start, "WPA-PSK") == 0) 6188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt val |= WPA_KEY_MGMT_PSK; 6198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else if (os_strcmp(start, "WPA-EAP") == 0) 6208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt val |= WPA_KEY_MGMT_IEEE8021X; 6218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_IEEE80211R 6228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else if (os_strcmp(start, "FT-PSK") == 0) 6238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt val |= WPA_KEY_MGMT_FT_PSK; 6248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else if (os_strcmp(start, "FT-EAP") == 0) 6258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt val |= WPA_KEY_MGMT_FT_IEEE8021X; 6268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_IEEE80211R */ 6278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_IEEE80211W 6288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else if (os_strcmp(start, "WPA-PSK-SHA256") == 0) 6298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt val |= WPA_KEY_MGMT_PSK_SHA256; 6308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else if (os_strcmp(start, "WPA-EAP-SHA256") == 0) 6318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt val |= WPA_KEY_MGMT_IEEE8021X_SHA256; 6328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_IEEE80211W */ 633d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#ifdef CONFIG_SAE 634d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt else if (os_strcmp(start, "SAE") == 0) 635d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt val |= WPA_KEY_MGMT_SAE; 636d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt else if (os_strcmp(start, "FT-SAE") == 0) 637d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt val |= WPA_KEY_MGMT_FT_SAE; 638d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#endif /* CONFIG_SAE */ 6398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else { 6408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: invalid key_mgmt '%s'", 6418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt line, start); 6428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(buf); 6438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 6448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 6458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (last) 6478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 6488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt start = end + 1; 6498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 6508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(buf); 6528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (val == 0) { 6538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: no key_mgmt values " 6548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "configured.", line); 6558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 6568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 6578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return val; 6598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 6608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int hostapd_config_parse_cipher(int line, const char *value) 6638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 664a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt int val = wpa_parse_cipher(value); 665a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt if (val < 0) { 666a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: invalid cipher '%s'.", 667a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt line, value); 6688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 6698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 6708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (val == 0) { 6718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: no cipher values configured.", 6728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt line); 6738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 6748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 6758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return val; 6768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 6778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int hostapd_config_read_wep(struct hostapd_wep_keys *wep, int keyidx, 6808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *val) 6818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 6828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t len = os_strlen(val); 6838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (keyidx < 0 || keyidx > 3 || wep->key[keyidx] != NULL) 6858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 6868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (val[0] == '"') { 6888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (len < 2 || val[len - 1] != '"') 6898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 6908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt len -= 2; 6918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wep->key[keyidx] = os_malloc(len); 6928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wep->key[keyidx] == NULL) 6938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 6948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memcpy(wep->key[keyidx], val + 1, len); 6958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wep->len[keyidx] = len; 6968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 6978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (len & 1) 6988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 6998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt len /= 2; 7008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wep->key[keyidx] = os_malloc(len); 7018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wep->key[keyidx] == NULL) 7028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 7038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wep->len[keyidx] = len; 7048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (hexstr2bin(val, wep->key[keyidx], len) < 0) 7058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 7068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 7078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wep->keys_set++; 7098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 7118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 7128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int hostapd_parse_rates(int **rate_list, char *val) 7158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 7168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int *list; 7178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int count; 7188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *pos, *end; 7198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(*rate_list); 7218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *rate_list = NULL; 7228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos = val; 7248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt count = 0; 7258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (*pos != '\0') { 7268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (*pos == ' ') 7278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt count++; 7288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos++; 7298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 7308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt list = os_malloc(sizeof(int) * (count + 2)); 7328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (list == NULL) 7338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 7348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos = val; 7358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt count = 0; 7368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (*pos != '\0') { 7378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt end = os_strchr(pos, ' '); 7388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (end) 7398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *end = '\0'; 7408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt list[count++] = atoi(pos); 7428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!end) 7438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 7448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos = end + 1; 7458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 7468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt list[count] = -1; 7478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *rate_list = list; 7498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 7508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 7518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int hostapd_config_bss(struct hostapd_config *conf, const char *ifname) 7548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 7558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct hostapd_bss_config *bss; 7568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (*ifname == '\0') 7588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 7598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 76061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt bss = os_realloc_array(conf->bss, conf->num_bss + 1, 76161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt sizeof(struct hostapd_bss_config)); 7628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (bss == NULL) { 7638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Failed to allocate memory for " 7648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "multi-BSS entry"); 7658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 7668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 7678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt conf->bss = bss; 7688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss = &(conf->bss[conf->num_bss]); 7708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memset(bss, 0, sizeof(*bss)); 7718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->radius = os_zalloc(sizeof(*bss->radius)); 7728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (bss->radius == NULL) { 7738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Failed to allocate memory for " 7748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "multi-BSS RADIUS data"); 7758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 7768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 7778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt conf->num_bss++; 7798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt conf->last_bss = bss; 7808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt hostapd_config_defaults_bss(bss); 7828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_strlcpy(bss->iface, ifname, sizeof(bss->iface)); 7838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memcpy(bss->ssid.vlan, bss->iface, IFNAMSIZ + 1); 7848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 7868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 7878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/* convert floats with one decimal place to value*10 int, i.e., 7908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * "1.5" will return 15 */ 7918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int hostapd_config_read_int10(const char *value) 7928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 7938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int i, d; 7948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *pos; 7958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt i = atoi(value); 7978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos = os_strchr(value, '.'); 7988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt d = 0; 7998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (pos) { 8008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos++; 8018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (*pos >= '0' && *pos <= '9') 8028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt d = *pos - '0'; 8038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 8048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return i * 10 + d; 8068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 8078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int valid_cw(int cw) 8108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 8118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return (cw == 1 || cw == 3 || cw == 7 || cw == 15 || cw == 31 || 8128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cw == 63 || cw == 127 || cw == 255 || cw == 511 || cw == 1023); 8138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 8148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtenum { 8178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt IEEE80211_TX_QUEUE_DATA0 = 0, /* used for EDCA AC_VO data */ 8188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt IEEE80211_TX_QUEUE_DATA1 = 1, /* used for EDCA AC_VI data */ 8198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt IEEE80211_TX_QUEUE_DATA2 = 2, /* used for EDCA AC_BE data */ 8208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt IEEE80211_TX_QUEUE_DATA3 = 3 /* used for EDCA AC_BK data */ 8218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}; 8228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int hostapd_config_tx_queue(struct hostapd_config *conf, char *name, 8248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *val) 8258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 8268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int num; 8278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *pos; 8288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct hostapd_tx_queue_params *queue; 8298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* skip 'tx_queue_' prefix */ 8318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos = name + 9; 8328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (os_strncmp(pos, "data", 4) == 0 && 8338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos[4] >= '0' && pos[4] <= '9' && pos[5] == '_') { 8348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt num = pos[4] - '0'; 8358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos += 6; 8368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strncmp(pos, "after_beacon_", 13) == 0 || 8378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_strncmp(pos, "beacon_", 7) == 0) { 8388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_INFO, "DEPRECATED: '%s' not used", name); 8398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 8408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 8418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Unknown tx_queue name '%s'", pos); 8428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 8438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 8448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (num >= NUM_TX_QUEUES) { 8468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* for backwards compatibility, do not trigger failure */ 8478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_INFO, "DEPRECATED: '%s' not used", name); 8488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 8498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 8508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt queue = &conf->tx_queue[num]; 8528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (os_strcmp(pos, "aifs") == 0) { 8548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt queue->aifs = atoi(val); 8558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (queue->aifs < 0 || queue->aifs > 255) { 8568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Invalid AIFS value %d", 8578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt queue->aifs); 8588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 8598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 8608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(pos, "cwmin") == 0) { 8618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt queue->cwmin = atoi(val); 8628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!valid_cw(queue->cwmin)) { 8638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Invalid cwMin value %d", 8648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt queue->cwmin); 8658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 8668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 8678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(pos, "cwmax") == 0) { 8688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt queue->cwmax = atoi(val); 8698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!valid_cw(queue->cwmax)) { 8708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Invalid cwMax value %d", 8718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt queue->cwmax); 8728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 8738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 8748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(pos, "burst") == 0) { 8758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt queue->burst = hostapd_config_read_int10(val); 8768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 8778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Unknown tx_queue field '%s'", pos); 8788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 8798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 8808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 8828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 8838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_IEEE80211R 8868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int add_r0kh(struct hostapd_bss_config *bss, char *value) 8878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 8888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct ft_remote_r0kh *r0kh; 8898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *pos, *next; 8908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt r0kh = os_zalloc(sizeof(*r0kh)); 8928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (r0kh == NULL) 8938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 8948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* 02:01:02:03:04:05 a.example.com 000102030405060708090a0b0c0d0e0f */ 8968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos = value; 8978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt next = os_strchr(pos, ' '); 8988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (next) 8998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *next++ = '\0'; 9008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (next == NULL || hwaddr_aton(pos, r0kh->addr)) { 9018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Invalid R0KH MAC address: '%s'", pos); 9028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(r0kh); 9038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 9048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 9058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos = next; 9078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt next = os_strchr(pos, ' '); 9088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (next) 9098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *next++ = '\0'; 9108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (next == NULL || next - pos > FT_R0KH_ID_MAX_LEN) { 9118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Invalid R0KH-ID: '%s'", pos); 9128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(r0kh); 9138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 9148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 9158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt r0kh->id_len = next - pos - 1; 9168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memcpy(r0kh->id, pos, r0kh->id_len); 9178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos = next; 9198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (hexstr2bin(pos, r0kh->key, sizeof(r0kh->key))) { 9208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Invalid R0KH key: '%s'", pos); 9218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(r0kh); 9228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 9238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 9248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt r0kh->next = bss->r0kh_list; 9268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->r0kh_list = r0kh; 9278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 9298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 9308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int add_r1kh(struct hostapd_bss_config *bss, char *value) 9338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 9348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct ft_remote_r1kh *r1kh; 9358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *pos, *next; 9368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt r1kh = os_zalloc(sizeof(*r1kh)); 9388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (r1kh == NULL) 9398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 9408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* 02:01:02:03:04:05 02:01:02:03:04:05 9428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 000102030405060708090a0b0c0d0e0f */ 9438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos = value; 9448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt next = os_strchr(pos, ' '); 9458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (next) 9468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *next++ = '\0'; 9478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (next == NULL || hwaddr_aton(pos, r1kh->addr)) { 9488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Invalid R1KH MAC address: '%s'", pos); 9498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(r1kh); 9508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 9518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 9528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos = next; 9548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt next = os_strchr(pos, ' '); 9558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (next) 9568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *next++ = '\0'; 9578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (next == NULL || hwaddr_aton(pos, r1kh->id)) { 9588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Invalid R1KH-ID: '%s'", pos); 9598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(r1kh); 9608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 9618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 9628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos = next; 9648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (hexstr2bin(pos, r1kh->key, sizeof(r1kh->key))) { 9658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Invalid R1KH key: '%s'", pos); 9668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(r1kh); 9678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 9688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 9698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt r1kh->next = bss->r1kh_list; 9718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->r1kh_list = r1kh; 9728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 9748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 9758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_IEEE80211R */ 9768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_IEEE80211N 9798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int hostapd_config_ht_capab(struct hostapd_config *conf, 9808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *capab) 9818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 9828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (os_strstr(capab, "[LDPC]")) 9838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt conf->ht_capab |= HT_CAP_INFO_LDPC_CODING_CAP; 9848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (os_strstr(capab, "[HT40-]")) { 9858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt conf->ht_capab |= HT_CAP_INFO_SUPP_CHANNEL_WIDTH_SET; 9868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt conf->secondary_channel = -1; 9878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 9888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (os_strstr(capab, "[HT40+]")) { 9898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt conf->ht_capab |= HT_CAP_INFO_SUPP_CHANNEL_WIDTH_SET; 9908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt conf->secondary_channel = 1; 9918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 9928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (os_strstr(capab, "[SMPS-STATIC]")) { 9938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt conf->ht_capab &= ~HT_CAP_INFO_SMPS_MASK; 9948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt conf->ht_capab |= HT_CAP_INFO_SMPS_STATIC; 9958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 9968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (os_strstr(capab, "[SMPS-DYNAMIC]")) { 9978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt conf->ht_capab &= ~HT_CAP_INFO_SMPS_MASK; 9988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt conf->ht_capab |= HT_CAP_INFO_SMPS_DYNAMIC; 9998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 10008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (os_strstr(capab, "[GF]")) 10018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt conf->ht_capab |= HT_CAP_INFO_GREEN_FIELD; 10028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (os_strstr(capab, "[SHORT-GI-20]")) 10038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt conf->ht_capab |= HT_CAP_INFO_SHORT_GI20MHZ; 10048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (os_strstr(capab, "[SHORT-GI-40]")) 10058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt conf->ht_capab |= HT_CAP_INFO_SHORT_GI40MHZ; 10068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (os_strstr(capab, "[TX-STBC]")) 10078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt conf->ht_capab |= HT_CAP_INFO_TX_STBC; 10088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (os_strstr(capab, "[RX-STBC1]")) { 10098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt conf->ht_capab &= ~HT_CAP_INFO_RX_STBC_MASK; 10108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt conf->ht_capab |= HT_CAP_INFO_RX_STBC_1; 10118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 10128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (os_strstr(capab, "[RX-STBC12]")) { 10138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt conf->ht_capab &= ~HT_CAP_INFO_RX_STBC_MASK; 10148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt conf->ht_capab |= HT_CAP_INFO_RX_STBC_12; 10158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 10168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (os_strstr(capab, "[RX-STBC123]")) { 10178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt conf->ht_capab &= ~HT_CAP_INFO_RX_STBC_MASK; 10188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt conf->ht_capab |= HT_CAP_INFO_RX_STBC_123; 10198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 10208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (os_strstr(capab, "[DELAYED-BA]")) 10218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt conf->ht_capab |= HT_CAP_INFO_DELAYED_BA; 10228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (os_strstr(capab, "[MAX-AMSDU-7935]")) 10238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt conf->ht_capab |= HT_CAP_INFO_MAX_AMSDU_SIZE; 10248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (os_strstr(capab, "[DSSS_CCK-40]")) 10258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt conf->ht_capab |= HT_CAP_INFO_DSSS_CCK40MHZ; 10268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (os_strstr(capab, "[PSMP]")) 10278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt conf->ht_capab |= HT_CAP_INFO_PSMP_SUPP; 10288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (os_strstr(capab, "[LSIG-TXOP-PROT]")) 10298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt conf->ht_capab |= HT_CAP_INFO_LSIG_TXOP_PROTECT_SUPPORT; 10308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 10328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 10338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_IEEE80211N */ 10348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 103604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#ifdef CONFIG_IEEE80211AC 103704949598a23f501be6eec21697465fd46a28840aDmitry Shmidtstatic int hostapd_config_vht_capab(struct hostapd_config *conf, 103804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt const char *capab) 103904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{ 104004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (os_strstr(capab, "[MAX-MPDU-7991]")) 104104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt conf->vht_capab |= VHT_CAP_MAX_MPDU_LENGTH_7991; 104204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (os_strstr(capab, "[MAX-MPDU-11454]")) 104304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt conf->vht_capab |= VHT_CAP_MAX_MPDU_LENGTH_11454; 104404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (os_strstr(capab, "[VHT160]")) 104504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt conf->vht_capab |= VHT_CAP_SUPP_CHAN_WIDTH_160MHZ; 104604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (os_strstr(capab, "[VHT160-80PLUS80]")) 104704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt conf->vht_capab |= VHT_CAP_SUPP_CHAN_WIDTH_160_80PLUS80MHZ; 104804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (os_strstr(capab, "[VHT160-80PLUS80]")) 104904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt conf->vht_capab |= VHT_CAP_SUPP_CHAN_WIDTH_160_80PLUS80MHZ; 105004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (os_strstr(capab, "[RXLDPC]")) 105104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt conf->vht_capab |= VHT_CAP_RXLDPC; 105204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (os_strstr(capab, "[SHORT-GI-80]")) 105304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt conf->vht_capab |= VHT_CAP_SHORT_GI_80; 105404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (os_strstr(capab, "[SHORT-GI-160]")) 105504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt conf->vht_capab |= VHT_CAP_SHORT_GI_160; 105604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (os_strstr(capab, "[TX-STBC-2BY1]")) 105704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt conf->vht_capab |= VHT_CAP_TXSTBC; 105804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (os_strstr(capab, "[RX-STBC-1]")) 105904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt conf->vht_capab |= VHT_CAP_RXSTBC_1; 106004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (os_strstr(capab, "[RX-STBC-12]")) 106104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt conf->vht_capab |= VHT_CAP_RXSTBC_2; 106204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (os_strstr(capab, "[RX-STBC-123]")) 106304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt conf->vht_capab |= VHT_CAP_RXSTBC_3; 106404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (os_strstr(capab, "[RX-STBC-1234]")) 106504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt conf->vht_capab |= VHT_CAP_RXSTBC_4; 106604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (os_strstr(capab, "[SU-BEAMFORMER]")) 106704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt conf->vht_capab |= VHT_CAP_MU_BEAMFORMER_CAPABLE; 106804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (os_strstr(capab, "[SU-BEAMFORMEE]")) 106904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt conf->vht_capab |= VHT_CAP_MU_BEAMFORMEE_CAPABLE; 107004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (os_strstr(capab, "[BF-ANTENNA-2]") && 107104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt (conf->vht_capab & VHT_CAP_MU_BEAMFORMER_CAPABLE)) 107204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt conf->vht_capab |= VHT_CAP_BEAMFORMER_ANTENNAS_MAX; 107304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (os_strstr(capab, "[SOUNDING-DIMENSION-2]") && 107404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt (conf->vht_capab & VHT_CAP_MU_BEAMFORMER_CAPABLE)) 107504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt conf->vht_capab |= VHT_CAP_SOUNDING_DIMENTION_MAX; 107604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (os_strstr(capab, "[MU-BEAMFORMER]")) 107704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt conf->vht_capab |= VHT_CAP_MU_BEAMFORMER_CAPABLE; 107804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (os_strstr(capab, "[MU-BEAMFORMEE]")) 107904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt conf->vht_capab |= VHT_CAP_MU_BEAMFORMEE_CAPABLE; 108004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (os_strstr(capab, "[VHT-TXOP-PS]")) 108104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt conf->vht_capab |= VHT_CAP_VHT_TXOP_PS; 108204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (os_strstr(capab, "[HTC-VHT]")) 108304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt conf->vht_capab |= VHT_CAP_HTC_VHT; 108404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (os_strstr(capab, "[MAX-A-MPDU-LEN-EXP0]")) 108504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt conf->vht_capab |= VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT; 108604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (os_strstr(capab, "[VHT-LINK-ADAPT2]") && 108704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt (conf->vht_capab & VHT_CAP_HTC_VHT)) 108804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt conf->vht_capab |= VHT_CAP_VHT_LINK_ADAPTATION_VHT_UNSOL_MFB; 108904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (os_strstr(capab, "[VHT-LINK-ADAPT3]") && 109004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt (conf->vht_capab & VHT_CAP_HTC_VHT)) 109104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt conf->vht_capab |= VHT_CAP_VHT_LINK_ADAPTATION_VHT_MRQ_MFB; 109204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (os_strstr(capab, "[RX-ANTENNA-PATTERN]")) 109304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt conf->vht_capab |= VHT_CAP_RX_ANTENNA_PATTERN; 109404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (os_strstr(capab, "[TX-ANTENNA-PATTERN]")) 109504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt conf->vht_capab |= VHT_CAP_TX_ANTENNA_PATTERN; 109604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return 0; 109704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt} 109804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#endif /* CONFIG_IEEE80211AC */ 109904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 110004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 11018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int hostapd_config_check_bss(struct hostapd_bss_config *bss, 11028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct hostapd_config *conf) 11038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 11048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (bss->ieee802_1x && !bss->eap_server && 11058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt !bss->radius->auth_servers) { 11068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Invalid IEEE 802.1X configuration (no " 11078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "EAP authenticator configured)."); 11088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 11098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 11108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11111f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (bss->wpa && bss->wpa_psk_radius != PSK_RADIUS_IGNORED && 11121f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt bss->macaddr_acl != USE_EXTERNAL_RADIUS_AUTH) { 11131f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt wpa_printf(MSG_ERROR, "WPA-PSK using RADIUS enabled, but no " 11141f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "RADIUS checking (macaddr_acl=2) enabled."); 11151f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return -1; 11161f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 11171f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 11188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (bss->wpa && (bss->wpa_key_mgmt & WPA_KEY_MGMT_PSK) && 11198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->ssid.wpa_psk == NULL && bss->ssid.wpa_passphrase == NULL && 11201f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt bss->ssid.wpa_psk_file == NULL && 11211f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt (bss->wpa_psk_radius != PSK_RADIUS_REQUIRED || 11221f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt bss->macaddr_acl != USE_EXTERNAL_RADIUS_AUTH)) { 11238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "WPA-PSK enabled, but PSK or passphrase " 11248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "is not configured."); 11258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 11268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 11278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (hostapd_mac_comp_empty(bss->bssid) != 0) { 11298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t i; 11308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (i = 0; i < conf->num_bss; i++) { 11328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if ((&conf->bss[i] != bss) && 11338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt (hostapd_mac_comp(conf->bss[i].bssid, 11348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->bssid) == 0)) { 11358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Duplicate BSSID " MACSTR 11368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt " on interface '%s' and '%s'.", 11378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt MAC2STR(bss->bssid), 11388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt conf->bss[i].iface, bss->iface); 11398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 11408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 11418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 11428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 11438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_IEEE80211R 11451f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (wpa_key_mgmt_ft(bss->wpa_key_mgmt) && 11468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt (bss->nas_identifier == NULL || 11478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_strlen(bss->nas_identifier) < 1 || 11488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_strlen(bss->nas_identifier) > FT_R0KH_ID_MAX_LEN)) { 11498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "FT (IEEE 802.11r) requires " 11508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "nas_identifier to be configured as a 1..48 octet " 11518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "string"); 11528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 11538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 11548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_IEEE80211R */ 11558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_IEEE80211N 115704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (conf->ieee80211n && conf->hw_mode == HOSTAPD_MODE_IEEE80211B) { 115804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt bss->disable_11n = 1; 115904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpa_printf(MSG_ERROR, "HT (IEEE 802.11n) in 11b mode is not " 116004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt "allowed, disabling HT capabilites"); 116104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 116204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 11638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (conf->ieee80211n && 11648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->ssid.security_policy == SECURITY_STATIC_WEP) { 11658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->disable_11n = 1; 11668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "HT (IEEE 802.11n) with WEP is not " 11678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "allowed, disabling HT capabilities"); 11688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 11698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (conf->ieee80211n && bss->wpa && 11718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt !(bss->wpa_pairwise & WPA_CIPHER_CCMP) && 117261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt !(bss->rsn_pairwise & (WPA_CIPHER_CCMP | WPA_CIPHER_GCMP))) { 11738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->disable_11n = 1; 11748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "HT (IEEE 802.11n) with WPA/WPA2 " 117561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt "requires CCMP/GCMP to be enabled, disabling HT " 11768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "capabilities"); 11778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 11788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_IEEE80211N */ 11798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_WPS2 11818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (bss->wps_state && bss->ignore_broadcast_ssid) { 11828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_INFO, "WPS: ignore_broadcast_ssid " 11838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "configuration forced WPS to be disabled"); 11848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->wps_state = 0; 11858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 11868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (bss->wps_state && bss->ssid.wep.keys_set && bss->wpa == 0) { 11888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_INFO, "WPS: WEP configuration forced WPS to be " 11898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "disabled"); 11908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->wps_state = 0; 11918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 119261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 119361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (bss->wps_state && bss->wpa && 119461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt (!(bss->wpa & 2) || 119561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt !(bss->rsn_pairwise & WPA_CIPHER_CCMP))) { 119661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt wpa_printf(MSG_INFO, "WPS: WPA/TKIP configuration without " 119761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt "WPA2/CCMP forced WPS to be disabled"); 119861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt bss->wps_state = 0; 119961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt } 12008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_WPS2 */ 12018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 120261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt#ifdef CONFIG_HS20 120361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (bss->hs20 && 120461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt (!(bss->wpa & 2) || 120561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt !(bss->rsn_pairwise & (WPA_CIPHER_CCMP | WPA_CIPHER_GCMP)))) { 120661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt wpa_printf(MSG_ERROR, "HS 2.0: WPA2-Enterprise/CCMP " 120761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt "configuration is required for Hotspot 2.0 " 120861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt "functionality"); 120961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return -1; 121061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt } 121161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt#endif /* CONFIG_HS20 */ 121261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 12138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 12148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 12158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int hostapd_config_check(struct hostapd_config *conf) 12188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 12198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t i; 12208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (conf->ieee80211d && (!conf->country[0] || !conf->country[1])) { 12228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Cannot enable IEEE 802.11d without " 12238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "setting the country_code"); 12248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 12258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 12268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (i = 0; i < conf->num_bss; i++) { 12288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (hostapd_config_check_bss(&conf->bss[i], conf)) 12298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 12308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 12318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 12338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 12348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#ifdef CONFIG_INTERWORKING 12371f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic int parse_roaming_consortium(struct hostapd_bss_config *bss, char *pos, 12381f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt int line) 12391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{ 12401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt size_t len = os_strlen(pos); 12411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt u8 oi[MAX_ROAMING_CONSORTIUM_LEN]; 12421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 12431f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct hostapd_roaming_consortium *rc; 12441f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 12451f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if ((len & 1) || len < 2 * 3 || len / 2 > MAX_ROAMING_CONSORTIUM_LEN || 12461f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt hexstr2bin(pos, oi, len / 2)) { 12471f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: invalid roaming_consortium " 12481f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "'%s'", line, pos); 12491f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return -1; 12501f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 12511f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt len /= 2; 12521f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 125361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt rc = os_realloc_array(bss->roaming_consortium, 125461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt bss->roaming_consortium_count + 1, 125561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt sizeof(struct hostapd_roaming_consortium)); 12561f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (rc == NULL) 12571f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return -1; 12581f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 12591f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt os_memcpy(rc[bss->roaming_consortium_count].oi, oi, len); 12601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt rc[bss->roaming_consortium_count].len = len; 12611f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 12621f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt bss->roaming_consortium = rc; 12631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt bss->roaming_consortium_count++; 12641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 12651f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return 0; 12661f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt} 126704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 126804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 126961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtstatic int parse_lang_string(struct hostapd_lang_string **array, 127061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt unsigned int *count, char *pos) 127104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{ 127204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt char *sep; 127304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt size_t clen, nlen; 127461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt struct hostapd_lang_string *ls; 127504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 127604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt sep = os_strchr(pos, ':'); 127704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (sep == NULL) 127861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return -1; 127904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt *sep++ = '\0'; 128004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 128104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt clen = os_strlen(pos); 128204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (clen < 2) 128361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return -1; 128404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt nlen = os_strlen(sep); 128504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (nlen > 252) 128661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return -1; 128761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 128861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt ls = os_realloc_array(*array, *count + 1, 128961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt sizeof(struct hostapd_lang_string)); 129061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (ls == NULL) 129161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return -1; 129261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 129361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt *array = ls; 129461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt ls = &(*array)[*count]; 129561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt (*count)++; 129661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 129761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt os_memset(ls->lang, 0, sizeof(ls->lang)); 129861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt os_memcpy(ls->lang, pos, clen); 129961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt ls->name_len = nlen; 130061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt os_memcpy(ls->name, sep, nlen); 130161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 130261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return 0; 130361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt} 130461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 130561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 130661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtstatic int parse_venue_name(struct hostapd_bss_config *bss, char *pos, 130761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt int line) 130861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt{ 130961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (parse_lang_string(&bss->venue_name, &bss->venue_name_count, pos)) { 131061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: Invalid venue_name '%s'", 131161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt line, pos); 131261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return -1; 131361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt } 131461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return 0; 131561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt} 131661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 131761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 131861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtstatic int parse_3gpp_cell_net(struct hostapd_bss_config *bss, char *buf, 131961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt int line) 132061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt{ 132161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt size_t count; 132261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt char *pos; 132361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt u8 *info = NULL, *ipos; 132461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 132561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt /* format: <MCC1,MNC1>[;<MCC2,MNC2>][;...] */ 132661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 132761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt count = 1; 132861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt for (pos = buf; *pos; pos++) { 132961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if ((*pos < '0' && *pos > '9') && *pos != ';' && *pos != ',') 133061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt goto fail; 133161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (*pos == ';') 133261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt count++; 133361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt } 133461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (1 + count * 3 > 0x7f) 133504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt goto fail; 133604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 133761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt info = os_zalloc(2 + 3 + count * 3); 133861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (info == NULL) 133904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return -1; 134004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 134161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt ipos = info; 134261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt *ipos++ = 0; /* GUD - Version 1 */ 134361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt *ipos++ = 3 + count * 3; /* User Data Header Length (UDHL) */ 134461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt *ipos++ = 0; /* PLMN List IEI */ 134561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt /* ext(b8) | Length of PLMN List value contents(b7..1) */ 134661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt *ipos++ = 1 + count * 3; 134761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt *ipos++ = count; /* Number of PLMNs */ 134861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 134961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt pos = buf; 135061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt while (pos && *pos) { 135161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt char *mcc, *mnc; 135261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt size_t mnc_len; 135361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 135461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt mcc = pos; 135561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt mnc = os_strchr(pos, ','); 135661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (mnc == NULL) 135761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt goto fail; 135861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt *mnc++ = '\0'; 135961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt pos = os_strchr(mnc, ';'); 136061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (pos) 136161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt *pos++ = '\0'; 136261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 136361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt mnc_len = os_strlen(mnc); 136461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (os_strlen(mcc) != 3 || (mnc_len != 2 && mnc_len != 3)) 136561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt goto fail; 136661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 136761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt /* BC coded MCC,MNC */ 136861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt /* MCC digit 2 | MCC digit 1 */ 136961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt *ipos++ = ((mcc[1] - '0') << 4) | (mcc[0] - '0'); 137061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt /* MNC digit 3 | MCC digit 3 */ 137161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt *ipos++ = (((mnc_len == 2) ? 0xf0 : ((mnc[2] - '0') << 4))) | 137261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt (mcc[2] - '0'); 137361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt /* MNC digit 2 | MNC digit 1 */ 137461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt *ipos++ = ((mnc[1] - '0') << 4) | (mnc[0] - '0'); 137561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt } 137604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 137761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt os_free(bss->anqp_3gpp_cell_net); 137861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt bss->anqp_3gpp_cell_net = info; 137961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt bss->anqp_3gpp_cell_net_len = 2 + 3 + 3 * count; 138061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt wpa_hexdump(MSG_MSGDUMP, "3GPP Cellular Network information", 138161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt bss->anqp_3gpp_cell_net, bss->anqp_3gpp_cell_net_len); 138204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 138304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return 0; 138404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 138504949598a23f501be6eec21697465fd46a28840aDmitry Shmidtfail: 138661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: Invalid anqp_3gpp_cell_net: %s", 138761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt line, buf); 138861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt os_free(info); 138904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return -1; 139004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt} 139161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 139261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 139361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtstatic int parse_nai_realm(struct hostapd_bss_config *bss, char *buf, int line) 139461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt{ 139561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt struct hostapd_nai_realm_data *realm; 139661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt size_t i, j, len; 139761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt int *offsets; 139861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt char *pos, *end, *rpos; 139961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 140061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt offsets = os_calloc(bss->nai_realm_count * MAX_NAI_REALMS, 140161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt sizeof(int)); 140261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (offsets == NULL) 140361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return -1; 140461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 140561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt for (i = 0; i < bss->nai_realm_count; i++) { 140661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt realm = &bss->nai_realm_data[i]; 140761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt for (j = 0; j < MAX_NAI_REALMS; j++) { 140861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt offsets[i * MAX_NAI_REALMS + j] = 140961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt realm->realm[j] ? 141061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt realm->realm[j] - realm->realm_buf : -1; 141161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt } 141261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt } 141361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 141461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt realm = os_realloc_array(bss->nai_realm_data, bss->nai_realm_count + 1, 141561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt sizeof(struct hostapd_nai_realm_data)); 141661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (realm == NULL) { 141761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt os_free(offsets); 141861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return -1; 141961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt } 142061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt bss->nai_realm_data = realm; 142161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 142261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt /* patch the pointers after realloc */ 142361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt for (i = 0; i < bss->nai_realm_count; i++) { 142461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt realm = &bss->nai_realm_data[i]; 142561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt for (j = 0; j < MAX_NAI_REALMS; j++) { 142661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt int offs = offsets[i * MAX_NAI_REALMS + j]; 142761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (offs >= 0) 142861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt realm->realm[j] = realm->realm_buf + offs; 142961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt else 143061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt realm->realm[j] = NULL; 143161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt } 143261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt } 143361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt os_free(offsets); 143461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 143561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt realm = &bss->nai_realm_data[bss->nai_realm_count]; 143661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt os_memset(realm, 0, sizeof(*realm)); 143761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 143861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt pos = buf; 143961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt realm->encoding = atoi(pos); 144061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt pos = os_strchr(pos, ','); 144161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (pos == NULL) 144261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt goto fail; 144361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt pos++; 144461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 144561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt end = os_strchr(pos, ','); 144661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (end) { 144761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt len = end - pos; 144861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt *end = '\0'; 144961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt } else { 145061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt len = os_strlen(pos); 145161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt } 145261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 145361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (len > MAX_NAI_REALMLEN) { 145461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt wpa_printf(MSG_ERROR, "Too long a realm string (%d > max %d " 145561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt "characters)", (int) len, MAX_NAI_REALMLEN); 145661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt goto fail; 145761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt } 145861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt os_memcpy(realm->realm_buf, pos, len); 145961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 146061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (end) 146161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt pos = end + 1; 146261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt else 146361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt pos = NULL; 146461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 146561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt while (pos && *pos) { 146661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt struct hostapd_nai_realm_eap *eap; 146761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 146861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (realm->eap_method_count >= MAX_NAI_EAP_METHODS) { 146961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt wpa_printf(MSG_ERROR, "Too many EAP methods"); 147061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt goto fail; 147161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt } 147261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 147361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt eap = &realm->eap_method[realm->eap_method_count]; 147461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt realm->eap_method_count++; 147561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 147661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt end = os_strchr(pos, ','); 147761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (end == NULL) 147861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt end = pos + os_strlen(pos); 147961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 148061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt eap->eap_method = atoi(pos); 148161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt for (;;) { 148261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt pos = os_strchr(pos, '['); 148361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (pos == NULL || pos > end) 148461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt break; 148561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt pos++; 148661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (eap->num_auths >= MAX_NAI_AUTH_TYPES) { 148761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt wpa_printf(MSG_ERROR, "Too many auth params"); 148861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt goto fail; 148961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt } 149061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt eap->auth_id[eap->num_auths] = atoi(pos); 149161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt pos = os_strchr(pos, ':'); 149261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (pos == NULL || pos > end) 149361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt goto fail; 149461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt pos++; 149561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt eap->auth_val[eap->num_auths] = atoi(pos); 149661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt pos = os_strchr(pos, ']'); 149761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (pos == NULL || pos > end) 149861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt goto fail; 149961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt pos++; 150061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt eap->num_auths++; 150161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt } 150261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 150361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (*end != ',') 150461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt break; 150561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 150661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt pos = end + 1; 150761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt } 150861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 150961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt /* Split realm list into null terminated realms */ 151061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt rpos = realm->realm_buf; 151161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt i = 0; 151261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt while (*rpos) { 151361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (i >= MAX_NAI_REALMS) { 151461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt wpa_printf(MSG_ERROR, "Too many realms"); 151561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt goto fail; 151661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt } 151761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt realm->realm[i++] = rpos; 151861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt rpos = os_strchr(rpos, ';'); 151961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (rpos == NULL) 152061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt break; 152161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt *rpos++ = '\0'; 152261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt } 152361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 152461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt bss->nai_realm_count++; 152561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 152661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return 0; 152761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 152861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtfail: 152961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: invalid nai_realm '%s'", line, buf); 153061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return -1; 153161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt} 153261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 15331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#endif /* CONFIG_INTERWORKING */ 15341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 15351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 153661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt#ifdef CONFIG_HS20 153761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtstatic int hs20_parse_conn_capab(struct hostapd_bss_config *bss, char *buf, 153861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt int line) 153961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt{ 154061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt u8 *conn_cap; 154161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt char *pos; 154261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 154361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (bss->hs20_connection_capability_len >= 0xfff0) 154461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return -1; 154561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 154661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt conn_cap = os_realloc(bss->hs20_connection_capability, 154761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt bss->hs20_connection_capability_len + 4); 154861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (conn_cap == NULL) 154961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return -1; 155061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 155161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt bss->hs20_connection_capability = conn_cap; 155261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt conn_cap += bss->hs20_connection_capability_len; 155361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt pos = buf; 155461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt conn_cap[0] = atoi(pos); 155561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt pos = os_strchr(pos, ':'); 155661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (pos == NULL) 155761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return -1; 155861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt pos++; 155961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt WPA_PUT_LE16(conn_cap + 1, atoi(pos)); 156061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt pos = os_strchr(pos, ':'); 156161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (pos == NULL) 156261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return -1; 156361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt pos++; 156461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt conn_cap[3] = atoi(pos); 156561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt bss->hs20_connection_capability_len += 4; 156661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 156761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return 0; 156861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt} 156961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 157061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 157161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtstatic int hs20_parse_wan_metrics(struct hostapd_bss_config *bss, char *buf, 157261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt int line) 157361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt{ 157461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt u8 *wan_metrics; 157561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt char *pos; 157661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 157761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt /* <WAN Info>:<DL Speed>:<UL Speed>:<DL Load>:<UL Load>:<LMD> */ 157861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 157961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt wan_metrics = os_zalloc(13); 158061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (wan_metrics == NULL) 158161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return -1; 158261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 158361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt pos = buf; 158461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt /* WAN Info */ 158561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (hexstr2bin(pos, wan_metrics, 1) < 0) 158661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt goto fail; 158761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt pos += 2; 158861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (*pos != ':') 158961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt goto fail; 159061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt pos++; 159161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 159261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt /* Downlink Speed */ 159361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt WPA_PUT_LE32(wan_metrics + 1, atoi(pos)); 159461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt pos = os_strchr(pos, ':'); 159561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (pos == NULL) 159661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt goto fail; 159761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt pos++; 159861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 159961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt /* Uplink Speed */ 160061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt WPA_PUT_LE32(wan_metrics + 5, atoi(pos)); 160161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt pos = os_strchr(pos, ':'); 160261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (pos == NULL) 160361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt goto fail; 160461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt pos++; 160561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 160661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt /* Downlink Load */ 160761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt wan_metrics[9] = atoi(pos); 160861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt pos = os_strchr(pos, ':'); 160961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (pos == NULL) 161061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt goto fail; 161161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt pos++; 161261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 161361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt /* Uplink Load */ 161461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt wan_metrics[10] = atoi(pos); 161561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt pos = os_strchr(pos, ':'); 161661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (pos == NULL) 161761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt goto fail; 161861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt pos++; 161961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 162061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt /* LMD */ 162161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt WPA_PUT_LE16(wan_metrics + 11, atoi(pos)); 162261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 162361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt os_free(bss->hs20_wan_metrics); 162461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt bss->hs20_wan_metrics = wan_metrics; 162561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 162661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return 0; 162761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 162861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtfail: 162961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: Invalid hs20_wan_metrics '%s'", 163061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt line, pos); 163161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt os_free(wan_metrics); 163261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return -1; 163361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt} 163461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 163561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 163661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtstatic int hs20_parse_oper_friendly_name(struct hostapd_bss_config *bss, 163761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt char *pos, int line) 163861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt{ 163961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (parse_lang_string(&bss->hs20_oper_friendly_name, 164061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt &bss->hs20_oper_friendly_name_count, pos)) { 164161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: Invalid " 164261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt "hs20_oper_friendly_name '%s'", line, pos); 164361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return -1; 164461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt } 164561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return 0; 164661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt} 164761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt#endif /* CONFIG_HS20 */ 164861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 164961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 165004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#ifdef CONFIG_WPS_NFC 165104949598a23f501be6eec21697465fd46a28840aDmitry Shmidtstatic struct wpabuf * hostapd_parse_bin(const char *buf) 16528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 165304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt size_t len; 165404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt struct wpabuf *ret; 16558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 165604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt len = os_strlen(buf); 165704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (len & 0x01) 16588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return NULL; 165904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt len /= 2; 16608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 166104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt ret = wpabuf_alloc(len); 166204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (ret == NULL) 16638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return NULL; 16648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 166504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (hexstr2bin(buf, wpabuf_put(ret, len), len)) { 166604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpabuf_free(ret); 16678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return NULL; 16688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 16698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 167004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return ret; 167104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt} 167204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#endif /* CONFIG_WPS_NFC */ 16738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 16748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 167504949598a23f501be6eec21697465fd46a28840aDmitry Shmidtstatic int hostapd_config_fill(struct hostapd_config *conf, 167604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt struct hostapd_bss_config *bss, 167704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt char *buf, char *pos, int line) 167804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{ 167904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt int errors = 0; 16808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 168104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt { 16828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (os_strcmp(buf, "interface") == 0) { 16838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_strlcpy(conf->bss[0].iface, pos, 16848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt sizeof(conf->bss[0].iface)); 16858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "bridge") == 0) { 16868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_strlcpy(bss->bridge, pos, sizeof(bss->bridge)); 16878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "wds_bridge") == 0) { 16888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_strlcpy(bss->wds_bridge, pos, 16898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt sizeof(bss->wds_bridge)); 16908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "driver") == 0) { 16918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int j; 16928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* clear to get error below if setting is invalid */ 16938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt conf->driver = NULL; 16948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (j = 0; wpa_drivers[j]; j++) { 16958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (os_strcmp(pos, wpa_drivers[j]->name) == 0) 16968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { 16978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt conf->driver = wpa_drivers[j]; 16988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 16998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 17008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 17018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (conf->driver == NULL) { 17028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: invalid/" 17038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "unknown driver '%s'", line, pos); 17048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt errors++; 17058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 17068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "debug") == 0) { 17078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "Line %d: DEPRECATED: 'debug' " 17088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "configuration variable is not used " 17098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "anymore", line); 17108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "logger_syslog_level") == 0) { 17118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->logger_syslog_level = atoi(pos); 17128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "logger_stdout_level") == 0) { 17138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->logger_stdout_level = atoi(pos); 17148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "logger_syslog") == 0) { 17158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->logger_syslog = atoi(pos); 17168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "logger_stdout") == 0) { 17178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->logger_stdout = atoi(pos); 17188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "dump_file") == 0) { 17198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->dump_log_name = os_strdup(pos); 17208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "ssid") == 0) { 17218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->ssid.ssid_len = os_strlen(pos); 17228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (bss->ssid.ssid_len > HOSTAPD_MAX_SSID_LEN || 17238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->ssid.ssid_len < 1) { 17248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: invalid SSID " 17258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "'%s'", line, pos); 17268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt errors++; 17278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 17288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memcpy(bss->ssid.ssid, pos, 17298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->ssid.ssid_len); 17308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->ssid.ssid_set = 1; 17318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 173261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt } else if (os_strcmp(buf, "ssid2") == 0) { 173361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt size_t slen; 173461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt char *str = wpa_config_parse_string(pos, &slen); 173561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (str == NULL || slen < 1 || 173661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt slen > HOSTAPD_MAX_SSID_LEN) { 173761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: invalid SSID " 173861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt "'%s'", line, pos); 173961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt errors++; 174061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt } else { 174161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt os_memcpy(bss->ssid.ssid, str, slen); 174261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt bss->ssid.ssid_len = slen; 174361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt bss->ssid.ssid_set = 1; 174461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt } 174561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt os_free(str); 1746a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt } else if (os_strcmp(buf, "utf8_ssid") == 0) { 1747a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt bss->ssid.utf8_ssid = atoi(pos) > 0; 17488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "macaddr_acl") == 0) { 17498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->macaddr_acl = atoi(pos); 17508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (bss->macaddr_acl != ACCEPT_UNLESS_DENIED && 17518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->macaddr_acl != DENY_UNLESS_ACCEPTED && 17528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->macaddr_acl != USE_EXTERNAL_RADIUS_AUTH) { 17538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: unknown " 17548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "macaddr_acl %d", 17558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt line, bss->macaddr_acl); 17568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 17578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "accept_mac_file") == 0) { 17588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (hostapd_config_read_maclist(pos, &bss->accept_mac, 17598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &bss->num_accept_mac)) 17608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { 17618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: Failed to " 17628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "read accept_mac_file '%s'", 17638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt line, pos); 17648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt errors++; 17658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 17668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "deny_mac_file") == 0) { 17678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (hostapd_config_read_maclist(pos, &bss->deny_mac, 17688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &bss->num_deny_mac)) { 17698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: Failed to " 17708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "read deny_mac_file '%s'", 17718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt line, pos); 17728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt errors++; 17738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 17748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "wds_sta") == 0) { 17758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->wds_sta = atoi(pos); 17768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "ap_isolate") == 0) { 17778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->isolate = atoi(pos); 17788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "ap_max_inactivity") == 0) { 17798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->ap_max_inactivity = atoi(pos); 17801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } else if (os_strcmp(buf, "skip_inactivity_poll") == 0) { 17811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt bss->skip_inactivity_poll = atoi(pos); 17828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "country_code") == 0) { 17838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memcpy(conf->country, pos, 2); 17848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* FIX: make this configurable */ 17858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt conf->country[2] = ' '; 17868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "ieee80211d") == 0) { 17878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt conf->ieee80211d = atoi(pos); 17888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "ieee8021x") == 0) { 17898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->ieee802_1x = atoi(pos); 17908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "eapol_version") == 0) { 17918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->eapol_version = atoi(pos); 17928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (bss->eapol_version < 1 || 17938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->eapol_version > 2) { 17948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: invalid EAPOL " 17958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "version (%d): '%s'.", 17968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt line, bss->eapol_version, pos); 17978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt errors++; 17988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else 17998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "eapol_version=%d", 18008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->eapol_version); 18018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef EAP_SERVER 18028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "eap_authenticator") == 0) { 18038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->eap_server = atoi(pos); 18048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: obsolete " 18058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "eap_authenticator used; this has been " 18068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "renamed to eap_server", line); 18078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "eap_server") == 0) { 18088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->eap_server = atoi(pos); 18098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "eap_user_file") == 0) { 18108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (hostapd_config_read_eap_user(pos, bss)) 18118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt errors++; 18128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "ca_cert") == 0) { 18138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(bss->ca_cert); 18148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->ca_cert = os_strdup(pos); 18158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "server_cert") == 0) { 18168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(bss->server_cert); 18178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->server_cert = os_strdup(pos); 18188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "private_key") == 0) { 18198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(bss->private_key); 18208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->private_key = os_strdup(pos); 18218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "private_key_passwd") == 0) { 18228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(bss->private_key_passwd); 18238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->private_key_passwd = os_strdup(pos); 18248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "check_crl") == 0) { 18258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->check_crl = atoi(pos); 18268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "dh_file") == 0) { 18278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(bss->dh_file); 18288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->dh_file = os_strdup(pos); 18298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "fragment_size") == 0) { 18308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->fragment_size = atoi(pos); 18318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef EAP_SERVER_FAST 18328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "pac_opaque_encr_key") == 0) { 18338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(bss->pac_opaque_encr_key); 18348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->pac_opaque_encr_key = os_malloc(16); 18358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (bss->pac_opaque_encr_key == NULL) { 18368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: No memory for " 18378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "pac_opaque_encr_key", line); 18388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt errors++; 18398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (hexstr2bin(pos, bss->pac_opaque_encr_key, 18408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 16)) { 18418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: Invalid " 18428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "pac_opaque_encr_key", line); 18438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt errors++; 18448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 18458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "eap_fast_a_id") == 0) { 18468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t idlen = os_strlen(pos); 18478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (idlen & 1) { 18488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: Invalid " 18498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "eap_fast_a_id", line); 18508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt errors++; 18518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 18528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(bss->eap_fast_a_id); 18538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->eap_fast_a_id = os_malloc(idlen / 2); 18548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (bss->eap_fast_a_id == NULL || 18558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt hexstr2bin(pos, bss->eap_fast_a_id, 18568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt idlen / 2)) { 18578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: " 18588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "Failed to parse " 18598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "eap_fast_a_id", line); 18608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt errors++; 18618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else 18628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->eap_fast_a_id_len = idlen / 2; 18638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 18648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "eap_fast_a_id_info") == 0) { 18658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(bss->eap_fast_a_id_info); 18668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->eap_fast_a_id_info = os_strdup(pos); 18678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "eap_fast_prov") == 0) { 18688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->eap_fast_prov = atoi(pos); 18698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "pac_key_lifetime") == 0) { 18708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->pac_key_lifetime = atoi(pos); 18718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "pac_key_refresh_time") == 0) { 18728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->pac_key_refresh_time = atoi(pos); 18738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* EAP_SERVER_FAST */ 18748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef EAP_SERVER_SIM 18758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "eap_sim_db") == 0) { 18768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(bss->eap_sim_db); 18778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->eap_sim_db = os_strdup(pos); 18788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "eap_sim_aka_result_ind") == 0) { 18798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->eap_sim_aka_result_ind = atoi(pos); 18808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* EAP_SERVER_SIM */ 18818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef EAP_SERVER_TNC 18828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "tnc") == 0) { 18838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->tnc = atoi(pos); 18848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* EAP_SERVER_TNC */ 18858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef EAP_SERVER_PWD 18868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "pwd_group") == 0) { 18878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->pwd_group = atoi(pos); 18888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* EAP_SERVER_PWD */ 18898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* EAP_SERVER */ 18908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "eap_message") == 0) { 18918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *term; 18928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->eap_req_id_text = os_strdup(pos); 18938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (bss->eap_req_id_text == NULL) { 18948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: Failed to " 18958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "allocate memory for " 18968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "eap_req_id_text", line); 18978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt errors++; 189804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return errors; 18998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 19008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->eap_req_id_text_len = 19018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_strlen(bss->eap_req_id_text); 19028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt term = os_strstr(bss->eap_req_id_text, "\\0"); 19038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (term) { 19048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *term++ = '\0'; 19058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memmove(term, term + 1, 19068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->eap_req_id_text_len - 19078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt (term - bss->eap_req_id_text) - 1); 19088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->eap_req_id_text_len--; 19098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 19108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "wep_key_len_broadcast") == 0) { 19118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->default_wep_key_len = atoi(pos); 19128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (bss->default_wep_key_len > 13) { 19138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: invalid WEP " 19148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "key len %lu (= %lu bits)", line, 19158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt (unsigned long) 19168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->default_wep_key_len, 19178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt (unsigned long) 19188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->default_wep_key_len * 8); 19198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt errors++; 19208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 19218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "wep_key_len_unicast") == 0) { 19228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->individual_wep_key_len = atoi(pos); 19238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (bss->individual_wep_key_len < 0 || 19248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->individual_wep_key_len > 13) { 19258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: invalid WEP " 19268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "key len %d (= %d bits)", line, 19278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->individual_wep_key_len, 19288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->individual_wep_key_len * 8); 19298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt errors++; 19308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 19318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "wep_rekey_period") == 0) { 19328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->wep_rekeying_period = atoi(pos); 19338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (bss->wep_rekeying_period < 0) { 19348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: invalid " 19358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "period %d", 19368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt line, bss->wep_rekeying_period); 19378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt errors++; 19388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 19398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "eap_reauth_period") == 0) { 19408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->eap_reauth_period = atoi(pos); 19418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (bss->eap_reauth_period < 0) { 19428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: invalid " 19438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "period %d", 19448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt line, bss->eap_reauth_period); 19458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt errors++; 19468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 19478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "eapol_key_index_workaround") == 0) { 19488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->eapol_key_index_workaround = atoi(pos); 19498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_IAPP 19508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "iapp_interface") == 0) { 19518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->ieee802_11f = 1; 19528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_strlcpy(bss->iapp_iface, pos, 19538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt sizeof(bss->iapp_iface)); 19548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_IAPP */ 19558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "own_ip_addr") == 0) { 19568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (hostapd_parse_ip_addr(pos, &bss->own_ip_addr)) { 19578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: invalid IP " 19588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "address '%s'", line, pos); 19598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt errors++; 19608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 19618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "nas_identifier") == 0) { 19628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->nas_identifier = os_strdup(pos); 19638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifndef CONFIG_NO_RADIUS 19648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "auth_server_addr") == 0) { 19658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (hostapd_config_read_radius_addr( 19668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &bss->radius->auth_servers, 19678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &bss->radius->num_auth_servers, pos, 1812, 19688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &bss->radius->auth_server)) { 19698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: invalid IP " 19708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "address '%s'", line, pos); 19718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt errors++; 19728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 19738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (bss->radius->auth_server && 19748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_strcmp(buf, "auth_server_port") == 0) { 19758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->radius->auth_server->port = atoi(pos); 19768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (bss->radius->auth_server && 19778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_strcmp(buf, "auth_server_shared_secret") == 0) { 19788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int len = os_strlen(pos); 19798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (len == 0) { 19808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* RFC 2865, Ch. 3 */ 19818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: empty shared " 19828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "secret is not allowed.", line); 19838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt errors++; 19848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 19858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->radius->auth_server->shared_secret = 19868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt (u8 *) os_strdup(pos); 19878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->radius->auth_server->shared_secret_len = len; 19888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "acct_server_addr") == 0) { 19898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (hostapd_config_read_radius_addr( 19908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &bss->radius->acct_servers, 19918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &bss->radius->num_acct_servers, pos, 1813, 19928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &bss->radius->acct_server)) { 19938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: invalid IP " 19948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "address '%s'", line, pos); 19958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt errors++; 19968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 19978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (bss->radius->acct_server && 19988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_strcmp(buf, "acct_server_port") == 0) { 19998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->radius->acct_server->port = atoi(pos); 20008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (bss->radius->acct_server && 20018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_strcmp(buf, "acct_server_shared_secret") == 0) { 20028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int len = os_strlen(pos); 20038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (len == 0) { 20048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* RFC 2865, Ch. 3 */ 20058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: empty shared " 20068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "secret is not allowed.", line); 20078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt errors++; 20088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 20098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->radius->acct_server->shared_secret = 20108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt (u8 *) os_strdup(pos); 20118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->radius->acct_server->shared_secret_len = len; 20128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "radius_retry_primary_interval") == 20138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 0) { 20148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->radius->retry_primary_interval = atoi(pos); 20158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "radius_acct_interim_interval") == 0) 20168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { 20178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->acct_interim_interval = atoi(pos); 201804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } else if (os_strcmp(buf, "radius_request_cui") == 0) { 201904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt bss->radius_request_cui = atoi(pos); 202004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } else if (os_strcmp(buf, "radius_auth_req_attr") == 0) { 202104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt struct hostapd_radius_attr *attr, *a; 202204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt attr = hostapd_parse_radius_attr(pos); 202304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (attr == NULL) { 202404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: invalid " 202504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt "radius_auth_req_attr", line); 202604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt errors++; 202704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } else if (bss->radius_auth_req_attr == NULL) { 202804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt bss->radius_auth_req_attr = attr; 202904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } else { 203004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt a = bss->radius_auth_req_attr; 203104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt while (a->next) 203204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt a = a->next; 203304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt a->next = attr; 203404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 203504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } else if (os_strcmp(buf, "radius_acct_req_attr") == 0) { 203604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt struct hostapd_radius_attr *attr, *a; 203704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt attr = hostapd_parse_radius_attr(pos); 203804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (attr == NULL) { 203904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: invalid " 204004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt "radius_acct_req_attr", line); 204104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt errors++; 204204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } else if (bss->radius_acct_req_attr == NULL) { 204304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt bss->radius_acct_req_attr = attr; 204404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } else { 204504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt a = bss->radius_acct_req_attr; 204604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt while (a->next) 204704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt a = a->next; 204804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt a->next = attr; 204904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 205004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } else if (os_strcmp(buf, "radius_das_port") == 0) { 205104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt bss->radius_das_port = atoi(pos); 205204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } else if (os_strcmp(buf, "radius_das_client") == 0) { 205304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (hostapd_parse_das_client(bss, pos) < 0) { 205404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: invalid " 205504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt "DAS client", line); 205604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt errors++; 205704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 205804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } else if (os_strcmp(buf, "radius_das_time_window") == 0) { 205904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt bss->radius_das_time_window = atoi(pos); 206004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } else if (os_strcmp(buf, "radius_das_require_event_timestamp") 206104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt == 0) { 206204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt bss->radius_das_require_event_timestamp = atoi(pos); 20638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_NO_RADIUS */ 20648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "auth_algs") == 0) { 20658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->auth_algs = atoi(pos); 20668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (bss->auth_algs == 0) { 20678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: no " 20688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "authentication algorithms allowed", 20698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt line); 20708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt errors++; 20718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 20728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "max_num_sta") == 0) { 20738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->max_num_sta = atoi(pos); 20748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (bss->max_num_sta < 0 || 20758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->max_num_sta > MAX_STA_COUNT) { 20768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: Invalid " 20778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "max_num_sta=%d; allowed range " 20788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "0..%d", line, bss->max_num_sta, 20798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt MAX_STA_COUNT); 20808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt errors++; 20818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 20828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "wpa") == 0) { 20838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->wpa = atoi(pos); 20848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "wpa_group_rekey") == 0) { 20858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->wpa_group_rekey = atoi(pos); 20868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "wpa_strict_rekey") == 0) { 20878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->wpa_strict_rekey = atoi(pos); 20888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "wpa_gmk_rekey") == 0) { 20898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->wpa_gmk_rekey = atoi(pos); 20908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "wpa_ptk_rekey") == 0) { 20918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->wpa_ptk_rekey = atoi(pos); 20928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "wpa_passphrase") == 0) { 20938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int len = os_strlen(pos); 20948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (len < 8 || len > 63) { 20958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: invalid WPA " 20968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "passphrase length %d (expected " 20978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "8..63)", line, len); 20988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt errors++; 20998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 21008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(bss->ssid.wpa_passphrase); 21018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->ssid.wpa_passphrase = os_strdup(pos); 210204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt os_free(bss->ssid.wpa_psk); 210304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt bss->ssid.wpa_psk = NULL; 21048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 21058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "wpa_psk") == 0) { 21068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(bss->ssid.wpa_psk); 21078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->ssid.wpa_psk = 21088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_zalloc(sizeof(struct hostapd_wpa_psk)); 21098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (bss->ssid.wpa_psk == NULL) 21108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt errors++; 21118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else if (hexstr2bin(pos, bss->ssid.wpa_psk->psk, 21128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt PMK_LEN) || 21138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos[PMK_LEN * 2] != '\0') { 21148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: Invalid PSK " 21158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "'%s'.", line, pos); 21168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt errors++; 21178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 21188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->ssid.wpa_psk->group = 1; 211904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt os_free(bss->ssid.wpa_passphrase); 212004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt bss->ssid.wpa_passphrase = NULL; 21218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 21228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "wpa_psk_file") == 0) { 21238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(bss->ssid.wpa_psk_file); 21248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->ssid.wpa_psk_file = os_strdup(pos); 21258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!bss->ssid.wpa_psk_file) { 21268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: allocation " 21278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "failed", line); 21288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt errors++; 21298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 21308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "wpa_key_mgmt") == 0) { 21318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->wpa_key_mgmt = 21328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt hostapd_config_parse_key_mgmt(line, pos); 21338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (bss->wpa_key_mgmt == -1) 21348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt errors++; 21351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } else if (os_strcmp(buf, "wpa_psk_radius") == 0) { 21361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt bss->wpa_psk_radius = atoi(pos); 21371f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (bss->wpa_psk_radius != PSK_RADIUS_IGNORED && 21381f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt bss->wpa_psk_radius != PSK_RADIUS_ACCEPTED && 21391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt bss->wpa_psk_radius != PSK_RADIUS_REQUIRED) { 21401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: unknown " 21411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "wpa_psk_radius %d", 21421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt line, bss->wpa_psk_radius); 21431f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt errors++; 21441f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 21458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "wpa_pairwise") == 0) { 21468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->wpa_pairwise = 21478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt hostapd_config_parse_cipher(line, pos); 21488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (bss->wpa_pairwise == -1 || 21498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->wpa_pairwise == 0) 21508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt errors++; 21518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else if (bss->wpa_pairwise & 21528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt (WPA_CIPHER_NONE | WPA_CIPHER_WEP40 | 21538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt WPA_CIPHER_WEP104)) { 21548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: unsupported " 21558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "pairwise cipher suite '%s'", 21568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->wpa_pairwise, pos); 21578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt errors++; 21588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 21598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "rsn_pairwise") == 0) { 21608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->rsn_pairwise = 21618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt hostapd_config_parse_cipher(line, pos); 21628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (bss->rsn_pairwise == -1 || 21638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->rsn_pairwise == 0) 21648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt errors++; 21658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else if (bss->rsn_pairwise & 21668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt (WPA_CIPHER_NONE | WPA_CIPHER_WEP40 | 21678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt WPA_CIPHER_WEP104)) { 21688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: unsupported " 21698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "pairwise cipher suite '%s'", 21708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->rsn_pairwise, pos); 21718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt errors++; 21728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 21738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_RSN_PREAUTH 21748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "rsn_preauth") == 0) { 21758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->rsn_preauth = atoi(pos); 21768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "rsn_preauth_interfaces") == 0) { 21778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->rsn_preauth_interfaces = os_strdup(pos); 21788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_RSN_PREAUTH */ 21798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_PEERKEY 21808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "peerkey") == 0) { 21818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->peerkey = atoi(pos); 21828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_PEERKEY */ 21838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_IEEE80211R 21848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "mobility_domain") == 0) { 21858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (os_strlen(pos) != 2 * MOBILITY_DOMAIN_ID_LEN || 21868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt hexstr2bin(pos, bss->mobility_domain, 21878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt MOBILITY_DOMAIN_ID_LEN) != 0) { 21888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "Line %d: Invalid " 21898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "mobility_domain '%s'", line, pos); 21908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt errors++; 219104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return errors; 21928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 21938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "r1_key_holder") == 0) { 21948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (os_strlen(pos) != 2 * FT_R1KH_ID_LEN || 21958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt hexstr2bin(pos, bss->r1_key_holder, 21968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt FT_R1KH_ID_LEN) != 0) { 21978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "Line %d: Invalid " 21988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "r1_key_holder '%s'", line, pos); 21998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt errors++; 220004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return errors; 22018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 22028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "r0_key_lifetime") == 0) { 22038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->r0_key_lifetime = atoi(pos); 22048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "reassociation_deadline") == 0) { 22058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->reassociation_deadline = atoi(pos); 22068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "r0kh") == 0) { 22078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (add_r0kh(bss, pos) < 0) { 22088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "Line %d: Invalid " 22098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "r0kh '%s'", line, pos); 22108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt errors++; 221104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return errors; 22128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 22138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "r1kh") == 0) { 22148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (add_r1kh(bss, pos) < 0) { 22158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "Line %d: Invalid " 22168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "r1kh '%s'", line, pos); 22178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt errors++; 221804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return errors; 22198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 22208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "pmk_r1_push") == 0) { 22218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->pmk_r1_push = atoi(pos); 22228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "ft_over_ds") == 0) { 22238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->ft_over_ds = atoi(pos); 22248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_IEEE80211R */ 22258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifndef CONFIG_NO_CTRL_IFACE 22268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "ctrl_interface") == 0) { 22278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(bss->ctrl_interface); 22288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->ctrl_interface = os_strdup(pos); 22298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "ctrl_interface_group") == 0) { 22308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifndef CONFIG_NATIVE_WINDOWS 22318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct group *grp; 22328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *endp; 22338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *group = pos; 22348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 22358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt grp = getgrnam(group); 22368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (grp) { 22378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->ctrl_interface_gid = grp->gr_gid; 22388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->ctrl_interface_gid_set = 1; 22398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "ctrl_interface_group=%d" 22408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt " (from group name '%s')", 22418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->ctrl_interface_gid, group); 224204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return errors; 22438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 22448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 22458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Group name not found - try to parse this as gid */ 22468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->ctrl_interface_gid = strtol(group, &endp, 10); 22478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (*group == '\0' || *endp != '\0') { 22488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "Line %d: Invalid group " 22498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "'%s'", line, group); 22508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt errors++; 225104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return errors; 22528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 22538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->ctrl_interface_gid_set = 1; 22548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "ctrl_interface_group=%d", 22558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->ctrl_interface_gid); 22568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_NATIVE_WINDOWS */ 22578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_NO_CTRL_IFACE */ 22588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef RADIUS_SERVER 22598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "radius_server_clients") == 0) { 22608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(bss->radius_server_clients); 22618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->radius_server_clients = os_strdup(pos); 22628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "radius_server_auth_port") == 0) { 22638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->radius_server_auth_port = atoi(pos); 22648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "radius_server_ipv6") == 0) { 22658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->radius_server_ipv6 = atoi(pos); 22668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* RADIUS_SERVER */ 22678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "test_socket") == 0) { 22688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(bss->test_socket); 22698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->test_socket = os_strdup(pos); 22708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "use_pae_group_addr") == 0) { 22718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->use_pae_group_addr = atoi(pos); 22728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "hw_mode") == 0) { 22738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (os_strcmp(pos, "a") == 0) 22748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt conf->hw_mode = HOSTAPD_MODE_IEEE80211A; 22758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else if (os_strcmp(pos, "b") == 0) 22768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt conf->hw_mode = HOSTAPD_MODE_IEEE80211B; 22778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else if (os_strcmp(pos, "g") == 0) 22788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt conf->hw_mode = HOSTAPD_MODE_IEEE80211G; 2279a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt else if (os_strcmp(pos, "ad") == 0) 2280a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt conf->hw_mode = HOSTAPD_MODE_IEEE80211AD; 22818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else { 22828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: unknown " 22838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "hw_mode '%s'", line, pos); 22848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt errors++; 22858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 22861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } else if (os_strcmp(buf, "wps_rf_bands") == 0) { 22871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (os_strcmp(pos, "a") == 0) 22881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt bss->wps_rf_bands = WPS_RF_50GHZ; 22891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt else if (os_strcmp(pos, "g") == 0 || 22901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt os_strcmp(pos, "b") == 0) 22911f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt bss->wps_rf_bands = WPS_RF_24GHZ; 22921f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt else if (os_strcmp(pos, "ag") == 0 || 22931f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt os_strcmp(pos, "ga") == 0) 22941f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt bss->wps_rf_bands = 22951f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt WPS_RF_24GHZ | WPS_RF_50GHZ; 22961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt else { 22971f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: unknown " 22981f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "wps_rf_band '%s'", line, pos); 22991f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt errors++; 23001f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 23018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "channel") == 0) { 23028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt conf->channel = atoi(pos); 23038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "beacon_int") == 0) { 23048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int val = atoi(pos); 23058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* MIB defines range as 1..65535, but very small values 23068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * cause problems with the current implementation. 23078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Since it is unlikely that this small numbers are 23088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * useful in real life scenarios, do not allow beacon 23098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * period to be set below 15 TU. */ 23108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (val < 15 || val > 65535) { 23118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: invalid " 23128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "beacon_int %d (expected " 23138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "15..65535)", line, val); 23148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt errors++; 23158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else 23168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt conf->beacon_int = val; 23178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "dtim_period") == 0) { 23188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->dtim_period = atoi(pos); 23198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (bss->dtim_period < 1 || bss->dtim_period > 255) { 23208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: invalid " 23218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "dtim_period %d", 23228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt line, bss->dtim_period); 23238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt errors++; 23248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 23258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "rts_threshold") == 0) { 23268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt conf->rts_threshold = atoi(pos); 23278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (conf->rts_threshold < 0 || 23288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt conf->rts_threshold > 2347) { 23298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: invalid " 23308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "rts_threshold %d", 23318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt line, conf->rts_threshold); 23328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt errors++; 23338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 23348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "fragm_threshold") == 0) { 23358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt conf->fragm_threshold = atoi(pos); 23368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (conf->fragm_threshold < 256 || 23378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt conf->fragm_threshold > 2346) { 23388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: invalid " 23398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "fragm_threshold %d", 23408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt line, conf->fragm_threshold); 23418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt errors++; 23428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 23438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "send_probe_response") == 0) { 23448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int val = atoi(pos); 23458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (val != 0 && val != 1) { 23468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: invalid " 23478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "send_probe_response %d (expected " 23488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "0 or 1)", line, val); 23498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else 23508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt conf->send_probe_response = val; 23518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "supported_rates") == 0) { 23528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (hostapd_parse_rates(&conf->supported_rates, pos)) { 23538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: invalid rate " 23548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "list", line); 23558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt errors++; 23568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 23578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "basic_rates") == 0) { 23588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (hostapd_parse_rates(&conf->basic_rates, pos)) { 23598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: invalid rate " 23608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "list", line); 23618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt errors++; 23628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 23638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "preamble") == 0) { 23648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (atoi(pos)) 23658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt conf->preamble = SHORT_PREAMBLE; 23668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else 23678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt conf->preamble = LONG_PREAMBLE; 23688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "ignore_broadcast_ssid") == 0) { 23698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->ignore_broadcast_ssid = atoi(pos); 23708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "wep_default_key") == 0) { 23718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->ssid.wep.idx = atoi(pos); 23728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (bss->ssid.wep.idx > 3) { 23738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Invalid " 23748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "wep_default_key index %d", 23758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->ssid.wep.idx); 23768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt errors++; 23778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 23788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "wep_key0") == 0 || 23798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_strcmp(buf, "wep_key1") == 0 || 23808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_strcmp(buf, "wep_key2") == 0 || 23818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_strcmp(buf, "wep_key3") == 0) { 23828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (hostapd_config_read_wep(&bss->ssid.wep, 23838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt buf[7] - '0', pos)) { 23848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: invalid WEP " 23858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "key '%s'", line, buf); 23868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt errors++; 23878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 23888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifndef CONFIG_NO_VLAN 23898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "dynamic_vlan") == 0) { 23908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->ssid.dynamic_vlan = atoi(pos); 23918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "vlan_file") == 0) { 23928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (hostapd_config_read_vlan_file(bss, pos)) { 23938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: failed to " 23948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "read VLAN file '%s'", line, pos); 23958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt errors++; 23968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 239761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt } else if (os_strcmp(buf, "vlan_naming") == 0) { 239861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt bss->ssid.vlan_naming = atoi(pos); 239961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (bss->ssid.vlan_naming >= DYNAMIC_VLAN_NAMING_END || 240061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt bss->ssid.vlan_naming < 0) { 240161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: invalid " 240261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt "naming scheme %d", line, 240361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt bss->ssid.vlan_naming); 240461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt errors++; 240561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt } 24068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_FULL_DYNAMIC_VLAN 24078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "vlan_tagged_interface") == 0) { 24088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->ssid.vlan_tagged_interface = os_strdup(pos); 24098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_FULL_DYNAMIC_VLAN */ 24108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_NO_VLAN */ 24118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "ap_table_max_size") == 0) { 24128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt conf->ap_table_max_size = atoi(pos); 24138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "ap_table_expiration_time") == 0) { 24148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt conf->ap_table_expiration_time = atoi(pos); 24158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strncmp(buf, "tx_queue_", 9) == 0) { 24168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (hostapd_config_tx_queue(conf, buf, pos)) { 24178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: invalid TX " 24188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "queue item", line); 24198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt errors++; 24208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 24218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "wme_enabled") == 0 || 24228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_strcmp(buf, "wmm_enabled") == 0) { 24238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->wmm_enabled = atoi(pos); 24248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "uapsd_advertisement_enabled") == 0) { 24258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->wmm_uapsd = atoi(pos); 24268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strncmp(buf, "wme_ac_", 7) == 0 || 24278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_strncmp(buf, "wmm_ac_", 7) == 0) { 242861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (hostapd_config_wmm_ac(conf->wmm_ac_params, buf, 242961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt pos)) { 24308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: invalid WMM " 24318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "ac item", line); 24328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt errors++; 24338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 24348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "bss") == 0) { 24358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (hostapd_config_bss(conf, pos)) { 24368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: invalid bss " 24378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "item", line); 24388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt errors++; 24398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 24408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "bssid") == 0) { 24418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (hwaddr_aton(pos, bss->bssid)) { 24428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: invalid bssid " 24438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "item", line); 24448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt errors++; 24458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 24468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_IEEE80211W 24478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "ieee80211w") == 0) { 24488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->ieee80211w = atoi(pos); 24498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "assoc_sa_query_max_timeout") == 0) { 24508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->assoc_sa_query_max_timeout = atoi(pos); 24518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (bss->assoc_sa_query_max_timeout == 0) { 24528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: invalid " 24538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "assoc_sa_query_max_timeout", line); 24548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt errors++; 24558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 24568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "assoc_sa_query_retry_timeout") == 0) 24578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { 24588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->assoc_sa_query_retry_timeout = atoi(pos); 24598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (bss->assoc_sa_query_retry_timeout == 0) { 24608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: invalid " 24618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "assoc_sa_query_retry_timeout", 24628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt line); 24638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt errors++; 24648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 24658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_IEEE80211W */ 24668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_IEEE80211N 24678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "ieee80211n") == 0) { 24688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt conf->ieee80211n = atoi(pos); 24698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "ht_capab") == 0) { 24708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (hostapd_config_ht_capab(conf, pos) < 0) { 24718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: invalid " 24728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "ht_capab", line); 24738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt errors++; 24748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 24758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "require_ht") == 0) { 24768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt conf->require_ht = atoi(pos); 24778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_IEEE80211N */ 247804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#ifdef CONFIG_IEEE80211AC 247904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } else if (os_strcmp(buf, "ieee80211ac") == 0) { 248004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt conf->ieee80211ac = atoi(pos); 248104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } else if (os_strcmp(buf, "vht_capab") == 0) { 248204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (hostapd_config_vht_capab(conf, pos) < 0) { 248304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: invalid " 248404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt "vht_capab", line); 248504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt errors++; 248604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 248761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt } else if (os_strcmp(buf, "require_vht") == 0) { 248861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt conf->require_vht = atoi(pos); 248904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } else if (os_strcmp(buf, "vht_oper_chwidth") == 0) { 249061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt conf->vht_oper_chwidth = atoi(pos); 249161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt } else if (os_strcmp(buf, "vht_oper_centr_freq_seg0_idx") == 0) 249261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt { 249361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt conf->vht_oper_centr_freq_seg0_idx = atoi(pos); 2494d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt } else if (os_strcmp(buf, "vht_oper_centr_freq_seg1_idx") == 0) 2495d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt { 2496d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt conf->vht_oper_centr_freq_seg1_idx = atoi(pos); 249704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#endif /* CONFIG_IEEE80211AC */ 24988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "max_listen_interval") == 0) { 24998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->max_listen_interval = atoi(pos); 2500c55524ad84d13014e8019491c2b17e5dcf13545aDmitry Shmidt } else if (os_strcmp(buf, "disable_pmksa_caching") == 0) { 2501c55524ad84d13014e8019491c2b17e5dcf13545aDmitry Shmidt bss->disable_pmksa_caching = atoi(pos); 25028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "okc") == 0) { 25038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->okc = atoi(pos); 25048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_WPS 25058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "wps_state") == 0) { 25068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->wps_state = atoi(pos); 25078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (bss->wps_state < 0 || bss->wps_state > 2) { 25088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: invalid " 25098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "wps_state", line); 25108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt errors++; 25118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 2512444d567b27731d8572ef37697dd12fd1c37c2f24Dmitry Shmidt } else if (os_strcmp(buf, "wps_independent") == 0) { 2513444d567b27731d8572ef37697dd12fd1c37c2f24Dmitry Shmidt bss->wps_independent = atoi(pos); 25148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "ap_setup_locked") == 0) { 25158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->ap_setup_locked = atoi(pos); 25168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "uuid") == 0) { 25178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (uuid_str2bin(pos, bss->uuid)) { 25188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: invalid UUID", 25198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt line); 25208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt errors++; 25218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 25228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "wps_pin_requests") == 0) { 25238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(bss->wps_pin_requests); 25248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->wps_pin_requests = os_strdup(pos); 25258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "device_name") == 0) { 25268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (os_strlen(pos) > 32) { 25278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: Too long " 25288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "device_name", line); 25298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt errors++; 25308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 25318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(bss->device_name); 25328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->device_name = os_strdup(pos); 25338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "manufacturer") == 0) { 25348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (os_strlen(pos) > 64) { 25358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: Too long " 25368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "manufacturer", line); 25378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt errors++; 25388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 25398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(bss->manufacturer); 25408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->manufacturer = os_strdup(pos); 25418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "model_name") == 0) { 25428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (os_strlen(pos) > 32) { 25438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: Too long " 25448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "model_name", line); 25458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt errors++; 25468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 25478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(bss->model_name); 25488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->model_name = os_strdup(pos); 25498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "model_number") == 0) { 25508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (os_strlen(pos) > 32) { 25518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: Too long " 25528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "model_number", line); 25538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt errors++; 25548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 25558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(bss->model_number); 25568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->model_number = os_strdup(pos); 25578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "serial_number") == 0) { 25588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (os_strlen(pos) > 32) { 25598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: Too long " 25608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "serial_number", line); 25618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt errors++; 25628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 25638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(bss->serial_number); 25648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->serial_number = os_strdup(pos); 25658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "device_type") == 0) { 25668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wps_dev_type_str2bin(pos, bss->device_type)) 25678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt errors++; 25688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "config_methods") == 0) { 25698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(bss->config_methods); 25708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->config_methods = os_strdup(pos); 25718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "os_version") == 0) { 25728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (hexstr2bin(pos, bss->os_version, 4)) { 25738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: invalid " 25748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "os_version", line); 25758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt errors++; 25768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 25778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "ap_pin") == 0) { 25788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(bss->ap_pin); 25798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->ap_pin = os_strdup(pos); 25808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "skip_cred_build") == 0) { 25818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->skip_cred_build = atoi(pos); 25828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "extra_cred") == 0) { 25838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(bss->extra_cred); 25848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->extra_cred = 25858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt (u8 *) os_readfile(pos, &bss->extra_cred_len); 25868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (bss->extra_cred == NULL) { 25878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: could not " 25888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "read Credentials from '%s'", 25898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt line, pos); 25908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt errors++; 25918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 25928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "wps_cred_processing") == 0) { 25938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->wps_cred_processing = atoi(pos); 25948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "ap_settings") == 0) { 25958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(bss->ap_settings); 25968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->ap_settings = 25978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt (u8 *) os_readfile(pos, &bss->ap_settings_len); 25988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (bss->ap_settings == NULL) { 25998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: could not " 26008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "read AP Settings from '%s'", 26018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt line, pos); 26028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt errors++; 26038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 26048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "upnp_iface") == 0) { 26058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->upnp_iface = os_strdup(pos); 26068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "friendly_name") == 0) { 26078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(bss->friendly_name); 26088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->friendly_name = os_strdup(pos); 26098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "manufacturer_url") == 0) { 26108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(bss->manufacturer_url); 26118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->manufacturer_url = os_strdup(pos); 26128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "model_description") == 0) { 26138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(bss->model_description); 26148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->model_description = os_strdup(pos); 26158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "model_url") == 0) { 26168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(bss->model_url); 26178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->model_url = os_strdup(pos); 26188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "upc") == 0) { 26198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(bss->upc); 26208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->upc = os_strdup(pos); 262187fd279308af3f806848c8f2ab65ef18c6ac4c30Jouni Malinen } else if (os_strcmp(buf, "pbc_in_m1") == 0) { 262287fd279308af3f806848c8f2ab65ef18c6ac4c30Jouni Malinen bss->pbc_in_m1 = atoi(pos); 262304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#ifdef CONFIG_WPS_NFC 262404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } else if (os_strcmp(buf, "wps_nfc_dev_pw_id") == 0) { 262504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt bss->wps_nfc_dev_pw_id = atoi(pos); 262604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (bss->wps_nfc_dev_pw_id < 0x10 || 262704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt bss->wps_nfc_dev_pw_id > 0xffff) { 262804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: Invalid " 262904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt "wps_nfc_dev_pw_id value", line); 263004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt errors++; 263104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 2632f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt bss->wps_nfc_pw_from_config = 1; 263304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } else if (os_strcmp(buf, "wps_nfc_dh_pubkey") == 0) { 263404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpabuf_free(bss->wps_nfc_dh_pubkey); 263504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt bss->wps_nfc_dh_pubkey = hostapd_parse_bin(pos); 2636f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt bss->wps_nfc_pw_from_config = 1; 263704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } else if (os_strcmp(buf, "wps_nfc_dh_privkey") == 0) { 263804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpabuf_free(bss->wps_nfc_dh_privkey); 263904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt bss->wps_nfc_dh_privkey = hostapd_parse_bin(pos); 2640f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt bss->wps_nfc_pw_from_config = 1; 264104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } else if (os_strcmp(buf, "wps_nfc_dev_pw") == 0) { 264204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpabuf_free(bss->wps_nfc_dev_pw); 264304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt bss->wps_nfc_dev_pw = hostapd_parse_bin(pos); 2644f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt bss->wps_nfc_pw_from_config = 1; 264504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#endif /* CONFIG_WPS_NFC */ 26468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_WPS */ 26478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_P2P_MANAGER 26488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "manage_p2p") == 0) { 26498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int manage = atoi(pos); 26508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (manage) 26518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->p2p |= P2P_MANAGE; 26528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else 26538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->p2p &= ~P2P_MANAGE; 26548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "allow_cross_connection") == 0) { 26558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (atoi(pos)) 26568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->p2p |= P2P_ALLOW_CROSS_CONNECTION; 26578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else 26588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->p2p &= ~P2P_ALLOW_CROSS_CONNECTION; 26598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_P2P_MANAGER */ 26608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "disassoc_low_ack") == 0) { 26618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->disassoc_low_ack = atoi(pos); 26628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "tdls_prohibit") == 0) { 26638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int val = atoi(pos); 26648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (val) 26658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->tdls |= TDLS_PROHIBIT; 26668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else 26678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->tdls &= ~TDLS_PROHIBIT; 26688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "tdls_prohibit_chan_switch") == 0) { 26698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int val = atoi(pos); 26708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (val) 26718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->tdls |= TDLS_PROHIBIT_CHAN_SWITCH; 26728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else 26738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->tdls &= ~TDLS_PROHIBIT_CHAN_SWITCH; 26748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_RSN_TESTING 26758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "rsn_testing") == 0) { 26768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt extern int rsn_testing; 26778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt rsn_testing = atoi(pos); 26788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_RSN_TESTING */ 26791f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } else if (os_strcmp(buf, "time_advertisement") == 0) { 26801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt bss->time_advertisement = atoi(pos); 26811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } else if (os_strcmp(buf, "time_zone") == 0) { 26821f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt size_t tz_len = os_strlen(pos); 26831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (tz_len < 4 || tz_len > 255) { 26841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt wpa_printf(MSG_DEBUG, "Line %d: invalid " 26851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "time_zone", line); 26861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt errors++; 268704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return errors; 26881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 26891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt os_free(bss->time_zone); 26901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt bss->time_zone = os_strdup(pos); 26911f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (bss->time_zone == NULL) 26921f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt errors++; 2693a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt#ifdef CONFIG_WNM 2694a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt } else if (os_strcmp(buf, "wnm_sleep_mode") == 0) { 2695a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt bss->wnm_sleep_mode = atoi(pos); 2696a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt } else if (os_strcmp(buf, "bss_transition") == 0) { 2697a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt bss->bss_transition = atoi(pos); 2698a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt#endif /* CONFIG_WNM */ 26991f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#ifdef CONFIG_INTERWORKING 27001f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } else if (os_strcmp(buf, "interworking") == 0) { 27011f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt bss->interworking = atoi(pos); 27021f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } else if (os_strcmp(buf, "access_network_type") == 0) { 27031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt bss->access_network_type = atoi(pos); 27041f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (bss->access_network_type < 0 || 27051f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt bss->access_network_type > 15) { 27061f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: invalid " 27071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "access_network_type", line); 27081f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt errors++; 27091f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 27101f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } else if (os_strcmp(buf, "internet") == 0) { 27111f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt bss->internet = atoi(pos); 27121f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } else if (os_strcmp(buf, "asra") == 0) { 27131f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt bss->asra = atoi(pos); 27141f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } else if (os_strcmp(buf, "esr") == 0) { 27151f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt bss->esr = atoi(pos); 27161f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } else if (os_strcmp(buf, "uesa") == 0) { 27171f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt bss->uesa = atoi(pos); 27181f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } else if (os_strcmp(buf, "venue_group") == 0) { 27191f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt bss->venue_group = atoi(pos); 27201f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt bss->venue_info_set = 1; 27211f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } else if (os_strcmp(buf, "venue_type") == 0) { 27221f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt bss->venue_type = atoi(pos); 27231f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt bss->venue_info_set = 1; 27241f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } else if (os_strcmp(buf, "hessid") == 0) { 27251f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (hwaddr_aton(pos, bss->hessid)) { 27261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: invalid " 27271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "hessid", line); 27281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt errors++; 27291f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 27301f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } else if (os_strcmp(buf, "roaming_consortium") == 0) { 27311f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (parse_roaming_consortium(bss, pos, line) < 0) 27321f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt errors++; 273304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } else if (os_strcmp(buf, "venue_name") == 0) { 273404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (parse_venue_name(bss, pos, line) < 0) 273504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt errors++; 273661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt } else if (os_strcmp(buf, "network_auth_type") == 0) { 273761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt u8 auth_type; 273861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt u16 redirect_url_len; 273961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (hexstr2bin(pos, &auth_type, 1)) { 274061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: Invalid " 274161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt "network_auth_type '%s'", 274261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt line, pos); 274361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt errors++; 274461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return errors; 274561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt } 274661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (auth_type == 0 || auth_type == 2) 274761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt redirect_url_len = os_strlen(pos + 2); 274861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt else 274961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt redirect_url_len = 0; 275061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt os_free(bss->network_auth_type); 275161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt bss->network_auth_type = 275261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt os_malloc(redirect_url_len + 3 + 1); 275361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (bss->network_auth_type == NULL) { 275461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt errors++; 275561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return errors; 275661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt } 275761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt *bss->network_auth_type = auth_type; 275861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt WPA_PUT_LE16(bss->network_auth_type + 1, 275961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt redirect_url_len); 276061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (redirect_url_len) 276161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt os_memcpy(bss->network_auth_type + 3, 276261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt pos + 2, redirect_url_len); 276361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt bss->network_auth_type_len = 3 + redirect_url_len; 276461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt } else if (os_strcmp(buf, "ipaddr_type_availability") == 0) { 276561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (hexstr2bin(pos, &bss->ipaddr_type_availability, 1)) 276661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt { 276761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: Invalid " 276861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt "ipaddr_type_availability '%s'", 276961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt line, pos); 277061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt bss->ipaddr_type_configured = 0; 277161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt errors++; 277261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return errors; 277361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt } 277461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt bss->ipaddr_type_configured = 1; 277561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt } else if (os_strcmp(buf, "domain_name") == 0) { 277661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt int j, num_domains, domain_len, domain_list_len = 0; 277761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt char *tok_start, *tok_prev; 277861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt u8 *domain_list, *domain_ptr; 277961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 278061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt domain_list_len = os_strlen(pos) + 1; 278161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt domain_list = os_malloc(domain_list_len); 278261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (domain_list == NULL) { 278361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt errors++; 278461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return errors; 278561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt } 278661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 278761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt domain_ptr = domain_list; 278861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt tok_prev = pos; 278961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt num_domains = 1; 279061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt while ((tok_prev = os_strchr(tok_prev, ','))) { 279161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt num_domains++; 279261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt tok_prev++; 279361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt } 279461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt tok_prev = pos; 279561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt for (j = 0; j < num_domains; j++) { 279661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt tok_start = os_strchr(tok_prev, ','); 279761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (tok_start) { 279861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt domain_len = tok_start - tok_prev; 279961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt *domain_ptr = domain_len; 280061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt os_memcpy(domain_ptr + 1, tok_prev, 280161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt domain_len); 280261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt domain_ptr += domain_len + 1; 280361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt tok_prev = ++tok_start; 280461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt } else { 280561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt domain_len = os_strlen(tok_prev); 280661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt *domain_ptr = domain_len; 280761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt os_memcpy(domain_ptr + 1, tok_prev, 280861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt domain_len); 280961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt domain_ptr += domain_len + 1; 281061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt } 281161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt } 281261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 281361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt os_free(bss->domain_name); 281461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt bss->domain_name = domain_list; 281561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt bss->domain_name_len = domain_list_len; 281661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt } else if (os_strcmp(buf, "anqp_3gpp_cell_net") == 0) { 281761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (parse_3gpp_cell_net(bss, pos, line) < 0) 281861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt errors++; 281961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt } else if (os_strcmp(buf, "nai_realm") == 0) { 282061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (parse_nai_realm(bss, pos, line) < 0) 282161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt errors++; 282204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } else if (os_strcmp(buf, "gas_frag_limit") == 0) { 282304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt bss->gas_frag_limit = atoi(pos); 282404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } else if (os_strcmp(buf, "gas_comeback_delay") == 0) { 282504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt bss->gas_comeback_delay = atoi(pos); 28261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#endif /* CONFIG_INTERWORKING */ 28271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#ifdef CONFIG_RADIUS_TEST 28281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } else if (os_strcmp(buf, "dump_msk_file") == 0) { 28291f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt os_free(bss->dump_msk_file); 28301f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt bss->dump_msk_file = os_strdup(pos); 28311f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#endif /* CONFIG_RADIUS_TEST */ 283261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt#ifdef CONFIG_HS20 283361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt } else if (os_strcmp(buf, "hs20") == 0) { 283461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt bss->hs20 = atoi(pos); 283561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt } else if (os_strcmp(buf, "disable_dgaf") == 0) { 283661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt bss->disable_dgaf = atoi(pos); 283761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt } else if (os_strcmp(buf, "hs20_oper_friendly_name") == 0) { 283861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (hs20_parse_oper_friendly_name(bss, pos, line) < 0) 283961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt errors++; 284061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt } else if (os_strcmp(buf, "hs20_wan_metrics") == 0) { 284161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (hs20_parse_wan_metrics(bss, pos, line) < 0) { 284261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt errors++; 284361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return errors; 284461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt } 284561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt } else if (os_strcmp(buf, "hs20_conn_capab") == 0) { 284661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (hs20_parse_conn_capab(bss, pos, line) < 0) { 284761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt errors++; 284861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return errors; 284961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt } 285061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt } else if (os_strcmp(buf, "hs20_operating_class") == 0) { 285161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt u8 *oper_class; 285261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt size_t oper_class_len; 285361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt oper_class_len = os_strlen(pos); 285461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (oper_class_len < 2 || (oper_class_len & 0x01)) { 285561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: Invalid " 285661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt "hs20_operating_class '%s'", 285761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt line, pos); 285861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt errors++; 285961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return errors; 286061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt } 286161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt oper_class_len /= 2; 286261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt oper_class = os_malloc(oper_class_len); 286361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (oper_class == NULL) { 286461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt errors++; 286561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return errors; 286661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt } 286761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (hexstr2bin(pos, oper_class, oper_class_len)) { 286861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: Invalid " 286961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt "hs20_operating_class '%s'", 287061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt line, pos); 287161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt os_free(oper_class); 287261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt errors++; 287361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return errors; 287461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt } 287561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt os_free(bss->hs20_operating_class); 287661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt bss->hs20_operating_class = oper_class; 287761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt bss->hs20_operating_class_len = oper_class_len; 287861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt#endif /* CONFIG_HS20 */ 28798da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt#ifdef CONFIG_TESTING_OPTIONS 28808da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt#define PARSE_TEST_PROBABILITY(_val) \ 28818da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt } else if (os_strcmp(buf, #_val) == 0) { \ 28828da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt char *end; \ 28838da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt \ 28848da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt conf->_val = strtod(pos, &end); \ 28858da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt if (*end || conf->_val < 0.0d || \ 28868da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt conf->_val > 1.0d) { \ 28878da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt wpa_printf(MSG_ERROR, \ 28888da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt "Line %d: Invalid value '%s'", \ 28898da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt line, pos); \ 28908da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt errors++; \ 28918da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt return errors; \ 28928da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt } 28938da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt PARSE_TEST_PROBABILITY(ignore_probe_probability) 28948da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt PARSE_TEST_PROBABILITY(ignore_auth_probability) 28958da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt PARSE_TEST_PROBABILITY(ignore_assoc_probability) 28968da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt PARSE_TEST_PROBABILITY(ignore_reassoc_probability) 28978da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt#endif /* CONFIG_TESTING_OPTIONS */ 289861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt } else if (os_strcmp(buf, "vendor_elements") == 0) { 289961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt struct wpabuf *elems; 290061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt size_t len = os_strlen(pos); 290161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (len & 0x01) { 290261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: Invalid " 290361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt "vendor_elements '%s'", line, pos); 290461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return 1; 290561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt } 290661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt len /= 2; 290761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (len == 0) { 290861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt wpabuf_free(bss->vendor_elements); 290961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt bss->vendor_elements = NULL; 291061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return 0; 291161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt } 291261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 291361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt elems = wpabuf_alloc(len); 291461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (elems == NULL) 291561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return 1; 291661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 291761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (hexstr2bin(pos, wpabuf_put(elems, len), len)) { 291861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt wpabuf_free(elems); 291961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: Invalid " 292061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt "vendor_elements '%s'", line, pos); 292161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return 1; 292261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt } 292361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 292461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt wpabuf_free(bss->vendor_elements); 292561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt bss->vendor_elements = elems; 2926a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt } else if (os_strcmp(buf, "sae_anti_clogging_threshold") == 0) { 2927a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt bss->sae_anti_clogging_threshold = atoi(pos); 2928a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt } else if (os_strcmp(buf, "sae_groups") == 0) { 2929a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt if (hostapd_parse_rates(&bss->sae_groups, pos)) { 2930a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: Invalid " 2931a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt "sae_groups value '%s'", line, pos); 2932a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt return 1; 2933a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt } 29348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 29358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: unknown configuration " 29368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "item '%s'", line, buf); 29378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt errors++; 29388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 29398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 29408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 294104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return errors; 294204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt} 29438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 29448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 294504949598a23f501be6eec21697465fd46a28840aDmitry Shmidtstatic void hostapd_set_security_params(struct hostapd_bss_config *bss) 294604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{ 294704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (bss->individual_wep_key_len == 0) { 294804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt /* individual keys are not use; can use key idx0 for 294904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * broadcast keys */ 295004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt bss->broadcast_key_idx_min = 0; 295104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 295204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 2953a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt if ((bss->wpa & 2) && bss->rsn_pairwise == 0) 2954a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt bss->rsn_pairwise = bss->wpa_pairwise; 2955a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt bss->wpa_group = wpa_select_ap_group_cipher(bss->wpa, bss->wpa_pairwise, 2956a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt bss->rsn_pairwise); 295704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 295804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt bss->radius->auth_server = bss->radius->auth_servers; 295904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt bss->radius->acct_server = bss->radius->acct_servers; 296004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 296104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (bss->wpa && bss->ieee802_1x) { 296204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt bss->ssid.security_policy = SECURITY_WPA; 296304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } else if (bss->wpa) { 296404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt bss->ssid.security_policy = SECURITY_WPA_PSK; 296504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } else if (bss->ieee802_1x) { 296604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt int cipher = WPA_CIPHER_NONE; 296704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt bss->ssid.security_policy = SECURITY_IEEE_802_1X; 296804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt bss->ssid.wep.default_len = bss->default_wep_key_len; 296904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (bss->default_wep_key_len) 297004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt cipher = bss->default_wep_key_len >= 13 ? 297104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt WPA_CIPHER_WEP104 : WPA_CIPHER_WEP40; 297204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt bss->wpa_group = cipher; 297304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt bss->wpa_pairwise = cipher; 297404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt bss->rsn_pairwise = cipher; 297504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } else if (bss->ssid.wep.keys_set) { 297604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt int cipher = WPA_CIPHER_WEP40; 297704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (bss->ssid.wep.len[0] >= 13) 297804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt cipher = WPA_CIPHER_WEP104; 297904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt bss->ssid.security_policy = SECURITY_STATIC_WEP; 298004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt bss->wpa_group = cipher; 298104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt bss->wpa_pairwise = cipher; 298204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt bss->rsn_pairwise = cipher; 298304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } else { 298404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt bss->ssid.security_policy = SECURITY_PLAINTEXT; 298504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt bss->wpa_group = WPA_CIPHER_NONE; 298604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt bss->wpa_pairwise = WPA_CIPHER_NONE; 298704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt bss->rsn_pairwise = WPA_CIPHER_NONE; 298804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 298904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt} 299004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 29918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 299204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt/** 299304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * hostapd_config_read - Read and parse a configuration file 299404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @fname: Configuration file name (including path, if needed) 299504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Returns: Allocated configuration data structure 299604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt */ 299704949598a23f501be6eec21697465fd46a28840aDmitry Shmidtstruct hostapd_config * hostapd_config_read(const char *fname) 299804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{ 299904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt struct hostapd_config *conf; 300004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt struct hostapd_bss_config *bss; 300104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt FILE *f; 300204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt char buf[512], *pos; 300304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt int line = 0; 300404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt int errors = 0; 300504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt size_t i; 300604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 300704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt f = fopen(fname, "r"); 300804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (f == NULL) { 300904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpa_printf(MSG_ERROR, "Could not open configuration file '%s' " 301004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt "for reading.", fname); 301104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return NULL; 301204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 301304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 301404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt conf = hostapd_config_defaults(); 301504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (conf == NULL) { 301604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt fclose(f); 301704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return NULL; 301804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 301904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 302004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt /* set default driver based on configuration */ 302104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt conf->driver = wpa_drivers[0]; 302204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (conf->driver == NULL) { 302304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpa_printf(MSG_ERROR, "No driver wrappers registered!"); 302404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt hostapd_config_free(conf); 302504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt fclose(f); 302604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return NULL; 302704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 302804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 302904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt bss = conf->last_bss = conf->bss; 303004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 303104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt while (fgets(buf, sizeof(buf), f)) { 303204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt bss = conf->last_bss; 303304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt line++; 303404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 303504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (buf[0] == '#') 303604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt continue; 303704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt pos = buf; 303804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt while (*pos != '\0') { 303904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (*pos == '\n') { 304004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt *pos = '\0'; 304104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt break; 304204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 304304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt pos++; 30448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 304504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (buf[0] == '\0') 304604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt continue; 304704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 304804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt pos = os_strchr(buf, '='); 304904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (pos == NULL) { 305004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: invalid line '%s'", 305104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt line, buf); 305204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt errors++; 305304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt continue; 30541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 305504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt *pos = '\0'; 305604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt pos++; 305704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt errors += hostapd_config_fill(conf, bss, buf, pos, line); 30588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 30598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 306004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt fclose(f); 306104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 306204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt for (i = 0; i < conf->num_bss; i++) 306304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt hostapd_set_security_params(&conf->bss[i]); 306404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 30658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (hostapd_config_check(conf)) 30668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt errors++; 30678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 30688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifndef WPA_IGNORE_CONFIG_ERRORS 30698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (errors) { 30708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "%d errors found in configuration file " 30718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "'%s'", errors, fname); 30728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt hostapd_config_free(conf); 30738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt conf = NULL; 30748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 30758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* WPA_IGNORE_CONFIG_ERRORS */ 30768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 30778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return conf; 30788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 307904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 308004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 308104949598a23f501be6eec21697465fd46a28840aDmitry Shmidtint hostapd_set_iface(struct hostapd_config *conf, 308204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt struct hostapd_bss_config *bss, char *field, char *value) 308304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{ 308404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt int errors; 308504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt size_t i; 308604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 308704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt errors = hostapd_config_fill(conf, bss, field, value, 0); 308804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (errors) { 308904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpa_printf(MSG_INFO, "Failed to set configuration field '%s' " 309004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt "to value '%s'", field, value); 309104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return -1; 309204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 309304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 309404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt for (i = 0; i < conf->num_bss; i++) 309504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt hostapd_set_security_params(&conf->bss[i]); 309604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 309704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (hostapd_config_check(conf)) { 309804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpa_printf(MSG_ERROR, "Configuration check failed"); 309904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return -1; 310004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 310104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 310204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return 0; 310304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt} 3104