[RFC 20/97] tests: Add coverage for interface ID in NDP
Andrei Otcheretianski
andrei.otcheretianski at intel.com
Tue Apr 28 13:05:21 PDT 2026
From: Ilan Peer <ilan.peer at intel.com>
Add testing coverage for configuring interface ID as part
of NDP request and NDP response, and parsing it from the
NAN-NDP-CONNECTED events.
Signed-off-by: Ilan Peer <ilan.peer at intel.com>
---
tests/hwsim/test_nan.py | 52 ++++++++++++++++++++++++++++++-----------
1 file changed, 39 insertions(+), 13 deletions(-)
diff --git a/tests/hwsim/test_nan.py b/tests/hwsim/test_nan.py
index b977e9c0a6..560672f015 100644
--- a/tests/hwsim/test_nan.py
+++ b/tests/hwsim/test_nan.py
@@ -135,7 +135,7 @@ class NanDevice:
def ndp_request(self, ndi, handle, peer_nmi, peer_id, ssi=None,
qos_slots=0, qos_latency=0xffff, csid=None, password=None,
- pmk=None):
+ pmk=None, interface_id=None):
cmd = f"NAN_NDP_REQUEST handle={handle} ndi={ndi} peer_nmi={peer_nmi} peer_id={peer_id}"
params = [
@@ -143,6 +143,7 @@ class NanDevice:
("csid", csid),
("password", password),
("pmk", pmk),
+ ("interface_id", interface_id),
]
cmd += "".join(f" {name}={value}" for name, value in params if value is not None)
@@ -155,7 +156,7 @@ class NanDevice:
def ndp_response(self, action, peer_nmi, ndi=None, peer_ndi=None,
ndp_id=None, init_ndi=None, reason_code=None, ssi=None,
qos_slots=0, qos_latency=0xffff, handle=None, csid=None,
- password=None, pmk=None):
+ password=None, pmk=None, interface_id=None):
if action not in ["accept", "reject"]:
raise Exception(f"Invalid action: {action}. Must be 'accept' or 'reject'")
@@ -172,6 +173,7 @@ class NanDevice:
("csid", csid),
("password", password),
("pmk", pmk),
+ ("interface_id", interface_id),
]
cmd += "".join(f" {name}={value}" for name, value in params if value is not None)
@@ -1027,7 +1029,8 @@ def _nan_discover_service(pub, sub, service_name, pssi, sssi):
return pid, sid, paddr, saddr
def _nan_ndp_request_and_accept(pub, sub, pid, sid, paddr, saddr, req_ssi, resp_ssi, csid=None,
- password=None, pmk=None, counter=False, wrong_pwd=False, configure_schedule=True):
+ password=None, pmk=None, counter=False, wrong_pwd=False,
+ configure_schedule=True, pub_interface_id=None, sub_interface_id=None):
"""
Request NDP from subscriber and accept on publisher.
@@ -1040,7 +1043,8 @@ def _nan_ndp_request_and_accept(pub, sub, pid, sid, paddr, saddr, req_ssi, resp_
# NDP request
if "OK" not in sub.ndp_request(sub.ndi_name, sid, paddr, pid, req_ssi,
- csid=csid, password=password, pmk=pmk):
+ csid=csid, password=password, pmk=pmk,
+ interface_id=sub_interface_id):
raise Exception("NDP request failed")
ev = pub.wpas.wait_event(["NAN-NDP-REQUEST"], timeout=5)
@@ -1066,7 +1070,8 @@ def _nan_ndp_request_and_accept(pub, sub, pid, sid, paddr, saddr, req_ssi, resp_
# Accept NDP request
accept_pwd = "WRONG_PWD" if wrong_pwd else password
if "OK" not in pub.ndp_response("accept", saddr, ndi=pub.ndi_name, ndp_id=ndp_id, init_ndi=init_ndi,
- handle=pid, ssi=resp_ssi, csid=csid, password=accept_pwd, pmk=pmk):
+ handle=pid, ssi=resp_ssi, csid=csid, password=accept_pwd, pmk=pmk,
+ interface_id=pub_interface_id):
raise Exception("NDP response (accept) failed")
# Verify disconnection on wrong password
@@ -1103,12 +1108,26 @@ def _nan_ndp_request_and_accept(pub, sub, pid, sid, paddr, saddr, req_ssi, resp_
if ev is None:
raise Exception("NAN-NDP-CONNECTED event not seen on publisher")
+ data_pub = split_nan_event(ev)
+
ev = sub.wpas.wait_event(["NAN-NDP-CONNECTED"], timeout=5)
if ev is None:
raise Exception("NAN-NDP-CONNECTED event not seen on subscriber")
logger.info("NDP connection established successfully")
+ data_sub = split_nan_event(ev)
+
+ if (sub_interface_id):
+ interface_id = data_pub.get("interface_id")
+ if interface_id != sub_interface_id:
+ raise Exception("No or invalid subscriber interface ID")
+
+ if (pub_interface_id):
+ interface_id = data_sub.get("interface_id")
+ if interface_id != pub_interface_id:
+ raise Exception("No or invalid publisher interface ID")
+
return ndp_id, init_ndi
def _nan_ndp_terminate(pub, sub, paddr, init_ndi, ndp_id):
@@ -1131,7 +1150,7 @@ def _nan_test_connectivity(pub, sub):
test_connectivity(wpas_ndi_pub, wpas_ndi_sub, tos=0, ifname1=pub.ndi_name, ifname2=sub.ndi_name,
max_tries=3, timeout=5, broadcast=False)
-def _run_nan_dp(counter=False, csid=None, wrong_pwd=False, use_pmk=False):
+def _run_nan_dp(counter=False, csid=None, wrong_pwd=False, use_pmk=False, use_interface_id=False):
if use_pmk:
pmk = "00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff"
pwd = None
@@ -1139,6 +1158,10 @@ def _run_nan_dp(counter=False, csid=None, wrong_pwd=False, use_pmk=False):
pwd = "NAN" if csid is not None else None
pmk = None
+ pub_interface_id, sub_interface_id = (
+ ("0011223344556677", "8899aabbccddeeff") if use_interface_id else (None, None)
+ )
+
with hwsim_nan_radios() as (wpas1, wpas2), \
NanDevice(wpas1, "nan0", "ndi0") as pub, NanDevice(wpas2, "nan1", "ndi1") as sub:
@@ -1157,8 +1180,9 @@ def _run_nan_dp(counter=False, csid=None, wrong_pwd=False, use_pmk=False):
result = _nan_ndp_request_and_accept(pub, sub, pid, sid, paddr, saddr, req_ssi="aabbcc",
resp_ssi="ddeeff", csid=csid, password=pwd, pmk=pmk,
- counter=counter, wrong_pwd=wrong_pwd)
-
+ counter=counter, wrong_pwd=wrong_pwd,
+ pub_interface_id=pub_interface_id,
+ sub_interface_id=sub_interface_id)
if result is None:
# wrong_pwd test completed
return
@@ -1168,16 +1192,18 @@ def _run_nan_dp(counter=False, csid=None, wrong_pwd=False, use_pmk=False):
_nan_test_connectivity(pub, sub)
_nan_ndp_terminate(pub, sub, paddr, init_ndi, ndp_id)
-def run_nan_dp(country="US", counter=False, csid=None, wrong_pwd=False, use_pmk=False):
+def run_nan_dp(country="US", counter=False, csid=None, wrong_pwd=False, use_pmk=False,
+ use_interface_id=False):
set_country(country)
try:
- _run_nan_dp(counter=counter, csid=csid, wrong_pwd=wrong_pwd, use_pmk=use_pmk)
+ _run_nan_dp(counter=counter, csid=csid, wrong_pwd=wrong_pwd, use_pmk=use_pmk,
+ use_interface_id=use_interface_id)
finally:
set_country("00")
def test_nan_dp_open(dev, apdev, params):
"""NAN DP open"""
- run_nan_dp()
+ run_nan_dp(use_interface_id=True)
def test_nan_dp_open_2_ndps(dev, apdev, params):
"""NAN DP open - 2 NDPs with same peer"""
@@ -1244,7 +1270,7 @@ def _run_nan_dp_2_ndps(secure_ndp2=False):
def test_nan_dp_open_counter(dev, apdev, params):
"""NAN DP open with counter proposal"""
- run_nan_dp(counter=True)
+ run_nan_dp(counter=True, use_interface_id=True)
def test_nan_dp_sk_ccmp128(dev, apdev, params):
"""NAN DP - 2way NDL + SK CCMP security"""
@@ -1260,7 +1286,7 @@ def test_nan_dp_wrong_pwd(dev, apdev, params):
def test_nan_dp_pmk(dev, apdev, params):
"""NAN DP - 3way NDL + SK CCMP security with PMK"""
- run_nan_dp(counter=True, csid=1, use_pmk=True)
+ run_nan_dp(counter=True, csid=1, use_pmk=True, use_interface_id=True)
def nan_pre_bootstrap(pub, sub, pmb=0x1):
paddr = pub.wpas.own_addr()
--
2.53.0
More information about the Hostap
mailing list