P2P: Enhance determination of secondary offset to support 6 GHz channels
Current definition of wpas_p2p_get_ht40_mode() determines secondary offset in the 5 GHz band. Enhance the functionality of this function to determine offset to support 6 GHz channels also. Signed-off-by: Sreeramya Soratkal <ssramya@codeaurora.org>
This commit is contained in:
parent
575a8e6ca3
commit
f725254cc1
5 changed files with 47 additions and 10 deletions
|
@ -2293,6 +2293,30 @@ bool is_6ghz_psc_frequency(int freq)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* get_6ghz_sec_channel - Get the relative position of the secondary channel
|
||||||
|
* to the primary channel in 6 GHz
|
||||||
|
* @channel: Primary channel to be checked for (in global op class 131)
|
||||||
|
* Returns: 1 = secondary channel above, -1 = secondary channel below
|
||||||
|
*/
|
||||||
|
|
||||||
|
int get_6ghz_sec_channel(int channel)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* In the 6 GHz band, primary channels are numbered as 1, 5, 9, 13.., so
|
||||||
|
* the 40 MHz channels are formed with the channel pairs as (1,5),
|
||||||
|
* (9,13), (17,21)..
|
||||||
|
* The secondary channel for a given primary channel is below the
|
||||||
|
* primary channel for the channels 5, 13, 21.. and it is above the
|
||||||
|
* primary channel for the channels 1, 9, 17..
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (((channel - 1) / 4) % 2)
|
||||||
|
return -1;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int ieee802_11_parse_candidate_list(const char *pos, u8 *nei_rep,
|
int ieee802_11_parse_candidate_list(const char *pos, u8 *nei_rep,
|
||||||
size_t nei_rep_len)
|
size_t nei_rep_len)
|
||||||
{
|
{
|
||||||
|
|
|
@ -264,6 +264,7 @@ int center_idx_to_bw_6ghz(u8 idx);
|
||||||
bool is_6ghz_freq(int freq);
|
bool is_6ghz_freq(int freq);
|
||||||
bool is_6ghz_op_class(u8 op_class);
|
bool is_6ghz_op_class(u8 op_class);
|
||||||
bool is_6ghz_psc_frequency(int freq);
|
bool is_6ghz_psc_frequency(int freq);
|
||||||
|
int get_6ghz_sec_channel(int channel);
|
||||||
|
|
||||||
int ieee802_11_parse_candidate_list(const char *pos, u8 *nei_rep,
|
int ieee802_11_parse_candidate_list(const char *pos, u8 *nei_rep,
|
||||||
size_t nei_rep_len);
|
size_t nei_rep_len);
|
||||||
|
|
|
@ -280,8 +280,8 @@ int wpa_supplicant_conf_ap_ht(struct wpa_supplicant *wpa_s,
|
||||||
HT_CAP_INFO_SUPP_CHANNEL_WIDTH_SET) &&
|
HT_CAP_INFO_SUPP_CHANNEL_WIDTH_SET) &&
|
||||||
ssid->ht40) {
|
ssid->ht40) {
|
||||||
conf->secondary_channel =
|
conf->secondary_channel =
|
||||||
wpas_p2p_get_ht40_mode(wpa_s, mode,
|
wpas_p2p_get_sec_channel_offset_40mhz(
|
||||||
conf->channel);
|
wpa_s, mode, conf->channel);
|
||||||
wpa_printf(MSG_DEBUG,
|
wpa_printf(MSG_DEBUG,
|
||||||
"HT secondary channel offset %d for P2P group",
|
"HT secondary channel offset %d for P2P group",
|
||||||
conf->secondary_channel);
|
conf->secondary_channel);
|
||||||
|
|
|
@ -3893,32 +3893,43 @@ static int wpas_p2p_setup_channels(struct wpa_supplicant *wpa_s,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int wpas_p2p_get_ht40_mode(struct wpa_supplicant *wpa_s,
|
int wpas_p2p_get_sec_channel_offset_40mhz(struct wpa_supplicant *wpa_s,
|
||||||
struct hostapd_hw_modes *mode, u8 channel)
|
struct hostapd_hw_modes *mode,
|
||||||
|
u8 channel)
|
||||||
{
|
{
|
||||||
int op;
|
int op;
|
||||||
enum chan_allowed ret;
|
enum chan_allowed ret;
|
||||||
|
|
||||||
for (op = 0; global_op_class[op].op_class; op++) {
|
for (op = 0; global_op_class[op].op_class; op++) {
|
||||||
const struct oper_class_map *o = &global_op_class[op];
|
const struct oper_class_map *o = &global_op_class[op];
|
||||||
u8 ch;
|
u16 ch;
|
||||||
|
int chan = channel;
|
||||||
|
|
||||||
if (o->p2p == NO_P2P_SUPP ||
|
if (o->p2p == NO_P2P_SUPP ||
|
||||||
(is_6ghz_op_class(o->op_class) &&
|
(is_6ghz_op_class(o->op_class) &&
|
||||||
wpa_s->conf->p2p_6ghz_disable))
|
wpa_s->conf->p2p_6ghz_disable))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
if (is_6ghz_op_class(o->op_class) && o->bw == BW40 &&
|
||||||
|
get_6ghz_sec_channel(channel) < 0)
|
||||||
|
chan = channel - 4;
|
||||||
|
|
||||||
for (ch = o->min_chan; ch <= o->max_chan; ch += o->inc) {
|
for (ch = o->min_chan; ch <= o->max_chan; ch += o->inc) {
|
||||||
if (o->mode != HOSTAPD_MODE_IEEE80211A ||
|
if (o->mode != HOSTAPD_MODE_IEEE80211A ||
|
||||||
(o->bw != BW40PLUS && o->bw != BW40MINUS) ||
|
(o->bw != BW40PLUS && o->bw != BW40MINUS &&
|
||||||
ch != channel)
|
o->bw != BW40) ||
|
||||||
|
ch != chan)
|
||||||
continue;
|
continue;
|
||||||
ret = wpas_p2p_verify_channel(wpa_s, mode, o->op_class,
|
ret = wpas_p2p_verify_channel(wpa_s, mode, o->op_class,
|
||||||
ch, o->bw);
|
ch, o->bw);
|
||||||
if (ret == ALLOWED)
|
if (ret == ALLOWED) {
|
||||||
|
if (is_6ghz_op_class(o->op_class) &&
|
||||||
|
o->bw == BW40)
|
||||||
|
return get_6ghz_sec_channel(channel);
|
||||||
return (o->bw == BW40MINUS) ? -1 : 1;
|
return (o->bw == BW40MINUS) ? -1 : 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -146,8 +146,9 @@ struct wpa_ssid * wpas_p2p_get_persistent(struct wpa_supplicant *wpa_s,
|
||||||
void wpas_p2p_notify_ap_sta_authorized(struct wpa_supplicant *wpa_s,
|
void wpas_p2p_notify_ap_sta_authorized(struct wpa_supplicant *wpa_s,
|
||||||
const u8 *addr);
|
const u8 *addr);
|
||||||
int wpas_p2p_scan_no_go_seen(struct wpa_supplicant *wpa_s);
|
int wpas_p2p_scan_no_go_seen(struct wpa_supplicant *wpa_s);
|
||||||
int wpas_p2p_get_ht40_mode(struct wpa_supplicant *wpa_s,
|
int wpas_p2p_get_sec_channel_offset_40mhz(struct wpa_supplicant *wpa_s,
|
||||||
struct hostapd_hw_modes *mode, u8 channel);
|
struct hostapd_hw_modes *mode,
|
||||||
|
u8 channel);
|
||||||
int wpas_p2p_get_vht80_center(struct wpa_supplicant *wpa_s,
|
int wpas_p2p_get_vht80_center(struct wpa_supplicant *wpa_s,
|
||||||
struct hostapd_hw_modes *mode, u8 channel,
|
struct hostapd_hw_modes *mode, u8 channel,
|
||||||
u8 op_class);
|
u8 op_class);
|
||||||
|
|
Loading…
Reference in a new issue