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:
Jouni Malinen 2012-10-26 18:10:46 +03:00 committed by Jouni Malinen
parent f826635c2d
commit 04a3e69dd1
4 changed files with 45 additions and 24 deletions

View file

@ -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);