]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
P2P: Save group common frequencies in invitation result
authorIlan Peer <ilan.peer@intel.com>
Mon, 7 Jul 2014 11:21:01 +0000 (14:21 +0300)
committerJouni Malinen <j@w1.fi>
Sat, 25 Oct 2014 22:24:28 +0000 (01:24 +0300)
Save the group common frequencies when starting a GO due to
an invitation signaling requesting to re-invoke a persistent GO.

To do so, move the code that handles the translation of p2p_channels to
frequency list into a public function so it can be re-used both when GO
Negotiation is done and invitation signaling is done.

Signed-off-by: Ilan Peer <ilan.peer@intel.com>
src/p2p/p2p.c
src/p2p/p2p.h
src/p2p/p2p_utils.c
wpa_supplicant/p2p_supplicant.c

index f28629e92449cd604248233e42fffea9f1eb2026..394a00d10eb558227eb9ab723279617baf5584c9 100644 (file)
@@ -1639,8 +1639,6 @@ void p2p_go_complete(struct p2p_data *p2p, struct p2p_device *peer)
        struct p2p_go_neg_results res;
        int go = peer->go_state == LOCAL_GO;
        struct p2p_channels intersection;
-       int freqs;
-       size_t i, j;
 
        p2p_dbg(p2p, "GO Negotiation with " MACSTR " completed (%s will be GO)",
                MAC2STR(peer->info.p2p_device_addr), go ? "local end" : "peer");
@@ -1681,21 +1679,9 @@ void p2p_go_complete(struct p2p_data *p2p, struct p2p_device *peer)
                p2p_channels_dump(p2p, "intersection after no-GO removal",
                                  &intersection);
        }
-       freqs = 0;
-       for (i = 0; i < intersection.reg_classes; i++) {
-               struct p2p_reg_class *c = &intersection.reg_class[i];
-               if (freqs + 1 == P2P_MAX_CHANNELS)
-                       break;
-               for (j = 0; j < c->channels; j++) {
-                       int freq;
-                       if (freqs + 1 == P2P_MAX_CHANNELS)
-                               break;
-                       freq = p2p_channel_to_freq(c->reg_class, c->channel[j]);
-                       if (freq < 0)
-                               continue;
-                       res.freq_list[freqs++] = freq;
-               }
-       }
+
+       p2p_channels_to_freqs(&intersection, res.freq_list,
+                             P2P_MAX_CHANNELS);
 
        res.peer_config_timeout = go ? peer->client_timeout : peer->go_timeout;
 
index 076a2ac1a9b3988e93795228e6285e0e8bed38f2..9201d190727cf8d56e2824183ce28960ff961e78 100644 (file)
@@ -1738,6 +1738,9 @@ void p2p_set_intra_bss_dist(struct p2p_data *p2p, int enabled);
 int p2p_channels_includes_freq(const struct p2p_channels *channels,
                               unsigned int freq);
 
+int p2p_channels_to_freqs(const struct p2p_channels *channels,
+                         int *freq_list, unsigned int max_len);
+
 /**
  * p2p_supported_freq - Check whether channel is supported for P2P
  * @p2p: P2P module context from p2p_init()
index 23acce7615f6553d6479b9478ea4bee87b9359c6..615cce4cd9fab4767114e8a94bb1756b26cc84e3 100644 (file)
@@ -517,3 +517,35 @@ int p2p_channel_random_social(struct p2p_channels *chans, u8 *op_class,
 
        return 0;
 }
+
+
+int p2p_channels_to_freqs(const struct p2p_channels *channels, int *freq_list,
+                         unsigned int max_len)
+{
+       unsigned int i, idx;
+
+       if (!channels || max_len == 0)
+               return 0;
+
+       for (i = 0, idx = 0; i < channels->reg_classes; i++) {
+               const struct p2p_reg_class *c = &channels->reg_class[i];
+               unsigned int j;
+
+               if (idx + 1 == max_len)
+                       break;
+               for (j = 0; j < c->channels; j++) {
+                       int freq;
+                       if (idx + 1 == max_len)
+                               break;
+                       freq = p2p_channel_to_freq(c->reg_class,
+                                                  c->channel[j]);
+                       if (freq < 0)
+                               continue;
+                       freq_list[idx++] = freq;
+               }
+       }
+
+       freq_list[idx] = 0;
+
+       return idx;
+}
index ed6701c1f2a4b6e4361cebb2386364207695af1b..6271425a0c217ab5a63550412355dca3671ae2d2 100644 (file)
@@ -5607,6 +5607,8 @@ int wpas_p2p_group_add_persistent(struct wpa_supplicant *wpa_s,
        if (wpa_s == NULL)
                return -1;
 
+       p2p_channels_to_freqs(channels, params.freq_list, P2P_MAX_CHANNELS);
+
        wpa_s->p2p_first_connection_timeout = connection_timeout;
        wpas_start_wps_go(wpa_s, &params, 0);