tests: P2PS wildcard SD probe
[mech_eap.git] / tests / hwsim / test_p2ps.py
index e2d68a8..6260d89 100644 (file)
@@ -45,7 +45,8 @@ def p2ps_advertise(r_dev, r_role, svc_name, srv_info, rsp_info=None):
     r_dev.p2p_listen()
     return advid
 
-def p2ps_exact_seek(i_dev, r_dev, svc_name, srv_info=None):
+def p2ps_exact_seek(i_dev, r_dev, svc_name, srv_info=None,
+                    single_peer_expected=True):
     """P2PS exact service seek request"""
     if srv_info is not None:
         ev1 = i_dev.global_request("P2P_SERV_DISC_REQ 00:00:00:00:00:00 asp 1 " + svc_name + " '" + srv_info + "'")
@@ -55,7 +56,16 @@ def p2ps_exact_seek(i_dev, r_dev, svc_name, srv_info=None):
     if "OK" not in i_dev.global_request("P2P_FIND 10 type=social seek=" + svc_name):
         raise Exception("Failed to initiate seek operation")
 
+    timeout = time.time() + 10
     ev1 = i_dev.wait_global_event(["P2P-DEVICE-FOUND"], timeout=10)
+    while ev1 is not None and not single_peer_expected:
+        if r_dev.p2p_dev_addr() in ev1 and "adv_id=" in ev1:
+            break
+        ev1 = i_dev.wait_global_event(["P2P-DEVICE-FOUND"], timeout=10)
+
+        if timeout < time.time():
+            raise Exception("Device not found")
+
     if ev1 is None:
         raise Exception("P2P-DEVICE-FOUND timeout on seeker side")
     if r_dev.p2p_dev_addr() not in ev1:
@@ -174,10 +184,10 @@ def p2ps_provision_keypad_method(i_dev, r_dev, autoaccept,
         ev1 = i_dev.wait_global_event(["P2PS-PROV-DONE"], timeout=10)
         if ev1 is None:
             raise Exception("P2PS-PROV-DONE timeout on seeker side")
-        ev1 = i_dev.wait_global_event(["P2P-PROV-DISC-ENTER-PIN"], timeout=10)
-        if ev1 is None:
+        ev2 = i_dev.wait_global_event(["P2P-PROV-DISC-ENTER-PIN"], timeout=10)
+        if ev2 is None:
             raise Exception("P2P-PROV-DISC-ENTER-PIN failed on seeker side")
-        if r_dev.p2p_dev_addr() not in ev1:
+        if r_dev.p2p_dev_addr() not in ev2:
             raise Exception("Unknown peer ")
         return ev1
 
@@ -581,8 +591,7 @@ def test_p2ps_connect_adv_client_p2ps_method(dev):
         raise Exception("Unable to remove the advertisement instance")
     remove_group(dev[0], dev[1])
 
-def test_p2ps_connect_adv_go_pin_method(dev):
-    """P2PS advertiser as GO with keypad config method on seeker side and auto-accept"""
+def p2ps_connect_adv_go_pin_method(dev, keep_group=False):
     addr0 = dev[0].p2p_dev_addr()
     addr1 = dev[1].p2p_dev_addr()
     p2ps_advertise(r_dev=dev[0], r_role='4', svc_name='org.wi-fi.wfds.send.rx',
@@ -622,15 +631,21 @@ def test_p2ps_connect_adv_go_pin_method(dev):
         ev1 = dev[1].wait_global_event(["P2P-GROUP-STARTED"], timeout=10)
         if ev1 is None:
             raise Exception("P2P-GROUP-STARTED timeout on seeker side")
-       dev[1].group_form_result(ev1)
+        dev[1].group_form_result(ev1)
 
         ev0 = dev[0].wait_global_event(["AP-STA-CONNECTED"], timeout=10)
         if ev0 is None:
             raise Exception("AP-STA-CONNECTED timeout on advertiser side")
-    ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
-    if ev0 is None:
-        raise Exception("Unable to remove the advertisement instance")
-    remove_group(dev[0], dev[1])
+
+    if not keep_group:
+        ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
+        if ev0 is None:
+            raise Exception("Unable to remove the advertisement instance")
+        remove_group(dev[0], dev[1])
+
+def test_p2ps_connect_adv_go_pin_method(dev):
+    """P2PS advertiser as GO with keypad config method on seeker side and auto-accept"""
+    p2ps_connect_adv_go_pin_method(dev)
 
 def test_p2ps_connect_adv_client_pin_method(dev):
     """P2PS advertiser as client with keypad config method on seeker side and auto-accept"""
@@ -788,7 +803,7 @@ def get_ifnames():
         ifnames.append(ifname)
     return ifnames
 
-def p2ps_connect_p2ps_method(dev):
+def p2ps_connect_p2ps_method(dev, keep_group=False):
     addr0 = dev[0].p2p_dev_addr()
     addr1 = dev[1].p2p_dev_addr()
     dev[0].flush_scan_cache()
@@ -815,7 +830,7 @@ def p2ps_connect_p2ps_method(dev):
     if ev1 is None:
         raise Exception("P2P-GROUP-STARTED timeout on seeker side")
     res1 = dev[1].group_form_result(ev1)
-    ifnames1 = get_ifnames()
+    ifnames = get_ifnames()
 
     if "OK" not in dev[0].global_request("P2P_CONNECT " + addr1 + " 12345670 p2ps persistent join"):
         raise Exception("P2P_CONNECT failed on seeker side")
@@ -828,13 +843,16 @@ def p2ps_connect_p2ps_method(dev):
     ev1 = dev[1].wait_global_event(["AP-STA-CONNECTED"], timeout=5)
     if ev1 is None:
         raise Exception("Group formation failed")
-    ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
-    if ev0 is None:
-        raise Exception("Unable to remove the advertisement instance")
-    ifnames2 = get_ifnames()
-    remove_group(dev[0], dev[1])
-    ifnames3 = get_ifnames()
-    return (res0, res1, ifnames1 + ifnames2 + ifnames3)
+
+    if not keep_group:
+        ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
+        if ev0 is None:
+            raise Exception("Unable to remove the advertisement instance")
+        ifnames = ifnames + get_ifnames()
+        remove_group(dev[0], dev[1])
+        ifnames = ifnames + get_ifnames()
+
+    return (res0, res1, ifnames)
 
 def has_string_prefix(vals, prefix):
     for val in vals:
@@ -948,3 +966,57 @@ def test_p2ps_connect_adv_go_persistent(dev):
     if ev0 is None:
         raise Exception("Unable to remove the advertisement instance")
     remove_group(dev[0], dev[1])
+
+def test_p2ps_client_probe(dev):
+    """P2PS CLI discoverability on operating channel"""
+    cli_probe = dev[0].global_request("SET p2p_cli_probe 1")
+    p2ps_connect_p2ps_method(dev, keep_group=True)
+    [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[2], r_dev=dev[0],
+                                              svc_name='org.wi-fi.wfds.send.rx',
+                                              single_peer_expected=False)
+    dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
+    remove_group(dev[0], dev[1])
+
+def test_p2ps_go_probe(dev):
+    """P2PS GO discoverability on operating channel"""
+    p2ps_connect_adv_go_pin_method(dev, keep_group=True)
+    [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[2], r_dev=dev[0],
+                                              svc_name='org.wi-fi.wfds.send.rx',
+                                              single_peer_expected=False)
+    dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
+    remove_group(dev[0], dev[1])
+
+def test_p2ps_wildcard_p2ps(dev):
+    """P2PS wildcard SD Probe Request/Response"""
+    p2ps_wildcard = "org.wi-fi.wfds"
+
+    adv_id = p2ps_advertise(r_dev=dev[0], r_role='1',
+                            svc_name='org.foo.service',
+                            srv_info='I can receive files upto size 2 GB')
+
+    if "OK" not in dev[1].global_request("P2P_FIND 10 type=social seek=" + p2ps_wildcard):
+        raise Exception("Failed on P2P_FIND command")
+
+    ev1 = dev[1].wait_global_event(["P2P-DEVICE-FOUND"], timeout=10)
+    if ev1 is None:
+        raise Exception("P2P-DEVICE-FOUND timeout on seeker side")
+    if dev[0].p2p_dev_addr() not in ev1:
+        raise Exception("Unexpected peer")
+    if p2ps_wildcard not in ev1:
+        raise Exception("P2PS Wildcard name not found in P2P-DEVICE-FOUND event")
+
+    if "OK" not in dev[1].global_request("P2P_STOP_FIND"):
+        raise Exception("P2P_STOP_FIND failed")
+    dev[1].dump_monitor()
+
+    ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
+    if ev0 is None:
+        raise Exception("Unable to remove the advertisement instance")
+
+    if "OK" not in dev[1].global_request("P2P_FIND 10 type=social seek=" + p2ps_wildcard):
+        raise Exception("Failed on P2P_FIND command")
+
+    ev1 = dev[1].wait_global_event(["P2P-DEVICE-FOUND"], timeout=5)
+    if ev1 is not None:
+        raise Exception("Unexpected P2P-DEVICE-FOUND event on seeker side")
+    dev[1].dump_monitor()