18d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/* 28d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * hostapd / Configuration file parser 3bd14a57187b024f49f5b9ace55ef457d8d04650aDmitry Shmidt * Copyright (c) 2003-2014, 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 25818ea489ef32dcdc7c098d8a336d6e1dd8996112Dmitry Shmidt#ifndef CONFIG_NO_RADIUS 26818ea489ef32dcdc7c098d8a336d6e1dd8996112Dmitry Shmidt#ifdef EAP_SERVER 27818ea489ef32dcdc7c098d8a336d6e1dd8996112Dmitry Shmidtstatic struct hostapd_radius_attr * 28818ea489ef32dcdc7c098d8a336d6e1dd8996112Dmitry Shmidthostapd_parse_radius_attr(const char *value); 29818ea489ef32dcdc7c098d8a336d6e1dd8996112Dmitry Shmidt#endif /* EAP_SERVER */ 30818ea489ef32dcdc7c098d8a336d6e1dd8996112Dmitry Shmidt#endif /* CONFIG_NO_RADIUS */ 31818ea489ef32dcdc7c098d8a336d6e1dd8996112Dmitry Shmidt 32818ea489ef32dcdc7c098d8a336d6e1dd8996112Dmitry Shmidt 338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifndef CONFIG_NO_VLAN 348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int hostapd_config_read_vlan_file(struct hostapd_bss_config *bss, 358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *fname) 368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt FILE *f; 388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char buf[128], *pos, *pos2; 398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int line = 0, vlan_id; 408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct hostapd_vlan *vlan; 418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt f = fopen(fname, "r"); 438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!f) { 448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "VLAN file '%s' not readable.", fname); 458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (fgets(buf, sizeof(buf), f)) { 498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt line++; 508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (buf[0] == '#') 528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt continue; 538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos = buf; 548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (*pos != '\0') { 558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (*pos == '\n') { 568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *pos = '\0'; 578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos++; 608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (buf[0] == '\0') 628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt continue; 638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (buf[0] == '*') { 658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt vlan_id = VLAN_ID_WILDCARD; 668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos = buf + 1; 678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt vlan_id = strtol(buf, &pos, 10); 698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (buf == pos || vlan_id < 1 || 708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt vlan_id > MAX_VLAN_ID) { 718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Invalid VLAN ID at " 728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "line %d in '%s'", line, fname); 738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fclose(f); 748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (*pos == ' ' || *pos == '\t') 798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos++; 808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos2 = pos; 818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (*pos2 != ' ' && *pos2 != '\t' && *pos2 != '\0') 828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos2++; 838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *pos2 = '\0'; 848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (*pos == '\0' || os_strlen(pos) > IFNAMSIZ) { 858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Invalid VLAN ifname at line %d " 868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "in '%s'", line, fname); 878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fclose(f); 888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 914b06059785b935dd1f4f09314e4e12c417d2c6a4Dmitry Shmidt vlan = os_zalloc(sizeof(*vlan)); 928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (vlan == NULL) { 938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Out of memory while reading " 948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "VLAN interfaces from '%s'", fname); 958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fclose(f); 968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt vlan->vlan_id = vlan_id; 1008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_strlcpy(vlan->ifname, pos, sizeof(vlan->ifname)); 101d5c075b0c218277d0f926daf1f9eff974b9656dcDmitry Shmidt vlan->next = bss->vlan; 102d5c075b0c218277d0f926daf1f9eff974b9656dcDmitry Shmidt bss->vlan = vlan; 1038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 1048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fclose(f); 1068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 1088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 1098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_NO_VLAN */ 1108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int hostapd_acl_comp(const void *a, const void *b) 1138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 1148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const struct mac_acl_entry *aa = a; 1158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const struct mac_acl_entry *bb = b; 1168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return os_memcmp(aa->addr, bb->addr, sizeof(macaddr)); 1178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 1188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int hostapd_config_read_maclist(const char *fname, 1218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct mac_acl_entry **acl, int *num) 1228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 1238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt FILE *f; 1248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char buf[128], *pos; 1258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int line = 0; 1268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt u8 addr[ETH_ALEN]; 1278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct mac_acl_entry *newacl; 1288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int vlan_id; 1298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!fname) 1318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 1328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt f = fopen(fname, "r"); 1348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!f) { 1358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "MAC list file '%s' not found.", fname); 1368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 1378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 1388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (fgets(buf, sizeof(buf), f)) { 140f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt int i, rem = 0; 141f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt 1428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt line++; 1438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (buf[0] == '#') 1458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt continue; 1468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos = buf; 1478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (*pos != '\0') { 1488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (*pos == '\n') { 1498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *pos = '\0'; 1508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 1518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 1528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos++; 1538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 1548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (buf[0] == '\0') 1558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt continue; 156f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt pos = buf; 157f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt if (buf[0] == '-') { 158f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt rem = 1; 159f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt pos++; 160f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt } 1618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 162f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt if (hwaddr_aton(pos, addr)) { 1638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Invalid MAC address '%s' at " 164f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt "line %d in '%s'", pos, line, fname); 1658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fclose(f); 1668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 1678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 1688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 169f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt if (rem) { 170f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt i = 0; 171f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt while (i < *num) { 172f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt if (os_memcmp((*acl)[i].addr, addr, ETH_ALEN) == 173f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt 0) { 174f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt os_remove_in_array(*acl, *num, 175f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt sizeof(**acl), i); 176f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt (*num)--; 177f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt } else 178f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt i++; 179f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt } 180f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt continue; 181f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt } 1828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt vlan_id = 0; 1838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos = buf; 1848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (*pos != '\0' && *pos != ' ' && *pos != '\t') 1858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos++; 1868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (*pos == ' ' || *pos == '\t') 1878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos++; 1888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (*pos != '\0') 1898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt vlan_id = atoi(pos); 1908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt newacl = os_realloc_array(*acl, *num + 1, sizeof(**acl)); 1928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (newacl == NULL) { 1938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "MAC list reallocation failed"); 1948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fclose(f); 1958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 1968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 1978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *acl = newacl; 1998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memcpy((*acl)[*num].addr, addr, ETH_ALEN); 2008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt (*acl)[*num].vlan_id = vlan_id; 2018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt (*num)++; 2028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 2038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fclose(f); 2058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt qsort(*acl, *num, sizeof(**acl), hostapd_acl_comp); 2078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 2098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 2108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef EAP_SERVER 2138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int hostapd_config_read_eap_user(const char *fname, 2148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct hostapd_bss_config *conf) 2158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 2168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt FILE *f; 2178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char buf[512], *pos, *start, *pos2; 2188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int line = 0, ret = 0, num_methods; 219818ea489ef32dcdc7c098d8a336d6e1dd8996112Dmitry Shmidt struct hostapd_eap_user *user = NULL, *tail = NULL; 2208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!fname) 2228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 2238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 224d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt if (os_strncmp(fname, "sqlite:", 7) == 0) { 225d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt os_free(conf->eap_user_sqlite); 226d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt conf->eap_user_sqlite = os_strdup(fname + 7); 227d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt return 0; 228d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt } 229d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt 2308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt f = fopen(fname, "r"); 2318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!f) { 2328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "EAP user file '%s' not found.", fname); 2338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 2348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 2358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Lines: "user" METHOD,METHOD2 "password" (password optional) */ 2378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (fgets(buf, sizeof(buf), f)) { 2388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt line++; 2398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (buf[0] == '#') 2418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt continue; 2428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos = buf; 2438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (*pos != '\0') { 2448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (*pos == '\n') { 2458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *pos = '\0'; 2468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 2478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 2488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos++; 2498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 2508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (buf[0] == '\0') 2518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt continue; 2528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 253818ea489ef32dcdc7c098d8a336d6e1dd8996112Dmitry Shmidt#ifndef CONFIG_NO_RADIUS 254818ea489ef32dcdc7c098d8a336d6e1dd8996112Dmitry Shmidt if (user && os_strncmp(buf, "radius_accept_attr=", 19) == 0) { 255818ea489ef32dcdc7c098d8a336d6e1dd8996112Dmitry Shmidt struct hostapd_radius_attr *attr, *a; 256818ea489ef32dcdc7c098d8a336d6e1dd8996112Dmitry Shmidt attr = hostapd_parse_radius_attr(buf + 19); 257818ea489ef32dcdc7c098d8a336d6e1dd8996112Dmitry Shmidt if (attr == NULL) { 258818ea489ef32dcdc7c098d8a336d6e1dd8996112Dmitry Shmidt wpa_printf(MSG_ERROR, "Invalid radius_auth_req_attr: %s", 259818ea489ef32dcdc7c098d8a336d6e1dd8996112Dmitry Shmidt buf + 19); 2609866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt user = NULL; /* already in the BSS list */ 261818ea489ef32dcdc7c098d8a336d6e1dd8996112Dmitry Shmidt goto failed; 262818ea489ef32dcdc7c098d8a336d6e1dd8996112Dmitry Shmidt } 263818ea489ef32dcdc7c098d8a336d6e1dd8996112Dmitry Shmidt if (user->accept_attr == NULL) { 264818ea489ef32dcdc7c098d8a336d6e1dd8996112Dmitry Shmidt user->accept_attr = attr; 265818ea489ef32dcdc7c098d8a336d6e1dd8996112Dmitry Shmidt } else { 266818ea489ef32dcdc7c098d8a336d6e1dd8996112Dmitry Shmidt a = user->accept_attr; 267818ea489ef32dcdc7c098d8a336d6e1dd8996112Dmitry Shmidt while (a->next) 268818ea489ef32dcdc7c098d8a336d6e1dd8996112Dmitry Shmidt a = a->next; 269818ea489ef32dcdc7c098d8a336d6e1dd8996112Dmitry Shmidt a->next = attr; 270818ea489ef32dcdc7c098d8a336d6e1dd8996112Dmitry Shmidt } 271818ea489ef32dcdc7c098d8a336d6e1dd8996112Dmitry Shmidt continue; 272818ea489ef32dcdc7c098d8a336d6e1dd8996112Dmitry Shmidt } 273818ea489ef32dcdc7c098d8a336d6e1dd8996112Dmitry Shmidt#endif /* CONFIG_NO_RADIUS */ 274818ea489ef32dcdc7c098d8a336d6e1dd8996112Dmitry Shmidt 2758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt user = NULL; 2768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (buf[0] != '"' && buf[0] != '*') { 2788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Invalid EAP identity (no \" in " 2798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "start) on line %d in '%s'", line, fname); 2808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto failed; 2818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 2828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt user = os_zalloc(sizeof(*user)); 2848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (user == NULL) { 2858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "EAP user allocation failed"); 2868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto failed; 2878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 2888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt user->force_version = -1; 2898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (buf[0] == '*') { 2918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos = buf; 2928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 2938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos = buf + 1; 2948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt start = pos; 2958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (*pos != '"' && *pos != '\0') 2968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos++; 2978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (*pos == '\0') { 2988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Invalid EAP identity " 2998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "(no \" in end) on line %d in '%s'", 3008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt line, fname); 3018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto failed; 3028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 3038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt user->identity = os_malloc(pos - start); 3058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (user->identity == NULL) { 3068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Failed to allocate " 3078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "memory for EAP identity"); 3088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto failed; 3098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 3108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memcpy(user->identity, start, pos - start); 3118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt user->identity_len = pos - start; 3128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (pos[0] == '"' && pos[1] == '*') { 3148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt user->wildcard_prefix = 1; 3158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos++; 3168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 3178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 3188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos++; 3198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (*pos == ' ' || *pos == '\t') 3208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos++; 3218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (*pos == '\0') { 3238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "No EAP method on line %d in " 3248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "'%s'", line, fname); 3258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto failed; 3268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 3278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt start = pos; 3298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (*pos != ' ' && *pos != '\t' && *pos != '\0') 3308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos++; 3318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (*pos == '\0') { 3328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos = NULL; 3338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 3348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *pos = '\0'; 3358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos++; 3368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 3378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt num_methods = 0; 3388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (*start) { 3398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *pos3 = os_strchr(start, ','); 3408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (pos3) { 3418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *pos3++ = '\0'; 3428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 3438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt user->methods[num_methods].method = 3448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt eap_server_get_type( 3458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt start, 3468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &user->methods[num_methods].vendor); 3478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (user->methods[num_methods].vendor == 3488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt EAP_VENDOR_IETF && 3498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt user->methods[num_methods].method == EAP_TYPE_NONE) 3508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { 3518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (os_strcmp(start, "TTLS-PAP") == 0) { 3528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt user->ttls_auth |= EAP_TTLS_AUTH_PAP; 3538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto skip_eap; 3548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 3558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (os_strcmp(start, "TTLS-CHAP") == 0) { 3568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt user->ttls_auth |= EAP_TTLS_AUTH_CHAP; 3578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto skip_eap; 3588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 3598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (os_strcmp(start, "TTLS-MSCHAP") == 0) { 3608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt user->ttls_auth |= 3618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt EAP_TTLS_AUTH_MSCHAP; 3628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto skip_eap; 3638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 3648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (os_strcmp(start, "TTLS-MSCHAPV2") == 0) { 3658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt user->ttls_auth |= 3668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt EAP_TTLS_AUTH_MSCHAPV2; 3678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto skip_eap; 3688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 369df5a7e4c5c64890c2425bb47d665bbce4992b676Dmitry Shmidt if (os_strcmp(start, "MACACL") == 0) { 370df5a7e4c5c64890c2425bb47d665bbce4992b676Dmitry Shmidt user->macacl = 1; 371df5a7e4c5c64890c2425bb47d665bbce4992b676Dmitry Shmidt goto skip_eap; 372df5a7e4c5c64890c2425bb47d665bbce4992b676Dmitry Shmidt } 3738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Unsupported EAP type " 3748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "'%s' on line %d in '%s'", 3758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt start, line, fname); 3768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto failed; 3778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 3788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt num_methods++; 3801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (num_methods >= EAP_MAX_METHODS) 3818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 3828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt skip_eap: 3838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (pos3 == NULL) 3848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 3858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt start = pos3; 3868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 387df5a7e4c5c64890c2425bb47d665bbce4992b676Dmitry Shmidt if (num_methods == 0 && user->ttls_auth == 0 && !user->macacl) { 3888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "No EAP types configured on " 3898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "line %d in '%s'", line, fname); 3908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto failed; 3918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 3928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (pos == NULL) 3948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto done; 3958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (*pos == ' ' || *pos == '\t') 3978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos++; 3988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (*pos == '\0') 3998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto done; 4008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (os_strncmp(pos, "[ver=0]", 7) == 0) { 4028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt user->force_version = 0; 4038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto done; 4048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 4058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (os_strncmp(pos, "[ver=1]", 7) == 0) { 4078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt user->force_version = 1; 4088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto done; 4098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 4108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (os_strncmp(pos, "[2]", 3) == 0) { 4128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt user->phase2 = 1; 4138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto done; 4148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 4158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (*pos == '"') { 4178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos++; 4188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt start = pos; 4198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (*pos != '"' && *pos != '\0') 4208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos++; 4218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (*pos == '\0') { 4228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Invalid EAP password " 4238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "(no \" in end) on line %d in '%s'", 4248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt line, fname); 4258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto failed; 4268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 4278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt user->password = os_malloc(pos - start); 4298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (user->password == NULL) { 4308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Failed to allocate " 4318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "memory for EAP password"); 4328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto failed; 4338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 4348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memcpy(user->password, start, pos - start); 4358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt user->password_len = pos - start; 4368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos++; 4388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strncmp(pos, "hash:", 5) == 0) { 4398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos += 5; 4408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos2 = pos; 4418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (*pos2 != '\0' && *pos2 != ' ' && 4428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *pos2 != '\t' && *pos2 != '#') 4438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos2++; 4448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (pos2 - pos != 32) { 4458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Invalid password hash " 4468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "on line %d in '%s'", line, fname); 4478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto failed; 4488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 4498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt user->password = os_malloc(16); 4508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (user->password == NULL) { 4518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Failed to allocate " 4528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "memory for EAP password hash"); 4538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto failed; 4548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 4558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (hexstr2bin(pos, user->password, 16) < 0) { 4568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Invalid hash password " 4578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "on line %d in '%s'", line, fname); 4588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto failed; 4598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 4608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt user->password_len = 16; 4618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt user->password_hash = 1; 4628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos = pos2; 4638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 4648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos2 = pos; 4658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (*pos2 != '\0' && *pos2 != ' ' && 4668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *pos2 != '\t' && *pos2 != '#') 4678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos2++; 4688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if ((pos2 - pos) & 1) { 4698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Invalid hex password " 4708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "on line %d in '%s'", line, fname); 4718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto failed; 4728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 4738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt user->password = os_malloc((pos2 - pos) / 2); 4748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (user->password == NULL) { 4758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Failed to allocate " 4768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "memory for EAP password"); 4778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto failed; 4788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 4798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (hexstr2bin(pos, user->password, 4808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt (pos2 - pos) / 2) < 0) { 4818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Invalid hex password " 4828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "on line %d in '%s'", line, fname); 4838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto failed; 4848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 4858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt user->password_len = (pos2 - pos) / 2; 4868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos = pos2; 4878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 4888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (*pos == ' ' || *pos == '\t') 4908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos++; 4918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (os_strncmp(pos, "[2]", 3) == 0) { 4928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt user->phase2 = 1; 4938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 4948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt done: 4968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (tail == NULL) { 4978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt tail = conf->eap_user = user; 4988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 4998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt tail->next = user; 5008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt tail = user; 5018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 5028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt continue; 5038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt failed: 505818ea489ef32dcdc7c098d8a336d6e1dd8996112Dmitry Shmidt if (user) 506818ea489ef32dcdc7c098d8a336d6e1dd8996112Dmitry Shmidt hostapd_config_free_eap_user(user); 5078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ret = -1; 5088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 5098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 5108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fclose(f); 5128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return ret; 5148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 5158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* EAP_SERVER */ 5168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifndef CONFIG_NO_RADIUS 5198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int 5208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidthostapd_config_read_radius_addr(struct hostapd_radius_server **server, 5218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int *num_server, const char *val, int def_port, 5228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct hostapd_radius_server **curr_serv) 5238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 5248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct hostapd_radius_server *nserv; 5258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int ret; 5268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt static int server_index = 1; 5278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 52861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt nserv = os_realloc_array(*server, *num_server + 1, sizeof(*nserv)); 5298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (nserv == NULL) 5308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 5318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *server = nserv; 5338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt nserv = &nserv[*num_server]; 5348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt (*num_server)++; 5358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt (*curr_serv) = nserv; 5368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memset(nserv, 0, sizeof(*nserv)); 5388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt nserv->port = def_port; 5398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ret = hostapd_parse_ip_addr(val, &nserv->addr); 5408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt nserv->index = server_index++; 5418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return ret; 5438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 54404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 54504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 54604949598a23f501be6eec21697465fd46a28840aDmitry Shmidtstatic struct hostapd_radius_attr * 54704949598a23f501be6eec21697465fd46a28840aDmitry Shmidthostapd_parse_radius_attr(const char *value) 54804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{ 54904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt const char *pos; 55004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt char syntax; 55104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt struct hostapd_radius_attr *attr; 55204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt size_t len; 55304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 55404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt attr = os_zalloc(sizeof(*attr)); 55504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (attr == NULL) 55604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return NULL; 55704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 55804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt attr->type = atoi(value); 55904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 56004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt pos = os_strchr(value, ':'); 56104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (pos == NULL) { 56204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt attr->val = wpabuf_alloc(1); 56304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (attr->val == NULL) { 56404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt os_free(attr); 56504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return NULL; 56604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 56704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpabuf_put_u8(attr->val, 0); 56804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return attr; 56904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 57004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 57104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt pos++; 57204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (pos[0] == '\0' || pos[1] != ':') { 57304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt os_free(attr); 57404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return NULL; 57504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 57604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt syntax = *pos++; 57704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt pos++; 57804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 57904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt switch (syntax) { 58004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt case 's': 58104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt attr->val = wpabuf_alloc_copy(pos, os_strlen(pos)); 58204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt break; 58304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt case 'x': 58404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt len = os_strlen(pos); 58504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (len & 1) 58604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt break; 58704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt len /= 2; 58804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt attr->val = wpabuf_alloc(len); 58904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (attr->val == NULL) 59004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt break; 59104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (hexstr2bin(pos, wpabuf_put(attr->val, len), len) < 0) { 59204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpabuf_free(attr->val); 59304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt os_free(attr); 59404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return NULL; 59504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 59604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt break; 59704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt case 'd': 59804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt attr->val = wpabuf_alloc(4); 59904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (attr->val) 60004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpabuf_put_be32(attr->val, atoi(pos)); 60104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt break; 60204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt default: 60304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt os_free(attr); 60404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return NULL; 60504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 60604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 60704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (attr->val == NULL) { 60804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt os_free(attr); 60904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return NULL; 61004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 61104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 61204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return attr; 61304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt} 61404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 61504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 61604949598a23f501be6eec21697465fd46a28840aDmitry Shmidtstatic int hostapd_parse_das_client(struct hostapd_bss_config *bss, 61704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt const char *val) 61804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{ 61904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt char *secret; 62004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 62104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt secret = os_strchr(val, ' '); 62204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (secret == NULL) 62304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return -1; 62404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 62504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt secret++; 62604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 62704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (hostapd_parse_ip_addr(val, &bss->radius_das_client_addr)) 62804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return -1; 62904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 63004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt os_free(bss->radius_das_shared_secret); 63161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt bss->radius_das_shared_secret = (u8 *) os_strdup(secret); 63204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (bss->radius_das_shared_secret == NULL) 63304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return -1; 63461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt bss->radius_das_shared_secret_len = os_strlen(secret); 63504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 63604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return 0; 63704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt} 6388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_NO_RADIUS */ 6398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int hostapd_config_parse_key_mgmt(int line, const char *value) 6428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 6438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int val = 0, last; 6448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *start, *end, *buf; 6458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt buf = os_strdup(value); 6478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (buf == NULL) 6488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 6498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt start = buf; 6508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (*start != '\0') { 6528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (*start == ' ' || *start == '\t') 6538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt start++; 6548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (*start == '\0') 6558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 6568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt end = start; 6578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (*end != ' ' && *end != '\t' && *end != '\0') 6588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt end++; 6598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt last = *end == '\0'; 6608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *end = '\0'; 6618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (os_strcmp(start, "WPA-PSK") == 0) 6628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt val |= WPA_KEY_MGMT_PSK; 6638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else if (os_strcmp(start, "WPA-EAP") == 0) 6648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt val |= WPA_KEY_MGMT_IEEE8021X; 6658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_IEEE80211R 6668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else if (os_strcmp(start, "FT-PSK") == 0) 6678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt val |= WPA_KEY_MGMT_FT_PSK; 6688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else if (os_strcmp(start, "FT-EAP") == 0) 6698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt val |= WPA_KEY_MGMT_FT_IEEE8021X; 6708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_IEEE80211R */ 6718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_IEEE80211W 6728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else if (os_strcmp(start, "WPA-PSK-SHA256") == 0) 6738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt val |= WPA_KEY_MGMT_PSK_SHA256; 6748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else if (os_strcmp(start, "WPA-EAP-SHA256") == 0) 6758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt val |= WPA_KEY_MGMT_IEEE8021X_SHA256; 6768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_IEEE80211W */ 677d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#ifdef CONFIG_SAE 678d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt else if (os_strcmp(start, "SAE") == 0) 679d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt val |= WPA_KEY_MGMT_SAE; 680d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt else if (os_strcmp(start, "FT-SAE") == 0) 681d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt val |= WPA_KEY_MGMT_FT_SAE; 682d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#endif /* CONFIG_SAE */ 6838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else { 6848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: invalid key_mgmt '%s'", 6858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt line, start); 6868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(buf); 6878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 6888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 6898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (last) 6918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 6928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt start = end + 1; 6938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 6948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(buf); 6968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (val == 0) { 6978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: no key_mgmt values " 6988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "configured.", line); 6998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 7008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 7018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return val; 7038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 7048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int hostapd_config_parse_cipher(int line, const char *value) 7078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 708a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt int val = wpa_parse_cipher(value); 709a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt if (val < 0) { 710a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: invalid cipher '%s'.", 711a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt line, value); 7128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 7138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 7148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (val == 0) { 7158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: no cipher values configured.", 7168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt line); 7178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 7188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 7198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return val; 7208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 7218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int hostapd_config_read_wep(struct hostapd_wep_keys *wep, int keyidx, 7248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *val) 7258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 7268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t len = os_strlen(val); 7278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (keyidx < 0 || keyidx > 3 || wep->key[keyidx] != NULL) 7298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 7308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (val[0] == '"') { 7328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (len < 2 || val[len - 1] != '"') 7338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 7348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt len -= 2; 7358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wep->key[keyidx] = os_malloc(len); 7368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wep->key[keyidx] == NULL) 7378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 7388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memcpy(wep->key[keyidx], val + 1, len); 7398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wep->len[keyidx] = len; 7408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 7418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (len & 1) 7428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 7438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt len /= 2; 7448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wep->key[keyidx] = os_malloc(len); 7458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wep->key[keyidx] == NULL) 7468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 7478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wep->len[keyidx] = len; 7488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (hexstr2bin(val, wep->key[keyidx], len) < 0) 7498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 7508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 7518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wep->keys_set++; 7538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 7558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 7568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 758ea69e84a6f4455c59348485895d3d5e3af77a65bDmitry Shmidtstatic int hostapd_parse_intlist(int **int_list, char *val) 7598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 7608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int *list; 7618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int count; 7628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *pos, *end; 7638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 764ea69e84a6f4455c59348485895d3d5e3af77a65bDmitry Shmidt os_free(*int_list); 765ea69e84a6f4455c59348485895d3d5e3af77a65bDmitry Shmidt *int_list = NULL; 7668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos = val; 7688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt count = 0; 7698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (*pos != '\0') { 7708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (*pos == ' ') 7718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt count++; 7728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos++; 7738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 7748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt list = os_malloc(sizeof(int) * (count + 2)); 7768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (list == NULL) 7778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 7788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos = val; 7798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt count = 0; 7808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (*pos != '\0') { 7818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt end = os_strchr(pos, ' '); 7828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (end) 7838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *end = '\0'; 7848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt list[count++] = atoi(pos); 7868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!end) 7878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 7888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos = end + 1; 7898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 7908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt list[count] = -1; 7918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 792ea69e84a6f4455c59348485895d3d5e3af77a65bDmitry Shmidt *int_list = list; 7938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 7948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 7958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int hostapd_config_bss(struct hostapd_config *conf, const char *ifname) 7988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 799cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt struct hostapd_bss_config **all, *bss; 8008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (*ifname == '\0') 8028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 8038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 804cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt all = os_realloc_array(conf->bss, conf->num_bss + 1, 805cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt sizeof(struct hostapd_bss_config *)); 806cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt if (all == NULL) { 8078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Failed to allocate memory for " 8088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "multi-BSS entry"); 8098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 8108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 811cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt conf->bss = all; 8128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 813cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt bss = os_zalloc(sizeof(*bss)); 814cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt if (bss == NULL) 815cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt return -1; 8168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->radius = os_zalloc(sizeof(*bss->radius)); 8178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (bss->radius == NULL) { 8188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Failed to allocate memory for " 8198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "multi-BSS RADIUS data"); 820cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt os_free(bss); 8218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 8228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 8238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 824cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt conf->bss[conf->num_bss++] = bss; 8258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt conf->last_bss = bss; 8268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt hostapd_config_defaults_bss(bss); 8288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_strlcpy(bss->iface, ifname, sizeof(bss->iface)); 8298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memcpy(bss->ssid.vlan, bss->iface, IFNAMSIZ + 1); 8308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 8328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 8338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/* convert floats with one decimal place to value*10 int, i.e., 8368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * "1.5" will return 15 */ 8378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int hostapd_config_read_int10(const char *value) 8388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 8398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int i, d; 8408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *pos; 8418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt i = atoi(value); 8438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos = os_strchr(value, '.'); 8448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt d = 0; 8458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (pos) { 8468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos++; 8478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (*pos >= '0' && *pos <= '9') 8488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt d = *pos - '0'; 8498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 8508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return i * 10 + d; 8528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 8538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int valid_cw(int cw) 8568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 8578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return (cw == 1 || cw == 3 || cw == 7 || cw == 15 || cw == 31 || 8588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cw == 63 || cw == 127 || cw == 255 || cw == 511 || cw == 1023); 8598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 8608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtenum { 8638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt IEEE80211_TX_QUEUE_DATA0 = 0, /* used for EDCA AC_VO data */ 8648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt IEEE80211_TX_QUEUE_DATA1 = 1, /* used for EDCA AC_VI data */ 8658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt IEEE80211_TX_QUEUE_DATA2 = 2, /* used for EDCA AC_BE data */ 8668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt IEEE80211_TX_QUEUE_DATA3 = 3 /* used for EDCA AC_BK data */ 8678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}; 8688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int hostapd_config_tx_queue(struct hostapd_config *conf, char *name, 8708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *val) 8718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 8728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int num; 8738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *pos; 8748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct hostapd_tx_queue_params *queue; 8758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* skip 'tx_queue_' prefix */ 8778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos = name + 9; 8788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (os_strncmp(pos, "data", 4) == 0 && 8798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos[4] >= '0' && pos[4] <= '9' && pos[5] == '_') { 8808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt num = pos[4] - '0'; 8818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos += 6; 8828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strncmp(pos, "after_beacon_", 13) == 0 || 8838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_strncmp(pos, "beacon_", 7) == 0) { 8848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_INFO, "DEPRECATED: '%s' not used", name); 8858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 8868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 8878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Unknown tx_queue name '%s'", pos); 8888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 8898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 8908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (num >= NUM_TX_QUEUES) { 8928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* for backwards compatibility, do not trigger failure */ 8938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_INFO, "DEPRECATED: '%s' not used", name); 8948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 8958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 8968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt queue = &conf->tx_queue[num]; 8988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (os_strcmp(pos, "aifs") == 0) { 9008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt queue->aifs = atoi(val); 9018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (queue->aifs < 0 || queue->aifs > 255) { 9028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Invalid AIFS value %d", 9038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt queue->aifs); 9048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 9058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 9068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(pos, "cwmin") == 0) { 9078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt queue->cwmin = atoi(val); 9088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!valid_cw(queue->cwmin)) { 9098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Invalid cwMin value %d", 9108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt queue->cwmin); 9118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 9128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 9138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(pos, "cwmax") == 0) { 9148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt queue->cwmax = atoi(val); 9158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!valid_cw(queue->cwmax)) { 9168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Invalid cwMax value %d", 9178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt queue->cwmax); 9188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 9198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 9208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(pos, "burst") == 0) { 9218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt queue->burst = hostapd_config_read_int10(val); 9228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 9238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Unknown tx_queue field '%s'", pos); 9248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 9258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 9268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 9288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 9298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_IEEE80211R 9328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int add_r0kh(struct hostapd_bss_config *bss, char *value) 9338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 9348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct ft_remote_r0kh *r0kh; 9358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *pos, *next; 9368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt r0kh = os_zalloc(sizeof(*r0kh)); 9388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (r0kh == NULL) 9398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 9408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* 02:01:02:03:04:05 a.example.com 000102030405060708090a0b0c0d0e0f */ 9428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos = value; 9438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt next = os_strchr(pos, ' '); 9448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (next) 9458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *next++ = '\0'; 9468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (next == NULL || hwaddr_aton(pos, r0kh->addr)) { 9478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Invalid R0KH MAC address: '%s'", pos); 9488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(r0kh); 9498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 9508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 9518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos = next; 9538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt next = os_strchr(pos, ' '); 9548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (next) 9558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *next++ = '\0'; 9568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (next == NULL || next - pos > FT_R0KH_ID_MAX_LEN) { 9578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Invalid R0KH-ID: '%s'", pos); 9588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(r0kh); 9598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 9608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 9618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt r0kh->id_len = next - pos - 1; 9628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memcpy(r0kh->id, pos, r0kh->id_len); 9638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos = next; 9658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (hexstr2bin(pos, r0kh->key, sizeof(r0kh->key))) { 9668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Invalid R0KH key: '%s'", pos); 9678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(r0kh); 9688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 9698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 9708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt r0kh->next = bss->r0kh_list; 9728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->r0kh_list = r0kh; 9738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 9758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 9768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int add_r1kh(struct hostapd_bss_config *bss, char *value) 9798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 9808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct ft_remote_r1kh *r1kh; 9818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *pos, *next; 9828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt r1kh = os_zalloc(sizeof(*r1kh)); 9848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (r1kh == NULL) 9858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 9868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* 02:01:02:03:04:05 02:01:02:03:04:05 9888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 000102030405060708090a0b0c0d0e0f */ 9898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos = value; 9908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt next = os_strchr(pos, ' '); 9918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (next) 9928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *next++ = '\0'; 9938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (next == NULL || hwaddr_aton(pos, r1kh->addr)) { 9948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Invalid R1KH MAC address: '%s'", pos); 9958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(r1kh); 9968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 9978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 9988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos = next; 10008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt next = os_strchr(pos, ' '); 10018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (next) 10028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *next++ = '\0'; 10038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (next == NULL || hwaddr_aton(pos, r1kh->id)) { 10048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Invalid R1KH-ID: '%s'", pos); 10058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(r1kh); 10068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 10078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 10088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos = next; 10108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (hexstr2bin(pos, r1kh->key, sizeof(r1kh->key))) { 10118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Invalid R1KH key: '%s'", pos); 10128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(r1kh); 10138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 10148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 10158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt r1kh->next = bss->r1kh_list; 10178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->r1kh_list = r1kh; 10188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 10208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 10218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_IEEE80211R */ 10228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_IEEE80211N 10258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int hostapd_config_ht_capab(struct hostapd_config *conf, 10268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *capab) 10278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 10288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (os_strstr(capab, "[LDPC]")) 10298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt conf->ht_capab |= HT_CAP_INFO_LDPC_CODING_CAP; 10308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (os_strstr(capab, "[HT40-]")) { 10318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt conf->ht_capab |= HT_CAP_INFO_SUPP_CHANNEL_WIDTH_SET; 10328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt conf->secondary_channel = -1; 10338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 10348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (os_strstr(capab, "[HT40+]")) { 10358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt conf->ht_capab |= HT_CAP_INFO_SUPP_CHANNEL_WIDTH_SET; 10368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt conf->secondary_channel = 1; 10378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 10388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (os_strstr(capab, "[SMPS-STATIC]")) { 10398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt conf->ht_capab &= ~HT_CAP_INFO_SMPS_MASK; 10408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt conf->ht_capab |= HT_CAP_INFO_SMPS_STATIC; 10418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 10428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (os_strstr(capab, "[SMPS-DYNAMIC]")) { 10438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt conf->ht_capab &= ~HT_CAP_INFO_SMPS_MASK; 10448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt conf->ht_capab |= HT_CAP_INFO_SMPS_DYNAMIC; 10458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 10468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (os_strstr(capab, "[GF]")) 10478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt conf->ht_capab |= HT_CAP_INFO_GREEN_FIELD; 10488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (os_strstr(capab, "[SHORT-GI-20]")) 10498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt conf->ht_capab |= HT_CAP_INFO_SHORT_GI20MHZ; 10508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (os_strstr(capab, "[SHORT-GI-40]")) 10518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt conf->ht_capab |= HT_CAP_INFO_SHORT_GI40MHZ; 10528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (os_strstr(capab, "[TX-STBC]")) 10538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt conf->ht_capab |= HT_CAP_INFO_TX_STBC; 10548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (os_strstr(capab, "[RX-STBC1]")) { 10558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt conf->ht_capab &= ~HT_CAP_INFO_RX_STBC_MASK; 10568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt conf->ht_capab |= HT_CAP_INFO_RX_STBC_1; 10578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 10588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (os_strstr(capab, "[RX-STBC12]")) { 10598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt conf->ht_capab &= ~HT_CAP_INFO_RX_STBC_MASK; 10608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt conf->ht_capab |= HT_CAP_INFO_RX_STBC_12; 10618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 10628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (os_strstr(capab, "[RX-STBC123]")) { 10638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt conf->ht_capab &= ~HT_CAP_INFO_RX_STBC_MASK; 10648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt conf->ht_capab |= HT_CAP_INFO_RX_STBC_123; 10658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 10668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (os_strstr(capab, "[DELAYED-BA]")) 10678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt conf->ht_capab |= HT_CAP_INFO_DELAYED_BA; 10688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (os_strstr(capab, "[MAX-AMSDU-7935]")) 10698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt conf->ht_capab |= HT_CAP_INFO_MAX_AMSDU_SIZE; 10708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (os_strstr(capab, "[DSSS_CCK-40]")) 10718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt conf->ht_capab |= HT_CAP_INFO_DSSS_CCK40MHZ; 1072d11f019d62a42a8fc4c4d1f2ec17cf35b0763153Dmitry Shmidt if (os_strstr(capab, "[40-INTOLERANT]")) 1073d11f019d62a42a8fc4c4d1f2ec17cf35b0763153Dmitry Shmidt conf->ht_capab |= HT_CAP_INFO_40MHZ_INTOLERANT; 10748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (os_strstr(capab, "[LSIG-TXOP-PROT]")) 10758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt conf->ht_capab |= HT_CAP_INFO_LSIG_TXOP_PROTECT_SUPPORT; 10768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 10788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 10798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_IEEE80211N */ 10808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 108204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#ifdef CONFIG_IEEE80211AC 108304949598a23f501be6eec21697465fd46a28840aDmitry Shmidtstatic int hostapd_config_vht_capab(struct hostapd_config *conf, 108404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt const char *capab) 108504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{ 108604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (os_strstr(capab, "[MAX-MPDU-7991]")) 108704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt conf->vht_capab |= VHT_CAP_MAX_MPDU_LENGTH_7991; 108804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (os_strstr(capab, "[MAX-MPDU-11454]")) 108904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt conf->vht_capab |= VHT_CAP_MAX_MPDU_LENGTH_11454; 109004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (os_strstr(capab, "[VHT160]")) 109104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt conf->vht_capab |= VHT_CAP_SUPP_CHAN_WIDTH_160MHZ; 109204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (os_strstr(capab, "[VHT160-80PLUS80]")) 109304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt conf->vht_capab |= VHT_CAP_SUPP_CHAN_WIDTH_160_80PLUS80MHZ; 109404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (os_strstr(capab, "[RXLDPC]")) 109504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt conf->vht_capab |= VHT_CAP_RXLDPC; 109604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (os_strstr(capab, "[SHORT-GI-80]")) 109704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt conf->vht_capab |= VHT_CAP_SHORT_GI_80; 109804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (os_strstr(capab, "[SHORT-GI-160]")) 109904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt conf->vht_capab |= VHT_CAP_SHORT_GI_160; 110004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (os_strstr(capab, "[TX-STBC-2BY1]")) 110104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt conf->vht_capab |= VHT_CAP_TXSTBC; 110204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (os_strstr(capab, "[RX-STBC-1]")) 110304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt conf->vht_capab |= VHT_CAP_RXSTBC_1; 110404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (os_strstr(capab, "[RX-STBC-12]")) 110504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt conf->vht_capab |= VHT_CAP_RXSTBC_2; 110604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (os_strstr(capab, "[RX-STBC-123]")) 110704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt conf->vht_capab |= VHT_CAP_RXSTBC_3; 110804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (os_strstr(capab, "[RX-STBC-1234]")) 110904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt conf->vht_capab |= VHT_CAP_RXSTBC_4; 111004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (os_strstr(capab, "[SU-BEAMFORMER]")) 111168d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt conf->vht_capab |= VHT_CAP_SU_BEAMFORMER_CAPABLE; 111204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (os_strstr(capab, "[SU-BEAMFORMEE]")) 111368d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt conf->vht_capab |= VHT_CAP_SU_BEAMFORMEE_CAPABLE; 111404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (os_strstr(capab, "[BF-ANTENNA-2]") && 111568d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt (conf->vht_capab & VHT_CAP_SU_BEAMFORMEE_CAPABLE)) 111668d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt conf->vht_capab |= (1 << VHT_CAP_BEAMFORMEE_STS_OFFSET); 111704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (os_strstr(capab, "[SOUNDING-DIMENSION-2]") && 111868d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt (conf->vht_capab & VHT_CAP_SU_BEAMFORMER_CAPABLE)) 111968d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt conf->vht_capab |= (1 << VHT_CAP_SOUNDING_DIMENSION_OFFSET); 112004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (os_strstr(capab, "[MU-BEAMFORMER]")) 112104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt conf->vht_capab |= VHT_CAP_MU_BEAMFORMER_CAPABLE; 112204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (os_strstr(capab, "[MU-BEAMFORMEE]")) 112304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt conf->vht_capab |= VHT_CAP_MU_BEAMFORMEE_CAPABLE; 112404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (os_strstr(capab, "[VHT-TXOP-PS]")) 112504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt conf->vht_capab |= VHT_CAP_VHT_TXOP_PS; 112604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (os_strstr(capab, "[HTC-VHT]")) 112704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt conf->vht_capab |= VHT_CAP_HTC_VHT; 1128a38abf9af7bec7e89dbfb39ac7bb77223fe47c72Dmitry Shmidt if (os_strstr(capab, "[MAX-A-MPDU-LEN-EXP7]")) 1129a38abf9af7bec7e89dbfb39ac7bb77223fe47c72Dmitry Shmidt conf->vht_capab |= VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MAX; 1130a38abf9af7bec7e89dbfb39ac7bb77223fe47c72Dmitry Shmidt else if (os_strstr(capab, "[MAX-A-MPDU-LEN-EXP6]")) 1131a38abf9af7bec7e89dbfb39ac7bb77223fe47c72Dmitry Shmidt conf->vht_capab |= VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_6; 1132a38abf9af7bec7e89dbfb39ac7bb77223fe47c72Dmitry Shmidt else if (os_strstr(capab, "[MAX-A-MPDU-LEN-EXP5]")) 1133a38abf9af7bec7e89dbfb39ac7bb77223fe47c72Dmitry Shmidt conf->vht_capab |= VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_5; 1134a38abf9af7bec7e89dbfb39ac7bb77223fe47c72Dmitry Shmidt else if (os_strstr(capab, "[MAX-A-MPDU-LEN-EXP4]")) 1135a38abf9af7bec7e89dbfb39ac7bb77223fe47c72Dmitry Shmidt conf->vht_capab |= VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_4; 1136a38abf9af7bec7e89dbfb39ac7bb77223fe47c72Dmitry Shmidt else if (os_strstr(capab, "[MAX-A-MPDU-LEN-EXP3]")) 1137a38abf9af7bec7e89dbfb39ac7bb77223fe47c72Dmitry Shmidt conf->vht_capab |= VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_3; 1138a38abf9af7bec7e89dbfb39ac7bb77223fe47c72Dmitry Shmidt else if (os_strstr(capab, "[MAX-A-MPDU-LEN-EXP2]")) 1139a38abf9af7bec7e89dbfb39ac7bb77223fe47c72Dmitry Shmidt conf->vht_capab |= VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_2; 1140a38abf9af7bec7e89dbfb39ac7bb77223fe47c72Dmitry Shmidt else if (os_strstr(capab, "[MAX-A-MPDU-LEN-EXP1]")) 1141a38abf9af7bec7e89dbfb39ac7bb77223fe47c72Dmitry Shmidt conf->vht_capab |= VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_1; 114204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (os_strstr(capab, "[VHT-LINK-ADAPT2]") && 114304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt (conf->vht_capab & VHT_CAP_HTC_VHT)) 114404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt conf->vht_capab |= VHT_CAP_VHT_LINK_ADAPTATION_VHT_UNSOL_MFB; 114504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (os_strstr(capab, "[VHT-LINK-ADAPT3]") && 114604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt (conf->vht_capab & VHT_CAP_HTC_VHT)) 114704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt conf->vht_capab |= VHT_CAP_VHT_LINK_ADAPTATION_VHT_MRQ_MFB; 114804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (os_strstr(capab, "[RX-ANTENNA-PATTERN]")) 114904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt conf->vht_capab |= VHT_CAP_RX_ANTENNA_PATTERN; 115004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (os_strstr(capab, "[TX-ANTENNA-PATTERN]")) 115104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt conf->vht_capab |= VHT_CAP_TX_ANTENNA_PATTERN; 115204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return 0; 115304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt} 115404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#endif /* CONFIG_IEEE80211AC */ 115504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 115604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 11571f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#ifdef CONFIG_INTERWORKING 11581f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic int parse_roaming_consortium(struct hostapd_bss_config *bss, char *pos, 11591f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt int line) 11601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{ 11611f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt size_t len = os_strlen(pos); 11621f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt u8 oi[MAX_ROAMING_CONSORTIUM_LEN]; 11631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 11641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct hostapd_roaming_consortium *rc; 11651f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 11661f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if ((len & 1) || len < 2 * 3 || len / 2 > MAX_ROAMING_CONSORTIUM_LEN || 11671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt hexstr2bin(pos, oi, len / 2)) { 11681f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: invalid roaming_consortium " 11691f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "'%s'", line, pos); 11701f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return -1; 11711f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 11721f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt len /= 2; 11731f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 117461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt rc = os_realloc_array(bss->roaming_consortium, 117561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt bss->roaming_consortium_count + 1, 117661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt sizeof(struct hostapd_roaming_consortium)); 11771f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (rc == NULL) 11781f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return -1; 11791f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 11801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt os_memcpy(rc[bss->roaming_consortium_count].oi, oi, len); 11811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt rc[bss->roaming_consortium_count].len = len; 11821f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 11831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt bss->roaming_consortium = rc; 11841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt bss->roaming_consortium_count++; 11851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 11861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return 0; 11871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt} 118804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 118904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 119061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtstatic int parse_lang_string(struct hostapd_lang_string **array, 119161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt unsigned int *count, char *pos) 119204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{ 11935605286c30e1701491bd3af974ae423727750eddDmitry Shmidt char *sep, *str = NULL; 11945605286c30e1701491bd3af974ae423727750eddDmitry Shmidt size_t clen, nlen, slen; 119561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt struct hostapd_lang_string *ls; 11965605286c30e1701491bd3af974ae423727750eddDmitry Shmidt int ret = -1; 11975605286c30e1701491bd3af974ae423727750eddDmitry Shmidt 11985605286c30e1701491bd3af974ae423727750eddDmitry Shmidt if (*pos == '"' || (*pos == 'P' && pos[1] == '"')) { 11995605286c30e1701491bd3af974ae423727750eddDmitry Shmidt str = wpa_config_parse_string(pos, &slen); 12005605286c30e1701491bd3af974ae423727750eddDmitry Shmidt if (!str) 12015605286c30e1701491bd3af974ae423727750eddDmitry Shmidt return -1; 12025605286c30e1701491bd3af974ae423727750eddDmitry Shmidt pos = str; 12035605286c30e1701491bd3af974ae423727750eddDmitry Shmidt } 120404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 120504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt sep = os_strchr(pos, ':'); 120604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (sep == NULL) 12075605286c30e1701491bd3af974ae423727750eddDmitry Shmidt goto fail; 120804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt *sep++ = '\0'; 120904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 121004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt clen = os_strlen(pos); 12115605286c30e1701491bd3af974ae423727750eddDmitry Shmidt if (clen < 2 || clen > sizeof(ls->lang)) 12125605286c30e1701491bd3af974ae423727750eddDmitry Shmidt goto fail; 121304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt nlen = os_strlen(sep); 121404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (nlen > 252) 12155605286c30e1701491bd3af974ae423727750eddDmitry Shmidt goto fail; 121661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 121761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt ls = os_realloc_array(*array, *count + 1, 121861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt sizeof(struct hostapd_lang_string)); 121961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (ls == NULL) 12205605286c30e1701491bd3af974ae423727750eddDmitry Shmidt goto fail; 122161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 122261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt *array = ls; 122361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt ls = &(*array)[*count]; 122461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt (*count)++; 122561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 122661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt os_memset(ls->lang, 0, sizeof(ls->lang)); 122761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt os_memcpy(ls->lang, pos, clen); 122861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt ls->name_len = nlen; 122961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt os_memcpy(ls->name, sep, nlen); 123061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 12315605286c30e1701491bd3af974ae423727750eddDmitry Shmidt ret = 0; 12325605286c30e1701491bd3af974ae423727750eddDmitry Shmidtfail: 12335605286c30e1701491bd3af974ae423727750eddDmitry Shmidt os_free(str); 12345605286c30e1701491bd3af974ae423727750eddDmitry Shmidt return ret; 123561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt} 123661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 123761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 123861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtstatic int parse_venue_name(struct hostapd_bss_config *bss, char *pos, 123961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt int line) 124061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt{ 124161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (parse_lang_string(&bss->venue_name, &bss->venue_name_count, pos)) { 124261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: Invalid venue_name '%s'", 124361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt line, pos); 124461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return -1; 124561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt } 124661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return 0; 124761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt} 124861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 124961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 125061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtstatic int parse_3gpp_cell_net(struct hostapd_bss_config *bss, char *buf, 125161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt int line) 125261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt{ 125361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt size_t count; 125461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt char *pos; 125561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt u8 *info = NULL, *ipos; 125661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 125761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt /* format: <MCC1,MNC1>[;<MCC2,MNC2>][;...] */ 125861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 125961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt count = 1; 126061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt for (pos = buf; *pos; pos++) { 1261df5a7e4c5c64890c2425bb47d665bbce4992b676Dmitry Shmidt if ((*pos < '0' || *pos > '9') && *pos != ';' && *pos != ',') 126261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt goto fail; 126361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (*pos == ';') 126461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt count++; 126561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt } 126661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (1 + count * 3 > 0x7f) 126704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt goto fail; 126804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 126961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt info = os_zalloc(2 + 3 + count * 3); 127061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (info == NULL) 127104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return -1; 127204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 127361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt ipos = info; 127461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt *ipos++ = 0; /* GUD - Version 1 */ 127561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt *ipos++ = 3 + count * 3; /* User Data Header Length (UDHL) */ 127661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt *ipos++ = 0; /* PLMN List IEI */ 127761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt /* ext(b8) | Length of PLMN List value contents(b7..1) */ 127861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt *ipos++ = 1 + count * 3; 127961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt *ipos++ = count; /* Number of PLMNs */ 128061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 128161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt pos = buf; 128261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt while (pos && *pos) { 128361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt char *mcc, *mnc; 128461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt size_t mnc_len; 128561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 128661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt mcc = pos; 128761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt mnc = os_strchr(pos, ','); 128861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (mnc == NULL) 128961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt goto fail; 129061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt *mnc++ = '\0'; 129161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt pos = os_strchr(mnc, ';'); 129261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (pos) 129361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt *pos++ = '\0'; 129461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 129561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt mnc_len = os_strlen(mnc); 129661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (os_strlen(mcc) != 3 || (mnc_len != 2 && mnc_len != 3)) 129761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt goto fail; 129861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 129961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt /* BC coded MCC,MNC */ 130061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt /* MCC digit 2 | MCC digit 1 */ 130161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt *ipos++ = ((mcc[1] - '0') << 4) | (mcc[0] - '0'); 130261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt /* MNC digit 3 | MCC digit 3 */ 130361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt *ipos++ = (((mnc_len == 2) ? 0xf0 : ((mnc[2] - '0') << 4))) | 130461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt (mcc[2] - '0'); 130561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt /* MNC digit 2 | MNC digit 1 */ 130661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt *ipos++ = ((mnc[1] - '0') << 4) | (mnc[0] - '0'); 130761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt } 130804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 130961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt os_free(bss->anqp_3gpp_cell_net); 131061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt bss->anqp_3gpp_cell_net = info; 131161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt bss->anqp_3gpp_cell_net_len = 2 + 3 + 3 * count; 131261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt wpa_hexdump(MSG_MSGDUMP, "3GPP Cellular Network information", 131361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt bss->anqp_3gpp_cell_net, bss->anqp_3gpp_cell_net_len); 131404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 131504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return 0; 131604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 131704949598a23f501be6eec21697465fd46a28840aDmitry Shmidtfail: 131861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: Invalid anqp_3gpp_cell_net: %s", 131961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt line, buf); 132061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt os_free(info); 132104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return -1; 132204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt} 132361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 132461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 132561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtstatic int parse_nai_realm(struct hostapd_bss_config *bss, char *buf, int line) 132661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt{ 132761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt struct hostapd_nai_realm_data *realm; 132861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt size_t i, j, len; 132961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt int *offsets; 133061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt char *pos, *end, *rpos; 133161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 133261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt offsets = os_calloc(bss->nai_realm_count * MAX_NAI_REALMS, 133361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt sizeof(int)); 133461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (offsets == NULL) 133561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return -1; 133661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 133761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt for (i = 0; i < bss->nai_realm_count; i++) { 133861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt realm = &bss->nai_realm_data[i]; 133961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt for (j = 0; j < MAX_NAI_REALMS; j++) { 134061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt offsets[i * MAX_NAI_REALMS + j] = 134161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt realm->realm[j] ? 134261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt realm->realm[j] - realm->realm_buf : -1; 134361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt } 134461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt } 134561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 134661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt realm = os_realloc_array(bss->nai_realm_data, bss->nai_realm_count + 1, 134761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt sizeof(struct hostapd_nai_realm_data)); 134861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (realm == NULL) { 134961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt os_free(offsets); 135061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return -1; 135161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt } 135261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt bss->nai_realm_data = realm; 135361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 135461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt /* patch the pointers after realloc */ 135561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt for (i = 0; i < bss->nai_realm_count; i++) { 135661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt realm = &bss->nai_realm_data[i]; 135761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt for (j = 0; j < MAX_NAI_REALMS; j++) { 135861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt int offs = offsets[i * MAX_NAI_REALMS + j]; 135961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (offs >= 0) 136061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt realm->realm[j] = realm->realm_buf + offs; 136161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt else 136261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt realm->realm[j] = NULL; 136361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt } 136461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt } 136561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt os_free(offsets); 136661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 136761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt realm = &bss->nai_realm_data[bss->nai_realm_count]; 136861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt os_memset(realm, 0, sizeof(*realm)); 136961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 137061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt pos = buf; 137161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt realm->encoding = atoi(pos); 137261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt pos = os_strchr(pos, ','); 137361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (pos == NULL) 137461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt goto fail; 137561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt pos++; 137661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 137761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt end = os_strchr(pos, ','); 137861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (end) { 137961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt len = end - pos; 138061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt *end = '\0'; 138161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt } else { 138261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt len = os_strlen(pos); 138361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt } 138461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 138561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (len > MAX_NAI_REALMLEN) { 138661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt wpa_printf(MSG_ERROR, "Too long a realm string (%d > max %d " 138761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt "characters)", (int) len, MAX_NAI_REALMLEN); 138861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt goto fail; 138961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt } 139061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt os_memcpy(realm->realm_buf, pos, len); 139161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 139261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (end) 139361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt pos = end + 1; 139461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt else 139561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt pos = NULL; 139661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 139761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt while (pos && *pos) { 139861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt struct hostapd_nai_realm_eap *eap; 139961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 140061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (realm->eap_method_count >= MAX_NAI_EAP_METHODS) { 140161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt wpa_printf(MSG_ERROR, "Too many EAP methods"); 140261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt goto fail; 140361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt } 140461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 140561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt eap = &realm->eap_method[realm->eap_method_count]; 140661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt realm->eap_method_count++; 140761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 140861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt end = os_strchr(pos, ','); 140961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (end == NULL) 141061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt end = pos + os_strlen(pos); 141161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 141261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt eap->eap_method = atoi(pos); 141361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt for (;;) { 141461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt pos = os_strchr(pos, '['); 141561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (pos == NULL || pos > end) 141661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt break; 141761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt pos++; 141861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (eap->num_auths >= MAX_NAI_AUTH_TYPES) { 141961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt wpa_printf(MSG_ERROR, "Too many auth params"); 142061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt goto fail; 142161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt } 142261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt eap->auth_id[eap->num_auths] = atoi(pos); 142361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt pos = os_strchr(pos, ':'); 142461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (pos == NULL || pos > end) 142561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt goto fail; 142661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt pos++; 142761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt eap->auth_val[eap->num_auths] = atoi(pos); 142861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt pos = os_strchr(pos, ']'); 142961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (pos == NULL || pos > end) 143061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt goto fail; 143161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt pos++; 143261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt eap->num_auths++; 143361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt } 143461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 143561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (*end != ',') 143661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt break; 143761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 143861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt pos = end + 1; 143961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt } 144061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 144161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt /* Split realm list into null terminated realms */ 144261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt rpos = realm->realm_buf; 144361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt i = 0; 144461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt while (*rpos) { 144561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (i >= MAX_NAI_REALMS) { 144661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt wpa_printf(MSG_ERROR, "Too many realms"); 144761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt goto fail; 144861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt } 144961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt realm->realm[i++] = rpos; 145061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt rpos = os_strchr(rpos, ';'); 145161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (rpos == NULL) 145261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt break; 145361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt *rpos++ = '\0'; 145461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt } 145561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 145661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt bss->nai_realm_count++; 145761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 145861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return 0; 145961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 146061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtfail: 146161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: invalid nai_realm '%s'", line, buf); 146261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return -1; 146361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt} 146461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 1465051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt 1466051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidtstatic int parse_qos_map_set(struct hostapd_bss_config *bss, 1467051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt char *buf, int line) 1468051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt{ 1469051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt u8 qos_map_set[16 + 2 * 21], count = 0; 1470051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt char *pos = buf; 1471051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt int val; 1472051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt 1473051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt for (;;) { 1474051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt if (count == sizeof(qos_map_set)) { 1475051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: Too many qos_map_set " 1476051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt "parameters '%s'", line, buf); 1477051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt return -1; 1478051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt } 1479051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt 1480051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt val = atoi(pos); 1481051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt if (val > 255 || val < 0) { 1482051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: Invalid qos_map_set " 1483051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt "'%s'", line, buf); 1484051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt return -1; 1485051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt } 1486051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt 1487051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt qos_map_set[count++] = val; 1488051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt pos = os_strchr(pos, ','); 1489051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt if (!pos) 1490051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt break; 1491051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt pos++; 1492051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt } 1493051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt 1494051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt if (count < 16 || count & 1) { 1495051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: Invalid qos_map_set '%s'", 1496051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt line, buf); 1497051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt return -1; 1498051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt } 1499051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt 1500051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt os_memcpy(bss->qos_map_set, qos_map_set, count); 1501051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt bss->qos_map_set_len = count; 1502051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt 1503051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt return 0; 1504051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt} 1505051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt 15061f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#endif /* CONFIG_INTERWORKING */ 15071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 15081f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 150961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt#ifdef CONFIG_HS20 151061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtstatic int hs20_parse_conn_capab(struct hostapd_bss_config *bss, char *buf, 151161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt int line) 151261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt{ 151361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt u8 *conn_cap; 151461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt char *pos; 151561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 151661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (bss->hs20_connection_capability_len >= 0xfff0) 151761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return -1; 151861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 151961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt conn_cap = os_realloc(bss->hs20_connection_capability, 152061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt bss->hs20_connection_capability_len + 4); 152161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (conn_cap == NULL) 152261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return -1; 152361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 152461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt bss->hs20_connection_capability = conn_cap; 152561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt conn_cap += bss->hs20_connection_capability_len; 152661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt pos = buf; 152761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt conn_cap[0] = atoi(pos); 152861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt pos = os_strchr(pos, ':'); 152961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (pos == NULL) 153061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return -1; 153161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt pos++; 153261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt WPA_PUT_LE16(conn_cap + 1, atoi(pos)); 153361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt pos = os_strchr(pos, ':'); 153461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (pos == NULL) 153561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return -1; 153661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt pos++; 153761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt conn_cap[3] = atoi(pos); 153861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt bss->hs20_connection_capability_len += 4; 153961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 154061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return 0; 154161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt} 154261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 154361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 154461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtstatic int hs20_parse_wan_metrics(struct hostapd_bss_config *bss, char *buf, 154561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt int line) 154661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt{ 154761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt u8 *wan_metrics; 154861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt char *pos; 154961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 155061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt /* <WAN Info>:<DL Speed>:<UL Speed>:<DL Load>:<UL Load>:<LMD> */ 155161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 155261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt wan_metrics = os_zalloc(13); 155361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (wan_metrics == NULL) 155461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return -1; 155561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 155661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt pos = buf; 155761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt /* WAN Info */ 155861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (hexstr2bin(pos, wan_metrics, 1) < 0) 155961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt goto fail; 156061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt pos += 2; 156161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (*pos != ':') 156261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt goto fail; 156361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt pos++; 156461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 156561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt /* Downlink Speed */ 156661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt WPA_PUT_LE32(wan_metrics + 1, atoi(pos)); 156761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt pos = os_strchr(pos, ':'); 156861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (pos == NULL) 156961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt goto fail; 157061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt pos++; 157161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 157261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt /* Uplink Speed */ 157361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt WPA_PUT_LE32(wan_metrics + 5, atoi(pos)); 157461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt pos = os_strchr(pos, ':'); 157561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (pos == NULL) 157661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt goto fail; 157761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt pos++; 157861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 157961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt /* Downlink Load */ 158061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt wan_metrics[9] = atoi(pos); 158161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt pos = os_strchr(pos, ':'); 158261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (pos == NULL) 158361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt goto fail; 158461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt pos++; 158561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 158661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt /* Uplink Load */ 158761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt wan_metrics[10] = atoi(pos); 158861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt pos = os_strchr(pos, ':'); 158961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (pos == NULL) 159061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt goto fail; 159161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt pos++; 159261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 159361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt /* LMD */ 159461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt WPA_PUT_LE16(wan_metrics + 11, atoi(pos)); 159561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 159661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt os_free(bss->hs20_wan_metrics); 159761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt bss->hs20_wan_metrics = wan_metrics; 159861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 159961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return 0; 160061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 160161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtfail: 160261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: Invalid hs20_wan_metrics '%s'", 1603df5a7e4c5c64890c2425bb47d665bbce4992b676Dmitry Shmidt line, buf); 160461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt os_free(wan_metrics); 160561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return -1; 160661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt} 160761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 160861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 160961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtstatic int hs20_parse_oper_friendly_name(struct hostapd_bss_config *bss, 161061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt char *pos, int line) 161161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt{ 161261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (parse_lang_string(&bss->hs20_oper_friendly_name, 161361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt &bss->hs20_oper_friendly_name_count, pos)) { 161461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: Invalid " 161561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt "hs20_oper_friendly_name '%s'", line, pos); 161661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return -1; 161761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt } 161861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return 0; 161961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt} 1620f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt 1621f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt 1622f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidtstatic int hs20_parse_icon(struct hostapd_bss_config *bss, char *pos) 1623f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt{ 1624f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt struct hs20_icon *icon; 1625f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt char *end; 1626f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt 1627f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt icon = os_realloc_array(bss->hs20_icons, bss->hs20_icons_count + 1, 1628f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt sizeof(struct hs20_icon)); 1629f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt if (icon == NULL) 1630f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt return -1; 1631f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt bss->hs20_icons = icon; 1632f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt icon = &bss->hs20_icons[bss->hs20_icons_count]; 1633f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt os_memset(icon, 0, sizeof(*icon)); 1634f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt 1635f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt icon->width = atoi(pos); 1636f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt pos = os_strchr(pos, ':'); 1637f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt if (pos == NULL) 1638f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt return -1; 1639f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt pos++; 1640f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt 1641f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt icon->height = atoi(pos); 1642f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt pos = os_strchr(pos, ':'); 1643f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt if (pos == NULL) 1644f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt return -1; 1645f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt pos++; 1646f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt 1647f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt end = os_strchr(pos, ':'); 1648f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt if (end == NULL || end - pos > 3) 1649f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt return -1; 1650f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt os_memcpy(icon->language, pos, end - pos); 1651f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt pos = end + 1; 1652f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt 1653f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt end = os_strchr(pos, ':'); 1654f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt if (end == NULL || end - pos > 255) 1655f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt return -1; 1656f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt os_memcpy(icon->type, pos, end - pos); 1657f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt pos = end + 1; 1658f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt 1659f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt end = os_strchr(pos, ':'); 1660f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt if (end == NULL || end - pos > 255) 1661f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt return -1; 1662f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt os_memcpy(icon->name, pos, end - pos); 1663f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt pos = end + 1; 1664f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt 1665f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt if (os_strlen(pos) > 255) 1666f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt return -1; 1667f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt os_memcpy(icon->file, pos, os_strlen(pos)); 1668f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt 1669f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt bss->hs20_icons_count++; 1670f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt 1671f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt return 0; 1672f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt} 1673f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt 1674f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt 1675f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidtstatic int hs20_parse_osu_ssid(struct hostapd_bss_config *bss, 1676f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt char *pos, int line) 1677f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt{ 1678f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt size_t slen; 1679f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt char *str; 1680f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt 1681f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt str = wpa_config_parse_string(pos, &slen); 1682f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt if (str == NULL || slen < 1 || slen > HOSTAPD_MAX_SSID_LEN) { 1683f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: Invalid SSID '%s'", line, pos); 1684d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt os_free(str); 1685f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt return -1; 1686f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt } 1687f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt 1688f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt os_memcpy(bss->osu_ssid, str, slen); 1689f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt bss->osu_ssid_len = slen; 1690f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt os_free(str); 1691f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt 1692f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt return 0; 1693f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt} 1694f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt 1695f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt 1696f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidtstatic int hs20_parse_osu_server_uri(struct hostapd_bss_config *bss, 1697f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt char *pos, int line) 1698f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt{ 1699f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt struct hs20_osu_provider *p; 1700f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt 1701f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt p = os_realloc_array(bss->hs20_osu_providers, 1702f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt bss->hs20_osu_providers_count + 1, sizeof(*p)); 1703f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt if (p == NULL) 1704f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt return -1; 1705f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt 1706f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt bss->hs20_osu_providers = p; 1707f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt bss->last_osu = &bss->hs20_osu_providers[bss->hs20_osu_providers_count]; 1708f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt bss->hs20_osu_providers_count++; 1709f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt os_memset(bss->last_osu, 0, sizeof(*p)); 1710f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt bss->last_osu->server_uri = os_strdup(pos); 1711f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt 1712f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt return 0; 1713f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt} 1714f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt 1715f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt 1716f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidtstatic int hs20_parse_osu_friendly_name(struct hostapd_bss_config *bss, 1717f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt char *pos, int line) 1718f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt{ 1719f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt if (bss->last_osu == NULL) { 1720f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: Unexpected OSU field", line); 1721f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt return -1; 1722f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt } 1723f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt 1724f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt if (parse_lang_string(&bss->last_osu->friendly_name, 1725f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt &bss->last_osu->friendly_name_count, pos)) { 1726f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: Invalid osu_friendly_name '%s'", 1727f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt line, pos); 1728f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt return -1; 1729f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt } 1730f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt 1731f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt return 0; 1732f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt} 1733f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt 1734f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt 1735f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidtstatic int hs20_parse_osu_nai(struct hostapd_bss_config *bss, 1736f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt char *pos, int line) 1737f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt{ 1738f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt if (bss->last_osu == NULL) { 1739f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: Unexpected OSU field", line); 1740f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt return -1; 1741f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt } 1742f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt 1743f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt os_free(bss->last_osu->osu_nai); 1744f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt bss->last_osu->osu_nai = os_strdup(pos); 1745f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt if (bss->last_osu->osu_nai == NULL) 1746f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt return -1; 1747f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt 1748f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt return 0; 1749f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt} 1750f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt 1751f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt 1752f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidtstatic int hs20_parse_osu_method_list(struct hostapd_bss_config *bss, char *pos, 1753f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt int line) 1754f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt{ 1755f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt if (bss->last_osu == NULL) { 1756f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: Unexpected OSU field", line); 1757f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt return -1; 1758f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt } 1759f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt 1760f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt if (hostapd_parse_intlist(&bss->last_osu->method_list, pos)) { 1761f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: Invalid osu_method_list", line); 1762f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt return -1; 1763f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt } 1764f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt 1765f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt return 0; 1766f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt} 1767f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt 1768f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt 1769f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidtstatic int hs20_parse_osu_icon(struct hostapd_bss_config *bss, char *pos, 1770f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt int line) 1771f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt{ 1772f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt char **n; 1773f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt struct hs20_osu_provider *p = bss->last_osu; 1774f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt 1775f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt if (p == NULL) { 1776f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: Unexpected OSU field", line); 1777f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt return -1; 1778f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt } 1779f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt 1780f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt n = os_realloc_array(p->icons, p->icons_count + 1, sizeof(char *)); 1781f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt if (n == NULL) 1782f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt return -1; 1783f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt p->icons = n; 1784f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt p->icons[p->icons_count] = os_strdup(pos); 1785f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt if (p->icons[p->icons_count] == NULL) 1786f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt return -1; 1787f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt p->icons_count++; 1788f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt 1789f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt return 0; 1790f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt} 1791f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt 1792f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt 1793f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidtstatic int hs20_parse_osu_service_desc(struct hostapd_bss_config *bss, 1794f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt char *pos, int line) 1795f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt{ 1796f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt if (bss->last_osu == NULL) { 1797f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: Unexpected OSU field", line); 1798f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt return -1; 1799f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt } 1800f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt 1801f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt if (parse_lang_string(&bss->last_osu->service_desc, 1802f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt &bss->last_osu->service_desc_count, pos)) { 1803f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: Invalid osu_service_desc '%s'", 1804f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt line, pos); 1805f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt return -1; 1806f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt } 1807f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt 1808f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt return 0; 1809f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt} 1810f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt 181161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt#endif /* CONFIG_HS20 */ 181261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 181361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 181404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#ifdef CONFIG_WPS_NFC 181504949598a23f501be6eec21697465fd46a28840aDmitry Shmidtstatic struct wpabuf * hostapd_parse_bin(const char *buf) 18168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 181704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt size_t len; 181804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt struct wpabuf *ret; 18198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 182004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt len = os_strlen(buf); 182104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (len & 0x01) 18228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return NULL; 182304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt len /= 2; 18248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 182504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt ret = wpabuf_alloc(len); 182604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (ret == NULL) 18278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return NULL; 18288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 182904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (hexstr2bin(buf, wpabuf_put(ret, len), len)) { 183004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpabuf_free(ret); 18318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return NULL; 18328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 18338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 183404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return ret; 183504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt} 183604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#endif /* CONFIG_WPS_NFC */ 18378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 183904949598a23f501be6eec21697465fd46a28840aDmitry Shmidtstatic int hostapd_config_fill(struct hostapd_config *conf, 184004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt struct hostapd_bss_config *bss, 184104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt char *buf, char *pos, int line) 184204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{ 1843d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt if (os_strcmp(buf, "interface") == 0) { 1844d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt os_strlcpy(conf->bss[0]->iface, pos, 1845d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt sizeof(conf->bss[0]->iface)); 1846d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "bridge") == 0) { 1847d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt os_strlcpy(bss->bridge, pos, sizeof(bss->bridge)); 1848d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "vlan_bridge") == 0) { 1849d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt os_strlcpy(bss->vlan_bridge, pos, sizeof(bss->vlan_bridge)); 1850d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "wds_bridge") == 0) { 1851d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt os_strlcpy(bss->wds_bridge, pos, sizeof(bss->wds_bridge)); 1852d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "driver") == 0) { 1853d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt int j; 1854d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt /* clear to get error below if setting is invalid */ 1855d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt conf->driver = NULL; 1856d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt for (j = 0; wpa_drivers[j]; j++) { 1857d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt if (os_strcmp(pos, wpa_drivers[j]->name) == 0) { 1858d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt conf->driver = wpa_drivers[j]; 1859d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt break; 186061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt } 1861d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } 1862d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt if (conf->driver == NULL) { 1863d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt wpa_printf(MSG_ERROR, 1864d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt "Line %d: invalid/unknown driver '%s'", 1865d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt line, pos); 1866d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt return 1; 1867d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } 1868d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "debug") == 0) { 1869d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt wpa_printf(MSG_DEBUG, "Line %d: DEPRECATED: 'debug' configuration variable is not used anymore", 1870d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt line); 1871d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "logger_syslog_level") == 0) { 1872d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->logger_syslog_level = atoi(pos); 1873d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "logger_stdout_level") == 0) { 1874d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->logger_stdout_level = atoi(pos); 1875d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "logger_syslog") == 0) { 1876d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->logger_syslog = atoi(pos); 1877d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "logger_stdout") == 0) { 1878d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->logger_stdout = atoi(pos); 1879d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "dump_file") == 0) { 1880d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt wpa_printf(MSG_INFO, "Line %d: DEPRECATED: 'dump_file' configuration variable is not used anymore", 1881d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt line); 1882d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "ssid") == 0) { 1883d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->ssid.ssid_len = os_strlen(pos); 1884d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt if (bss->ssid.ssid_len > HOSTAPD_MAX_SSID_LEN || 1885d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->ssid.ssid_len < 1) { 1886d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: invalid SSID '%s'", 1887d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt line, pos); 1888d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt return 1; 1889d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } 1890d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt os_memcpy(bss->ssid.ssid, pos, bss->ssid.ssid_len); 1891d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->ssid.ssid_set = 1; 1892d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "ssid2") == 0) { 1893d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt size_t slen; 1894d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt char *str = wpa_config_parse_string(pos, &slen); 1895d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt if (str == NULL || slen < 1 || slen > HOSTAPD_MAX_SSID_LEN) { 1896d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: invalid SSID '%s'", 1897d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt line, pos); 189861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt os_free(str); 1899d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt return 1; 1900d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } 1901d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt os_memcpy(bss->ssid.ssid, str, slen); 1902d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->ssid.ssid_len = slen; 1903d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->ssid.ssid_set = 1; 1904d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt os_free(str); 1905d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "utf8_ssid") == 0) { 1906d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->ssid.utf8_ssid = atoi(pos) > 0; 1907d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "macaddr_acl") == 0) { 1908d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->macaddr_acl = atoi(pos); 1909d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt if (bss->macaddr_acl != ACCEPT_UNLESS_DENIED && 1910d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->macaddr_acl != DENY_UNLESS_ACCEPTED && 1911d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->macaddr_acl != USE_EXTERNAL_RADIUS_AUTH) { 1912d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: unknown macaddr_acl %d", 1913d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt line, bss->macaddr_acl); 1914d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } 1915d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "accept_mac_file") == 0) { 1916d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt if (hostapd_config_read_maclist(pos, &bss->accept_mac, 1917d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt &bss->num_accept_mac)) { 1918d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: Failed to read accept_mac_file '%s'", 1919d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt line, pos); 1920d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt return 1; 1921d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } 1922d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "deny_mac_file") == 0) { 1923d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt if (hostapd_config_read_maclist(pos, &bss->deny_mac, 1924d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt &bss->num_deny_mac)) { 1925d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: Failed to read deny_mac_file '%s'", 1926d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt line, pos); 1927d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt return 1; 1928d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } 1929d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "wds_sta") == 0) { 1930d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->wds_sta = atoi(pos); 1931d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "start_disabled") == 0) { 1932d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->start_disabled = atoi(pos); 1933d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "ap_isolate") == 0) { 1934d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->isolate = atoi(pos); 1935d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "ap_max_inactivity") == 0) { 1936d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->ap_max_inactivity = atoi(pos); 1937d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "skip_inactivity_poll") == 0) { 1938d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->skip_inactivity_poll = atoi(pos); 1939d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "country_code") == 0) { 1940d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt os_memcpy(conf->country, pos, 2); 1941d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt /* FIX: make this configurable */ 1942d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt conf->country[2] = ' '; 1943d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "ieee80211d") == 0) { 1944d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt conf->ieee80211d = atoi(pos); 1945d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "ieee80211h") == 0) { 1946d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt conf->ieee80211h = atoi(pos); 1947d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "ieee8021x") == 0) { 1948d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->ieee802_1x = atoi(pos); 1949d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "eapol_version") == 0) { 1950d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->eapol_version = atoi(pos); 1951d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt if (bss->eapol_version < 1 || bss->eapol_version > 2) { 1952d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt wpa_printf(MSG_ERROR, 1953d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt "Line %d: invalid EAPOL version (%d): '%s'.", 1954d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt line, bss->eapol_version, pos); 1955d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt return 1; 1956d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } 1957d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt wpa_printf(MSG_DEBUG, "eapol_version=%d", bss->eapol_version); 19588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef EAP_SERVER 1959d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "eap_authenticator") == 0) { 1960d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->eap_server = atoi(pos); 1961d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: obsolete eap_authenticator used; this has been renamed to eap_server", line); 1962d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "eap_server") == 0) { 1963d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->eap_server = atoi(pos); 1964d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "eap_user_file") == 0) { 1965d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt if (hostapd_config_read_eap_user(pos, bss)) 1966d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt return 1; 1967d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "ca_cert") == 0) { 1968d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt os_free(bss->ca_cert); 1969d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->ca_cert = os_strdup(pos); 1970d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "server_cert") == 0) { 1971d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt os_free(bss->server_cert); 1972d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->server_cert = os_strdup(pos); 1973d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "private_key") == 0) { 1974d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt os_free(bss->private_key); 1975d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->private_key = os_strdup(pos); 1976d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "private_key_passwd") == 0) { 1977d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt os_free(bss->private_key_passwd); 1978d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->private_key_passwd = os_strdup(pos); 1979d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "check_crl") == 0) { 1980d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->check_crl = atoi(pos); 1981d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "ocsp_stapling_response") == 0) { 1982d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt os_free(bss->ocsp_stapling_response); 1983d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->ocsp_stapling_response = os_strdup(pos); 1984d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "dh_file") == 0) { 1985d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt os_free(bss->dh_file); 1986d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->dh_file = os_strdup(pos); 1987d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "fragment_size") == 0) { 1988d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->fragment_size = atoi(pos); 19898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef EAP_SERVER_FAST 1990d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "pac_opaque_encr_key") == 0) { 1991d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt os_free(bss->pac_opaque_encr_key); 1992d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->pac_opaque_encr_key = os_malloc(16); 1993d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt if (bss->pac_opaque_encr_key == NULL) { 1994d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt wpa_printf(MSG_ERROR, 1995d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt "Line %d: No memory for pac_opaque_encr_key", 1996d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt line); 1997d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt return 1; 1998d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (hexstr2bin(pos, bss->pac_opaque_encr_key, 16)) { 1999d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: Invalid pac_opaque_encr_key", 2000d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt line); 2001d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt return 1; 2002d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } 2003d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "eap_fast_a_id") == 0) { 2004d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt size_t idlen = os_strlen(pos); 2005d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt if (idlen & 1) { 2006d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: Invalid eap_fast_a_id", 2007d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt line); 2008d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt return 1; 2009d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } 2010d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt os_free(bss->eap_fast_a_id); 2011d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->eap_fast_a_id = os_malloc(idlen / 2); 2012d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt if (bss->eap_fast_a_id == NULL || 2013d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt hexstr2bin(pos, bss->eap_fast_a_id, idlen / 2)) { 2014d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: Failed to parse eap_fast_a_id", 2015d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt line); 2016d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt os_free(bss->eap_fast_a_id); 2017d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->eap_fast_a_id = NULL; 2018d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt return 1; 2019d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else { 2020d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->eap_fast_a_id_len = idlen / 2; 2021d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } 2022d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "eap_fast_a_id_info") == 0) { 2023d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt os_free(bss->eap_fast_a_id_info); 2024d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->eap_fast_a_id_info = os_strdup(pos); 2025d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "eap_fast_prov") == 0) { 2026d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->eap_fast_prov = atoi(pos); 2027d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "pac_key_lifetime") == 0) { 2028d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->pac_key_lifetime = atoi(pos); 2029d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "pac_key_refresh_time") == 0) { 2030d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->pac_key_refresh_time = atoi(pos); 20318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* EAP_SERVER_FAST */ 20328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef EAP_SERVER_SIM 2033d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "eap_sim_db") == 0) { 2034d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt os_free(bss->eap_sim_db); 2035d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->eap_sim_db = os_strdup(pos); 2036d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "eap_sim_aka_result_ind") == 0) { 2037d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->eap_sim_aka_result_ind = atoi(pos); 20388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* EAP_SERVER_SIM */ 20398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef EAP_SERVER_TNC 2040d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "tnc") == 0) { 2041d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->tnc = atoi(pos); 20428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* EAP_SERVER_TNC */ 20438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef EAP_SERVER_PWD 2044d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "pwd_group") == 0) { 2045d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->pwd_group = atoi(pos); 20468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* EAP_SERVER_PWD */ 20478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* EAP_SERVER */ 2048d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "eap_message") == 0) { 2049d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt char *term; 205021de214b4ba4271ca20843f3b8fba9f1501b2a89Dmitry Shmidt os_free(bss->eap_req_id_text); 2051d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->eap_req_id_text = os_strdup(pos); 2052d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt if (bss->eap_req_id_text == NULL) { 2053d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: Failed to allocate memory for eap_req_id_text", 2054d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt line); 2055d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt return 1; 2056d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } 2057d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->eap_req_id_text_len = os_strlen(bss->eap_req_id_text); 2058d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt term = os_strstr(bss->eap_req_id_text, "\\0"); 2059d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt if (term) { 2060d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt *term++ = '\0'; 2061d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt os_memmove(term, term + 1, 2062d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->eap_req_id_text_len - 2063d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt (term - bss->eap_req_id_text) - 1); 2064d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->eap_req_id_text_len--; 2065d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } 2066d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "wep_key_len_broadcast") == 0) { 2067d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->default_wep_key_len = atoi(pos); 2068d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt if (bss->default_wep_key_len > 13) { 2069d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: invalid WEP key len %lu (= %lu bits)", 2070d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt line, 2071d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt (unsigned long) bss->default_wep_key_len, 2072d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt (unsigned long) 2073d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->default_wep_key_len * 8); 2074d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt return 1; 2075d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } 2076d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "wep_key_len_unicast") == 0) { 2077d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->individual_wep_key_len = atoi(pos); 2078d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt if (bss->individual_wep_key_len < 0 || 2079d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->individual_wep_key_len > 13) { 2080d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: invalid WEP key len %d (= %d bits)", 2081d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt line, bss->individual_wep_key_len, 2082d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->individual_wep_key_len * 8); 2083d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt return 1; 2084d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } 2085d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "wep_rekey_period") == 0) { 2086d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->wep_rekeying_period = atoi(pos); 2087d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt if (bss->wep_rekeying_period < 0) { 2088d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: invalid period %d", 2089d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt line, bss->wep_rekeying_period); 2090d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt return 1; 2091d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } 2092d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "eap_reauth_period") == 0) { 2093d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->eap_reauth_period = atoi(pos); 2094d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt if (bss->eap_reauth_period < 0) { 2095d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: invalid period %d", 2096d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt line, bss->eap_reauth_period); 2097d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt return 1; 2098d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } 2099d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "eapol_key_index_workaround") == 0) { 2100d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->eapol_key_index_workaround = atoi(pos); 21018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_IAPP 2102d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "iapp_interface") == 0) { 2103d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->ieee802_11f = 1; 2104d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt os_strlcpy(bss->iapp_iface, pos, sizeof(bss->iapp_iface)); 21058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_IAPP */ 2106d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "own_ip_addr") == 0) { 2107d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt if (hostapd_parse_ip_addr(pos, &bss->own_ip_addr)) { 2108d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt wpa_printf(MSG_ERROR, 2109d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt "Line %d: invalid IP address '%s'", 2110d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt line, pos); 2111d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt return 1; 2112d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } 2113d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "nas_identifier") == 0) { 211421de214b4ba4271ca20843f3b8fba9f1501b2a89Dmitry Shmidt os_free(bss->nas_identifier); 2115d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->nas_identifier = os_strdup(pos); 21168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifndef CONFIG_NO_RADIUS 2117d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "auth_server_addr") == 0) { 2118d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt if (hostapd_config_read_radius_addr( 2119d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt &bss->radius->auth_servers, 2120d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt &bss->radius->num_auth_servers, pos, 1812, 2121d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt &bss->radius->auth_server)) { 2122d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt wpa_printf(MSG_ERROR, 2123d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt "Line %d: invalid IP address '%s'", 2124d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt line, pos); 2125d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt return 1; 2126d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } 2127d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (bss->radius->auth_server && 2128d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt os_strcmp(buf, "auth_server_port") == 0) { 2129d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->radius->auth_server->port = atoi(pos); 2130d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (bss->radius->auth_server && 2131d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt os_strcmp(buf, "auth_server_shared_secret") == 0) { 2132d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt int len = os_strlen(pos); 2133d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt if (len == 0) { 2134d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt /* RFC 2865, Ch. 3 */ 2135d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: empty shared secret is not allowed", 2136d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt line); 2137d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt return 1; 2138d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } 213921de214b4ba4271ca20843f3b8fba9f1501b2a89Dmitry Shmidt os_free(bss->radius->auth_server->shared_secret); 2140d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->radius->auth_server->shared_secret = (u8 *) os_strdup(pos); 2141d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->radius->auth_server->shared_secret_len = len; 2142d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "acct_server_addr") == 0) { 2143d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt if (hostapd_config_read_radius_addr( 2144d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt &bss->radius->acct_servers, 2145d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt &bss->radius->num_acct_servers, pos, 1813, 2146d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt &bss->radius->acct_server)) { 2147d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt wpa_printf(MSG_ERROR, 2148d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt "Line %d: invalid IP address '%s'", 2149d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt line, pos); 2150d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt return 1; 2151d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } 2152d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (bss->radius->acct_server && 2153d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt os_strcmp(buf, "acct_server_port") == 0) { 2154d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->radius->acct_server->port = atoi(pos); 2155d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (bss->radius->acct_server && 2156d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt os_strcmp(buf, "acct_server_shared_secret") == 0) { 2157d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt int len = os_strlen(pos); 2158d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt if (len == 0) { 2159d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt /* RFC 2865, Ch. 3 */ 2160d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: empty shared secret is not allowed", 2161d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt line); 2162d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt return 1; 2163d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } 216421de214b4ba4271ca20843f3b8fba9f1501b2a89Dmitry Shmidt os_free(bss->radius->acct_server->shared_secret); 2165d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->radius->acct_server->shared_secret = (u8 *) os_strdup(pos); 2166d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->radius->acct_server->shared_secret_len = len; 2167d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "radius_retry_primary_interval") == 0) { 2168d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->radius->retry_primary_interval = atoi(pos); 2169d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "radius_acct_interim_interval") == 0) { 2170d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->acct_interim_interval = atoi(pos); 2171d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "radius_request_cui") == 0) { 2172d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->radius_request_cui = atoi(pos); 2173d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "radius_auth_req_attr") == 0) { 2174d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt struct hostapd_radius_attr *attr, *a; 2175d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt attr = hostapd_parse_radius_attr(pos); 2176d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt if (attr == NULL) { 2177d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt wpa_printf(MSG_ERROR, 2178d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt "Line %d: invalid radius_auth_req_attr", 2179d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt line); 2180d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt return 1; 2181d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (bss->radius_auth_req_attr == NULL) { 2182d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->radius_auth_req_attr = attr; 2183d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else { 2184d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt a = bss->radius_auth_req_attr; 2185d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt while (a->next) 2186d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt a = a->next; 2187d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt a->next = attr; 2188d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } 2189d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "radius_acct_req_attr") == 0) { 2190d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt struct hostapd_radius_attr *attr, *a; 2191d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt attr = hostapd_parse_radius_attr(pos); 2192d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt if (attr == NULL) { 2193d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt wpa_printf(MSG_ERROR, 2194d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt "Line %d: invalid radius_acct_req_attr", 2195d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt line); 2196d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt return 1; 2197d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (bss->radius_acct_req_attr == NULL) { 2198d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->radius_acct_req_attr = attr; 2199d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else { 2200d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt a = bss->radius_acct_req_attr; 2201d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt while (a->next) 2202d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt a = a->next; 2203d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt a->next = attr; 2204d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } 2205d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "radius_das_port") == 0) { 2206d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->radius_das_port = atoi(pos); 2207d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "radius_das_client") == 0) { 2208d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt if (hostapd_parse_das_client(bss, pos) < 0) { 2209d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: invalid DAS client", 2210d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt line); 2211d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt return 1; 2212d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } 2213d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "radius_das_time_window") == 0) { 2214d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->radius_das_time_window = atoi(pos); 2215d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "radius_das_require_event_timestamp") == 0) { 2216d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->radius_das_require_event_timestamp = atoi(pos); 22178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_NO_RADIUS */ 2218d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "auth_algs") == 0) { 2219d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->auth_algs = atoi(pos); 2220d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt if (bss->auth_algs == 0) { 2221d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: no authentication algorithms allowed", 2222d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt line); 2223d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt return 1; 2224d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } 2225d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "max_num_sta") == 0) { 2226d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->max_num_sta = atoi(pos); 2227d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt if (bss->max_num_sta < 0 || 2228d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->max_num_sta > MAX_STA_COUNT) { 2229d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: Invalid max_num_sta=%d; allowed range 0..%d", 2230d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt line, bss->max_num_sta, MAX_STA_COUNT); 2231d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt return 1; 2232d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } 2233d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "wpa") == 0) { 2234d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->wpa = atoi(pos); 2235d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "wpa_group_rekey") == 0) { 2236d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->wpa_group_rekey = atoi(pos); 2237d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "wpa_strict_rekey") == 0) { 2238d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->wpa_strict_rekey = atoi(pos); 2239d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "wpa_gmk_rekey") == 0) { 2240d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->wpa_gmk_rekey = atoi(pos); 2241d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "wpa_ptk_rekey") == 0) { 2242d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->wpa_ptk_rekey = atoi(pos); 2243d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "wpa_passphrase") == 0) { 2244d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt int len = os_strlen(pos); 2245d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt if (len < 8 || len > 63) { 2246d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: invalid WPA passphrase length %d (expected 8..63)", 2247d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt line, len); 2248d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt return 1; 2249d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } 2250d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt os_free(bss->ssid.wpa_passphrase); 2251d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->ssid.wpa_passphrase = os_strdup(pos); 2252d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt if (bss->ssid.wpa_passphrase) { 22538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(bss->ssid.wpa_psk); 2254d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->ssid.wpa_psk = NULL; 2255d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->ssid.wpa_passphrase_set = 1; 2256d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } 2257d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "wpa_psk") == 0) { 2258d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt os_free(bss->ssid.wpa_psk); 2259d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->ssid.wpa_psk = os_zalloc(sizeof(struct hostapd_wpa_psk)); 2260d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt if (bss->ssid.wpa_psk == NULL) 2261d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt return 1; 2262d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt if (hexstr2bin(pos, bss->ssid.wpa_psk->psk, PMK_LEN) || 2263d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt pos[PMK_LEN * 2] != '\0') { 2264d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: Invalid PSK '%s'.", 2265d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt line, pos); 2266d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt os_free(bss->ssid.wpa_psk); 2267d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->ssid.wpa_psk = NULL; 2268d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt return 1; 2269d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } 2270d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->ssid.wpa_psk->group = 1; 2271d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt os_free(bss->ssid.wpa_passphrase); 2272d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->ssid.wpa_passphrase = NULL; 2273d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->ssid.wpa_psk_set = 1; 2274d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "wpa_psk_file") == 0) { 2275d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt os_free(bss->ssid.wpa_psk_file); 2276d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->ssid.wpa_psk_file = os_strdup(pos); 2277d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt if (!bss->ssid.wpa_psk_file) { 2278d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: allocation failed", 2279d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt line); 2280d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt return 1; 2281d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } 2282d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "wpa_key_mgmt") == 0) { 2283d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->wpa_key_mgmt = hostapd_config_parse_key_mgmt(line, pos); 2284d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt if (bss->wpa_key_mgmt == -1) 2285d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt return 1; 2286d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "wpa_psk_radius") == 0) { 2287d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->wpa_psk_radius = atoi(pos); 2288d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt if (bss->wpa_psk_radius != PSK_RADIUS_IGNORED && 2289d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->wpa_psk_radius != PSK_RADIUS_ACCEPTED && 2290d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->wpa_psk_radius != PSK_RADIUS_REQUIRED) { 2291d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt wpa_printf(MSG_ERROR, 2292d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt "Line %d: unknown wpa_psk_radius %d", 2293d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt line, bss->wpa_psk_radius); 2294d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt return 1; 2295d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } 2296d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "wpa_pairwise") == 0) { 2297d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->wpa_pairwise = hostapd_config_parse_cipher(line, pos); 2298d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt if (bss->wpa_pairwise == -1 || bss->wpa_pairwise == 0) 2299d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt return 1; 2300d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt if (bss->wpa_pairwise & 2301d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt (WPA_CIPHER_NONE | WPA_CIPHER_WEP40 | WPA_CIPHER_WEP104)) { 2302d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: unsupported pairwise cipher suite '%s'", 2303d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->wpa_pairwise, pos); 2304d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt return 1; 2305d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } 2306d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "rsn_pairwise") == 0) { 2307d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->rsn_pairwise = hostapd_config_parse_cipher(line, pos); 2308d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt if (bss->rsn_pairwise == -1 || bss->rsn_pairwise == 0) 2309d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt return 1; 2310d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt if (bss->rsn_pairwise & 2311d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt (WPA_CIPHER_NONE | WPA_CIPHER_WEP40 | WPA_CIPHER_WEP104)) { 2312d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: unsupported pairwise cipher suite '%s'", 2313d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->rsn_pairwise, pos); 2314d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt return 1; 2315d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } 23168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_RSN_PREAUTH 2317d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "rsn_preauth") == 0) { 2318d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->rsn_preauth = atoi(pos); 2319d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "rsn_preauth_interfaces") == 0) { 232021de214b4ba4271ca20843f3b8fba9f1501b2a89Dmitry Shmidt os_free(bss->rsn_preauth_interfaces); 2321d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->rsn_preauth_interfaces = os_strdup(pos); 23228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_RSN_PREAUTH */ 23238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_PEERKEY 2324d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "peerkey") == 0) { 2325d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->peerkey = atoi(pos); 23268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_PEERKEY */ 23278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_IEEE80211R 2328d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "mobility_domain") == 0) { 2329d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt if (os_strlen(pos) != 2 * MOBILITY_DOMAIN_ID_LEN || 2330d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt hexstr2bin(pos, bss->mobility_domain, 2331d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt MOBILITY_DOMAIN_ID_LEN) != 0) { 2332d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt wpa_printf(MSG_ERROR, 2333d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt "Line %d: Invalid mobility_domain '%s'", 2334d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt line, pos); 2335d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt return 1; 2336d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } 2337d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "r1_key_holder") == 0) { 2338d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt if (os_strlen(pos) != 2 * FT_R1KH_ID_LEN || 2339d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt hexstr2bin(pos, bss->r1_key_holder, FT_R1KH_ID_LEN) != 0) { 2340d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt wpa_printf(MSG_ERROR, 2341d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt "Line %d: Invalid r1_key_holder '%s'", 2342d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt line, pos); 2343d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt return 1; 2344d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } 2345d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "r0_key_lifetime") == 0) { 2346d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->r0_key_lifetime = atoi(pos); 2347d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "reassociation_deadline") == 0) { 2348d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->reassociation_deadline = atoi(pos); 2349d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "r0kh") == 0) { 2350d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt if (add_r0kh(bss, pos) < 0) { 2351d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt wpa_printf(MSG_DEBUG, "Line %d: Invalid r0kh '%s'", 2352d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt line, pos); 2353d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt return 1; 2354d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } 2355d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "r1kh") == 0) { 2356d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt if (add_r1kh(bss, pos) < 0) { 2357d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt wpa_printf(MSG_DEBUG, "Line %d: Invalid r1kh '%s'", 2358d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt line, pos); 2359d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt return 1; 2360d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } 2361d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "pmk_r1_push") == 0) { 2362d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->pmk_r1_push = atoi(pos); 2363d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "ft_over_ds") == 0) { 2364d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->ft_over_ds = atoi(pos); 23658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_IEEE80211R */ 23668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifndef CONFIG_NO_CTRL_IFACE 2367d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "ctrl_interface") == 0) { 2368d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt os_free(bss->ctrl_interface); 2369d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->ctrl_interface = os_strdup(pos); 2370d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "ctrl_interface_group") == 0) { 23718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifndef CONFIG_NATIVE_WINDOWS 2372d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt struct group *grp; 2373d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt char *endp; 2374d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt const char *group = pos; 23758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2376d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt grp = getgrnam(group); 2377d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt if (grp) { 2378d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->ctrl_interface_gid = grp->gr_gid; 23798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->ctrl_interface_gid_set = 1; 2380d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt wpa_printf(MSG_DEBUG, "ctrl_interface_group=%d (from group name '%s')", 2381d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->ctrl_interface_gid, group); 2382d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt return 0; 2383d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } 2384d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt 2385d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt /* Group name not found - try to parse this as gid */ 2386d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->ctrl_interface_gid = strtol(group, &endp, 10); 2387d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt if (*group == '\0' || *endp != '\0') { 2388d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt wpa_printf(MSG_DEBUG, "Line %d: Invalid group '%s'", 2389d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt line, group); 2390d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt return 1; 2391d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } 2392d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->ctrl_interface_gid_set = 1; 2393d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt wpa_printf(MSG_DEBUG, "ctrl_interface_group=%d", 2394d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->ctrl_interface_gid); 23958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_NATIVE_WINDOWS */ 23968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_NO_CTRL_IFACE */ 23978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef RADIUS_SERVER 2398d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "radius_server_clients") == 0) { 2399d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt os_free(bss->radius_server_clients); 2400d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->radius_server_clients = os_strdup(pos); 2401d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "radius_server_auth_port") == 0) { 2402d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->radius_server_auth_port = atoi(pos); 2403d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "radius_server_acct_port") == 0) { 2404d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->radius_server_acct_port = atoi(pos); 2405d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "radius_server_ipv6") == 0) { 2406d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->radius_server_ipv6 = atoi(pos); 24078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* RADIUS_SERVER */ 2408d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "test_socket") == 0) { 2409d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt os_free(bss->test_socket); 2410d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->test_socket = os_strdup(pos); 2411d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "use_pae_group_addr") == 0) { 2412d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->use_pae_group_addr = atoi(pos); 2413d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "hw_mode") == 0) { 2414d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt if (os_strcmp(pos, "a") == 0) 2415d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt conf->hw_mode = HOSTAPD_MODE_IEEE80211A; 2416d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt else if (os_strcmp(pos, "b") == 0) 2417d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt conf->hw_mode = HOSTAPD_MODE_IEEE80211B; 2418d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt else if (os_strcmp(pos, "g") == 0) 2419d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt conf->hw_mode = HOSTAPD_MODE_IEEE80211G; 2420d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt else if (os_strcmp(pos, "ad") == 0) 2421d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt conf->hw_mode = HOSTAPD_MODE_IEEE80211AD; 2422d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt else { 2423d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: unknown hw_mode '%s'", 2424d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt line, pos); 2425d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt return 1; 2426d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } 2427d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "wps_rf_bands") == 0) { 2428d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt if (os_strcmp(pos, "a") == 0) 2429d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->wps_rf_bands = WPS_RF_50GHZ; 2430d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt else if (os_strcmp(pos, "g") == 0 || 2431d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt os_strcmp(pos, "b") == 0) 2432d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->wps_rf_bands = WPS_RF_24GHZ; 2433d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt else if (os_strcmp(pos, "ag") == 0 || 2434d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt os_strcmp(pos, "ga") == 0) 2435d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->wps_rf_bands = WPS_RF_24GHZ | WPS_RF_50GHZ; 2436d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt else { 2437d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt wpa_printf(MSG_ERROR, 2438d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt "Line %d: unknown wps_rf_band '%s'", 2439d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt line, pos); 2440d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt return 1; 2441d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } 2442d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "channel") == 0) { 2443d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt if (os_strcmp(pos, "acs_survey") == 0) { 2444391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt#ifndef CONFIG_ACS 2445d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: tries to enable ACS but CONFIG_ACS disabled", 2446d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt line); 2447d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt return 1; 24487832adbbd72a1b784b7fb74a71a5d4085b0cb0d3Dmitry Shmidt#else /* CONFIG_ACS */ 2449d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt conf->channel = 0; 24507832adbbd72a1b784b7fb74a71a5d4085b0cb0d3Dmitry Shmidt#endif /* CONFIG_ACS */ 2451d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else 2452d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt conf->channel = atoi(pos); 2453d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "chanlist") == 0) { 2454d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt if (hostapd_parse_intlist(&conf->chanlist, pos)) { 2455d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: invalid channel list", 2456d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt line); 2457d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt return 1; 2458d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } 2459d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "beacon_int") == 0) { 2460d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt int val = atoi(pos); 2461d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt /* MIB defines range as 1..65535, but very small values 2462d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt * cause problems with the current implementation. 2463d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt * Since it is unlikely that this small numbers are 2464d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt * useful in real life scenarios, do not allow beacon 2465d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt * period to be set below 15 TU. */ 2466d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt if (val < 15 || val > 65535) { 2467d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: invalid beacon_int %d (expected 15..65535)", 2468d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt line, val); 2469d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt return 1; 2470d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } 2471d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt conf->beacon_int = val; 2472391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt#ifdef CONFIG_ACS 2473d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "acs_num_scans") == 0) { 2474d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt int val = atoi(pos); 2475d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt if (val <= 0 || val > 100) { 2476d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: invalid acs_num_scans %d (expected 1..100)", 2477d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt line, val); 2478d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt return 1; 2479d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } 2480d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt conf->acs_num_scans = val; 2481391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt#endif /* CONFIG_ACS */ 2482d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "dtim_period") == 0) { 2483d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->dtim_period = atoi(pos); 2484d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt if (bss->dtim_period < 1 || bss->dtim_period > 255) { 2485d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: invalid dtim_period %d", 2486d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt line, bss->dtim_period); 2487d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt return 1; 2488d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } 2489d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "rts_threshold") == 0) { 2490d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt conf->rts_threshold = atoi(pos); 2491d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt if (conf->rts_threshold < 0 || conf->rts_threshold > 2347) { 2492d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt wpa_printf(MSG_ERROR, 2493d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt "Line %d: invalid rts_threshold %d", 2494d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt line, conf->rts_threshold); 2495d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt return 1; 2496d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } 2497d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "fragm_threshold") == 0) { 2498d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt conf->fragm_threshold = atoi(pos); 2499d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt if (conf->fragm_threshold < 256 || 2500d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt conf->fragm_threshold > 2346) { 2501d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt wpa_printf(MSG_ERROR, 2502d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt "Line %d: invalid fragm_threshold %d", 2503d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt line, conf->fragm_threshold); 2504d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt return 1; 2505d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } 2506d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "send_probe_response") == 0) { 2507d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt int val = atoi(pos); 2508d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt if (val != 0 && val != 1) { 2509d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: invalid send_probe_response %d (expected 0 or 1)", 2510d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt line, val); 2511d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt return 1; 2512d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } 2513d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt conf->send_probe_response = val; 2514d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "supported_rates") == 0) { 2515d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt if (hostapd_parse_intlist(&conf->supported_rates, pos)) { 2516d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: invalid rate list", 2517d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt line); 2518d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt return 1; 2519d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } 2520d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "basic_rates") == 0) { 2521d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt if (hostapd_parse_intlist(&conf->basic_rates, pos)) { 2522d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: invalid rate list", 2523d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt line); 2524d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt return 1; 2525d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } 2526d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "preamble") == 0) { 2527d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt if (atoi(pos)) 2528d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt conf->preamble = SHORT_PREAMBLE; 2529d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt else 2530d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt conf->preamble = LONG_PREAMBLE; 2531d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "ignore_broadcast_ssid") == 0) { 2532d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->ignore_broadcast_ssid = atoi(pos); 2533d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "wep_default_key") == 0) { 2534d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->ssid.wep.idx = atoi(pos); 2535d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt if (bss->ssid.wep.idx > 3) { 2536d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt wpa_printf(MSG_ERROR, 2537d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt "Invalid wep_default_key index %d", 2538d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->ssid.wep.idx); 2539d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt return 1; 2540d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } 2541d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "wep_key0") == 0 || 2542d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt os_strcmp(buf, "wep_key1") == 0 || 2543d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt os_strcmp(buf, "wep_key2") == 0 || 2544d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt os_strcmp(buf, "wep_key3") == 0) { 2545d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt if (hostapd_config_read_wep(&bss->ssid.wep, 2546d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt buf[7] - '0', pos)) { 2547d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: invalid WEP key '%s'", 2548d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt line, buf); 2549d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt return 1; 2550d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } 25518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifndef CONFIG_NO_VLAN 2552d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "dynamic_vlan") == 0) { 2553d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->ssid.dynamic_vlan = atoi(pos); 2554d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "vlan_file") == 0) { 2555d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt if (hostapd_config_read_vlan_file(bss, pos)) { 2556d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: failed to read VLAN file '%s'", 2557d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt line, pos); 2558d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt return 1; 2559d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } 2560d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "vlan_naming") == 0) { 2561d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->ssid.vlan_naming = atoi(pos); 2562d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt if (bss->ssid.vlan_naming >= DYNAMIC_VLAN_NAMING_END || 2563d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->ssid.vlan_naming < 0) { 2564d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt wpa_printf(MSG_ERROR, 2565d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt "Line %d: invalid naming scheme %d", 2566d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt line, bss->ssid.vlan_naming); 2567d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt return 1; 2568d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } 25698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_FULL_DYNAMIC_VLAN 2570d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "vlan_tagged_interface") == 0) { 257121de214b4ba4271ca20843f3b8fba9f1501b2a89Dmitry Shmidt os_free(bss->ssid.vlan_tagged_interface); 2572d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->ssid.vlan_tagged_interface = os_strdup(pos); 25738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_FULL_DYNAMIC_VLAN */ 25748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_NO_VLAN */ 2575d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "ap_table_max_size") == 0) { 2576d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt conf->ap_table_max_size = atoi(pos); 2577d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "ap_table_expiration_time") == 0) { 2578d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt conf->ap_table_expiration_time = atoi(pos); 2579d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strncmp(buf, "tx_queue_", 9) == 0) { 2580d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt if (hostapd_config_tx_queue(conf, buf, pos)) { 2581d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: invalid TX queue item", 2582d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt line); 2583d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt return 1; 2584d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } 2585d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "wme_enabled") == 0 || 2586d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt os_strcmp(buf, "wmm_enabled") == 0) { 2587d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->wmm_enabled = atoi(pos); 2588d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "uapsd_advertisement_enabled") == 0) { 2589d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->wmm_uapsd = atoi(pos); 2590d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strncmp(buf, "wme_ac_", 7) == 0 || 2591d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt os_strncmp(buf, "wmm_ac_", 7) == 0) { 2592d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt if (hostapd_config_wmm_ac(conf->wmm_ac_params, buf, pos)) { 2593d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: invalid WMM ac item", 2594d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt line); 2595d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt return 1; 2596d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } 2597d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "bss") == 0) { 2598d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt if (hostapd_config_bss(conf, pos)) { 2599d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: invalid bss item", 2600d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt line); 2601d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt return 1; 2602d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } 2603d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "bssid") == 0) { 2604d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt if (hwaddr_aton(pos, bss->bssid)) { 2605d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: invalid bssid item", 2606d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt line); 2607d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt return 1; 2608d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } 26098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_IEEE80211W 2610d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "ieee80211w") == 0) { 2611d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->ieee80211w = atoi(pos); 2612b36ed7cd946148d829f311de8fe53ea3ffaaffe3Dmitry Shmidt } else if (os_strcmp(buf, "group_mgmt_cipher") == 0) { 2613b36ed7cd946148d829f311de8fe53ea3ffaaffe3Dmitry Shmidt if (os_strcmp(pos, "AES-128-CMAC") == 0) { 2614b36ed7cd946148d829f311de8fe53ea3ffaaffe3Dmitry Shmidt bss->group_mgmt_cipher = WPA_CIPHER_AES_128_CMAC; 2615b36ed7cd946148d829f311de8fe53ea3ffaaffe3Dmitry Shmidt } else if (os_strcmp(pos, "BIP-GMAC-128") == 0) { 2616b36ed7cd946148d829f311de8fe53ea3ffaaffe3Dmitry Shmidt bss->group_mgmt_cipher = WPA_CIPHER_BIP_GMAC_128; 2617b36ed7cd946148d829f311de8fe53ea3ffaaffe3Dmitry Shmidt } else if (os_strcmp(pos, "BIP-GMAC-256") == 0) { 2618b36ed7cd946148d829f311de8fe53ea3ffaaffe3Dmitry Shmidt bss->group_mgmt_cipher = WPA_CIPHER_BIP_GMAC_256; 2619b36ed7cd946148d829f311de8fe53ea3ffaaffe3Dmitry Shmidt } else if (os_strcmp(pos, "BIP-CMAC-256") == 0) { 2620b36ed7cd946148d829f311de8fe53ea3ffaaffe3Dmitry Shmidt bss->group_mgmt_cipher = WPA_CIPHER_BIP_CMAC_256; 2621b36ed7cd946148d829f311de8fe53ea3ffaaffe3Dmitry Shmidt } else { 2622b36ed7cd946148d829f311de8fe53ea3ffaaffe3Dmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: invalid group_mgmt_cipher: %s", 2623b36ed7cd946148d829f311de8fe53ea3ffaaffe3Dmitry Shmidt line, pos); 2624b36ed7cd946148d829f311de8fe53ea3ffaaffe3Dmitry Shmidt return 1; 2625b36ed7cd946148d829f311de8fe53ea3ffaaffe3Dmitry Shmidt } 2626d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "assoc_sa_query_max_timeout") == 0) { 2627d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->assoc_sa_query_max_timeout = atoi(pos); 2628d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt if (bss->assoc_sa_query_max_timeout == 0) { 2629d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: invalid assoc_sa_query_max_timeout", 2630d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt line); 2631d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt return 1; 2632d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } 2633d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "assoc_sa_query_retry_timeout") == 0) { 2634d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->assoc_sa_query_retry_timeout = atoi(pos); 2635d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt if (bss->assoc_sa_query_retry_timeout == 0) { 2636d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: invalid assoc_sa_query_retry_timeout", 2637d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt line); 2638d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt return 1; 2639d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } 26408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_IEEE80211W */ 26418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_IEEE80211N 2642d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "ieee80211n") == 0) { 2643d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt conf->ieee80211n = atoi(pos); 2644d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "ht_capab") == 0) { 2645d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt if (hostapd_config_ht_capab(conf, pos) < 0) { 2646d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: invalid ht_capab", 2647d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt line); 2648d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt return 1; 2649d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } 2650d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "require_ht") == 0) { 2651d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt conf->require_ht = atoi(pos); 2652d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "obss_interval") == 0) { 2653d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt conf->obss_interval = atoi(pos); 26548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_IEEE80211N */ 265504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#ifdef CONFIG_IEEE80211AC 2656d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "ieee80211ac") == 0) { 2657d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt conf->ieee80211ac = atoi(pos); 2658d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "vht_capab") == 0) { 2659d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt if (hostapd_config_vht_capab(conf, pos) < 0) { 2660d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: invalid vht_capab", 2661d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt line); 2662d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt return 1; 2663d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } 2664d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "require_vht") == 0) { 2665d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt conf->require_vht = atoi(pos); 2666d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "vht_oper_chwidth") == 0) { 2667d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt conf->vht_oper_chwidth = atoi(pos); 2668d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "vht_oper_centr_freq_seg0_idx") == 0) { 2669d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt conf->vht_oper_centr_freq_seg0_idx = atoi(pos); 2670d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "vht_oper_centr_freq_seg1_idx") == 0) { 2671d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt conf->vht_oper_centr_freq_seg1_idx = atoi(pos); 267204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#endif /* CONFIG_IEEE80211AC */ 2673d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "max_listen_interval") == 0) { 2674d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->max_listen_interval = atoi(pos); 2675d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "disable_pmksa_caching") == 0) { 2676d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->disable_pmksa_caching = atoi(pos); 2677d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "okc") == 0) { 2678d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->okc = atoi(pos); 26798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_WPS 2680d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "wps_state") == 0) { 2681d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->wps_state = atoi(pos); 2682d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt if (bss->wps_state < 0 || bss->wps_state > 2) { 2683d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: invalid wps_state", 2684d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt line); 2685d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt return 1; 2686d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } 2687d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "wps_independent") == 0) { 2688d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->wps_independent = atoi(pos); 2689d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "ap_setup_locked") == 0) { 2690d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->ap_setup_locked = atoi(pos); 2691d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "uuid") == 0) { 2692d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt if (uuid_str2bin(pos, bss->uuid)) { 2693d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: invalid UUID", line); 2694d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt return 1; 2695d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } 2696d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "wps_pin_requests") == 0) { 2697d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt os_free(bss->wps_pin_requests); 2698d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->wps_pin_requests = os_strdup(pos); 2699d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "device_name") == 0) { 2700d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt if (os_strlen(pos) > 32) { 2701d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: Too long " 2702d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt "device_name", line); 2703d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt return 1; 2704d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } 2705d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt os_free(bss->device_name); 2706d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->device_name = os_strdup(pos); 2707d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "manufacturer") == 0) { 2708d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt if (os_strlen(pos) > 64) { 2709d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: Too long manufacturer", 2710d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt line); 2711d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt return 1; 2712d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } 2713d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt os_free(bss->manufacturer); 2714d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->manufacturer = os_strdup(pos); 2715d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "model_name") == 0) { 2716d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt if (os_strlen(pos) > 32) { 2717d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: Too long model_name", 2718d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt line); 2719d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt return 1; 2720d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } 2721d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt os_free(bss->model_name); 2722d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->model_name = os_strdup(pos); 2723d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "model_number") == 0) { 2724d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt if (os_strlen(pos) > 32) { 2725d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: Too long model_number", 2726d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt line); 2727d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt return 1; 2728d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } 2729d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt os_free(bss->model_number); 2730d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->model_number = os_strdup(pos); 2731d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "serial_number") == 0) { 2732d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt if (os_strlen(pos) > 32) { 2733d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: Too long serial_number", 2734d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt line); 2735d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt return 1; 2736d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } 2737d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt os_free(bss->serial_number); 2738d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->serial_number = os_strdup(pos); 2739d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "device_type") == 0) { 2740d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt if (wps_dev_type_str2bin(pos, bss->device_type)) 2741d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt return 1; 2742d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "config_methods") == 0) { 2743d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt os_free(bss->config_methods); 2744d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->config_methods = os_strdup(pos); 2745d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "os_version") == 0) { 2746d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt if (hexstr2bin(pos, bss->os_version, 4)) { 2747d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: invalid os_version", 2748d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt line); 2749d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt return 1; 2750d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } 2751d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "ap_pin") == 0) { 2752d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt os_free(bss->ap_pin); 2753d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->ap_pin = os_strdup(pos); 2754d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "skip_cred_build") == 0) { 2755d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->skip_cred_build = atoi(pos); 2756d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "extra_cred") == 0) { 2757d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt os_free(bss->extra_cred); 2758d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->extra_cred = (u8 *) os_readfile(pos, &bss->extra_cred_len); 2759d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt if (bss->extra_cred == NULL) { 2760d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: could not read Credentials from '%s'", 2761d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt line, pos); 2762d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt return 1; 2763d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } 2764d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "wps_cred_processing") == 0) { 2765d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->wps_cred_processing = atoi(pos); 2766d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "ap_settings") == 0) { 2767d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt os_free(bss->ap_settings); 2768d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->ap_settings = 2769d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt (u8 *) os_readfile(pos, &bss->ap_settings_len); 2770d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt if (bss->ap_settings == NULL) { 2771d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: could not read AP Settings from '%s'", 2772d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt line, pos); 2773d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt return 1; 2774d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } 2775d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "upnp_iface") == 0) { 277621de214b4ba4271ca20843f3b8fba9f1501b2a89Dmitry Shmidt os_free(bss->upnp_iface); 2777d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->upnp_iface = os_strdup(pos); 2778d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "friendly_name") == 0) { 2779d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt os_free(bss->friendly_name); 2780d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->friendly_name = os_strdup(pos); 2781d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "manufacturer_url") == 0) { 2782d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt os_free(bss->manufacturer_url); 2783d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->manufacturer_url = os_strdup(pos); 2784d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "model_description") == 0) { 2785d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt os_free(bss->model_description); 2786d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->model_description = os_strdup(pos); 2787d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "model_url") == 0) { 2788d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt os_free(bss->model_url); 2789d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->model_url = os_strdup(pos); 2790d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "upc") == 0) { 2791d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt os_free(bss->upc); 2792d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->upc = os_strdup(pos); 2793d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "pbc_in_m1") == 0) { 2794d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->pbc_in_m1 = atoi(pos); 2795d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "server_id") == 0) { 2796d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt os_free(bss->server_id); 2797d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->server_id = os_strdup(pos); 279804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#ifdef CONFIG_WPS_NFC 2799d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "wps_nfc_dev_pw_id") == 0) { 2800d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->wps_nfc_dev_pw_id = atoi(pos); 2801d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt if (bss->wps_nfc_dev_pw_id < 0x10 || 2802d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->wps_nfc_dev_pw_id > 0xffff) { 2803d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: Invalid wps_nfc_dev_pw_id value", 2804d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt line); 2805d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt return 1; 2806d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } 2807d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->wps_nfc_pw_from_config = 1; 2808d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "wps_nfc_dh_pubkey") == 0) { 2809d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt wpabuf_free(bss->wps_nfc_dh_pubkey); 2810d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->wps_nfc_dh_pubkey = hostapd_parse_bin(pos); 2811d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->wps_nfc_pw_from_config = 1; 2812d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "wps_nfc_dh_privkey") == 0) { 2813d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt wpabuf_free(bss->wps_nfc_dh_privkey); 2814d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->wps_nfc_dh_privkey = hostapd_parse_bin(pos); 2815d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->wps_nfc_pw_from_config = 1; 2816d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "wps_nfc_dev_pw") == 0) { 2817d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt wpabuf_free(bss->wps_nfc_dev_pw); 2818d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->wps_nfc_dev_pw = hostapd_parse_bin(pos); 2819d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->wps_nfc_pw_from_config = 1; 282004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#endif /* CONFIG_WPS_NFC */ 28218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_WPS */ 28228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_P2P_MANAGER 2823d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "manage_p2p") == 0) { 2824d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt if (atoi(pos)) 2825d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->p2p |= P2P_MANAGE; 2826d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt else 2827d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->p2p &= ~P2P_MANAGE; 2828d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "allow_cross_connection") == 0) { 2829d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt if (atoi(pos)) 2830d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->p2p |= P2P_ALLOW_CROSS_CONNECTION; 2831d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt else 2832d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->p2p &= ~P2P_ALLOW_CROSS_CONNECTION; 28338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_P2P_MANAGER */ 2834d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "disassoc_low_ack") == 0) { 2835d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->disassoc_low_ack = atoi(pos); 2836d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "tdls_prohibit") == 0) { 2837d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt if (atoi(pos)) 2838d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->tdls |= TDLS_PROHIBIT; 2839d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt else 2840d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->tdls &= ~TDLS_PROHIBIT; 2841d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "tdls_prohibit_chan_switch") == 0) { 2842d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt if (atoi(pos)) 2843d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->tdls |= TDLS_PROHIBIT_CHAN_SWITCH; 2844d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt else 2845d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->tdls &= ~TDLS_PROHIBIT_CHAN_SWITCH; 28468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_RSN_TESTING 2847d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "rsn_testing") == 0) { 2848d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt extern int rsn_testing; 2849d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt rsn_testing = atoi(pos); 28508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_RSN_TESTING */ 2851d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "time_advertisement") == 0) { 2852d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->time_advertisement = atoi(pos); 2853d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "time_zone") == 0) { 2854d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt size_t tz_len = os_strlen(pos); 2855d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt if (tz_len < 4 || tz_len > 255) { 2856d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt wpa_printf(MSG_DEBUG, "Line %d: invalid time_zone", 2857d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt line); 2858d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt return 1; 2859d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } 2860d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt os_free(bss->time_zone); 2861d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->time_zone = os_strdup(pos); 2862d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt if (bss->time_zone == NULL) 2863d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt return 1; 2864a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt#ifdef CONFIG_WNM 2865d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "wnm_sleep_mode") == 0) { 2866d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->wnm_sleep_mode = atoi(pos); 2867d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "bss_transition") == 0) { 2868d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->bss_transition = atoi(pos); 2869a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt#endif /* CONFIG_WNM */ 28701f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#ifdef CONFIG_INTERWORKING 2871d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "interworking") == 0) { 2872d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->interworking = atoi(pos); 2873d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "access_network_type") == 0) { 2874d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->access_network_type = atoi(pos); 2875d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt if (bss->access_network_type < 0 || 2876d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->access_network_type > 15) { 2877d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt wpa_printf(MSG_ERROR, 2878d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt "Line %d: invalid access_network_type", 2879d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt line); 2880d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt return 1; 2881d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } 2882d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "internet") == 0) { 2883d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->internet = atoi(pos); 2884d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "asra") == 0) { 2885d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->asra = atoi(pos); 2886d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "esr") == 0) { 2887d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->esr = atoi(pos); 2888d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "uesa") == 0) { 2889d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->uesa = atoi(pos); 2890d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "venue_group") == 0) { 2891d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->venue_group = atoi(pos); 2892d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->venue_info_set = 1; 2893d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "venue_type") == 0) { 2894d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->venue_type = atoi(pos); 2895d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->venue_info_set = 1; 2896d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "hessid") == 0) { 2897d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt if (hwaddr_aton(pos, bss->hessid)) { 2898d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: invalid hessid", line); 2899d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt return 1; 2900d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } 2901d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "roaming_consortium") == 0) { 2902d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt if (parse_roaming_consortium(bss, pos, line) < 0) 2903d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt return 1; 2904d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "venue_name") == 0) { 2905d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt if (parse_venue_name(bss, pos, line) < 0) 2906d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt return 1; 2907d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "network_auth_type") == 0) { 2908d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt u8 auth_type; 2909d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt u16 redirect_url_len; 2910d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt if (hexstr2bin(pos, &auth_type, 1)) { 2911d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt wpa_printf(MSG_ERROR, 2912d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt "Line %d: Invalid network_auth_type '%s'", 2913d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt line, pos); 2914d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt return 1; 2915d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } 2916d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt if (auth_type == 0 || auth_type == 2) 2917d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt redirect_url_len = os_strlen(pos + 2); 2918d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt else 2919d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt redirect_url_len = 0; 2920d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt os_free(bss->network_auth_type); 2921d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->network_auth_type = os_malloc(redirect_url_len + 3 + 1); 2922d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt if (bss->network_auth_type == NULL) 2923d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt return 1; 2924d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt *bss->network_auth_type = auth_type; 2925d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt WPA_PUT_LE16(bss->network_auth_type + 1, redirect_url_len); 2926d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt if (redirect_url_len) 2927d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt os_memcpy(bss->network_auth_type + 3, pos + 2, 2928d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt redirect_url_len); 2929d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->network_auth_type_len = 3 + redirect_url_len; 2930d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "ipaddr_type_availability") == 0) { 2931d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt if (hexstr2bin(pos, &bss->ipaddr_type_availability, 1)) { 2932d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: Invalid ipaddr_type_availability '%s'", 2933d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt line, pos); 2934d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->ipaddr_type_configured = 0; 2935d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt return 1; 2936d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } 2937d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->ipaddr_type_configured = 1; 2938d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "domain_name") == 0) { 2939d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt int j, num_domains, domain_len, domain_list_len = 0; 2940d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt char *tok_start, *tok_prev; 2941d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt u8 *domain_list, *domain_ptr; 2942d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt 2943d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt domain_list_len = os_strlen(pos) + 1; 2944d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt domain_list = os_malloc(domain_list_len); 2945d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt if (domain_list == NULL) 2946d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt return 1; 2947d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt 2948d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt domain_ptr = domain_list; 2949d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt tok_prev = pos; 2950d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt num_domains = 1; 2951d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt while ((tok_prev = os_strchr(tok_prev, ','))) { 2952d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt num_domains++; 2953d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt tok_prev++; 2954d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } 2955d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt tok_prev = pos; 2956d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt for (j = 0; j < num_domains; j++) { 2957d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt tok_start = os_strchr(tok_prev, ','); 2958d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt if (tok_start) { 2959d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt domain_len = tok_start - tok_prev; 2960d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt *domain_ptr = domain_len; 2961d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt os_memcpy(domain_ptr + 1, tok_prev, domain_len); 2962d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt domain_ptr += domain_len + 1; 2963d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt tok_prev = ++tok_start; 2964d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else { 2965d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt domain_len = os_strlen(tok_prev); 2966d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt *domain_ptr = domain_len; 2967d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt os_memcpy(domain_ptr + 1, tok_prev, domain_len); 2968d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt domain_ptr += domain_len + 1; 296961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt } 2970d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } 297161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 2972d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt os_free(bss->domain_name); 2973d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->domain_name = domain_list; 2974d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->domain_name_len = domain_list_len; 2975d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "anqp_3gpp_cell_net") == 0) { 2976d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt if (parse_3gpp_cell_net(bss, pos, line) < 0) 2977d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt return 1; 2978d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "nai_realm") == 0) { 2979d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt if (parse_nai_realm(bss, pos, line) < 0) 2980d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt return 1; 2981d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "gas_frag_limit") == 0) { 2982d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->gas_frag_limit = atoi(pos); 2983d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "gas_comeback_delay") == 0) { 2984d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->gas_comeback_delay = atoi(pos); 2985d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "qos_map_set") == 0) { 2986d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt if (parse_qos_map_set(bss, pos, line) < 0) 2987d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt return 1; 29881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#endif /* CONFIG_INTERWORKING */ 29891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#ifdef CONFIG_RADIUS_TEST 2990d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "dump_msk_file") == 0) { 2991d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt os_free(bss->dump_msk_file); 2992d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->dump_msk_file = os_strdup(pos); 29931f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#endif /* CONFIG_RADIUS_TEST */ 299461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt#ifdef CONFIG_HS20 2995d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "hs20") == 0) { 2996d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->hs20 = atoi(pos); 2997d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "disable_dgaf") == 0) { 2998d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->disable_dgaf = atoi(pos); 2999d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "osen") == 0) { 3000d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->osen = atoi(pos); 3001d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "anqp_domain_id") == 0) { 3002d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->anqp_domain_id = atoi(pos); 3003d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "hs20_deauth_req_timeout") == 0) { 3004d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->hs20_deauth_req_timeout = atoi(pos); 3005d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "hs20_oper_friendly_name") == 0) { 3006d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt if (hs20_parse_oper_friendly_name(bss, pos, line) < 0) 3007d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt return 1; 3008d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "hs20_wan_metrics") == 0) { 3009d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt if (hs20_parse_wan_metrics(bss, pos, line) < 0) 3010d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt return 1; 3011d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "hs20_conn_capab") == 0) { 3012d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt if (hs20_parse_conn_capab(bss, pos, line) < 0) { 3013d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt return 1; 3014d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } 3015d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "hs20_operating_class") == 0) { 3016d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt u8 *oper_class; 3017d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt size_t oper_class_len; 3018d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt oper_class_len = os_strlen(pos); 3019d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt if (oper_class_len < 2 || (oper_class_len & 0x01)) { 3020d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt wpa_printf(MSG_ERROR, 3021d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt "Line %d: Invalid hs20_operating_class '%s'", 3022d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt line, pos); 3023d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt return 1; 3024d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } 3025d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt oper_class_len /= 2; 3026d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt oper_class = os_malloc(oper_class_len); 3027d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt if (oper_class == NULL) 3028d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt return 1; 3029d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt if (hexstr2bin(pos, oper_class, oper_class_len)) { 3030d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt wpa_printf(MSG_ERROR, 3031d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt "Line %d: Invalid hs20_operating_class '%s'", 3032d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt line, pos); 3033d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt os_free(oper_class); 3034d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt return 1; 3035d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } 3036d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt os_free(bss->hs20_operating_class); 3037d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->hs20_operating_class = oper_class; 3038d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->hs20_operating_class_len = oper_class_len; 3039d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "hs20_icon") == 0) { 3040d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt if (hs20_parse_icon(bss, pos) < 0) { 3041d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: Invalid hs20_icon '%s'", 3042d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt line, pos); 3043d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt return 1; 3044d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } 3045d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "osu_ssid") == 0) { 3046d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt if (hs20_parse_osu_ssid(bss, pos, line) < 0) 3047d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt return 1; 3048d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "osu_server_uri") == 0) { 3049d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt if (hs20_parse_osu_server_uri(bss, pos, line) < 0) 3050d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt return 1; 3051d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "osu_friendly_name") == 0) { 3052d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt if (hs20_parse_osu_friendly_name(bss, pos, line) < 0) 3053d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt return 1; 3054d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "osu_nai") == 0) { 3055d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt if (hs20_parse_osu_nai(bss, pos, line) < 0) 3056d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt return 1; 3057d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "osu_method_list") == 0) { 3058d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt if (hs20_parse_osu_method_list(bss, pos, line) < 0) 3059d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt return 1; 3060d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "osu_icon") == 0) { 3061d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt if (hs20_parse_osu_icon(bss, pos, line) < 0) 3062d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt return 1; 3063d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "osu_service_desc") == 0) { 3064d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt if (hs20_parse_osu_service_desc(bss, pos, line) < 0) 3065d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt return 1; 3066d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "subscr_remediation_url") == 0) { 3067d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt os_free(bss->subscr_remediation_url); 3068d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->subscr_remediation_url = os_strdup(pos); 3069d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "subscr_remediation_method") == 0) { 3070d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->subscr_remediation_method = atoi(pos); 307161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt#endif /* CONFIG_HS20 */ 30728da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt#ifdef CONFIG_TESTING_OPTIONS 3073d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt#define PARSE_TEST_PROBABILITY(_val) \ 3074d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, #_val) == 0) { \ 3075d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt char *end; \ 3076d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt \ 3077d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt conf->_val = strtod(pos, &end); \ 30787832adbbd72a1b784b7fb74a71a5d4085b0cb0d3Dmitry Shmidt if (*end || conf->_val < 0.0 || \ 30797832adbbd72a1b784b7fb74a71a5d4085b0cb0d3Dmitry Shmidt conf->_val > 1.0) { \ 3080d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt wpa_printf(MSG_ERROR, \ 3081d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt "Line %d: Invalid value '%s'", \ 3082d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt line, pos); \ 3083d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt return 1; \ 3084d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } 3085d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt PARSE_TEST_PROBABILITY(ignore_probe_probability) 3086d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt PARSE_TEST_PROBABILITY(ignore_auth_probability) 3087d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt PARSE_TEST_PROBABILITY(ignore_assoc_probability) 3088d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt PARSE_TEST_PROBABILITY(ignore_reassoc_probability) 3089d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt PARSE_TEST_PROBABILITY(corrupt_gtk_rekey_mic_probability) 3090d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "bss_load_test") == 0) { 3091d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt WPA_PUT_LE16(bss->bss_load_test, atoi(pos)); 3092d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt pos = os_strchr(pos, ':'); 3093d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt if (pos == NULL) { 3094d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: Invalid bss_load_test", 3095d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt line); 3096d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt return 1; 3097d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } 3098d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt pos++; 3099d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->bss_load_test[2] = atoi(pos); 3100d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt pos = os_strchr(pos, ':'); 3101d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt if (pos == NULL) { 3102d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: Invalid bss_load_test", 3103d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt line); 3104d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt return 1; 3105d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } 3106d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt pos++; 3107d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt WPA_PUT_LE16(&bss->bss_load_test[3], atoi(pos)); 3108d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->bss_load_test_set = 1; 31098da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt#endif /* CONFIG_TESTING_OPTIONS */ 3110d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "vendor_elements") == 0) { 3111d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt struct wpabuf *elems; 3112d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt size_t len = os_strlen(pos); 3113d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt if (len & 0x01) { 3114d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt wpa_printf(MSG_ERROR, 3115d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt "Line %d: Invalid vendor_elements '%s'", 3116d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt line, pos); 3117d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt return 1; 3118d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } 3119d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt len /= 2; 3120d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt if (len == 0) { 3121d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt wpabuf_free(bss->vendor_elements); 3122d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->vendor_elements = NULL; 3123d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt return 0; 3124d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } 312561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 3126d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt elems = wpabuf_alloc(len); 3127d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt if (elems == NULL) 3128d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt return 1; 312961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 3130d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt if (hexstr2bin(pos, wpabuf_put(elems, len), len)) { 3131d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt wpabuf_free(elems); 3132d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt wpa_printf(MSG_ERROR, 3133d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt "Line %d: Invalid vendor_elements '%s'", 3134d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt line, pos); 3135d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt return 1; 3136d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } 313761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 3138d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt wpabuf_free(bss->vendor_elements); 3139d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->vendor_elements = elems; 3140d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "sae_anti_clogging_threshold") == 0) { 3141d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt bss->sae_anti_clogging_threshold = atoi(pos); 3142d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "sae_groups") == 0) { 3143d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt if (hostapd_parse_intlist(&bss->sae_groups, pos)) { 3144d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt wpa_printf(MSG_ERROR, 3145d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt "Line %d: Invalid sae_groups value '%s'", 3146d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt line, pos); 3147d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt return 1; 31488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 3149d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "local_pwr_constraint") == 0) { 3150d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt int val = atoi(pos); 3151d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt if (val < 0 || val > 255) { 3152d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: Invalid local_pwr_constraint %d (expected 0..255)", 3153d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt line, val); 3154d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt return 1; 3155d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } 3156d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt conf->local_pwr_constraint = val; 3157d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else if (os_strcmp(buf, "spectrum_mgmt_required") == 0) { 3158d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt conf->spectrum_mgmt_required = atoi(pos); 31590207e233ee2e741f7b2c124c1366e905ebb634c8Dmitry Shmidt } else if (os_strcmp(buf, "wowlan_triggers") == 0) { 31600207e233ee2e741f7b2c124c1366e905ebb634c8Dmitry Shmidt os_free(bss->wowlan_triggers); 31610207e233ee2e741f7b2c124c1366e905ebb634c8Dmitry Shmidt bss->wowlan_triggers = os_strdup(pos); 3162d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt } else { 3163d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt wpa_printf(MSG_ERROR, 3164d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt "Line %d: unknown configuration item '%s'", 3165d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt line, buf); 3166d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt return 1; 31678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 31688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3169d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt return 0; 317004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt} 31718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 31728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 317304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt/** 317404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * hostapd_config_read - Read and parse a configuration file 317504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @fname: Configuration file name (including path, if needed) 317604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Returns: Allocated configuration data structure 317704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt */ 317804949598a23f501be6eec21697465fd46a28840aDmitry Shmidtstruct hostapd_config * hostapd_config_read(const char *fname) 317904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{ 318004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt struct hostapd_config *conf; 318104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt FILE *f; 318204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt char buf[512], *pos; 318304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt int line = 0; 318404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt int errors = 0; 318504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt size_t i; 318604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 318704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt f = fopen(fname, "r"); 318804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (f == NULL) { 318904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpa_printf(MSG_ERROR, "Could not open configuration file '%s' " 319004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt "for reading.", fname); 319104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return NULL; 319204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 319304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 319404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt conf = hostapd_config_defaults(); 319504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (conf == NULL) { 319604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt fclose(f); 319704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return NULL; 319804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 319904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 320004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt /* set default driver based on configuration */ 320104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt conf->driver = wpa_drivers[0]; 320204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (conf->driver == NULL) { 320304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpa_printf(MSG_ERROR, "No driver wrappers registered!"); 320404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt hostapd_config_free(conf); 320504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt fclose(f); 320604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return NULL; 320704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 320804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 3209661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt conf->last_bss = conf->bss[0]; 321004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 321104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt while (fgets(buf, sizeof(buf), f)) { 3212661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt struct hostapd_bss_config *bss; 3213661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt 321404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt bss = conf->last_bss; 321504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt line++; 321604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 321704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (buf[0] == '#') 321804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt continue; 321904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt pos = buf; 322004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt while (*pos != '\0') { 322104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (*pos == '\n') { 322204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt *pos = '\0'; 322304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt break; 322404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 322504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt pos++; 32268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 322704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (buf[0] == '\0') 322804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt continue; 322904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 323004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt pos = os_strchr(buf, '='); 323104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (pos == NULL) { 323204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: invalid line '%s'", 323304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt line, buf); 323404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt errors++; 323504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt continue; 32361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 323704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt *pos = '\0'; 323804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt pos++; 323904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt errors += hostapd_config_fill(conf, bss, buf, pos, line); 32408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 32418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 324204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt fclose(f); 324304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 324404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt for (i = 0; i < conf->num_bss; i++) 3245717574375e969e8272c6d1a26137286eac158abbDmitry Shmidt hostapd_set_security_params(conf->bss[i], 1); 324604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 3247344abd362cfe2d03ed956666527352826b67bde5Dmitry Shmidt if (hostapd_config_check(conf, 1)) 32488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt errors++; 32498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 32508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifndef WPA_IGNORE_CONFIG_ERRORS 32518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (errors) { 32528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "%d errors found in configuration file " 32538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "'%s'", errors, fname); 32548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt hostapd_config_free(conf); 32558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt conf = NULL; 32568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 32578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* WPA_IGNORE_CONFIG_ERRORS */ 32588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 32598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return conf; 32608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 326104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 326204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 326304949598a23f501be6eec21697465fd46a28840aDmitry Shmidtint hostapd_set_iface(struct hostapd_config *conf, 326404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt struct hostapd_bss_config *bss, char *field, char *value) 326504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{ 326604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt int errors; 326704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt size_t i; 326804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 326904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt errors = hostapd_config_fill(conf, bss, field, value, 0); 327004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (errors) { 327104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpa_printf(MSG_INFO, "Failed to set configuration field '%s' " 327204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt "to value '%s'", field, value); 327304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return -1; 327404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 327504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 327604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt for (i = 0; i < conf->num_bss; i++) 3277717574375e969e8272c6d1a26137286eac158abbDmitry Shmidt hostapd_set_security_params(conf->bss[i], 0); 327804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 3279344abd362cfe2d03ed956666527352826b67bde5Dmitry Shmidt if (hostapd_config_check(conf, 0)) { 328004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpa_printf(MSG_ERROR, "Configuration check failed"); 328104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return -1; 328204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 328304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 328404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return 0; 328504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt} 3286