From 866eb800e5514b0a0fc1b2574c70f3e237e61e8f Mon Sep 17 00:00:00 2001 From: Jouni Malinen Date: Mon, 15 Jun 2015 14:15:30 +0300 Subject: [PATCH] tests: VENDOR_ELEM_ADD for various frames This increases testing coverage for VENDOR_ELEM mechanism by explicitly verifying that the requested element gets added to each of the supported frame types. Signed-off-by: Jouni Malinen --- tests/hwsim/test_p2p_ext.py | 273 +++++++++++++++++++++++++++++++++++- 1 file changed, 272 insertions(+), 1 deletion(-) diff --git a/tests/hwsim/test_p2p_ext.py b/tests/hwsim/test_p2p_ext.py index 8acdfbdff..7385e970f 100644 --- a/tests/hwsim/test_p2p_ext.py +++ b/tests/hwsim/test_p2p_ext.py @@ -1,8 +1,15 @@ # P2P vendor specific extension tests -# Copyright (c) 2014, Qualcomm Atheros, Inc. +# Copyright (c) 2014-2015, Qualcomm Atheros, Inc. +# +# This software may be distributed under the terms of the BSD license. +# See README for more details. import logging logger = logging.getLogger() +import os + +from tshark import run_tshark +from test_p2p_persistent import form def test_p2p_ext_discovery(dev): """P2P device discovery with vendor specific extensions""" @@ -88,3 +95,267 @@ def test_p2p_ext_discovery_go(dev): dev[0].request("VENDOR_ELEM_REMOVE 2 *") dev[0].request("VENDOR_ELEM_REMOVE 3 *") dev[0].request("VENDOR_ELEM_REMOVE 12 *") + +def test_p2p_ext_vendor_elem_probe_req(dev): + """VENDOR_ELEM in P2P Probe Request frames""" + try: + _test_p2p_ext_vendor_elem_probe_req(dev) + finally: + dev[0].request("VENDOR_ELEM_REMOVE 0 *") + +def _test_p2p_ext_vendor_elem_probe_req(dev): + addr1 = dev[1].p2p_dev_addr() + if "OK" not in dev[0].request("VENDOR_ELEM_ADD 0 dd050011223300"): + raise Exception("VENDOR_ELEM_ADD failed") + dev[1].p2p_listen() + if not dev[0].discover_peer(addr1): + raise Exception("Device discovery timed out") + if "FAIL" in dev[1].request("SET ext_mgmt_frame_handling 1"): + raise Exception("Failed to enable external management frame handling") + ev = dev[1].wait_event(["MGMT-RX"], timeout=5) + if ev is None: + raise Exception("MGMT-RX timeout") + if " 40" not in ev: + raise Exception("Not a Probe Request frame") + if "dd050011223300" not in ev: + raise Exception("Vendor element not found from Probe Request frame") + dev[0].p2p_stop_find() + dev[1].p2p_stop_find() + +def test_p2p_ext_vendor_elem_pd_req(dev): + """VENDOR_ELEM in PD Request frames""" + try: + _test_p2p_ext_vendor_elem_pd_req(dev) + finally: + dev[0].request("VENDOR_ELEM_REMOVE 4 *") + +def _test_p2p_ext_vendor_elem_pd_req(dev): + addr0 = dev[0].p2p_dev_addr() + addr1 = dev[1].p2p_dev_addr() + if "OK" not in dev[0].request("VENDOR_ELEM_ADD 4 dd050011223301"): + raise Exception("VENDOR_ELEM_ADD failed") + dev[1].p2p_listen() + if not dev[0].discover_peer(addr1): + raise Exception("Device discovery timed out") + dev[0].p2p_stop_find() + if "FAIL" in dev[1].request("SET ext_mgmt_frame_handling 1"): + raise Exception("Failed to enable external management frame handling") + dev[0].global_request("P2P_PROV_DISC " + addr1 + " display") + for i in range(5): + ev = dev[1].wait_event(["MGMT-RX"], timeout=5) + if ev is None: + raise Exception("MGMT-RX timeout") + if " d0" in ev: + break + if "dd050011223301" not in ev: + raise Exception("Vendor element not found from PD Request frame") + dev[1].p2p_stop_find() + dev[0].p2p_stop_find() + +def test_p2p_ext_vendor_elem_pd_resp(dev): + """VENDOR_ELEM in PD Response frames""" + try: + _test_p2p_ext_vendor_elem_pd_resp(dev) + finally: + dev[0].request("VENDOR_ELEM_REMOVE 5 *") + +def _test_p2p_ext_vendor_elem_pd_resp(dev): + addr0 = dev[0].p2p_dev_addr() + addr1 = dev[1].p2p_dev_addr() + if "OK" not in dev[0].request("VENDOR_ELEM_ADD 5 dd050011223302"): + raise Exception("VENDOR_ELEM_ADD failed") + dev[0].p2p_listen() + if not dev[1].discover_peer(addr0): + raise Exception("Device discovery timed out") + dev[1].p2p_stop_find() + if "FAIL" in dev[1].request("SET ext_mgmt_frame_handling 1"): + raise Exception("Failed to enable external management frame handling") + dev[1].global_request("P2P_PROV_DISC " + addr0 + " display") + for i in range(5): + ev = dev[1].wait_event(["MGMT-RX"], timeout=5) + if ev is None: + raise Exception("MGMT-RX timeout") + if " d0" in ev: + break + if "dd050011223302" not in ev: + raise Exception("Vendor element not found from PD Response frame") + dev[0].p2p_stop_find() + dev[1].p2p_stop_find() + +def test_p2p_ext_vendor_elem_go_neg_req(dev): + """VENDOR_ELEM in GO Negotiation Request frames""" + try: + _test_p2p_ext_vendor_elem_go_neg_req(dev) + finally: + dev[0].request("VENDOR_ELEM_REMOVE 6 *") + +def _test_p2p_ext_vendor_elem_go_neg_req(dev): + addr0 = dev[0].p2p_dev_addr() + addr1 = dev[1].p2p_dev_addr() + if "OK" not in dev[0].request("VENDOR_ELEM_ADD 6 dd050011223303"): + raise Exception("VENDOR_ELEM_ADD failed") + dev[1].p2p_listen() + if not dev[0].discover_peer(addr1): + raise Exception("Device discovery timed out") + dev[0].p2p_stop_find() + if "FAIL" in dev[1].request("SET ext_mgmt_frame_handling 1"): + raise Exception("Failed to enable external management frame handling") + dev[0].global_request("P2P_CONNECT " + addr1 + " 12345670 display") + for i in range(5): + ev = dev[1].wait_event(["MGMT-RX"], timeout=5) + if ev is None: + raise Exception("MGMT-RX timeout") + if " d0" in ev: + break + if "dd050011223303" not in ev: + raise Exception("Vendor element not found from GO Negotiation Request frame") + dev[1].p2p_stop_find() + dev[0].p2p_stop_find() + +def test_p2p_ext_vendor_elem_go_neg_resp(dev): + """VENDOR_ELEM in GO Negotiation Response frames""" + try: + _test_p2p_ext_vendor_elem_go_neg_resp(dev) + finally: + dev[0].request("VENDOR_ELEM_REMOVE 7 *") + +def _test_p2p_ext_vendor_elem_go_neg_resp(dev): + addr0 = dev[0].p2p_dev_addr() + addr1 = dev[1].p2p_dev_addr() + if "OK" not in dev[0].request("VENDOR_ELEM_ADD 7 dd050011223304"): + raise Exception("VENDOR_ELEM_ADD failed") + dev[0].p2p_listen() + if not dev[1].discover_peer(addr0): + raise Exception("Device discovery timed out") + dev[1].p2p_stop_find() + if "FAIL" in dev[1].request("SET ext_mgmt_frame_handling 1"): + raise Exception("Failed to enable external management frame handling") + dev[1].global_request("P2P_CONNECT " + addr0 + " 12345670 display") + for i in range(5): + ev = dev[1].wait_event(["MGMT-RX"], timeout=5) + if ev is None: + raise Exception("MGMT-RX timeout") + if " d0" in ev: + break + if "dd050011223304" not in ev: + raise Exception("Vendor element not found from GO Negotiation Response frame") + dev[0].p2p_stop_find() + dev[1].p2p_stop_find() + +def test_p2p_ext_vendor_elem_go_neg_conf(dev, apdev, params): + """VENDOR_ELEM in GO Negotiation Confirm frames""" + try: + _test_p2p_ext_vendor_elem_go_neg_conf(dev, apdev, params) + finally: + dev[0].request("VENDOR_ELEM_REMOVE 8 *") + +def _test_p2p_ext_vendor_elem_go_neg_conf(dev, apdev, params): + addr0 = dev[0].p2p_dev_addr() + addr1 = dev[1].p2p_dev_addr() + if "OK" not in dev[0].request("VENDOR_ELEM_ADD 8 dd050011223305"): + raise Exception("VENDOR_ELEM_ADD failed") + dev[0].p2p_listen() + dev[1].p2p_listen() + dev[1].p2p_go_neg_auth(addr0, "12345670", "enter") + dev[0].p2p_go_neg_init(addr1, "12345678", "display") + dev[1].p2p_go_neg_auth_result(expect_failure=True) + + out = run_tshark(os.path.join(params['logdir'], "hwsim0.pcapng"), + "wifi_p2p.public_action.subtype == 2") + if "Vendor Specific Data: 3305" not in out: + raise Exception("Vendor element not found from GO Negotiation Confirm frame") + +def test_p2p_ext_vendor_elem_invitation(dev): + """VENDOR_ELEM in Invitation frames""" + try: + _test_p2p_ext_vendor_elem_invitation(dev) + finally: + dev[0].request("VENDOR_ELEM_REMOVE 9 *") + dev[0].request("VENDOR_ELEM_REMOVE 10 *") + +def _test_p2p_ext_vendor_elem_invitation(dev): + addr0 = dev[0].p2p_dev_addr() + addr1 = dev[1].p2p_dev_addr() + form(dev[0], dev[1]) + if "OK" not in dev[0].request("VENDOR_ELEM_ADD 9 dd050011223306"): + raise Exception("VENDOR_ELEM_ADD failed") + if "OK" not in dev[0].request("VENDOR_ELEM_ADD 10 dd050011223307"): + raise Exception("VENDOR_ELEM_ADD failed") + dev[1].p2p_listen() + if not dev[0].discover_peer(addr1): + raise Exception("Device discovery timed out") + peer = dev[0].get_peer(addr1) + dev[0].p2p_stop_find() + if "FAIL" in dev[1].request("SET ext_mgmt_frame_handling 1"): + raise Exception("Failed to enable external management frame handling") + dev[0].global_request("P2P_INVITE persistent=" + peer['persistent'] + " peer=" + addr1) + for i in range(5): + ev = dev[1].wait_event(["MGMT-RX"], timeout=5) + if ev is None: + raise Exception("MGMT-RX timeout") + if " d0" in ev: + break + if "dd050011223306" not in ev: + raise Exception("Vendor element not found from Invitation Request frame") + dev[0].p2p_stop_find() + dev[1].p2p_stop_find() + + dev[0].p2p_listen() + if "FAIL" in dev[1].request("SET ext_mgmt_frame_handling 0"): + raise Exception("Failed to disable external management frame handling") + if not dev[1].discover_peer(addr0): + raise Exception("Device discovery timed out") + peer = dev[1].get_peer(addr0) + dev[1].p2p_stop_find() + if "FAIL" in dev[1].request("SET ext_mgmt_frame_handling 1"): + raise Exception("Failed to enable external management frame handling") + dev[1].global_request("P2P_INVITE persistent=" + peer['persistent'] + " peer=" + addr0) + for i in range(5): + ev = dev[1].wait_event(["MGMT-RX"], timeout=5) + if ev is None: + raise Exception("MGMT-RX timeout") + if " d0" in ev: + break + if "dd050011223307" not in ev: + raise Exception("Vendor element not found from Invitation Response frame") + dev[0].p2p_stop_find() + dev[1].p2p_stop_find() + +def test_p2p_ext_vendor_elem_assoc(dev, apdev, params): + """VENDOR_ELEM in Association frames""" + try: + _test_p2p_ext_vendor_elem_assoc(dev, apdev, params) + finally: + dev[0].request("VENDOR_ELEM_REMOVE 11 *") + dev[1].request("VENDOR_ELEM_REMOVE 12 *") + dev[0].request("VENDOR_ELEM_REMOVE 13 *") + +def _test_p2p_ext_vendor_elem_assoc(dev, apdev, params): + addr0 = dev[0].p2p_dev_addr() + addr1 = dev[1].p2p_dev_addr() + if "OK" not in dev[0].request("VENDOR_ELEM_ADD 11 dd050011223308"): + raise Exception("VENDOR_ELEM_ADD failed") + if "OK" not in dev[1].request("VENDOR_ELEM_ADD 12 dd050011223309"): + raise Exception("VENDOR_ELEM_ADD failed") + if "OK" not in dev[0].request("VENDOR_ELEM_ADD 13 dd05001122330a"): + raise Exception("VENDOR_ELEM_ADD failed") + dev[0].p2p_listen() + dev[1].p2p_listen() + dev[1].p2p_go_neg_auth(addr0, "12345670", "enter", go_intent=15) + dev[0].p2p_go_neg_init(addr1, "12345670", "display", go_intent=0, + timeout=15) + dev[1].p2p_go_neg_auth_result() + dev[1].remove_group() + dev[0].wait_go_ending_session() + + out = run_tshark(os.path.join(params['logdir'], "hwsim0.pcapng"), + "wlan.fc.type_subtype == 0x00", wait=False) + if "Vendor Specific Data: 3308" not in out: + raise Exception("Vendor element (P2P) not found from Association Request frame") + if "Vendor Specific Data: 330a" not in out: + raise Exception("Vendor element (non-P2P) not found from Association Request frame") + + out = run_tshark(os.path.join(params['logdir'], "hwsim0.pcapng"), + "wlan.fc.type_subtype == 0x01", wait=False) + if "Vendor Specific Data: 3309" not in out: + raise Exception("Vendor element not found from Association Response frame")