]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
P2P: Allow p2p_invite-persistent to specify channel for GO
authorJouni Malinen <jouni@qca.qualcomm.com>
Fri, 31 Aug 2012 18:20:51 +0000 (21:20 +0300)
committerJouni Malinen <j@w1.fi>
Fri, 31 Aug 2012 18:20:51 +0000 (21:20 +0300)
The freq and ht40 parameters can now be used with the p2p_invite
command when reinvoking a persistent group as the GO.

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

wpa_supplicant/README-P2P
wpa_supplicant/ctrl_iface.c
wpa_supplicant/dbus/dbus_new_handlers_p2p.c
wpa_supplicant/p2p_supplicant.c
wpa_supplicant/p2p_supplicant.h
wpa_supplicant/wpa_supplicant_i.h

index 6b81397f7e0a5051766cac816ac3a245c1461aa3..4abc2f2a680e6cffdc603fc9723c418747953b02 100644 (file)
@@ -125,7 +125,7 @@ join-a-group style PD instead of GO Negotiation style PD.
 
 p2p_connect <peer device address> <pbc|pin|PIN#> [display|keypad]
        [persistent|persistent=<network id>] [join|auth]
-       [go_intent=<0..15>] [freq=<in MHz>] [provdisc]
+       [go_intent=<0..15>] [freq=<in MHz>] [ht40] [provdisc]
 
 Start P2P group formation with a discovered P2P peer. This includes
 optional group owner negotiation, group interface setup, provisioning,
@@ -166,7 +166,7 @@ used prior to starting GO Negotiation as a workaround with some deployed
 P2P implementations that require this to allow the user to accept the
 connection.
 
-p2p_group_add [persistent|persistent=<network id>] [freq=<freq in MHz>]
+p2p_group_add [persistent|persistent=<network id>] [freq=<freq in MHz>] [ht40]
 
 Set up a P2P group owner manually (i.e., without group owner
 negotiation with a specific peer). This is also known as autonomous
@@ -346,7 +346,7 @@ Remove all local services from internal SD query processing.
 Invitation
 
 p2p_invite [persistent=<network id>|group=<group ifname>] [peer=address]
-       [go_dev_addr=address]
+       [go_dev_addr=address] [freq=<freq in MHz>] [ht40]
 
 Invite a peer to join a group (e.g., group=wlan1) or to reinvoke a
 persistent group (e.g., persistent=4). If the peer device is the GO of
@@ -354,7 +354,8 @@ the persistent group, the peer parameter is not needed. Otherwise it is
 used to specify which device to invite. go_dev_addr parameter can be
 used to override the GO device address for Invitation Request should
 it be not known for some reason (this should not be needed in most
-cases).
+cases). When reinvoking a persistent group, the GO device can specify
+the frequency for the group with the freq parameter.
 
 Group Operations
 
index d7ce6feec6fd43a0b462284b151f69d4bd0606a2..18dd088d8914c1ee7c853524d28c304d396cb29c 100644 (file)
@@ -3515,6 +3515,8 @@ static int p2p_ctrl_invite_persistent(struct wpa_supplicant *wpa_s, char *cmd)
        int id;
        struct wpa_ssid *ssid;
        u8 peer[ETH_ALEN];
+       int freq = 0;
+       int ht40;
 
        id = atoi(cmd);
        pos = os_strstr(cmd, " peer=");
@@ -3531,7 +3533,18 @@ static int p2p_ctrl_invite_persistent(struct wpa_supplicant *wpa_s, char *cmd)
                return -1;
        }
 
-       return wpas_p2p_invite(wpa_s, pos ? peer : NULL, ssid, NULL);
+       pos = os_strstr(cmd, " freq=");
+       if (pos) {
+               pos += 6;
+               freq = atoi(pos);
+               if (freq <= 0)
+                       return -1;
+       }
+
+       ht40 = os_strstr(cmd, " ht40") != NULL;
+
+       return wpas_p2p_invite(wpa_s, pos ? peer : NULL, ssid, NULL, freq,
+                              ht40);
 }
 
 
index aee8b3a596c5b4dd1e700c23df13ca3c31bbf72a..30e0eb3e5fb8c7f215057c59329168f1ec324aa7 100644 (file)
@@ -630,7 +630,7 @@ DBusMessage * wpas_dbus_handler_p2p_invite(DBusMessage *message,
                if (ssid == NULL || ssid->disabled != 2)
                        goto err;
 
-               if (wpas_p2p_invite(wpa_s, peer_addr, ssid, NULL) < 0) {
+               if (wpas_p2p_invite(wpa_s, peer_addr, ssid, NULL, 0, 0) < 0) {
                        reply = wpas_dbus_error_unknown_error(
                                message,
                                "Failed to reinvoke a persistent group");
index b996b2b4aea4a57af5358ab498ee8828df0034ea..191d543a23b44a3b5ada30e08617c6d4537a2d17 100644 (file)
@@ -2298,7 +2298,9 @@ static void wpas_invitation_result(void *ctx, int status, const u8 *bssid)
        }
 
        wpas_p2p_group_add_persistent(wpa_s, ssid,
-                                     ssid->mode == WPAS_MODE_P2P_GO, 0, 0);
+                                     ssid->mode == WPAS_MODE_P2P_GO,
+                                     wpa_s->p2p_persistent_go_freq,
+                                     wpa_s->p2p_go_ht40);
 }
 
 
@@ -4325,11 +4327,14 @@ int wpas_p2p_reject(struct wpa_supplicant *wpa_s, const u8 *addr)
 
 /* Invite to reinvoke a persistent group */
 int wpas_p2p_invite(struct wpa_supplicant *wpa_s, const u8 *peer_addr,
-                   struct wpa_ssid *ssid, const u8 *go_dev_addr)
+                   struct wpa_ssid *ssid, const u8 *go_dev_addr, int freq,
+                   int ht40)
 {
        enum p2p_invite_role role;
        u8 *bssid = NULL;
 
+       wpa_s->p2p_persistent_go_freq = freq;
+       wpa_s->p2p_go_ht40 = !!ht40;
        if (ssid->mode == WPAS_MODE_P2P_GO) {
                role = P2P_INVITE_ROLE_GO;
                if (peer_addr == NULL) {
@@ -4363,7 +4368,7 @@ int wpas_p2p_invite(struct wpa_supplicant *wpa_s, const u8 *peer_addr,
                return -1;
 
        return p2p_invite(wpa_s->global->p2p, peer_addr, role, bssid,
-                         ssid->ssid, ssid->ssid_len, 0, go_dev_addr, 1);
+                         ssid->ssid, ssid->ssid_len, freq, go_dev_addr, 1);
 }
 
 
@@ -4377,6 +4382,9 @@ int wpas_p2p_invite_group(struct wpa_supplicant *wpa_s, const char *ifname,
        struct wpa_ssid *ssid;
        int persistent;
 
+       wpa_s->p2p_persistent_go_freq = 0;
+       wpa_s->p2p_go_ht40 = 0;
+
        for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next) {
                if (os_strcmp(wpa_s->ifname, ifname) == 0)
                        break;
index 1e0e68f6ada8437794bdac45a02c535ed8e5b4aa..2e2a8a47bcfb8dbe33b89c407431f50b84dc5dd0 100644 (file)
@@ -104,7 +104,8 @@ int wpas_p2p_service_del_upnp(struct wpa_supplicant *wpa_s, u8 version,
                              const char *service);
 int wpas_p2p_reject(struct wpa_supplicant *wpa_s, const u8 *addr);
 int wpas_p2p_invite(struct wpa_supplicant *wpa_s, const u8 *peer_addr,
-                   struct wpa_ssid *ssid, const u8 *go_dev_addr);
+                   struct wpa_ssid *ssid, const u8 *go_dev_addr, int freq,
+                   int ht40);
 int wpas_p2p_invite_group(struct wpa_supplicant *wpa_s, const char *ifname,
                          const u8 *peer_addr, const u8 *go_dev_addr);
 void wpas_p2p_completed(struct wpa_supplicant *wpa_s);
index 523b50dfe7954b0d7f19595d00ad74f72bc53c8f..fb8dba8c24d96ddfef2937f55cb05944e4f07182 100644 (file)
@@ -539,6 +539,7 @@ struct wpa_supplicant {
        unsigned int p2p_fallback_to_go_neg:1;
        unsigned int p2p_pd_before_go_neg:1;
        unsigned int p2p_go_ht40:1;
+       int p2p_persistent_go_freq;
        int p2p_persistent_id;
        int p2p_go_intent;
        int p2p_connect_freq;