]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
tests: NAN USD for provisioning protocols
authorJouni Malinen <jouni.malinen@oss.qualcomm.com>
Fri, 24 Oct 2025 13:28:21 +0000 (16:28 +0300)
committerJouni Malinen <j@w1.fi>
Fri, 24 Oct 2025 17:00:22 +0000 (20:00 +0300)
Signed-off-by: Jouni Malinen <jouni.malinen@oss.qualcomm.com>
tests/hwsim/test_nan_usd.py

index e4f98ca35818ca191c9f54ba8abdffe32a800b8c..43a1e8949d614db85e583fdb894e5d47143da05a 100644 (file)
@@ -469,3 +469,111 @@ def test_nan_usd_publish_multi_chan_pause(dev, apdev):
     ev = dev[0].wait_event(["NAN-PUBLISH-TERMINATED"], timeout=15)
     if ev is None:
         raise Exception("PublishTerminated event not seen")
+
+def test_nan_usd_provisioning(dev, apdev):
+    """NAN USD for provisioning protocols"""
+    check_nan_usd_capab(dev[0])
+    check_nan_usd_capab(dev[1])
+
+    hostapd.add_ap(apdev[0], {"ssid": "ap",
+                              "channel": "11"})
+
+    cmd = "NAN_PUBLISH service_name=_test_provisioning srv_proto_type=3 ssi=6677 ttl=10"
+    id0 = dev[0].request(cmd)
+    if "FAIL" in id0:
+        raise Exception("NAN_PUBLISH failed")
+
+    cmd = "NAN_SUBSCRIBE service_name=_test_provisioning srv_proto_type=3 ssi=1122334455"
+    id1 = dev[1].request(cmd)
+    if "FAIL" in id0:
+        raise Exception("NAN_SUBSCRIBE failed")
+
+    ev = dev[1].wait_event(["NAN-DISCOVERY-RESULT"], timeout=10)
+    if ev is None:
+        raise Exception("DiscoveryResult event not seen")
+    vals = split_nan_event(ev)
+    if vals['srv_proto_type'] != '3':
+        raise Exception("Unexpected srv_proto_type: " + ev)
+    if vals['ssi'] != '6677':
+        raise Exception("Unexpected ssi: " + ev)
+    if vals['subscribe_id'] != id1:
+        raise Exception("Unexpected subscribe_id: " + ev)
+    if vals['publish_id'] != id0:
+        raise Exception("Unexpected publish_id: " + ev)
+    addr0 = vals['address']
+
+    # Automatically sent Follow-up message without ssi
+    ev = dev[0].wait_event(["NAN-RECEIVE"], timeout=5)
+    if ev is None:
+        raise Exception("Receive event not seen")
+    vals2 = split_nan_event(ev)
+    if vals2['ssi'] != '':
+        raise Exception("Unexpected ssi in Follow-up: " + ev)
+
+    # Follow-up from subscriber to publisher
+    time.sleep(0.2)
+    cmd = "NAN_TRANSMIT handle={} req_instance_id={} address={} ssi=8899".format(vals['subscribe_id'], vals['publish_id'], addr0)
+    if "FAIL" in dev[1].request(cmd):
+        raise Exception("NAN_TRANSMIT failed")
+
+    ev = dev[0].wait_event(["NAN-RECEIVE"], timeout=5)
+    if ev is None:
+        raise Exception("Receive event not seen")
+    vals = split_nan_event(ev)
+    if vals['ssi'] != '8899':
+        raise Exception("Unexpected ssi in Follow-up: " + ev)
+    if vals['id'] != id1:
+        raise Exception("Unexpected id: " + ev)
+    if vals['peer_instance_id'] != id1:
+        raise Exception("Unexpected peer_instance_id: " + ev)
+    addr1 = vals['address']
+
+    # Follow-up from publisher to subscriber
+    cmd = "NAN_TRANSMIT handle={} req_instance_id={} address={} ssi=aabbccdd".format(id0, vals['peer_instance_id'], addr1)
+    if "FAIL" in dev[0].request(cmd):
+        raise Exception("NAN_TRANSMIT failed")
+
+    ev = dev[1].wait_event(["NAN-RECEIVE"], timeout=5)
+    if ev is None:
+        raise Exception("Receive event not seen")
+    vals = split_nan_event(ev)
+    if vals['ssi'] != 'aabbccdd':
+        raise Exception("Unexpected ssi in Follow-up: " + ev)
+    if vals['id'] != id1:
+        raise Exception("Unexpected id: " + ev)
+    if vals['peer_instance_id'] != id0:
+        raise Exception("Unexpected peer_instance_id: " + ev)
+
+    # Simulate provisioning of a network profile and connection using it.
+    # Stop NAN USD listen operation first to avoid parallel radio operations
+    # while trying to connect.
+    cmd = "NAN_PUBLISH_STOP_LISTEN id=" + id0;
+    if "OK" not in dev[0].request(cmd):
+        raise Exception("Failed to stop publisher listen operation")
+    # Add the provisioned network profile and connect.
+    id = dev[0].add_network()
+    dev[0].set_network_quoted(id, "ssid", "ap")
+    dev[0].set_network(id, "key_mgmt", "NONE")
+    dev[0].set_network(id, "scan_freq", "2462")
+    dev[0].select_network(id)
+    dev[0].wait_connected()
+
+    # Another Follow-up message from publisher to subscriber to simulate
+    # connection result reporting
+    cmd = "NAN_TRANSMIT handle={} req_instance_id={} address={} ssi=eeff".format(id1, vals['peer_instance_id'], addr1)
+    if "FAIL" in dev[0].request(cmd):
+        raise Exception("NAN_TRANSMIT failed")
+
+    ev = dev[1].wait_event(["NAN-RECEIVE"], timeout=5)
+    if ev is None:
+        raise Exception("Receive event not seen")
+    vals = split_nan_event(ev)
+    if vals['ssi'] != 'eeff':
+        raise Exception("Unexpected ssi in Follow-up: " + ev)
+    if vals['id'] != id1:
+        raise Exception("Unexpected id: " + ev)
+    if vals['peer_instance_id'] != id0:
+        raise Exception("Unexpected peer_instance_id: " + ev)
+
+    dev[0].request("NAN_CANCEL_PUBLISH id=" + id0)
+    dev[1].request("NAN_CANCEL_SUBSCRIBE id=" + id1)