]> git.ipfire.org Git - thirdparty/hostap.git/blame - tests/hwsim/test_ap_hs20.py
tests: Verify excluded_ssid with all credential types
[thirdparty/hostap.git] / tests / hwsim / test_ap_hs20.py
CommitLineData
93a06242 1# Hotspot 2.0 tests
2f37a66d 2# Copyright (c) 2013-2014, Jouni Malinen <j@w1.fi>
93a06242
JM
3#
4# This software may be distributed under the terms of the BSD license.
5# See README for more details.
6
7import time
8import subprocess
9import logging
c9aa4308 10logger = logging.getLogger()
efd43d85
JM
11import os.path
12import subprocess
93a06242
JM
13
14import hostapd
715bf904 15from wlantest import Wlantest
93a06242 16
d4058934
JM
17def hs20_ap_params(ssid="test-hs20"):
18 params = hostapd.wpa2_params(ssid=ssid)
93a06242
JM
19 params['wpa_key_mgmt'] = "WPA-EAP"
20 params['ieee80211w'] = "1"
21 params['ieee8021x'] = "1"
22 params['auth_server_addr'] = "127.0.0.1"
23 params['auth_server_port'] = "1812"
24 params['auth_server_shared_secret'] = "radius"
25 params['interworking'] = "1"
26 params['access_network_type'] = "14"
27 params['internet'] = "1"
28 params['asra'] = "0"
29 params['esr'] = "0"
30 params['uesa'] = "0"
31 params['venue_group'] = "7"
32 params['venue_type'] = "1"
33 params['venue_name'] = [ "eng:Example venue", "fin:Esimerkkipaikka" ]
34 params['roaming_consortium'] = [ "112233", "1020304050", "010203040506",
35 "fedcba" ]
36 params['domain_name'] = "example.com,another.example.com"
37 params['nai_realm'] = [ "0,example.com,13[5:6],21[2:4][5:7]",
38 "0,another.example.com" ]
39 params['hs20'] = "1"
40 params['hs20_wan_metrics'] = "01:8000:1000:80:240:3000"
41 params['hs20_conn_capab'] = [ "1:0:2", "6:22:1", "17:5060:0" ]
42 params['hs20_operating_class'] = "5173"
43 params['anqp_3gpp_cell_net'] = "244,91"
44 return params
45
9714fbcd
JM
46def check_auto_select(dev, bssid):
47 dev.request("INTERWORKING_SELECT auto freq=2412")
48 ev = dev.wait_event(["CTRL-EVENT-CONNECTED"], timeout=15)
49 if ev is None:
50 raise Exception("Connection timed out")
51 if bssid not in ev:
52 raise Exception("Connected to incorrect network")
53 dev.request("REMOVE_NETWORK all")
54
2f37a66d 55def interworking_select(dev, bssid, type=None, no_match=False, freq=None):
bbe86767 56 dev.dump_monitor()
2f37a66d
JM
57 freq_extra = " freq=" + freq if freq else ""
58 dev.request("INTERWORKING_SELECT" + freq_extra)
bbe86767
JM
59 ev = dev.wait_event(["INTERWORKING-AP", "INTERWORKING-NO-MATCH"],
60 timeout=15)
93a06242
JM
61 if ev is None:
62 raise Exception("Network selection timed out");
bbe86767
JM
63 if no_match:
64 if "INTERWORKING-NO-MATCH" not in ev:
65 raise Exception("Unexpected network match")
66 return
93a06242
JM
67 if "INTERWORKING-NO-MATCH" in ev:
68 raise Exception("Matching network not found")
2cdd91d8 69 if bssid and bssid not in ev:
93a06242 70 raise Exception("Unexpected BSSID in match")
bbe86767
JM
71 if type and "type=" + type not in ev:
72 raise Exception("Network type not recognized correctly")
93a06242 73
bbe86767
JM
74def check_sp_type(dev, sp_type):
75 type = dev.get_status_field("sp_type")
76 if type is None:
77 raise Exception("sp_type not available")
78 if type != sp_type:
79 raise Exception("sp_type did not indicate home network")
efd43d85 80
bbe86767 81def hlr_auc_gw_available():
efd43d85
JM
82 if not os.path.exists("/tmp/hlr_auc_gw.sock"):
83 logger.info("No hlr_auc_gw available");
bbe86767 84 return False
efd43d85
JM
85 if not os.path.exists("../../hostapd/hlr_auc_gw"):
86 logger.info("No hlr_auc_gw available");
bbe86767
JM
87 return False
88 return True
efd43d85 89
bbe86767
JM
90def interworking_ext_sim_connect(dev, bssid, method):
91 dev.request("INTERWORKING_CONNECT " + bssid)
078683ac 92 interworking_ext_sim_auth(dev, method)
efd43d85 93
078683ac 94def interworking_ext_sim_auth(dev, method):
bbe86767 95 ev = dev.wait_event(["CTRL-EVENT-EAP-METHOD"], timeout=15)
efd43d85
JM
96 if ev is None:
97 raise Exception("Network connected timed out")
bbe86767 98 if "(" + method + ")" not in ev:
efd43d85
JM
99 raise Exception("Unexpected EAP method selection")
100
bbe86767 101 ev = dev.wait_event(["CTRL-REQ-SIM"], timeout=15)
efd43d85
JM
102 if ev is None:
103 raise Exception("Wait for external SIM processing request timed out")
104 p = ev.split(':', 2)
105 if p[1] != "GSM-AUTH":
106 raise Exception("Unexpected CTRL-REQ-SIM type")
107 id = p[0].split('-')[3]
108 rand = p[2].split(' ')[0]
109
110 res = subprocess.check_output(["../../hostapd/hlr_auc_gw",
111 "-m",
112 "auth_serv/hlr_auc_gw.milenage_db",
113 "GSM-AUTH-REQ 232010000000000 " + rand])
114 if "GSM-AUTH-RESP" not in res:
115 raise Exception("Unexpected hlr_auc_gw response")
116 resp = res.split(' ')[2].rstrip()
117
bbe86767
JM
118 dev.request("CTRL-RSP-SIM-" + id + ":GSM-AUTH:" + resp)
119 ev = dev.wait_event(["CTRL-EVENT-CONNECTED"], timeout=15)
efd43d85
JM
120 if ev is None:
121 raise Exception("Connection timed out")
f4defd91 122
8fba2e5d
JM
123def interworking_connect(dev, bssid, method):
124 dev.request("INTERWORKING_CONNECT " + bssid)
078683ac 125 interworking_auth(dev, method)
8fba2e5d 126
078683ac 127def interworking_auth(dev, method):
8fba2e5d
JM
128 ev = dev.wait_event(["CTRL-EVENT-EAP-METHOD"], timeout=15)
129 if ev is None:
130 raise Exception("Network connected timed out")
131 if "(" + method + ")" not in ev:
132 raise Exception("Unexpected EAP method selection")
133
134 ev = dev.wait_event(["CTRL-EVENT-CONNECTED"], timeout=15)
135 if ev is None:
136 raise Exception("Connection timed out")
137
715bf904
JM
138def check_probe_resp(wt, bssid_unexpected, bssid_expected):
139 if bssid_unexpected:
140 count = wt.get_bss_counter("probe_response", bssid_unexpected)
141 if count > 0:
142 raise Exception("Unexpected Probe Response frame from AP")
143
144 if bssid_expected:
145 count = wt.get_bss_counter("probe_response", bssid_expected)
146 if count == 0:
147 raise Exception("No Probe Response frame from AP")
148
2cdd91d8
JM
149def test_ap_anqp_sharing(dev, apdev):
150 """ANQP sharing within ESS and explicit unshare"""
151 bssid = apdev[0]['bssid']
152 params = hs20_ap_params()
153 params['hessid'] = bssid
154 hostapd.add_ap(apdev[0]['ifname'], params)
155
156 bssid2 = apdev[1]['bssid']
157 params = hs20_ap_params()
158 params['hessid'] = bssid
159 params['nai_realm'] = [ "0,example.com,13[5:6],21[2:4][5:7]" ]
160 hostapd.add_ap(apdev[1]['ifname'], params)
161
2cdd91d8
JM
162 dev[0].hs20_enable()
163 id = dev[0].add_cred_values({ 'realm': "example.com", 'username': "test",
164 'password': "secret",
165 'domain': "example.com" })
166 logger.info("Normal network selection with shared ANQP results")
2f37a66d 167 interworking_select(dev[0], None, "home", freq="2412")
2cdd91d8
JM
168 dev[0].dump_monitor()
169
170 res1 = dev[0].get_bss(bssid)
171 res2 = dev[0].get_bss(bssid2)
172 if res1['anqp_nai_realm'] != res2['anqp_nai_realm']:
173 raise Exception("ANQP results were not shared between BSSes")
174
175 logger.info("Explicit ANQP request to unshare ANQP results")
176 dev[0].request("ANQP_GET " + bssid + " 263")
177 ev = dev[0].wait_event(["RX-ANQP"], timeout=5)
178 if ev is None:
179 raise Exception("ANQP operation timed out")
180
181 dev[0].request("ANQP_GET " + bssid2 + " 263")
182 ev = dev[0].wait_event(["RX-ANQP"], timeout=5)
183 if ev is None:
184 raise Exception("ANQP operation timed out")
185
186 res1 = dev[0].get_bss(bssid)
187 res2 = dev[0].get_bss(bssid2)
188 if res1['anqp_nai_realm'] == res2['anqp_nai_realm']:
189 raise Exception("ANQP results were not unshared")
190
cddc19e5
JM
191def test_ap_nai_home_realm_query(dev, apdev):
192 """NAI Home Realm Query"""
193 bssid = apdev[0]['bssid']
194 params = hs20_ap_params()
195 params['nai_realm'] = [ "0,example.com,13[5:6],21[2:4][5:7]",
196 "0,another.example.org" ]
197 hostapd.add_ap(apdev[0]['ifname'], params)
198
199 dev[0].scan(freq="2412")
200 dev[0].request("HS20_GET_NAI_HOME_REALM_LIST " + bssid + " realm=example.com")
201 ev = dev[0].wait_event(["RX-ANQP"], timeout=5)
202 if ev is None:
203 raise Exception("ANQP operation timed out")
204 nai1 = dev[0].get_bss(bssid)['anqp_nai_realm']
205 dev[0].dump_monitor()
206
207 dev[0].request("ANQP_GET " + bssid + " 263")
208 ev = dev[0].wait_event(["RX-ANQP"], timeout=5)
209 if ev is None:
210 raise Exception("ANQP operation timed out")
211 nai2 = dev[0].get_bss(bssid)['anqp_nai_realm']
212
213 if len(nai1) >= len(nai2):
214 raise Exception("Unexpected NAI Realm list response lengths")
215 if "example.com".encode('hex') not in nai1:
216 raise Exception("Home realm not reported")
217 if "example.org".encode('hex') in nai1:
218 raise Exception("Non-home realm reported")
219 if "example.com".encode('hex') not in nai2:
220 raise Exception("Home realm not reported in wildcard query")
221 if "example.org".encode('hex') not in nai2:
222 raise Exception("Non-home realm not reported in wildcard query ")
223
715bf904
JM
224def test_ap_interworking_scan_filtering(dev, apdev):
225 """Interworking scan filtering with HESSID and access network type"""
226 bssid = apdev[0]['bssid']
227 params = hs20_ap_params()
228 ssid = "test-hs20-ap1"
229 params['ssid'] = ssid
230 params['hessid'] = bssid
231 hostapd.add_ap(apdev[0]['ifname'], params)
232
233 bssid2 = apdev[1]['bssid']
234 params = hs20_ap_params()
235 ssid2 = "test-hs20-ap2"
236 params['ssid'] = ssid2
237 params['hessid'] = bssid2
238 params['access_network_type'] = "1"
8175854e
JM
239 del params['venue_group']
240 del params['venue_type']
715bf904
JM
241 hostapd.add_ap(apdev[1]['ifname'], params)
242
715bf904
JM
243 dev[0].hs20_enable()
244
245 wt = Wlantest()
246 wt.flush()
247
248 logger.info("Check probe request filtering based on HESSID")
249
250 dev[0].request("SET hessid " + bssid2)
0589f401 251 dev[0].scan(freq="2412")
94a2dd0b 252 time.sleep(0.03)
715bf904
JM
253 check_probe_resp(wt, bssid, bssid2)
254
255 logger.info("Check probe request filtering based on access network type")
256
257 wt.clear_bss_counters(bssid)
258 wt.clear_bss_counters(bssid2)
259 dev[0].request("SET hessid 00:00:00:00:00:00")
260 dev[0].request("SET access_network_type 14")
0589f401 261 dev[0].scan(freq="2412")
94a2dd0b 262 time.sleep(0.03)
715bf904
JM
263 check_probe_resp(wt, bssid2, bssid)
264
265 wt.clear_bss_counters(bssid)
266 wt.clear_bss_counters(bssid2)
267 dev[0].request("SET hessid 00:00:00:00:00:00")
268 dev[0].request("SET access_network_type 1")
0589f401 269 dev[0].scan(freq="2412")
94a2dd0b 270 time.sleep(0.03)
715bf904
JM
271 check_probe_resp(wt, bssid, bssid2)
272
273 logger.info("Check probe request filtering based on HESSID and ANT")
274
275 wt.clear_bss_counters(bssid)
276 wt.clear_bss_counters(bssid2)
277 dev[0].request("SET hessid " + bssid)
278 dev[0].request("SET access_network_type 14")
0589f401 279 dev[0].scan(freq="2412")
94a2dd0b 280 time.sleep(0.03)
715bf904
JM
281 check_probe_resp(wt, bssid2, bssid)
282
283 wt.clear_bss_counters(bssid)
284 wt.clear_bss_counters(bssid2)
285 dev[0].request("SET hessid " + bssid2)
286 dev[0].request("SET access_network_type 14")
0589f401 287 dev[0].scan(freq="2412")
94a2dd0b 288 time.sleep(0.03)
715bf904
JM
289 check_probe_resp(wt, bssid, None)
290 check_probe_resp(wt, bssid2, None)
291
292 wt.clear_bss_counters(bssid)
293 wt.clear_bss_counters(bssid2)
294 dev[0].request("SET hessid " + bssid)
295 dev[0].request("SET access_network_type 1")
0589f401 296 dev[0].scan(freq="2412")
94a2dd0b 297 time.sleep(0.03)
715bf904
JM
298 check_probe_resp(wt, bssid, None)
299 check_probe_resp(wt, bssid2, None)
300
bbe86767
JM
301def test_ap_hs20_select(dev, apdev):
302 """Hotspot 2.0 network selection"""
303 bssid = apdev[0]['bssid']
304 params = hs20_ap_params()
305 params['hessid'] = bssid
306 hostapd.add_ap(apdev[0]['ifname'], params)
307
308 dev[0].hs20_enable()
2232edf8
JM
309 id = dev[0].add_cred_values({ 'realm': "example.com", 'username': "test",
310 'password': "secret",
311 'domain': "example.com" })
bbe86767
JM
312 interworking_select(dev[0], bssid, "home")
313
314 dev[0].remove_cred(id)
2232edf8
JM
315 id = dev[0].add_cred_values({ 'realm': "example.com", 'username': "test",
316 'password': "secret",
317 'domain': "no.match.example.com" })
2f37a66d 318 interworking_select(dev[0], bssid, "roaming", freq="2412")
bbe86767
JM
319
320 dev[0].set_cred_quoted(id, "realm", "no.match.example.com");
2f37a66d 321 interworking_select(dev[0], bssid, no_match=True, freq="2412")
bbe86767 322
4b572e3a
JM
323 bssid2 = apdev[1]['bssid']
324 params = hs20_ap_params()
325 params['nai_realm'] = [ "0,example.org,21" ]
326 params['hessid'] = bssid2
327 params['domain_name'] = "example.org"
328 hostapd.add_ap(apdev[1]['ifname'], params)
329 dev[0].remove_cred(id)
330 id = dev[0].add_cred_values({ 'realm': "example.org", 'username': "test",
331 'password': "secret",
332 'domain': "example.org" })
333 interworking_select(dev[0], bssid2, "home", freq="2412")
334
459e96cd
JM
335def hs20_simulated_sim(dev, ap, method):
336 bssid = ap['bssid']
337 params = hs20_ap_params()
338 params['hessid'] = bssid
339 params['anqp_3gpp_cell_net'] = "555,444"
340 params['domain_name'] = "wlan.mnc444.mcc555.3gppnetwork.org"
341 hostapd.add_ap(ap['ifname'], params)
342
459e96cd
JM
343 dev.hs20_enable()
344 dev.add_cred_values({ 'imsi': "555444-333222111", 'eap': method,
345 'milenage': "5122250214c33e723a5dd523fc145fc0:981d464c7c52eb6e5036234984ad0bcf:000000000123"})
2f37a66d 346 interworking_select(dev, "home", freq="2412")
459e96cd
JM
347 interworking_connect(dev, bssid, method)
348 check_sp_type(dev, "home")
349
350def test_ap_hs20_sim(dev, apdev):
351 """Hotspot 2.0 with simulated SIM and EAP-SIM"""
352 if not hlr_auc_gw_available():
353 return "skip"
354 hs20_simulated_sim(dev[0], apdev[0], "SIM")
355
356def test_ap_hs20_aka(dev, apdev):
357 """Hotspot 2.0 with simulated USIM and EAP-AKA"""
358 if not hlr_auc_gw_available():
359 return "skip"
360 hs20_simulated_sim(dev[0], apdev[0], "AKA")
361
362def test_ap_hs20_aka_prime(dev, apdev):
363 """Hotspot 2.0 with simulated USIM and EAP-AKA'"""
364 if not hlr_auc_gw_available():
365 return "skip"
366 hs20_simulated_sim(dev[0], apdev[0], "AKA'")
367
bbe86767
JM
368def test_ap_hs20_ext_sim(dev, apdev):
369 """Hotspot 2.0 with external SIM processing"""
370 if not hlr_auc_gw_available():
371 return "skip"
372 bssid = apdev[0]['bssid']
373 params = hs20_ap_params()
374 params['hessid'] = bssid
375 params['anqp_3gpp_cell_net'] = "232,01"
376 params['domain_name'] = "wlan.mnc001.mcc232.3gppnetwork.org"
377 hostapd.add_ap(apdev[0]['ifname'], params)
378
379 dev[0].hs20_enable()
380 dev[0].request("SET external_sim 1")
2232edf8 381 dev[0].add_cred_values({ 'imsi': "23201-0000000000", 'eap': "SIM" })
2f37a66d 382 interworking_select(dev[0], "home", freq="2412")
bbe86767
JM
383 interworking_ext_sim_connect(dev[0], bssid, "SIM")
384 check_sp_type(dev[0], "home")
59f8a3c6
JM
385
386def test_ap_hs20_ext_sim_roaming(dev, apdev):
387 """Hotspot 2.0 with external SIM processing in roaming network"""
388 if not hlr_auc_gw_available():
389 return "skip"
390 bssid = apdev[0]['bssid']
391 params = hs20_ap_params()
392 params['hessid'] = bssid
393 params['anqp_3gpp_cell_net'] = "244,91;310,026;232,01;234,56"
394 params['domain_name'] = "wlan.mnc091.mcc244.3gppnetwork.org"
395 hostapd.add_ap(apdev[0]['ifname'], params)
396
397 dev[0].hs20_enable()
398 dev[0].request("SET external_sim 1")
2232edf8 399 dev[0].add_cred_values({ 'imsi': "23201-0000000000", 'eap': "SIM" })
2f37a66d 400 interworking_select(dev[0], "roaming", freq="2412")
59f8a3c6
JM
401 interworking_ext_sim_connect(dev[0], bssid, "SIM")
402 check_sp_type(dev[0], "roaming")
8fba2e5d
JM
403
404def test_ap_hs20_username(dev, apdev):
405 """Hotspot 2.0 connection in username/password credential"""
8fba2e5d
JM
406 bssid = apdev[0]['bssid']
407 params = hs20_ap_params()
408 params['hessid'] = bssid
409 hostapd.add_ap(apdev[0]['ifname'], params)
410
411 dev[0].hs20_enable()
2232edf8
JM
412 id = dev[0].add_cred_values({ 'realm': "example.com",
413 'username': "hs20-test",
414 'password': "password",
a1281b9f 415 'ca_cert': "auth_serv/ca.pem",
5f1e31cf
JM
416 'domain': "example.com",
417 'update_identifier': "1234" })
2f37a66d 418 interworking_select(dev[0], bssid, "home", freq="2412")
8fba2e5d
JM
419 interworking_connect(dev[0], bssid, "TTLS")
420 check_sp_type(dev[0], "home")
10b3cc67
JM
421 status = dev[0].get_status()
422 if status['pairwise_cipher'] != "CCMP":
423 raise Exception("Unexpected pairwise cipher")
424 if status['hs20'] != "2":
425 raise Exception("Unexpected HS 2.0 support indication")
8fba2e5d 426
a1281b9f
JM
427 dev[1].connect("test-hs20", key_mgmt="WPA-EAP", eap="TTLS",
428 identity="hs20-test", password="password",
429 ca_cert="auth_serv/ca.pem", phase2="auth=MSCHAPV2",
430 scan_freq="2412")
431
dcd68168
JM
432def eap_test(dev, ap, eap_params, method, user):
433 bssid = ap['bssid']
434 params = hs20_ap_params()
435 params['nai_realm'] = [ "0,example.com," + eap_params ]
436 hostapd.add_ap(ap['ifname'], params)
437
dcd68168
JM
438 dev.hs20_enable()
439 dev.add_cred_values({ 'realm': "example.com",
440 'username': user,
441 'password': "password" })
2f37a66d 442 interworking_select(dev, bssid, freq="2412")
dcd68168
JM
443 interworking_connect(dev, bssid, method)
444
445def test_ap_hs20_eap_peap_mschapv2(dev, apdev):
446 """Hotspot 2.0 connection with PEAP/MSCHAPV2"""
447 eap_test(dev[0], apdev[0], "25[3:26]", "PEAP", "user")
448
449def test_ap_hs20_eap_peap_gtc(dev, apdev):
450 """Hotspot 2.0 connection with PEAP/GTC"""
451 eap_test(dev[0], apdev[0], "25[3:6]", "PEAP", "user")
452
453def test_ap_hs20_eap_ttls_chap(dev, apdev):
454 """Hotspot 2.0 connection with TTLS/CHAP"""
455 eap_test(dev[0], apdev[0], "21[2:2]", "TTLS", "chap user")
456
457def test_ap_hs20_eap_ttls_mschap(dev, apdev):
458 """Hotspot 2.0 connection with TTLS/MSCHAP"""
459 eap_test(dev[0], apdev[0], "21[2:3]", "TTLS", "mschap user")
460
461def test_ap_hs20_eap_ttls_eap_mschapv2(dev, apdev):
462 """Hotspot 2.0 connection with TTLS/EAP-MSCHAPv2"""
463 eap_test(dev[0], apdev[0], "21[3:26]", "TTLS", "user")
464
465def test_ap_hs20_eap_fast_mschapv2(dev, apdev):
466 """Hotspot 2.0 connection with FAST/EAP-MSCHAPV2"""
467 eap_test(dev[0], apdev[0], "43[3:26]", "FAST", "user")
468
469def test_ap_hs20_eap_fast_gtc(dev, apdev):
470 """Hotspot 2.0 connection with FAST/EAP-GTC"""
471 eap_test(dev[0], apdev[0], "43[3:6]", "FAST", "user")
472
473def test_ap_hs20_eap_tls(dev, apdev):
474 """Hotspot 2.0 connection with EAP-TLS"""
475 bssid = apdev[0]['bssid']
476 params = hs20_ap_params()
477 params['nai_realm'] = [ "0,example.com,13[5:6]" ]
478 hostapd.add_ap(apdev[0]['ifname'], params)
479
dcd68168
JM
480 dev[0].hs20_enable()
481 dev[0].add_cred_values({ 'realm': "example.com",
482 'username': "certificate-user",
483 'ca_cert': "auth_serv/ca.pem",
484 'client_cert': "auth_serv/user.pem",
485 'private_key': "auth_serv/user.key"})
2f37a66d 486 interworking_select(dev[0], bssid, freq="2412")
dcd68168
JM
487 interworking_connect(dev[0], bssid, "TLS")
488
0aca5d13
JM
489def test_ap_hs20_nai_realms(dev, apdev):
490 """Hotspot 2.0 connection and multiple NAI realms and TTLS/PAP"""
491 bssid = apdev[0]['bssid']
492 params = hs20_ap_params()
493 params['hessid'] = bssid
494 params['nai_realm'] = [ "0,no.match.here;example.com;no.match.here.either,21[2:1][5:7]" ]
495 hostapd.add_ap(apdev[0]['ifname'], params)
496
0aca5d13
JM
497 dev[0].hs20_enable()
498 id = dev[0].add_cred_values({ 'realm': "example.com",
499 'username': "pap user",
500 'password': "password",
501 'domain': "example.com" })
2f37a66d 502 interworking_select(dev[0], bssid, "home", freq="2412")
0aca5d13
JM
503 interworking_connect(dev[0], bssid, "TTLS")
504 check_sp_type(dev[0], "home")
505
e209eb98
JM
506def test_ap_hs20_roaming_consortium(dev, apdev):
507 """Hotspot 2.0 connection based on roaming consortium match"""
508 bssid = apdev[0]['bssid']
509 params = hs20_ap_params()
510 params['hessid'] = bssid
511 hostapd.add_ap(apdev[0]['ifname'], params)
512
e209eb98
JM
513 dev[0].hs20_enable()
514 id = dev[0].add_cred_values({ 'realm': "example.com",
515 'username': "user",
516 'password': "password",
517 'domain': "example.com",
518 'roaming_consortium': "fedcba",
519 'eap': "PEAP" })
2f37a66d 520 interworking_select(dev[0], bssid, "home", freq="2412")
e209eb98
JM
521 interworking_connect(dev[0], bssid, "PEAP")
522 check_sp_type(dev[0], "home")
523
8fba2e5d
JM
524def test_ap_hs20_username_roaming(dev, apdev):
525 """Hotspot 2.0 connection in username/password credential (roaming)"""
8fba2e5d
JM
526 bssid = apdev[0]['bssid']
527 params = hs20_ap_params()
528 params['nai_realm'] = [ "0,example.com,13[5:6],21[2:4][5:7]",
529 "0,roaming.example.com,21[2:4][5:7]",
530 "0,another.example.com" ]
531 params['domain_name'] = "another.example.com"
532 params['hessid'] = bssid
533 hostapd.add_ap(apdev[0]['ifname'], params)
534
535 dev[0].hs20_enable()
2232edf8
JM
536 id = dev[0].add_cred_values({ 'realm': "roaming.example.com",
537 'username': "hs20-test",
538 'password': "password",
539 'domain': "example.com" })
2f37a66d 540 interworking_select(dev[0], bssid, "roaming", freq="2412")
8fba2e5d
JM
541 interworking_connect(dev[0], bssid, "TTLS")
542 check_sp_type(dev[0], "roaming")
543
544def test_ap_hs20_username_unknown(dev, apdev):
545 """Hotspot 2.0 connection in username/password credential (no domain in cred)"""
8fba2e5d
JM
546 bssid = apdev[0]['bssid']
547 params = hs20_ap_params()
548 params['hessid'] = bssid
549 hostapd.add_ap(apdev[0]['ifname'], params)
550
551 dev[0].hs20_enable()
2232edf8
JM
552 id = dev[0].add_cred_values({ 'realm': "example.com",
553 'username': "hs20-test",
554 'password': "password" })
2f37a66d 555 interworking_select(dev[0], bssid, "unknown", freq="2412")
8fba2e5d
JM
556 interworking_connect(dev[0], bssid, "TTLS")
557 check_sp_type(dev[0], "unknown")
558
559def test_ap_hs20_username_unknown2(dev, apdev):
560 """Hotspot 2.0 connection in username/password credential (no domain advertized)"""
8fba2e5d
JM
561 bssid = apdev[0]['bssid']
562 params = hs20_ap_params()
563 params['hessid'] = bssid
564 del params['domain_name']
565 hostapd.add_ap(apdev[0]['ifname'], params)
566
567 dev[0].hs20_enable()
2232edf8
JM
568 id = dev[0].add_cred_values({ 'realm': "example.com",
569 'username': "hs20-test",
570 'password': "password",
571 'domain': "example.com" })
2f37a66d 572 interworking_select(dev[0], bssid, "unknown", freq="2412")
8fba2e5d
JM
573 interworking_connect(dev[0], bssid, "TTLS")
574 check_sp_type(dev[0], "unknown")
d1ba402f 575
483691bd
JM
576def test_ap_hs20_gas_while_associated(dev, apdev):
577 """Hotspot 2.0 connection with GAS query while associated"""
578 bssid = apdev[0]['bssid']
579 params = hs20_ap_params()
580 params['hessid'] = bssid
581 hostapd.add_ap(apdev[0]['ifname'], params)
582
483691bd
JM
583 dev[0].hs20_enable()
584 id = dev[0].add_cred_values({ 'realm': "example.com",
585 'username': "hs20-test",
586 'password': "password",
587 'domain': "example.com" })
2f37a66d 588 interworking_select(dev[0], bssid, "home", freq="2412")
483691bd
JM
589 interworking_connect(dev[0], bssid, "TTLS")
590
591 logger.info("Verifying GAS query while associated")
592 dev[0].request("FETCH_ANQP")
593 for i in range(0, 6):
594 ev = dev[0].wait_event(["RX-ANQP"], timeout=5)
595 if ev is None:
596 raise Exception("Operation timed out")
597
ee2caef3
JM
598def test_ap_hs20_gas_while_associated_with_pmf(dev, apdev):
599 """Hotspot 2.0 connection with GAS query while associated and using PMF"""
600 bssid = apdev[0]['bssid']
601 params = hs20_ap_params()
602 params['hessid'] = bssid
603 hostapd.add_ap(apdev[0]['ifname'], params)
604
605 bssid2 = apdev[1]['bssid']
606 params = hs20_ap_params()
607 params['hessid'] = bssid2
608 params['nai_realm'] = [ "0,no-match.example.org,13[5:6],21[2:4][5:7]" ]
609 hostapd.add_ap(apdev[1]['ifname'], params)
610
611 dev[0].hs20_enable()
612 dev[0].request("SET pmf 2")
613 id = dev[0].add_cred_values({ 'realm': "example.com",
614 'username': "hs20-test",
615 'password': "password",
616 'domain': "example.com" })
617 interworking_select(dev[0], bssid, "home", freq="2412")
618 interworking_connect(dev[0], bssid, "TTLS")
619
620 logger.info("Verifying GAS query while associated")
621 dev[0].request("FETCH_ANQP")
622 for i in range(0, 2 * 6):
623 ev = dev[0].wait_event(["RX-ANQP"], timeout=5)
624 if ev is None:
625 raise Exception("Operation timed out")
626
483691bd
JM
627def test_ap_hs20_gas_frag_while_associated(dev, apdev):
628 """Hotspot 2.0 connection with fragmented GAS query while associated"""
629 bssid = apdev[0]['bssid']
630 params = hs20_ap_params()
631 params['hessid'] = bssid
632 hostapd.add_ap(apdev[0]['ifname'], params)
633 hapd = hostapd.Hostapd(apdev[0]['ifname'])
634 hapd.set("gas_frag_limit", "50")
635
483691bd
JM
636 dev[0].hs20_enable()
637 id = dev[0].add_cred_values({ 'realm': "example.com",
638 'username': "hs20-test",
639 'password': "password",
640 'domain': "example.com" })
2f37a66d 641 interworking_select(dev[0], bssid, "home", freq="2412")
483691bd
JM
642 interworking_connect(dev[0], bssid, "TTLS")
643
644 logger.info("Verifying GAS query while associated")
645 dev[0].request("FETCH_ANQP")
646 for i in range(0, 6):
647 ev = dev[0].wait_event(["RX-ANQP"], timeout=5)
648 if ev is None:
649 raise Exception("Operation timed out")
650
6a0b4002
JM
651def test_ap_hs20_multiple_connects(dev, apdev):
652 """Hotspot 2.0 connection through multiple network selections"""
653 bssid = apdev[0]['bssid']
654 params = hs20_ap_params()
655 params['hessid'] = bssid
656 hostapd.add_ap(apdev[0]['ifname'], params)
657
658 dev[0].hs20_enable()
659 values = { 'realm': "example.com",
660 'username': "hs20-test",
661 'password': "password",
662 'domain': "example.com" }
663 id = dev[0].add_cred_values(values)
664
665 for i in range(0, 3):
666 logger.info("Starting Interworking network selection")
2f37a66d 667 dev[0].request("INTERWORKING_SELECT auto freq=2412")
6a0b4002
JM
668 while True:
669 ev = dev[0].wait_event(["INTERWORKING-NO-MATCH",
670 "INTERWORKING-ALREADY-CONNECTED",
671 "CTRL-EVENT-CONNECTED"], timeout=15)
672 if ev is None:
673 raise Exception("Connection timed out")
674 if "INTERWORKING-NO-MATCH" in ev:
675 raise Exception("Matching AP not found")
676 if "CTRL-EVENT-CONNECTED" in ev:
677 break
678 if i == 2 and "INTERWORKING-ALREADY-CONNECTED" in ev:
679 break
680 if i == 0:
681 dev[0].request("DISCONNECT")
682 dev[0].dump_monitor()
683
684 networks = dev[0].list_networks()
685 if len(networks) > 1:
686 raise Exception("Duplicated network block detected")
687
b4264f8f
JM
688def test_ap_hs20_disallow_aps(dev, apdev):
689 """Hotspot 2.0 connection and disallow_aps"""
690 bssid = apdev[0]['bssid']
691 params = hs20_ap_params()
692 params['hessid'] = bssid
693 hostapd.add_ap(apdev[0]['ifname'], params)
694
695 dev[0].hs20_enable()
696 values = { 'realm': "example.com",
697 'username': "hs20-test",
698 'password': "password",
699 'domain': "example.com" }
700 id = dev[0].add_cred_values(values)
701
702 logger.info("Verify disallow_aps bssid")
703 dev[0].request("SET disallow_aps bssid " + bssid.translate(None, ':'))
704 dev[0].request("INTERWORKING_SELECT auto")
705 ev = dev[0].wait_event(["INTERWORKING-NO-MATCH"], timeout=15)
706 if ev is None:
707 raise Exception("Network selection timed out")
708 dev[0].dump_monitor()
709
710 logger.info("Verify disallow_aps ssid")
711 dev[0].request("SET disallow_aps ssid 746573742d68733230")
2f37a66d 712 dev[0].request("INTERWORKING_SELECT auto freq=2412")
b4264f8f
JM
713 ev = dev[0].wait_event(["INTERWORKING-NO-MATCH"], timeout=15)
714 if ev is None:
715 raise Exception("Network selection timed out")
716 dev[0].dump_monitor()
717
718 logger.info("Verify disallow_aps clear")
719 dev[0].request("SET disallow_aps ")
2f37a66d 720 interworking_select(dev[0], bssid, "home", freq="2412")
b4264f8f
JM
721
722 dev[0].request("SET disallow_aps bssid " + bssid.translate(None, ':'))
723 ret = dev[0].request("INTERWORKING_CONNECT " + bssid)
724 if "FAIL" not in ret:
725 raise Exception("INTERWORKING_CONNECT to disallowed BSS not rejected")
726
d1ba402f
JM
727def policy_test(dev, ap, values, only_one=True):
728 dev.dump_monitor()
19839f8e
JM
729 if ap:
730 logger.info("Verify network selection to AP " + ap['ifname'])
731 bssid = ap['bssid']
732 else:
733 logger.info("Verify network selection")
734 bssid = None
d1ba402f
JM
735 dev.hs20_enable()
736 id = dev.add_cred_values(values)
2f37a66d 737 dev.request("INTERWORKING_SELECT auto freq=2412")
19839f8e 738 events = []
d1ba402f
JM
739 while True:
740 ev = dev.wait_event(["INTERWORKING-AP", "INTERWORKING-NO-MATCH",
1965cc3a 741 "INTERWORKING-BLACKLISTED",
953a574d 742 "INTERWORKING-SELECTED"], timeout=15)
d1ba402f 743 if ev is None:
953a574d 744 raise Exception("Network selection timed out")
19839f8e 745 events.append(ev)
d1ba402f
JM
746 if "INTERWORKING-NO-MATCH" in ev:
747 raise Exception("Matching AP not found")
19839f8e 748 if bssid and only_one and "INTERWORKING-AP" in ev and bssid not in ev:
d1ba402f 749 raise Exception("Unexpected AP claimed acceptable")
953a574d 750 if "INTERWORKING-SELECTED" in ev:
19839f8e 751 if bssid and bssid not in ev:
953a574d 752 raise Exception("Selected incorrect BSS")
d1ba402f
JM
753 break
754
953a574d
JM
755 ev = dev.wait_event(["CTRL-EVENT-CONNECTED"], timeout=15)
756 if ev is None:
757 raise Exception("Connection timed out")
19839f8e 758 if bssid and bssid not in ev:
953a574d
JM
759 raise Exception("Connected to incorrect BSS")
760
d1ba402f 761 conn_bssid = dev.get_status_field("bssid")
19839f8e 762 if bssid and conn_bssid != bssid:
d1ba402f
JM
763 raise Exception("bssid information points to incorrect BSS")
764
765 dev.remove_cred(id)
766 dev.dump_monitor()
19839f8e 767 return events
d1ba402f 768
9714fbcd
JM
769def default_cred(domain=None):
770 cred = { 'realm': "example.com",
d355372c
JM
771 'username': "hs20-test",
772 'password': "password" }
9714fbcd
JM
773 if domain:
774 cred['domain'] = domain
775 return cred
d355372c 776
cfa57df6
JM
777def test_ap_hs20_prefer_home(dev, apdev):
778 """Hotspot 2.0 required roaming consortium"""
779 params = hs20_ap_params()
780 params['domain_name'] = "example.org"
781 hostapd.add_ap(apdev[0]['ifname'], params)
782
783 params = hs20_ap_params()
784 params['ssid'] = "test-hs20-other"
785 params['domain_name'] = "example.com"
786 hostapd.add_ap(apdev[1]['ifname'], params)
787
788 values = default_cred()
789 values['domain'] = "example.com"
790 policy_test(dev[0], apdev[1], values, only_one=False)
791 values['domain'] = "example.org"
792 policy_test(dev[0], apdev[0], values, only_one=False)
793
d1ba402f
JM
794def test_ap_hs20_req_roaming_consortium(dev, apdev):
795 """Hotspot 2.0 required roaming consortium"""
796 params = hs20_ap_params()
797 hostapd.add_ap(apdev[0]['ifname'], params)
798
799 params = hs20_ap_params()
800 params['ssid'] = "test-hs20-other"
801 params['roaming_consortium'] = [ "223344" ]
802 hostapd.add_ap(apdev[1]['ifname'], params)
803
d355372c
JM
804 values = default_cred()
805 values['required_roaming_consortium'] = "223344"
d1ba402f
JM
806 policy_test(dev[0], apdev[1], values)
807 values['required_roaming_consortium'] = "112233"
808 policy_test(dev[0], apdev[0], values)
d355372c 809
af70a093
JM
810 id = dev[0].add_cred()
811 dev[0].set_cred(id, "required_roaming_consortium", "112233")
812 dev[0].set_cred(id, "required_roaming_consortium", "112233445566778899aabbccddeeff")
813
814 for val in [ "", "1", "11", "1122", "1122334", "112233445566778899aabbccddeeff00" ]:
815 if "FAIL" not in dev[0].request('SET_CRED {} required_roaming_consortium {}'.format(id, val)):
816 raise Exception("Invalid roaming consortium value accepted: " + val)
817
d355372c
JM
818def test_ap_hs20_excluded_ssid(dev, apdev):
819 """Hotspot 2.0 exclusion based on SSID"""
820 params = hs20_ap_params()
e2afdef2
JM
821 params['roaming_consortium'] = [ "223344" ]
822 params['anqp_3gpp_cell_net'] = "555,444"
d355372c
JM
823 hostapd.add_ap(apdev[0]['ifname'], params)
824
825 params = hs20_ap_params()
826 params['ssid'] = "test-hs20-other"
827 params['roaming_consortium'] = [ "223344" ]
e2afdef2 828 params['anqp_3gpp_cell_net'] = "555,444"
d355372c
JM
829 hostapd.add_ap(apdev[1]['ifname'], params)
830
831 values = default_cred()
832 values['excluded_ssid'] = "test-hs20"
1965cc3a
JM
833 events = policy_test(dev[0], apdev[1], values)
834 ev = [e for e in events if "INTERWORKING-BLACKLISTED " + apdev[0]['bssid'] in e]
835 if len(ev) != 1:
836 raise Exception("Excluded network not reported")
d355372c 837 values['excluded_ssid'] = "test-hs20-other"
1965cc3a
JM
838 events = policy_test(dev[0], apdev[0], values)
839 ev = [e for e in events if "INTERWORKING-BLACKLISTED " + apdev[1]['bssid'] in e]
840 if len(ev) != 1:
841 raise Exception("Excluded network not reported")
d4058934 842
e2afdef2
JM
843 values = default_cred()
844 values['roaming_consortium'] = "223344"
845 values['eap'] = "TTLS"
846 values['phase2'] = "auth=MSCHAPV2"
847 values['excluded_ssid'] = "test-hs20"
848 events = policy_test(dev[0], apdev[1], values)
849 ev = [e for e in events if "INTERWORKING-BLACKLISTED " + apdev[0]['bssid'] in e]
850 if len(ev) != 1:
851 raise Exception("Excluded network not reported")
852
853 values = { 'imsi': "555444-333222111", 'eap': "SIM",
854 'milenage': "5122250214c33e723a5dd523fc145fc0:981d464c7c52eb6e5036234984ad0bcf:000000000123",
855 'excluded_ssid': "test-hs20" }
856 events = policy_test(dev[0], apdev[1], values)
857 ev = [e for e in events if "INTERWORKING-BLACKLISTED " + apdev[0]['bssid'] in e]
858 if len(ev) != 1:
859 raise Exception("Excluded network not reported")
860
d4058934
JM
861def test_ap_hs20_roam_to_higher_prio(dev, apdev):
862 """Hotspot 2.0 and roaming from current to higher priority network"""
863 bssid = apdev[0]['bssid']
864 params = hs20_ap_params(ssid="test-hs20-visited")
865 params['domain_name'] = "visited.example.org"
866 hostapd.add_ap(apdev[0]['ifname'], params)
867
868 dev[0].hs20_enable()
869 id = dev[0].add_cred_values({ 'realm': "example.com",
870 'username': "hs20-test",
871 'password': "password",
872 'domain': "example.com" })
873 logger.info("Connect to the only network option")
874 interworking_select(dev[0], bssid, "roaming", freq="2412")
875 dev[0].dump_monitor()
876 interworking_connect(dev[0], bssid, "TTLS")
877
878 logger.info("Start another AP (home operator) and reconnect")
879 bssid2 = apdev[1]['bssid']
880 params = hs20_ap_params(ssid="test-hs20-home")
881 params['domain_name'] = "example.com"
882 hostapd.add_ap(apdev[1]['ifname'], params)
883
884 dev[0].request("INTERWORKING_SELECT auto freq=2412")
885 ev = dev[0].wait_event(["INTERWORKING-NO-MATCH",
886 "INTERWORKING-ALREADY-CONNECTED",
887 "CTRL-EVENT-CONNECTED"], timeout=15)
888 if ev is None:
889 raise Exception("Connection timed out")
890 if "INTERWORKING-NO-MATCH" in ev:
891 raise Exception("Matching AP not found")
892 if "INTERWORKING-ALREADY-CONNECTED" in ev:
893 raise Exception("Unexpected AP selected")
894 if bssid2 not in ev:
895 raise Exception("Unexpected BSSID after reconnection")
12c587a5
JM
896
897def test_ap_hs20_domain_suffix_match(dev, apdev):
898 """Hotspot 2.0 and domain_suffix_match"""
899 bssid = apdev[0]['bssid']
900 params = hs20_ap_params()
901 hostapd.add_ap(apdev[0]['ifname'], params)
902
903 dev[0].hs20_enable()
904 id = dev[0].add_cred_values({ 'realm': "example.com",
905 'username': "hs20-test",
906 'password': "password",
907 'domain': "example.com",
908 'domain_suffix_match': "w1.fi" })
909 interworking_select(dev[0], bssid, "home", freq="2412")
910 dev[0].dump_monitor()
911 interworking_connect(dev[0], bssid, "TTLS")
912 dev[0].request("REMOVE_NETWORK all")
913 dev[0].dump_monitor()
914
915 dev[0].set_cred_quoted(id, "domain_suffix_match", "no-match.example.com")
916 interworking_select(dev[0], bssid, "home", freq="2412")
917 dev[0].dump_monitor()
918 dev[0].request("INTERWORKING_CONNECT " + bssid)
919 ev = dev[0].wait_event(["CTRL-EVENT-EAP-TLS-CERT-ERROR"])
920 if ev is None:
921 raise Exception("TLS certificate error not reported")
922 if "Domain suffix mismatch" not in ev:
923 raise Exception("Domain suffix mismatch not reported")
078683ac 924
2253ea44
JM
925def test_ap_hs20_roaming_partner_preference(dev, apdev):
926 """Hotspot 2.0 and roaming partner preference"""
927 params = hs20_ap_params()
928 params['domain_name'] = "roaming.example.org"
929 hostapd.add_ap(apdev[0]['ifname'], params)
930
931 params = hs20_ap_params()
932 params['ssid'] = "test-hs20-other"
933 params['domain_name'] = "roaming.example.net"
934 hostapd.add_ap(apdev[1]['ifname'], params)
935
936 logger.info("Verify default vs. specified preference")
937 values = default_cred()
938 values['roaming_partner'] = "roaming.example.net,1,127,*"
939 policy_test(dev[0], apdev[1], values, only_one=False)
940 values['roaming_partner'] = "roaming.example.net,1,129,*"
941 policy_test(dev[0], apdev[0], values, only_one=False)
942
943 logger.info("Verify partial FQDN match")
944 values['roaming_partner'] = "example.net,0,0,*"
945 policy_test(dev[0], apdev[1], values, only_one=False)
946 values['roaming_partner'] = "example.net,0,255,*"
947 policy_test(dev[0], apdev[0], values, only_one=False)
948
19839f8e
JM
949def test_ap_hs20_max_bss_load(dev, apdev):
950 """Hotspot 2.0 and maximum BSS load"""
951 params = hs20_ap_params()
952 params['bss_load_test'] = "12:200:20000"
953 hostapd.add_ap(apdev[0]['ifname'], params)
954
955 params = hs20_ap_params()
956 params['ssid'] = "test-hs20-other"
957 params['bss_load_test'] = "5:20:10000"
958 hostapd.add_ap(apdev[1]['ifname'], params)
959
960 logger.info("Verify maximum BSS load constraint")
961 values = default_cred()
962 values['domain'] = "example.com"
963 values['max_bss_load'] = "100"
964 events = policy_test(dev[0], apdev[1], values, only_one=False)
965
966 ev = [e for e in events if "INTERWORKING-AP " + apdev[0]['bssid'] in e]
967 if len(ev) != 1 or "over_max_bss_load=1" not in ev[0]:
968 raise Exception("Maximum BSS Load case not noticed")
969 ev = [e for e in events if "INTERWORKING-AP " + apdev[1]['bssid'] in e]
970 if len(ev) != 1 or "over_max_bss_load=1" in ev[0]:
971 raise Exception("Maximum BSS Load case reported incorrectly")
972
973 logger.info("Verify maximum BSS load does not prevent connection")
974 values['max_bss_load'] = "1"
975 events = policy_test(dev[0], None, values)
976
977 ev = [e for e in events if "INTERWORKING-AP " + apdev[0]['bssid'] in e]
978 if len(ev) != 1 or "over_max_bss_load=1" not in ev[0]:
979 raise Exception("Maximum BSS Load case not noticed")
980 ev = [e for e in events if "INTERWORKING-AP " + apdev[1]['bssid'] in e]
981 if len(ev) != 1 or "over_max_bss_load=1" not in ev[0]:
982 raise Exception("Maximum BSS Load case not noticed")
983
984def test_ap_hs20_max_bss_load2(dev, apdev):
985 """Hotspot 2.0 and maximum BSS load with one AP not advertising"""
986 params = hs20_ap_params()
987 params['bss_load_test'] = "12:200:20000"
988 hostapd.add_ap(apdev[0]['ifname'], params)
989
990 params = hs20_ap_params()
991 params['ssid'] = "test-hs20-other"
992 hostapd.add_ap(apdev[1]['ifname'], params)
993
994 logger.info("Verify maximum BSS load constraint with AP advertisement")
995 values = default_cred()
996 values['domain'] = "example.com"
997 values['max_bss_load'] = "100"
998 events = policy_test(dev[0], apdev[1], values, only_one=False)
999
1000 ev = [e for e in events if "INTERWORKING-AP " + apdev[0]['bssid'] in e]
1001 if len(ev) != 1 or "over_max_bss_load=1" not in ev[0]:
1002 raise Exception("Maximum BSS Load case not noticed")
1003 ev = [e for e in events if "INTERWORKING-AP " + apdev[1]['bssid'] in e]
1004 if len(ev) != 1 or "over_max_bss_load=1" in ev[0]:
1005 raise Exception("Maximum BSS Load case reported incorrectly")
1006
078683ac
JM
1007def test_ap_hs20_multi_cred_sp_prio(dev, apdev):
1008 """Hotspot 2.0 multi-cred sp_priority"""
1009 if not hlr_auc_gw_available():
1010 return "skip"
1011 bssid = apdev[0]['bssid']
1012 params = hs20_ap_params()
1013 params['hessid'] = bssid
1014 del params['domain_name']
1015 params['anqp_3gpp_cell_net'] = "232,01"
1016 hostapd.add_ap(apdev[0]['ifname'], params)
1017
1018 dev[0].hs20_enable()
1019 dev[0].request("SET external_sim 1")
1020 id1 = dev[0].add_cred_values({ 'imsi': "23201-0000000000", 'eap': "SIM",
1021 'provisioning_sp': "example.com",
1022 'sp_priority' :"1" })
1023 id2 = dev[0].add_cred_values({ 'realm': "example.com",
1024 'username': "hs20-test",
1025 'password': "password",
1026 'domain': "example.com",
1027 'provisioning_sp': "example.com",
1028 'sp_priority': "2" })
1029 dev[0].dump_monitor()
0b651713 1030 dev[0].request("INTERWORKING_SELECT auto freq=2412")
078683ac
JM
1031 interworking_ext_sim_auth(dev[0], "SIM")
1032 check_sp_type(dev[0], "unknown")
1033 dev[0].request("REMOVE_NETWORK all")
1034
1035 dev[0].set_cred(id1, "sp_priority", "2")
1036 dev[0].set_cred(id2, "sp_priority", "1")
1037 dev[0].dump_monitor()
0b651713 1038 dev[0].request("INTERWORKING_SELECT auto freq=2412")
078683ac
JM
1039 interworking_auth(dev[0], "TTLS")
1040 check_sp_type(dev[0], "unknown")
1041
1042def test_ap_hs20_multi_cred_sp_prio2(dev, apdev):
1043 """Hotspot 2.0 multi-cred sp_priority with two BSSes"""
1044 if not hlr_auc_gw_available():
1045 return "skip"
1046 bssid = apdev[0]['bssid']
1047 params = hs20_ap_params()
1048 params['hessid'] = bssid
1049 del params['nai_realm']
1050 del params['domain_name']
1051 params['anqp_3gpp_cell_net'] = "232,01"
1052 hostapd.add_ap(apdev[0]['ifname'], params)
1053
1054 bssid2 = apdev[1]['bssid']
1055 params = hs20_ap_params()
1056 params['ssid'] = "test-hs20-other"
1057 params['hessid'] = bssid2
1058 del params['domain_name']
1059 del params['anqp_3gpp_cell_net']
1060 hostapd.add_ap(apdev[1]['ifname'], params)
1061
1062 dev[0].hs20_enable()
1063 dev[0].request("SET external_sim 1")
1064 id1 = dev[0].add_cred_values({ 'imsi': "23201-0000000000", 'eap': "SIM",
1065 'provisioning_sp': "example.com",
1066 'sp_priority': "1" })
1067 id2 = dev[0].add_cred_values({ 'realm': "example.com",
1068 'username': "hs20-test",
1069 'password': "password",
1070 'domain': "example.com",
1071 'provisioning_sp': "example.com",
1072 'sp_priority': "2" })
1073 dev[0].dump_monitor()
0b651713 1074 dev[0].request("INTERWORKING_SELECT auto freq=2412")
078683ac
JM
1075 interworking_ext_sim_auth(dev[0], "SIM")
1076 check_sp_type(dev[0], "unknown")
1077 conn_bssid = dev[0].get_status_field("bssid")
1078 if conn_bssid != bssid:
1079 raise Exception("Connected to incorrect BSS")
1080 dev[0].request("REMOVE_NETWORK all")
1081
1082 dev[0].set_cred(id1, "sp_priority", "2")
1083 dev[0].set_cred(id2, "sp_priority", "1")
1084 dev[0].dump_monitor()
0b651713 1085 dev[0].request("INTERWORKING_SELECT auto freq=2412")
078683ac
JM
1086 interworking_auth(dev[0], "TTLS")
1087 check_sp_type(dev[0], "unknown")
1088 conn_bssid = dev[0].get_status_field("bssid")
1089 if conn_bssid != bssid2:
1090 raise Exception("Connected to incorrect BSS")
5e32f825 1091
a3dd0478
JM
1092def check_conn_capab_selection(dev, type, missing):
1093 dev.request("INTERWORKING_SELECT freq=2412")
1094 ev = dev.wait_event(["INTERWORKING-AP"])
1095 if ev is None:
1096 raise Exception("Network selection timed out");
1097 if "type=" + type not in ev:
1098 raise Exception("Unexpected network type")
1099 if missing and "conn_capab_missing=1" not in ev:
1100 raise Exception("conn_capab_missing not reported")
1101 if not missing and "conn_capab_missing=1" in ev:
1102 raise Exception("conn_capab_missing reported unexpectedly")
1103
1104def conn_capab_cred(domain=None, req_conn_capab=None):
1105 cred = default_cred(domain=domain)
1106 if req_conn_capab:
1107 cred['req_conn_capab'] = req_conn_capab
1108 return cred
1109
18153179
JM
1110def test_ap_hs20_req_conn_capab(dev, apdev):
1111 """Hotspot 2.0 network selection with req_conn_capab"""
1112 bssid = apdev[0]['bssid']
1113 params = hs20_ap_params()
1114 hostapd.add_ap(apdev[0]['ifname'], params)
1115
1116 dev[0].hs20_enable()
1117 logger.info("Not used in home network")
a3dd0478
JM
1118 values = conn_capab_cred(domain="example.com", req_conn_capab="6:1234")
1119 id = dev[0].add_cred_values(values)
1120 check_conn_capab_selection(dev[0], "home", False)
18153179
JM
1121
1122 logger.info("Used in roaming network")
1123 dev[0].remove_cred(id)
a3dd0478
JM
1124 values = conn_capab_cred(domain="example.org", req_conn_capab="6:1234")
1125 id = dev[0].add_cred_values(values)
1126 check_conn_capab_selection(dev[0], "roaming", True)
18153179
JM
1127
1128 logger.info("Verify that req_conn_capab does not prevent connection if no other network is available")
a3dd0478
JM
1129 check_auto_select(dev[0], bssid)
1130
1131 logger.info("Additional req_conn_capab checks")
1132
1133 dev[0].remove_cred(id)
1134 values = conn_capab_cred(domain="example.org", req_conn_capab="1:0")
1135 id = dev[0].add_cred_values(values)
1136 check_conn_capab_selection(dev[0], "roaming", True)
1137
1138 dev[0].remove_cred(id)
1139 values = conn_capab_cred(domain="example.org", req_conn_capab="17:5060")
1140 id = dev[0].add_cred_values(values)
1141 check_conn_capab_selection(dev[0], "roaming", True)
1142
1143 bssid2 = apdev[1]['bssid']
1144 params = hs20_ap_params(ssid="test-hs20b")
1145 params['hs20_conn_capab'] = [ "1:0:2", "6:22:1", "17:5060:0", "50:0:1" ]
1146 hostapd.add_ap(apdev[1]['ifname'], params)
1147
1148 dev[0].remove_cred(id)
1149 values = conn_capab_cred(domain="example.org", req_conn_capab="50")
1150 id = dev[0].add_cred_values(values)
1151 dev[0].set_cred(id, "req_conn_capab", "6:22")
1152 dev[0].request("INTERWORKING_SELECT freq=2412")
1153 for i in range(0, 2):
1154 ev = dev[0].wait_event(["INTERWORKING-AP"])
1155 if ev is None:
1156 raise Exception("Network selection timed out");
1157 if bssid in ev and "conn_capab_missing=1" not in ev:
1158 raise Exception("Missing protocol connection capability not reported")
1159 if bssid2 in ev and "conn_capab_missing=1" in ev:
1160 raise Exception("Protocol connection capability not reported correctly")
1161
1162def test_ap_hs20_req_conn_capab_and_roaming_partner_preference(dev, apdev):
1163 """Hotspot 2.0 and req_conn_capab with roaming partner preference"""
1164 bssid = apdev[0]['bssid']
1165 params = hs20_ap_params()
1166 params['domain_name'] = "roaming.example.org"
1167 params['hs20_conn_capab'] = [ "1:0:2", "6:22:1", "17:5060:0", "50:0:1" ]
1168 hostapd.add_ap(apdev[0]['ifname'], params)
1169
1170 bssid2 = apdev[1]['bssid']
1171 params = hs20_ap_params(ssid="test-hs20-b")
1172 params['domain_name'] = "roaming.example.net"
1173 hostapd.add_ap(apdev[1]['ifname'], params)
1174
1175 values = default_cred()
1176 values['roaming_partner'] = "roaming.example.net,1,127,*"
1177 id = dev[0].add_cred_values(values)
1178 check_auto_select(dev[0], bssid2)
1179
1180 dev[0].set_cred(id, "req_conn_capab", "50")
1181 check_auto_select(dev[0], bssid)
1182
1183 dev[0].remove_cred(id)
1184 id = dev[0].add_cred_values(values)
1185 dev[0].set_cred(id, "req_conn_capab", "51")
1186 check_auto_select(dev[0], bssid2)
18153179 1187
9714fbcd
JM
1188def check_bandwidth_selection(dev, type, below):
1189 dev.request("INTERWORKING_SELECT freq=2412")
1190 ev = dev.wait_event(["INTERWORKING-AP"])
1191 if ev is None:
1192 raise Exception("Network selection timed out");
1193 if "type=" + type not in ev:
1194 raise Exception("Unexpected network type")
1195 if below and "below_min_backhaul=1" not in ev:
1196 raise Exception("below_min_backhaul not reported")
1197 if not below and "below_min_backhaul=1" in ev:
1198 raise Exception("below_min_backhaul reported unexpectedly")
1199
1200def bw_cred(domain=None, dl_home=None, ul_home=None, dl_roaming=None, ul_roaming=None):
1201 cred = default_cred(domain=domain)
1202 if dl_home:
1203 cred['min_dl_bandwidth_home'] = str(dl_home)
1204 if ul_home:
1205 cred['min_ul_bandwidth_home'] = str(ul_home)
1206 if dl_roaming:
1207 cred['min_dl_bandwidth_roaming'] = str(dl_roaming)
1208 if ul_roaming:
1209 cred['min_ul_bandwidth_roaming'] = str(ul_roaming)
1210 return cred
1211
1212def test_ap_hs20_min_bandwidth_home(dev, apdev):
1213 """Hotspot 2.0 network selection with min bandwidth (home)"""
1214 bssid = apdev[0]['bssid']
1215 params = hs20_ap_params()
1216 hostapd.add_ap(apdev[0]['ifname'], params)
1217
1218 dev[0].hs20_enable()
1219 values = bw_cred(domain="example.com", dl_home=5490, ul_home=58)
1220 id = dev[0].add_cred_values(values)
1221 check_bandwidth_selection(dev[0], "home", False)
1222 dev[0].remove_cred(id)
1223
1224 values = bw_cred(domain="example.com", dl_home=5491, ul_home=58)
1225 id = dev[0].add_cred_values(values)
1226 check_bandwidth_selection(dev[0], "home", True)
1227 dev[0].remove_cred(id)
1228
1229 values = bw_cred(domain="example.com", dl_home=5490, ul_home=59)
1230 id = dev[0].add_cred_values(values)
1231 check_bandwidth_selection(dev[0], "home", True)
1232 dev[0].remove_cred(id)
1233
1234 values = bw_cred(domain="example.com", dl_home=5491, ul_home=59)
1235 id = dev[0].add_cred_values(values)
1236 check_bandwidth_selection(dev[0], "home", True)
1237 check_auto_select(dev[0], bssid)
1238
1239 bssid2 = apdev[1]['bssid']
1240 params = hs20_ap_params(ssid="test-hs20-b")
1241 params['hs20_wan_metrics'] = "01:8000:1000:1:1:3000"
1242 hostapd.add_ap(apdev[1]['ifname'], params)
1243
1244 check_auto_select(dev[0], bssid2)
1245
1246def test_ap_hs20_min_bandwidth_roaming(dev, apdev):
1247 """Hotspot 2.0 network selection with min bandwidth (roaming)"""
1248 bssid = apdev[0]['bssid']
1249 params = hs20_ap_params()
1250 hostapd.add_ap(apdev[0]['ifname'], params)
1251
1252 dev[0].hs20_enable()
1253 values = bw_cred(domain="example.org", dl_roaming=5490, ul_roaming=58)
1254 id = dev[0].add_cred_values(values)
1255 check_bandwidth_selection(dev[0], "roaming", False)
1256 dev[0].remove_cred(id)
1257
1258 values = bw_cred(domain="example.org", dl_roaming=5491, ul_roaming=58)
1259 id = dev[0].add_cred_values(values)
1260 check_bandwidth_selection(dev[0], "roaming", True)
1261 dev[0].remove_cred(id)
1262
1263 values = bw_cred(domain="example.org", dl_roaming=5490, ul_roaming=59)
1264 id = dev[0].add_cred_values(values)
1265 check_bandwidth_selection(dev[0], "roaming", True)
1266 dev[0].remove_cred(id)
1267
1268 values = bw_cred(domain="example.org", dl_roaming=5491, ul_roaming=59)
1269 id = dev[0].add_cred_values(values)
1270 check_bandwidth_selection(dev[0], "roaming", True)
1271 check_auto_select(dev[0], bssid)
1272
1273 bssid2 = apdev[1]['bssid']
1274 params = hs20_ap_params(ssid="test-hs20-b")
1275 params['hs20_wan_metrics'] = "01:8000:1000:1:1:3000"
1276 hostapd.add_ap(apdev[1]['ifname'], params)
1277
1278 check_auto_select(dev[0], bssid2)
1279
1280def test_ap_hs20_min_bandwidth_and_roaming_partner_preference(dev, apdev):
1281 """Hotspot 2.0 and minimum bandwidth with roaming partner preference"""
1282 bssid = apdev[0]['bssid']
1283 params = hs20_ap_params()
1284 params['domain_name'] = "roaming.example.org"
1285 params['hs20_wan_metrics'] = "01:8000:1000:1:1:3000"
1286 hostapd.add_ap(apdev[0]['ifname'], params)
1287
1288 bssid2 = apdev[1]['bssid']
1289 params = hs20_ap_params(ssid="test-hs20-b")
1290 params['domain_name'] = "roaming.example.net"
1291 hostapd.add_ap(apdev[1]['ifname'], params)
1292
1293 values = default_cred()
1294 values['roaming_partner'] = "roaming.example.net,1,127,*"
1295 id = dev[0].add_cred_values(values)
1296 check_auto_select(dev[0], bssid2)
1297
1298 dev[0].set_cred(id, "min_dl_bandwidth_roaming", "6000")
1299 check_auto_select(dev[0], bssid)
1300
1301 dev[0].set_cred(id, "min_dl_bandwidth_roaming", "10000")
1302 check_auto_select(dev[0], bssid2)
1303
1304def test_ap_hs20_min_bandwidth_no_wan_metrics(dev, apdev):
1305 """Hotspot 2.0 network selection with min bandwidth but no WAN Metrics"""
1306 bssid = apdev[0]['bssid']
1307 params = hs20_ap_params()
1308 del params['hs20_wan_metrics']
1309 hostapd.add_ap(apdev[0]['ifname'], params)
1310
1311 dev[0].hs20_enable()
1312 values = bw_cred(domain="example.com", dl_home=10000, ul_home=10000,
1313 dl_roaming=10000, ul_roaming=10000)
1314 dev[0].add_cred_values(values)
1315 check_bandwidth_selection(dev[0], "home", False)
1316
5e32f825
JM
1317def test_ap_hs20_deauth_req_ess(dev, apdev):
1318 """Hotspot 2.0 connection and deauthentication request for ESS"""
1319 dev[0].request("SET pmf 2")
1320 eap_test(dev[0], apdev[0], "21[3:26]", "TTLS", "user")
1321 dev[0].dump_monitor()
1322 addr = dev[0].p2p_interface_addr()
1323 hapd = hostapd.Hostapd(apdev[0]['ifname'])
1324 hapd.request("HS20_DEAUTH_REQ " + addr + " 1 120 http://example.com/")
1325 ev = dev[0].wait_event(["HS20-DEAUTH-IMMINENT-NOTICE"])
1326 if ev is None:
1327 raise Exception("Timeout on deauth imminent notice")
1328 if "1 120 http://example.com/" not in ev:
1329 raise Exception("Unexpected deauth imminent notice: " + ev)
1330 hapd.request("DEAUTHENTICATE " + addr)
1331 ev = dev[0].wait_event(["CTRL-EVENT-DISCONNECTED"])
1332 if ev is None:
1333 raise Exception("Timeout on disconnection")
1334 ev = dev[0].wait_event(["SME: Trying to authenticate",
1335 "Trying to associate",
1336 "CTRL-EVENT-CONNECTED"], timeout=5)
1337 if ev is not None:
1338 raise Exception("Unexpected connection attempt")
1339
1340def test_ap_hs20_deauth_req_bss(dev, apdev):
1341 """Hotspot 2.0 connection and deauthentication request for BSS"""
1342 dev[0].request("SET pmf 2")
1343 eap_test(dev[0], apdev[0], "21[3:26]", "TTLS", "user")
1344 dev[0].dump_monitor()
1345 addr = dev[0].p2p_interface_addr()
1346 hapd = hostapd.Hostapd(apdev[0]['ifname'])
1347 hapd.request("HS20_DEAUTH_REQ " + addr + " 0 120 http://example.com/")
1348 ev = dev[0].wait_event(["HS20-DEAUTH-IMMINENT-NOTICE"])
1349 if ev is None:
1350 raise Exception("Timeout on deauth imminent notice")
1351 if "0 120 http://example.com/" not in ev:
1352 raise Exception("Unexpected deauth imminent notice: " + ev)
1353 hapd.request("DEAUTHENTICATE " + addr + " reason=4")
1354 ev = dev[0].wait_event(["CTRL-EVENT-DISCONNECTED"])
1355 if ev is None:
1356 raise Exception("Timeout on disconnection")
1357 if "reason=4" not in ev:
1358 raise Exception("Unexpected disconnection reason")
1359 ev = dev[0].wait_event(["SME: Trying to authenticate",
1360 "Trying to associate",
1361 "CTRL-EVENT-CONNECTED"], timeout=5)
1362 if ev is not None:
1363 raise Exception("Unexpected connection attempt")
9e709315
JM
1364
1365def test_ap_hs20_osen(dev, apdev):
1366 """Hotspot 2.0 OSEN connection"""
1367 params = { 'ssid': "osen",
1368 'osen': "1",
1369 'auth_server_addr': "127.0.0.1",
1370 'auth_server_port': "1812",
1371 'auth_server_shared_secret': "radius" }
1372 hostapd.add_ap(apdev[0]['ifname'], params)
1373
1374 dev[0].connect("osen", proto="OSEN", key_mgmt="OSEN", pairwise="CCMP",
1375 group="GTK_NOT_USED",
1376 eap="WFA-UNAUTH-TLS", identity="osen@example.com",
1377 ca_cert="auth_serv/ca.pem",
1378 scan_freq="2412")
a96066a5
JM
1379
1380def test_ap_hs20_network_preference(dev, apdev):
1381 """Hotspot 2.0 network selection with preferred home network"""
1382 bssid = apdev[0]['bssid']
1383 params = hs20_ap_params()
1384 hostapd.add_ap(apdev[0]['ifname'], params)
1385
1386 dev[0].hs20_enable()
1387 values = { 'realm': "example.com",
1388 'username': "hs20-test",
1389 'password': "password",
1390 'domain': "example.com" }
1391 dev[0].add_cred_values(values)
1392
1393 id = dev[0].add_network()
1394 dev[0].set_network_quoted(id, "ssid", "home")
1395 dev[0].set_network_quoted(id, "psk", "12345678")
1396 dev[0].set_network(id, "priority", "1")
1397 dev[0].request("ENABLE_NETWORK %s no-connect" % id)
1398
1399 dev[0].request("INTERWORKING_SELECT auto freq=2412")
1400 ev = dev[0].wait_event(["CTRL-EVENT-CONNECTED"], timeout=15)
1401 if ev is None:
1402 raise Exception("Connection timed out")
1403 if bssid not in ev:
1404 raise Exception("Unexpected network selected")
1405
1406 bssid2 = apdev[1]['bssid']
1407 params = hostapd.wpa2_params(ssid="home", passphrase="12345678")
1408 hostapd.add_ap(apdev[1]['ifname'], params)
1409
1410 dev[0].request("INTERWORKING_SELECT auto freq=2412")
1411 ev = dev[0].wait_event(["CTRL-EVENT-CONNECTED",
1412 "INTERWORKING-ALREADY-CONNECTED" ], timeout=15)
1413 if ev is None:
1414 raise Exception("Connection timed out")
1415 if "INTERWORKING-ALREADY-CONNECTED" in ev:
1416 raise Exception("No roam to higher priority network")
1417 if bssid2 not in ev:
1418 raise Exception("Unexpected network selected")
1419
1420def test_ap_hs20_network_preference2(dev, apdev):
1421 """Hotspot 2.0 network selection with preferred credential"""
1422 bssid2 = apdev[1]['bssid']
1423 params = hostapd.wpa2_params(ssid="home", passphrase="12345678")
1424 hostapd.add_ap(apdev[1]['ifname'], params)
1425
1426 dev[0].hs20_enable()
1427 values = { 'realm': "example.com",
1428 'username': "hs20-test",
1429 'password': "password",
1430 'domain': "example.com",
1431 'priority': "1" }
1432 dev[0].add_cred_values(values)
1433
1434 id = dev[0].add_network()
1435 dev[0].set_network_quoted(id, "ssid", "home")
1436 dev[0].set_network_quoted(id, "psk", "12345678")
1437 dev[0].request("ENABLE_NETWORK %s no-connect" % id)
1438
1439 dev[0].request("INTERWORKING_SELECT auto freq=2412")
1440 ev = dev[0].wait_event(["CTRL-EVENT-CONNECTED"], timeout=15)
1441 if ev is None:
1442 raise Exception("Connection timed out")
1443 if bssid2 not in ev:
1444 raise Exception("Unexpected network selected")
1445
1446 bssid = apdev[0]['bssid']
1447 params = hs20_ap_params()
1448 hostapd.add_ap(apdev[0]['ifname'], params)
1449
1450 dev[0].request("INTERWORKING_SELECT auto freq=2412")
1451 ev = dev[0].wait_event(["CTRL-EVENT-CONNECTED",
1452 "INTERWORKING-ALREADY-CONNECTED" ], timeout=15)
1453 if ev is None:
1454 raise Exception("Connection timed out")
1455 if "INTERWORKING-ALREADY-CONNECTED" in ev:
1456 raise Exception("No roam to higher priority network")
1457 if bssid not in ev:
1458 raise Exception("Unexpected network selected")
eaff3458
JM
1459
1460def test_ap_hs20_network_preference3(dev, apdev):
1461 """Hotspot 2.0 network selection with two credential (one preferred)"""
1462 bssid = apdev[0]['bssid']
1463 params = hs20_ap_params()
1464 hostapd.add_ap(apdev[0]['ifname'], params)
1465
1466 bssid2 = apdev[1]['bssid']
1467 params = hs20_ap_params(ssid="test-hs20b")
1468 params['nai_realm'] = "0,example.org,13[5:6],21[2:4][5:7]"
1469 hostapd.add_ap(apdev[1]['ifname'], params)
1470
1471 dev[0].hs20_enable()
1472 values = { 'realm': "example.com",
1473 'username': "hs20-test",
1474 'password': "password",
1475 'priority': "1" }
1476 dev[0].add_cred_values(values)
1477 values = { 'realm': "example.org",
1478 'username': "hs20-test",
1479 'password': "password" }
1480 id = dev[0].add_cred_values(values)
1481
1482 dev[0].request("INTERWORKING_SELECT auto freq=2412")
1483 ev = dev[0].wait_event(["CTRL-EVENT-CONNECTED"], timeout=15)
1484 if ev is None:
1485 raise Exception("Connection timed out")
1486 if bssid not in ev:
1487 raise Exception("Unexpected network selected")
1488
1489 dev[0].set_cred(id, "priority", "2")
1490 dev[0].request("INTERWORKING_SELECT auto freq=2412")
1491 ev = dev[0].wait_event(["CTRL-EVENT-CONNECTED",
1492 "INTERWORKING-ALREADY-CONNECTED" ], timeout=15)
1493 if ev is None:
1494 raise Exception("Connection timed out")
1495 if "INTERWORKING-ALREADY-CONNECTED" in ev:
1496 raise Exception("No roam to higher priority network")
1497 if bssid2 not in ev:
1498 raise Exception("Unexpected network selected")
1221639d
JM
1499
1500def test_ap_hs20_network_preference4(dev, apdev):
1501 """Hotspot 2.0 network selection with username vs. SIM credential"""
1502 bssid = apdev[0]['bssid']
1503 params = hs20_ap_params()
1504 hostapd.add_ap(apdev[0]['ifname'], params)
1505
1506 bssid2 = apdev[1]['bssid']
1507 params = hs20_ap_params(ssid="test-hs20b")
1508 params['hessid'] = bssid2
1509 params['anqp_3gpp_cell_net'] = "555,444"
1510 params['domain_name'] = "wlan.mnc444.mcc555.3gppnetwork.org"
1511 hostapd.add_ap(apdev[1]['ifname'], params)
1512
1513 dev[0].hs20_enable()
1514 values = { 'realm': "example.com",
1515 'username': "hs20-test",
1516 'password': "password",
1517 'priority': "1" }
1518 dev[0].add_cred_values(values)
1519 values = { 'imsi': "555444-333222111",
1520 'eap': "SIM",
1521 'milenage': "5122250214c33e723a5dd523fc145fc0:981d464c7c52eb6e5036234984ad0bcf:000000000123" }
1522 id = dev[0].add_cred_values(values)
1523
1524 dev[0].request("INTERWORKING_SELECT auto freq=2412")
1525 ev = dev[0].wait_event(["CTRL-EVENT-CONNECTED"], timeout=15)
1526 if ev is None:
1527 raise Exception("Connection timed out")
1528 if bssid not in ev:
1529 raise Exception("Unexpected network selected")
1530
1531 dev[0].set_cred(id, "priority", "2")
1532 dev[0].request("INTERWORKING_SELECT auto freq=2412")
1533 ev = dev[0].wait_event(["CTRL-EVENT-CONNECTED",
1534 "INTERWORKING-ALREADY-CONNECTED" ], timeout=15)
1535 if ev is None:
1536 raise Exception("Connection timed out")
1537 if "INTERWORKING-ALREADY-CONNECTED" in ev:
1538 raise Exception("No roam to higher priority network")
1539 if bssid2 not in ev:
1540 raise Exception("Unexpected network selected")