P2P: Improve common group channel selection if GO needs to be moved
Prefer channels that support VHT80 (and secondarily, HT40 on the same band) over other common group channels. If no such channel is found, prefer any channel that uses the same band so that CSA can be used. This improves the case where a P2P GO needs to move to another channel and there is no other reason (e.g., preferred channel from the driver or an already used channel from a virtual interface sharing the same radio) to pick a specific channel. Signed-off-by: Jouni Malinen <jouni@codeaurora.org>
This commit is contained in:
parent
616178a2ad
commit
26eac0a998
1 changed files with 87 additions and 0 deletions
|
@ -5800,6 +5800,19 @@ out:
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int wpas_same_band(int freq1, int freq2)
|
||||||
|
{
|
||||||
|
enum hostapd_hw_mode mode1, mode2;
|
||||||
|
u8 chan1, chan2;
|
||||||
|
|
||||||
|
mode1 = ieee80211_freq_to_chan(freq1, &chan1);
|
||||||
|
mode2 = ieee80211_freq_to_chan(freq2, &chan2);
|
||||||
|
if (mode1 == NUM_HOSTAPD_MODES)
|
||||||
|
return 0;
|
||||||
|
return mode1 == mode2;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static int wpas_p2p_init_go_params(struct wpa_supplicant *wpa_s,
|
static int wpas_p2p_init_go_params(struct wpa_supplicant *wpa_s,
|
||||||
struct p2p_go_neg_results *params,
|
struct p2p_go_neg_results *params,
|
||||||
int freq, int vht_center_freq2, int ht40,
|
int freq, int vht_center_freq2, int ht40,
|
||||||
|
@ -6000,6 +6013,80 @@ static int wpas_p2p_init_go_params(struct wpa_supplicant *wpa_s,
|
||||||
goto success;
|
goto success;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Try using a channel that allows VHT to be used with 80 MHz */
|
||||||
|
if (wpa_s->hw.modes && wpa_s->p2p_group_common_freqs) {
|
||||||
|
for (i = 0; i < wpa_s->p2p_group_common_freqs_num; i++) {
|
||||||
|
enum hostapd_hw_mode mode;
|
||||||
|
struct hostapd_hw_modes *hwmode;
|
||||||
|
u8 chan;
|
||||||
|
|
||||||
|
cand = wpa_s->p2p_group_common_freqs[i];
|
||||||
|
mode = ieee80211_freq_to_chan(cand, &chan);
|
||||||
|
hwmode = get_mode(wpa_s->hw.modes, wpa_s->hw.num_modes,
|
||||||
|
mode);
|
||||||
|
if (!hwmode ||
|
||||||
|
wpas_p2p_verify_channel(wpa_s, hwmode, chan,
|
||||||
|
BW80) != ALLOWED)
|
||||||
|
continue;
|
||||||
|
if (wpas_p2p_supported_freq_go(wpa_s, channels, cand)) {
|
||||||
|
params->freq = cand;
|
||||||
|
wpa_printf(MSG_DEBUG,
|
||||||
|
"P2P: Use freq %d MHz common with the peer and allowing VHT80",
|
||||||
|
params->freq);
|
||||||
|
goto success;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Try using a channel that allows HT to be used with 40 MHz on the same
|
||||||
|
* band so that CSA can be used */
|
||||||
|
if (wpa_s->current_ssid && wpa_s->hw.modes &&
|
||||||
|
wpa_s->p2p_group_common_freqs) {
|
||||||
|
for (i = 0; i < wpa_s->p2p_group_common_freqs_num; i++) {
|
||||||
|
enum hostapd_hw_mode mode;
|
||||||
|
struct hostapd_hw_modes *hwmode;
|
||||||
|
u8 chan;
|
||||||
|
|
||||||
|
cand = wpa_s->p2p_group_common_freqs[i];
|
||||||
|
mode = ieee80211_freq_to_chan(cand, &chan);
|
||||||
|
hwmode = get_mode(wpa_s->hw.modes, wpa_s->hw.num_modes,
|
||||||
|
mode);
|
||||||
|
if (!wpas_same_band(wpa_s->current_ssid->frequency,
|
||||||
|
cand) ||
|
||||||
|
!hwmode ||
|
||||||
|
(wpas_p2p_verify_channel(wpa_s, hwmode, chan,
|
||||||
|
BW40MINUS) != ALLOWED &&
|
||||||
|
wpas_p2p_verify_channel(wpa_s, hwmode, chan,
|
||||||
|
BW40PLUS) != ALLOWED))
|
||||||
|
continue;
|
||||||
|
if (wpas_p2p_supported_freq_go(wpa_s, channels, cand)) {
|
||||||
|
params->freq = cand;
|
||||||
|
wpa_printf(MSG_DEBUG,
|
||||||
|
"P2P: Use freq %d MHz common with the peer, allowing HT40, and maintaining same band",
|
||||||
|
params->freq);
|
||||||
|
goto success;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Try using one of the group common freqs on the same band so that CSA
|
||||||
|
* can be used */
|
||||||
|
if (wpa_s->current_ssid && wpa_s->p2p_group_common_freqs) {
|
||||||
|
for (i = 0; i < wpa_s->p2p_group_common_freqs_num; i++) {
|
||||||
|
cand = wpa_s->p2p_group_common_freqs[i];
|
||||||
|
if (!wpas_same_band(wpa_s->current_ssid->frequency,
|
||||||
|
cand))
|
||||||
|
continue;
|
||||||
|
if (wpas_p2p_supported_freq_go(wpa_s, channels, cand)) {
|
||||||
|
params->freq = cand;
|
||||||
|
wpa_printf(MSG_DEBUG,
|
||||||
|
"P2P: Use freq %d MHz common with the peer and maintaining same band",
|
||||||
|
params->freq);
|
||||||
|
goto success;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* Try using one of the group common freqs */
|
/* Try using one of the group common freqs */
|
||||||
if (wpa_s->p2p_group_common_freqs) {
|
if (wpa_s->p2p_group_common_freqs) {
|
||||||
for (i = 0; i < wpa_s->p2p_group_common_freqs_num; i++) {
|
for (i = 0; i < wpa_s->p2p_group_common_freqs_num; i++) {
|
||||||
|
|
Loading…
Reference in a new issue