diff --git a/tests/hwsim/test_dpp.py b/tests/hwsim/test_dpp.py index ba94d9d7a..13d2e4db2 100644 --- a/tests/hwsim/test_dpp.py +++ b/tests/hwsim/test_dpp.py @@ -5507,6 +5507,77 @@ def run_dpp_controller_relay(dev, apdev, params, chirp=False): time.sleep(0.5) wt.close() +def test_dpp_controller_init_through_relay(dev, apdev, params): + """DPP Controller initiating through Relay""" + try: + run_dpp_controller_init_through_relay(dev, apdev, params) + finally: + dev[0].set("dpp_config_processing", "0", allow_fail=True) + dev[1].request("DPP_CONTROLLER_STOP") + +def run_dpp_controller_init_through_relay(dev, apdev, params): + check_dpp_capab(dev[0], min_ver=2) + check_dpp_capab(dev[1], min_ver=2) + cap_lo = os.path.join(params['prefix'], ".lo.pcap") + + wt = WlantestCapture('lo', cap_lo) + + # Controller + conf_id = dev[1].dpp_configurator_add() + dev[1].set("dpp_configurator_params", + "conf=sta-dpp configurator=%d" % conf_id) + id_c = dev[1].dpp_bootstrap_gen() + res = dev[1].request("DPP_BOOTSTRAP_INFO %d" % id_c) + pkhash = None + for line in res.splitlines(): + name, value = line.split('=') + if name == "pkhash": + pkhash = value + break + if not pkhash: + raise Exception("Could not fetch public key hash from Controller") + if "OK" not in dev[1].request("DPP_CONTROLLER_START"): + raise Exception("Failed to start Controller") + + # Relay + port = 11111 + params = {"ssid": "unconfigured", + "channel": "6", + "dpp_controller": "ipaddr=127.0.0.1 pkhash=" + pkhash, + "dpp_relay_port": str(port)} + relay = hostapd.add_ap(apdev[0], params) + check_dpp_capab(relay) + + # Enroll Relay to the network + # TODO: Do this over TCP once direct Enrollee-over-TCP case is supported + id_h = relay.dpp_bootstrap_gen(chan="81/6", mac=True) + uri_r = relay.request("DPP_BOOTSTRAP_GET_URI %d" % id_h) + dev[1].dpp_auth_init(uri=uri_r, conf="ap-dpp", configurator=conf_id) + wait_auth_success(relay, dev[1], configurator=dev[1], enrollee=relay) + update_hapd_config(relay) + + dev[0].flush_scan_cache() + + # Initiate from Controller with broadcast DPP Authentication Request + dev[0].set("dpp_config_processing", "2") + dev[0].dpp_listen(2437) + id_e = dev[0].dpp_bootstrap_gen() + uri_e = dev[0].request("DPP_BOOTSTRAP_GET_URI %d" % id_e) + dev[1].dpp_auth_init(uri=uri_e, conf="sta-dpp", configurator=conf_id, + tcp_addr="127.0.0.1", tcp_port=str(port)) + wait_auth_success(dev[1], dev[0], configurator=dev[1], enrollee=dev[0], + allow_enrollee_failure=True, + allow_configurator_failure=True) + ev = dev[0].wait_event(["DPP-NETWORK-ID"], timeout=1) + if ev is None: + raise Exception("DPP network id not reported") + network = int(ev.split(' ')[1]) + dev[0].wait_connected() + dev[0].dump_monitor() + + time.sleep(0.5) + wt.close() + class MyTCPServer(TCPServer): def __init__(self, addr, handler): self.allow_reuse_address = True