From 50285f5ca8086cca45afa42cd23c3a3c1cd58f40 Mon Sep 17 00:00:00 2001 From: Arik Nemtsov Date: Thu, 27 Dec 2012 08:16:42 +0200 Subject: [PATCH] P2P: Always re-select operating channel if not hard coded Since the operating channel is randomly set to 1/6/11 on init, which is commonly included in the channel intersection, we were effectively ignoring the set of P2P preferred channels when trying to improve channel selection after having received peer information. Fix this by trying to get the best channel we can, unless the user hard coded the operating channel in the configuration file or p2p_connect command. Fall back to the initial randomly selected channel if a better one cannot be chosen. Signed-hostap: Arik Nemtsov --- src/p2p/p2p_go_neg.c | 29 +++++++++++++++++++++++++---- 1 file changed, 25 insertions(+), 4 deletions(-) diff --git a/src/p2p/p2p_go_neg.c b/src/p2p/p2p_go_neg.c index 6efefe440..60424defa 100644 --- a/src/p2p/p2p_go_neg.c +++ b/src/p2p/p2p_go_neg.c @@ -344,10 +344,6 @@ void p2p_reselect_channel(struct p2p_data *p2p, u8 op_reg_class, op_channel; unsigned int i; - wpa_msg(p2p->cfg->msg_ctx, MSG_DEBUG, "P2P: Selected operating " - "channel (reg_class %u channel %u) not acceptable to the " - "peer", p2p->op_reg_class, p2p->op_channel); - /* First, try to pick the best channel from another band */ freq = p2p_channel_to_freq(p2p->cfg->country, p2p->op_reg_class, p2p->op_channel); @@ -405,6 +401,20 @@ void p2p_reselect_channel(struct p2p_data *p2p, } } + /* + * Try to see if the original channel is in the intersection. If + * so, no need to change anything, as it already contains some + * randomness. + */ + if (p2p_channels_includes(intersection, p2p->op_reg_class, + p2p->op_channel)) { + wpa_msg(p2p->cfg->msg_ctx, MSG_DEBUG, + "P2P: Using original operating class and channel " + "(op_class %u channel %u) from intersection", + p2p->op_reg_class, p2p->op_channel); + return; + } + /* * Fall back to whatever is included in the channel intersection since * no better options seems to be available. @@ -449,6 +459,17 @@ static int p2p_go_select_channel(struct p2p_data *p2p, struct p2p_device *dev, "not support the forced channel"); return -1; } + + wpa_msg(p2p->cfg->msg_ctx, MSG_DEBUG, "P2P: Selected operating " + "channel (op_class %u channel %u) not acceptable to " + "the peer", p2p->op_reg_class, p2p->op_channel); + p2p_reselect_channel(p2p, &intersection); + } else if (!(dev->flags & P2P_DEV_FORCE_FREQ) && + !p2p->cfg->cfg_op_channel) { + wpa_msg(p2p->cfg->msg_ctx, MSG_DEBUG, "P2P: Try to optimize " + "channel selection with peer information received; " + "previously selected op_class %u channel %u", + p2p->op_reg_class, p2p->op_channel); p2p_reselect_channel(p2p, &intersection); }