Lines Matching +full:se +full:- +full:pos

3  * Copyright (c) 2002-2019, Jouni Malinen <j@w1.fi>
15 #include "qca-vendor.h"
20 static int ieee802_11_parse_vendor_specific(const u8 *pos, size_t elen,
28 * sub-type. */
35 return -1;
38 oui = WPA_GET_BE24(pos);
41 /* Microsoft/Wi-Fi information elements are further typed and
43 switch (pos[3]) {
47 elems->wpa_ie = pos;
48 elems->wpa_ie_len = elen;
57 return -1;
59 switch (pos[4]) {
68 elems->wmm = pos;
69 elems->wmm_len = elen;
72 elems->wmm_tspec = pos;
73 elems->wmm_tspec_len = elen;
79 pos[4], (unsigned long) elen);
80 return -1;
84 /* Wi-Fi Protected Setup (WPS) IE */
85 elems->wps_ie = pos;
86 elems->wps_ie_len = elen;
92 pos[3], (unsigned long) elen);
93 return -1;
98 switch (pos[3]) {
100 /* Wi-Fi Alliance - P2P IE */
101 elems->p2p = pos;
102 elems->p2p_len = elen;
105 /* Wi-Fi Alliance - WFD IE */
106 elems->wfd = pos;
107 elems->wfd_len = elen;
111 elems->hs20 = pos;
112 elems->hs20_len = elen;
116 elems->osen = pos;
117 elems->osen_len = elen;
120 /* MBO-OCE */
121 elems->mbo = pos;
122 elems->mbo_len = elen;
126 elems->roaming_cons_sel = pos;
127 elems->roaming_cons_sel_len = elen;
130 elems->multi_ap = pos;
131 elems->multi_ap_len = elen;
140 elems->sae_pk = pos + 4;
141 elems->sae_pk_len = elen - 4;
147 pos[3], (unsigned long) elen);
148 return -1;
153 switch (pos[3]) {
155 elems->vendor_ht_cap = pos;
156 elems->vendor_ht_cap_len = elen;
160 (pos[4] == VENDOR_VHT_SUBTYPE ||
161 pos[4] == VENDOR_VHT_SUBTYPE2)) {
162 elems->vendor_vht = pos;
163 elems->vendor_vht_len = elen;
165 return -1;
171 pos[3], (unsigned long) elen);
172 return -1;
177 switch (pos[3]) {
179 elems->pref_freq_list = pos;
180 elems->pref_freq_list_len = elen;
185 pos[3], (unsigned long) elen);
186 return -1;
194 pos[0], pos[1], pos[2], (unsigned long) elen);
195 return -1;
202 static int ieee802_11_parse_mle(const u8 *pos, size_t elen, size_t **total_len,
206 u8 mle_type = pos[0] & MULTI_LINK_CONTROL_TYPE_MASK;
210 elems->basic_mle = pos;
211 elems->basic_mle_len = elen;
212 *total_len = &elems->basic_mle_len;
215 elems->probe_req_mle = pos;
216 elems->probe_req_mle_len = elen;
217 *total_len = &elems->probe_req_mle_len;
220 elems->reconf_mle = pos;
221 elems->reconf_mle_len = elen;
222 *total_len = &elems->reconf_mle_len;
225 elems->tdls_mle = pos;
226 elems->tdls_mle_len = elen;
227 *total_len = &elems->tdls_mle_len;
230 elems->prior_access_mle = pos;
231 elems->prior_access_mle_len = elen;
232 *total_len = &elems->prior_access_mle_len;
237 "Unknown Multi-Link element type %u",
240 return -1;
254 if (elem->id != WLAN_EID_FRAGMENT)
257 frags_len += elem->datalen + 2;
258 elems->num_frag_elems++;
265 static int ieee802_11_parse_extension(const u8 *pos, size_t elen,
278 return -1;
281 ext_id = *pos++;
282 elen--;
288 elems->assoc_delay_info = pos;
293 elems->fils_req_params = pos;
294 elems->fils_req_params_len = elen;
297 elems->fils_key_confirm = pos;
298 elems->fils_key_confirm_len = elen;
303 elems->fils_session = pos;
308 elems->fils_hlp = pos;
309 elems->fils_hlp_len = elen;
310 total_len = &elems->fils_hlp_len;
315 elems->fils_ip_addr_assign = pos;
316 elems->fils_ip_addr_assign_len = elen;
321 elems->key_delivery = pos;
322 elems->key_delivery_len = elen;
325 elems->wrapped_data = pos;
326 elems->wrapped_data_len = elen;
327 total_len = &elems->wrapped_data_len;
332 elems->fils_pk = pos;
333 elems->fils_pk_len = elen;
338 elems->fils_nonce = pos;
343 elems->owe_dh = pos;
344 elems->owe_dh_len = elen;
347 elems->password_id = pos;
348 elems->password_id_len = elen;
351 elems->he_capabilities = pos;
352 elems->he_capabilities_len = elen;
355 elems->he_operation = pos;
356 elems->he_operation_len = elen;
359 elems->oci = pos;
360 elems->oci_len = elen;
363 elems->short_ssid_list = pos;
364 elems->short_ssid_list_len = elen;
369 elems->he_6ghz_band_cap = pos;
372 elems->pasn_params = pos;
373 elems->pasn_params_len = elen;
376 elems->eht_capabilities = pos;
377 elems->eht_capabilities_len = elen;
380 elems->eht_operation = pos;
381 elems->eht_operation_len = elen;
386 if (ieee802_11_parse_mle(pos, elen, &total_len, elems,
388 return -1;
391 elems->mbssid_known_bss = pos;
392 elems->mbssid_known_bss_len = elen;
400 return -1;
405 elems, pos + elen, (start + len) - (pos + elen));
422 u8 id = elem->id, elen = elem->datalen;
423 const u8 *pos = elem->data;
426 if (id == WLAN_EID_FRAGMENT && elems->num_frag_elems > 0) {
427 elems->num_frag_elems--;
430 elems->num_frag_elems = 0;
440 if (elems->ssid) {
445 elems->ssid = pos;
446 elems->ssid_len = elen;
449 elems->supp_rates = pos;
450 elems->supp_rates_len = elen;
455 elems->ds_params = pos;
461 elems->challenge = pos;
462 elems->challenge_len = elen;
467 elems->erp_info = pos;
470 elems->ext_supp_rates = pos;
471 elems->ext_supp_rates_len = elen;
474 if (ieee802_11_parse_vendor_specific(pos, elen,
480 elems->rsn_ie = pos;
481 elems->rsn_ie_len = elen;
484 elems->rsnxe = pos;
485 elems->rsnxe_len = elen;
490 elems->power_capab = pos;
491 elems->power_capab_len = elen;
494 elems->supp_channels = pos;
495 elems->supp_channels_len = elen;
500 elems->mdie = pos;
501 elems->mdie_len = elen;
506 elems->ftie = pos;
507 elems->ftie_len = elen;
508 elems->fte_defrag_len = elen;
509 total_len = &elems->fte_defrag_len;
514 elems->timeout_int = pos;
519 elems->ht_capabilities = pos;
524 elems->ht_operation = pos;
527 elems->mesh_config = pos;
528 elems->mesh_config_len = elen;
531 elems->mesh_id = pos;
532 elems->mesh_id_len = elen;
535 elems->peer_mgmt = pos;
536 elems->peer_mgmt_len = elen;
541 elems->vht_capabilities = pos;
546 elems->vht_operation = pos;
551 elems->opmode_notif = pos;
556 elems->link_id = pos;
559 elems->interworking = pos;
560 elems->interworking_len = elen;
565 elems->qos_map_set = pos;
566 elems->qos_map_set_len = elen;
569 elems->ext_capab = pos;
570 elems->ext_capab_len = elen;
575 elems->bss_max_idle_period = pos;
578 elems->ssid_list = pos;
579 elems->ssid_list_len = elen;
582 elems->ampe = pos;
583 elems->ampe_len = elen;
586 elems->mic = pos;
587 elems->mic_len = elen;
591 if (elems->mb_ies.nof_ies >= MAX_NOF_MB_IES_SUPPORTED) {
598 elems->mb_ies.ies[elems->mb_ies.nof_ies].ie = pos;
599 elems->mb_ies.ies[elems->mb_ies.nof_ies].ie_len = elen;
600 elems->mb_ies.nof_ies++;
603 elems->supp_op_classes = pos;
604 elems->supp_op_classes_len = elen;
607 elems->rrm_enabled = pos;
608 elems->rrm_enabled_len = elen;
613 elems->mbssid = pos;
614 elems->mbssid_len = elen;
617 elems->cag_number = pos;
618 elems->cag_number_len = elen;
623 elems->ap_csn = pos;
628 elems->fils_indic = pos;
629 elems->fils_indic_len = elen;
634 elems->dils = pos;
635 elems->dils_len = elen;
640 elems->s1g_capab = pos;
644 "Fragment without a valid last element - skip");
648 if (ieee802_11_parse_extension(pos, elen, elems, start,
664 elems, pos + elen,
665 (start + len) - (pos + elen));
673 (int) (start + len - (const u8 *) elem));
685 * ieee802_11_parse_elems - Parse information elements in management frames
703 * ieee802_11_elems_clear_ids - Clear the data for the given element IDs
715 elems->ssid = NULL;
716 elems->ssid_len = 0;
719 elems->supp_rates = NULL;
720 elems->supp_rates_len = 0;
723 elems->ds_params = NULL;
726 elems->challenge = NULL;
727 elems->challenge_len = 0;
730 elems->erp_info = NULL;
733 elems->ext_supp_rates = NULL;
734 elems->ext_supp_rates_len = 0;
737 elems->rsn_ie = NULL;
738 elems->rsn_ie_len = 0;
741 elems->rsnxe = NULL;
742 elems->rsnxe_len = 0;
745 elems->power_capab = NULL;
746 elems->power_capab_len = 0;
749 elems->supp_channels = NULL;
750 elems->supp_channels_len = 0;
753 elems->mdie = NULL;
754 elems->mdie_len = 0;
757 elems->ftie = NULL;
758 elems->ftie_len = 0;
761 elems->timeout_int = NULL;
764 elems->ht_capabilities = NULL;
767 elems->ht_operation = NULL;
770 elems->mesh_config = NULL;
771 elems->mesh_config_len = 0;
774 elems->mesh_id = NULL;
775 elems->mesh_id_len = 0;
778 elems->peer_mgmt = NULL;
779 elems->peer_mgmt_len = 0;
782 elems->vht_capabilities = NULL;
785 elems->vht_operation = NULL;
788 elems->opmode_notif = NULL;
791 elems->link_id = NULL;
794 elems->interworking = NULL;
795 elems->interworking_len = 0;
798 elems->qos_map_set = NULL;
799 elems->qos_map_set_len = 0;
802 elems->ext_capab = NULL;
803 elems->ext_capab_len = 0;
806 elems->bss_max_idle_period = NULL;
809 elems->ssid_list = NULL;
810 elems->ssid_list_len = 0;
813 elems->ampe = NULL;
814 elems->ampe_len = 0;
817 elems->mic = NULL;
818 elems->mic_len = 0;
821 os_memset(&elems->mb_ies, 0, sizeof(elems->mb_ies));
822 elems->mb_ies.nof_ies = 0;
825 elems->supp_op_classes = NULL;
826 elems->supp_op_classes_len = 0;
829 elems->rrm_enabled = NULL;
830 elems->rrm_enabled_len = 0;
833 elems->cag_number = NULL;
834 elems->cag_number_len = 0;
837 elems->ap_csn = NULL;
840 elems->fils_indic = NULL;
841 elems->fils_indic_len = 0;
844 elems->dils = NULL;
845 elems->dils_len = 0;
848 elems->s1g_capab = NULL;
856 * ieee802_11_elems_clear_ext_ids - Clear the data for the given element
869 elems->assoc_delay_info = NULL;
872 elems->fils_req_params = NULL;
873 elems->fils_req_params_len = 0;
876 elems->fils_key_confirm = NULL;
877 elems->fils_key_confirm_len = 0;
880 elems->fils_session = NULL;
883 elems->fils_hlp = NULL;
884 elems->fils_hlp_len = 0;
887 elems->fils_ip_addr_assign = NULL;
888 elems->fils_ip_addr_assign_len = 0;
891 elems->key_delivery = NULL;
892 elems->key_delivery_len = 0;
895 elems->wrapped_data = NULL;
896 elems->wrapped_data_len = 0;
899 elems->fils_pk = NULL;
900 elems->fils_pk_len = 0;
903 elems->fils_nonce = NULL;
906 elems->owe_dh = NULL;
907 elems->owe_dh_len = 0;
910 elems->password_id = NULL;
911 elems->password_id_len = 0;
914 elems->he_capabilities = NULL;
915 elems->he_capabilities_len = 0;
918 elems->he_operation = NULL;
919 elems->he_operation_len = 0;
922 elems->oci = NULL;
923 elems->oci_len = 0;
926 elems->short_ssid_list = NULL;
927 elems->short_ssid_list_len = 0;
930 elems->he_6ghz_band_cap = NULL;
933 elems->pasn_params = NULL;
934 elems->pasn_params_len = 0;
937 elems->basic_mle = NULL;
938 elems->probe_req_mle = NULL;
939 elems->reconf_mle = NULL;
940 elems->tdls_mle = NULL;
941 elems->prior_access_mle = NULL;
943 elems->basic_mle_len = 0;
944 elems->probe_req_mle_len = 0;
945 elems->reconf_mle_len = 0;
946 elems->tdls_mle_len = 0;
947 elems->prior_access_mle_len = 0;
950 elems->eht_capabilities = NULL;
951 elems->eht_capabilities_len = 0;
954 elems->eht_operation = NULL;
955 elems->eht_operation_len = 0;
968 const u8 *pos;
971 pos = wpabuf_head(mlbuf);
975 if (len < sizeof(*ml) + 1 || len < sizeof(*ml) + pos[sizeof(*ml)])
978 ml = (const struct ieee80211_eht_ml *) pos;
980 /* As we are interested with the Per-STA profile, ignore other types */
981 if ((le_to_host16(ml->ml_control) & MULTI_LINK_CONTROL_TYPE_MASK) !=
986 len -= sizeof(*ml) + pos[sizeof(*ml)];
987 pos += sizeof(*ml) + pos[sizeof(*ml)];
990 size_t sub_elem_len = *(pos + 1);
1007 if (*pos != 0) {
1008 pos += 2 + sub_elem_len;
1009 len -= 2 + sub_elem_len;
1021 link_info_control = WPA_GET_LE16(pos + 2);
1024 pos += 2 + sub_elem_len;
1025 len -= 2 + sub_elem_len;
1029 sta_info_len = *(pos + 4);
1038 pos += sta_info_len + 4;
1039 sub_elem_len -= sta_info_len + 2;
1048 pos += 2;
1049 sub_elem_len -= 2;
1051 /* Handle non-inheritance */
1052 non_inherit = get_ie_ext(pos, sub_elem_len,
1055 u8 non_inherit_len = non_inherit[1] - 1;
1058 * Do not include the Non-Inheritance element when
1064 sub_elem_len -= 3 + non_inherit_len;
1079 non_inherit_len -= 1 + non_inherit[0];
1098 res = __ieee802_11_parse_elems(pos, sub_elem_len,
1132 if (elem->datalen >= 4 &&
1133 WPA_GET_BE32(elem->data) == oui_type) {
1151 if (elem->datalen >= 4 && WPA_GET_BE32(elem->data) == oui_type)
1152 wpabuf_put_data(buf, elem->data + 4, elem->datalen - 4);
1164 * PS-Poll frames are 16 bytes. All other frames are
1170 fc = le_to_host16(hdr->frame_control);
1181 return hdr->addr1;
1183 return hdr->addr2;
1190 return hdr->addr1;
1192 return hdr->addr3;
1203 const char *pos;
1207 pos = name + 7;
1208 if (os_strncmp(pos, "be_", 3) == 0) {
1210 pos += 3;
1211 } else if (os_strncmp(pos, "bk_", 3) == 0) {
1213 pos += 3;
1214 } else if (os_strncmp(pos, "vi_", 3) == 0) {
1216 pos += 3;
1217 } else if (os_strncmp(pos, "vo_", 3) == 0) {
1219 pos += 3;
1221 wpa_printf(MSG_ERROR, "Unknown WMM name '%s'", pos);
1222 return -1;
1227 if (os_strcmp(pos, "aifs") == 0) {
1231 return -1;
1233 ac->aifs = v;
1234 } else if (os_strcmp(pos, "cwmin") == 0) {
1238 return -1;
1240 ac->cwmin = v;
1241 } else if (os_strcmp(pos, "cwmax") == 0) {
1245 return -1;
1247 ac->cwmax = v;
1248 } else if (os_strcmp(pos, "txop_limit") == 0) {
1252 return -1;
1254 ac->txop_limit = v;
1255 } else if (os_strcmp(pos, "acm") == 0) {
1259 return -1;
1261 ac->admission_control_mandatory = v;
1263 wpa_printf(MSG_ERROR, "Unknown wmm_ac_ field '%s'", pos);
1264 return -1;
1277 char *pos;
1280 pos = os_strchr(value, '.');
1282 if (pos) {
1283 pos++;
1284 if (*pos >= '0' && *pos <= '9')
1285 d = *pos - '0';
1305 const char *pos;
1309 pos = name + 9;
1310 if (os_strncmp(pos, "data", 4) == 0 &&
1311 pos[4] >= '0' && pos[4] <= '9' && pos[5] == '_') {
1312 num = pos[4] - '0';
1313 pos += 6;
1314 } else if (os_strncmp(pos, "after_beacon_", 13) == 0 ||
1315 os_strncmp(pos, "beacon_", 7) == 0) {
1319 wpa_printf(MSG_ERROR, "Unknown tx_queue name '%s'", pos);
1320 return -1;
1331 if (os_strcmp(pos, "aifs") == 0) {
1332 queue->aifs = atoi(val);
1333 if (queue->aifs < 0 || queue->aifs > 255) {
1335 queue->aifs);
1336 return -1;
1338 } else if (os_strcmp(pos, "cwmin") == 0) {
1339 queue->cwmin = atoi(val);
1340 if (!valid_cw(queue->cwmin)) {
1342 queue->cwmin);
1343 return -1;
1345 } else if (os_strcmp(pos, "cwmax") == 0) {
1346 queue->cwmax = atoi(val);
1347 if (!valid_cw(queue->cwmax)) {
1349 queue->cwmax);
1350 return -1;
1352 } else if (os_strcmp(pos, "burst") == 0) {
1353 queue->burst = hostapd_config_read_int10(val);
1355 wpa_printf(MSG_ERROR, "Unknown queue field '%s'", pos);
1356 return -1;
1373 * ieee80211_freq_to_channel_ext - Convert frequency into channel info
1376 * @sec_channel: 0 = non-HT40, 1 = sec. channel above, -1 = sec. channel below
1391 if (sec_channel > 1 || sec_channel < -1)
1395 if ((freq - 2407) % 5)
1404 else if (sec_channel == -1)
1409 *channel = (freq - 2407) / 5;
1425 if ((freq - 4000) % 5)
1427 *channel = (freq - 4000) / 5;
1449 if ((freq - 5000) % 5)
1456 else if (sec_channel == -1)
1461 *channel = (freq - 5000) / 5;
1468 if ((freq - 5000) % 5)
1475 else if (sec_channel == -1)
1480 *channel = (freq - 5000) / 5;
1487 if ((freq - 5000) % 5)
1494 else if (sec_channel == -1)
1499 *channel = (freq - 5000) / 5;
1506 if ((freq - 5000) % 5)
1513 else if (sec_channel == -1)
1518 *channel = (freq - 5000) / 5;
1524 if ((freq - 5000) % 5)
1526 *channel = (freq - 5000) / 5;
1532 if ((freq - 5950) % 5)
1556 *channel = (freq - 5950) / 5;
1562 *channel = (freq - 5925) / 5;
1574 *channel = (freq - 56160) / 2160;
1578 /* EDMG channels 9 - 13 */
1582 *channel = (freq - 56160) / 2160 + 8;
1586 /* EDMG channels 17 - 20 */
1590 *channel = (freq - 56160) / 2160 + 16;
1594 /* EDMG channels 25 - 27 */
1598 *channel = (freq - 56160) / 2160 + 24;
1655 return -1;
1670 "RO", "RS", "RU", "SE", "SI", "SK", "TR", "UA", "UK", NULL
1704 return -1;
1713 return -1;
1715 case 4: /* channels 100-144 */
1716 case 24: /* channels 100-140; 40 MHz */
1718 return -1;
1726 return -1;
1730 return -1;
1734 return -1;
1738 return -1;
1739 return 56160 + 2160 * (chan - 8);
1742 return -1;
1743 return 56160 + 2160 * (chan - 16);
1746 return -1;
1747 return 56160 + 2160 * (chan - 24);
1749 return -1;
1761 return -1;
1770 return -1;
1772 case 3: /* channels 100-140 */
1773 case 7: /* channels 100-132; 40 MHz */
1774 case 10: /* channels 104-136; 40 MHz */
1775 case 16: /* channels 100-140 */
1777 return -1;
1781 return -1;
1785 return -1;
1789 return -1;
1790 return 56160 + 2160 * (chan - 8);
1793 return -1;
1794 return 56160 + 2160 * (chan - 16);
1797 return -1;
1798 return 56160 + 2160 * (chan - 24);
1800 return -1;
1807 /* Table E-3 in IEEE Std 802.11-2020 - Operating classes in Japan */
1813 return -1;
1817 return -1;
1829 return -1;
1831 case 34: /* channels 100-144 */
1833 case 39: /* channels 100-140; 40 MHz */
1835 case 44: /* channels 104-144; 40 MHz */
1837 case 58: /* channels 100-144 */
1839 return -1;
1843 return -1;
1847 return -1;
1848 return 56160 + 2160 * (chan - 8);
1851 return -1;
1852 return 56160 + 2160 * (chan - 16);
1855 return -1;
1856 return 56160 + 2160 * (chan - 24);
1858 return -1;
1870 return -1;
1877 return -1;
1882 return -1;
1885 return -1;
1892 /* Table E-4 in IEEE Std 802.11-2020 - Global operating classes */
1897 return -1;
1902 return -1;
1907 return -1;
1916 return -1;
1918 case 121: /* channels 100-144 */
1919 case 122: /* channels 100-140; 40 MHz */
1920 case 123: /* channels 104-144; 40 MHz */
1922 return -1;
1926 return -1;
1932 return -1;
1937 return -1;
1941 return -1;
1950 return -1;
1955 return -1;
1958 return -1;
1962 return -1;
1963 return 56160 + 2160 * (chan - 8);
1966 return -1;
1967 return 56160 + 2160 * (chan - 16);
1970 return -1;
1971 return 56160 + 2160 * (chan - 24);
1973 return -1;
1978 * ieee80211_chan_to_freq - Convert channel info to frequency
1982 * Returns: Frequency in MHz or -1 if the specified channel is unknown
2038 * 802.11-2020: Table E-4 - Global operating classes
2049 /* Operating classes with "80+" behavior indication in Table E-4 */
2065 if (elems->supp_rates == NULL && elems->ext_supp_rates == NULL)
2068 for (i = 0; elems->supp_rates && i < elems->supp_rates_len; i++) {
2069 if (is_11b(elems->supp_rates[i]))
2075 for (i = 0; elems->ext_supp_rates && i < elems->ext_supp_rates_len;
2077 if (is_11b(elems->ext_supp_rates[i]))
2340 if (info->nof_ies >= MAX_NOF_MB_IES_SUPPORTED)
2344 elem->datalen + 2);
2345 info->ies[info->nof_ies].ie = elem->data;
2346 info->ies[info->nof_ies].ie_len = elem->datalen;
2347 info->nof_ies++;
2352 return -1;
2365 if (info->nof_ies) {
2369 for (i = 0; i < info->nof_ies; i++)
2370 mb_ies_size += 2 + info->ies[i].ie_len;
2374 for (i = 0; i < info->nof_ies; i++) {
2376 wpabuf_put_u8(mb_ies, info->ies[i].ie_len);
2378 info->ies[i].ie,
2379 info->ies[i].ie_len);
2411 * IEEE Std 802.11ax-2021, Table E-4 actually talks about channel center
2426 * operating classes listed here are used as 1-octet values.
2438 /* IEEE P802.11be/D5.0, Table E-4 (Global operating classes) */
2442 * IEEE Std 802.11ad-2012 and P802.ay/D5.0 60 GHz operating classes.
2443 * Class 180 has the legacy channels 1-6. Classes 181-183 include
2451 { -1, 0, 0, 0, 0, BW20, NO_P2P_SUPP }
2477 /* ieee80211_get_phy_type - Derive the phy type by freq and bandwidth */
2493 * get_ie - Fetch a specified information element from IEs buffer
2510 return &elem->id;
2517 * get_ie_ext - Fetch a specified extended information element from IEs buffer
2534 return &elem->id;
2545 if (elem->datalen >= 4 &&
2546 vendor_type == WPA_GET_BE32(elem->data))
2547 return &elem->id;
2587 /* Default profile is 1, when Multi-AP profile subelement is not
2589 multi_ap->profile = 1;
2592 u8 id = elem->id, elen = elem->datalen;
2593 const u8 *pos = elem->data;
2598 multi_ap->capability = *pos;
2602 "Multi-AP invalid Multi-AP subelement");
2609 "Multi-AP IE invalid Multi-AP profile subelement");
2613 multi_ap->profile = *pos;
2614 if (multi_ap->profile > MULTI_AP_PROFILE_MAX) {
2616 "Multi-AP IE with invalid profile 0x%02x",
2617 multi_ap->profile);
2622 if (multi_ap->profile < MULTI_AP_PROFILE_2) {
2624 "Multi-AP IE invalid profile to read VLAN IE");
2629 "Multi-AP IE invalid Multi-AP VLAN subelement");
2633 vlan_id = WPA_GET_LE16(pos);
2636 "Multi-AP IE invalid Multi-AP VLAN ID %d",
2640 multi_ap->vlanid = vlan_id;
2644 "Ignore unknown subelement %u in Multi-AP IE",
2652 (int) (multi_ap_ie + multi_ap_len -
2659 "Multi-AP element without Multi-AP Extension subelement");
2670 u8 *pos = buf;
2676 *pos++ = WLAN_EID_VENDOR_SPECIFIC;
2677 len_ptr = pos; /* Length field to be set at the end */
2678 pos++;
2679 WPA_PUT_BE24(pos, OUI_WFA);
2680 pos += 3;
2681 *pos++ = MULTI_AP_OUI_TYPE;
2683 /* Multi-AP Extension subelement */
2684 if (buf + len - pos < 3)
2686 *pos++ = MULTI_AP_SUB_ELEM_TYPE;
2687 *pos++ = 1; /* len */
2688 *pos++ = multi_ap->capability;
2690 /* Add Multi-AP Profile subelement only for R2 or newer configuration */
2691 if (multi_ap->profile >= MULTI_AP_PROFILE_2) {
2692 if (buf + len - pos < 3)
2694 *pos++ = MULTI_AP_PROFILE_SUB_ELEM_TYPE;
2695 *pos++ = 1;
2696 *pos++ = multi_ap->profile;
2699 /* Add Multi-AP Default 802.1Q Setting subelement only for backhaul BSS
2701 if (multi_ap->vlanid &&
2702 multi_ap->profile >= MULTI_AP_PROFILE_2 &&
2703 (multi_ap->capability & MULTI_AP_BACKHAUL_BSS)) {
2704 if (buf + len - pos < 4)
2706 *pos++ = MULTI_AP_VLAN_SUB_ELEM_TYPE;
2707 *pos++ = 2;
2708 WPA_PUT_LE16(pos, multi_ap->vlanid);
2709 pos += 2;
2712 *len_ptr = pos - len_ptr - 1;
2714 return pos - buf;
2853 while (op->op_class && op->op_class != op_class)
2856 if (!op->op_class)
2865 switch (map->bw) {
2908 return -1;
2920 if (center_idx_to_bw_6ghz((freq - 5950) / 5) < 0)
2939 if ((((freq - 5950) / 5) & 0x3) != 0x1)
2942 i = (freq - 5950 + 55) % 80;
2944 i = (freq - 5950 + 55) / 80;
2954 * get_6ghz_sec_channel - Get the relative position of the secondary channel
2957 * Returns: 1 = secondary channel above, -1 = secondary channel below
2971 if (((channel - 1) / 4) % 2)
2972 return -1;
2992 int ieee802_11_parse_candidate_list(const char *pos, u8 *nei_rep,
2999 * BSS Transition Candidate List Entries - Neighbor Report elements
3003 while (pos) {
3008 pos = os_strstr(pos, " neighbor=");
3009 if (!pos)
3014 return -1;
3016 pos += 10;
3022 if (hwaddr_aton(pos, nei_pos)) {
3024 return -1;
3027 pos += 17;
3028 if (*pos != ',') {
3030 return -1;
3032 pos++;
3034 val = strtol(pos, &endptr, 0);
3039 return -1;
3041 pos = endptr + 1;
3043 *nei_pos++ = atoi(pos); /* Operating Class */
3044 pos = os_strchr(pos, ',');
3045 if (pos == NULL) {
3047 return -1;
3049 pos++;
3051 *nei_pos++ = atoi(pos); /* Channel Number */
3052 pos = os_strchr(pos, ',');
3053 if (pos == NULL) {
3055 return -1;
3057 pos++;
3059 *nei_pos++ = atoi(pos); /* PHY Type */
3060 end = os_strchr(pos, ' ');
3061 tmp = os_strchr(pos, ',');
3066 pos = tmp + 1;
3067 end = os_strchr(pos, ' ');
3069 len = end - pos;
3071 len = os_strlen(pos);
3075 return -1;
3078 hexstr2bin(pos, nei_pos, len / 2) < 0) {
3081 return -1;
3084 pos = end;
3087 nei_start[1] = nei_pos - nei_start - 2;
3090 return nei_pos - nei_rep;
3136 edmg->channels = 0;
3137 edmg->bw_config = 0;
3144 edmg->channels = EDMG_CHANNEL_9_SUBCHANNELS;
3145 edmg->bw_config = EDMG_BW_CONFIG_5;
3148 edmg->channels = EDMG_CHANNEL_10_SUBCHANNELS;
3149 edmg->bw_config = EDMG_BW_CONFIG_5;
3152 edmg->channels = EDMG_CHANNEL_11_SUBCHANNELS;
3153 edmg->bw_config = EDMG_BW_CONFIG_5;
3156 edmg->channels = EDMG_CHANNEL_12_SUBCHANNELS;
3157 edmg->bw_config = EDMG_BW_CONFIG_5;
3160 edmg->channels = EDMG_CHANNEL_13_SUBCHANNELS;
3161 edmg->bw_config = EDMG_BW_CONFIG_5;
3165 edmg->channels = BIT(primary_channel - 1);
3166 edmg->bw_config = EDMG_BW_CONFIG_4;
3168 edmg->channels = 0;
3169 edmg->bw_config = 0;
3190 * Between this 4 groups, there is no subset relation - as a result of
3222 case 121: /* channels 100-144 */
3224 case 122: /* channels 100-140; 40 MHz */
3225 case 123: /* channels 104-144; 40 MHz */
3285 case 121: /* channels 100-144 */
3287 case 122: /* channels 100-140; 40 MHz */
3288 case 123: /* channels 104-144; 40 MHz */
3331 * chwidth_freq2_to_ch_width - Determine channel width as enum oper_chan_width
3334 * Returns: enum oper_chan_width, -1 on failure
3339 return -1;
3357 return -1;
3365 const u8 *pos, *end = data + len;
3374 buf = wpabuf_alloc_copy(data, min_defrag_len - 1);
3378 pos = &data[min_defrag_len - 1];
3379 len -= min_defrag_len - 1;
3380 while (len > 2 && pos[0] == WLAN_EID_FRAGMENT && pos[1]) {
3382 size_t elen = 2 + pos[1];
3384 if (elen > (size_t) (end - pos) || elen > len)
3386 ret = wpabuf_resize(&buf, pos[1]);
3393 wpabuf_put_data(buf, &pos[2], pos[1]);
3394 pos += elen;
3395 len -= elen;
3410 if (elem->datalen >= 2 &&
3411 (elem->data[1] & MULTI_LINK_CONTROL_TYPE_MASK) == type)
3412 return &elem->id;