diff options
author | David Herrmann <dh.herrmann@gmail.com> | 2014-02-17 11:21:46 +0100 |
---|---|---|
committer | David Herrmann <dh.herrmann@gmail.com> | 2014-02-17 11:21:46 +0100 |
commit | 79f3605ddee4421eb02370dd41db9ec7db496dca (patch) | |
tree | 434e452f1ad7d41c4333b4850b6850a624bd1f21 | |
parent | 0fb894b797dfe31e977749ac2ac579b877be3838 (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.h | 1 | ||||
-rw-r--r-- | src/wpa_parser.c | 13 | ||||
-rw-r--r-- | test/test_wpa.c | 5 |
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"); |