• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1#
2#   Copyright 2017 - The Android Open Source Project
3#
4#   Licensed under the Apache License, Version 2.0 (the "License");
5#   you may not use this file except in compliance with the License.
6#   You may obtain a copy of the License at
7#
8#       http://www.apache.org/licenses/LICENSE-2.0
9#
10#   Unless required by applicable law or agreed to in writing, software
11#   distributed under the License is distributed on an "AS IS" BASIS,
12#   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13#   See the License for the specific language governing permissions and
14#   limitations under the License.
15
16import time
17from acts import asserts
18from acts import utils
19from acts import signals
20from acts.keys import Config
21from acts.test_decorators import test_tracker_info
22from acts_contrib.test_utils.net import connectivity_const as cconsts
23from acts_contrib.test_utils.wifi import wifi_test_utils as wutils
24from acts_contrib.test_utils.wifi.WifiBaseTest import WifiBaseTest
25from acts_contrib.test_utils.wifi.aware import aware_test_utils as autils
26from acts.controllers.openwrt_lib.openwrt_constants import OpenWrtWifiSetting
27import os
28
29WifiEnums = wutils.WifiEnums
30
31
32class WifiRoamingTest(WifiBaseTest):
33
34    def setup_class(self):
35        """Configure the required networks for testing roaming."""
36        super().setup_class()
37
38        self.dut = self.android_devices[0]
39        self.dut_client = self.android_devices[1]
40        req_params = ["roaming_attn", "sae_roaming_unspported_list"]
41        self.unpack_userparams(req_param_names=req_params,)
42        self.country_code = wutils.WifiEnums.CountryCode.US
43        if hasattr(self, "country_code_file"):
44            if isinstance(self.country_code_file, list):
45                self.country_code_file = self.country_code_file[0]
46            if not os.path.isfile(self.country_code_file):
47                self.country_code_file = os.path.join(
48                    self.user_params[Config.key_config_path.value],
49                    self.country_code_file)
50            self.country_code = utils.load_config(
51                self.country_code_file)["country"]
52
53        if "AccessPoint" in self.user_params:
54            self.legacy_configure_ap_and_start(ap_count=2)
55
56    def teardown_class(self):
57        self.dut.ed.clear_all_events()
58        if "AccessPoint" in self.user_params:
59            del self.user_params["reference_networks"]
60            del self.user_params["open_network"]
61
62    def setup_test(self):
63        super().setup_test()
64        self.dut.ed.clear_all_events()
65        self.dut.droid.wakeLockAcquireBright()
66        self.dut.droid.wakeUpNow()
67        asserts.skip_if("sae" in self.test_name and
68                        self.dut.model in self.sae_roaming_unspported_list,
69                        "%s doesn't support wpa3 roaming." % self.dut.model)
70
71    def teardown_test(self):
72        super().teardown_test()
73        self.dut.droid.wakeLockRelease()
74        self.dut.droid.goToSleepNow()
75        wutils.reset_wifi(self.dut)
76        wutils.set_attns(self.attenuators, "default")
77        for ad in self.android_devices:
78            wutils.set_wifi_country_code(ad, self.country_code)
79        if "OpenWrtAP" in self.user_params:
80            for ap in self.access_points:
81                ap.close()
82
83    ### Helper Methods ###
84
85    def register_network_callback_for_internet(self):
86        self.dut.log.debug("Registering network callback for wifi internet"
87                           "connectivity")
88        network_request = {
89            cconsts.NETWORK_CAP_TRANSPORT_TYPE_KEY :
90                cconsts.NETWORK_CAP_TRANSPORT_WIFI,
91            cconsts.NETWORK_CAP_CAPABILITY_KEY :
92                [cconsts.NETWORK_CAP_CAPABILITY_INTERNET]
93        }
94        key = self.dut.droid.connectivityRegisterNetworkCallback(network_request)
95        return key
96
97    def generate_wifi_info(self, network):
98        return {
99            WifiEnums.SSID_KEY : network[WifiEnums.SSID_KEY],
100            # We need to use "BSSID" in WifiInfo map, also need to use lower
101            # chars for bssid.
102            WifiEnums.BSSID_KEY : network["bssid"].lower()
103        }
104
105    def roaming_from_AP1_and_AP2(self, AP1_network, AP2_network):
106        """Test roaming between two APs.
107
108        Args:
109            AP1_network: AP-1's network information.
110            AP2_network: AP-2's network information.
111
112        Steps:
113        1. Make AP1 visible, AP2 not visible.
114        2. Connect to AP1's ssid.
115        3. Make AP1 not visible, AP2 visible.
116        4. Expect DUT to roam to AP2.
117        5. Validate connection information and ping.
118        """
119        network_cb_key = None
120        if self.dut.droid.isSdkAtLeastS():
121            network_cb_key = self.register_network_callback_for_internet()
122        wutils.set_attns(self.attenuators, "AP1_on_AP2_off", self.roaming_attn)
123        wifi_config = AP1_network.copy()
124        wifi_config.pop("bssid")
125        wutils.connect_to_wifi_network(self.dut, wifi_config)
126        if network_cb_key is not None:
127            self.dut.log.info("Waiting for onAvailable and "
128                              "onCapabilitiesChanged after connection")
129            # Ensure that the connection completed and we got the ON_AVAILABLE
130            # callback.
131            autils.wait_for_event_with_keys(
132                self.dut,
133                cconsts.EVENT_NETWORK_CALLBACK,
134                20,
135                (cconsts.NETWORK_CB_KEY_ID, network_cb_key),
136                (cconsts.NETWORK_CB_KEY_EVENT, cconsts.NETWORK_CB_AVAILABLE))
137            autils.wait_for_event_with_keys(
138                self.dut, cconsts.EVENT_NETWORK_CALLBACK, 10,
139                (cconsts.NETWORK_CB_KEY_ID, network_cb_key),
140                (cconsts.NETWORK_CB_KEY_EVENT,
141                 cconsts.NETWORK_CB_CAPABILITIES_CHANGED),
142                (cconsts.NETWORK_CB_KEY_TRANSPORT_INFO,
143                 self.generate_wifi_info(AP1_network)))
144        self.log.info("Roaming from %s to %s", AP1_network, AP2_network)
145        wutils.trigger_roaming_and_validate(
146            self.dut, self.attenuators, "AP1_off_AP2_on", AP2_network,
147            self.roaming_attn)
148        if network_cb_key is not None:
149            self.dut.log.info("Waiting for onCapabilitiesChanged after"
150                              " roaming")
151            # Ensure that the roaming complete triggered a capabilities change
152            # with the new bssid.
153            autils.wait_for_event_with_keys(
154                self.dut, cconsts.EVENT_NETWORK_CALLBACK, 10,
155                (cconsts.NETWORK_CB_KEY_ID, network_cb_key),
156                (cconsts.NETWORK_CB_KEY_EVENT,
157                 cconsts.NETWORK_CB_CAPABILITIES_CHANGED),
158                (cconsts.NETWORK_CB_KEY_TRANSPORT_INFO,
159                 self.generate_wifi_info(AP2_network)))
160
161    ### Test Cases ###
162
163    @test_tracker_info(uuid="db8a46f9-713f-4b98-8d9f-d36319905b0a")
164    def test_roaming_between_AP1_to_AP2_open_2g(self):
165        if "OpenWrtAP" in self.user_params:
166            self.configure_openwrt_ap_and_start(open_network=True,
167                                                ap_count=2,
168                                                mirror_ap=True)
169            self.log.info("BSSID map: %s" % self.bssid_map)
170        ap1_network = self.open_network[0]["2g"]
171        ap2_network = self.open_network[1]["2g"]
172        if "OpenWrtAP" in self.user_params:
173            ap1_network["bssid"] = self.bssid_map[0]["2g"][ap1_network["SSID"]]
174            ap2_network["bssid"] = self.bssid_map[1]["2g"][ap2_network["SSID"]]
175        self.roaming_from_AP1_and_AP2(ap1_network, ap2_network)
176
177    @test_tracker_info(uuid="0db67d9b-6ea9-4f40-acf2-155c4ecf9dc5")
178    def test_roaming_between_AP1_to_AP2_open_5g(self):
179        if "OpenWrtAP" in self.user_params:
180            self.configure_openwrt_ap_and_start(open_network=True,
181                                                ap_count=2,
182                                                mirror_ap=True)
183        ap1_network = self.open_network[0]["5g"]
184        ap2_network = self.open_network[1]["5g"]
185        if "OpenWrtAP" in self.user_params:
186            ap1_network["bssid"] = self.bssid_map[0]["5g"][ap1_network["SSID"]]
187            ap2_network["bssid"] = self.bssid_map[1]["5g"][ap2_network["SSID"]]
188        self.roaming_from_AP1_and_AP2(ap1_network, ap2_network)
189
190    @test_tracker_info(uuid="eabc7319-d962-4bef-b679-725e9ff00420")
191    def test_roaming_between_AP1_to_AP2_psk_2g(self):
192        if "OpenWrtAP" in self.user_params:
193            self.configure_openwrt_ap_and_start(wpa_network=True,
194                                                ap_count=2,
195                                                mirror_ap=True)
196        ap1_network = self.reference_networks[0]["2g"]
197        ap2_network = self.reference_networks[1]["2g"]
198        if "OpenWrtAP" in self.user_params:
199            ap1_network["bssid"] = self.bssid_map[0]["2g"][ap1_network["SSID"]]
200            ap2_network["bssid"] = self.bssid_map[1]["2g"][ap2_network["SSID"]]
201        self.roaming_from_AP1_and_AP2(ap1_network, ap2_network)
202
203    @test_tracker_info(uuid="1cf9c681-4ff0-45c1-9719-f01629f6a7f7")
204    def test_roaming_between_AP1_to_AP2_psk_5g(self):
205        if "OpenWrtAP" in self.user_params:
206            self.configure_openwrt_ap_and_start(wpa_network=True,
207                                                ap_count=2,
208                                                mirror_ap=True)
209        ap1_network = self.reference_networks[0]["5g"]
210        ap2_network = self.reference_networks[1]["5g"]
211        if "OpenWrtAP" in self.user_params:
212            ap1_network["bssid"] = self.bssid_map[0]["5g"][ap1_network["SSID"]]
213            ap2_network["bssid"] = self.bssid_map[1]["5g"][ap2_network["SSID"]]
214        self.roaming_from_AP1_and_AP2(ap1_network, ap2_network)
215
216    @test_tracker_info(uuid="a28f7d2e-fae4-4e66-b633-7ee59f8b46e0")
217    def test_roaming_between_AP1_to_AP2_owe_2g(self):
218        if "OpenWrtAP" in self.user_params:
219            self.configure_openwrt_ap_and_start(owe_network=True,
220                                                ap_count=2,
221                                                mirror_ap=True)
222        ap1_network = self.owe_networks[0]["2g"]
223        ap2_network = self.owe_networks[1]["2g"]
224        if "OpenWrtAP" in self.user_params:
225            ap1_network["bssid"] = self.bssid_map[0]["2g"][ap1_network["SSID"]]
226            ap2_network["bssid"] = self.bssid_map[1]["2g"][ap2_network["SSID"]]
227        self.roaming_from_AP1_and_AP2(ap1_network, ap2_network)
228
229    @test_tracker_info(uuid="3c39110a-9336-4abd-b885-acbba85dc10d")
230    def test_roaming_between_AP1_to_AP2_owe_5g(self):
231        if "OpenWrtAP" in self.user_params:
232            self.configure_openwrt_ap_and_start(owe_network=True,
233                                                ap_count=2,
234                                                mirror_ap=True)
235        ap1_network = self.owe_networks[0]["5g"]
236        ap2_network = self.owe_networks[1]["5g"]
237        if "OpenWrtAP" in self.user_params:
238            ap1_network["bssid"] = self.bssid_map[0]["5g"][ap1_network["SSID"]]
239            ap2_network["bssid"] = self.bssid_map[1]["5g"][ap2_network["SSID"]]
240        self.roaming_from_AP1_and_AP2(ap1_network, ap2_network)
241
242    @test_tracker_info(uuid="68b2baf6-162a-44f2-a00d-4973e5ac9471")
243    def test_roaming_between_AP1_to_AP2_sae_2g(self):
244        if "OpenWrtAP" in self.user_params:
245            self.configure_openwrt_ap_and_start(sae_network=True,
246                                                ap_count=2,
247                                                mirror_ap=True)
248        ap1_network = self.sae_networks[0]["2g"]
249        ap2_network = self.sae_networks[1]["2g"]
250        if "OpenWrtAP" in self.user_params:
251            ap1_network["bssid"] = self.bssid_map[0]["2g"][ap1_network["SSID"]]
252            ap2_network["bssid"] = self.bssid_map[1]["2g"][ap2_network["SSID"]]
253        self.roaming_from_AP1_and_AP2(ap1_network, ap2_network)
254
255    @test_tracker_info(uuid="20e24ed3-0cd1-46dd-bd26-2183ffb443e6")
256    def test_roaming_between_AP1_to_AP2_sae_5g(self):
257        if "OpenWrtAP" in self.user_params:
258            self.configure_openwrt_ap_and_start(sae_network=True,
259                                                ap_count=2,
260                                                mirror_ap=True)
261        ap1_network = self.sae_networks[0]["5g"]
262        ap2_network = self.sae_networks[1]["5g"]
263        if "OpenWrtAP" in self.user_params:
264            ap1_network["bssid"] = self.bssid_map[0]["5g"][ap1_network["SSID"]]
265            ap2_network["bssid"] = self.bssid_map[1]["5g"][ap2_network["SSID"]]
266        self.roaming_from_AP1_and_AP2(ap1_network, ap2_network)
267
268    @test_tracker_info(uuid="521269cb-5d2c-46e6-bc01-a03bd148ce28")
269    def test_soft_2g_ap_channel_when_roam_to_chan_13(self):
270        """Verify softAp 2G channel when after roaming to network on channel 13.
271
272        Steps:
273            1. Configure 2 APs - 1 on channel 6, the other on channel 13.
274            2. Connect DUT to AP on channel 6.
275            3. Start softAp on DUT on 2G band.
276            4. Verify softAp is started on channel 6.
277            5. Roam to AP2 with channel 13.
278            6. Verify SoftAp on DUT changed to channel 13.
279        """
280        for ad in self.android_devices:
281            wutils.set_wifi_country_code(
282                ad, wutils.WifiEnums.CountryCode.AUSTRALIA)
283        if "OpenWrtAP" in self.user_params:
284            self.configure_openwrt_ap_and_start(open_network=True,
285                                                ap_count=2,
286                                                channel_2g_ap2=13,
287                                                mirror_ap=True)
288        ap1_network = self.open_network[0]["2g"]
289        ap2_network = self.open_network[1]["2g"]
290        if "OpenWrtAP" in self.user_params:
291            ap1_network["bssid"] = self.bssid_map[0]["2g"][ap1_network["SSID"]]
292            ap2_network["bssid"] = self.bssid_map[1]["2g"][ap2_network["SSID"]]
293        wutils.set_attns(self.attenuators, "AP1_on_AP2_off", self.roaming_attn)
294        wutils.connect_to_wifi_network(self.dut, ap1_network)
295
296        # start softap on 2G and verify the channel is 6.
297        sap_config = {
298            WifiEnums.SSID_KEY: "hotspot_%s" % utils.rand_ascii_str(6),
299            WifiEnums.PWD_KEY: "pass_%s" % utils.rand_ascii_str(6),
300            WifiEnums.AP_BAND_KEY: WifiEnums.WIFI_CONFIG_SOFTAP_BAND_2G}
301        asserts.assert_true(
302            self.dut.droid.wifiSetWifiApConfiguration(sap_config),
303            "Failed to set WifiAp Configuration")
304        wutils.start_wifi_tethering_saved_config(self.dut)
305        softap_conf = self.dut.droid.wifiGetApConfiguration()
306        self.log.info("softap conf: %s" % softap_conf)
307        wutils.connect_to_wifi_network(self.dut_client, sap_config)
308        conn_info = self.dut_client.droid.wifiGetConnectionInfo()
309        self.log.info("Wifi connection info on dut_client: %s" % conn_info)
310        softap_channel = wutils.WifiEnums.freq_to_channel[conn_info["frequency"]]
311        asserts.assert_true(softap_channel == 6,
312                            "Dut client did not connect to softAp on channel 6")
313
314        # trigger roaming to AP2 with channel 13
315        self.log.info("Roaming from %s to %s", ap1_network, ap2_network)
316        wutils.trigger_roaming_and_validate(
317            self.dut, self.attenuators, "AP1_off_AP2_on", ap2_network,
318            self.roaming_attn)
319
320        # verify softap is now moved to channel 13
321        conn_info = self.dut_client.droid.wifiGetConnectionInfo()
322        self.log.info("Wifi connection info on dut_client: %s" % conn_info)
323        softap_channel = wutils.WifiEnums.freq_to_channel[conn_info["frequency"]]
324        asserts.assert_true(softap_channel == 13,
325                            "Dut client did not connect to softAp on channel 13")
326
327    @test_tracker_info(uuid="3114d625-5cdd-4205-bb46-5a9d057dc80d")
328    def test_roaming_fail_psk_2g(self):
329        """Verify roaming fail with mismatch passwords.
330
331        Steps:
332            DUT connect to AP1.
333            Change AP2's password.
334            DUT try roaming from AP1 to AP2 with mismatched password.
335            Change AP2's password back to original one.
336            DUT try roaming from AP1 to AP2 with matched passwords.
337        """
338        # Use OpenWrt as Wi-Fi AP when it's available in testbed.
339        if "OpenWrtAP" in self.user_params:
340            self.configure_openwrt_ap_and_start(wpa_network=True,
341                                                ap_count=2,
342                                                mirror_ap=True)
343            self.openwrt1 = self.access_points[0]
344            self.openwrt2 = self.access_points[1]
345            ap1_network = self.reference_networks[0]["2g"]
346            ap2_network = self.reference_networks[1]["2g"]
347            # Get APs' BSSIDs.
348            ap1_bssid = self.bssid_map[0]["2g"][ap1_network["SSID"]]
349            ap2_bssid = self.bssid_map[1]["2g"][ap2_network["SSID"]]
350            # Make AP's configs.
351            ap1_network["bssid"] = ap1_bssid
352            ap2_network["bssid"] = ap2_bssid
353
354            # Change AP2 2G to password.
355            self.openwrt2.set_password(pwd_2g=utils.rand_ascii_str(8))
356
357            try:
358                # DUT roaming from AP1 to AP2 with mismatched passwords.
359                self.dut.log.info("Roaming via mismatched passwords to AP2 [{}]"
360                                  .format(ap2_bssid))
361                self.roaming_from_AP1_and_AP2(ap1_network, ap2_network)
362            except:
363                self.dut.log.info("Failed roaming to AP2")
364                self.dut.log.info("Roaming via matched passwords to AP2 [{}]"
365                                  .format(ap1_bssid))
366                wutils.set_attns_steps(self.attenuators, "AP1_on_AP2_off",
367                                       self.roaming_attn)
368                self.openwrt2.set_password(pwd_2g=ap2_network["password"])
369                self.dut.log.info("Toggling wifi OFF.")
370                wutils.wifi_toggle_state(self.dut, False)
371                self.dut.log.info("Toggling wifi ON.")
372                wutils.wifi_toggle_state(self.dut, True)
373                self.roaming_from_AP1_and_AP2(ap1_network, ap2_network)
374            else:
375                raise signals.TestFailure("DUT unexpectedly connect to Wi-Fi.")
376
377        # Use Google OnHub as Wi-Fi AP to test when OpenWrt is no available.
378        elif "AccessPoint" in self.user_params:
379            network = {'SSID':'test_roaming_fail', 'password':'roam123456@'}
380            # AP2 network with incorrect password.
381            network_fail = {'SSID':'test_roaming_fail', 'password':'roam123456@#$%^'}
382            # Setup AP1 with the correct password.
383            wutils.ap_setup(self, 0, self.access_points[0], network)
384            network_bssid = self.access_points[0].get_bssid_from_ssid(
385                network["SSID"], '2g')
386            # Setup AP2 with the incorrect password.
387            wutils.ap_setup(self, 1, self.access_points[1], network_fail)
388            network_fail_bssid = self.access_points[1].get_bssid_from_ssid(
389                network_fail["SSID"], '2g')
390            network['bssid'] = network_bssid
391            network_fail['bssid'] = network_fail_bssid
392            try:
393                # Initiate roaming with AP2 configured with incorrect password.
394                self.roaming_from_AP1_and_AP2(network, network_fail)
395            except:
396                self.log.info("Roaming failed to AP2 with incorrect password.")
397                # Re-configure AP2 after roaming failed, with correct password.
398                self.log.info("Re-configuring AP2 with correct password.")
399                wutils.ap_setup(self, 1, self.access_points[1], network)
400            self.roaming_from_AP1_and_AP2(network, network_fail)
401
402    @test_tracker_info(uuid="b6d73094-22bc-4460-9d55-ce34a0a6a8c9")
403    def test_roaming_fail_different_bssid(self):
404        """Verify devices is disconnect with difference bssid after roaming
405
406        Steps:
407            1. Configure 2 APs
408            2. Connect DUT to AP 1
409            3. Roam to AP2
410            4. Verify the bssid is difference and the device can't connect
411            5. Verify device is disconnect after roaming.
412        """
413        if "OpenWrtAP" in self.user_params:
414            self.configure_openwrt_ap_and_start(wpa_network=True,
415                                                ap_count=2,
416                                                mirror_ap=True)
417        ap1_network = self.reference_networks[0]["2g"]
418        ap2_network = self.reference_networks[1]["2g"]
419        if "OpenWrtAP" in self.user_params:
420            ap1_network["bssid"] = self.bssid_map[0]["2g"][ap1_network["SSID"]]
421            ap2_network["bssid"] = self.bssid_map[1]["2g"][ap2_network["SSID"]]
422        wutils.set_attns(self.attenuators, "AP1_on_AP2_off")
423        wutils.connect_to_wifi_network(self.dut, ap1_network)
424
425        # Initiate roaming with AP2
426        wutils.set_attns(self.attenuators, "AP1_off_AP2_on")
427        time.sleep(10)
428        try:
429            wutils.verify_wifi_connection_info(self.dut, ap2_network)
430        except:
431            self.log.info("Roaming failed to AP2 with incorrect BSSID")
432            wutils.wait_for_disconnect(self.dut)
433            self.log.info("Device is disconnect")
434
435    @test_tracker_info(uuid="641b35c1-7bf8-4d85-a813-1bc30d7bd0d4")
436    def test_roaming_between_psk_2g_to_psk_5g(self):
437        """Verify psk when after roaming from 2.4 Ghz to 5 Ghz with OpenWrtAP
438
439         Steps:
440             1. Configure 2 APs
441             2. Configure AP2 5Ghz and AP1 2.4Ghz WiFi to same SSID and password
442             3. Connect DUT to AP1 2.4Ghz WiFi
443             4. Roam to AP2 5Ghz WiFi
444             5. Verify the DUT can connect from 2.4Ghz to 5Ghz
445        """
446        # Use OpenWrt as Wi-Fi AP when it's available in testbed.
447        asserts.skip_if("OpenWrtAP" not in self.user_params, "OpenWrtAP not in user_params")
448        self.configure_openwrt_ap_and_start(wpa_network=True,
449                                            ap_count=2)
450        self.openwrt1 = self.access_points[0]
451        self.openwrt2 = self.access_points[1]
452        ap1_network = self.reference_networks[0]["2g"]
453        ap2_network = self.reference_networks[1]["5g"]
454        # Get & Setup APs' BSSIDs.
455        ap1_network["bssid"] = self.bssid_map[0]["2g"][ap1_network["SSID"]]
456        ap2_network["bssid"] = self.bssid_map[1]["5g"][ap2_network["SSID"]]
457
458        # Change 2 APs to same password and SSID
459        self.openwrt1.set_ssid(ssid_2g="testSSID")
460        self.openwrt2.set_ssid(ssid_5g="testSSID")
461        self.openwrt2.set_password(pwd_5g=ap1_network["password"])
462        ap1_network["SSID"] = "testSSID"
463        ap2_network["SSID"] = "testSSID"
464        ap2_network["password"] = ap1_network["password"]
465
466        self.roaming_from_AP1_and_AP2(ap1_network, ap2_network)
467
468    @test_tracker_info(uuid="fa1fe3bb-abb9-4d75-88bd-cd88c04073c6")
469    def test_roaming_between_psk_withoutPMF_5g(self):
470        """Verify psk without PMF when after roaming with OpenWrtAP
471
472         Steps:
473             1. Configure 2 APs without PMF
474             2. Connect DUT to AP1
475             3. Roam to AP2
476             4. Verify the DUT can connect after roaming
477        """
478        # Use OpenWrt as Wi-Fi AP when it's available in testbed.
479        asserts.skip_if("OpenWrtAP" not in self.user_params, "OpenWrtAP not in user_params")
480        self.configure_openwrt_ap_and_start(wpa_network=True,
481                                            ap_count=2,
482                                            mirror_ap=True,
483                                            ieee80211w=0)
484        ap1_network = self.reference_networks[0]["5g"]
485        ap2_network = self.reference_networks[1]["5g"]
486        # Get & Setup APs' BSSIDs.
487        ap1_network["bssid"] = self.bssid_map[0]["5g"][ap1_network["SSID"]]
488        ap2_network["bssid"] = self.bssid_map[1]["5g"][ap2_network["SSID"]]
489
490        self.roaming_from_AP1_and_AP2(ap1_network, ap2_network)
491
492    @test_tracker_info(uuid="496e048a-3da5-45c4-aa0f-c5bd127eb06f")
493    def test_roaming_between_psk_withPMF_5g(self):
494        """Verify psk with PMF when after roaming with OpenWrtAP
495
496         Steps:
497             1. Configure 2 APs with PMF
498             2. Connect DUT to AP1
499             3. Roam to AP2
500             4. Verify the DUT can connect after roaming
501        """
502        # Use OpenWrt as Wi-Fi AP when it's available in testbed.
503        asserts.skip_if("OpenWrtAP" not in self.user_params, "OpenWrtAP not in user_params")
504        self.configure_openwrt_ap_and_start(wpa_network=True,
505                                            ap_count=2,
506                                            mirror_ap=True,
507                                            ieee80211w=2)
508        ap1_network = self.reference_networks[0]["5g"]
509        ap2_network = self.reference_networks[1]["5g"]
510        # Get & Setup APs' BSSIDs.
511        ap1_network["bssid"] = self.bssid_map[0]["5g"][ap1_network["SSID"]]
512        ap2_network["bssid"] = self.bssid_map[1]["5g"][ap2_network["SSID"]]
513
514        self.roaming_from_AP1_and_AP2(ap1_network, ap2_network)
515
516    @test_tracker_info(uuid="524c97c5-4bca-46b0-97f9-aad749768cd8")
517    def test_roaming_between_psk_wPMF_to_psk_woPMF_5g(self):
518        """Verify psk with/without PMF when after roaming with OpenWrtAP
519
520         Steps:
521             1. Configure 2 APs without PMF
522             2. Configure AP1 with PMF
523             3. Connect DUT to AP1
524             4. Roam to AP2
525             5. Verify the DUT can connect after roaming
526        """
527        # Use OpenWrt as Wi-Fi AP when it's available in testbed.
528        asserts.skip_if("OpenWrtAP" not in self.user_params, "OpenWrtAP not in user_params")
529        self.configure_openwrt_ap_and_start(wpa_network=True,
530                                            ap_count=2,
531                                            mirror_ap=True,
532                                            ieee80211w=0)
533        self.openwrt1 = self.access_points[0]
534        self.openwrt2 = self.access_points[1]
535        ap1_network = self.reference_networks[0]["5g"]
536        ap2_network = self.reference_networks[1]["5g"]
537        # Get & Setup APs' BSSIDs.
538        ap1_network["bssid"] = self.bssid_map[0]["5g"][ap1_network["SSID"]]
539        ap2_network["bssid"] = self.bssid_map[1]["5g"][ap2_network["SSID"]]
540
541        # Configure AP1 to enable PMF.
542        self.configure_openwrt_ap_and_start(wpa_network=True,
543                                            ieee80211w=2)
544        ap1_network = self.reference_networks[0]["5g"]
545        ap1_network["bssid"] = self.bssid_map[0]["5g"][ap1_network["SSID"]]
546
547        # Change AP2 password and SSID same as AP1.
548        self.openwrt2.set_password(pwd_5g=ap1_network["password"])
549        self.openwrt2.set_ssid(ssid_5g=ap1_network["SSID"])
550        ap2_network["SSID"] = ap1_network["SSID"]
551        ap2_network["password"] = ap1_network["password"]
552
553        self.roaming_from_AP1_and_AP2(ap1_network, ap2_network)
554
555    @test_tracker_info(uuid="714ceac1-d8af-4679-9385-2c9c6d885634")
556    def test_roaming_between_psk_woPMF_to_psk_wPMF_5g(self):
557        """Verify psk without/with PMF when after roaming with OpenWrtAP
558
559         Steps:
560             1. Configure 2 APs with PMF
561             2. Configure AP1 without PMF
562             3. Connect DUT to AP1
563             4. Roam to AP2
564             5. Verify the DUT can connect after roaming
565        """
566        # Use OpenWrt as Wi-Fi AP when it's available in testbed.
567        asserts.skip_if("OpenWrtAP" not in self.user_params, "OpenWrtAP not in user_params")
568        self.configure_openwrt_ap_and_start(wpa_network=True,
569                                            ap_count=2,
570                                            mirror_ap=True,
571                                            ieee80211w=2)
572        self.openwrt1 = self.access_points[0]
573        self.openwrt2 = self.access_points[1]
574        ap1_network = self.reference_networks[0]["5g"]
575        ap2_network = self.reference_networks[1]["5g"]
576        # Get & Setup APs' BSSIDs.
577        ap1_network["bssid"] = self.bssid_map[0]["5g"][ap1_network["SSID"]]
578        ap2_network["bssid"] = self.bssid_map[1]["5g"][ap2_network["SSID"]]
579
580        # Configure AP1 to disable PMF.
581        self.configure_openwrt_ap_and_start(wpa_network=True,
582                                            ieee80211w=0)
583        ap1_network = self.reference_networks[0]["5g"]
584        ap1_network["bssid"] = self.bssid_map[0]["5g"][ap1_network["SSID"]]
585
586        # Change AP2 password and SSID same as AP1.
587        self.openwrt2.set_password(pwd_5g=ap1_network["password"])
588        self.openwrt2.set_ssid(ssid_5g=ap1_network["SSID"])
589        ap2_network["SSID"] = ap1_network["SSID"]
590        ap2_network["password"] = ap1_network["password"]
591
592        self.roaming_from_AP1_and_AP2(ap1_network, ap2_network)
593
594    @test_tracker_info(uuid="4b201d7b-38ec-49c2-95c3-81cba51ba11d")
595    def test_roaming_between_psk_capablePMF_5g(self):
596        """Verify psk capable PMF when after roaming with OpenWrtAP
597
598         Steps:
599             1. Configure 2 APs with capable PMF
600             2. Connect DUT to AP1
601             3. Roam to AP2
602             4. Verify the DUT can connect after roaming
603        """
604        # Use OpenWrt as Wi-Fi AP when it's available in testbed.
605        asserts.skip_if("OpenWrtAP" not in self.user_params, "OpenWrtAP not in user_params")
606        self.configure_openwrt_ap_and_start(wpa_network=True,
607                                            ap_count=2,
608                                            mirror_ap=True,
609                                            ieee80211w=1)
610        ap1_network = self.reference_networks[0]["5g"]
611        ap2_network = self.reference_networks[1]["5g"]
612        # Get & Setup APs' BSSIDs.
613        ap1_network["bssid"] = self.bssid_map[0]["5g"][ap1_network["SSID"]]
614        ap2_network["bssid"] = self.bssid_map[1]["5g"][ap2_network["SSID"]]
615
616        self.roaming_from_AP1_and_AP2(ap1_network, ap2_network)
617
618    @test_tracker_info(uuid="588a9279-1f84-44d2-acbb-051c5ba0bcb1")
619    def test_roaming_between_psk_capPMF_to_psk_woPMF_5g(self):
620        """Verify psk capable/without PMF when after roaming with OpenWrtAP
621
622         Steps:
623             1. Configure 2 APs without PMF
624             2. Configure AP1 with capable PMF
625             3. Connect DUT to AP1
626             4. Roam to AP2
627             5. Verify the DUT can connect after roaming
628        """
629        # Use OpenWrt as Wi-Fi AP when it's available in testbed.
630        asserts.skip_if("OpenWrtAP" not in self.user_params, "OpenWrtAP not in user_params")
631        self.configure_openwrt_ap_and_start(wpa_network=True,
632                                            ap_count=2,
633                                            mirror_ap=True,
634                                            ieee80211w=0)
635        self.openwrt1 = self.access_points[0]
636        self.openwrt2 = self.access_points[1]
637        ap1_network = self.reference_networks[0]["5g"]
638        ap2_network = self.reference_networks[1]["5g"]
639        # Get & Setup APs' BSSIDs.
640        ap1_network["bssid"] = self.bssid_map[0]["5g"][ap1_network["SSID"]]
641        ap2_network["bssid"] = self.bssid_map[1]["5g"][ap2_network["SSID"]]
642
643        # Configure AP1 to enable capable PMF.
644        self.configure_openwrt_ap_and_start(wpa_network=True,
645                                            ieee80211w=1)
646        ap1_network = self.reference_networks[0]["5g"]
647        ap1_network["bssid"] = self.bssid_map[0]["5g"][ap1_network["SSID"]]
648
649        # Change AP2 password and SSID same as AP1.
650        self.openwrt2.set_password(pwd_5g=ap1_network["password"])
651        self.openwrt2.set_ssid(ssid_5g=ap1_network["SSID"])
652        ap2_network["SSID"] = ap1_network["SSID"]
653        ap2_network["password"] = ap1_network["password"]
654
655        self.roaming_from_AP1_and_AP2(ap1_network, ap2_network)
656
657    @test_tracker_info(uuid="d239b56d-515c-4589-b63a-ebce62c321af")
658    def test_roaming_between_psk_capPMF_to_psk_wPMF_5g(self):
659        """Verify psk capable/with PMF when after roaming with OpenWrtAP
660
661         Steps:
662             1. Configure 2 APs with PMF
663             2. Configure AP1 with capable PMF
664             3. Connect DUT to AP1
665             4. Roam to AP2
666             5. Verify the DUT can connect after roaming
667        """
668        # Use OpenWrt as Wi-Fi AP when it's available in testbed.
669        asserts.skip_if("OpenWrtAP" not in self.user_params, "OpenWrtAP not in user_params")
670        self.configure_openwrt_ap_and_start(wpa_network=True,
671                                            ap_count=2,
672                                            mirror_ap=True,
673                                            ieee80211w=2)
674        self.openwrt1 = self.access_points[0]
675        self.openwrt2 = self.access_points[1]
676        ap1_network = self.reference_networks[0]["5g"]
677        ap2_network = self.reference_networks[1]["5g"]
678        # Get & Setup APs' BSSIDs.
679        ap1_network["bssid"] = self.bssid_map[0]["5g"][ap1_network["SSID"]]
680        ap2_network["bssid"] = self.bssid_map[1]["5g"][ap2_network["SSID"]]
681
682        # Configure AP1 to enable capable PMF.
683        self.configure_openwrt_ap_and_start(wpa_network=True,
684                                            ieee80211w=1)
685        ap1_network = self.reference_networks[0]["5g"]
686        ap1_network["bssid"] = self.bssid_map[0]["5g"][ap1_network["SSID"]]
687
688        # Change AP2 password and SSID same as AP1.
689        self.openwrt2.set_password(pwd_5g=ap1_network["password"])
690        self.openwrt2.set_ssid(ssid_5g=ap1_network["SSID"])
691        ap2_network["SSID"] = ap1_network["SSID"]
692        ap2_network["password"] = ap1_network["password"]
693
694        self.roaming_from_AP1_and_AP2(ap1_network, ap2_network)
695
696    @test_tracker_info(uuid="57ec9401-b336-40cb-bc46-c2b4cfc22516")
697    def test_roaming_between_psk_wPMF_to_psk_capPMF_5g(self):
698        """Verify psk with/capable PMF when after roaming with OpenWrtAP
699
700         Steps:
701             1. Configure 2 APs with capable PMF
702             2. Configure AP1 with PMF
703             3. Connect DUT to AP1
704             4. Roam to AP2
705             5. Verify the DUT can connect after roaming
706        """
707        # Use OpenWrt as Wi-Fi AP when it's available in testbed.
708        asserts.skip_if("OpenWrtAP" not in self.user_params, "OpenWrtAP not in user_params")
709        self.configure_openwrt_ap_and_start(wpa_network=True,
710                                            ap_count=2,
711                                            mirror_ap=True,
712                                            ieee80211w=1)
713        self.openwrt1 = self.access_points[0]
714        self.openwrt2 = self.access_points[1]
715        ap1_network = self.reference_networks[0]["5g"]
716        ap2_network = self.reference_networks[1]["5g"]
717        # Get & Setup APs' BSSIDs.
718        ap1_network["bssid"] = self.bssid_map[0]["5g"][ap1_network["SSID"]]
719        ap2_network["bssid"] = self.bssid_map[1]["5g"][ap2_network["SSID"]]
720
721        # Configure AP1 to enable PMF.
722        self.configure_openwrt_ap_and_start(wpa_network=True,
723                                            ieee80211w=2)
724        ap1_network = self.reference_networks[0]["5g"]
725        ap1_network["bssid"] = self.bssid_map[0]["5g"][ap1_network["SSID"]]
726
727        # Change AP2 password and SSID same as AP1.
728        self.openwrt2.set_password(pwd_5g=ap1_network["password"])
729        self.openwrt2.set_ssid(ssid_5g=ap1_network["SSID"])
730        ap2_network["SSID"] = ap1_network["SSID"]
731        ap2_network["password"] = ap1_network["password"]
732
733        self.roaming_from_AP1_and_AP2(ap1_network, ap2_network)
734
735    @test_tracker_info(uuid="a32d24f0-36cc-41f0-90b4-db74973db29f")
736    def test_roaming_between_psk_woPMF_to_psk_capPMF_5g(self):
737        """Verify psk without/capable PMF when after roaming with OpenWrtAP
738
739         Steps:
740             1. Configure 2 APs with capable PMF
741             2. Configure AP1 without PMF
742             3. Connect DUT to AP1
743             4. Roam to AP2
744             5. Verify the DUT can connect after roaming
745        """
746        # Use OpenWrt as Wi-Fi AP when it's available in testbed.
747        asserts.skip_if("OpenWrtAP" not in self.user_params, "OpenWrtAP not in user_params")
748        self.configure_openwrt_ap_and_start(wpa_network=True,
749                                            ap_count=2,
750                                            mirror_ap=True,
751                                            ieee80211w=1)
752        self.openwrt1 = self.access_points[0]
753        self.openwrt2 = self.access_points[1]
754        ap1_network = self.reference_networks[0]["5g"]
755        ap2_network = self.reference_networks[1]["5g"]
756        # Get & Setup APs' BSSIDs.
757        ap1_network["bssid"] = self.bssid_map[0]["5g"][ap1_network["SSID"]]
758        ap2_network["bssid"] = self.bssid_map[1]["5g"][ap2_network["SSID"]]
759
760        # Configure AP1 to disable PMF.
761        self.configure_openwrt_ap_and_start(wpa_network=True,
762                                            ieee80211w=0)
763        ap1_network = self.reference_networks[0]["5g"]
764        ap1_network["bssid"] = self.bssid_map[0]["5g"][ap1_network["SSID"]]
765
766        # Change AP2 password and SSID same as AP1.
767        self.openwrt2.set_password(pwd_5g=ap1_network["password"])
768        self.openwrt2.set_ssid(ssid_5g=ap1_network["SSID"])
769        ap2_network["SSID"] = ap1_network["SSID"]
770        ap2_network["password"] = ap1_network["password"]
771
772        self.roaming_from_AP1_and_AP2(ap1_network, ap2_network)
773
774    @test_tracker_info(uuid="44f45dc9-e85c-419d-bbab-d02e9548a377")
775    def test_roaming_between_psk_to_saemixed_woPMF_5g(self):
776        """Verify psk to saemixed without PMF when after roaming with OpenWrtAP
777
778         Steps:
779             1. Configure 2 APs security type to saemixed without PMF
780             2. Configure AP1 security type to psk
781             3. Connect DUT to AP1
782             4. Roam to AP2
783             5. Verify the DUT can connect after roaming
784        """
785        # Use OpenWrt as Wi-Fi AP when it's available in testbed.
786        asserts.skip_if("OpenWrtAP" not in self.user_params, "OpenWrtAP not in user_params")
787        self.configure_openwrt_ap_and_start(saemixed_network=True,
788                                            ap_count=2,
789                                            mirror_ap=True,
790                                            ieee80211w=0)
791        self.openwrt1 = self.access_points[0]
792        self.openwrt2 = self.access_points[1]
793        ap1_network = self.saemixed_networks[0]["5g"]
794        ap2_network = self.saemixed_networks[1]["5g"]
795        # Get & Setup APs' BSSIDs.
796        ap1_network["bssid"] = self.bssid_map[0]["5g"][ap1_network["SSID"]]
797        ap2_network["bssid"] = self.bssid_map[1]["5g"][ap2_network["SSID"]]
798
799        # Configure AP1 security type.
800        self.configure_openwrt_ap_and_start(wpa_network=True)
801        ap1_network = self.reference_networks[0]["5g"]
802        ap1_network["bssid"] = self.bssid_map[0]["5g"][ap1_network["SSID"]]
803
804        # Change AP2 password and SSID same as AP1.
805        self.openwrt2.set_password(pwd_5g=ap1_network["password"])
806        self.openwrt2.set_ssid(ssid_5g=ap1_network["SSID"])
807        ap2_network["SSID"] = ap1_network["SSID"]
808        ap2_network["password"] = ap1_network["password"]
809
810        self.roaming_from_AP1_and_AP2(ap1_network, ap2_network)
811
812    @test_tracker_info(uuid="9827f3b3-51cd-406b-ba2b-3ef4a9df7378")
813    def test_roaming_between_psk_to_saemixed_wPMF_5g(self):
814        """Verify psk to saemixed with PMF when after roaming with OpenWrtAP
815
816         Steps:
817             1. Configure 2 APs security type to saemixed with PMF
818             2. Configure AP1 security type to psk
819             3. Connect DUT to AP1
820             4. Roam to AP2
821             5. Verify the DUT can connect after roaming
822        """
823        # Use OpenWrt as Wi-Fi AP when it's available in testbed.
824        asserts.skip_if("OpenWrtAP" not in self.user_params, "OpenWrtAP not in user_params")
825        self.configure_openwrt_ap_and_start(saemixed_network=True,
826                                            ap_count=2,
827                                            mirror_ap=True,
828                                            ieee80211w=2)
829        self.openwrt1 = self.access_points[0]
830        self.openwrt2 = self.access_points[1]
831        ap1_network = self.saemixed_networks[0]["5g"]
832        ap2_network = self.saemixed_networks[1]["5g"]
833        # Get & Setup APs' BSSIDs.
834        ap1_network["bssid"] = self.bssid_map[0]["5g"][ap1_network["SSID"]]
835        ap2_network["bssid"] = self.bssid_map[1]["5g"][ap2_network["SSID"]]
836
837        # Configure AP1 security type.
838        self.configure_openwrt_ap_and_start(wpa_network=True)
839        ap1_network = self.reference_networks[0]["5g"]
840        ap1_network["bssid"] = self.bssid_map[0]["5g"][ap1_network["SSID"]]
841
842        # Change AP2 password and SSID same as AP1.
843        self.openwrt2.set_password(pwd_5g=ap1_network["password"])
844        self.openwrt2.set_ssid(ssid_5g=ap1_network["SSID"])
845        ap2_network["SSID"] = ap1_network["SSID"]
846        ap2_network["password"] = ap1_network["password"]
847
848        self.roaming_from_AP1_and_AP2(ap1_network, ap2_network)
849
850    @test_tracker_info(uuid="037602b1-2ce8-4dbb-b46a-00e0a582d976")
851    def test_roaming_between_saemixed_withoutPMF_5g(self):
852        """Verify saemixed without PMF when after roaming with OpenWrtAP
853
854         Steps:
855             1. Configure 2 APs to saemixed without PMF
856             2. Connect DUT to AP1
857             3. Roam to AP2
858             4. Verify the DUT can connect after roaming
859        """
860        # Use OpenWrt as Wi-Fi AP when it's available in testbed.
861        asserts.skip_if("OpenWrtAP" not in self.user_params, "OpenWrtAP not in user_params")
862        self.configure_openwrt_ap_and_start(saemixed_network=True,
863                                            ap_count=2,
864                                            mirror_ap=True,
865                                            ieee80211w=0)
866        ap1_network = self.saemixed_networks[0]["5g"]
867        ap2_network = self.saemixed_networks[1]["5g"]
868        # Get & Setup APs' BSSIDs.
869        ap1_network["bssid"] = self.bssid_map[0]["5g"][ap1_network["SSID"]]
870        ap2_network["bssid"] = self.bssid_map[1]["5g"][ap2_network["SSID"]]
871
872        self.roaming_from_AP1_and_AP2(ap1_network, ap2_network)
873
874    @test_tracker_info(uuid="94514f72-9e90-4d73-bba5-65b95e721cd8")
875    def test_roaming_between_saemixed_withPMF_5g(self):
876        """Verify saemixed with PMF when after roaming with OpenWrtAP
877
878         Steps:
879             1. Configure 2 APs to saemixed with PMF
880             2. Connect DUT to AP1
881             3. Roam to AP2
882             4. Verify the DUT can connect after roaming
883        """
884        # Use OpenWrt as Wi-Fi AP when it's available in testbed.
885        asserts.skip_if("OpenWrtAP" not in self.user_params, "OpenWrtAP not in user_params")
886        self.configure_openwrt_ap_and_start(saemixed_network=True,
887                                            ap_count=2,
888                                            mirror_ap=True,
889                                            ieee80211w=2)
890        ap1_network = self.saemixed_networks[0]["5g"]
891        ap2_network = self.saemixed_networks[1]["5g"]
892        # Get & Setup APs' BSSIDs.
893        ap1_network["bssid"] = self.bssid_map[0]["5g"][ap1_network["SSID"]]
894        ap2_network["bssid"] = self.bssid_map[1]["5g"][ap2_network["SSID"]]
895
896        self.roaming_from_AP1_and_AP2(ap1_network, ap2_network)
897
898    @test_tracker_info(uuid="05834382-5c3f-48d9-a6e6-8794ebf176f8")
899    def test_roaming_between_saemixed_woPMF_to_saemixed_wPMF_5g(self):
900        """Verify saemixed without/with PMF when after roaming with OpenWrtAP
901
902         Steps:
903             1. Configure 2 APs to saemixed with PMF
904             2. Configure AP1 to saemixed without PMF
905             3. Connect DUT to AP1
906             4. Roam to AP2
907             5. Verify the DUT can connect after roaming
908        """
909        # Use OpenWrt as Wi-Fi AP when it's available in testbed.
910        asserts.skip_if("OpenWrtAP" not in self.user_params, "OpenWrtAP not in user_params")
911        self.configure_openwrt_ap_and_start(saemixed_network=True,
912                                            ap_count=2,
913                                            mirror_ap=True,
914                                            ieee80211w=2)
915        self.openwrt1 = self.access_points[0]
916        self.openwrt2 = self.access_points[1]
917        ap1_network = self.saemixed_networks[0]["5g"]
918        ap2_network = self.saemixed_networks[1]["5g"]
919        # Get & Setup APs' BSSIDs.
920        ap1_network["bssid"] = self.bssid_map[0]["5g"][ap1_network["SSID"]]
921        ap2_network["bssid"] = self.bssid_map[1]["5g"][ap2_network["SSID"]]
922
923        # Configure AP1 to disable PMF.
924        self.configure_openwrt_ap_and_start(saemixed_network=True,
925                                            ieee80211w=0)
926        ap1_network = self.saemixed_networks[0]["5g"]
927        ap1_network["bssid"] = self.bssid_map[0]["5g"][ap1_network["SSID"]]
928
929        # Change AP2 password and SSID same as AP1.
930        self.openwrt2.set_password(pwd_5g=ap1_network["password"])
931        self.openwrt2.set_ssid(ssid_5g=ap1_network["SSID"])
932        ap2_network["SSID"] = ap1_network["SSID"]
933        ap2_network["password"] = ap1_network["password"]
934
935        self.roaming_from_AP1_and_AP2(ap1_network, ap2_network)
936
937    @test_tracker_info(uuid="4d7cba89-40f1-4a2a-891d-4bb757f73442")
938    def test_roaming_between_saemixed_wPMF_to_saemixed_woPMF_5g(self):
939        """Verify saemixed with/without PMF when after roaming with OpenWrtAP
940
941         Steps:
942             1. Configure 2 APs to saemixed without PMF
943             2. Configure AP1 to saemixed with PMF
944             3. Connect DUT to AP1
945             4. Roam to AP2
946             5. Verify the DUT can connect after roaming
947        """
948        # Use OpenWrt as Wi-Fi AP when it's available in testbed.
949        asserts.skip_if("OpenWrtAP" not in self.user_params, "OpenWrtAP not in user_params")
950        self.configure_openwrt_ap_and_start(saemixed_network=True,
951                                            ap_count=2,
952                                            mirror_ap=True,
953                                            ieee80211w=0)
954        self.openwrt1 = self.access_points[0]
955        self.openwrt2 = self.access_points[1]
956        ap1_network = self.saemixed_networks[0]["5g"]
957        ap2_network = self.saemixed_networks[1]["5g"]
958        # Get & Setup APs' BSSIDs.
959        ap1_network["bssid"] = self.bssid_map[0]["5g"][ap1_network["SSID"]]
960        ap2_network["bssid"] = self.bssid_map[1]["5g"][ap2_network["SSID"]]
961
962        # Configure AP1 to enable PMF.
963        self.configure_openwrt_ap_and_start(saemixed_network=True,
964                                            ieee80211w=2)
965        ap1_network = self.saemixed_networks[0]["5g"]
966        ap1_network["bssid"] = self.bssid_map[0]["5g"][ap1_network["SSID"]]
967
968        # Change AP2 password and SSID same as AP1.
969        self.openwrt2.set_password(pwd_5g=ap1_network["password"])
970        self.openwrt2.set_ssid(ssid_5g=ap1_network["SSID"])
971        ap2_network["SSID"] = ap1_network["SSID"]
972        ap2_network["password"] = ap1_network["password"]
973
974        self.roaming_from_AP1_and_AP2(ap1_network, ap2_network)
975
976    @test_tracker_info(uuid="57caaf0a-5251-4191-b4d1-de31d7c12295")
977    def test_roaming_between_sae_to_saemixed_woPMF_5g(self):
978        """Verify sae to saemixed without PMF when after roaming with OpenWrtAP
979
980         Steps:
981             1. Configure 2 APs security type to saemixed without PMF
982             2. Configure AP1 security type to sae
983             3. Connect DUT to AP1
984             4. Roam to AP2
985             5. Verify the DUT can connect after roaming
986        """
987        # Use OpenWrt as Wi-Fi AP when it's available in testbed.
988        asserts.skip_if("OpenWrtAP" not in self.user_params, "OpenWrtAP not in user_params")
989        self.configure_openwrt_ap_and_start(saemixed_network=True,
990                                            ap_count=2,
991                                            mirror_ap=True,
992                                            ieee80211w=0)
993        self.openwrt1 = self.access_points[0]
994        self.openwrt2 = self.access_points[1]
995        ap1_network = self.saemixed_networks[0]["5g"]
996        ap2_network = self.saemixed_networks[1]["5g"]
997        # Get & Setup APs' BSSIDs.
998        ap1_network["bssid"] = self.bssid_map[0]["5g"][ap1_network["SSID"]]
999        ap2_network["bssid"] = self.bssid_map[1]["5g"][ap2_network["SSID"]]
1000
1001        # Configure AP1 security type.
1002        self.configure_openwrt_ap_and_start(sae_network=True)
1003        ap1_network = self.sae_networks[0]["5g"]
1004        ap1_network["bssid"] = self.bssid_map[0]["5g"][ap1_network["SSID"]]
1005
1006        # Change AP2 password and SSID same as AP1.
1007        self.openwrt2.set_password(pwd_5g=ap1_network["password"])
1008        self.openwrt2.set_ssid(ssid_5g=ap1_network["SSID"])
1009        ap2_network["SSID"] = ap1_network["SSID"]
1010        ap2_network["password"] = ap1_network["password"]
1011
1012        self.roaming_from_AP1_and_AP2(ap1_network, ap2_network)
1013
1014    @test_tracker_info(uuid="0f5ca9d9-ef40-4a95-bf55-4c78358a9a3e")
1015    def test_roaming_between_sae_to_saemixed_wPMF_5g(self):
1016        """Verify sae to saemixed with PMF when after roaming with OpenWrtAP
1017
1018         Steps:
1019             1. Configure 2 APs security type to saemixed with PMF
1020             2. Configure AP1 security type to sae
1021             3. Connect DUT to AP1
1022             4. Roam to AP2
1023             5. Verify the DUT can connect after roaming
1024        """
1025        # Use OpenWrt as Wi-Fi AP when it's available in testbed.
1026        asserts.skip_if("OpenWrtAP" not in self.user_params, "OpenWrtAP not in user_params")
1027        self.configure_openwrt_ap_and_start(saemixed_network=True,
1028                                            ap_count=2,
1029                                            mirror_ap=True,
1030                                            ieee80211w=2)
1031        self.openwrt1 = self.access_points[0]
1032        self.openwrt2 = self.access_points[1]
1033        ap1_network = self.saemixed_networks[0]["5g"]
1034        ap2_network = self.saemixed_networks[1]["5g"]
1035        # Get & Setup APs' BSSIDs.
1036        ap1_network["bssid"] = self.bssid_map[0]["5g"][ap1_network["SSID"]]
1037        ap2_network["bssid"] = self.bssid_map[1]["5g"][ap2_network["SSID"]]
1038
1039        # Configure AP1 security type.
1040        self.configure_openwrt_ap_and_start(sae_network=True)
1041        ap1_network = self.sae_networks[0]["5g"]
1042        ap1_network["bssid"] = self.bssid_map[0]["5g"][ap1_network["SSID"]]
1043
1044        # Change AP2 password and SSID same as AP1.
1045        self.openwrt2.set_password(pwd_5g=ap1_network["password"])
1046        self.openwrt2.set_ssid(ssid_5g=ap1_network["SSID"])
1047        ap2_network["SSID"] = ap1_network["SSID"]
1048        ap2_network["password"] = ap1_network["password"]
1049
1050        self.roaming_from_AP1_and_AP2(ap1_network, ap2_network)
1051
1052    @test_tracker_info(uuid="e875233f-d242-4ddd-b357-8e3e215af050")
1053    def test_roaming_between_psk_to_sae_5g(self):
1054        """Verify fail with diff security type after roaming with OpenWrtAP
1055
1056         This test will pass after design change but this is not seamless roaming.
1057         Steps:
1058             1. Configure 2 APs security type to sae
1059             2. Configure AP1 security type to psk
1060             3. Connect DUT to AP1
1061             4. Roam to AP2
1062             5. Verify the DUT connect to AP2 after roaming
1063        """
1064        # Use OpenWrt as Wi-Fi AP when it's available in testbed.
1065        asserts.skip_if("OpenWrtAP" not in self.user_params, "OpenWrtAP not in user_params")
1066        self.configure_openwrt_ap_and_start(sae_network=True,
1067                                            ap_count=2,
1068                                            mirror_ap=True)
1069        self.openwrt1 = self.access_points[0]
1070        self.openwrt2 = self.access_points[1]
1071        ap1_network = self.sae_networks[0]["5g"]
1072        ap2_network = self.sae_networks[1]["5g"]
1073        # Get & Setup APs' BSSIDs.
1074        ap1_network["bssid"] = self.bssid_map[0]["5g"][ap1_network["SSID"]]
1075        ap2_network["bssid"] = self.bssid_map[1]["5g"][ap2_network["SSID"]]
1076
1077        # Configure AP1 security type.
1078        self.configure_openwrt_ap_and_start(wpa_network=True)
1079        ap1_network = self.reference_networks[0]["5g"]
1080        ap1_network["bssid"] = self.bssid_map[0]["5g"][ap1_network["SSID"]]
1081
1082        # Change AP2 password and SSID same as AP1.
1083        self.openwrt2.set_password(pwd_5g=ap1_network["password"])
1084        self.openwrt2.set_ssid(ssid_5g=ap1_network["SSID"])
1085        ap2_network["SSID"] = ap1_network["SSID"]
1086        ap2_network["password"] = ap1_network["password"]
1087
1088        # DUT roaming from AP1 to AP2 with diff security type.
1089        # Expect device disconnect from AP1 and connect to AP2 due to
1090        # saved network contain AP2.
1091        self.roaming_from_AP1_and_AP2(ap1_network, ap2_network)
1092
1093    @test_tracker_info(uuid="76098016-56a4-4b92-8c13-7333a21c9a1b")
1094    def test_roaming_between_psk_to_saemixed_2g(self):
1095        """Verify psk to saemixed with 11n when after roaming with OpenWrtAP
1096
1097         Steps:
1098             1. Configure 2 APs security type to saemixed with 11n mode
1099             2. Configure AP1 security type to psk with 11n mode
1100             3. Connect DUT to AP1
1101             4. Roam to AP2
1102             5. Verify the DUT can connect after roaming
1103        """
1104        # Use OpenWrt as Wi-Fi AP when it's available in testbed.
1105        asserts.skip_if("OpenWrtAP" not in self.user_params, "OpenWrtAP not in user_params")
1106        self.configure_openwrt_ap_and_start(saemixed_network=True,
1107                                            ap_count=2,
1108                                            mirror_ap=True)
1109        self.openwrt1 = self.access_points[0]
1110        self.openwrt2 = self.access_points[1]
1111        ap1_network = self.saemixed_networks[0]["2g"]
1112        ap2_network = self.saemixed_networks[1]["2g"]
1113        # Get & Setup APs' BSSIDs.
1114        ap1_network["bssid"] = self.bssid_map[0]["2g"][ap1_network["SSID"]]
1115        ap2_network["bssid"] = self.bssid_map[1]["2g"][ap2_network["SSID"]]
1116
1117        # Configure AP1 security type.
1118        self.configure_openwrt_ap_and_start(wpa_network=True)
1119        ap1_network = self.reference_networks[0]["2g"]
1120        ap1_network["bssid"] = self.bssid_map[0]["2g"][ap1_network["SSID"]]
1121
1122        # Change AP2 password and SSID same as AP1.
1123        self.openwrt2.set_password(pwd_2g=ap1_network["password"])
1124        self.openwrt2.set_ssid(ssid_2g=ap1_network["SSID"])
1125        ap2_network["SSID"] = ap1_network["SSID"]
1126        ap2_network["password"] = ap1_network["password"]
1127
1128        self.roaming_from_AP1_and_AP2(ap1_network, ap2_network)
1129
1130    @test_tracker_info(uuid="2caf668d-6b05-4ba5-ac6b-1ec989fdf9ff")
1131    def test_roaming_between_psk1_to_saemixed_2g(self):
1132        """Verify psk1 to saemixed with 11n when after roaming with OpenWrtAP
1133
1134         Steps:
1135             1. Configure 2 APs security type to saemixed with 11n mode
1136             2. Configure AP1 security type to psk1 with 11n mode
1137             3. Connect DUT to AP1
1138             4. Roam to AP2
1139             5. Verify the DUT can connect after roaming
1140        """
1141        # Use OpenWrt as Wi-Fi AP when it's available in testbed.
1142        asserts.skip_if("OpenWrtAP" not in self.user_params, "OpenWrtAP not in user_params")
1143        self.configure_openwrt_ap_and_start(saemixed_network=True,
1144                                            ap_count=2,
1145                                            mirror_ap=True)
1146        self.openwrt1 = self.access_points[0]
1147        self.openwrt2 = self.access_points[1]
1148        ap1_network = self.saemixed_networks[0]["2g"]
1149        ap2_network = self.saemixed_networks[1]["2g"]
1150        # Get & Setup APs' BSSIDs.
1151        ap1_network["bssid"] = self.bssid_map[0]["2g"][ap1_network["SSID"]]
1152        ap2_network["bssid"] = self.bssid_map[1]["2g"][ap2_network["SSID"]]
1153
1154        # Configure AP1 security type.
1155        self.configure_openwrt_ap_and_start(wpa1_network=True)
1156        ap1_network = self.wpa1_networks[0]["2g"]
1157        ap1_network["bssid"] = self.bssid_map[0]["2g"][ap1_network["SSID"]]
1158
1159        # Change AP2 password and SSID same as AP1.
1160        self.openwrt2.set_password(pwd_2g=ap1_network["password"])
1161        self.openwrt2.set_ssid(ssid_2g=ap1_network["SSID"])
1162        ap2_network["SSID"] = ap1_network["SSID"]
1163        ap2_network["password"] = ap1_network["password"]
1164
1165        self.roaming_from_AP1_and_AP2(ap1_network, ap2_network)
1166
1167    @test_tracker_info(uuid="cc8781ec-12fb-47a4-86d4-80d13231c75d")
1168    def test_connect_to_wpa2_psk_2g_80211r(self):
1169        """Test WPA2-PSK 802.11r 2G connectivity ant roaming."""
1170        if "OpenWrtAP" in self.user_params:
1171            self.openwrt1 = self.access_points[0]
1172            self.openwrt2 = self.access_points[1]
1173            self.configure_openwrt_ap_and_start(wpa_network=True,
1174                                                ap_count=2,
1175                                                mirror_ap=True)
1176        ap1_network = self.reference_networks[0]["2g"]
1177        ap2_network = self.reference_networks[1]["2g"]
1178        ap1_network["bssid"] = self.bssid_map[0]["2g"][ap1_network["SSID"]]
1179        ap2_network["bssid"] = self.bssid_map[1]["2g"][ap2_network["SSID"]]
1180
1181        md = self.openwrt1.generate_mobility_domain()
1182        self.openwrt1.enable_80211r(OpenWrtWifiSetting.IFACE_2G, md)
1183        self.openwrt2.enable_80211r(OpenWrtWifiSetting.IFACE_2G, md)
1184        self.roaming_from_AP1_and_AP2(ap1_network, ap2_network)
1185
1186    @test_tracker_info(uuid="8b0ee65e-bba2-4786-a8b9-8990316d123d")
1187    def test_connect_to_wpa2_psk_5g_80211r(self):
1188        """Test WPA2-PSK 802.11r 5G connectivity and roaming."""
1189        if "OpenWrtAP" in self.user_params:
1190            self.openwrt1 = self.access_points[0]
1191            self.openwrt2 = self.access_points[1]
1192            self.configure_openwrt_ap_and_start(wpa_network=True,
1193                                                ap_count=2,
1194                                                mirror_ap=True)
1195        ap1_network = self.reference_networks[0]["5g"]
1196        ap2_network = self.reference_networks[1]["5g"]
1197        ap1_network["bssid"] = self.bssid_map[0]["5g"][ap1_network["SSID"]]
1198        ap2_network["bssid"] = self.bssid_map[1]["5g"][ap2_network["SSID"]]
1199
1200        md = self.openwrt1.generate_mobility_domain()
1201        self.openwrt1.enable_80211r(OpenWrtWifiSetting.IFACE_5G, md)
1202        self.openwrt2.enable_80211r(OpenWrtWifiSetting.IFACE_5G, md)
1203        self.roaming_from_AP1_and_AP2(ap1_network, ap2_network)
1204