P2P: Allow p2p_invite-persistent to specify channel for GO
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>
This commit is contained in:
parent
55d834e172
commit
4d32c0c44d
6 changed files with 34 additions and 10 deletions
|
@ -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]
|
p2p_connect <peer device address> <pbc|pin|PIN#> [display|keypad]
|
||||||
[persistent|persistent=<network id>] [join|auth]
|
[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
|
Start P2P group formation with a discovered P2P peer. This includes
|
||||||
optional group owner negotiation, group interface setup, provisioning,
|
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
|
P2P implementations that require this to allow the user to accept the
|
||||||
connection.
|
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
|
Set up a P2P group owner manually (i.e., without group owner
|
||||||
negotiation with a specific peer). This is also known as autonomous
|
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
|
Invitation
|
||||||
|
|
||||||
p2p_invite [persistent=<network id>|group=<group ifname>] [peer=address]
|
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
|
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
|
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 specify which device to invite. go_dev_addr parameter can be
|
||||||
used to override the GO device address for Invitation Request should
|
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
|
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
|
Group Operations
|
||||||
|
|
||||||
|
|
|
@ -3515,6 +3515,8 @@ static int p2p_ctrl_invite_persistent(struct wpa_supplicant *wpa_s, char *cmd)
|
||||||
int id;
|
int id;
|
||||||
struct wpa_ssid *ssid;
|
struct wpa_ssid *ssid;
|
||||||
u8 peer[ETH_ALEN];
|
u8 peer[ETH_ALEN];
|
||||||
|
int freq = 0;
|
||||||
|
int ht40;
|
||||||
|
|
||||||
id = atoi(cmd);
|
id = atoi(cmd);
|
||||||
pos = os_strstr(cmd, " peer=");
|
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 -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -630,7 +630,7 @@ DBusMessage * wpas_dbus_handler_p2p_invite(DBusMessage *message,
|
||||||
if (ssid == NULL || ssid->disabled != 2)
|
if (ssid == NULL || ssid->disabled != 2)
|
||||||
goto err;
|
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(
|
reply = wpas_dbus_error_unknown_error(
|
||||||
message,
|
message,
|
||||||
"Failed to reinvoke a persistent group");
|
"Failed to reinvoke a persistent group");
|
||||||
|
|
|
@ -2298,7 +2298,9 @@ static void wpas_invitation_result(void *ctx, int status, const u8 *bssid)
|
||||||
}
|
}
|
||||||
|
|
||||||
wpas_p2p_group_add_persistent(wpa_s, ssid,
|
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 */
|
/* Invite to reinvoke a persistent group */
|
||||||
int wpas_p2p_invite(struct wpa_supplicant *wpa_s, const u8 *peer_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)
|
||||||
{
|
{
|
||||||
enum p2p_invite_role role;
|
enum p2p_invite_role role;
|
||||||
u8 *bssid = NULL;
|
u8 *bssid = NULL;
|
||||||
|
|
||||||
|
wpa_s->p2p_persistent_go_freq = freq;
|
||||||
|
wpa_s->p2p_go_ht40 = !!ht40;
|
||||||
if (ssid->mode == WPAS_MODE_P2P_GO) {
|
if (ssid->mode == WPAS_MODE_P2P_GO) {
|
||||||
role = P2P_INVITE_ROLE_GO;
|
role = P2P_INVITE_ROLE_GO;
|
||||||
if (peer_addr == NULL) {
|
if (peer_addr == NULL) {
|
||||||
|
@ -4363,7 +4368,7 @@ int wpas_p2p_invite(struct wpa_supplicant *wpa_s, const u8 *peer_addr,
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
return p2p_invite(wpa_s->global->p2p, peer_addr, role, bssid,
|
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;
|
struct wpa_ssid *ssid;
|
||||||
int persistent;
|
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) {
|
for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next) {
|
||||||
if (os_strcmp(wpa_s->ifname, ifname) == 0)
|
if (os_strcmp(wpa_s->ifname, ifname) == 0)
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -104,7 +104,8 @@ int wpas_p2p_service_del_upnp(struct wpa_supplicant *wpa_s, u8 version,
|
||||||
const char *service);
|
const char *service);
|
||||||
int wpas_p2p_reject(struct wpa_supplicant *wpa_s, const u8 *addr);
|
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,
|
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,
|
int wpas_p2p_invite_group(struct wpa_supplicant *wpa_s, const char *ifname,
|
||||||
const u8 *peer_addr, const u8 *go_dev_addr);
|
const u8 *peer_addr, const u8 *go_dev_addr);
|
||||||
void wpas_p2p_completed(struct wpa_supplicant *wpa_s);
|
void wpas_p2p_completed(struct wpa_supplicant *wpa_s);
|
||||||
|
|
|
@ -539,6 +539,7 @@ struct wpa_supplicant {
|
||||||
unsigned int p2p_fallback_to_go_neg:1;
|
unsigned int p2p_fallback_to_go_neg:1;
|
||||||
unsigned int p2p_pd_before_go_neg:1;
|
unsigned int p2p_pd_before_go_neg:1;
|
||||||
unsigned int p2p_go_ht40:1;
|
unsigned int p2p_go_ht40:1;
|
||||||
|
int p2p_persistent_go_freq;
|
||||||
int p2p_persistent_id;
|
int p2p_persistent_id;
|
||||||
int p2p_go_intent;
|
int p2p_go_intent;
|
||||||
int p2p_connect_freq;
|
int p2p_connect_freq;
|
||||||
|
|
Loading…
Reference in a new issue