]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
P2P: Set Invitation Type to 1 for GO inviting to a persistent group
authorJouni Malinen <j@w1.fi>
Mon, 6 Feb 2012 19:54:36 +0000 (21:54 +0200)
committerJouni Malinen <j@w1.fi>
Mon, 6 Feb 2012 19:54:36 +0000 (21:54 +0200)
When a GO is operating a persistent group and invites a peer that has
been a P2P client in that persistent group, the Invitation Type in the
Invitation Request frame can be set to 1 to indicate that this is a
reinvocation of a persistent group. Do this based on the maintained
list of P2P clients that have been provided the credentials to this
group.

Signed-hostap: Jouni Malinen <j@w1.fi>

wpa_supplicant/ctrl_iface.c
wpa_supplicant/p2p_supplicant.c
wpa_supplicant/p2p_supplicant.h

index 88981d4b0da24870f86d9128ed0e832c315247f3..6a3223e36e7c0d488dcdb9fc859e722c003d1b95 100644 (file)
@@ -3053,7 +3053,7 @@ static int p2p_ctrl_peer(struct wpa_supplicant *wpa_s, char *cmd,
                return pos - buf;
        pos += res;
 
-       ssid = wpas_p2p_get_persistent(wpa_s, info->p2p_device_addr);
+       ssid = wpas_p2p_get_persistent(wpa_s, info->p2p_device_addr, NULL, 0);
        if (ssid) {
                res = os_snprintf(pos, end - pos, "persistent=%d\n", ssid->id);
                if (res < 0 || res >= end - pos)
index 5cfa9720d609b354e55a9a1ddbd6337a2e37b188..ec4ba4a8e30768f7cff97d09117a389632e61c50 100644 (file)
@@ -3736,6 +3736,7 @@ int wpas_p2p_invite_group(struct wpa_supplicant *wpa_s, const char *ifname,
        enum p2p_invite_role role;
        u8 *bssid = NULL;
        struct wpa_ssid *ssid;
+       int persistent;
 
        for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next) {
                if (os_strcmp(wpa_s->ifname, ifname) == 0)
@@ -3753,6 +3754,10 @@ int wpas_p2p_invite_group(struct wpa_supplicant *wpa_s, const char *ifname,
                return -1;
        }
 
+       persistent = ssid->p2p_persistent_group &&
+               wpas_p2p_get_persistent(wpa_s->parent, peer_addr,
+                                       ssid->ssid, ssid->ssid_len);
+
        if (ssid->mode == WPAS_MODE_P2P_GO) {
                role = P2P_INVITE_ROLE_ACTIVE_GO;
                bssid = wpa_s->own_addr;
@@ -3775,14 +3780,14 @@ int wpas_p2p_invite_group(struct wpa_supplicant *wpa_s, const char *ifname,
        if (wpa_s->drv_flags & WPA_DRIVER_FLAGS_P2P_MGMT)
                return wpa_drv_p2p_invite(wpa_s, peer_addr, role, bssid,
                                          ssid->ssid, ssid->ssid_len,
-                                         go_dev_addr, 0);
+                                         go_dev_addr, persistent);
 
        if (wpa_s->global->p2p_disabled || wpa_s->global->p2p == NULL)
                return -1;
 
        return p2p_invite(wpa_s->global->p2p, peer_addr, role, bssid,
                          ssid->ssid, ssid->ssid_len, wpa_s->assoc_freq,
-                         go_dev_addr, 0);
+                         go_dev_addr, persistent);
 }
 
 
@@ -4382,7 +4387,8 @@ void wpas_p2p_network_removed(struct wpa_supplicant *wpa_s,
 
 
 struct wpa_ssid * wpas_p2p_get_persistent(struct wpa_supplicant *wpa_s,
-                                         const u8 *addr)
+                                         const u8 *addr, const u8 *ssid,
+                                         size_t ssid_len)
 {
        struct wpa_ssid *s;
        size_t i;
@@ -4390,6 +4396,10 @@ struct wpa_ssid * wpas_p2p_get_persistent(struct wpa_supplicant *wpa_s,
        for (s = wpa_s->conf->ssid; s; s = s->next) {
                if (s->disabled != 2)
                        continue;
+               if (ssid &&
+                   (ssid_len != s->ssid_len ||
+                    os_memcmp(ssid, s->ssid, ssid_len) != 0))
+                       continue;
                if (os_memcmp(s->bssid, addr, ETH_ALEN) == 0)
                        return s; /* peer is GO in the persistent group */
                if (s->mode != WPAS_MODE_P2P_GO || s->p2p_client_list == NULL)
index 605741dba61332caea0b69021efb2314a48e7e55..599ff3fd60407324ebf51683dace825abfbf4163 100644 (file)
@@ -133,7 +133,8 @@ int wpas_p2p_in_progress(struct wpa_supplicant *wpa_s);
 void wpas_p2p_network_removed(struct wpa_supplicant *wpa_s,
                              struct wpa_ssid *ssid);
 struct wpa_ssid * wpas_p2p_get_persistent(struct wpa_supplicant *wpa_s,
-                                         const u8 *addr);
+                                         const u8 *addr, const u8 *ssid,
+                                         size_t ssid_len);
 void wpas_p2p_notify_ap_sta_authorized(struct wpa_supplicant *wpa_s,
                                       const u8 *addr);