Add TP/ping test cases for AP open. Signed-off-by: Janusz Dziedzic <janusz.dziedzic@xxxxxxxxx> --- tests/remote/run-tests.py | 5 +- tests/remote/test_ap_open.py | 663 +++++++++++++++++++++++++++++++++++++++++++ tests/remote/utils.py | 314 ++++++++++++++++++++ 3 files changed, 980 insertions(+), 2 deletions(-) create mode 100644 tests/remote/test_ap_open.py create mode 100644 tests/remote/utils.py diff --git a/tests/remote/run-tests.py b/tests/remote/run-tests.py index 2a3649b..41beacb 100755 --- a/tests/remote/run-tests.py +++ b/tests/remote/run-tests.py @@ -24,9 +24,10 @@ import wpaspy setup_params = {"setup_hw" : "./tests/setup_hw.sh", "hostapd" : "./tests/hostapd", "wpa_supplicant" : "./tests/wpa_supplicant", - "iperf" : "iperf3", + "iperf" : "iperf", "country" : "PL", - "log_dir" : "/tmp/"} + "log_dir" : "/tmp/", + "ipv4_test_net" : "192.168.12.0"} devices = [{"hostname": "192.168.254.58", "ifname" : "wlan0", "port": "9877", "name" : "t2-ath9k", "flags" : "AP_HT40 STA_HT40"}, {"hostname": "192.168.254.58", "ifname" : "wlan1", "port": "9877", "name" : "t2-ath10k", "flags" : "AP_VHT80"}, diff --git a/tests/remote/test_ap_open.py b/tests/remote/test_ap_open.py new file mode 100644 index 0000000..551cd4f --- /dev/null +++ b/tests/remote/test_ap_open.py @@ -0,0 +1,663 @@ +import wpaspy +from wpasupplicant import WpaSupplicant +import hostapd +import utils +import time +import traceback + +import logging +logger = logging.getLogger() + +def run_ap_sta(devices, duts, setup_params, ref, dut): + ref_dev = utils.get_device(devices, name=ref, flags="STA_VHT80") + dut_dev = utils.get_dut(duts, dut) + + if ref_dev is None: + raise Exception("Could not get reference device") + + if dut_dev is None: + raise Exception("Could not get DUT device") + + ap, ap_log = utils.run_hostapd(dut_dev, setup_params) + sta, sta_log = utils.run_wpasupplicant(ref_dev, setup_params) + return sta, ap, sta_log, ap_log + +def run_tp_test(server, client, l3="ipv4", iperf="iperf", l4="tcp", test_time="10", parallel="5", + qos="be", bw="30M", ifname=None, port="5001"): + client_res = [] + server_res = [] + + server_ip = utils.get_ip(server, l3) + time.sleep(1) + server_thread, client_thread = utils.iperf_run(server, client, server_ip, client_res, server_res, + l3=l3, iperf=iperf, l4=l4, test_time=test_time, + parallel=parallel, qos=qos, bw=bw, ifname=ifname, + port=port) + utils.iperf_wait(server, client, server_thread, client_thread, iperf=iperf, timeout=int(test_time) + 10) + + if client_res[0] != 0: + raise Exception(iperf + " client: " + client_res[1]) + if server_res[0] != 0: + raise Exception(iperf + " server: " + server_res[1]) + if client_res[1] is None: + raise Exception(iperf + " client result issue") + if server_res[1] is None: + raise Exception(iperf + " server result issue") + + if iperf == "iperf": + result = server_res[1] + if iperf == "iperf3": + result = client_res[1] + + speed = utils.get_iperf_speed(result) + return speed + +def get_ap_params(channel="1", bw="HT20", country="US"): + ssid = "test_" + channel + "_" + bw + + if int(channel) > 14: + hw_mode = "a" + else: + hw_mode = "g" + + ieee80211n = "0" + ieee80211ac = "0" + ht_capab = "[]" + wmm_enabled = "1" + vht_oper_chwidth ="0" + vht_oper_centr_freq_seg0_idx = "0" + + if bw == "b_only": + hw_mode = "b" + wmm_enabled = "0" + elif bw == "g_only": + hw_mode = "g" + wmm_enabled = "0" + elif bw == "g_only_wmm": + hw_mode = "g" + elif bw == "a_only": + hw_mode = "a" + wmm_enabled = "0" + elif bw == "a_only_wmm": + hw_mode = "a" + elif bw == "HT20": + ieee80211n = "1" + elif bw == "HT40+": + ieee80211n = "1" + ht_capab = "[HT40+]" + elif bw == "HT40-": + ieee80211n = "1" + ht_capab = "[HT40-]" + elif bw == "VHT80": + ieee80211n = "1" + ieee80211ac = "1" + ht_capab = "[HT40+]" + vht_oper_chwidth = "1" + vht_oper_centr_freq_seg0_idx = str(int(channel) + 6) + + params = {"ssid" : ssid, + "hw_mode" : hw_mode, + "channel" : channel, + "ht_capab" : ht_capab, + "ieee80211n" : ieee80211n, + "ieee80211ac" : ieee80211ac, + "country_code": country, + "wmm_enabled" : wmm_enabled, + "vht_oper_chwidth": vht_oper_chwidth, + "vht_oper_centr_freq_seg0_idx": vht_oper_centr_freq_seg0_idx} + + return params + +def get_iperf_bw(bw, parallel, spacial_streams=2): + if bw == "b_only": + max_tp = 11 + elif bw == "g_only" or bw == "g_only_wmm" or bw == "a_only" or bw == "a_only_wmm": + max_tp = 54 + elif bw == "HT20": + max_tp = 72 * spacial_streams + elif bw == "HT40+" or bw == "HT40-": + max_tp = 150 * spacial_streams + elif bw == "VHT80": + max_tp = 433 * spacial_streams + else: + max_tp = 150 + + max_tp = 1.1 * max_tp + + return str(int(max_tp/int(parallel))) + "M" + +def ap_open(devices, duts, setup_params, ref=None, dut=None, test_type="ping_ipv4", + channel="1", bw="HT20", country=None, test_time="30", parallel="5", qos="be"): + try: + sta = None + ap = None + hapd = None + wpas = None + sta_log = None + ap_log = None + + local_log_dir = setup_params['local_log_dir'] + + # setup country code + if country is None: + try: + country = setup_params['country'] + except: + country = "00" + + # run hostapd/wpa_supplicant + sta, ap, sta_log, ap_log = run_ap_sta(devices, duts, setup_params, ref, dut) + ap_params = get_ap_params(channel, bw, country) + iperf_bw = get_iperf_bw(bw, parallel) + + # setup AP/STA + hapd = hostapd.add_ap(ap.ifname, ap_params, hostname = ap.host, port = ap.port) + freq = hapd.get_status_field("freq") + wpas = WpaSupplicant(hostname = sta.host, global_iface="udp", global_port = sta.port) + wpas.interface_add(sta.ifname) + wpas.connect(ap_params['ssid'], key_mgmt="NONE", scan_freq=freq) + ev = hapd.wait_event([ "AP-STA-CONNECTED" ], timeout=5) + if ev is None: + raise Exception("No connection event received from hostapd") + + # setup ip network + ap.execute("ifconfig " + ap.ifname + " " + utils.get_ipv4_addr(setup_params, 1)) + sta.execute("ifconfig " + sta.ifname + " " + utils.get_ipv4_addr(setup_params, 2)) + + # dispatch test_type + if test_type == "ipv4_tcp_download": + speed = run_tp_test(ap, sta, "ipv4", setup_params['iperf'], l4="tcp", + test_time=test_time, parallel=parallel, qos=qos, bw=iperf_bw) + append = speed + elif test_type == "ipv4_tcp_upload": + speed = run_tp_test(sta, ap, "ipv4", setup_params['iperf'], l4="tcp", + test_time=test_time, parallel=parallel, qos=qos, bw=iperf_bw) + append = speed + elif test_type == "ipv6_tcp_download": + speed = run_tp_test(ap, sta, "ipv6", setup_params['iperf'], l4="tcp", + test_time=test_time, parallel=parallel, qos=qos, bw=iperf_bw) + append = speed + elif test_type == "ipv6_tcp_upload": + speed = run_tp_test(sta, ap, "ipv6", setup_params['iperf'], l4="tcp", + test_time=test_time, parallel=parallel, qos=qos, bw=iperf_bw) + append = speed + elif test_type == "ipv4_udp_download": + speed = run_tp_test(ap, sta, "ipv4", setup_params['iperf'], l4="udp", + test_time=test_time, parallel=parallel, qos=qos, bw=iperf_bw) + append = speed + elif test_type == "ipv4_udp_upload": + speed = run_tp_test(sta, ap, "ipv4", setup_params['iperf'], l4="udp", + test_time=test_time, parallel=parallel, qos=qos, bw=iperf_bw) + append = speed + elif test_type == "ipv6_udp_download": + speed = run_tp_test(ap, sta, "ipv6", setup_params['iperf'], l4="udp", + test_time=test_time, parallel=parallel, qos=qos, bw=iperf_bw) + append = speed + elif test_type == "ipv6_udp_upload": + speed = run_tp_test(sta, ap, "ipv6", setup_params['iperf'], l4="udp", + test_time=test_time, parallel=parallel, qos=qos, bw=iperf_bw) + append = speed + elif test_type == "ipv4_ping": + ap_sta, sta_ap = utils.check_connectivity(ap, sta, "ipv4") + append = "packet_loss: " + ap_sta + ", " + sta_ap + elif test_type == "ipv6_ping": + ap_sta, sta_ap = utils.check_connectivity(ap, sta, "ipv6") + append = "packet_loss: " + ap_sta + ", " + sta_ap + else: + raise Exception("Unknown ap_open test_type:", test_type) + + wpas.request("DISCONNECT") + ev = hapd.wait_event([ "AP-STA-DISCONNECTED" ], timeout=5) + if ev is None: + raise Exception("No disconnection event received from hostapd") + + sta.execute("ifconfig " + sta.ifname + " 0.0.0.0") + ap.execute("ifconfig " + ap.ifname + " 0.0.0.0") + + wpas.interface_remove(sta.ifname) + wpas.terminate() + + hapd.close_ctrl() + hostapd.remove_bss(ap.ifname, ap.host, ap.port) + hostapd.terminate(ap.host, ap.port) + + if sta_log is not None: +# sta.local_execute("scp root@[" + sta.host + "]:" + sta_log + " " + local_log_dir) + sta.execute("rm " + sta_log) + if ap_log is not None: +# ap.local_execute("scp root@[" + ap.host + "]:" + ap_log + " " + local_log_dir) + ap.execute("rm " + ap_log) + + return 0, append + except: + logger.info(traceback.format_exc()) + if wpas is not None: + try: + wpas.interface_remove(sta.ifname) + wpas.terminate() + except: + pass + if hapd is not None: + try: + hapd.close_ctrl() + hostapd.remove_bss(ap.ifname, ap.host, ap.port) + hostapd.terminate(ap.host, ap.port) + except: + pass + if sta is not None: + sta.execute("ifconfig " + sta.ifname + " 0.0.0.0") + sta.execute("killall wpa_supplicant") + sta.execute("killall iperf") + if sta_log is not None: + sta.local_execute("scp root@[" + sta.host + "]:" + sta_log + " " + local_log_dir) + sta.execute("rm " + sta_log) + if ap is not None: + ap.execute("ifconfig " + ap.ifname + " 0.0.0.0") + ap.execute("killall hostapd") + ap.execute("killall iperf") + if ap_log is not None: + ap.local_execute("scp root@[" + ap.host + "]:" + ap_log + " " + local_log_dir) + ap.execute("rm " + ap_log) + raise + +# basic ping +def test_ap_open_ipv4_ping(devices, duts, setup_params, ref=None, dut=None): + """AP with open mode (no security) configuration IPv4 ping""" + return ap_open(devices, duts, setup_params, ref, dut, "ipv4_ping") + +def test_ap_open_ipv6_ping(devices, duts, setup_params, ref=None, dut=None): + """AP with open mode (no security) configuration IPv6""" + return ap_open(devices, duts, setup_params, ref, dut, "ipv6_ping") + + +# B-only +def test_ap_open_2412_b_only_ipv4_udp_upload(devices, duts, setup_params, ref=None, dut=None): + """AP with open mode (no security) configuration 2412 B-only IPv4 udp upload""" + return ap_open(devices, duts, setup_params, ref, dut, "ipv4_udp_upload", channel="1", bw="b_only") + +def test_ap_open_2412_b_only_ipv4_udp_download(devices, duts, setup_params, ref=None, dut=None): + """AP with open mode (no security) configuration 2412 B-only IPv4 udp download""" + return ap_open(devices, duts, setup_params, ref, dut, "ipv4_udp_download", channel="1", bw="b_only") + +def test_ap_open_2412_b_only_ipv4_tcp_upload(devices, duts, setup_params, ref=None, dut=None): + """AP with open mode (no security) configuration 2412 B-only IPv4 tcp upload""" + return ap_open(devices, duts, setup_params, ref, dut, "ipv4_tcp_upload", channel="1", bw="b_only") + +def test_ap_open_2412_b_only_ipv4_tcp_download(devices, duts, setup_params, ref=None, dut=None): + """AP with open mode (no security) configuration 2412 B-only IPv4 tcp download""" + return ap_open(devices, duts, setup_params, ref, dut, "ipv4_tcp_download", channel="1", bw="b_only") + +def test_ap_open_2412_b_only_ipv6_udp_upload(devices, duts, setup_params, ref=None, dut=None): + """AP with open mode (no security) configuration 2412 B-only IPv6 udp upload""" + return ap_open(devices, duts, setup_params, ref, dut, "ipv6_udp_upload", channel="1", bw="b_only") + +def test_ap_open_2412_b_only_ipv6_udp_download(devices, duts, setup_params, ref=None, dut=None): + """AP with open mode (no security) configuration 2412 B-only IPv6 udp download""" + return ap_open(devices, duts, setup_params, ref, dut, "ipv6_udp_download", channel="1", bw="b_only") + +def test_ap_open_2412_b_only_ipv6_tcp_upload(devices, duts, setup_params, ref=None, dut=None): + """AP with open mode (no security) configuration 2412 B-only IPv6 tcp upload""" + return ap_open(devices, duts, setup_params, ref, dut, "ipv6_tcp_upload", channel="1", bw="b_only") + +def test_ap_open_2412_b_only_ipv6_tcp_download(devices, duts, setup_params, ref=None, dut=None): + """AP with open mode (no security) configuration 2412 B-only IPv6 tcp download""" + return ap_open(devices, duts, setup_params, ref, dut, "ipv6_tcp_download", channel="1", bw="b_only") +def test_ap_open_all_chan_b_only_ipv4_ping(devices, duts, setup_params, ref=None, dut=None): + """AP with open mode (no security) configuration all channels B-only IPv4 ping""" + try: + country = setup_params['country'] + except: + country = "US" + + chan = 1 + append = country + " " + while chan < 15: + try: + status, buf = ap_open(devices, duts, setup_params, ref, dut, "ipv4_ping", channel=str(chan), + bw="b_only", country = country) + if status is 0: + append = append + str(chan) + ": OK " + else: + append = append + str(chan) + ": FAILED <" + buf + ">" + except: + append = append + str(chan) + ": FAILED " + chan = chan + 1 + + return 0, append + + +# G-only +def test_ap_open_2462_g_only_ipv4_udp_upload(devices, duts, setup_params, ref=None, dut=None): + """AP with open mode (no security) configuration 2462 G-only IPv4 udp upload""" + return ap_open(devices, duts, setup_params, ref, dut, "ipv4_udp_upload", channel="11", bw="g_only") + +def test_ap_open_2462_g_only_ipv4_udp_download(devices, duts, setup_params, ref=None, dut=None): + """AP with open mode (no security) configuration 2462 G-only IPv4 udp download""" + return ap_open(devices, duts, setup_params, ref, dut, "ipv4_udp_download", channel="11", bw="g_only") + +def test_ap_open_2462_g_only_ipv4_tcp_upload(devices, duts, setup_params, ref=None, dut=None): + """AP with open mode (no security) configuration 2462 G-only IPv4 tcp upload""" + return ap_open(devices, duts, setup_params, ref, dut, "ipv4_tcp_upload", channel="11", bw="g_only") + +def test_ap_open_2462_g_only_ipv4_tcp_download(devices, duts, setup_params, ref=None, dut=None): + """AP with open mode (no security) configuration 2462 G-only IPv4 tcp download""" + return ap_open(devices, duts, setup_params, ref, dut, "ipv4_tcp_download", channel="11", bw="g_only") + +def test_ap_open_2462_g_only_ipv6_udp_upload(devices, duts, setup_params, ref=None, dut=None): + """AP with open mode (no security) configuration 2462 G-only IPv6 udp upload""" + return ap_open(devices, duts, setup_params, ref, dut, "ipv6_udp_upload", channel="11", bw="g_only") + +def test_ap_open_2462_g_only_ipv6_udp_download(devices, duts, setup_params, ref=None, dut=None): + """AP with open mode (no security) configuration 2462 G-only IPv6 udp download""" + return ap_open(devices, duts, setup_params, ref, dut, "ipv6_udp_download", channel="11", bw="g_only") + +def test_ap_open_2462_g_only_ipv6_tcp_upload(devices, duts, setup_params, ref=None, dut=None): + """AP with open mode (no security) configuration 2462 G-only IPv6 tcp upload""" + return ap_open(devices, duts, setup_params, ref, dut, "ipv6_tcp_upload", channel="11", bw="g_only") + +def test_ap_open_2462_g_only_ipv6_tcp_download(devices, duts, setup_params, ref=None, dut=None): + """AP with open mode (no security) configuration 2462 G-only IPv6 tcp download""" + return ap_open(devices, duts, setup_params, ref, dut, "ipv6_tcp_download", channel="11", bw="g_only") + +# G-only + WMM +def test_ap_open_2412_g_only_wmm_ipv4_udp_upload(devices, duts, setup_params, ref=None, dut=None): + """AP with open mode (no security) configuration 2462 G-only WMM IPv4 udp upload""" + return ap_open(devices, duts, setup_params, ref, dut, "ipv4_udp_upload", channel="1", bw="g_only_wmm") + +def test_ap_open_2412_g_only_wmm_ipv4_udp_download(devices, duts, setup_params, ref=None, dut=None): + """AP with open mode (no security) configuration 2462 G-only WMM IPv4 udp download""" + return ap_open(devices, duts, setup_params, ref, dut, "ipv4_udp_download", channel="1", bw="g_only_wmm") + +def test_ap_open_2412_g_only_wmm_ipv4_tcp_upload(devices, duts, setup_params, ref=None, dut=None): + """AP with open mode (no security) configuration 2462 G-only WMM IPv4 tcp upload""" + return ap_open(devices, duts, setup_params, ref, dut, "ipv4_tcp_upload", channel="1", bw="g_only_wmm") + +def test_ap_open_2412_g_only_wmm_ipv4_tcp_download(devices, duts, setup_params, ref=None, dut=None): + """AP with open mode (no security) configuration 2462 G-only WMM IPv4 tcp download""" + return ap_open(devices, duts, setup_params, ref, dut, "ipv4_tcp_download", channel="1", bw="g_only_wmm") + +def test_ap_open_2412_g_only_wmm_ipv6_udp_upload(devices, duts, setup_params, ref=None, dut=None): + """AP with open mode (no security) configuration 2462 G-only WMM IPv6 udp upload""" + return ap_open(devices, duts, setup_params, ref, dut, "ipv6_udp_upload", channel="1", bw="g_only_wmm") + +def test_ap_open_2412_g_only_wmm_ipv6_udp_download(devices, duts, setup_params, ref=None, dut=None): + """AP with open mode (no security) configuration 2462 G-only WMM IPv6 udp download""" + return ap_open(devices, duts, setup_params, ref, dut, "ipv6_udp_download", channel="1", bw="g_only_wmm") + +def test_ap_open_2412_g_only_wmm_ipv6_tcp_upload(devices, duts, setup_params, ref=None, dut=None): + """AP with open mode (no security) configuration 2462 G-only WMM IPv6 tcp upload""" + return ap_open(devices, duts, setup_params, ref, dut, "ipv6_tcp_upload", channel="1", bw="g_only_wmm") + +def test_ap_open_2412_g_only_wmm_ipv6_tcp_download(devices, duts, setup_params, ref=None, dut=None): + """AP with open mode (no security) configuration 2462 G-only WMM IPv6 tcp download""" + return ap_open(devices, duts, setup_params, ref, dut, "ipv6_tcp_download", channel="1", bw="g_only_wmm") + + +# A-only +def test_ap_open_5180_a_only_ipv4_udp_upload(devices, duts, setup_params, ref=None, dut=None): + """AP with open mode (no security) configuration 5180 A-only IPv4 udp upload""" + return ap_open(devices, duts, setup_params, ref, dut, "ipv4_udp_upload", channel="36", bw="a_only") + +def test_ap_open_5180_a_only_ipv4_udp_download(devices, duts, setup_params, ref=None, dut=None): + """AP with open mode (no security) configuration 5180 A-only IPv4 udp download""" + return ap_open(devices, duts, setup_params, ref, dut, "ipv4_udp_download", channel="36", bw="a_only") + +def test_ap_open_5180_a_only_ipv4_tcp_upload(devices, duts, setup_params, ref=None, dut=None): + """AP with open mode (no security) configuration 5180 A-only IPv4 tcp upload""" + return ap_open(devices, duts, setup_params, ref, dut, "ipv4_tcp_upload", channel="36", bw="a_only") + +def test_ap_open_5180_a_only_ipv4_tcp_download(devices, duts, setup_params, ref=None, dut=None): + """AP with open mode (no security) configuration 5180 A-only IPv4 tcp upload""" + return ap_open(devices, duts, setup_params, ref, dut, "ipv4_tcp_download", channel="36", bw="a_only") + +def test_ap_open_5180_a_only_ipv6_udp_upload(devices, duts, setup_params, ref=None, dut=None): + """AP with open mode (no security) configuration 5180 A-only IPv6 udp upload""" + return ap_open(devices, duts, setup_params, ref, dut, "ipv6_udp_upload", channel="36", bw="a_only") + +def test_ap_open_5180_a_only_ipv6_udp_download(devices, duts, setup_params, ref=None, dut=None): + """AP with open mode (no security) configuration 5180 A-only IPv6 udp download""" + return ap_open(devices, duts, setup_params, ref, dut, "ipv6_udp_download", channel="36", bw="a_only") + +def test_ap_open_5180_a_only_ipv6_tcp_upload(devices, duts, setup_params, ref=None, dut=None): + """AP with open mode (no security) configuration 5180 A-only IPv6 tcp upload""" + return ap_open(devices, duts, setup_params, ref, dut, "ipv6_tcp_upload", channel="36", bw="a_only") + +def test_ap_open_5180_a_only_ipv6_tcp_download(devices, duts, setup_params, ref=None, dut=None): + """AP with open mode (no security) configuration 5180 A-only IPv6 tcp upload""" + return ap_open(devices, duts, setup_params, ref, dut, "ipv6_tcp_download", channel="36", bw="a_only") + + +# A-only + WMM +def test_ap_open_5180_a_only_wmm_ipv4_udp_upload(devices, duts, setup_params, ref=None, dut=None): + """AP with open mode (no security) configuration 5180 A-only WMM IPv4 udp upload""" + return ap_open(devices, duts, setup_params, ref, dut, "ipv4_udp_upload", channel="36", bw="a_only_wmm") + +def test_ap_open_5180_a_only_wmm_ipv4_udp_download(devices, duts, setup_params, ref=None, dut=None): + """AP with open mode (no security) configuration 5180 A-only WMM IPv4 udp download""" + return ap_open(devices, duts, setup_params, ref, dut, "ipv4_udp_download", channel="36", bw="a_only_wmm") + +def test_ap_open_5180_a_only_wmm_ipv4_tcp_upload(devices, duts, setup_params, ref=None, dut=None): + """AP with open mode (no security) configuration 5180 A-only WMM IPv4 tcp upload""" + return ap_open(devices, duts, setup_params, ref, dut, "ipv4_tcp_upload", channel="36", bw="a_only_wmm") + +def test_ap_open_5180_a_only_wmm_ipv4_tcp_download(devices, duts, setup_params, ref=None, dut=None): + """AP with open mode (no security) configuration 5180 A-only WMM IPv4 tcp upload""" + return ap_open(devices, duts, setup_params, ref, dut, "ipv4_tcp_download", channel="36", bw="a_only_wmm") + +def test_ap_open_5180_a_only_wmm_ipv6_udp_upload(devices, duts, setup_params, ref=None, dut=None): + """AP with open mode (no security) configuration 5180 A-only WMM IPv6 udp upload""" + return ap_open(devices, duts, setup_params, ref, dut, "ipv6_udp_upload", channel="36", bw="a_only_wmm") + +def test_ap_open_5180_a_only_wmm_ipv6_udp_download(devices, duts, setup_params, ref=None, dut=None): + """AP with open mode (no security) configuration 5180 A-only WMM IPv6 udp download""" + return ap_open(devices, duts, setup_params, ref, dut, "ipv6_udp_download", channel="36", bw="a_only_wmm") + +def test_ap_open_5180_a_only_wmm_ipv6_tcp_upload(devices, duts, setup_params, ref=None, dut=None): + """AP with open mode (no security) configuration 5180 A-only WMM IPv6 tcp upload""" + return ap_open(devices, duts, setup_params, ref, dut, "ipv6_tcp_upload", channel="36", bw="a_only_wmm") + +def test_ap_open_5180_a_only_wmm_ipv6_tcp_download(devices, duts, setup_params, ref=None, dut=None): + """AP with open mode (no security) configuration 5180 A-only WMM IPv6 tcp upload""" + return ap_open(devices, duts, setup_params, ref, dut, "ipv6_tcp_download", channel="36", bw="a_only_wmm") + + +# HT20 - 2G +def test_ap_open_2437_HT20_ipv4_tcp_download(devices, duts, setup_params, ref=None, dut=None): + """AP with open mode (no security) configuration 2437 HT20 IPv4 tcp download""" + return ap_open(devices, duts, setup_params, ref, dut, "ipv4_tcp_download", channel="6", bw="HT20") + +def test_ap_open_2437_HT20_ipv4_tcp_upload(devices, duts, setup_params, ref=None, dut=None): + """AP with open mode (no security) configuration 2437 HT20 IPv4 tcp upload""" + return ap_open(devices, duts, setup_params, ref, dut, "ipv4_tcp_upload", channel="6", bw="HT20") + +def test_ap_open_2437_HT20_ipv4_udp_download(devices, duts, setup_params, ref=None, dut=None): + """AP with open mode (no security) configuration 2437 HT20 IPv4 udp download""" + return ap_open(devices, duts, setup_params, ref, dut, "ipv4_udp_download", channel="6", bw="HT20") + +def test_ap_open_2437_HT20_ipv4_udp_upload(devices, duts, setup_params, ref=None, dut=None): + """AP with open mode (no security) configuration 2437 HT20 IPv4 dup upload""" + return ap_open(devices, duts, setup_params, ref, dut, "ipv4_udp_upload", channel="6", bw="HT20") + +def test_ap_open_2437_HT20_ipv6_tcp_download(devices, duts, setup_params, ref=None, dut=None): + """AP with open mode (no security) configuration 2437 HT20 IPv6 tcp download""" + return ap_open(devices, duts, setup_params, ref, dut, "ipv6_tcp_download", channel="6", bw="HT20") + +def test_ap_open_2437_HT20_ipv6_tcp_upload(devices, duts, setup_params, ref=None, dut=None): + """AP with open mode (no security) configuration 2437 HT20 IPv6 tcp upload""" + return ap_open(devices, duts, setup_params, ref, dut, "ipv6_tcp_upload", channel="6", bw="HT20") + +def test_ap_open_2437_HT20_ipv6_udp_download(devices, duts, setup_params, ref=None, dut=None): + """AP with open mode (no security) configuration 2437 HT20 IPv6 udp download""" + return ap_open(devices, duts, setup_params, ref, dut, "ipv6_udp_download", channel="6", bw="HT20") + +def test_ap_open_2437_HT20_ipv6_udp_upload(devices, duts, setup_params, ref=None, dut=None): + """AP with open mode (no security) configuration 2437 HT20 IPv6 dup upload""" + return ap_open(devices, duts, setup_params, ref, dut, "ipv6_udp_upload", channel="6", bw="HT20") + + +# HT40- 2G +def test_ap_open_2462_HT40_ipv4_tcp_download(devices, duts, setup_params, ref=None, dut=None): + """AP with open mode (no security) configuration 2462 HT40- IPv4 tcp download""" + return ap_open(devices, duts, setup_params, ref, dut, "ipv4_tcp_download", channel="11", bw="HT40-") + +def test_ap_open_2462_HT40_ipv4_tcp_upload(devices, duts, setup_params, ref=None, dut=None): + """AP with open mode (no security) configuration 2462 HT40- IPv4 tcp upload""" + return ap_open(devices, duts, setup_params, ref, dut, "ipv4_tcp_upload", channel="11", bw="HT40-") + +def test_ap_open_2462_HT40_ipv4_udp_download(devices, duts, setup_params, ref=None, dut=None): + """AP with open mode (no security) configuration 2462 HT40- IPv4 udp download""" + return ap_open(devices, duts, setup_params, ref, dut, "ipv4_udp_download", channel="11", bw="HT40-") + +def test_ap_open_2462_HT40_ipv4_udp_upload(devices, duts, setup_params, ref=None, dut=None): + """AP with open mode (no security) configuration 2462 HT40- IPv4 udp upload""" + return ap_open(devices, duts, setup_params, ref, dut, "ipv4_udp_upload", channel="11", bw="HT40-") + +def test_ap_open_2462_HT40_ipv6_tcp_download(devices, duts, setup_params, ref=None, dut=None): + """AP with open mode (no security) configuration 2462 HT40- IPv6 tcp download""" + return ap_open(devices, duts, setup_params, ref, dut, "ipv6_tcp_download", channel="11", bw="HT40-") + +def test_ap_open_2462_HT40_ipv6_tcp_upload(devices, duts, setup_params, ref=None, dut=None): + """AP with open mode (no security) configuration 2462 HT40- IPv6 tcp upload""" + return ap_open(devices, duts, setup_params, ref, dut, "ipv6_tcp_upload", channel="11", bw="HT40-") + +def test_ap_open_2462_HT40_ipv6_udp_download(devices, duts, setup_params, ref=None, dut=None): + """AP with open mode (no security) configuration 2462 HT40- IPv6 udp download""" + return ap_open(devices, duts, setup_params, ref, dut, "ipv6_udp_download", channel="11", bw="HT40-") + +def test_ap_open_2462_HT40_ipv6_udp_upload(devices, duts, setup_params, ref=None, dut=None): + """AP with open mode (no security) configuration 2462 HT40- IPv6 udp upload""" + return ap_open(devices, duts, setup_params, ref, dut, "ipv6_udp_upload", channel="11", bw="HT40-") + + +# HT40+ 2G +def test_ap_open_2412_HT40_ipv4_tcp_download(devices, duts, setup_params, ref=None, dut=None): + """AP with open mode (no security) configuration 2412 HT40+ IPv4 tcp download""" + return ap_open(devices, duts, setup_params, ref, dut, "ipv4_tcp_download", channel="1", bw="HT40+") + +def test_ap_open_2412_HT40_ipv4_tcp_upload(devices, duts, setup_params, ref=None, dut=None): + """AP with open mode (no security) configuration 2412 HT40+ IPv4 tcp upload""" + return ap_open(devices, duts, setup_params, ref, dut, "ipv4_tcp_upload", channel="1", bw="HT40+") + +def test_ap_open_2412_HT40_ipv4_udp_download(devices, duts, setup_params, ref=None, dut=None): + """AP with open mode (no security) configuration 2412 HT40+ IPv4 udp download""" + return ap_open(devices, duts, setup_params, ref, dut, "ipv4_udp_download", channel="1", bw="HT40+") + +def test_ap_open_2412_HT40_ipv4_udp_upload(devices, duts, setup_params, ref=None, dut=None): + """AP with open mode (no security) configuration 2412 HT40+ IPv4 udp upload""" + return ap_open(devices, duts, setup_params, ref, dut, "ipv4_udp_upload", channel="1", bw="HT40+") + +def test_ap_open_2412_HT40_ipv6_tcp_download(devices, duts, setup_params, ref=None, dut=None): + """AP with open mode (no security) configuration 2412 HT40+ IPv6 tcp download""" + return ap_open(devices, duts, setup_params, ref, dut, "ipv6_tcp_download", channel="1", bw="HT40+") + +def test_ap_open_2412_HT40_ipv6_tcp_upload(devices, duts, setup_params, ref=None, dut=None): + """AP with open mode (no security) configuration 2412 HT40+ IPv6 tcp upload""" + return ap_open(devices, duts, setup_params, ref, dut, "ipv6_tcp_upload", channel="1", bw="HT40+") + +def test_ap_open_2412_HT40_ipv6_udp_download(devices, duts, setup_params, ref=None, dut=None): + """AP with open mode (no security) configuration 2412 HT40+ IPv6 udp download""" + return ap_open(devices, duts, setup_params, ref, dut, "ipv6_udp_download", channel="1", bw="HT40+") + +def test_ap_open_2412_HT40_ipv6_udp_upload(devices, duts, setup_params, ref=None, dut=None): + """AP with open mode (no security) configuration 2412 HT40+ IPv6 udp upload""" + return ap_open(devices, duts, setup_params, ref, dut, "ipv6_udp_upload", channel="1", bw="HT40+") + + +# HT20 - 5G +def test_ap_open_5180_HT20_ipv4_udp_upload(devices, duts, setup_params, ref=None, dut=None): + """AP with open mode (no security) configuration 5180 HT20 IPv4 udp upload""" + return ap_open(devices, duts, setup_params, ref, dut, "ipv4_udp_upload", channel="40", bw="HT20") + +def test_ap_open_5180_HT20_ipv4_udp_download(devices, duts, setup_params, ref=None, dut=None): + """AP with open mode (no security) configuration 5180 HT20 IPv4 udp download""" + return ap_open(devices, duts, setup_params, ref, dut, "ipv4_udp_upload", channel="40", bw="HT20") + +def test_ap_open_5180_HT20_ipv4_tcp_upload(devices, duts, setup_params, ref=None, dut=None): + """AP with open mode (no security) configuration 5180 HT20 IPv4 tcp upload""" + return ap_open(devices, duts, setup_params, ref, dut, "ipv4_tcp_upload", channel="40", bw="HT20") + +def test_ap_open_5180_HT20_ipv4_tcp_download(devices, duts, setup_params, ref=None, dut=None): + """AP with open mode (no security) configuration 5180 HT20 IPv4 tcp download""" + return ap_open(devices, duts, setup_params, ref, dut, "ipv4_tcp_upload", channel="40", bw="HT20") + +def test_ap_open_5180_HT20_ipv6_udp_upload(devices, duts, setup_params, ref=None, dut=None): + """AP with open mode (no security) configuration 5180 HT20 IPv6 udp upload""" + return ap_open(devices, duts, setup_params, ref, dut, "ipv6_udp_upload", channel="40", bw="HT20") + +def test_ap_open_5180_HT20_ipv6_udp_download(devices, duts, setup_params, ref=None, dut=None): + """AP with open mode (no security) configuration 5180 HT20 IPv6 udp download""" + return ap_open(devices, duts, setup_params, ref, dut, "ipv6_udp_upload", channel="40", bw="HT20") + +def test_ap_open_5180_HT20_ipv6_tcp_upload(devices, duts, setup_params, ref=None, dut=None): + """AP with open mode (no security) configuration 5180 HT20 IPv6 tcp upload""" + return ap_open(devices, duts, setup_params, ref, dut, "ipv6_tcp_upload", channel="40", bw="HT20") + +def test_ap_open_5180_HT20_ipv6_tcp_download(devices, duts, setup_params, ref=None, dut=None): + """AP with open mode (no security) configuration 5180 HT20 IPv6 tcp download""" + return ap_open(devices, duts, setup_params, ref, dut, "ipv6_tcp_upload", channel="40", bw="HT20") + +# HT40+ 5G +def test_ap_open_5180_HT40_ipv4_udp_upload(devices, duts, setup_params, ref=None, dut=None): + """AP with open mode (no security) configuration 5180 HT40 IPv4 udp upload""" + return ap_open(devices, duts, setup_params, ref, dut, "ipv4_udp_upload", channel="36", bw="HT40+") + +def test_ap_open_5180_HT40_ipv4_udp_download(devices, duts, setup_params, ref=None, dut=None): + """AP with open mode (no security) configuration 5180 HT40 IPv4 udp download""" + return ap_open(devices, duts, setup_params, ref, dut, "ipv4_udp_upload", channel="36", bw="HT40+") + +def test_ap_open_5180_HT40_ipv4_tcp_upload(devices, duts, setup_params, ref=None, dut=None): + """AP with open mode (no security) configuration 5180 HT40 IPv4 tcp upload""" + return ap_open(devices, duts, setup_params, ref, dut, "ipv4_tcp_upload", channel="36", bw="HT40+") + +def test_ap_open_5180_HT40_ipv4_tcp_download(devices, duts, setup_params, ref=None, dut=None): + """AP with open mode (no security) configuration 5180 HT40 IPv4 tcp download""" + return ap_open(devices, duts, setup_params, ref, dut, "ipv4_tcp_upload", channel="36", bw="HT40+") + +def test_ap_open_5180_HT40_ipv6_udp_upload(devices, duts, setup_params, ref=None, dut=None): + """AP with open mode (no security) configuration 5180 HT40 IPv6 udp upload""" + return ap_open(devices, duts, setup_params, ref, dut, "ipv6_udp_upload", channel="36", bw="HT40+") + +def test_ap_open_5180_HT40_ipv6_udp_download(devices, duts, setup_params, ref=None, dut=None): + """AP with open mode (no security) configuration 5180 HT40 IPv6 udp download""" + return ap_open(devices, duts, setup_params, ref, dut, "ipv6_udp_upload", channel="36", bw="HT40+") + +def test_ap_open_5180_HT40_ipv6_tcp_upload(devices, duts, setup_params, ref=None, dut=None): + """AP with open mode (no security) configuration 5180 HT40 IPv6 tcp upload""" + return ap_open(devices, duts, setup_params, ref, dut, "ipv6_tcp_upload", channel="36", bw="HT40+") + +def test_ap_open_5180_HT40_ipv6_tcp_download(devices, duts, setup_params, ref=None, dut=None): + """AP with open mode (no security) configuration 5180 HT40 IPv6 tcp download""" + return ap_open(devices, duts, setup_params, ref, dut, "ipv6_tcp_upload", channel="36", bw="HT40+") + +# VHT80 +def test_ap_open_5180_VHT80_ipv4_tcp_download(devices, duts, setup_params, ref=None, dut=None): + """AP with open mode (no security) configuration 5180 VHT80 IPv4 tcp download""" + return ap_open(devices, duts, setup_params, ref, dut, "ipv4_tcp_download", channel="36", bw="VHT80") + +def test_ap_open_5180_VHT80_ipv4_tcp_upload(devices, duts, setup_params, ref=None, dut=None): + """AP with open mode (no security) configuration 5180 VHT80 IPv4 tcp upload""" + return ap_open(devices, duts, setup_params, ref, dut, "ipv4_tcp_upload", channel="36", bw="VHT80") + +def test_ap_open_5180_VHT80_ipv4_udp_download(devices, duts, setup_params, ref=None, dut=None): + """AP with open mode (no security) configuration 5180 VHT80 IPv4 udp download""" + return ap_open(devices, duts, setup_params, ref, dut, "ipv4_udp_download", channel="36", bw="VHT80") + +def test_ap_open_5180_VHT80_ipv4_udp_upload(devices, duts, setup_params, ref=None, dut=None): + """AP with open mode (no security) configuration 5180 VHT80 IPv4 udp upload""" + return ap_open(devices, duts, setup_params, ref, dut, "ipv4_udp_upload", channel="36", bw="VHT80") + +def test_ap_open_5180_VHT80_ipv6_tcp_download(devices, duts, setup_params, ref=None, dut=None): + """AP with open mode (no security) configuration 5180 VHT80 IPv6 tcp download""" + return ap_open(devices, duts, setup_params, ref, dut, "ipv6_tcp_download", channel="36", bw="VHT80") + +def test_ap_open_5180_VHT80_ipv6_tcp_upload(devices, duts, setup_params, ref=None, dut=None): + """AP with open mode (no security) configuration 5180 VHT80 IPv6 tcp upload""" + return ap_open(devices, duts, setup_params, ref, dut, "ipv6_tcp_upload", channel="36", bw="VHT80") + +def test_ap_open_5180_VHT80_ipv6_udp_download(devices, duts, setup_params, ref=None, dut=None): + """AP with open mode (no security) configuration 5180 VHT80 IPv6 udp download""" + return ap_open(devices, duts, setup_params, ref, dut, "ipv6_udp_download", channel="36", bw="VHT80") + +def test_ap_open_5180_VHT80_ipv6_udp_upload(devices, duts, setup_params, ref=None, dut=None): + """AP with open mode (no security) configuration 5180 VHT80 IPv6 udp upload""" + return ap_open(devices, duts, setup_params, ref, dut, "ipv6_udp_upload", channel="36", bw="VHT80") diff --git a/tests/remote/utils.py b/tests/remote/utils.py new file mode 100644 index 0000000..ffdffcc --- /dev/null +++ b/tests/remote/utils.py @@ -0,0 +1,314 @@ +import time +import wpaspy + +def get_device(devices, name=None, flags=None): + if name is None and flags is None: + return devices[0] + for device in devices: + if device['name'] == name: + return device + for device in devices: + try: + device_flags = device['flags'] + if device_flags.find(flags) != -1: + return device + except: + pass + return None + +def get_dut(duts, name=None): + if name is None: + return duts[0] + for dut in duts: + if dut['name'] == name: + return dut + return None + +def run_hostapd(dev, setup_params): + log_file = None + host = wpaspy.Host(host = dev['hostname'], + ifname = dev['ifname'], + port = dev['port'], + name = dev['name']) + try: + setup_hw = setup_params['setup_hw'] + host.execute(setup_hw + " -I " + dev['ifname']) + except: + pass + + try: + tc_name = setup_params['tc_name'] + log_dir = setup_params['log_dir'] + log_file = log_dir + tc_name + "_hostapd_" + host.name + "_" + host.ifname + ".log" + host.execute("rm " + log_file) + log = " -f " + log_file + except: + log = "" + + status, buf = host.execute(setup_params['hostapd'] + " -B -ddt -g udp:" + host.port + log) + if status != 0: + raise Exception("Could not run hostapd: " + buf) + + return host, log_file + +def run_wpasupplicant(dev, setup_params): + log_file = None + host = wpaspy.Host(host = dev['hostname'], + ifname = dev['ifname'], + port = dev['port'], + name = dev['name']) + try: + setup_hw = setup_params['setup_hw'] + host.execute(setup_hw + " -I " + dev['ifname']) + except: + pass + + try: + tc_name = setup_params['tc_name'] + log_dir = setup_params['log_dir'] + log_file = log_dir + tc_name + "_wpa_supplicant_" + host.name + "_" + host.ifname + ".log" + host.execute("rm " + log_file) + log = " -f " + log_file + except: + log = "" + + status, buf = host.execute(setup_params['wpa_supplicant'] + " -B -g udp:" + host.port + log) + if status != 0: + raise Exception("Could not run wpa_supplicant: " + buf) + + return host, log_file + +def get_ping_packet_loss(ping_res): + loss_line = "" + lines = ping_res.splitlines() + for line in lines: + if line.find("packet loss") != -1: + loss_line = line + break; + + if loss_line == "": + return "100%" + + sections = loss_line.split(",") + + for section in sections: + if section.find("packet loss") != -1: + words = section.split() + return words[0] + + return "100%" + + +def get_ipv4(client, ifname=None): + if ifname is None: + ifname = client.ifname + status, buf = client.execute("ifconfig " + ifname) + lines = buf.splitlines() + + for line in lines: + res = line.find("inet addr:") + if res != -1: + break + + if res != -1: + words = line.split() + addr = words[1].split(":") + return addr[1] + + return "unknown" + +def get_ipv6(client, ifname=None): + res = -1 + if ifname is None: + ifname = client.ifname + status, buf = client.execute("ifconfig " + ifname) + lines = buf.splitlines() + + for line in lines: + res = line.find("Scope:Link") + if res != -1: + break + + if res != -1: + words = line.split() + if words[0] == "inet6" and words[1] == "addr:": + addr_mask = words[2] + addr = addr_mask.split("/") + return addr[0] + + return "unknown" + +def get_ip(client, addr_type="ipv6", iface=None): + if addr_type == "ipv6": + return get_ipv6(client, iface) + elif addr_type == "ipv4": + return get_ipv4(client, iface) + else: + return "unknown addr_type: " + addr_type + +def ping_run(host, ip, result, ifname=None, addr_type="ipv4", deadline="5"): + ping = "ping" + if ifname is None: + ifname = host.ifname + if addr_type is "ipv6": + ping = "ping6" + ping = ping + " -w 5" + " -I " + ifname + " " + ip + + thread = host.execute_run(ping, result) + return thread + +def ping_wait(host, thread, timeout=None): + host.wait_execute_complete(thread, timeout) + if thread.isAlive(): + raise Exception("ping thread still alive") + +def check_connectivity(a, b, addr_type = "ipv4", deadline="5"): + addr_a = get_ip(a, addr_type) + addr_b = get_ip(b, addr_type) + + if addr_type == "ipv4": + ping = "ping" + else: + ping = "ping6" + + status, buf = a.execute(ping + " -w " + deadline + " -I " + a.ifname + " " + addr_b) + if status != 0: + raise Exception("ping " + a.ifname + " >> " + b.ifname) + + a_b = get_ping_packet_loss(buf) + + status, buf = b.execute(ping + " -w " + deadline + " -I " + b.ifname + " " + addr_a) + if status != 0: + raise Exception("ping " + b.ifname + " >> " + a.ifname) + + b_a = get_ping_packet_loss(buf) + + if int(a_b[:-1]) > 40: + raise Exception("Too high packet lost: " + a_b) + + if int(b_a[:-1]) > 40: + raise Exception("Too high packet lost: " + b_a) + + return a_b, b_a + +def get_iperf_speed(iperf_res, pattern="Mbits/sec"): + lines = iperf_res.splitlines() + sum_line = "" + last_line = "" + count = 0 + res = -1 + + # first find last SUM line + for line in lines: + res = line.find("[SUM]") + if res != -1: + sum_line = line + + # next check SUM status + if sum_line != "": + words = sum_line.split() + for word in words: + res = word.find(pattern) + if res != -1: + return words[count - 1] + " " + pattern + count = count + 1 + + # no SUM - one thread - find last line + for line in lines: + res = line.find(pattern) + if res != -1: + last_line = line + + if last_line == "": + return "0 " + pattern + + count = 0 + words = last_line.split() + for word in words: + res = word.find(pattern) + if res != -1: + return words[count - 1] + " " + pattern + break; + count = count + 1 + return "0 " + pattern + +def ac_to_iperf_ac(qos): + if qos == "be": + qos_param = "-S 0x00" + elif qos == "bk": + qos_param = "-S 0x20" + elif qos == "vi": + qos_param = "-S 0xA0" + elif qos == "vo": + qos_param = "-S 0xE0" + else: + qos_param = "-S 0x00" + return qos_param + +def iperf_run(server, client, server_ip, client_res, server_res, + l4="udp", bw="30M", test_time="30", parallel="5", + qos="be", param=" -i 5 ", ifname=None, l3="ipv4", + port="5001", iperf="iperf"): + if ifname == None: + ifname = client.ifname + + if iperf == "iperf": + iperf_server = iperf + elif iperf == "iperf3": + iperf_server = iperf + " -1" + + if l3 == "ipv4": + iperf_client = iperf + " -c " + server_ip + " -p " + port + iperf_server = iperf_server + " -p " + port + elif l3 == "ipv6": + iperf_client = iperf + " -V -c " + server_ip + "%" + ifname + " -p " + port + iperf_server = iperf_server + " -V -p " + port + else: + return -1, -1 + + iperf_server = iperf_server + " -s -f m " + param + iperf_client = iperf_client + " -f m -t " + test_time + + if parallel != "1": + iperf_client = iperf_client + " -P" + parallel + + if l4 == "udp": + if iperf is not "iperf3": + iperf_server = iperf_server + " -u" + iperf_client = iperf_client + " -u -b " + bw + + qos_param = ac_to_iperf_ac(qos) + iperf_client = iperf_client + " " + qos_param + + server_thread = server.execute_run(iperf_server, server_res) + time.sleep(1) + client_thread = client.execute_run(iperf_client, client_res) + + return server_thread, client_thread + +def iperf_wait(server, client, server_thread, client_thread, timeout=None, iperf="iperf"): + client.wait_execute_complete(client_thread, timeout) + if client_thread.isAlive(): + raise Exception("iperf client thread still alive") + + server.wait_execute_complete(server_thread, 5) + if server_thread.isAlive(): + server.execute("killall -s INT " + iperf) + time.sleep(1) + + server.wait_execute_complete(server_thread, 5) + if server_thread.isAlive(): + raise Execption("iperf server thread still alive") + + return + +def get_ipv4_addr(setup_params, number): + try: + ipv4_base = setup_params['ipv4_test_net'] + except: + ipv4_base = "172.16.12.0" + + parts = ipv4_base.split('.') + ipv4 = parts[0] + "." + parts[1] + "." + parts[2] + "." + str(number) + + return ipv4 -- 1.9.1 _______________________________________________ Hostap mailing list Hostap@xxxxxxxxxxxxxxxxxxx http://lists.infradead.org/mailman/listinfo/hostap