P2P: Allow all channels with multi-channel concurrency
If the driver indicates support for multi-channel concurrency, change the p2p_connect behavior to not force the current operating channel, but instead, just mark it as preferred for GO Negotiation. This change applies only for the case when the freq parameter is not used with the p2p_connect command. Signed-hostap: Jouni Malinen <jouni@qca.qualcomm.com>
This commit is contained in:
parent
f826635c2d
commit
04a3e69dd1
4 changed files with 45 additions and 24 deletions
|
@ -1086,15 +1086,17 @@ void p2p_stop_find(struct p2p_data *p2p)
|
|||
}
|
||||
|
||||
|
||||
static int p2p_prepare_channel(struct p2p_data *p2p, unsigned int force_freq)
|
||||
static int p2p_prepare_channel(struct p2p_data *p2p, unsigned int force_freq,
|
||||
unsigned int pref_freq)
|
||||
{
|
||||
if (force_freq) {
|
||||
if (force_freq || pref_freq) {
|
||||
u8 op_reg_class, op_channel;
|
||||
if (p2p_freq_to_channel(p2p->cfg->country, force_freq,
|
||||
unsigned int freq = force_freq ? force_freq : pref_freq;
|
||||
if (p2p_freq_to_channel(p2p->cfg->country, freq,
|
||||
&op_reg_class, &op_channel) < 0) {
|
||||
wpa_msg(p2p->cfg->msg_ctx, MSG_DEBUG,
|
||||
"P2P: Unsupported frequency %u MHz",
|
||||
force_freq);
|
||||
freq);
|
||||
return -1;
|
||||
}
|
||||
if (!p2p_channels_includes(&p2p->cfg->channels, op_reg_class,
|
||||
|
@ -1102,15 +1104,21 @@ static int p2p_prepare_channel(struct p2p_data *p2p, unsigned int force_freq)
|
|||
wpa_msg(p2p->cfg->msg_ctx, MSG_DEBUG,
|
||||
"P2P: Frequency %u MHz (oper_class %u "
|
||||
"channel %u) not allowed for P2P",
|
||||
force_freq, op_reg_class, op_channel);
|
||||
freq, op_reg_class, op_channel);
|
||||
return -1;
|
||||
}
|
||||
p2p->op_reg_class = op_reg_class;
|
||||
p2p->op_channel = op_channel;
|
||||
p2p->channels.reg_classes = 1;
|
||||
p2p->channels.reg_class[0].channels = 1;
|
||||
p2p->channels.reg_class[0].reg_class = p2p->op_reg_class;
|
||||
p2p->channels.reg_class[0].channel[0] = p2p->op_channel;
|
||||
if (force_freq) {
|
||||
p2p->channels.reg_classes = 1;
|
||||
p2p->channels.reg_class[0].channels = 1;
|
||||
p2p->channels.reg_class[0].reg_class =
|
||||
p2p->op_reg_class;
|
||||
p2p->channels.reg_class[0].channel[0] = p2p->op_channel;
|
||||
} else {
|
||||
os_memcpy(&p2p->channels, &p2p->cfg->channels,
|
||||
sizeof(struct p2p_channels));
|
||||
}
|
||||
} else {
|
||||
u8 op_reg_class, op_channel;
|
||||
|
||||
|
@ -1190,7 +1198,7 @@ int p2p_connect(struct p2p_data *p2p, const u8 *peer_addr,
|
|||
int go_intent, const u8 *own_interface_addr,
|
||||
unsigned int force_freq, int persistent_group,
|
||||
const u8 *force_ssid, size_t force_ssid_len,
|
||||
int pd_before_go_neg)
|
||||
int pd_before_go_neg, unsigned int pref_freq)
|
||||
{
|
||||
struct p2p_device *dev;
|
||||
|
||||
|
@ -1201,7 +1209,7 @@ int p2p_connect(struct p2p_data *p2p, const u8 *peer_addr,
|
|||
MAC2STR(peer_addr), go_intent, MAC2STR(own_interface_addr),
|
||||
wps_method, persistent_group, pd_before_go_neg);
|
||||
|
||||
if (p2p_prepare_channel(p2p, force_freq) < 0)
|
||||
if (p2p_prepare_channel(p2p, force_freq, pref_freq) < 0)
|
||||
return -1;
|
||||
|
||||
dev = p2p_get_device(p2p, peer_addr);
|
||||
|
@ -1301,7 +1309,8 @@ int p2p_authorize(struct p2p_data *p2p, const u8 *peer_addr,
|
|||
enum p2p_wps_method wps_method,
|
||||
int go_intent, const u8 *own_interface_addr,
|
||||
unsigned int force_freq, int persistent_group,
|
||||
const u8 *force_ssid, size_t force_ssid_len)
|
||||
const u8 *force_ssid, size_t force_ssid_len,
|
||||
unsigned int pref_freq)
|
||||
{
|
||||
struct p2p_device *dev;
|
||||
|
||||
|
@ -1312,7 +1321,7 @@ int p2p_authorize(struct p2p_data *p2p, const u8 *peer_addr,
|
|||
MAC2STR(peer_addr), go_intent, MAC2STR(own_interface_addr),
|
||||
wps_method, persistent_group);
|
||||
|
||||
if (p2p_prepare_channel(p2p, force_freq) < 0)
|
||||
if (p2p_prepare_channel(p2p, force_freq, pref_freq) < 0)
|
||||
return -1;
|
||||
|
||||
dev = p2p_get_device(p2p, peer_addr);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue