P2P: Add P2P_GROUP_MEMBER command to fetch client interface address

This allows local GO to fetch the P2P Interface Address of a P2P Client
in the group based on the P2P Device Address for the client. This
command should be sent only on a group interface (the same peer may be
in multiple concurrent groups).

Usage:
P2P_GROUP_MEMBER <P2P Device Address>

Output:
<P2P Interface Address>

Signed-off-by: Purushottam Kushwaha <pkushwah@qti.qualcomm.com>
This commit is contained in:
Purushottam Kushwaha 2016-04-13 11:00:08 +05:30 committed by Jouni Malinen
parent 0ee8925098
commit 57b38882e5
4 changed files with 61 additions and 0 deletions

View file

@ -2132,6 +2132,16 @@ int p2p_client_limit_reached(struct p2p_group *group);
*/ */
const u8 * p2p_iterate_group_members(struct p2p_group *group, void **next); const u8 * p2p_iterate_group_members(struct p2p_group *group, void **next);
/**
* p2p_group_get_client_interface_addr - Get P2P Interface Address of a client in a group
* @group: P2P group context from p2p_group_init()
* @dev_addr: P2P Device Address of the client
* Returns: P2P Interface Address of the client if found or %NULL if no match
* found
*/
const u8 * p2p_group_get_client_interface_addr(struct p2p_group *group,
const u8 *dev_addr);
/** /**
* p2p_group_get_dev_addr - Get a P2P Device Address of a client in a group * p2p_group_get_dev_addr - Get a P2P Device Address of a client in a group
* @group: P2P group context from p2p_group_init() * @group: P2P group context from p2p_group_init()

View file

@ -850,6 +850,20 @@ static struct p2p_group_member * p2p_group_get_client(struct p2p_group *group,
} }
const u8 * p2p_group_get_client_interface_addr(struct p2p_group *group,
const u8 *dev_addr)
{
struct p2p_group_member *m;
if (!group)
return NULL;
m = p2p_group_get_client(group, dev_addr);
if (m)
return m->addr;
return NULL;
}
static struct p2p_group_member * p2p_group_get_client_iface( static struct p2p_group_member * p2p_group_get_client_iface(
struct p2p_group *group, const u8 *interface_addr) struct p2p_group *group, const u8 *interface_addr)
{ {

View file

@ -5834,6 +5834,29 @@ static int p2p_ctrl_group_add(struct wpa_supplicant *wpa_s, char *cmd)
} }
static int p2p_ctrl_group_member(struct wpa_supplicant *wpa_s, const char *cmd,
char *buf, size_t buflen)
{
u8 dev_addr[ETH_ALEN];
struct wpa_ssid *ssid;
int res;
const u8 *iaddr;
ssid = wpa_s->current_ssid;
if (!wpa_s->global->p2p || !ssid || ssid->mode != WPAS_MODE_P2P_GO ||
hwaddr_aton(cmd, dev_addr))
return -1;
iaddr = p2p_group_get_client_interface_addr(wpa_s->p2p_group, dev_addr);
if (!iaddr)
return -1;
res = os_snprintf(buf, buflen, MACSTR, MAC2STR(iaddr));
if (os_snprintf_error(buflen, res))
return -1;
return res;
}
static int p2p_ctrl_peer(struct wpa_supplicant *wpa_s, char *cmd, static int p2p_ctrl_peer(struct wpa_supplicant *wpa_s, char *cmd,
char *buf, size_t buflen) char *buf, size_t buflen)
{ {
@ -8808,6 +8831,9 @@ char * wpa_supplicant_ctrl_iface_process(struct wpa_supplicant *wpa_s,
} else if (os_strncmp(buf, "P2P_GROUP_ADD ", 14) == 0) { } else if (os_strncmp(buf, "P2P_GROUP_ADD ", 14) == 0) {
if (p2p_ctrl_group_add(wpa_s, buf + 14)) if (p2p_ctrl_group_add(wpa_s, buf + 14))
reply_len = -1; reply_len = -1;
} else if (os_strncmp(buf, "P2P_GROUP_MEMBER ", 17) == 0) {
reply_len = p2p_ctrl_group_member(wpa_s, buf + 17, reply,
reply_size);
} else if (os_strncmp(buf, "P2P_PROV_DISC ", 14) == 0) { } else if (os_strncmp(buf, "P2P_PROV_DISC ", 14) == 0) {
if (p2p_ctrl_prov_disc(wpa_s, buf + 14)) if (p2p_ctrl_prov_disc(wpa_s, buf + 14))
reply_len = -1; reply_len = -1;
@ -9552,6 +9578,7 @@ static char * wpas_global_ctrl_iface_redir_p2p(struct wpa_global *global,
"P2P_LISTEN ", "P2P_LISTEN ",
"P2P_GROUP_REMOVE ", "P2P_GROUP_REMOVE ",
"P2P_GROUP_ADD ", "P2P_GROUP_ADD ",
"P2P_GROUP_MEMBER ",
"P2P_PROV_DISC ", "P2P_PROV_DISC ",
"P2P_SERV_DISC_REQ ", "P2P_SERV_DISC_REQ ",
"P2P_SERV_DISC_CANCEL_REQ ", "P2P_SERV_DISC_CANCEL_REQ ",

View file

@ -2175,6 +2175,13 @@ static int wpa_cli_cmd_p2p_group_add(struct wpa_ctrl *ctrl, int argc,
} }
static int wpa_cli_cmd_p2p_group_member(struct wpa_ctrl *ctrl, int argc,
char *argv[])
{
return wpa_cli_cmd(ctrl, "P2P_GROUP_MEMBER", 1, argc, argv);
}
static int wpa_cli_cmd_p2p_prov_disc(struct wpa_ctrl *ctrl, int argc, static int wpa_cli_cmd_p2p_prov_disc(struct wpa_ctrl *ctrl, int argc,
char *argv[]) char *argv[])
{ {
@ -3253,6 +3260,9 @@ static const struct wpa_cli_cmd wpa_cli_commands[] = {
"<ifname> = remove P2P group interface (terminate group if GO)" }, "<ifname> = remove P2P group interface (terminate group if GO)" },
{ "p2p_group_add", wpa_cli_cmd_p2p_group_add, NULL, cli_cmd_flag_none, { "p2p_group_add", wpa_cli_cmd_p2p_group_add, NULL, cli_cmd_flag_none,
"[ht40] = add a new P2P group (local end as GO)" }, "[ht40] = add a new P2P group (local end as GO)" },
{ "p2p_group_member", wpa_cli_cmd_p2p_group_member, NULL,
cli_cmd_flag_none,
"<dev_addr> = Get peer interface address on local GO using peer Device Address" },
{ "p2p_prov_disc", wpa_cli_cmd_p2p_prov_disc, { "p2p_prov_disc", wpa_cli_cmd_p2p_prov_disc,
wpa_cli_complete_p2p_peer, cli_cmd_flag_none, wpa_cli_complete_p2p_peer, cli_cmd_flag_none,
"<addr> <method> = request provisioning discovery" }, "<addr> <method> = request provisioning discovery" },