]> git.ipfire.org Git - thirdparty/hostap.git/blame - tests/hwsim/hwsim_utils.py
tests: Optimize multi_check() waits in ap_bss_add* and ap_multi_bss*
[thirdparty/hostap.git] / tests / hwsim / hwsim_utils.py
CommitLineData
a311c61d 1# hwsim testing utilities
8a9a3b34 2# Copyright (c) 2013-2014, Jouni Malinen <j@w1.fi>
a311c61d
JM
3#
4# This software may be distributed under the terms of the BSD license.
5# See README for more details.
6
280cd8a9 7import os
a311c61d 8import subprocess
8a9a3b34 9import time
a311c61d 10import logging
c9aa4308 11logger = logging.getLogger()
a311c61d 12
ce9c8c40
JM
13from wpasupplicant import WpaSupplicant
14
1131a1c8
JM
15def run_connectivity_test(dev1, dev2, tos, dev1group=False, dev2group=False,
16 ifname1=None, ifname2=None):
ce9c8c40
JM
17 addr1 = dev1.own_addr()
18 if not dev1group and isinstance(dev1, WpaSupplicant):
19 addr1 = dev1.get_driver_status_field('addr')
20
21 addr2 = dev2.own_addr()
22 if not dev2group and isinstance(dev2, WpaSupplicant):
23 addr2 = dev2.get_driver_status_field('addr')
24
1d0b5a04
JM
25 dev1.dump_monitor()
26 dev2.dump_monitor()
27
ce9c8c40
JM
28 try:
29 cmd = "DATA_TEST_CONFIG 1"
1131a1c8
JM
30 if ifname1:
31 cmd = cmd + " ifname=" + ifname1
ce9c8c40
JM
32 if dev1group:
33 res = dev1.group_request(cmd)
34 else:
35 res = dev1.request(cmd)
36 if "OK" not in res:
37 raise Exception("Failed to enable data test functionality")
38
1131a1c8
JM
39 cmd = "DATA_TEST_CONFIG 1"
40 if ifname2:
41 cmd = cmd + " ifname=" + ifname2
ce9c8c40
JM
42 if dev2group:
43 res = dev2.group_request(cmd)
44 else:
45 res = dev2.request(cmd)
46 if "OK" not in res:
47 raise Exception("Failed to enable data test functionality")
48
49 cmd = "DATA_TEST_TX {} {} {}".format(addr2, addr1, tos)
50 if dev1group:
51 dev1.group_request(cmd)
52 else:
53 dev1.request(cmd)
54 if dev2group:
55 ev = dev2.wait_group_event(["DATA-TEST-RX"], timeout=5)
56 else:
57 ev = dev2.wait_event(["DATA-TEST-RX"], timeout=5)
58 if ev is None:
59 raise Exception("dev1->dev2 unicast data delivery failed")
60 if "DATA-TEST-RX {} {}".format(addr2, addr1) not in ev:
61 raise Exception("Unexpected dev1->dev2 unicast data result")
62
63 cmd = "DATA_TEST_TX ff:ff:ff:ff:ff:ff {} {}".format(addr1, tos)
64 if dev1group:
65 dev1.group_request(cmd)
66 else:
67 dev1.request(cmd)
68 if dev2group:
69 ev = dev2.wait_group_event(["DATA-TEST-RX"], timeout=5)
70 else:
71 ev = dev2.wait_event(["DATA-TEST-RX"], timeout=5)
72 if ev is None:
73 raise Exception("dev1->dev2 broadcast data delivery failed")
74 if "DATA-TEST-RX ff:ff:ff:ff:ff:ff {}".format(addr1) not in ev:
75 raise Exception("Unexpected dev1->dev2 broadcast data result")
76
77 cmd = "DATA_TEST_TX {} {} {}".format(addr1, addr2, tos)
78 if dev2group:
79 dev2.group_request(cmd)
80 else:
81 dev2.request(cmd)
82 if dev1group:
83 ev = dev1.wait_group_event(["DATA-TEST-RX"], timeout=5)
84 else:
85 ev = dev1.wait_event(["DATA-TEST-RX"], timeout=5)
86 if ev is None:
87 raise Exception("dev2->dev1 unicast data delivery failed")
88 if "DATA-TEST-RX {} {}".format(addr1, addr2) not in ev:
89 raise Exception("Unexpected dev2->dev1 unicast data result")
90
91 cmd = "DATA_TEST_TX ff:ff:ff:ff:ff:ff {} {}".format(addr2, tos)
92 if dev2group:
93 dev2.group_request(cmd)
94 else:
95 dev2.request(cmd)
96 if dev1group:
97 ev = dev1.wait_group_event(["DATA-TEST-RX"], timeout=5)
98 else:
99 ev = dev1.wait_event(["DATA-TEST-RX"], timeout=5)
100 if ev is None:
101 raise Exception("dev2->dev1 broadcast data delivery failed")
102 if "DATA-TEST-RX ff:ff:ff:ff:ff:ff {}".format(addr2) not in ev:
103 raise Exception("Unexpected dev2->dev1 broadcast data result")
104 finally:
105 if dev1group:
106 dev1.group_request("DATA_TEST_CONFIG 0")
107 else:
108 dev1.request("DATA_TEST_CONFIG 0")
109 if dev2group:
110 dev2.group_request("DATA_TEST_CONFIG 0")
111 else:
112 dev2.request("DATA_TEST_CONFIG 0")
113
1131a1c8
JM
114def test_connectivity(dev1, dev2, dscp=None, tos=None, max_tries=1,
115 dev1group=False, dev2group=False,
116 ifname1=None, ifname2=None):
ce9c8c40
JM
117 if dscp:
118 tos = dscp << 2
119 if not tos:
120 tos = 0
121
122 success = False
123 last_err = None
124 for i in range(0, max_tries):
125 try:
1131a1c8
JM
126 run_connectivity_test(dev1, dev2, tos, dev1group, dev2group,
127 ifname1, ifname2)
ce9c8c40
JM
128 success = True
129 break
130 except Exception, e:
131 last_err = e
132 if i + 1 < max_tries:
133 time.sleep(1)
134 if not success:
135 raise Exception(last_err)
a8375c94 136
1131a1c8
JM
137def test_connectivity_iface(dev1, dev2, ifname, dscp=None, tos=None,
138 max_tries=1):
139 test_connectivity(dev1, dev2, dscp, tos, ifname2=ifname,
140 max_tries=max_tries)
a8375c94 141
65249f6c 142def test_connectivity_p2p(dev1, dev2, dscp=None, tos=None):
ce9c8c40 143 test_connectivity(dev1, dev2, dscp, tos, dev1group=True, dev2group=True)
81266da7 144
65249f6c 145def test_connectivity_p2p_sta(dev1, dev2, dscp=None, tos=None):
ce9c8c40 146 test_connectivity(dev1, dev2, dscp, tos, dev1group=True, dev2group=False)
b162675f 147
65249f6c 148def test_connectivity_sta(dev1, dev2, dscp=None, tos=None):
ce9c8c40 149 test_connectivity(dev1, dev2, dscp, tos)