123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586 |
- # P2P service discovery test cases
- # Copyright (c) 2013, Jouni Malinen <j@w1.fi>
- #
- # 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
- import time
- import uuid
- import hwsim_utils
- def add_bonjour_services(dev):
- dev.global_request("P2P_SERVICE_ADD bonjour 0b5f6166706f766572746370c00c000c01 074578616d706c65c027")
- dev.global_request("P2P_SERVICE_ADD bonjour 076578616d706c650b5f6166706f766572746370c00c001001 00")
- dev.global_request("P2P_SERVICE_ADD bonjour 045f697070c00c000c01 094d795072696e746572c027")
- dev.global_request("P2P_SERVICE_ADD bonjour 096d797072696e746572045f697070c00c001001 09747874766572733d311a70646c3d6170706c69636174696f6e2f706f7374736372797074")
- def add_upnp_services(dev):
- dev.global_request("P2P_SERVICE_ADD upnp 10 uuid:6859dede-8574-59ab-9332-123456789012::upnp:rootdevice")
- dev.global_request("P2P_SERVICE_ADD upnp 10 uuid:5566d33e-9774-09ab-4822-333456785632::upnp:rootdevice")
- dev.global_request("P2P_SERVICE_ADD upnp 10 uuid:1122de4e-8574-59ab-9322-333456789044::urn:schemas-upnp-org:service:ContentDirectory:2")
- dev.global_request("P2P_SERVICE_ADD upnp 10 uuid:5566d33e-9774-09ab-4822-333456785632::urn:schemas-upnp-org:service:ContentDirectory:2")
- dev.global_request("P2P_SERVICE_ADD upnp 10 uuid:6859dede-8574-59ab-9332-123456789012::urn:schemas-upnp-org:device:InternetGatewayDevice:1")
- def add_extra_services(dev):
- for i in range(0, 100):
- dev.global_request("P2P_SERVICE_ADD upnp 10 uuid:" + str(uuid.uuid4()) + "::upnp:rootdevice")
- def run_sd(dev, dst, query, exp_query=None, fragment=False, query2=None):
- addr0 = dev[0].p2p_dev_addr()
- addr1 = dev[1].p2p_dev_addr()
- add_bonjour_services(dev[0])
- add_upnp_services(dev[0])
- if fragment:
- add_extra_services(dev[0])
- dev[0].p2p_listen()
- dev[1].global_request("P2P_FLUSH")
- dev[1].global_request("P2P_SERV_DISC_REQ " + dst + " " + query)
- if query2:
- dev[1].global_request("P2P_SERV_DISC_REQ " + dst + " " + query2)
- if not dev[1].discover_peer(addr0, social=True, force_find=True):
- raise Exception("Peer " + addr0 + " not found")
- ev = dev[0].wait_global_event(["P2P-SERV-DISC-REQ"], timeout=10)
- if ev is None:
- raise Exception("Service discovery timed out")
- if addr1 not in ev:
- raise Exception("Unexpected service discovery request source")
- if exp_query is None:
- exp_query = query
- if exp_query not in ev and (query2 is None or query2 not in ev):
- raise Exception("Unexpected service discovery request contents")
- if query2:
- ev_list = []
- for i in range(0, 4):
- ev = dev[1].wait_global_event(["P2P-SERV-DISC-RESP"], timeout=10)
- if ev is None:
- raise Exception("Service discovery timed out")
- if addr0 in ev:
- ev_list.append(ev)
- if len(ev_list) == 2:
- break
- return ev_list
- for i in range(0, 2):
- ev = dev[1].wait_global_event(["P2P-SERV-DISC-RESP"], timeout=10)
- if ev is None:
- raise Exception("Service discovery timed out")
- if addr0 in ev:
- break
- dev[0].p2p_stop_find()
- dev[1].p2p_stop_find()
- if "OK" not in dev[0].global_request("P2P_SERVICE_DEL upnp 10 uuid:6859dede-8574-59ab-9332-123456789012::upnp:rootdevice"):
- raise Exception("Failed to delete a UPnP service")
- if "FAIL" not in dev[0].global_request("P2P_SERVICE_DEL upnp 10 uuid:6859dede-8574-59ab-9332-123456789012::upnp:rootdevice"):
- raise Exception("Unexpected deletion success for UPnP service")
- if "OK" not in dev[0].global_request("P2P_SERVICE_DEL bonjour 0b5f6166706f766572746370c00c000c01"):
- raise Exception("Failed to delete a Bonjour service")
- if "FAIL" not in dev[0].global_request("P2P_SERVICE_DEL bonjour 0b5f6166706f766572746370c00c000c01"):
- raise Exception("Unexpected deletion success for Bonjour service")
- return ev
- @remote_compatible
- def test_p2p_service_discovery(dev):
- """P2P service discovery"""
- addr0 = dev[0].p2p_dev_addr()
- for dst in [ "00:00:00:00:00:00", addr0 ]:
- ev = run_sd(dev, dst, "02000001")
- if "0b5f6166706f766572746370c00c000c01" not in ev:
- raise Exception("Unexpected service discovery response contents (Bonjour)")
- if "496e7465726e6574" not in ev:
- raise Exception("Unexpected service discovery response contents (UPnP)")
- for req in [ "foo 02000001",
- addr0,
- addr0 + " upnp qq urn:schemas-upnp-org:device:InternetGatewayDevice:1",
- addr0 + " upnp 10",
- addr0 + " 123",
- addr0 + " qq" ]:
- if "FAIL" not in dev[1].global_request("P2P_SERV_DISC_REQ " + req):
- raise Exception("Invalid P2P_SERV_DISC_REQ accepted: " + req)
- def test_p2p_service_discovery2(dev):
- """P2P service discovery with one peer having no services"""
- dev[2].p2p_listen()
- for dst in [ "00:00:00:00:00:00", dev[0].p2p_dev_addr() ]:
- ev = run_sd(dev, dst, "02000001")
- if "0b5f6166706f766572746370c00c000c01" not in ev:
- raise Exception("Unexpected service discovery response contents (Bonjour)")
- if "496e7465726e6574" not in ev:
- raise Exception("Unexpected service discovery response contents (UPnP)")
- def test_p2p_service_discovery3(dev):
- """P2P service discovery for Bonjour with one peer having no services"""
- dev[2].p2p_listen()
- for dst in [ "00:00:00:00:00:00", dev[0].p2p_dev_addr() ]:
- ev = run_sd(dev, dst, "02000101")
- if "0b5f6166706f766572746370c00c000c01" not in ev:
- raise Exception("Unexpected service discovery response contents (Bonjour)")
- def test_p2p_service_discovery4(dev):
- """P2P service discovery for UPnP with one peer having no services"""
- dev[2].p2p_listen()
- for dst in [ "00:00:00:00:00:00", dev[0].p2p_dev_addr() ]:
- ev = run_sd(dev, dst, "02000201")
- if "496e7465726e6574" not in ev:
- raise Exception("Unexpected service discovery response contents (UPnP)")
- @remote_compatible
- def test_p2p_service_discovery_multiple_queries(dev):
- """P2P service discovery with multiple queries"""
- for dst in [ "00:00:00:00:00:00", dev[0].p2p_dev_addr() ]:
- ev = run_sd(dev, dst, "02000201", query2="02000101")
- if "0b5f6166706f766572746370c00c000c01" not in ev[0] + ev[1]:
- raise Exception("Unexpected service discovery response contents (Bonjour)")
- if "496e7465726e6574" not in ev[0] + ev[1]:
- raise Exception("Unexpected service discovery response contents (UPnP)")
- def test_p2p_service_discovery_multiple_queries2(dev):
- """P2P service discovery with multiple queries with one peer having no services"""
- dev[2].p2p_listen()
- for dst in [ "00:00:00:00:00:00", dev[0].p2p_dev_addr() ]:
- ev = run_sd(dev, dst, "02000201", query2="02000101")
- if "0b5f6166706f766572746370c00c000c01" not in ev[0] + ev[1]:
- raise Exception("Unexpected service discovery response contents (Bonjour)")
- if "496e7465726e6574" not in ev[0] + ev[1]:
- raise Exception("Unexpected service discovery response contents (UPnP)")
- def test_p2p_service_discovery_fragmentation(dev):
- """P2P service discovery with fragmentation"""
- for dst in [ "00:00:00:00:00:00", dev[0].p2p_dev_addr() ]:
- ev = run_sd(dev, dst, "02000001", fragment=True)
- if not "long response" in ev:
- if "0b5f6166706f766572746370c00c000c01" not in ev:
- raise Exception("Unexpected service discovery response contents (Bonjour)")
- if "496e7465726e6574" not in ev:
- raise Exception("Unexpected service discovery response contents (UPnP)")
- @remote_compatible
- def test_p2p_service_discovery_bonjour(dev):
- """P2P service discovery (Bonjour)"""
- ev = run_sd(dev, "00:00:00:00:00:00", "02000101")
- if "0b5f6166706f766572746370c00c000c01" not in ev:
- raise Exception("Unexpected service discovery response contents (Bonjour)")
- if "045f697070c00c000c01" not in ev:
- raise Exception("Unexpected service discovery response contents (Bonjour)")
- if "496e7465726e6574" in ev:
- raise Exception("Unexpected service discovery response contents (UPnP not expected)")
- @remote_compatible
- def test_p2p_service_discovery_bonjour2(dev):
- """P2P service discovery (Bonjour AFS)"""
- ev = run_sd(dev, "00:00:00:00:00:00", "130001010b5f6166706f766572746370c00c000c01")
- if "0b5f6166706f766572746370c00c000c01" not in ev:
- raise Exception("Unexpected service discovery response contents (Bonjour)")
- if "045f697070c00c000c01" in ev:
- raise Exception("Unexpected service discovery response contents (Bonjour mismatching)")
- if "496e7465726e6574" in ev:
- raise Exception("Unexpected service discovery response contents (UPnP not expected)")
- @remote_compatible
- def test_p2p_service_discovery_bonjour3(dev):
- """P2P service discovery (Bonjour AFS - no match)"""
- ev = run_sd(dev, "00:00:00:00:00:00", "130001010b5f6166706f766572746370c00c000c02")
- if "0300010102" not in ev:
- raise Exception("Requested-info-not-available was not indicated")
- if "0b5f6166706f766572746370c00c000c01" in ev:
- raise Exception("Unexpected service discovery response contents (Bonjour)")
- if "045f697070c00c000c01" in ev:
- raise Exception("Unexpected service discovery response contents (Bonjour mismatching)")
- if "496e7465726e6574" in ev:
- raise Exception("Unexpected service discovery response contents (UPnP not expected)")
- @remote_compatible
- def test_p2p_service_discovery_upnp(dev):
- """P2P service discovery (UPnP)"""
- ev = run_sd(dev, "00:00:00:00:00:00", "02000201")
- if "0b5f6166706f766572746370c00c000c01" in ev:
- raise Exception("Unexpected service discovery response contents (Bonjour not expected)")
- if "496e7465726e6574" not in ev:
- raise Exception("Unexpected service discovery response contents (UPnP)")
- @remote_compatible
- def test_p2p_service_discovery_upnp2(dev):
- """P2P service discovery (UPnP using request helper)"""
- ev = run_sd(dev, "00:00:00:00:00:00", "upnp 10 ssdp:all", "0b00020110737364703a616c6c")
- if "0b5f6166706f766572746370c00c000c01" in ev:
- raise Exception("Unexpected service discovery response contents (Bonjour not expected)")
- if "496e7465726e6574" not in ev:
- raise Exception("Unexpected service discovery response contents (UPnP)")
- @remote_compatible
- def test_p2p_service_discovery_upnp3(dev):
- """P2P service discovery (UPnP using request helper - no match)"""
- ev = run_sd(dev, "00:00:00:00:00:00", "upnp 10 ssdp:foo", "0b00020110737364703a666f6f")
- if "0300020102" not in ev:
- raise Exception("Requested-info-not-available was not indicated")
- if "0b5f6166706f766572746370c00c000c01" in ev:
- raise Exception("Unexpected service discovery response contents (Bonjour not expected)")
- if "496e7465726e6574" in ev:
- raise Exception("Unexpected service discovery response contents (UPnP)")
- @remote_compatible
- def test_p2p_service_discovery_ws(dev):
- """P2P service discovery (WS-Discovery)"""
- ev = run_sd(dev, "00:00:00:00:00:00", "02000301")
- if "0b5f6166706f766572746370c00c000c01" in ev:
- raise Exception("Unexpected service discovery response contents (Bonjour not expected)")
- if "496e7465726e6574" in ev:
- raise Exception("Unexpected service discovery response contents (UPnP not expected)")
- if "0300030101" not in ev:
- raise Exception("Unexpected service discovery response contents (WS)")
- @remote_compatible
- def test_p2p_service_discovery_wfd(dev):
- """P2P service discovery (Wi-Fi Display)"""
- dev[0].global_request("SET wifi_display 1")
- ev = run_sd(dev, "00:00:00:00:00:00", "02000401")
- if " 030004" in ev:
- raise Exception("Unexpected response to invalid WFD SD query")
- dev[0].global_request("SET wifi_display 0")
- ev = run_sd(dev, "00:00:00:00:00:00", "0300040100")
- if "0300040101" not in ev:
- raise Exception("Unexpected response to WFD SD query (protocol was disabled)")
- @remote_compatible
- def test_p2p_service_discovery_req_cancel(dev):
- """Cancel a P2P service discovery request"""
- if "FAIL" not in dev[0].global_request("P2P_SERV_DISC_CANCEL_REQ ab"):
- raise Exception("Unexpected SD cancel success")
- if "FAIL" not in dev[0].global_request("P2P_SERV_DISC_CANCEL_REQ qq"):
- raise Exception("Unexpected SD cancel success")
- query = dev[0].global_request("P2P_SERV_DISC_REQ " + dev[1].p2p_dev_addr() + " 02000001")
- if "OK" not in dev[0].global_request("P2P_SERV_DISC_CANCEL_REQ " + query):
- raise Exception("Unexpected SD cancel failure")
- query1 = dev[0].global_request("P2P_SERV_DISC_REQ " + dev[1].p2p_dev_addr() + " 02000001")
- query2 = dev[0].global_request("P2P_SERV_DISC_REQ " + dev[1].p2p_dev_addr() + " 02000002")
- query3 = dev[0].global_request("P2P_SERV_DISC_REQ " + dev[1].p2p_dev_addr() + " 02000003")
- if "OK" not in dev[0].global_request("P2P_SERV_DISC_CANCEL_REQ " + query2):
- raise Exception("Unexpected SD cancel failure")
- if "OK" not in dev[0].global_request("P2P_SERV_DISC_CANCEL_REQ " + query1):
- raise Exception("Unexpected SD cancel failure")
- if "OK" not in dev[0].global_request("P2P_SERV_DISC_CANCEL_REQ " + query3):
- raise Exception("Unexpected SD cancel failure")
- query = dev[0].global_request("P2P_SERV_DISC_REQ 00:00:00:00:00:00 02000001")
- if "OK" not in dev[0].global_request("P2P_SERV_DISC_CANCEL_REQ " + query):
- raise Exception("Unexpected SD(broadcast) cancel failure")
- @remote_compatible
- def test_p2p_service_discovery_go(dev):
- """P2P service discovery from GO"""
- addr0 = dev[0].p2p_dev_addr()
- addr1 = dev[1].p2p_dev_addr()
- add_bonjour_services(dev[0])
- add_upnp_services(dev[0])
- dev[0].p2p_start_go(freq=2412)
- dev[1].global_request("P2P_FLUSH")
- dev[1].global_request("P2P_SERV_DISC_REQ " + addr0 + " 02000001")
- if not dev[1].discover_peer(addr0, social=True, force_find=True):
- raise Exception("Peer " + addr0 + " not found")
- ev = dev[0].wait_global_event(["P2P-SERV-DISC-REQ"], timeout=10)
- if ev is None:
- raise Exception("Service discovery timed out")
- if addr1 not in ev:
- raise Exception("Unexpected service discovery request source")
- ev = dev[1].wait_global_event(["P2P-SERV-DISC-RESP"], timeout=10)
- if ev is None:
- raise Exception("Service discovery timed out")
- if addr0 not in ev:
- raise Exception("Unexpected service discovery response source")
- if "0b5f6166706f766572746370c00c000c01" not in ev:
- raise Exception("Unexpected service discovery response contents (Bonjour)")
- if "496e7465726e6574" not in ev:
- raise Exception("Unexpected service discovery response contents (UPnP)")
- dev[1].p2p_stop_find()
- dev[0].global_request("P2P_SERVICE_FLUSH")
- dev[1].global_request("P2P_FLUSH")
- dev[1].global_request("P2P_SERV_DISC_REQ " + addr0 + " 02000001")
- if not dev[1].discover_peer(addr0, social=True, force_find=True):
- raise Exception("Peer " + addr0 + " not found")
- ev = dev[0].wait_global_event(["P2P-SERV-DISC-REQ"], timeout=10)
- if ev is None:
- raise Exception("Service discovery timed out")
- if addr1 not in ev:
- raise Exception("Unexpected service discovery request source")
- ev = dev[1].wait_global_event(["P2P-SERV-DISC-RESP"], timeout=10)
- if ev is None:
- raise Exception("Service discovery timed out")
- if addr0 not in ev:
- raise Exception("Unexpected service discovery response source")
- if "0300000101" not in ev:
- raise Exception("Unexpected service discovery response contents (Bonjour)")
- dev[1].p2p_stop_find()
- def _test_p2p_service_discovery_external(dev):
- addr0 = dev[0].p2p_dev_addr()
- addr1 = dev[1].p2p_dev_addr()
- if "FAIL" not in dev[0].global_request("P2P_SERV_DISC_EXTERNAL 2"):
- raise Exception("Invalid P2P_SERV_DISC_EXTERNAL accepted")
- if "OK" not in dev[0].global_request("P2P_SERV_DISC_EXTERNAL 1"):
- raise Exception("P2P_SERV_DISC_EXTERNAL failed")
- dev[0].p2p_listen()
- dev[1].global_request("P2P_FLUSH")
- dev[1].global_request("P2P_SERV_DISC_REQ " + addr0 + " 02000001")
- if not dev[1].discover_peer(addr0, social=True, force_find=True):
- raise Exception("Peer " + addr0 + " not found")
- ev = dev[0].wait_global_event(["P2P-SERV-DISC-REQ"], timeout=10)
- if ev is None:
- raise Exception("Service discovery timed out")
- if addr1 not in ev:
- raise Exception("Unexpected service discovery request source")
- arg = ev.split(' ')
- resp = "0300000101"
- if "OK" not in dev[0].global_request("P2P_SERV_DISC_RESP %s %s %s %s" % (arg[2], arg[3], arg[4], resp)):
- raise Exception("P2P_SERV_DISC_RESP failed")
- ev = dev[1].wait_global_event(["P2P-SERV-DISC-RESP"], timeout=15)
- if ev is None:
- raise Exception("Service discovery timed out")
- if addr0 not in ev:
- raise Exception("Unexpected address in SD Response: " + ev)
- if ev.split(' ')[4] != resp:
- raise Exception("Unexpected response data SD Response: " + ev)
- ver = ev.split(' ')[3]
- dev[0].global_request("P2P_SERVICE_UPDATE")
- dev[1].global_request("P2P_FLUSH")
- dev[1].global_request("P2P_SERV_DISC_REQ " + addr0 + " 02000001")
- if not dev[1].discover_peer(addr0, social=True, force_find=True):
- raise Exception("Peer " + addr0 + " not found")
- ev = dev[0].wait_global_event(["P2P-SERV-DISC-REQ"], timeout=10)
- if ev is None:
- raise Exception("Service discovery timed out")
- if addr1 not in ev:
- raise Exception("Unexpected service discovery request source")
- arg = ev.split(' ')
- resp = "0300000101"
- if "OK" not in dev[0].global_request("P2P_SERV_DISC_RESP %s %s %s %s" % (arg[2], arg[3], arg[4], resp)):
- raise Exception("P2P_SERV_DISC_RESP failed")
- ev = dev[1].wait_global_event(["P2P-SERV-DISC-RESP"], timeout=15)
- if ev is None:
- raise Exception("Service discovery timed out")
- if addr0 not in ev:
- raise Exception("Unexpected address in SD Response: " + ev)
- if ev.split(' ')[4] != resp:
- raise Exception("Unexpected response data SD Response: " + ev)
- ver2 = ev.split(' ')[3]
- if ver == ver2:
- raise Exception("Service list version did not change")
- for cmd in [ "%s%s%s%s" % (arg[2], arg[3], arg[4], resp),
- "%s %s %s %s" % ("0", arg[3], arg[4], resp),
- "%s %s %s %s" % (arg[2], "foo", arg[4], resp),
- "%s %s%s%s" % (arg[2], arg[3], arg[4], resp),
- "%s %s %s%s" % (arg[2], arg[3], arg[4], resp),
- "%s %s %s %s" % (arg[2], arg[3], arg[4], "12345"),
- "%s %s %s %s" % (arg[2], arg[3], arg[4], "qq") ]:
- if "FAIL" not in dev[0].global_request("P2P_SERV_DISC_RESP " + cmd):
- raise Exception("Invalid P2P_SERV_DISC_RESP accepted: " + cmd)
- @remote_compatible
- def test_p2p_service_discovery_external(dev):
- """P2P service discovery using external response"""
- try:
- _test_p2p_service_discovery_external(dev)
- finally:
- dev[0].global_request("P2P_SERV_DISC_EXTERNAL 0")
- @remote_compatible
- def test_p2p_service_discovery_invalid_commands(dev):
- """P2P service discovery invalid commands"""
- for cmd in [ "bonjour",
- "bonjour 12",
- "bonjour 123 12",
- "bonjour qq 12",
- "bonjour 12 123",
- "bonjour 12 qq",
- "upnp 10",
- "upnp qq uuid:",
- "foo bar" ]:
- if "FAIL" not in dev[0].global_request("P2P_SERVICE_ADD " + cmd):
- raise Exception("Invalid P2P_SERVICE_ADD accepted: " + cmd)
- for cmd in [ "bonjour",
- "bonjour 123",
- "bonjour qq",
- "upnp 10",
- "upnp ",
- "upnp qq uuid:",
- "foo bar" ]:
- if "FAIL" not in dev[0].global_request("P2P_SERVICE_DEL " + cmd):
- raise Exception("Invalid P2P_SERVICE_DEL accepted: " + cmd)
- def test_p2p_service_discovery_cancel_during_query(dev):
- """P2P service discovery and cancel during query"""
- for i in range(2):
- add_bonjour_services(dev[i])
- add_upnp_services(dev[i])
- add_extra_services(dev[i])
- dev[i].p2p_listen()
- dev[2].request("P2P_FLUSH")
- id1 = dev[2].request("P2P_SERV_DISC_REQ 00:00:00:00:00:00 02000201")
- id2 = dev[2].request("P2P_SERV_DISC_REQ 00:00:00:00:00:00 02000101")
- dev[2].p2p_find(social=True)
- ev = dev[2].wait_global_event(["P2P-DEVICE-FOUND"], timeout=15)
- if ev is None:
- raise Exception("Could not discover peer")
- if "OK" not in dev[2].request("P2P_SERV_DISC_CANCEL_REQ " + id1):
- raise Exception("Failed to cancel req1")
- if "OK" not in dev[2].request("P2P_SERV_DISC_CANCEL_REQ " + id2):
- raise Exception("Failed to cancel req2")
- ev = dev[2].wait_global_event(["P2P-SERV-DISC-RESP"], timeout=3)
- # we may or may not get a response depending on timing, so ignore the result
- dev[2].p2p_stop_find()
- dev[1].p2p_stop_find()
- dev[0].p2p_stop_find()
- def get_p2p_state(dev):
- res = dev.global_request("STATUS")
- p2p_state = None
- for line in res.splitlines():
- if line.startswith("p2p_state="):
- p2p_state = line.split('=')[1]
- break
- if p2p_state is None:
- raise Exception("Could not get p2p_state")
- return p2p_state
- @remote_compatible
- def test_p2p_service_discovery_peer_not_listening(dev):
- """P2P service discovery and peer not listening"""
- addr0 = dev[0].p2p_dev_addr()
- addr1 = dev[1].p2p_dev_addr()
- add_bonjour_services(dev[0])
- add_upnp_services(dev[0])
- dev[0].p2p_listen()
- dev[1].global_request("P2P_FIND 4 type=social")
- ev = dev[1].wait_global_event(["P2P-DEVICE-FOUND"], timeout=4)
- if ev is None:
- raise Exception("Peer not found")
- dev[0].p2p_stop_find()
- ev = dev[1].wait_event(["CTRL-EVENT-SCAN-STARTED"], timeout=1)
- ev = dev[1].wait_event(["CTRL-EVENT-SCAN-STARTED"], timeout=1)
- time.sleep(0.03)
- dev[1].request("P2P_SERV_DISC_REQ " + addr0 + " 02000001")
- ev = dev[0].wait_global_event(["P2P-SERV-DISC-REQ"], timeout=1)
- if ev is not None:
- raise Exception("Service discovery request unexpectedly received")
- ev = dev[1].wait_global_event(["P2P-FIND-STOPPED", "P2P-SERV-DISC-RESP"],
- timeout=10)
- if ev is None:
- raise Exception("P2P-FIND-STOPPED event timed out")
- if "P2P-SERV-DISC-RESP" in ev:
- raise Exception("Unexpected SD response")
- p2p_state = get_p2p_state(dev[1])
- if p2p_state != "IDLE":
- raise Exception("Unexpected p2p_state after P2P_FIND timeout: " + p2p_state)
- @remote_compatible
- def test_p2p_service_discovery_peer_not_listening2(dev):
- """P2P service discovery and peer not listening"""
- addr0 = dev[0].p2p_dev_addr()
- addr1 = dev[1].p2p_dev_addr()
- add_bonjour_services(dev[0])
- add_upnp_services(dev[0])
- dev[0].p2p_listen()
- dev[1].global_request("P2P_FIND type=social")
- ev = dev[1].wait_global_event(["P2P-DEVICE-FOUND"], timeout=10)
- if ev is None:
- raise Exception("Peer not found")
- dev[0].p2p_stop_find()
- time.sleep(0.53)
- dev[1].request("P2P_SERV_DISC_REQ " + addr0 + " 02000001")
- ev = dev[0].wait_global_event(["P2P-SERV-DISC-REQ"], timeout=0.5)
- if ev is not None:
- raise Exception("Service discovery request unexpectedly received")
- dev[1].p2p_stop_find()
- ev = dev[1].wait_global_event(["P2P-FIND-STOPPED", "P2P-SERV-DISC-RESP"],
- timeout=10)
- if ev is None:
- raise Exception("P2P-FIND-STOPPED event timed out")
- if "P2P-SERV-DISC-RESP" in ev:
- raise Exception("Unexpected SD response")
- p2p_state = get_p2p_state(dev[1])
- if p2p_state != "IDLE":
- raise Exception("Unexpected p2p_state after P2P_FIND timeout: " + p2p_state)
- def test_p2p_service_discovery_restart(dev):
- """P2P service discovery restarted immediately"""
- try:
- _test_p2p_service_discovery_restart(dev)
- finally:
- dev[1].global_request("P2P_SET disc_int 1 3 -1")
- def _test_p2p_service_discovery_restart(dev):
- addr0 = dev[0].p2p_dev_addr()
- addr1 = dev[1].p2p_dev_addr()
- # Use shorter listen interval to keep P2P_FIND loop shorter.
- dev[1].global_request("P2P_SET disc_int 1 1 10")
- add_bonjour_services(dev[0])
- #add_upnp_services(dev[0])
- dev[0].p2p_listen()
- dev[1].global_request("P2P_FLUSH")
- dev[1].global_request("P2P_SERV_DISC_REQ " + addr0 + " 02000001")
- if not dev[1].discover_peer(addr0, social=True, force_find=True):
- raise Exception("Peer " + addr0 + " not found")
- ev = dev[1].wait_global_event(["P2P-SERV-DISC-RESP"], timeout=10)
- if ev is None:
- raise Exception("Service discovery timed out")
- # The following P2P_LISTEN operation used to get delayed due to the last
- # Action frame TX operation in SD Response using wait_time of 200 ms. It is
- # somewhat difficult to test for this automatically, but the debug log can
- # be verified to see that the remain-on-channel event for operation arrives
- # immediately instead of getting delayed 200 ms. We can use a maximum
- # acceptable time for the SD Response, but need to keep the limit somewhat
- # high to avoid making this fail under heavy load. Still, it is apparently
- # possible for this to take about the same amount of time with fixed
- # implementation every now and then, so run this multiple time and pass the
- # test if any attempt is fast enough.
- for i in range(10):
- dev[0].p2p_stop_find()
- time.sleep(0.01)
- dev[0].p2p_listen()
- dev[1].global_request("P2P_SERV_DISC_REQ " + addr0 + " 02000001")
- start = os.times()[4]
- ev = dev[1].wait_global_event(["P2P-SERV-DISC-RESP"], timeout=10)
- if ev is None:
- raise Exception("Service discovery timed out")
- end = os.times()[4]
- logger.info("Second SD Response in " + str(end - start) + " seconds")
- if end - start < 0.8:
- break
- if end - start > 0.8:
- raise Exception("Unexpectedly slow second SD Response: " + str(end - start) + " seconds")
|