]>
Commit | Line | Data |
---|---|---|
cd7f1b9a JM |
1 | #!/usr/bin/python |
2 | # | |
3 | # Fast BSS Transition tests | |
4 | # Copyright (c) 2013, Jouni Malinen <j@w1.fi> | |
5 | # | |
6 | # This software may be distributed under the terms of the BSD license. | |
7 | # See README for more details. | |
8 | ||
9 | import time | |
10 | import subprocess | |
11 | import logging | |
c9aa4308 | 12 | logger = logging.getLogger() |
cd7f1b9a JM |
13 | |
14 | import hwsim_utils | |
15 | import hostapd | |
16 | from wlantest import Wlantest | |
17 | ||
18 | def ft_base_rsn(): | |
19 | params = { "wpa": "2", | |
20 | "wpa_key_mgmt": "FT-PSK", | |
21 | "rsn_pairwise": "CCMP" } | |
22 | return params | |
23 | ||
24 | def ft_base_mixed(): | |
25 | params = { "wpa": "3", | |
26 | "wpa_key_mgmt": "WPA-PSK FT-PSK", | |
27 | "wpa_pairwise": "TKIP", | |
28 | "rsn_pairwise": "CCMP" } | |
29 | return params | |
30 | ||
31 | def ft_params(rsn=True, ssid=None, passphrase=None): | |
32 | if rsn: | |
33 | params = ft_base_rsn() | |
34 | else: | |
35 | params = ft_base_mixed() | |
36 | if ssid: | |
37 | params["ssid"] = ssid | |
38 | if passphrase: | |
39 | params["wpa_passphrase"] = passphrase | |
40 | ||
41 | params["mobility_domain"] = "a1b2" | |
42 | params["r0_key_lifetime"] = "10000" | |
43 | params["pmk_r1_push"] = "1" | |
44 | params["reassociation_deadline"] = "1000" | |
45 | return params | |
46 | ||
47 | def ft_params1(rsn=True, ssid=None, passphrase=None): | |
48 | params = ft_params(rsn, ssid, passphrase) | |
49 | params['nas_identifier'] = "nas1.w1.fi" | |
50 | params['r1_key_holder'] = "000102030405" | |
51 | params['r0kh'] = [ "02:00:00:00:03:00 nas1.w1.fi 100102030405060708090a0b0c0d0e0f", | |
52 | "02:00:00:00:04:00 nas2.w1.fi 300102030405060708090a0b0c0d0e0f" ] | |
53 | params['r1kh'] = "02:00:00:00:04:00 00:01:02:03:04:06 200102030405060708090a0b0c0d0e0f" | |
54 | return params | |
55 | ||
56 | def ft_params2(rsn=True, ssid=None, passphrase=None): | |
57 | params = ft_params(rsn, ssid, passphrase) | |
58 | params['nas_identifier'] = "nas2.w1.fi" | |
59 | params['r1_key_holder'] = "000102030406" | |
60 | params['r0kh'] = [ "02:00:00:00:03:00 nas1.w1.fi 200102030405060708090a0b0c0d0e0f", | |
61 | "02:00:00:00:04:00 nas2.w1.fi 000102030405060708090a0b0c0d0e0f" ] | |
62 | params['r1kh'] = "02:00:00:00:03:00 00:01:02:03:04:05 300102030405060708090a0b0c0d0e0f" | |
63 | return params | |
64 | ||
b553eab1 | 65 | def run_roams(dev, apdev, ssid, passphrase, over_ds=False): |
cd7f1b9a JM |
66 | logger.info("Connect to first AP") |
67 | dev.connect(ssid, psk=passphrase, key_mgmt="FT-PSK", proto="WPA2", | |
68 | ieee80211w="1") | |
69 | if dev.get_status_field('bssid') == apdev[0]['bssid']: | |
70 | ap1 = apdev[0] | |
71 | ap2 = apdev[1] | |
72 | else: | |
73 | ap1 = apdev[1] | |
74 | ap2 = apdev[0] | |
75 | hwsim_utils.test_connectivity(dev.ifname, ap1['ifname']) | |
76 | ||
77 | logger.info("Roam to the second AP") | |
b553eab1 JM |
78 | if over_ds: |
79 | dev.roam_over_ds(ap2['bssid']) | |
80 | else: | |
81 | dev.roam(ap2['bssid']) | |
cd7f1b9a JM |
82 | if dev.get_status_field('bssid') != ap2['bssid']: |
83 | raise Exception("Did not connect to correct AP") | |
84 | hwsim_utils.test_connectivity(dev.ifname, ap2['ifname']) | |
85 | ||
86 | logger.info("Roam back to the first AP") | |
b553eab1 JM |
87 | if over_ds: |
88 | dev.roam_over_ds(ap1['bssid']) | |
89 | else: | |
90 | dev.roam(ap1['bssid']) | |
cd7f1b9a JM |
91 | if dev.get_status_field('bssid') != ap1['bssid']: |
92 | raise Exception("Did not connect to correct AP") | |
93 | hwsim_utils.test_connectivity(dev.ifname, ap1['ifname']) | |
94 | ||
95 | def test_ap_ft(dev, apdev): | |
96 | """WPA2-PSK-FT AP""" | |
97 | ssid = "test-ft" | |
98 | passphrase="12345678" | |
99 | ||
100 | params = ft_params1(ssid=ssid, passphrase=passphrase) | |
101 | hostapd.add_ap(apdev[0]['ifname'], params) | |
102 | params = ft_params2(ssid=ssid, passphrase=passphrase) | |
103 | hostapd.add_ap(apdev[1]['ifname'], params) | |
104 | ||
105 | run_roams(dev[0], apdev, ssid, passphrase) | |
106 | ||
107 | def test_ap_ft_mixed(dev, apdev): | |
108 | """WPA2-PSK-FT mixed-mode AP""" | |
109 | ssid = "test-ft-mixed" | |
110 | passphrase="12345678" | |
111 | ||
112 | params = ft_params1(rsn=False, ssid=ssid, passphrase=passphrase) | |
113 | hostapd.add_ap(apdev[0]['ifname'], params) | |
114 | params = ft_params2(rsn=False, ssid=ssid, passphrase=passphrase) | |
115 | hostapd.add_ap(apdev[1]['ifname'], params) | |
116 | ||
117 | run_roams(dev[0], apdev, ssid, passphrase) | |
118 | ||
119 | def test_ap_ft_pmf(dev, apdev): | |
120 | """WPA2-PSK-FT AP with PMF""" | |
121 | ssid = "test-ft" | |
122 | passphrase="12345678" | |
123 | ||
124 | params = ft_params1(ssid=ssid, passphrase=passphrase) | |
125 | params["ieee80211w"] = "2"; | |
126 | hostapd.add_ap(apdev[0]['ifname'], params) | |
127 | params = ft_params2(ssid=ssid, passphrase=passphrase) | |
128 | params["ieee80211w"] = "2"; | |
129 | hostapd.add_ap(apdev[1]['ifname'], params) | |
130 | ||
131 | run_roams(dev[0], apdev, ssid, passphrase) | |
b553eab1 JM |
132 | |
133 | def test_ap_ft_over_ds(dev, apdev): | |
134 | """WPA2-PSK-FT AP over DS""" | |
135 | ssid = "test-ft" | |
136 | passphrase="12345678" | |
137 | ||
138 | params = ft_params1(ssid=ssid, passphrase=passphrase) | |
139 | hostapd.add_ap(apdev[0]['ifname'], params) | |
140 | params = ft_params2(ssid=ssid, passphrase=passphrase) | |
141 | hostapd.add_ap(apdev[1]['ifname'], params) | |
142 | ||
143 | run_roams(dev[0], apdev, ssid, passphrase, over_ds=True) | |
144 | ||
145 | def test_ap_ft_pmf_over_ds(dev, apdev): | |
146 | """WPA2-PSK-FT AP over DS with PMF""" | |
147 | ssid = "test-ft" | |
148 | passphrase="12345678" | |
149 | ||
150 | params = ft_params1(ssid=ssid, passphrase=passphrase) | |
151 | params["ieee80211w"] = "2"; | |
152 | hostapd.add_ap(apdev[0]['ifname'], params) | |
153 | params = ft_params2(ssid=ssid, passphrase=passphrase) | |
154 | params["ieee80211w"] = "2"; | |
155 | hostapd.add_ap(apdev[1]['ifname'], params) | |
156 | ||
157 | run_roams(dev[0], apdev, ssid, passphrase, over_ds=True) |