P2PS: Set intended interface address correctly for new group
authorAndrei Otcheretianski <andrei.otcheretianski@intel.com>
Thu, 2 Jul 2015 07:45:07 +0000 (10:45 +0300)
committerJouni Malinen <j@w1.fi>
Tue, 7 Jul 2015 17:57:07 +0000 (20:57 +0300)
If a device may be an explicit GO, it adds the GO details in the PD
Request. First, we try to reuse an active GO. If it is not present, we
try to reuse a non-active persistent group. In the latter case, if a
dedicated P2P interface is needed, the intended address should be that
of the pending interface. However, the wpas_get_go_info() provided the
ssid->bssid address, which is the address of the P2P device. This might
result in an incorrect intended interface attribute in the PD Request in
case a separate group interface is used.

Fix this by setting group_iface variable to true only if a dedicated
interface should be used and set the attribute accordingly.

Signed-off-by: Andrei Otcheretianski <andrei.otcheretianski@intel.com>
Reviewed-by: Max Stepanov <Max.Stepanov@intel.com>
Reviewed-by: Ilan Peer <ilan.peer@intel.com>
src/p2p/p2p_pd.c
wpa_supplicant/p2p_supplicant.c

index 532c6f0..1342231 100644 (file)
@@ -57,7 +57,11 @@ static void p2ps_add_new_group_info(struct p2p_data *p2p, struct wpabuf *buf)
        if (found) {
                p2p_buf_add_group_id(buf, p2p->cfg->dev_addr,
                                     ssid, ssid_len);
-               p2p_buf_add_intended_addr(buf, intended_addr);
+
+               if (group_iface)
+                       p2p_buf_add_intended_addr(buf, p2p->intended_addr);
+               else
+                       p2p_buf_add_intended_addr(buf, intended_addr);
        } else {
                if (!p2p->ssid_set) {
                        p2p_build_ssid(p2p, p2p->ssid, &p2p->ssid_len);
index 9e2760f..ce06e61 100644 (file)
@@ -3546,17 +3546,24 @@ static int wpas_get_go_info(void *ctx, u8 *intended_addr,
        struct wpa_ssid *s;
        u8 bssid[ETH_ALEN];
 
+       /*
+        * group_iface will be set to 1 only if a dedicated interface for P2P
+        * role is required. First, we try to reuse an active GO. However,
+        * if it is not present, we will try to reactivate an existing
+        * persistent group and set group_iface to 1, so the caller will know
+        * that the pending interface should be used.
+        */
+       *group_iface = 0;
        s = wpas_p2p_group_go_ssid(wpa_s, bssid);
        if (!s) {
                s = wpas_p2p_get_persistent_go(wpa_s);
+               *group_iface = wpas_p2p_create_iface(wpa_s);
                if (s)
                        os_memcpy(bssid, s->bssid, ETH_ALEN);
+               else
+                       return 0;
        }
 
-       *group_iface = wpas_p2p_create_iface(wpa_s);
-       if (!s)
-               return 0;
-
        os_memcpy(intended_addr, bssid, ETH_ALEN);
        os_memcpy(ssid, s->ssid, s->ssid_len);
        *ssid_len = s->ssid_len;