1 # hwsim testing utilities
2 # Copyright (c) 2013-2014, Jouni Malinen <j@w1.fi>
4 # This software may be distributed under the terms of the BSD license.
5 # See README for more details.
11 logger = logging.getLogger()
13 from wpasupplicant import WpaSupplicant
15 def run_connectivity_test(dev1, dev2, tos, dev1group=False, dev2group=False,
16 ifname1=None, ifname2=None, config=True, timeout=5):
17 addr1 = dev1.own_addr()
18 if not dev1group and isinstance(dev1, WpaSupplicant):
19 addr1 = dev1.get_driver_status_field('addr')
21 addr2 = dev2.own_addr()
22 if not dev2group and isinstance(dev2, WpaSupplicant):
23 addr2 = dev2.get_driver_status_field('addr')
30 cmd = "DATA_TEST_CONFIG 1"
32 cmd = cmd + " ifname=" + ifname1
34 res = dev1.group_request(cmd)
36 res = dev1.request(cmd)
38 raise Exception("Failed to enable data test functionality")
40 cmd = "DATA_TEST_CONFIG 1"
42 cmd = cmd + " ifname=" + ifname2
44 res = dev2.group_request(cmd)
46 res = dev2.request(cmd)
48 raise Exception("Failed to enable data test functionality")
50 cmd = "DATA_TEST_TX {} {} {}".format(addr2, addr1, tos)
52 dev1.group_request(cmd)
56 ev = dev2.wait_group_event(["DATA-TEST-RX"], timeout=timeout)
58 ev = dev2.wait_event(["DATA-TEST-RX"], timeout=timeout)
60 raise Exception("dev1->dev2 unicast data delivery failed")
61 if "DATA-TEST-RX {} {}".format(addr2, addr1) not in ev:
62 raise Exception("Unexpected dev1->dev2 unicast data result")
64 cmd = "DATA_TEST_TX ff:ff:ff:ff:ff:ff {} {}".format(addr1, tos)
66 dev1.group_request(cmd)
70 ev = dev2.wait_group_event(["DATA-TEST-RX"], timeout=timeout)
72 ev = dev2.wait_event(["DATA-TEST-RX"], timeout=timeout)
74 raise Exception("dev1->dev2 broadcast data delivery failed")
75 if "DATA-TEST-RX ff:ff:ff:ff:ff:ff {}".format(addr1) not in ev:
76 raise Exception("Unexpected dev1->dev2 broadcast data result")
78 cmd = "DATA_TEST_TX {} {} {}".format(addr1, addr2, tos)
80 dev2.group_request(cmd)
84 ev = dev1.wait_group_event(["DATA-TEST-RX"], timeout=timeout)
86 ev = dev1.wait_event(["DATA-TEST-RX"], timeout=timeout)
88 raise Exception("dev2->dev1 unicast data delivery failed")
89 if "DATA-TEST-RX {} {}".format(addr1, addr2) not in ev:
90 raise Exception("Unexpected dev2->dev1 unicast data result")
92 cmd = "DATA_TEST_TX ff:ff:ff:ff:ff:ff {} {}".format(addr2, tos)
94 dev2.group_request(cmd)
98 ev = dev1.wait_group_event(["DATA-TEST-RX"], timeout=timeout)
100 ev = dev1.wait_event(["DATA-TEST-RX"], timeout=timeout)
102 raise Exception("dev2->dev1 broadcast data delivery failed")
103 if "DATA-TEST-RX ff:ff:ff:ff:ff:ff {}".format(addr2) not in ev:
104 raise Exception("Unexpected dev2->dev1 broadcast data result")
108 dev1.group_request("DATA_TEST_CONFIG 0")
110 dev1.request("DATA_TEST_CONFIG 0")
112 dev2.group_request("DATA_TEST_CONFIG 0")
114 dev2.request("DATA_TEST_CONFIG 0")
116 def test_connectivity(dev1, dev2, dscp=None, tos=None, max_tries=1,
117 dev1group=False, dev2group=False,
118 ifname1=None, ifname2=None, config=True, timeout=5):
126 for i in range(0, max_tries):
128 run_connectivity_test(dev1, dev2, tos, dev1group, dev2group,
129 ifname1, ifname2, config=config,
135 if i + 1 < max_tries:
138 raise Exception(last_err)
140 def test_connectivity_iface(dev1, dev2, ifname, dscp=None, tos=None,
142 test_connectivity(dev1, dev2, dscp, tos, ifname2=ifname,
145 def test_connectivity_p2p(dev1, dev2, dscp=None, tos=None):
146 test_connectivity(dev1, dev2, dscp, tos, dev1group=True, dev2group=True)
148 def test_connectivity_p2p_sta(dev1, dev2, dscp=None, tos=None):
149 test_connectivity(dev1, dev2, dscp, tos, dev1group=True, dev2group=False)
151 def test_connectivity_sta(dev1, dev2, dscp=None, tos=None):
152 test_connectivity(dev1, dev2, dscp, tos)
154 (PS_DISABLED, PS_ENABLED, PS_AUTO_POLL, PS_MANUAL_POLL) = range(4)
156 def set_powersave(dev, val):
157 phy = dev.get_driver_status_field("phyname")
158 psf = open('/sys/kernel/debug/ieee80211/%s/hwsim/ps' % phy, 'w')
159 psf.write('%d\n' % val)