summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Herrmann <dh.herrmann@gmail.com>2014-02-17 11:21:46 +0100
committerDavid Herrmann <dh.herrmann@gmail.com>2014-02-17 11:21:46 +0100
commit79f3605ddee4421eb02370dd41db9ec7db496dca (patch)
tree434e452f1ad7d41c4333b4850b6850a624bd1f21
parent0fb894b797dfe31e977749ac2ac579b877be3838 (diff)
wpa: parse peer_iface= for P2P-GO-NEG-SUCCESS
If we run as local GO, we need the p2p-addr *and* the iface-addr of the remote peer. Both are advertised in the GO-NEG-SUCCESS event so parse them. Signed-off-by: David Herrmann <dh.herrmann@gmail.com>
-rw-r--r--src/libwfd.h1
-rw-r--r--src/wpa_parser.c13
-rw-r--r--test/test_wpa.c5
3 files changed, 14 insertions, 5 deletions
diff --git a/src/libwfd.h b/src/libwfd.h
index 9ada501..6e8795f 100644
--- a/src/libwfd.h
+++ b/src/libwfd.h
@@ -622,6 +622,7 @@ struct wfd_wpa_event {
struct wfd_wpa_event_p2p_go_neg_success {
char peer_mac[WFD_WPA_EVENT_MAC_STRLEN];
+ char peer_iface[WFD_WPA_EVENT_MAC_STRLEN];
unsigned int role;
} p2p_go_neg_success;
diff --git a/src/wpa_parser.c b/src/wpa_parser.c
index ae44d4b..554e08c 100644
--- a/src/wpa_parser.c
+++ b/src/wpa_parser.c
@@ -302,9 +302,9 @@ static int parse_p2p_go_neg_success(struct wfd_wpa_event *ev,
{
int r;
size_t i;
- bool has_role = false, has_peer = false;
+ bool has_role = false, has_peer = false, has_iface = false;
- if (num < 2)
+ if (num < 3)
return -EINVAL;
for (i = 0; i < num; ++i, tokens += strlen(tokens) + 1) {
@@ -324,10 +324,17 @@ static int parse_p2p_go_neg_success(struct wfd_wpa_event *ev,
return r;
has_peer = true;
+ } else if (!strncmp(tokens, "peer_iface=", 11)) {
+ r = parse_mac(ev->p.p2p_go_neg_success.peer_iface,
+ &tokens[11]);
+ if (r < 0)
+ return r;
+
+ has_iface = true;
}
}
- return (has_role && has_peer) ? 0 : -EINVAL;
+ return (has_role && has_peer && has_iface) ? 0 : -EINVAL;
}
static int parse_p2p_group_started(struct wfd_wpa_event *ev,
diff --git a/test/test_wpa.c b/test/test_wpa.c
index 3eb11c9..86a388e 100644
--- a/test/test_wpa.c
+++ b/test/test_wpa.c
@@ -45,7 +45,7 @@ static const char *event_list[] = {
[WFD_WPA_EVENT_P2P_DEVICE_LOST] = "P2P-DEVICE-LOST p2p_dev_addr=00:00:00:00:00:00",
[WFD_WPA_EVENT_P2P_FIND_STOPPED] = "P2P-FIND-STOPPED",
[WFD_WPA_EVENT_P2P_GO_NEG_REQUEST] = "P2P-GO-NEG-REQUEST",
- [WFD_WPA_EVENT_P2P_GO_NEG_SUCCESS] = "P2P-GO-NEG-SUCCESS role=GO peer_dev=00:00:00:00:00:00",
+ [WFD_WPA_EVENT_P2P_GO_NEG_SUCCESS] = "P2P-GO-NEG-SUCCESS role=GO peer_dev=00:00:00:00:00:00 peer_iface=00:00:00:00:00:00",
[WFD_WPA_EVENT_P2P_GO_NEG_FAILURE] = "P2P-GO-NEG-FAILURE",
[WFD_WPA_EVENT_P2P_GROUP_FORMATION_SUCCESS] = "P2P-GROUP-FORMATION-SUCCESS",
[WFD_WPA_EVENT_P2P_GROUP_FORMATION_FAILURE] = "P2P-GROUP-FORMATION-FAILURE",
@@ -140,11 +140,12 @@ START_TEST(test_wpa_parser_payload)
ck_assert(!strcmp(ev.p.p2p_prov_disc_show_pin.peer_mac, "0:0:0:0:0:0"));
ck_assert(!strcmp(ev.p.p2p_prov_disc_show_pin.pin, "1234567890"));
- parse(&ev, "<4>P2P-GO-NEG-SUCCESS role=GO peer_dev=0:0:0:0:0:0");
+ parse(&ev, "<4>P2P-GO-NEG-SUCCESS role=GO peer_dev=0:0:0:0:0:0 peer_iface=ff:ff:ff:ff:ff:ff");
ck_assert(ev.priority == WFD_WPA_EVENT_P_ERROR);
ck_assert(ev.type == WFD_WPA_EVENT_P2P_GO_NEG_SUCCESS);
ck_assert(ev.raw != NULL);
ck_assert(!strcmp(ev.p.p2p_go_neg_success.peer_mac, "0:0:0:0:0:0"));
+ ck_assert(!strcmp(ev.p.p2p_go_neg_success.peer_iface, "ff:ff:ff:ff:ff:ff"));
ck_assert(ev.p.p2p_go_neg_success.role == WFD_WPA_EVENT_ROLE_GO);
parse(&ev, "<4>P2P-GROUP-STARTED p2p-wlan0-0 client go_dev_addr=0:0:0:0:0:0");