]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
P2P: Use preferred channel list during GO creation
authorSuryadevara Sudheer <ssuryade@qti.qualcomm.com>
Fri, 17 May 2013 08:27:02 +0000 (11:27 +0300)
committerJouni Malinen <j@w1.fi>
Fri, 17 May 2013 08:27:02 +0000 (11:27 +0300)
This extends support for p2p_pref_Chan configuration parameter for
autonomous GO creation.

Signed-hostap: Jouni Malinen <jouni@qca.qualcomm.com>

src/p2p/p2p.h
src/p2p/p2p_utils.c
wpa_supplicant/p2p_supplicant.c

index d2fa68c5a3995f1f73327a4cecec8226a4037f26..eeaa14989ce54d363fa37ce91984e25480d35c61 100644 (file)
@@ -1631,6 +1631,15 @@ int p2p_channels_includes_freq(const struct p2p_channels *channels,
  */
 int p2p_supported_freq(struct p2p_data *p2p, unsigned int freq);
 
+/**
+ * p2p_get_pref_freq - Get channel from preferred channel list
+ * @p2p: P2P module context from p2p_init()
+ * @channels: List of channels
+ * Returns: Preferred channel
+ */
+unsigned int p2p_get_pref_freq(struct p2p_data *p2p,
+                              const struct p2p_channels *channels);
+
 void p2p_update_channel_list(struct p2p_data *p2p, struct p2p_channels *chan);
 
 /**
index 69bd14b4ede1f3a650968b4ffeab45dd3ca45660..0da26827199d217d37e36943e03d4ffe472f048c 100644 (file)
@@ -243,3 +243,31 @@ int p2p_supported_freq(struct p2p_data *p2p, unsigned int freq)
        return p2p_channels_includes(&p2p->cfg->channels, op_reg_class,
                                     op_channel);
 }
+
+
+unsigned int p2p_get_pref_freq(struct p2p_data *p2p,
+                              const struct p2p_channels *channels)
+{
+       unsigned int i;
+       int freq = 0;
+
+       if (channels == NULL) {
+               if (p2p->cfg->num_pref_chan) {
+                       freq = p2p_channel_to_freq(
+                               p2p->cfg->pref_chan[0].op_class,
+                               p2p->cfg->pref_chan[0].chan);
+                       if (freq < 0)
+                               freq = 0;
+               }
+               return freq;
+       }
+
+       for (i = 0; p2p->cfg->pref_chan && i < p2p->cfg->num_pref_chan; i++) {
+               freq = p2p_channel_to_freq(p2p->cfg->pref_chan[i].op_class,
+                                          p2p->cfg->pref_chan[i].chan);
+               if (p2p_channels_includes_freq(channels, freq))
+                       return freq;
+       }
+
+       return 0;
+}
index 090168a78970dabc5c87262f4170e3eb2cee5f22..db199bdd219e594f3f37fca1690d822ae14d47e4 100644 (file)
@@ -3993,6 +3993,7 @@ static int wpas_p2p_init_go_params(struct wpa_supplicant *wpa_s,
 {
        u8 bssid[ETH_ALEN];
        int res;
+       unsigned int pref_freq;
 
        os_memset(params, 0, sizeof(*params));
        params->role_go = 1;
@@ -4049,6 +4050,11 @@ static int wpas_p2p_init_go_params(struct wpa_supplicant *wpa_s,
                params->freq = wpa_s->best_5_freq;
                wpa_printf(MSG_DEBUG, "P2P: Set GO freq based on best 5 GHz "
                           "channel %d MHz", params->freq);
+       } else if ((pref_freq = p2p_get_pref_freq(wpa_s->global->p2p,
+                                                 channels))) {
+               params->freq = pref_freq;
+               wpa_printf(MSG_DEBUG, "P2P: Set GO freq %d MHz from preferred "
+                          "channels", params->freq);
        } else {
                int chan;
                for (chan = 0; chan < 11; chan++) {