Lines Matching +full:mode +full:- +full:flag

2  * Driver interaction with Linux nl80211/cfg80211 - Capabilities
3 * Copyright (c) 2002-2015, Jouni Malinen <j@w1.fi>
5 * Copyright (c) 2009-2010, Atheros Communications
17 #include "common/qca-vendor.h"
18 #include "common/qca-vendor-attr.h"
117 info->capa->flags |= WPA_DRIVER_FLAGS_AP;
120 info->capa->flags |= WPA_DRIVER_FLAGS_MESH;
123 info->capa->flags |= WPA_DRIVER_FLAGS_IBSS;
126 info->capa->flags |=
130 info->p2p_go_supported = 1;
133 info->p2p_client_supported = 1;
169 info->capa->flags |= WPA_DRIVER_FLAGS_RADAR;
196 info->p2p_concurrent = 1;
197 if (info->num_multichan_concurrent < num_channels)
198 info->num_multichan_concurrent = num_channels;
233 info->auth_supported = 1;
236 info->connect_supported = 1;
239 info->capa->sched_scan_supported = 1;
242 info->poll_command_supported = 1;
245 info->channel_switch_supported = 1;
248 info->set_qos_map_supported = 1;
251 info->update_ft_ies_supported = 1;
364 info->has_key_mgmt_iftype = 1;
370 info->drv->capa.key_mgmt_iftype[WPA_IF_IBSS] = key_mgmt;
373 info->drv->capa.key_mgmt_iftype[WPA_IF_STATION] =
377 info->drv->capa.key_mgmt_iftype[WPA_IF_AP_BSS] =
381 info->drv->capa.key_mgmt_iftype[WPA_IF_AP_VLAN] =
385 info->drv->capa.key_mgmt_iftype[WPA_IF_MESH] = key_mgmt;
388 info->drv->capa.key_mgmt_iftype[WPA_IF_P2P_CLIENT] =
392 info->drv->capa.key_mgmt_iftype[WPA_IF_P2P_GO] =
396 info->drv->capa.key_mgmt_iftype[WPA_IF_P2P_DEVICE] =
400 info->drv->capa.key_mgmt_iftype[WPA_IF_NAN] = key_mgmt;
430 info->has_key_mgmt = 1;
431 info->capa->key_mgmt = get_akm_suites_info(tb);
433 info->capa->key_mgmt);
451 wpa_printf(MSG_DEBUG, "nl80211: Supported cipher %02x-%02x-%02x:%d",
456 info->capa->enc |= WPA_DRIVER_CAPA_ENC_CCMP_256;
459 info->capa->enc |= WPA_DRIVER_CAPA_ENC_GCMP_256;
462 info->capa->enc |= WPA_DRIVER_CAPA_ENC_CCMP;
465 info->capa->enc |= WPA_DRIVER_CAPA_ENC_GCMP;
468 info->capa->enc |= WPA_DRIVER_CAPA_ENC_TKIP;
471 info->capa->enc |= WPA_DRIVER_CAPA_ENC_WEP104;
474 info->capa->enc |= WPA_DRIVER_CAPA_ENC_WEP40;
477 info->capa->enc |= WPA_DRIVER_CAPA_ENC_BIP;
480 info->capa->enc |= WPA_DRIVER_CAPA_ENC_BIP_GMAC_128;
483 info->capa->enc |= WPA_DRIVER_CAPA_ENC_BIP_GMAC_256;
486 info->capa->enc |= WPA_DRIVER_CAPA_ENC_BIP_CMAC_256;
489 info->capa->enc |= WPA_DRIVER_CAPA_ENC_GTK_NOT_USED;
500 capa->max_remain_on_chan = nla_get_u32(tb);
511 capa->flags |= WPA_DRIVER_FLAGS_TDLS_SUPPORT;
515 capa->flags |= WPA_DRIVER_FLAGS_TDLS_EXTERNAL_SETUP;
536 struct wpa_driver_capa *capa = info->capa;
547 capa->flags |= WPA_DRIVER_FLAGS_VHT_IBSS;
550 capa->rrm_flags |= WPA_DRIVER_FLAGS_SUPPORT_RRM;
553 capa->flags |= WPA_DRIVER_FLAGS_SUPPORT_FILS;
557 capa->flags |= WPA_DRIVER_FLAGS_BEACON_RATE_LEGACY;
561 capa->flags |= WPA_DRIVER_FLAGS_BEACON_RATE_HT;
565 capa->flags |= WPA_DRIVER_FLAGS_BEACON_RATE_VHT;
569 capa->flags2 |= WPA_DRIVER_FLAGS2_BEACON_RATE_HE;
573 capa->rrm_flags |= WPA_DRIVER_FLAGS_SUPPORT_SET_SCAN_DWELL;
581 capa->rrm_flags |= WPA_DRIVER_FLAGS_SUPPORT_BEACON_REPORT;
584 capa->flags |= WPA_DRIVER_FLAGS_MGMT_TX_RANDOM_TA;
587 capa->flags |= WPA_DRIVER_FLAGS_MGMT_TX_RANDOM_TA_CONNECTED;
590 capa->flags |= WPA_DRIVER_FLAGS_SCHED_SCAN_RELATIVE_RSSI;
593 capa->flags |= WPA_DRIVER_FLAGS_FILS_SK_OFFLOAD;
597 capa->flags |= WPA_DRIVER_FLAGS_4WAY_HANDSHAKE_PSK;
600 capa->flags |= WPA_DRIVER_FLAGS_4WAY_HANDSHAKE_8021X;
604 capa->flags2 |= WPA_DRIVER_FLAGS2_SAE_OFFLOAD_STA;
608 capa->flags |= WPA_DRIVER_FLAGS_MFP_OPTIONAL;
612 capa->flags |= WPA_DRIVER_FLAGS_DFS_OFFLOAD;
624 capa->flags |= WPA_DRIVER_FLAGS_OCE_STA;
629 capa->flags |= WPA_DRIVER_FLAGS_FTM_RESPONDER;
633 capa->flags |= WPA_DRIVER_FLAGS_CONTROL_PORT;
636 capa->flags2 |= WPA_DRIVER_FLAGS2_CONTROL_PORT_RX;
640 capa->flags2 |= WPA_DRIVER_FLAGS2_CONTROL_PORT_TX_STATUS;
644 capa->flags |= WPA_DRIVER_FLAGS_VLAN_OFFLOAD;
648 capa->flags |= WPA_DRIVER_FLAGS_SAFE_PTK0_REKEYS;
652 capa->flags |= WPA_DRIVER_FLAGS_BEACON_PROTECTION;
656 capa->flags |= WPA_DRIVER_FLAGS_EXTENDED_KEY_ID;
660 info->drv->multicast_registrations = 1;
664 info->drv->fils_discovery = 1;
668 info->drv->unsol_bcast_probe_resp = 1;
671 info->drv->puncturing = 1;
675 capa->flags2 |= WPA_DRIVER_FLAGS2_BEACON_PROTECTION_CLIENT;
679 capa->flags2 |= WPA_DRIVER_FLAGS2_OCV;
683 capa->flags2 |= WPA_DRIVER_FLAGS2_RADAR_BACKGROUND;
687 capa->flags2 |= WPA_DRIVER_FLAGS2_SEC_LTF_STA;
688 capa->flags2 |= WPA_DRIVER_FLAGS2_SEC_LTF_AP;
693 capa->flags2 |= WPA_DRIVER_FLAGS2_SEC_RTT_STA;
694 capa->flags2 |= WPA_DRIVER_FLAGS2_SEC_RTT_AP;
700 capa->flags2 |= WPA_DRIVER_FLAGS2_PROT_RANGE_NEG_STA;
701 capa->flags2 |= WPA_DRIVER_FLAGS2_PROT_RANGE_NEG_AP;
706 capa->flags2 |= WPA_DRIVER_FLAGS2_SCAN_MIN_PREQ;
710 capa->flags2 |= WPA_DRIVER_FLAGS2_4WAY_HANDSHAKE_AP_PSK;
714 capa->flags2 |= WPA_DRIVER_FLAGS2_OWE_OFFLOAD_STA;
718 capa->flags2 |= WPA_DRIVER_FLAGS2_OWE_OFFLOAD_AP;
722 capa->flags2 |= WPA_DRIVER_FLAGS2_SAE_OFFLOAD_AP;
730 struct wpa_driver_capa *capa = info->capa;
738 info->data_tx_status = 1;
741 capa->flags |= WPA_DRIVER_FLAGS_INACTIVITY_TIMER;
744 capa->flags |= WPA_DRIVER_FLAGS_SAE;
747 capa->flags |= WPA_DRIVER_FLAGS_OBSS_SCAN;
750 capa->flags |= WPA_DRIVER_FLAGS_HT_2040_COEX;
754 capa->flags |= WPA_DRIVER_FLAGS_TDLS_CHANNEL_SWITCH;
758 info->p2p_go_ctwindow_supported = 1;
761 info->have_low_prio_scan = 1;
764 info->mac_addr_rand_scan_supported = 1;
767 info->mac_addr_rand_sched_scan_supported = 1;
770 info->wmm_ac_supported = 1;
773 capa->rrm_flags |= WPA_DRIVER_FLAGS_DS_PARAM_SET_IE_IN_PROBES;
776 capa->rrm_flags |= WPA_DRIVER_FLAGS_WFA_TPC_IE_IN_PROBES;
779 capa->rrm_flags |= WPA_DRIVER_FLAGS_QUIET;
782 capa->rrm_flags |= WPA_DRIVER_FLAGS_TX_POWER_INSERTION;
785 capa->flags |= WPA_DRIVER_FLAGS_HT_IBSS;
788 capa->flags |= WPA_DRIVER_FLAGS_FULL_AP_CLIENT_STATE;
802 "mode");
803 capa->flags |= WPA_DRIVER_FLAGS_PROBE_RESP_OFFLOAD;
804 capa->probe_resp_offloads = probe_resp_offload_support(protocols);
821 capa->wowlan_triggers.any = 1;
823 capa->wowlan_triggers.disconnect = 1;
825 capa->wowlan_triggers.magic_pkt = 1;
827 capa->wowlan_triggers.gtk_rekey_failure = 1;
829 capa->wowlan_triggers.eap_identity_req = 1;
831 capa->wowlan_triggers.four_way_handshake = 1;
833 capa->wowlan_triggers.rfkill_release = 1;
843 if (!tb || drv->num_iface_capa == NL80211_IFTYPE_MAX)
858 capa = &drv->iface_capa[drv->num_iface_capa];
859 capa->iftype = nla_get_u32(tb1[NL80211_ATTR_IFTYPE]);
861 "nl80211: Driver-advertised extended capabilities for interface type %s",
862 nl80211_iftype_str(capa->iftype));
865 capa->ext_capa = os_memdup(nla_data(tb1[NL80211_ATTR_EXT_CAPA]),
867 if (!capa->ext_capa)
870 capa->ext_capa_len = len;
872 capa->ext_capa, capa->ext_capa_len);
875 capa->ext_capa_mask =
878 if (!capa->ext_capa_mask)
882 capa->ext_capa_mask, capa->ext_capa_len);
886 capa->eml_capa =
888 capa->mld_capa_and_ops =
894 capa->eml_capa, capa->mld_capa_and_ops);
896 drv->num_iface_capa++;
897 if (drv->num_iface_capa == NL80211_IFTYPE_MAX)
906 os_free(drv->iface_capa[i].ext_capa);
907 drv->iface_capa[i].ext_capa = NULL;
908 os_free(drv->iface_capa[i].ext_capa_mask);
909 drv->iface_capa[i].ext_capa_mask = NULL;
910 drv->iface_capa[i].ext_capa_len = 0;
912 drv->num_iface_capa = 0;
927 cap->mbssid_max_interfaces =
931 cap->ema_max_periodicity =
936 cap->mbssid_max_interfaces, cap->ema_max_periodicity);
945 struct wpa_driver_capa *capa = info->capa;
946 struct wpa_driver_nl80211_data *drv = info->drv;
952 drv->wiphy_idx = nla_get_u32(tb[NL80211_ATTR_WIPHY]);
955 os_strlcpy(drv->phyname,
957 sizeof(drv->phyname));
959 capa->max_scan_ssids =
963 capa->max_sched_scan_ssids =
969 capa->max_sched_scan_plans =
972 capa->max_sched_scan_plan_interval =
975 capa->max_sched_scan_plan_iterations =
980 capa->max_match_sets =
984 capa->max_acl_mac_addrs =
995 wpa_printf(MSG_DEBUG, "nl80211: Using driver-based "
996 "off-channel TX");
997 capa->flags |= WPA_DRIVER_FLAGS_OFFCHANNEL_TX;
1001 wpa_printf(MSG_DEBUG, "nl80211: Using driver-based roaming");
1002 capa->flags |= WPA_DRIVER_FLAGS_BSS_SELECTION;
1009 capa->flags |= WPA_DRIVER_FLAGS_AP_UAPSD;
1019 capa->flags2 |= WPA_DRIVER_FLAGS2_SA_QUERY_OFFLOAD_AP;
1021 info->device_ap_sme = 1;
1030 drv->extended_capa == NULL) {
1031 drv->extended_capa =
1033 if (drv->extended_capa) {
1034 os_memcpy(drv->extended_capa,
1037 drv->extended_capa_len =
1040 "nl80211: Driver-advertised extended capabilities (default)",
1041 drv->extended_capa, drv->extended_capa_len);
1043 drv->extended_capa_mask =
1045 if (drv->extended_capa_mask) {
1046 os_memcpy(drv->extended_capa_mask,
1050 "nl80211: Driver-advertised extended capabilities mask (default)",
1051 drv->extended_capa_mask,
1052 drv->extended_capa_len);
1054 os_free(drv->extended_capa);
1055 drv->extended_capa = NULL;
1056 drv->extended_capa_len = 0;
1073 if (vinfo->vendor_id == OUI_QCA) {
1074 switch (vinfo->subcmd) {
1076 drv->vendor_cmd_test_avail = 1;
1080 drv->roaming_vendor_cmd_avail = 1;
1083 drv->dfs_vendor_cmd_avail = 1;
1086 drv->get_features_vendor_cmd_avail = 1;
1089 drv->get_pref_freq_list = 1;
1092 drv->set_prob_oper_freq = 1;
1095 drv->capa.flags |=
1097 drv->qca_do_acs = 1;
1100 drv->setband_vendor_cmd_avail = 1;
1103 drv->scan_vendor_cmd_avail = 1;
1106 drv->set_wifi_conf_vendor_cmd_avail = 1;
1109 drv->fetch_bss_trans_status = 1;
1112 drv->roam_vendor_cmd_avail = 1;
1115 drv->add_sta_node_vendor_cmd_avail = 1;
1118 drv->get_sta_info_vendor_cmd_avail = 1;
1121 drv->secure_ranging_ctx_vendor_cmd_avail = 1;
1126 } else if (vinfo->vendor_id == OUI_BRCM) {
1127 switch (vinfo->subcmd) {
1129 drv->capa.flags |=
1133 drv->brcm_do_acs = 1;
1140 vinfo->vendor_id, vinfo->subcmd);
1156 vinfo->vendor_id, vinfo->subcmd);
1164 capa->max_stations =
1168 capa->max_csa_counters =
1172 capa->flags |= WPA_DRIVER_FLAGS_SELF_MANAGED_REGULATORY;
1175 capa->max_num_akms =
1182 capa->flags2 |= WPA_DRIVER_FLAGS2_MLO;
1196 info->capa = &drv->capa;
1197 info->drv = drv;
1202 msg = nl80211_cmd_msg(drv->first_bss, flags, NL80211_CMD_GET_WIPHY);
1205 return -1;
1209 return -1;
1211 if (info->auth_supported)
1212 drv->capa.flags |= WPA_DRIVER_FLAGS_SME;
1213 else if (!info->connect_supported) {
1216 info->error = 1;
1219 if (info->p2p_go_supported && info->p2p_client_supported)
1220 drv->capa.flags |= WPA_DRIVER_FLAGS_P2P_CAPABLE;
1221 if (info->p2p_concurrent) {
1224 drv->capa.flags |= WPA_DRIVER_FLAGS_P2P_CONCURRENT;
1225 drv->capa.flags |= WPA_DRIVER_FLAGS_P2P_MGMT_AND_NON_P2P;
1227 if (info->num_multichan_concurrent > 1) {
1228 wpa_printf(MSG_DEBUG, "nl80211: Enable multi-channel "
1230 drv->capa.num_multichan_concurrent =
1231 info->num_multichan_concurrent;
1233 if (drv->capa.flags & WPA_DRIVER_FLAGS_DEDICATED_P2P_DEVICE)
1237 if (!drv->capa.max_remain_on_chan)
1238 drv->capa.max_remain_on_chan = 5000;
1240 drv->capa.wmm_ac_supported = info->wmm_ac_supported;
1242 drv->capa.mac_addr_rand_sched_scan_supported =
1243 info->mac_addr_rand_sched_scan_supported;
1244 drv->capa.mac_addr_rand_scan_supported =
1245 info->mac_addr_rand_scan_supported;
1247 if (info->channel_switch_supported) {
1248 drv->capa.flags |= WPA_DRIVER_FLAGS_AP_CSA;
1249 if (!drv->capa.max_csa_counters)
1250 drv->capa.max_csa_counters = 1;
1253 if (!drv->capa.max_sched_scan_plans) {
1254 drv->capa.max_sched_scan_plans = 1;
1255 drv->capa.max_sched_scan_plan_interval = UINT32_MAX;
1256 drv->capa.max_sched_scan_plan_iterations = 0;
1259 if (info->update_ft_ies_supported)
1260 drv->capa.flags |= WPA_DRIVER_FLAGS_UPDATE_FT_IES;
1262 if (!drv->capa.max_num_akms)
1263 drv->capa.max_num_akms = NL80211_MAX_NR_AKM_SUITES;
1306 if (!drv->dfs_vendor_cmd_avail)
1319 drv->capa.flags |= WPA_DRIVER_FLAGS_DFS_OFFLOAD;
1350 info->flags = os_malloc(len);
1351 if (info->flags != NULL) {
1352 os_memcpy(info->flags, nla_data(attr), len);
1353 info->flags_len = len;
1358 info->capa->conc_capab = nla_get_u32(attr);
1363 info->capa->max_conc_chan_2_4 = nla_get_u32(attr);
1368 info->capa->max_conc_chan_5_0 = nla_get_u32(attr);
1380 return (idx < info->flags_len) &&
1381 (info->flags[idx] & BIT(feature % 8));
1391 if (!drv->get_features_vendor_cmd_avail)
1403 info.capa = &drv->capa;
1409 drv->capa.flags |= WPA_DRIVER_FLAGS_KEY_MGMT_OFFLOAD;
1412 drv->capa.flags |= WPA_DRIVER_FLAGS_SUPPORT_HW_MODE_ANY;
1416 drv->capa.flags |= WPA_DRIVER_FLAGS_OFFCHANNEL_SIMULTANEOUS;
1418 drv->capa.flags |= WPA_DRIVER_FLAGS_P2P_LISTEN_OFFLOAD;
1420 drv->capa.flags |= WPA_DRIVER_FLAGS_OCE_STA;
1422 drv->capa.flags |= WPA_DRIVER_FLAGS_OCE_AP;
1424 drv->capa.flags |= WPA_DRIVER_FLAGS_OCE_STA_CFON;
1426 drv->capa.flags2 |= WPA_DRIVER_FLAGS2_SEC_LTF_STA;
1428 drv->capa.flags2 |= WPA_DRIVER_FLAGS2_SEC_LTF_AP;
1430 drv->capa.flags2 |= WPA_DRIVER_FLAGS2_SEC_RTT_STA;
1432 drv->capa.flags2 |= WPA_DRIVER_FLAGS2_SEC_RTT_AP;
1436 drv->capa.flags2 |= WPA_DRIVER_FLAGS2_PROT_RANGE_NEG_STA;
1440 drv->capa.flags2 |= WPA_DRIVER_FLAGS2_PROT_RANGE_NEG_AP;
1443 drv->qca_ap_allowed_freqs = 1;
1445 drv->capa.flags2 |= WPA_DRIVER_FLAGS2_HT_VHT_TWT_RESPONDER;
1458 return -1;
1461 return -1;
1463 drv->has_capability = 1;
1464 drv->has_driver_key_mgmt = info.has_key_mgmt | info.has_key_mgmt_iftype;
1468 if (!drv->has_driver_key_mgmt) {
1469 drv->capa.key_mgmt = WPA_DRIVER_CAPA_KEY_MGMT_WPA |
1477 if (drv->capa.enc & (WPA_DRIVER_CAPA_ENC_CCMP_256 |
1479 drv->capa.key_mgmt |=
1482 if (drv->capa.flags & WPA_DRIVER_FLAGS_SME)
1483 drv->capa.key_mgmt |=
1489 else if (drv->capa.flags & WPA_DRIVER_FLAGS_FILS_SK_OFFLOAD)
1490 drv->capa.key_mgmt |=
1500 drv->capa.key_mgmt_iftype[i] = drv->capa.key_mgmt;
1506 drv->capa.key_mgmt = 0;
1508 drv->capa.key_mgmt |= drv->capa.key_mgmt_iftype[i];
1516 if (!drv->capa.key_mgmt_iftype[i])
1517 drv->capa.key_mgmt_iftype[i] =
1518 drv->capa.key_mgmt;
1521 drv->capa.auth = WPA_DRIVER_AUTH_OPEN |
1525 drv->capa.flags |= WPA_DRIVER_FLAGS_VALID_ERROR_CODES;
1526 drv->capa.flags |= WPA_DRIVER_FLAGS_SET_KEYS_AFTER_ASSOC_DONE;
1527 drv->capa.flags |= WPA_DRIVER_FLAGS_EAPOL_TX_STATUS;
1534 * this flag can/should always be set for cfg80211 drivers.
1536 drv->capa.flags |= WPA_DRIVER_FLAGS_AP_TEARDOWN_SUPPORT;
1539 drv->capa.flags |= WPA_DRIVER_FLAGS_DEAUTH_TX_STATUS;
1540 drv->capa.flags2 |= WPA_DRIVER_FLAGS2_AP_SME;
1546 drv->capa.flags |= WPA_DRIVER_FLAGS_AP_MLME;
1549 drv->device_ap_sme = info.device_ap_sme;
1550 drv->poll_command_supported = info.poll_command_supported;
1551 drv->data_tx_status = info.data_tx_status;
1552 drv->p2p_go_ctwindow_supported = info.p2p_go_ctwindow_supported;
1554 drv->capa.flags |= WPA_DRIVER_FLAGS_QOS_MAPPING;
1555 drv->have_low_prio_scan = info.have_low_prio_scan;
1561 drv->use_monitor = !info.device_ap_sme &&
1569 if (!drv->use_monitor && !info.data_tx_status)
1570 drv->capa.flags &= ~WPA_DRIVER_FLAGS_EAPOL_TX_STATUS;
1573 if (!(info.capa->flags & WPA_DRIVER_FLAGS_DFS_OFFLOAD))
1584 if (!(drv->capa.flags & WPA_DRIVER_FLAGS_OFFCHANNEL_TX))
1585 drv->capa.flags &= ~WPA_DRIVER_FLAGS_OFFCHANNEL_SIMULTANEOUS;
1590 drv->capa.key_mgmt, drv->capa.enc, drv->capa.auth,
1591 (unsigned long long) drv->capa.flags,
1592 (unsigned long long) drv->capa.flags2, drv->capa.rrm_flags,
1593 drv->capa.probe_resp_offloads, drv->capa.max_stations,
1594 drv->capa.max_remain_on_chan, drv->capa.max_scan_ssids);
1607 static void phy_info_ht_capa(struct hostapd_hw_modes *mode, struct nlattr *capa,
1613 mode->ht_capab = nla_get_u16(capa);
1616 mode->a_mpdu_params |= nla_get_u8(ampdu_factor) & 0x03;
1619 mode->a_mpdu_params |= nla_get_u8(ampdu_density) << 2;
1624 os_memcpy(mode->mcs_set, mcs, 16);
1629 static void phy_info_vht_capa(struct hostapd_hw_modes *mode,
1634 mode->vht_capab = nla_get_u32(capa);
1639 os_memcpy(mode->vht_mcs_set, mcs, 8);
1644 static int phy_info_edmg_capa(struct hostapd_hw_modes *mode,
1651 mode->edmg.bw_config = nla_get_u8(bw_config);
1652 mode->edmg.channels = nla_get_u8(channels);
1654 if (!mode->edmg.channels || !mode->edmg.bw_config)
1675 static void phy_info_freq(struct hostapd_hw_modes *mode,
1682 chan->freq = nla_get_u32(tb_freq[NL80211_FREQUENCY_ATTR_FREQ]);
1683 chan->flag = 0;
1684 chan->allowed_bw = ~0;
1685 chan->dfs_cac_ms = 0;
1686 if (ieee80211_freq_to_chan(chan->freq, &channel) != NUM_HOSTAPD_MODES)
1687 chan->chan = channel;
1691 chan->freq);
1694 chan->flag |= HOSTAPD_CHAN_DISABLED;
1696 chan->flag |= HOSTAPD_CHAN_NO_IR;
1698 chan->flag |= HOSTAPD_CHAN_RADAR;
1700 chan->flag |= HOSTAPD_CHAN_INDOOR_ONLY;
1702 chan->flag |= HOSTAPD_CHAN_GO_CONCURRENT;
1705 chan->allowed_bw &= ~HOSTAPD_CHAN_WIDTH_10;
1707 chan->allowed_bw &= ~HOSTAPD_CHAN_WIDTH_20;
1709 chan->allowed_bw &= ~HOSTAPD_CHAN_WIDTH_40P;
1711 chan->allowed_bw &= ~HOSTAPD_CHAN_WIDTH_40M;
1713 chan->allowed_bw &= ~HOSTAPD_CHAN_WIDTH_80;
1715 chan->allowed_bw &= ~HOSTAPD_CHAN_WIDTH_160;
1723 chan->flag |= HOSTAPD_CHAN_DFS_USABLE;
1726 chan->flag |= HOSTAPD_CHAN_DFS_AVAILABLE;
1729 chan->flag |= HOSTAPD_CHAN_DFS_UNAVAILABLE;
1735 chan->dfs_cac_ms = nla_get_u32(
1739 chan->wmm_rules_valid = 0;
1773 ac = nl_wmm->nla_type;
1781 chan->wmm_rules[ac].min_cwmin =
1784 chan->wmm_rules[ac].min_cwmax =
1787 chan->wmm_rules[ac].min_aifs =
1789 chan->wmm_rules[ac].max_txop =
1794 /* Set valid flag if all the AC rules are present */
1796 chan->wmm_rules_valid = 1;
1802 struct hostapd_hw_modes *mode, struct nlattr *tb)
1835 channel = os_realloc_array(mode->channels,
1836 mode->num_channels + new_channels,
1841 mode->channels = channel;
1842 mode->num_channels += new_channels;
1844 idx = phy_info->last_chan_idx;
1851 phy_info_freq(mode, &mode->channels[idx], tb_freq);
1854 phy_info->last_chan_idx = idx;
1860 static int phy_info_rates(struct hostapd_hw_modes *mode, struct nlattr *tb)
1880 mode->num_rates++;
1883 mode->rates = os_calloc(mode->num_rates, sizeof(int));
1884 if (!mode->rates)
1895 mode->rates[idx] = nla_get_u32(
1904 static void phy_info_iftype_copy(struct hostapd_hw_modes *mode,
1910 struct he_capabilities *he_capab = &mode->he_capab[opmode];
1911 struct eht_capabilities *eht_capab = &mode->eht_capab[opmode];
1933 he_capab->he_supported = 1;
1938 if (len > sizeof(he_capab->phy_cap))
1939 len = sizeof(he_capab->phy_cap);
1940 os_memcpy(he_capab->phy_cap,
1948 if (len > sizeof(he_capab->mac_cap))
1949 len = sizeof(he_capab->mac_cap);
1950 os_memcpy(he_capab->mac_cap,
1958 if (len > sizeof(he_capab->mcs))
1959 len = sizeof(he_capab->mcs);
1960 os_memcpy(he_capab->mcs,
1968 if (len > sizeof(he_capab->ppet))
1969 len = sizeof(he_capab->ppet);
1970 os_memcpy(&he_capab->ppet,
1979 he_capab->he_6ghz_capa = le_to_host16(capa);
1986 eht_capab->eht_supported = true;
1993 eht_capab->mac_cap = WPA_GET_LE16(pos);
1998 if (len > sizeof(eht_capab->phy_cap))
1999 len = sizeof(eht_capab->phy_cap);
2000 os_memcpy(eht_capab->phy_cap,
2007 if (len > sizeof(eht_capab->mcs))
2008 len = sizeof(eht_capab->mcs);
2009 os_memcpy(eht_capab->mcs,
2016 if (len > sizeof(eht_capab->ppet))
2017 len = sizeof(eht_capab->ppet);
2018 os_memcpy(&eht_capab->ppet,
2025 static int phy_info_iftype(struct hostapd_hw_modes *mode,
2043 phy_info_iftype_copy(mode, i, tb, tb_flags);
2052 struct hostapd_hw_modes *mode;
2055 if (phy_info->last_mode != nl_band->nla_type) {
2056 mode = os_realloc_array(phy_info->modes,
2057 *phy_info->num_modes + 1,
2058 sizeof(*mode));
2059 if (!mode) {
2060 phy_info->failed = 1;
2063 phy_info->modes = mode;
2065 mode = &phy_info->modes[*(phy_info->num_modes)];
2066 os_memset(mode, 0, sizeof(*mode));
2067 mode->mode = NUM_HOSTAPD_MODES;
2068 mode->flags = HOSTAPD_MODE_FLAG_HT_INFO_KNOWN |
2078 mode->vht_mcs_set[0] = 0xff;
2079 mode->vht_mcs_set[1] = 0xff;
2080 mode->vht_mcs_set[4] = 0xff;
2081 mode->vht_mcs_set[5] = 0xff;
2083 *(phy_info->num_modes) += 1;
2084 phy_info->last_mode = nl_band->nla_type;
2085 phy_info->last_chan_idx = 0;
2087 mode = &phy_info->modes[*(phy_info->num_modes) - 1];
2092 phy_info_ht_capa(mode, tb_band[NL80211_BAND_ATTR_HT_CAPA],
2096 phy_info_vht_capa(mode, tb_band[NL80211_BAND_ATTR_VHT_CAPA],
2098 ret = phy_info_edmg_capa(mode,
2102 ret = phy_info_freqs(phy_info, mode,
2105 ret = phy_info_rates(mode, tb_band[NL80211_BAND_ATTR_RATES]);
2107 phy_info->failed = 1;
2118 ret = phy_info_iftype(mode, nl_iftype);
2158 struct hostapd_hw_modes *mode11g = NULL, *nmodes, *mode;
2159 int i, mode11g_idx = -1;
2172 modes[m].mode = HOSTAPD_MODE_IEEE80211B;
2175 modes[m].mode = HOSTAPD_MODE_IEEE80211G;
2180 modes[m].mode = HOSTAPD_MODE_IEEE80211AD;
2182 modes[m].mode = HOSTAPD_MODE_IEEE80211A;
2185 modes[m].mode = HOSTAPD_MODE_IEEE80211A;
2192 if (modes[m].mode == NUM_HOSTAPD_MODES) {
2194 "nl80211: Remove unsupported mode");
2200 (*num_modes - (m + 1)));
2201 (*num_modes)--;
2207 /* If only 802.11g mode is included, use it to construct matching
2208 * 802.11b mode data. */
2211 if (modes[m].mode == HOSTAPD_MODE_IEEE80211B)
2213 if (modes[m].mode == HOSTAPD_MODE_IEEE80211G)
2222 return modes; /* Could not add 802.11b mode */
2224 mode = &nmodes[*num_modes];
2225 os_memset(mode, 0, sizeof(*mode));
2229 mode->mode = HOSTAPD_MODE_IEEE80211B;
2232 mode->num_channels = mode11g->num_channels;
2233 mode->channels = os_memdup(mode11g->channels,
2234 mode11g->num_channels *
2236 if (mode->channels == NULL) {
2237 (*num_modes)--;
2238 return modes; /* Could not add 802.11b mode */
2241 mode->num_rates = 0;
2242 mode->rates = os_malloc(4 * sizeof(int));
2243 if (mode->rates == NULL) {
2244 os_free(mode->channels);
2245 (*num_modes)--;
2246 return modes; /* Could not add 802.11b mode */
2249 for (i = 0; i < mode11g->num_rates; i++) {
2250 if (mode11g->rates[i] != 10 && mode11g->rates[i] != 20 &&
2251 mode11g->rates[i] != 55 && mode11g->rates[i] != 110)
2253 mode->rates[mode->num_rates] = mode11g->rates[i];
2254 mode->num_rates++;
2255 if (mode->num_rates == 4)
2259 if (mode->num_rates == 0) {
2260 os_free(mode->channels);
2261 os_free(mode->rates);
2262 (*num_modes)--;
2266 wpa_printf(MSG_DEBUG, "nl80211: Added 802.11b mode based on 802.11g "
2273 static void nl80211_set_ht40_mode(struct hostapd_hw_modes *mode, int start,
2278 for (c = 0; c < mode->num_channels; c++) {
2279 struct hostapd_channel_data *chan = &mode->channels[c];
2280 if (chan->freq - 10 >= start && chan->freq + 10 <= end)
2281 chan->flag |= HOSTAPD_CHAN_HT40;
2286 static void nl80211_set_ht40_mode_sec(struct hostapd_hw_modes *mode, int start,
2291 for (c = 0; c < mode->num_channels; c++) {
2292 struct hostapd_channel_data *chan = &mode->channels[c];
2293 if (!(chan->flag & HOSTAPD_CHAN_HT40))
2295 if (chan->freq - 30 >= start && chan->freq - 10 <= end)
2296 chan->flag |= HOSTAPD_CHAN_HT40MINUS;
2297 if (chan->freq + 10 >= start && chan->freq + 30 <= end)
2298 chan->flag |= HOSTAPD_CHAN_HT40PLUS;
2308 for (m = 0; m < *results->num_modes; m++) {
2310 struct hostapd_hw_modes *mode = &results->modes[m];
2312 for (c = 0; c < mode->num_channels; c++) {
2313 struct hostapd_channel_data *chan = &mode->channels[c];
2314 if ((u32) chan->freq - 10 >= start &&
2315 (u32) chan->freq + 10 <= end)
2316 chan->max_tx_power = max_eirp;
2327 for (m = 0; m < *results->num_modes; m++) {
2328 if (!(results->modes[m].ht_capab &
2331 nl80211_set_ht40_mode(&results->modes[m], start, end);
2354 for (m = 0; m < *results->num_modes; m++) {
2355 if (!(results->modes[m].ht_capab &
2358 nl80211_set_ht40_mode_sec(&results->modes[m], start, end);
2363 static void nl80211_set_vht_mode(struct hostapd_hw_modes *mode, int start,
2368 for (c = 0; c < mode->num_channels; c++) {
2369 struct hostapd_channel_data *chan = &mode->channels[c];
2371 if (chan->freq - 10 < start || chan->freq + 10 > end)
2375 chan->flag |= HOSTAPD_CHAN_VHT_80MHZ_SUBCHANNEL;
2378 chan->flag |= HOSTAPD_CHAN_VHT_160MHZ_SUBCHANNEL;
2401 for (m = 0; m < *results->num_modes; m++) {
2402 if (!(results->modes[m].ht_capab &
2406 if (!results->modes[m].vht_capab)
2409 nl80211_set_vht_mode(&results->modes[m], start, end, max_bw);
2414 static void nl80211_set_6ghz_mode(struct hostapd_hw_modes *mode, int start,
2419 for (c = 0; c < mode->num_channels; c++) {
2420 struct hostapd_channel_data *chan = &mode->channels[c];
2422 if (chan->freq - 10 < start || chan->freq + 10 > end)
2426 chan->flag |= HOSTAPD_CHAN_VHT_80MHZ_SUBCHANNEL;
2429 chan->flag |= HOSTAPD_CHAN_VHT_160MHZ_SUBCHANNEL;
2432 chan->flag |= HOSTAPD_CHAN_EHT_320MHZ_SUBCHANNEL;
2455 for (m = 0; m < *results->num_modes; m++) {
2456 if (results->modes[m].num_channels == 0 ||
2457 !is_6ghz_freq(results->modes[m].channels[0].freq))
2460 nl80211_set_6ghz_mode(&results->modes[m], start, end, max_bw);
2483 return "DFS-UNSET";
2485 return "DFS-FCC";
2487 return "DFS-ETSI";
2489 return "DFS-JP";
2491 return "DFS-invalid";
2525 nl80211_set_dfs_domain(dfs_domain, &results->dfs_domain);
2526 wpa_printf(MSG_DEBUG, "nl80211: Regulatory information - country=%s (%s)",
2530 wpa_printf(MSG_DEBUG, "nl80211: Regulatory information - country=%s",
2551 wpa_printf(MSG_DEBUG, "nl80211: %u-%u @ %u MHz %u mBm%s%s%s%s%s%s%s%s",
2601 return -ENOMEM;
2604 if (drv->capa.flags & WPA_DRIVER_FLAGS_SELF_MANAGED_REGULATORY) {
2605 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, drv->wiphy_idx)) {
2607 return -1;
2615 static const char * modestr(enum hostapd_hw_mode mode)
2617 switch (mode) {
2642 struct hostapd_hw_modes *mode = &modes[i];
2648 for (j = 0; j < mode->num_channels; j++) {
2649 struct hostapd_channel_data *chan = &mode->channels[j];
2651 if (is_6ghz_freq(chan->freq))
2652 drv->uses_6ghz = true;
2653 if (chan->freq >= 900 && chan->freq < 1000)
2654 drv->uses_s1g = true;
2655 res = os_snprintf(pos, end - pos, " %d%s%s%s",
2656 chan->freq,
2657 (chan->flag & HOSTAPD_CHAN_DISABLED) ?
2659 (chan->flag & HOSTAPD_CHAN_NO_IR) ?
2661 (chan->flag & HOSTAPD_CHAN_RADAR) ?
2663 if (os_snprintf_error(end - pos, res))
2669 wpa_printf(MSG_DEBUG, "nl80211: Mode IEEE %s:%s",
2670 modestr(mode->mode), str);
2681 struct wpa_driver_nl80211_data *drv = bss->drv;
2687 .last_mode = -1,