18d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/* 28d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * IEEE 802.11 Common routines 304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Copyright (c) 2002-2012, 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 "includes.h" 108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "common.h" 128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "ieee802_11_defs.h" 138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "ieee802_11_common.h" 148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int ieee802_11_parse_vendor_specific(const u8 *pos, size_t elen, 178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct ieee802_11_elems *elems, 188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int show_errors) 198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt unsigned int oui; 218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* first 3 bytes in vendor specific information element are the IEEE 238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * OUI of the vendor. The following byte is used a vendor specific 248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * sub-type. */ 258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (elen < 4) { 268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (show_errors) { 278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_MSGDUMP, "short vendor specific " 288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "information element ignored (len=%lu)", 298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt (unsigned long) elen); 308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt oui = WPA_GET_BE24(pos); 358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt switch (oui) { 368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case OUI_MICROSOFT: 378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Microsoft/Wi-Fi information elements are further typed and 388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * subtyped */ 398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt switch (pos[3]) { 408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case 1: 418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Microsoft OUI (00:50:F2) with OUI Type 1: 428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * real WPA information element */ 438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt elems->wpa_ie = pos; 448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt elems->wpa_ie_len = elen; 458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case WMM_OUI_TYPE: 478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* WMM information element */ 488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (elen < 5) { 498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_MSGDUMP, "short WMM " 508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "information element ignored " 518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "(len=%lu)", 528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt (unsigned long) elen); 538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt switch (pos[4]) { 568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case WMM_OUI_SUBTYPE_INFORMATION_ELEMENT: 578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case WMM_OUI_SUBTYPE_PARAMETER_ELEMENT: 588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* 598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Share same pointer since only one of these 608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * is used and they start with same data. 618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Length field can be used to distinguish the 628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * IEs. 638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt elems->wmm = pos; 658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt elems->wmm_len = elen; 668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case WMM_OUI_SUBTYPE_TSPEC_ELEMENT: 688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt elems->wmm_tspec = pos; 698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt elems->wmm_tspec_len = elen; 708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt default: 728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_EXCESSIVE, "unknown WMM " 738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "information element ignored " 748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "(subtype=%d len=%lu)", 758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos[4], (unsigned long) elen); 768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case 4: 808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Wi-Fi Protected Setup (WPS) IE */ 818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt elems->wps_ie = pos; 828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt elems->wps_ie_len = elen; 838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt default: 858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_EXCESSIVE, "Unknown Microsoft " 868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "information element ignored " 878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "(type=%d len=%lu)", 888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos[3], (unsigned long) elen); 898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case OUI_WFA: 948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt switch (pos[3]) { 958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case P2P_OUI_TYPE: 968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Wi-Fi Alliance - P2P IE */ 978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt elems->p2p = pos; 988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt elems->p2p_len = elen; 998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 10061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt case WFD_OUI_TYPE: 10161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt /* Wi-Fi Alliance - WFD IE */ 10261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt elems->wfd = pos; 10361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt elems->wfd_len = elen; 10461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt break; 10504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt case HS20_INDICATION_OUI_TYPE: 10604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt /* Hotspot 2.0 */ 10704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt elems->hs20 = pos; 10804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt elems->hs20_len = elen; 10904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt break; 1108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt default: 1118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_MSGDUMP, "Unknown WFA " 1128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "information element ignored " 1138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "(type=%d len=%lu)\n", 1148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos[3], (unsigned long) elen); 1158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 1168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 1178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 1188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case OUI_BROADCOM: 1208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt switch (pos[3]) { 1218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case VENDOR_HT_CAPAB_OUI_TYPE: 1228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt elems->vendor_ht_cap = pos; 1238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt elems->vendor_ht_cap_len = elen; 1248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 1258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt default: 1268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_EXCESSIVE, "Unknown Broadcom " 1278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "information element ignored " 1288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "(type=%d len=%lu)", 1298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos[3], (unsigned long) elen); 1308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 1318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 1328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 1338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt default: 1358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_EXCESSIVE, "unknown vendor specific " 1368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "information element ignored (vendor OUI " 1378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "%02x:%02x:%02x len=%lu)", 1388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos[0], pos[1], pos[2], (unsigned long) elen); 1398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 1408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 1418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 1438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 1448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 1478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * ieee802_11_parse_elems - Parse information elements in management frames 1488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @start: Pointer to the start of IEs 1498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @len: Length of IE buffer in octets 1508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @elems: Data structure for parsed elements 1518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @show_errors: Whether to show parsing errors in debug log 1528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: Parsing result 1538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 1548d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtParseRes ieee802_11_parse_elems(const u8 *start, size_t len, 1558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct ieee802_11_elems *elems, 1568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int show_errors) 1578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 1588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t left = len; 1598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const u8 *pos = start; 1608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int unknown = 0; 1618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memset(elems, 0, sizeof(*elems)); 1638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (left >= 2) { 1658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt u8 id, elen; 1668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt id = *pos++; 1688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt elen = *pos++; 1698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt left -= 2; 1708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (elen > left) { 1728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (show_errors) { 1738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "IEEE 802.11 element " 1748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "parse failed (id=%d elen=%d " 1758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "left=%lu)", 1768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt id, elen, (unsigned long) left); 1778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_hexdump(MSG_MSGDUMP, "IEs", start, len); 1788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 1798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return ParseFailed; 1808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 1818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt switch (id) { 1838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case WLAN_EID_SSID: 1848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt elems->ssid = pos; 1858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt elems->ssid_len = elen; 1868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 1878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case WLAN_EID_SUPP_RATES: 1888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt elems->supp_rates = pos; 1898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt elems->supp_rates_len = elen; 1908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 1918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case WLAN_EID_FH_PARAMS: 1928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt elems->fh_params = pos; 1938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt elems->fh_params_len = elen; 1948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 1958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case WLAN_EID_DS_PARAMS: 1968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt elems->ds_params = pos; 1978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt elems->ds_params_len = elen; 1988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 1998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case WLAN_EID_CF_PARAMS: 2008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt elems->cf_params = pos; 2018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt elems->cf_params_len = elen; 2028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 2038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case WLAN_EID_TIM: 2048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt elems->tim = pos; 2058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt elems->tim_len = elen; 2068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 2078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case WLAN_EID_IBSS_PARAMS: 2088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt elems->ibss_params = pos; 2098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt elems->ibss_params_len = elen; 2108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 2118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case WLAN_EID_CHALLENGE: 2128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt elems->challenge = pos; 2138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt elems->challenge_len = elen; 2148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 2158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case WLAN_EID_ERP_INFO: 2168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt elems->erp_info = pos; 2178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt elems->erp_info_len = elen; 2188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 2198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case WLAN_EID_EXT_SUPP_RATES: 2208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt elems->ext_supp_rates = pos; 2218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt elems->ext_supp_rates_len = elen; 2228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 2238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case WLAN_EID_VENDOR_SPECIFIC: 2248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ieee802_11_parse_vendor_specific(pos, elen, 2258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt elems, 2268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt show_errors)) 2278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt unknown++; 2288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 2298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case WLAN_EID_RSN: 2308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt elems->rsn_ie = pos; 2318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt elems->rsn_ie_len = elen; 2328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 2338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case WLAN_EID_PWR_CAPABILITY: 2348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt elems->power_cap = pos; 2358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt elems->power_cap_len = elen; 2368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 2378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case WLAN_EID_SUPPORTED_CHANNELS: 2388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt elems->supp_channels = pos; 2398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt elems->supp_channels_len = elen; 2408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 2418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case WLAN_EID_MOBILITY_DOMAIN: 2428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt elems->mdie = pos; 2438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt elems->mdie_len = elen; 2448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 2458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case WLAN_EID_FAST_BSS_TRANSITION: 2468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt elems->ftie = pos; 2478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt elems->ftie_len = elen; 2488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 2498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case WLAN_EID_TIMEOUT_INTERVAL: 2508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt elems->timeout_int = pos; 2518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt elems->timeout_int_len = elen; 2528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 2538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case WLAN_EID_HT_CAP: 2548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt elems->ht_capabilities = pos; 2558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt elems->ht_capabilities_len = elen; 2568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 2578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case WLAN_EID_HT_OPERATION: 2588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt elems->ht_operation = pos; 2598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt elems->ht_operation_len = elen; 2608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 26161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt case WLAN_EID_VHT_CAP: 26261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt elems->vht_capabilities = pos; 26361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt elems->vht_capabilities_len = elen; 26461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt break; 26561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt case WLAN_EID_VHT_OPERATION: 26661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt elems->vht_operation = pos; 26761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt elems->vht_operation_len = elen; 26861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt break; 2698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case WLAN_EID_LINK_ID: 2708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (elen < 18) 2718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 2728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt elems->link_id = pos; 2738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 2741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt case WLAN_EID_INTERWORKING: 2751f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt elems->interworking = pos; 2761f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt elems->interworking_len = elen; 2771f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt break; 27804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt case WLAN_EID_EXT_CAPAB: 27904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt elems->ext_capab = pos; 28004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt elems->ext_capab_len = elen; 28104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt break; 28204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt case WLAN_EID_BSS_MAX_IDLE_PERIOD: 28304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (elen < 3) 28404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt break; 28504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt elems->bss_max_idle_period = pos; 28604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt break; 2878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt default: 2888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt unknown++; 2898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!show_errors) 2908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 2918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_MSGDUMP, "IEEE 802.11 element parse " 2928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "ignored unknown element (id=%d elen=%d)", 2938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt id, elen); 2948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 2958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 2968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt left -= elen; 2988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos += elen; 2998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 3008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (left) 3028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return ParseFailed; 3038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return unknown ? ParseUnknown : ParseOK; 3058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 3068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtint ieee802_11_ie_count(const u8 *ies, size_t ies_len) 3098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 3108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int count = 0; 3118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const u8 *pos, *end; 3128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ies == NULL) 3148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 3158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos = ies; 3178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt end = ies + ies_len; 3188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (pos + 2 <= end) { 3208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (pos + 2 + pos[1] > end) 3218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 3228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt count++; 3238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos += 2 + pos[1]; 3248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 3258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return count; 3278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 3288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstruct wpabuf * ieee802_11_vendor_ie_concat(const u8 *ies, size_t ies_len, 3318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt u32 oui_type) 3328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 3338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpabuf *buf; 3348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const u8 *end, *pos, *ie; 3358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos = ies; 3378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt end = ies + ies_len; 3388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ie = NULL; 3398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (pos + 1 < end) { 3418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (pos + 2 + pos[1] > end) 3428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return NULL; 3438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (pos[0] == WLAN_EID_VENDOR_SPECIFIC && pos[1] >= 4 && 3448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt WPA_GET_BE32(&pos[2]) == oui_type) { 3458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ie = pos; 3468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 3478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 3488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos += 2 + pos[1]; 3498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 3508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ie == NULL) 3528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return NULL; /* No specified vendor IE found */ 3538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt buf = wpabuf_alloc(ies_len); 3558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (buf == NULL) 3568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return NULL; 3578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* 3598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * There may be multiple vendor IEs in the message, so need to 3608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * concatenate their data fields. 3618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 3628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (pos + 1 < end) { 3638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (pos + 2 + pos[1] > end) 3648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 3658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (pos[0] == WLAN_EID_VENDOR_SPECIFIC && pos[1] >= 4 && 3668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt WPA_GET_BE32(&pos[2]) == oui_type) 3678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpabuf_put_data(buf, pos + 6, pos[1] - 4); 3688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos += 2 + pos[1]; 3698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 3708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return buf; 3728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 3731f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 3741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 3751f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtconst u8 * get_hdr_bssid(const struct ieee80211_hdr *hdr, size_t len) 3761f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{ 3771f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt u16 fc, type, stype; 3781f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 3791f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /* 3801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * PS-Poll frames are 16 bytes. All other frames are 3811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * 24 bytes or longer. 3821f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt */ 3831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (len < 16) 3841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return NULL; 3851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 3861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt fc = le_to_host16(hdr->frame_control); 3871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt type = WLAN_FC_GET_TYPE(fc); 3881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt stype = WLAN_FC_GET_STYPE(fc); 3891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 3901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt switch (type) { 3911f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt case WLAN_FC_TYPE_DATA: 3921f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (len < 24) 3931f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return NULL; 3941f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt switch (fc & (WLAN_FC_FROMDS | WLAN_FC_TODS)) { 3951f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt case WLAN_FC_FROMDS | WLAN_FC_TODS: 3961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt case WLAN_FC_TODS: 3971f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return hdr->addr1; 3981f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt case WLAN_FC_FROMDS: 3991f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return hdr->addr2; 4001f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt default: 4011f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return NULL; 4021f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 4031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt case WLAN_FC_TYPE_CTRL: 4041f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (stype != WLAN_FC_STYPE_PSPOLL) 4051f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return NULL; 4061f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return hdr->addr1; 4071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt case WLAN_FC_TYPE_MGMT: 4081f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return hdr->addr3; 4091f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt default: 4101f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return NULL; 4111f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 4121f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt} 41361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 41461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 41561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtint hostapd_config_wmm_ac(struct hostapd_wmm_ac_params wmm_ac_params[], 41661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt const char *name, const char *val) 41761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt{ 41861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt int num, v; 41961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt const char *pos; 42061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt struct hostapd_wmm_ac_params *ac; 42161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 42261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt /* skip 'wme_ac_' or 'wmm_ac_' prefix */ 42361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt pos = name + 7; 42461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (os_strncmp(pos, "be_", 3) == 0) { 42561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt num = 0; 42661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt pos += 3; 42761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt } else if (os_strncmp(pos, "bk_", 3) == 0) { 42861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt num = 1; 42961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt pos += 3; 43061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt } else if (os_strncmp(pos, "vi_", 3) == 0) { 43161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt num = 2; 43261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt pos += 3; 43361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt } else if (os_strncmp(pos, "vo_", 3) == 0) { 43461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt num = 3; 43561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt pos += 3; 43661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt } else { 43761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt wpa_printf(MSG_ERROR, "Unknown WMM name '%s'", pos); 43861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return -1; 43961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt } 44061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 44161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt ac = &wmm_ac_params[num]; 44261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 44361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (os_strcmp(pos, "aifs") == 0) { 44461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt v = atoi(val); 44561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (v < 1 || v > 255) { 44661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt wpa_printf(MSG_ERROR, "Invalid AIFS value %d", v); 44761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return -1; 44861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt } 44961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt ac->aifs = v; 45061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt } else if (os_strcmp(pos, "cwmin") == 0) { 45161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt v = atoi(val); 45261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (v < 0 || v > 12) { 45361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt wpa_printf(MSG_ERROR, "Invalid cwMin value %d", v); 45461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return -1; 45561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt } 45661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt ac->cwmin = v; 45761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt } else if (os_strcmp(pos, "cwmax") == 0) { 45861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt v = atoi(val); 45961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (v < 0 || v > 12) { 46061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt wpa_printf(MSG_ERROR, "Invalid cwMax value %d", v); 46161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return -1; 46261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt } 46361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt ac->cwmax = v; 46461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt } else if (os_strcmp(pos, "txop_limit") == 0) { 46561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt v = atoi(val); 46661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (v < 0 || v > 0xffff) { 46761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt wpa_printf(MSG_ERROR, "Invalid txop value %d", v); 46861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return -1; 46961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt } 47061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt ac->txop_limit = v; 47161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt } else if (os_strcmp(pos, "acm") == 0) { 47261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt v = atoi(val); 47361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (v < 0 || v > 1) { 47461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt wpa_printf(MSG_ERROR, "Invalid acm value %d", v); 47561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return -1; 47661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt } 47761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt ac->admission_control_mandatory = v; 47861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt } else { 47961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt wpa_printf(MSG_ERROR, "Unknown wmm_ac_ field '%s'", pos); 48061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return -1; 48161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt } 48261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 48361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return 0; 48461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt} 485