diff --git a/src/ap/ap_config.h b/src/ap/ap_config.h index 0f33ac9a0..ec73771f6 100644 --- a/src/ap/ap_config.h +++ b/src/ap/ap_config.h @@ -629,6 +629,10 @@ struct hostapd_config { u8 vht_oper_centr_freq_seg0_idx; u8 vht_oper_centr_freq_seg1_idx; +#ifdef CONFIG_P2P + u8 p2p_go_ctwindow; +#endif /* CONFIG_P2P */ + #ifdef CONFIG_TESTING_OPTIONS double ignore_probe_probability; double ignore_auth_probability; diff --git a/src/ap/beacon.c b/src/ap/beacon.c index 476379fc7..e575b65cb 100644 --- a/src/ap/beacon.c +++ b/src/ap/beacon.c @@ -1008,6 +1008,9 @@ int ieee802_11_build_ap_params(struct hostapd_data *hapd, params->hessid = hapd->conf->hessid; params->access_network_type = hapd->conf->access_network_type; params->ap_max_inactivity = hapd->conf->ap_max_inactivity; +#ifdef CONFIG_P2P + params->p2p_go_ctwindow = hapd->iconf->p2p_go_ctwindow; +#endif /* CONFIG_P2P */ #ifdef CONFIG_HS20 params->disable_dgaf = hapd->conf->disable_dgaf; if (hapd->conf->osen) { diff --git a/src/drivers/driver.h b/src/drivers/driver.h index 467c9d2c0..2c21fdb9f 100644 --- a/src/drivers/driver.h +++ b/src/drivers/driver.h @@ -1017,6 +1017,11 @@ struct wpa_driver_ap_params { */ int ap_max_inactivity; + /** + * ctwindow - Client Traffic Window (in TUs) + */ + u8 p2p_go_ctwindow; + /** * smps_mode - SMPS mode * diff --git a/wpa_supplicant/ap.c b/wpa_supplicant/ap.c index fca2137c6..f2c60e7fd 100644 --- a/wpa_supplicant/ap.c +++ b/wpa_supplicant/ap.c @@ -265,6 +265,17 @@ static int wpa_supplicant_conf_ap(struct wpa_supplicant *wpa_s, else if (wpa_s->conf->beacon_int) conf->beacon_int = wpa_s->conf->beacon_int; +#ifdef CONFIG_P2P + if (wpa_s->conf->p2p_go_ctwindow > conf->beacon_int) { + wpa_printf(MSG_INFO, + "CTWindow (%d) is bigger than beacon interval (%d) - avoid configuring it", + wpa_s->conf->p2p_go_ctwindow, conf->beacon_int); + conf->p2p_go_ctwindow = 0; + } else { + conf->p2p_go_ctwindow = wpa_s->conf->p2p_go_ctwindow; + } +#endif /* CONFIG_P2P */ + if ((bss->wpa & 2) && bss->rsn_pairwise == 0) bss->rsn_pairwise = bss->wpa_pairwise; bss->wpa_group = wpa_select_ap_group_cipher(bss->wpa, bss->wpa_pairwise, diff --git a/wpa_supplicant/config.c b/wpa_supplicant/config.c index 30d9342f2..8e6cd2006 100644 --- a/wpa_supplicant/config.c +++ b/wpa_supplicant/config.c @@ -3504,6 +3504,7 @@ struct wpa_config * wpa_config_alloc_empty(const char *ctrl_interface, config->p2p_intra_bss = DEFAULT_P2P_INTRA_BSS; config->p2p_go_max_inactivity = DEFAULT_P2P_GO_MAX_INACTIVITY; config->p2p_optimize_listen_chan = DEFAULT_P2P_OPTIMIZE_LISTEN_CHAN; + config->p2p_go_ctwindow = DEFAULT_P2P_GO_CTWINDOW; config->bss_max_count = DEFAULT_BSS_MAX_COUNT; config->bss_expiration_age = DEFAULT_BSS_EXPIRATION_AGE; config->bss_expiration_scan_count = DEFAULT_BSS_EXPIRATION_SCAN_COUNT; @@ -4136,6 +4137,7 @@ static const struct global_parse_data global_fields[] = { { INT(p2p_go_ht40), 0 }, { INT(p2p_go_vht), 0 }, { INT(p2p_disabled), 0 }, + { INT_RANGE(p2p_go_ctwindow, 0, 127), 0 }, { INT(p2p_no_group_iface), 0 }, { INT_RANGE(p2p_ignore_shared_freq, 0, 1), 0 }, { IPV4(ip_addr_go), 0 }, diff --git a/wpa_supplicant/config.h b/wpa_supplicant/config.h index afae78df8..34b754e09 100644 --- a/wpa_supplicant/config.h +++ b/wpa_supplicant/config.h @@ -33,6 +33,7 @@ #define DEFAULT_RAND_ADDR_LIFETIME 60 #define DEFAULT_KEY_MGMT_OFFLOAD 1 #define DEFAULT_CERT_IN_CB 1 +#define DEFAULT_P2P_GO_CTWINDOW 0 #include "config_ssid.h" #include "wps/wps.h" @@ -941,6 +942,14 @@ struct wpa_config { */ int p2p_go_vht; + /** + * p2p_go_ctwindow - CTWindow to use when operating as GO + * + * By default: 0 (no CTWindow). Values 0-127 can be used to indicate + * the length of the CTWindow in TUs. + */ + int p2p_go_ctwindow; + /** * p2p_disabled - Whether P2P operations are disabled for this interface */ diff --git a/wpa_supplicant/config_file.c b/wpa_supplicant/config_file.c index 06936e727..3d3a6e404 100644 --- a/wpa_supplicant/config_file.c +++ b/wpa_supplicant/config_file.c @@ -1115,6 +1115,8 @@ static void wpa_config_write_global(FILE *f, struct wpa_config *config) fprintf(f, "p2p_go_ht40=%u\n", config->p2p_go_ht40); if (config->p2p_go_vht) fprintf(f, "p2p_go_vht=%u\n", config->p2p_go_vht); + if (config->p2p_go_ctwindow != DEFAULT_P2P_GO_CTWINDOW) + fprintf(f, "p2p_go_ctwindow=%u\n", config->p2p_go_ctwindow); if (config->p2p_disabled) fprintf(f, "p2p_disabled=%u\n", config->p2p_disabled); if (config->p2p_no_group_iface) diff --git a/wpa_supplicant/p2p_supplicant.c b/wpa_supplicant/p2p_supplicant.c index 00b8d8590..5e6646ed0 100644 --- a/wpa_supplicant/p2p_supplicant.c +++ b/wpa_supplicant/p2p_supplicant.c @@ -1852,6 +1852,7 @@ static void wpas_p2p_clone_config(struct wpa_supplicant *dst, d->ignore_old_scan_res = s->ignore_old_scan_res; d->beacon_int = s->beacon_int; d->dtim_period = s->dtim_period; + d->p2p_go_ctwindow = s->p2p_go_ctwindow; d->disassoc_low_ack = s->disassoc_low_ack; d->disable_scan_offload = s->disable_scan_offload; d->passive_scan = s->passive_scan;