Home | History | Annotate | Download | only in ap

Lines Matching defs:hapd

37 static u8 * hostapd_eid_rm_enabled_capab(struct hostapd_data *hapd, u8 *eid,
43 if (hapd->conf->radio_measurements[i])
52 os_memcpy(eid, hapd->conf->radio_measurements, RRM_CAPABILITIES_IE_LEN);
58 static u8 * hostapd_eid_bss_load(struct hostapd_data *hapd, u8 *eid, size_t len)
64 if (hapd->conf->bss_load_test_set) {
67 os_memcpy(eid, hapd->conf->bss_load_test, 5);
72 if (hapd->conf->bss_load_update_period) {
75 WPA_PUT_LE16(eid, hapd->num_sta);
77 *eid++ = hapd->iface->channel_utilization;
85 static u8 ieee802_11_erp_info(struct hostapd_data *hapd)
89 if (hapd->iface->current_mode == NULL ||
90 hapd->iface->current_mode->mode != HOSTAPD_MODE_IEEE80211G)
93 if (hapd->iface->olbc)
95 if (hapd->iface->num_sta_non_erp > 0) {
99 if (hapd->iface->num_sta_no_short_preamble > 0 ||
100 hapd->iconf->preamble == LONG_PREAMBLE)
107 static u8 * hostapd_eid_ds_params(struct hostapd_data *hapd, u8 *eid)
111 *eid++ = hapd->iconf->channel;
116 static u8 * hostapd_eid_erp_info(struct hostapd_data *hapd, u8 *eid)
118 if (hapd->iface->current_mode == NULL ||
119 hapd->iface->current_mode->mode != HOSTAPD_MODE_IEEE80211G)
134 *eid++ = ieee802_11_erp_info(hapd);
140 static u8 * hostapd_eid_pwr_constraint(struct hostapd_data *hapd, u8 *eid)
146 if (hapd->iface->current_mode == NULL ||
147 hapd->iface->current_mode->mode != HOSTAPD_MODE_IEEE80211A)
151 if (hapd->iface->drv_flags & WPA_DRIVER_FLAGS_DFS_OFFLOAD)
158 if (!hapd->iconf->ieee80211h &&
159 hapd->iconf->local_pwr_constraint == -1)
163 dfs = hostapd_is_dfs_required(hapd->iface);
170 if (dfs == 0 && hapd->iconf->local_pwr_constraint == -1)
181 if (hapd->iconf->local_pwr_constraint == -1)
202 *pos++ = hapd->iconf->local_pwr_constraint;
226 static u8 * hostapd_eid_country(struct hostapd_data *hapd, u8 *eid,
236 if (!hapd->iconf->ieee80211d || max_len < 6 ||
237 hapd->iface->current_mode == NULL)
242 os_memcpy(pos, hapd->iconf->country, 3); /* e.g., 'US ' */
245 mode = hapd->iface->current_mode;
288 static u8 * hostapd_eid_wpa(struct hostapd_data *hapd, u8 *eid, size_t len)
293 ie = wpa_auth_get_wpa_ie(hapd->wpa_auth, &ielen);
302 static u8 * hostapd_eid_csa(struct hostapd_data *hapd, u8 *eid)
305 if (hapd->iface->cs_oper_class && hapd->iconf->ecsa_ie_only)
309 if (!hapd->cs_freq_params.channel)
314 *eid++ = hapd->cs_block_tx;
315 *eid++ = hapd->cs_freq_params.channel;
316 *eid++ = hapd->cs_count;
322 static u8 * hostapd_eid_ecsa(struct hostapd_data *hapd, u8 *eid)
324 if (!hapd->cs_freq_params.channel || !hapd->iface->cs_oper_class)
329 *eid++ = hapd->cs_block_tx;
330 *eid++ = hapd->iface->cs_oper_class;
331 *eid++ = hapd->cs_freq_params.channel;
332 *eid++ = hapd->cs_count;
338 static u8 * hostapd_eid_supported_op_classes(struct hostapd_data *hapd, u8 *eid)
342 if (!(hapd->iface->drv_flags & WPA_DRIVER_FLAGS_AP_CSA) ||
343 !hapd->iface->freq)
346 if (ieee80211_freq_to_channel_ext(hapd->iface->freq,
347 hapd->iconf->secondary_channel,
348 hapd->iconf->vht_oper_chwidth,
366 static u8 * hostapd_gen_probe_resp(struct hostapd_data *hapd,
377 if (hapd->wps_probe_resp_ie)
378 buflen += wpabuf_len(hapd->wps_probe_resp_ie);
381 if (hapd->p2p_probe_resp_ie)
382 buflen += wpabuf_len(hapd->p2p_probe_resp_ie);
385 if (hapd->iface->fst_ies)
386 buflen += wpabuf_len(hapd->iface->fst_ies);
388 if (hapd->conf->vendor_elements)
389 buflen += wpabuf_len(hapd->conf->vendor_elements);
390 if (hapd->conf->vendor_vht) {
396 if (hapd->iconf->ieee80211ax) {
402 buflen += hostapd_mbo_ie_len(hapd);
414 os_memcpy(resp->sa, hapd->own_addr, ETH_ALEN);
416 os_memcpy(resp->bssid, hapd->own_addr, ETH_ALEN);
418 host_to_le16(hapd->iconf->beacon_int);
422 host_to_le16(hostapd_own_capab_info(hapd));
426 *pos++ = hapd->conf->ssid.ssid_len;
427 os_memcpy(pos, hapd->conf->ssid.ssid, hapd->conf->ssid.ssid_len);
428 pos += hapd->conf->ssid.ssid_len;
431 pos = hostapd_eid_supp_rates(hapd, pos);
434 pos = hostapd_eid_ds_params(hapd, pos);
436 pos = hostapd_eid_country(hapd, pos, epos - pos);
439 pos = hostapd_eid_pwr_constraint(hapd, pos);
442 csa_pos = hostapd_eid_csa(hapd, pos);
444 hapd->cs_c_off_proberesp = csa_pos - (u8 *) resp - 1;
448 pos = hostapd_eid_erp_info(hapd, pos);
451 pos = hostapd_eid_ext_supp_rates(hapd, pos);
454 pos = hostapd_eid_wpa(hapd, pos, epos - pos);
456 pos = hostapd_eid_bss_load(hapd, pos, epos - pos);
458 pos = hostapd_eid_rm_enabled_capab(hapd, pos, epos - pos);
461 csa_pos = hostapd_eid_ecsa(hapd, pos);
463 hapd->cs_c_off_ecsa_proberesp = csa_pos - (u8 *) resp - 1;
466 pos = hostapd_eid_supported_op_classes(hapd, pos);
471 pos = hostapd_eid_secondary_channel(hapd, pos);
473 pos = hostapd_eid_ht_capabilities(hapd, pos);
474 pos = hostapd_eid_ht_operation(hapd, pos);
477 pos = hostapd_eid_ext_capab(hapd, pos);
479 pos = hostapd_eid_time_adv(hapd, pos);
480 pos = hostapd_eid_time_zone(hapd, pos);
482 pos = hostapd_eid_interworking(hapd, pos);
483 pos = hostapd_eid_adv_proto(hapd, pos);
484 pos = hostapd_eid_roaming_consortium(hapd, pos);
487 if (hapd->iface->fst_ies) {
488 os_memcpy(pos, wpabuf_head(hapd->iface->fst_ies),
489 wpabuf_len(hapd->iface->fst_ies));
490 pos += wpabuf_len(hapd->iface->fst_ies);
495 if (hapd->iconf->ieee80211ac && !hapd->conf->disable_11ac) {
496 pos = hostapd_eid_vht_capabilities(hapd, pos, 0);
497 pos = hostapd_eid_vht_operation(hapd, pos);
498 pos = hostapd_eid_txpower_envelope(hapd, pos);
499 pos = hostapd_eid_wb_chsw_wrapper(hapd, pos);
503 pos = hostapd_eid_fils_indic(hapd, pos, 0);
506 if (hapd->conf->vendor_vht)
507 pos = hostapd_eid_vendor_vht(hapd, pos);
511 if (hapd->iconf->ieee80211ax) {
512 pos = hostapd_eid_vendor_he_capab(hapd, pos);
513 pos = hostapd_eid_vendor_he_operation(hapd, pos);
518 pos = hostapd_eid_wmm(hapd, pos);
521 if (hapd->conf->wps_state && hapd->wps_probe_resp_ie) {
522 os_memcpy(pos, wpabuf_head(hapd->wps_probe_resp_ie),
523 wpabuf_len(hapd->wps_probe_resp_ie));
524 pos += wpabuf_len(hapd->wps_probe_resp_ie);
529 if ((hapd->conf->p2p & P2P_ENABLED) && is_p2p &&
530 hapd->p2p_probe_resp_ie) {
531 os_memcpy(pos, wpabuf_head(hapd->p2p_probe_resp_ie),
532 wpabuf_len(hapd->p2p_probe_resp_ie));
533 pos += wpabuf_len(hapd->p2p_probe_resp_ie);
537 if ((hapd->conf->p2p & (P2P_MANAGE | P2P_ENABLED | P2P_GROUP_OWNER)) ==
539 pos = hostapd_eid_p2p_manage(hapd, pos);
543 pos = hostapd_eid_hs20_indication(hapd, pos);
544 pos = hostapd_eid_osen(hapd, pos);
547 pos = hostapd_eid_mbo(hapd, pos, (u8 *) resp + buflen - pos);
549 if (hapd->conf->vendor_elements) {
550 os_memcpy(pos, wpabuf_head(hapd->conf->vendor_elements),
551 wpabuf_len(hapd->conf->vendor_elements));
552 pos += wpabuf_len(hapd->conf->vendor_elements);
566 static enum ssid_match_result ssid_match(struct hostapd_data *hapd,
576 if (ssid_len == hapd->conf->ssid.ssid_len &&
577 os_memcmp(ssid, hapd->conf->ssid.ssid, ssid_len) == 0)
590 if (pos[1] == hapd->conf->ssid.ssid_len &&
591 os_memcmp(pos + 2, hapd->conf->ssid.ssid, pos[1]) == 0)
682 struct hostapd_data *hapd = NULL;
686 hapd = iface->bss[j];
687 if (os_strcmp(ifname, hapd->conf->iface) == 0)
689 hapd = NULL;
692 if (hapd && sta_track_get(iface, addr))
693 return hapd;
717 void handle_probe_req(struct hostapd_data *hapd,
735 if (hapd->iconf->track_sta_max_num)
736 sta_track_add(hapd->iface, mgmt->sa, ssi_signal);
739 for (i = 0; hapd->probereq_cb && i < hapd->num_probereq_cb; i++)
740 if (hapd->probereq_cb[i].cb(hapd->probereq_cb[i].ctx,
745 if (!hapd->iconf->send_probe_response)
772 hapd->iface->current_mode &&
773 (hapd->iface->current_mode->mode == HOSTAPD_MODE_IEEE80211G ||
774 hapd->iface->current_mode->mode == HOSTAPD_MODE_IEEE80211B) &&
775 hapd->iconf->channel != elems.ds_params[0]) {
778 hapd->iconf->channel, elems.ds_params[0]);
783 if (hapd->p2p && hapd->p2p_group && elems.wps_ie) {
786 if (wps && !p2p_group_match_dev_type(hapd->p2p_group, wps)) {
796 if (hapd->p2p && hapd->p2p_group && elems.p2p) {
799 if (p2p && !p2p_group_match_dev_id(hapd->p2p_group, p2p)) {
809 if (hapd->conf->ignore_broadcast_ssid && elems.ssid_len == 0 &&
817 if ((hapd->conf->p2p & P2P_GROUP_OWNER) &&
831 if ((sta = ap_get_sta(hapd, mgmt->sa)) != NULL) {
832 taxonomy_sta_info_probe_req(hapd, sta, ie, ie_len);
833 } else if ((info = sta_track_get(hapd->iface,
835 taxonomy_hostapd_sta_info_probe_req(hapd, info,
841 res = ssid_match(hapd, elems.ssid, elems.ssid_len,
856 if (hapd->conf->interworking &&
860 ant != hapd->conf->access_network_type) {
868 if (hapd->conf->interworking && elems.interworking &&
876 os_memcmp(hessid, hapd->conf->hessid, ETH_ALEN) != 0) {
887 if ((hapd->conf->p2p & P2P_GROUP_OWNER) &&
900 if (hapd->conf->no_probe_resp_if_seen_on &&
903 sta_track_seen_on(hapd->iface, mgmt->sa,
904 hapd->conf->no_probe_resp_if_seen_on)) {
907 hapd->conf->iface, MAC2STR(mgmt->sa),
908 hapd->conf->no_probe_resp_if_seen_on);
912 if (hapd->conf->no_probe_resp_if_max_sta &&
915 hapd->num_sta >= hapd->conf->max_num_sta &&
916 !ap_get_sta(hapd, mgmt->sa)) {
919 hapd->conf->iface, MAC2STR(mgmt->sa));
924 if (hapd->iconf->ignore_probe_probability > 0.0 &&
925 drand48() < hapd->iconf->ignore_probe_probability) {
933 resp = hostapd_gen_probe_resp(hapd, mgmt, elems.p2p != NULL,
946 if (hapd->csa_in_progress) {
947 if (hapd->cs_c_off_proberesp)
949 hapd->cs_c_off_proberesp;
951 if (hapd->cs_c_off_ecsa_proberesp)
953 hapd->cs_c_off_ecsa_proberesp;
956 ret = hostapd_drv_send_mlme_csa(hapd, resp, resp_len, noack,
971 static u8 * hostapd_probe_resp_offloads(struct hostapd_data *hapd,
975 if (!(hapd->iface->drv_flags & WPA_DRIVER_FLAGS_PROBE_RESP_OFFLOAD))
979 if (hapd->conf->wps_state && hapd->wps_probe_resp_ie &&
980 (!(hapd->iface->probe_resp_offloads &
988 if ((hapd->conf->p2p & P2P_ENABLED) && hapd->p2p_probe_resp_ie &&
989 !(hapd->iface->probe_resp_offloads &
995 if (hapd->conf->interworking &&
996 !(hapd->iface->probe_resp_offloads &
1003 return hostapd_gen_probe_resp(hapd, NULL, 0, resp_len);
1019 int ieee802_11_build_ap_params(struct hostapd_data *hapd,
1036 if (hapd->conf->wps_state && hapd->wps_beacon_ie)
1037 tail_len += wpabuf_len(hapd->wps_beacon_ie);
1040 if (hapd->p2p_beacon_ie)
1041 tail_len += wpabuf_len(hapd->p2p_beacon_ie);
1044 if (hapd->iface->fst_ies)
1045 tail_len += wpabuf_len(hapd->iface->fst_ies);
1047 if (hapd->conf->vendor_elements)
1048 tail_len += wpabuf_len(hapd->conf->vendor_elements);
1051 if (hapd->conf->vendor_vht) {
1058 if (hapd->iconf->ieee80211ax) {
1064 tail_len += hostapd_mbo_ie_len(hapd);
1079 os_memcpy(head->sa, hapd->own_addr, ETH_ALEN);
1080 os_memcpy(head->bssid, hapd->own_addr, ETH_ALEN);
1082 host_to_le16(hapd->iconf->beacon_int);
1085 capab_info = hostapd_own_capab_info(hapd);
1091 if (hapd->conf->ignore_broadcast_ssid == 2) {
1093 *pos++ = hapd->conf->ssid.ssid_len;
1094 os_memset(pos, 0, hapd->conf->ssid.ssid_len);
1095 pos += hapd->conf->ssid.ssid_len;
1096 } else if (hapd->conf->ignore_broadcast_ssid) {
1099 *pos++ = hapd->conf->ssid.ssid_len;
1100 os_memcpy(pos, hapd->conf->ssid.ssid,
1101 hapd->conf->ssid.ssid_len);
1102 pos += hapd->conf->ssid.ssid_len;
1106 pos = hostapd_eid_supp_rates(hapd, pos);
1109 pos = hostapd_eid_ds_params(hapd, pos);
1113 tailpos = hostapd_eid_country(hapd, tailpos,
1117 tailpos = hostapd_eid_pwr_constraint(hapd, tailpos);
1120 csa_pos = hostapd_eid_csa(hapd, tailpos);
1122 hapd->cs_c_off_beacon = csa_pos - tail - 1;
1126 tailpos = hostapd_eid_erp_info(hapd, tailpos);
1129 tailpos = hostapd_eid_ext_supp_rates(hapd, tailpos);
1132 tailpos = hostapd_eid_wpa(hapd, tailpos, tail + BEACON_TAIL_BUF_SIZE -
1135 tailpos = hostapd_eid_rm_enabled_capab(hapd, tailpos,
1139 tailpos = hostapd_eid_bss_load(hapd, tailpos,
1143 csa_pos = hostapd_eid_ecsa(hapd, tailpos);
1145 hapd->cs_c_off_ecsa_beacon = csa_pos - tail - 1;
1148 tailpos = hostapd_eid_supported_op_classes(hapd, tailpos);
1153 tailpos = hostapd_eid_secondary_channel(hapd, tailpos);
1155 tailpos = hostapd_eid_ht_capabilities(hapd, tailpos);
1156 tailpos = hostapd_eid_ht_operation(hapd, tailpos);
1159 tailpos = hostapd_eid_ext_capab(hapd, tailpos);
1165 tailpos = hostapd_eid_time_adv(hapd, tailpos);
1167 tailpos = hostapd_eid_interworking(hapd, tailpos);
1168 tailpos = hostapd_eid_adv_proto(hapd, tailpos);
1169 tailpos = hostapd_eid_roaming_consortium(hapd, tailpos);
1172 if (hapd->iface->fst_ies) {
1173 os_memcpy(tailpos, wpabuf_head(hapd->iface->fst_ies),
1174 wpabuf_len(hapd->iface->fst_ies));
1175 tailpos += wpabuf_len(hapd->iface->fst_ies);
1180 if (hapd->iconf->ieee80211ac && !hapd->conf->disable_11ac) {
1181 tailpos = hostapd_eid_vht_capabilities(hapd, tailpos, 0);
1182 tailpos = hostapd_eid_vht_operation(hapd, tailpos);
1183 tailpos = hostapd_eid_txpower_envelope(hapd, tailpos);
1184 tailpos = hostapd_eid_wb_chsw_wrapper(hapd, tailpos);
1188 tailpos = hostapd_eid_fils_indic(hapd, tailpos, 0);
1191 if (hapd->conf->vendor_vht)
1192 tailpos = hostapd_eid_vendor_vht(hapd, tailpos);
1196 if (hapd->iconf->ieee80211ax) {
1197 tailpos = hostapd_eid_vendor_he_capab(hapd, tailpos);
1198 tailpos = hostapd_eid_vendor_he_operation(hapd, tailpos);
1203 tailpos = hostapd_eid_wmm(hapd, tailpos);
1206 if (hapd->conf->wps_state && hapd
1207 os_memcpy(tailpos, wpabuf_head(hapd->wps_beacon_ie),
1208 wpabuf_len(hapd->wps_beacon_ie));
1209 tailpos += wpabuf_len(hapd->wps_beacon_ie);
1214 if ((hapd->conf->p2p & P2P_ENABLED) && hapd->p2p_beacon_ie) {
1215 os_memcpy(tailpos, wpabuf_head(hapd->p2p_beacon_ie),
1216 wpabuf_len(hapd->p2p_beacon_ie));
1217 tailpos += wpabuf_len(hapd->p2p_beacon_ie);
1221 if ((hapd->conf->p2p & (P2P_MANAGE | P2P_ENABLED | P2P_GROUP_OWNER)) ==
1223 tailpos = hostapd_eid_p2p_manage(hapd, tailpos);
1227 tailpos = hostapd_eid_hs20_indication(hapd, tailpos);
1228 tailpos = hostapd_eid_osen(hapd, tailpos);
1231 tailpos = hostapd_eid_mbo(hapd, tailpos, tail + tail_len - tailpos);
1233 if (hapd->conf->vendor_elements) {
1234 os_memcpy(tailpos, wpabuf_head(hapd->conf->vendor_elements),
1235 wpabuf_len(hapd->conf->vendor_elements));
1236 tailpos += wpabuf_len(hapd->conf->vendor_elements);
1241 resp = hostapd_probe_resp_offloads(hapd, &resp_len);
1251 params->dtim_period = hapd->conf->dtim_period;
1252 params->beacon_int = hapd->iconf->beacon_int;
1253 params->basic_rates = hapd->iface->basic_rates;
1254 params->beacon_rate = hapd->iconf->beacon_rate;
1255 params->rate_type = hapd->iconf->rate_type;
1256 params->ssid = hapd->conf->ssid.ssid;
1257 params->ssid_len = hapd->conf->ssid.ssid_len;
1258 if ((hapd->conf->wpa & (WPA_PROTO_WPA | WPA_PROTO_RSN)) ==
1260 params->pairwise_ciphers = hapd->conf->wpa_pairwise |
1261 hapd->conf->rsn_pairwise;
1262 else if (hapd->conf->wpa & WPA_PROTO_RSN)
1263 params->pairwise_ciphers = hapd->conf->rsn_pairwise;
1264 else if (hapd->conf->wpa & WPA_PROTO_WPA)
1265 params->pairwise_ciphers = hapd->conf->wpa_pairwise;
1266 params->group_cipher = hapd->conf->wpa_group;
1267 params->key_mgmt_suites = hapd->conf->wpa_key_mgmt;
1268 params->auth_algs = hapd->conf->auth_algs;
1269 params->wpa_version = hapd->conf->wpa;
1270 params->privacy = hapd->conf->ssid.wep.keys_set || hapd->conf->wpa ||
1271 (hapd->conf->ieee802_1x &&
1272 (hapd->conf->default_wep_key_len ||
1273 hapd->conf->individual_wep_key_len));
1274 switch (hapd->conf->ignore_broadcast_ssid) {
1285 params->isolate = hapd->conf->isolate;
1286 params->smps_mode = hapd->iconf->ht_capab & HT_CAP_INFO_SMPS_MASK;
1288 params->cts_protect = !!(ieee802_11_erp_info(hapd) &
1290 params->preamble = hapd->iface->num_sta_no_short_preamble == 0 &&
1291 hapd->iconf->preamble == SHORT_PREAMBLE;
1292 if (hapd->iface->current_mode &&
1293 hapd->iface->current_mode->mode == HOSTAPD_MODE_IEEE80211G)
1295 hapd->iface->num_sta_no_short_slot_time > 0 ? 0 : 1;
1298 if (!hapd->iconf->ieee80211n || hapd->conf->disable_11n)
1301 params->ht_opmode = hapd->iface->ht_op_mode;
1303 params->interworking = hapd->conf->interworking;
1304 if (hapd->conf->interworking &&
1305 !is_zero_ether_addr(hapd->conf->hessid))
1306 params->hessid = hapd->conf->hessid;
1307 params->access_network_type = hapd->conf->access_network_type;
1308 params->ap_max_inactivity = hapd->conf->ap_max_inactivity;
1310 params->p2p_go_ctwindow = hapd->iconf->p2p_go_ctwindow;
1313 params->disable_dgaf = hapd->conf->disable_dgaf;
1314 if (hapd->conf->osen) {
1319 params->multicast_to_unicast = hapd->conf->multicast_to_unicast;
1320 params->pbss = hapd->conf->pbss;
1336 int ieee802_11_set_beacon(struct hostapd_data *hapd)
1340 struct hostapd_iface *iface = hapd->iface;
1345 if (hapd->csa_in_progress) {
1350 hapd->beacon_set_done = 1;
1352 if (ieee802_11_build_ap_params(hapd, &params) < 0)
1355 if (hostapd_build_ap_extra_ies(hapd, &beacon, &proberesp, &assocresp) <
1362 params.reenable = hapd->reenable_beacon;
1363 hapd->reenable_beacon = 0;
1376 res = hostapd_drv_set_ap(hapd, &params);
1377 hostapd_free_ap_extra_ies(hapd, beacon, proberesp, assocresp);