]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
P2P: Support driver preferred freq list for invitation case
authorAhmad Kholaif <akholaif@qca.qualcomm.com>
Tue, 11 Aug 2015 01:09:27 +0000 (18:09 -0700)
committerJouni Malinen <j@w1.fi>
Tue, 11 Aug 2015 16:04:45 +0000 (19:04 +0300)
When using P2P invitation to re-invoke a persistent P2P group without
specifying the operating channel, query the driver for the preferred
frequency list, and use it to select the operating channel of the group.

Signed-off-by: Jouni Malinen <jouni@qca.qualcomm.com>
src/p2p/p2p_go_neg.c
src/p2p/p2p_i.h
src/p2p/p2p_invitation.c
wpa_supplicant/p2p_supplicant.c

index 4322bbbbbccc988aba1c0a18a8111440038aabc7..83b43563d945fbb7f109149b38161ab66230b28c 100644 (file)
@@ -673,8 +673,8 @@ static void p2p_check_pref_chan_recv(struct p2p_data *p2p, int go,
 }
 
 
-static void p2p_check_pref_chan(struct p2p_data *p2p, int go,
-                               struct p2p_device *dev, struct p2p_message *msg)
+void p2p_check_pref_chan(struct p2p_data *p2p, int go,
+                        struct p2p_device *dev, struct p2p_message *msg)
 {
        unsigned int freq_list[P2P_MAX_PREF_CHANNELS], size;
        unsigned int i;
@@ -725,7 +725,7 @@ static void p2p_check_pref_chan(struct p2p_data *p2p, int go,
 
        /*
          Check if peer's preferred channel list is
-         * _not_ included in the GO Negotiation Request.
+         * _not_ included in the GO Negotiation Request or Invitation Request.
          */
        if (msg->pref_freq_list_len == 0)
                p2p_check_pref_chan_no_recv(p2p, go, dev, msg, freq_list, size);
index d45471a368c07ecfadc453af076682c739d2b65e..0ce4058fe3e697b7fc87f27bd352fcde6be8f20e 100644 (file)
@@ -803,6 +803,8 @@ int p2p_connect_send(struct p2p_data *p2p, struct p2p_device *dev);
 u16 p2p_wps_method_pw_id(enum p2p_wps_method wps_method);
 void p2p_reselect_channel(struct p2p_data *p2p,
                          struct p2p_channels *intersection);
+void p2p_check_pref_chan(struct p2p_data *p2p, int go,
+                        struct p2p_device *dev, struct p2p_message *msg);
 
 /* p2p_pd.c */
 void p2p_process_prov_disc_req(struct p2p_data *p2p, const u8 *sa,
index f5454f70405691ecd7ad6993c6f628e709ba4cdf..108e5b7f93e4d0c45d1dac89737b255aa133ed7c 100644 (file)
@@ -85,6 +85,9 @@ static struct wpabuf * p2p_build_invitation_req(struct p2p_data *p2p,
        p2p_buf_add_device_info(buf, p2p, peer);
        p2p_buf_update_ie_hdr(buf, len);
 
+       p2p_buf_add_pref_channel_list(buf, p2p->pref_freq_list,
+                                     p2p->num_pref_freq);
+
 #ifdef CONFIG_WIFI_DISPLAY
        if (wfd_ie)
                wpabuf_put_buf(buf, wfd_ie);
@@ -343,6 +346,12 @@ void p2p_process_invitation_req(struct p2p_data *p2p, const u8 *sa,
                        p2p_reselect_channel(p2p, &intersection);
                }
 
+               /*
+                * Use the driver preferred frequency list extension if
+                * supported.
+                */
+               p2p_check_pref_chan(p2p, go, dev, &msg);
+
                op_freq = p2p_channel_to_freq(p2p->op_reg_class,
                                              p2p->op_channel);
                if (op_freq < 0) {
@@ -534,6 +543,12 @@ void p2p_process_invitation_resp(struct p2p_data *p2p, const u8 *sa,
                                peer_oper_freq = 0;
                }
 
+               /*
+                * Use the driver preferred frequency list extension if
+                * supported.
+                */
+               p2p_check_pref_chan(p2p, 0, dev, &msg);
+
                p2p->cfg->invitation_result(p2p->cfg->cb_ctx, *msg.status,
                                            msg.group_bssid, channels, sa,
                                            freq, peer_oper_freq);
index 066ff22e3c71b7d010d9f112037a50e668b6bcd3..8465b88437a8b66dc3c11ae93187fbf3807c63fd 100644 (file)
@@ -6488,6 +6488,7 @@ int wpas_p2p_invite(struct wpa_supplicant *wpa_s, const u8 *peer_addr,
                                   pref_freq_list, &size);
        if (res)
                return res;
+       p2p_set_own_pref_freq_list(wpa_s->global->p2p, pref_freq_list, size);
 
        if (wpa_s->global->p2p_disabled || wpa_s->global->p2p == NULL)
                return -1;