123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376 |
- # P2P vendor specific extension tests
- # Copyright (c) 2014-2015, Qualcomm Atheros, Inc.
- #
- # This software may be distributed under the terms of the BSD license.
- # See README for more details.
- from remotehost import remote_compatible
- import logging
- logger = logging.getLogger()
- import os
- from tshark import run_tshark
- from p2p_utils import *
- @remote_compatible
- def test_p2p_ext_discovery(dev):
- """P2P device discovery with vendor specific extensions"""
- addr0 = dev[0].p2p_dev_addr()
- addr1 = dev[1].p2p_dev_addr()
- try:
- if "OK" not in dev[0].request("VENDOR_ELEM_ADD 1 dd050011223344"):
- raise Exception("VENDOR_ELEM_ADD failed")
- res = dev[0].request("VENDOR_ELEM_GET 1")
- if res != "dd050011223344":
- raise Exception("Unexpected VENDOR_ELEM_GET result: " + res)
- if "OK" not in dev[0].request("VENDOR_ELEM_ADD 1 dd06001122335566"):
- raise Exception("VENDOR_ELEM_ADD failed")
- res = dev[0].request("VENDOR_ELEM_GET 1")
- if res != "dd050011223344dd06001122335566":
- raise Exception("Unexpected VENDOR_ELEM_GET result(2): " + res)
- res = dev[0].request("VENDOR_ELEM_GET 2")
- if res != "":
- raise Exception("Unexpected VENDOR_ELEM_GET result(3): " + res)
- if "OK" not in dev[0].request("VENDOR_ELEM_REMOVE 1 dd050011223344"):
- raise Exception("VENDOR_ELEM_REMOVE failed")
- res = dev[0].request("VENDOR_ELEM_GET 1")
- if res != "dd06001122335566":
- raise Exception("Unexpected VENDOR_ELEM_GET result(4): " + res)
- if "OK" not in dev[0].request("VENDOR_ELEM_REMOVE 1 dd06001122335566"):
- raise Exception("VENDOR_ELEM_REMOVE failed")
- res = dev[0].request("VENDOR_ELEM_GET 1")
- if res != "":
- raise Exception("Unexpected VENDOR_ELEM_GET result(5): " + res)
- if "OK" not in dev[0].request("VENDOR_ELEM_ADD 1 dd050011223344dd06001122335566"):
- raise Exception("VENDOR_ELEM_ADD failed(2)")
- if "FAIL" not in dev[0].request("VENDOR_ELEM_REMOVE 1 dd051122334455"):
- raise Exception("Unexpected VENDOR_ELEM_REMOVE success")
- if "FAIL" not in dev[0].request("VENDOR_ELEM_REMOVE 1 dd"):
- raise Exception("Unexpected VENDOR_ELEM_REMOVE success(2)")
- if "FAIL" not in dev[0].request("VENDOR_ELEM_ADD 1 ddff"):
- raise Exception("Unexpected VENDOR_ELEM_ADD success(3)")
- dev[0].p2p_listen()
- if not dev[1].discover_peer(addr0):
- raise Exception("Device discovery timed out")
- if not dev[0].discover_peer(addr1):
- raise Exception("Device discovery timed out")
- peer = dev[1].get_peer(addr0)
- if peer['vendor_elems'] != "dd050011223344dd06001122335566":
- raise Exception("Vendor elements not reported correctly")
- res = dev[0].request("VENDOR_ELEM_GET 1")
- if res != "dd050011223344dd06001122335566":
- raise Exception("Unexpected VENDOR_ELEM_GET result(6): " + res)
- if "OK" not in dev[0].request("VENDOR_ELEM_REMOVE 1 dd06001122335566"):
- raise Exception("VENDOR_ELEM_REMOVE failed")
- res = dev[0].request("VENDOR_ELEM_GET 1")
- if res != "dd050011223344":
- raise Exception("Unexpected VENDOR_ELEM_GET result(7): " + res)
- finally:
- dev[0].request("VENDOR_ELEM_REMOVE 1 *")
- @remote_compatible
- def test_p2p_ext_discovery_go(dev):
- """P2P device discovery with vendor specific extensions for GO"""
- addr0 = dev[0].p2p_dev_addr()
- addr1 = dev[1].p2p_dev_addr()
- try:
- if "OK" not in dev[0].request("VENDOR_ELEM_ADD 2 dd050011223344dd06001122335566"):
- raise Exception("VENDOR_ELEM_ADD failed")
- if "OK" not in dev[0].request("VENDOR_ELEM_ADD 3 dd050011223344dd06001122335566"):
- raise Exception("VENDOR_ELEM_ADD failed")
- if "OK" not in dev[0].request("VENDOR_ELEM_ADD 12 dd050011223344dd06001122335566"):
- raise Exception("VENDOR_ELEM_ADD failed")
- dev[0].p2p_start_go(freq="2412")
- if not dev[1].discover_peer(addr0):
- raise Exception("Device discovery timed out")
- peer = dev[1].get_peer(addr0)
- if peer['vendor_elems'] != "dd050011223344dd06001122335566":
- print peer['vendor_elems']
- raise Exception("Vendor elements not reported correctly")
- finally:
- 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_go_neg_auth(addr0, "12345670", "enter")
- dev[1].p2p_listen()
- dev[0].p2p_go_neg_init(addr1, "12345678", "display")
- ev = dev[0].wait_global_event(["P2P-GO-NEG-SUCCESS"], timeout=15)
- if ev is None:
- raise Exception("GO negotiation timed out")
- ev = dev[0].wait_global_event(["P2P-GROUP-FORMATION-FAILURE"], timeout=15)
- if ev is None:
- raise Exception("Group formation failure not indicated")
- dev[0].dump_monitor()
- dev[1].p2p_go_neg_auth_result(expect_failure=True)
- dev[1].dump_monitor()
- 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()
- res = dev[0].get_driver_status()
- p2p_device = True if (int(res['capa.flags'], 0) & 0x20000000) else False
- 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 not p2p_device and "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 not p2p_device and "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")
|