]>
Commit | Line | Data |
---|---|---|
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 | 7 | import os |
a311c61d | 8 | import subprocess |
8a9a3b34 | 9 | import time |
a311c61d | 10 | import logging |
c9aa4308 | 11 | logger = logging.getLogger() |
a311c61d | 12 | |
ce9c8c40 JM |
13 | from wpasupplicant import WpaSupplicant |
14 | ||
1131a1c8 JM |
15 | def 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 |
114 | def 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 |
137 | def 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 | 142 | def test_connectivity_p2p(dev1, dev2, dscp=None, tos=None): |
ce9c8c40 | 143 | test_connectivity(dev1, dev2, dscp, tos, dev1group=True, dev2group=True) |
81266da7 | 144 | |
65249f6c | 145 | def 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 | 148 | def test_connectivity_sta(dev1, dev2, dscp=None, tos=None): |
ce9c8c40 | 149 | test_connectivity(dev1, dev2, dscp, tos) |