Updated through tag hostap_2_5 from git://w1.fi/hostap.git
[mech_eap.git] / libeap / tests / hwsim / wlantest.py
1 # Python class for controlling wlantest
2 # Copyright (c) 2013-2014, Jouni Malinen <j@w1.fi>
3 #
4 # This software may be distributed under the terms of the BSD license.
5 # See README for more details.
6
7 import os
8 import time
9 import subprocess
10 import logging
11 import wpaspy
12
13 logger = logging.getLogger()
14
15 class Wlantest:
16     def __init__(self):
17         if os.path.isfile('../../wlantest/wlantest_cli'):
18             self.wlantest_cli = '../../wlantest/wlantest_cli'
19         else:
20             self.wlantest_cli = 'wlantest_cli'
21
22     def flush(self):
23         res = subprocess.check_output([self.wlantest_cli, "flush"])
24         if "FAIL" in res:
25             raise Exception("wlantest_cli flush failed")
26
27     def relog(self):
28         res = subprocess.check_output([self.wlantest_cli, "relog"])
29         if "FAIL" in res:
30             raise Exception("wlantest_cli relog failed")
31
32     def add_passphrase(self, passphrase):
33         res = subprocess.check_output([self.wlantest_cli, "add_passphrase",
34                                        passphrase])
35         if "FAIL" in res:
36             raise Exception("wlantest_cli add_passphrase failed")
37
38     def add_wepkey(self, key):
39         res = subprocess.check_output([self.wlantest_cli, "add_wepkey", key])
40         if "FAIL" in res:
41             raise Exception("wlantest_cli add_key failed")
42
43     def info_bss(self, field, bssid):
44         res = subprocess.check_output([self.wlantest_cli, "info_bss",
45                                        field, bssid])
46         if "FAIL" in res:
47             raise Exception("Could not get BSS info from wlantest for " + bssid)
48         return res
49
50     def get_bss_counter(self, field, bssid):
51         try:
52             res = subprocess.check_output([self.wlantest_cli, "get_bss_counter",
53                                            field, bssid]);
54         except Exception, e:
55             return 0
56         if "FAIL" in res:
57             return 0
58         return int(res)
59
60     def clear_bss_counters(self, bssid):
61         subprocess.call([self.wlantest_cli, "clear_bss_counters", bssid],
62                         stdout=open('/dev/null', 'w'));
63
64     def info_sta(self, field, bssid, addr):
65         res = subprocess.check_output([self.wlantest_cli, "info_sta",
66                                        field, bssid, addr])
67         if "FAIL" in res:
68             raise Exception("Could not get STA info from wlantest for " + addr)
69         return res
70
71     def get_sta_counter(self, field, bssid, addr):
72         res = subprocess.check_output([self.wlantest_cli, "get_sta_counter",
73                                        field, bssid, addr]);
74         if "FAIL" in res:
75             raise Exception("wlantest_cli command failed")
76         return int(res)
77
78     def clear_sta_counters(self, bssid, addr):
79         res = subprocess.check_output([self.wlantest_cli, "clear_sta_counters",
80                                        bssid, addr]);
81         if "FAIL" in res:
82             raise Exception("wlantest_cli command failed")
83
84     def tdls_clear(self, bssid, addr1, addr2):
85         res = subprocess.check_output([self.wlantest_cli, "clear_tdls_counters",
86                                        bssid, addr1, addr2]);
87
88     def get_tdls_counter(self, field, bssid, addr1, addr2):
89         res = subprocess.check_output([self.wlantest_cli, "get_tdls_counter",
90                                        field, bssid, addr1, addr2]);
91         if "FAIL" in res:
92             raise Exception("wlantest_cli command failed")
93         return int(res)
94
95     def require_ap_pmf_mandatory(self, bssid):
96         res = self.info_bss("rsn_capab", bssid)
97         if "MFPR" not in res:
98             raise Exception("AP did not require PMF")
99         if "MFPC" not in res:
100             raise Exception("AP did not enable PMF")
101         res = self.info_bss("key_mgmt", bssid)
102         if "PSK-SHA256" not in res:
103             raise Exception("AP did not enable SHA256-based AKM for PMF")
104
105     def require_ap_pmf_optional(self, bssid):
106         res = self.info_bss("rsn_capab", bssid)
107         if "MFPR" in res:
108             raise Exception("AP required PMF")
109         if "MFPC" not in res:
110             raise Exception("AP did not enable PMF")
111
112     def require_ap_no_pmf(self, bssid):
113         res = self.info_bss("rsn_capab", bssid)
114         if "MFPR" in res:
115             raise Exception("AP required PMF")
116         if "MFPC" in res:
117             raise Exception("AP enabled PMF")
118
119     def require_sta_pmf_mandatory(self, bssid, addr):
120         res = self.info_sta("rsn_capab", bssid, addr)
121         if "MFPR" not in res:
122             raise Exception("STA did not require PMF")
123         if "MFPC" not in res:
124             raise Exception("STA did not enable PMF")
125
126     def require_sta_pmf(self, bssid, addr):
127         res = self.info_sta("rsn_capab", bssid, addr)
128         if "MFPC" not in res:
129             raise Exception("STA did not enable PMF")
130
131     def require_sta_no_pmf(self, bssid, addr):
132         res = self.info_sta("rsn_capab", bssid, addr)
133         if "MFPC" in res:
134             raise Exception("STA enabled PMF")
135
136     def require_sta_key_mgmt(self, bssid, addr, key_mgmt):
137         res = self.info_sta("key_mgmt", bssid, addr)
138         if key_mgmt not in res:
139             raise Exception("Unexpected STA key_mgmt")
140
141     def get_tx_tid(self, bssid, addr, tid):
142         res = subprocess.check_output([self.wlantest_cli, "get_tx_tid",
143                                        bssid, addr, str(tid)]);
144         if "FAIL" in res:
145             raise Exception("wlantest_cli command failed")
146         return int(res)
147
148     def get_rx_tid(self, bssid, addr, tid):
149         res = subprocess.check_output([self.wlantest_cli, "get_rx_tid",
150                                        bssid, addr, str(tid)]);
151         if "FAIL" in res:
152             raise Exception("wlantest_cli command failed")
153         return int(res)
154
155     def get_tid_counters(self, bssid, addr):
156         tx = {}
157         rx = {}
158         for tid in range(0, 17):
159             tx[tid] = self.get_tx_tid(bssid, addr, tid)
160             rx[tid] = self.get_rx_tid(bssid, addr, tid)
161         return [ tx, rx ]