• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1#!/usr/bin/env python3
2#
3#   Copyright 2021 - The Android Open Source Project
4#
5#   Licensed under the Apache License, Version 2.0 (the "License");
6#   you may not use this file except in compliance with the License.
7#   You may obtain a copy of the License at
8#
9#       http://www.apache.org/licenses/LICENSE-2.0
10#
11#   Unless required by applicable law or agreed to in writing, software
12#   distributed under the License is distributed on an "AS IS" BASIS,
13#   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14#   See the License for the specific language governing permissions and
15#   limitations under the License.
16
17
18import logging
19import time
20from acts import asserts
21from acts import signals
22from acts.test_decorators import test_tracker_info
23import acts_contrib.test_utils.wifi.wifi_test_utils as wutils
24from acts_contrib.test_utils.wifi import wifi_constants
25from acts_contrib.test_utils.wifi.WifiBaseTest import WifiBaseTest
26from acts.controllers.ap_lib.hostapd_constants import BAND_2G
27from acts.controllers.ap_lib.hostapd_constants import BAND_5G
28from acts.controllers.ap_lib import hostapd_constants
29
30
31WifiEnums = wutils.WifiEnums
32# Each wait time add 5 seconds as buffer.
33BRIDGED_AP_LAUNCH_INTERVAL_5_SECONDS = 5
34BRIDGED_AP_SHUTDOWN_INTERVAL_5_MINUTES = 305
35BRIDGED_AP_SHUTDOWN_INTERVAL_5_SECONDS = 5
36SOFT_AP_SHUTDOWN_INTERVAL_10_MINUTES = 605
37INTERVAL_9_MINUTES = 545
38INTERVAL_2_MINUTES = 125
39INTERVAL_1_MINUTES = 65
40
41
42class WifiBridgedApTest(WifiBaseTest):
43    """WiFi BridgedAp test class.
44
45    Test Bed Requirement:
46        * Android device x 1 with BridgedAp supported.
47        * Android devices x2 as clients, at least Android 10.
48        * OpenWrt AP x 1.
49        * Google Wi-Fi x 2 as packet captures.
50    """
51
52    def setup_class(self):
53        super().setup_class()
54
55        if len(self.android_devices) == 3:
56            self.dut = self.android_devices[0]
57            self.client1 = self.android_devices[1]
58            self.client2 = self.android_devices[2]
59        else:
60            raise signals.TestAbortClass("WifiBridgedApTest requires 3 DUTs")
61
62        if not self.dut.droid.wifiIsBridgedApConcurrencySupported():
63            raise signals.TestAbortClass("Legacy phone is not supported")
64
65        req_params = ["dbs_supported_models"]
66        opt_param = []
67
68        self.unpack_userparams(
69            req_param_names=req_params, opt_param_names=opt_param)
70
71    def setup_test(self):
72        super().setup_test()
73        for ad in self.android_devices:
74            wutils.reset_wifi(ad)
75        wutils.wifi_toggle_state(self.dut, False)
76        wutils.wifi_toggle_state(self.client1, True)
77        wutils.wifi_toggle_state(self.client2, True)
78
79    def teardown_test(self):
80        super().teardown_test()
81        if self.dut.droid.wifiIsApEnabled():
82            wutils.stop_wifi_tethering(self.dut)
83        for ad in self.android_devices:
84            wutils.reset_wifi(ad)
85            wutils.set_wifi_country_code(
86                ad, wutils.WifiEnums.CountryCode.US)
87
88        # Stop packet captures.
89        if hasattr(self, "sniffer_procs"):
90            for i in range(len(self.sniffer_procs)):
91                try:
92                    wutils.stop_pcap(
93                        self.packet_capture[i], self.sniffer_procs[i], False)
94                    logging.info("packet_capture[{}] is STOPPED".format(i))
95                except:
96                    logging.info("packet_capture[{}] is NOT STOPPED".format(i))
97
98    def teardown_class(self):
99        super().teardown_class()
100        for ad in self.android_devices:
101            wutils.reset_wifi(ad)
102        if "AccessPoint" in self.user_params:
103            del self.user_params["reference_networks"]
104            del self.user_params["open_network"]
105
106    def set_country_code_and_verify(self, ad, country_code):
107        wutils.set_wifi_country_code(ad, country_code)
108        # Wi-Fi ON and OFF to make sure country code take effect.
109        wutils.wifi_toggle_state(ad, True)
110        wutils.wifi_toggle_state(ad, False)
111
112        country = ad.droid.wifiGetCountryCode()
113        asserts.assert_true(country == country_code,
114                            "country code {} is not set".format(country_code))
115        ad.log.info("Country code set to : {}".format(country))
116
117    def verify_clients_support_wpa3_sae(self, *args):
118        """Check if clients support WPA3 SAE.
119
120        Args:
121            args: arbitrary number of clients. e.g., self.dut1, self.dut2, ...
122        """
123        duts = args
124        for dut in duts:
125            asserts.skip_if(not dut.droid.wifiIsWpa3SaeSupported(),
126                            "All DUTs support WPA3 SAE is required")
127
128    def verify_band_of_bridged_ap_instance(self, ad, infos, bands):
129        """Check bands enabled as expected.
130           This function won't be called directly.
131
132        Args:
133            infos: SoftAp info list.
134            bands: A list of bands.
135                   e,g,. [WifiEnums.WIFI_CONFIG_SOFTAP_BAND_2G,
136                          WifiEnums.WIFI_CONFIG_SOFTAP_BAND_5G]
137        """
138        self.dut.log.info("Length of infos: {}, Length of bands: {}"
139                          .format(len(infos), len(bands)))
140        asserts.assert_true(len(infos) == len(bands),
141                            "There should be {} BridgedAp instance, "
142                            "instead of {}".format(len(bands), len(infos)))
143        if len(bands) == 1 and (bands[0] == WifiEnums.WIFI_CONFIG_SOFTAP_BAND_2G):
144            asserts.assert_true(infos[0][wifi_constants.
145                                SOFTAP_INFO_FREQUENCY_CALLBACK_KEY]
146                                in WifiEnums.softap_band_frequencies[bands[0]],
147                                "This should be a {} instance".format(bands[0]))
148        if len(bands) == 2 and (bands[0] == WifiEnums.WIFI_CONFIG_SOFTAP_BAND_2G):
149            asserts.assert_true((infos[0][wifi_constants.
150                                SOFTAP_INFO_FREQUENCY_CALLBACK_KEY]
151                                in WifiEnums.ALL_2G_FREQUENCIES and
152                                infos[1][wifi_constants.
153                                SOFTAP_INFO_FREQUENCY_CALLBACK_KEY]
154                                in WifiEnums.ALL_5G_FREQUENCIES) or
155                                (infos[0][wifi_constants.
156                                 SOFTAP_INFO_FREQUENCY_CALLBACK_KEY]
157                                 in WifiEnums.ALL_5G_FREQUENCIES and
158                                 infos[1][wifi_constants.
159                                 SOFTAP_INFO_FREQUENCY_CALLBACK_KEY]
160                                 in WifiEnums.ALL_2G_FREQUENCIES),
161                                "There should only be 2G and 5G instances")
162
163    def verify_softap_freq_equals_to_ap_freq(self, ad, infos):
164        """Verify if instance frequency equal to AP frequency.
165           This function won't be called directly.
166        Args:
167            infos: SoftAp info list.
168        """
169        wlan0_freq = wutils.get_wlan0_link(ad)["freq"]
170        softap_freqs = []
171        for i in range(len(infos)):
172            softap_freqs.append(infos[i][WifiEnums.frequency_key])
173        ad.log.info("softap_freqs : {}".format(softap_freqs))
174        asserts.assert_true(int(wlan0_freq) in softap_freqs,
175                            "AP freq != SoftAp freq")
176        ad.log.info("softap freq == AP freq")
177
178    def verify_number_band_freq_of_bridged_ap(self, ad, bands,
179                                              freq_equal=False):
180        """Verify every aspect of info list from BridgedAp.
181
182        Args:
183            bands: A list of bands,
184                   e,g,. [WifiEnums.WIFI_CONFIG_SOFTAP_BAND_2G,
185                          WifiEnums.WIFI_CONFIG_SOFTAP_BAND_5G]
186            freq_equal: True if need to check SoftAp freq equals to STA freq.
187
188        Returns:
189            infos: A List of SoftAp info, e.g.,
190                [{'autoShutdownTimeoutMillis': 600000,
191                  'bandwidth': 4,
192                  'bssid': '12:dd:0b:b9:4b:cc',
193                  'frequency': 5180,
194                  'wifiStandard': 6},
195                 {'autoShutdownTimeoutMillis': 600000,
196                  'bandwidth': 2,
197                  'bssid': '12:22:f4:b9:4b:cc',
198                  'frequency': 2462,
199                  'wifiStandard': 4}]
200        """
201        callbackId = ad.droid.registerSoftApCallback()
202        infos = wutils.get_current_softap_infos(ad, callbackId, True)
203        self.verify_band_of_bridged_ap_instance(ad, infos, bands)
204        if freq_equal:
205            self.verify_softap_freq_equals_to_ap_freq(ad, infos)
206        ad.droid.unregisterSoftApCallback(callbackId)
207        return infos
208
209    def verify_expected_number_of_softap_clients(self, ad, number):
210        """Verify the number of softap clients.
211
212        Args:
213            number: expect number of client connect to SoftAp.
214        """
215        callbackId = self.dut.droid.registerSoftApCallback()
216        wutils.wait_for_expected_number_of_softap_clients(self.dut,
217                                                          callbackId, number)
218        ad.log.info("{} clients connect to soft ap".format(number))
219        self.dut.droid.unregisterSoftApCallback(callbackId)
220
221    def wait_interval(self, interval):
222        """print different messages with different intervals.
223
224        Args:
225            interval: different interval for different situation.
226        """
227        if interval == BRIDGED_AP_LAUNCH_INTERVAL_5_SECONDS:
228            logging.info("Wait {} seconds for BridgedAp launch"
229                         .format(interval))
230            time.sleep(interval)
231        elif interval == BRIDGED_AP_SHUTDOWN_INTERVAL_5_MINUTES:
232            logging.info("Wait {} minutes for BridgedAp shutdown"
233                         .format(interval/60))
234            time.sleep(interval)
235        elif interval == SOFT_AP_SHUTDOWN_INTERVAL_10_MINUTES:
236            logging.info("Wait {} minutes for SoftAp shutdown"
237                         .format(interval/60))
238            time.sleep(interval)
239        elif interval == INTERVAL_9_MINUTES:
240            logging.info("Wait {} minutes".format(interval/60))
241            time.sleep(interval)
242        elif interval == INTERVAL_2_MINUTES:
243            logging.info("Wait {} minutes".format(interval/60))
244            time.sleep(interval)
245        elif interval == INTERVAL_1_MINUTES:
246            logging.info("Wait {} minutes".format(interval/60))
247            time.sleep(interval)
248
249    def generate_softap_config(self, security):
250        """Return a soft ap config
251
252        Args:
253            security: String; represent certain security. e.g., "WPA3_SAE"
254        """
255        config = wutils.create_softap_config()
256        config[WifiEnums.SECURITY] = security
257        return config
258
259    def enable_bridged_ap(self, ad, security, bands, **kwargs):
260        """Enable BridgedAp.
261
262        Args:
263            security: String; represent certain security. e.g., "WPA3_SAE"
264            bands: specifies the band list for the soft ap.
265        """
266        self.config = self.generate_softap_config(security)
267        wutils.save_wifi_soft_ap_config(
268                                        ad,
269                                        self.config,
270                                        bands=bands,
271                                        **kwargs)
272        wutils.start_wifi_tethering_saved_config(self.dut)
273        # Wait 5 seconds for BridgedAp launch.
274        self.wait_interval(BRIDGED_AP_LAUNCH_INTERVAL_5_SECONDS)
275
276    def sniffing_bridgedap_channels(self, infos):
277        """Sniff BridgedAp channels.
278
279        Args:
280            infos: A List of SoftAp info. e.g.,
281                [{'autoShutdownTimeoutMillis': 600000,
282                  'bandwidth': 4,
283                  'bssid': '12:dd:0b:b9:4b:cc',
284                  'frequency': 5180,
285                  'wifiStandard': 6},
286                 {'autoShutdownTimeoutMillis': 600000,
287                  'bandwidth': 2,
288                  'bssid': '12:22:f4:b9:4b:cc',
289                  'frequency': 2462,
290                  'wifiStandard': 4}]
291        """
292        if hasattr(self, "packet_capture") and len(self.packet_capture) == 2:
293            # Create sniffer_config.
294            self.sniffer_config = {}
295            for i in range(len(infos)):
296                if (infos[i][WifiEnums.frequency_key] in
297                   WifiEnums.ALL_5G_FREQUENCIES):
298                    self.sniffer_config[BAND_5G] = WifiEnums.freq_to_channel[
299                        int(infos[i][WifiEnums.frequency_key])]
300                if (infos[i][WifiEnums.frequency_key] in
301                   WifiEnums.ALL_2G_FREQUENCIES):
302                    self.sniffer_config[BAND_2G] = WifiEnums.freq_to_channel[
303                        int(infos[i][WifiEnums.frequency_key])]
304            logging.info("sniffer_config : {}".format(self.sniffer_config))
305
306            # Enable sniffers.
307            self.sniffer_procs = []
308            for i in range(len(self.sniffer_config)):
309                self.packet_capture[i].log.info(
310                    "Enable packet_capture[{}]".format(i))
311                result = self.packet_capture[i].configure_monitor_mode(
312                    list(self.sniffer_config.keys())[i],
313                    list(self.sniffer_config.values())[i])
314                if not result:
315                    logging.error("Failed to enable packet_capture"
316                                  "on {}".format(self.packet_capture[i]))
317                self.pcap_procs = wutils.start_pcap(
318                    self.packet_capture[i],
319                    list(self.sniffer_config.keys())[i],
320                    self.test_name)
321                self.sniffer_procs.append(self.pcap_procs)
322            logging.info("sniffer_procs: {}".format(self.sniffer_procs))
323        else:
324            logging.warning("Packet_capture not enabled, "
325                            "because two packet_capture hardware required")
326
327    def sniffing_ap_channels(self, channel1, channel2):
328        """Sniff on two Wi-Fi channels.
329
330        Args:
331            channel1: Integer; a Wi-Fi channel, e.g., 6.
332            channel2: Integer; a Wi-Fi channel, e,g,. 36.
333        """
334        if not channel1:
335            channel1 = hostapd_constants.AP_DEFAULT_CHANNEL_2G
336        if not channel2:
337            channel2 = hostapd_constants.AP_DEFAULT_CHANNEL_5G
338
339        if hasattr(self, "packet_capture") and len(self.packet_capture) == 2:
340            # Create sniffer_config.
341            self.sniffer_config = {}
342            if channel1 in WifiEnums.channel_2G_to_freq:
343                self.sniffer_config[BAND_2G] = channel1
344            if channel1 in WifiEnums.channel_5G_to_freq:
345                self.sniffer_config[BAND_5G] = channel1
346            if channel2 in WifiEnums.channel_2G_to_freq:
347                self.sniffer_config[BAND_2G] = channel2
348            if channel2 in WifiEnums.channel_5G_to_freq:
349                self.sniffer_config[BAND_5G] = channel2
350            logging.info("sniffer_config : {}".format(self.sniffer_config))
351
352            # Enable sniffers.
353            self.sniffer_procs = []
354            for i in range(len(self.sniffer_config)):
355                self.packet_capture[i].log.info(
356                    "Enable packet_capture[{}]".format(i))
357                result = self.packet_capture[i].configure_monitor_mode(
358                    list(self.sniffer_config.keys())[i],
359                    list(self.sniffer_config.values())[i])
360                if not result:
361                    logging.error("Failed to enable packet_capture"
362                                  "on {}".format(self.packet_capture[i]))
363                self.pcap_procs = wutils.start_pcap(
364                    self.packet_capture[i],
365                    list(self.sniffer_config.keys())[i],
366                    self.test_name)
367                self.sniffer_procs.append(self.pcap_procs)
368            logging.info("sniffer_procs: {}".format(self.sniffer_procs))
369        else:
370            logging.debug("Packet_capture not enabled, "
371                          "because two packet_capture hardware required")
372
373    def start_ap(self, channel_2g, channel_5g):
374        """Enable OpenWrt AP with specific 2G/5G channels
375
376        Args:
377            channel_2g: Integer; a 2G channel, e.g., 6.
378            channel_5g: Integer; a 5G channel, e,g,. 36
379        """
380        if not channel_2g:
381            channel_2g = hostapd_constants.AP_DEFAULT_CHANNEL_2G
382        if not channel_5g:
383            channel_5g = hostapd_constants.AP_DEFAULT_CHANNEL_5G
384
385        # Enable OpenWrt AP.
386        if "OpenWrtAP" in self.user_params:
387            self.configure_openwrt_ap_and_start(wpa_network=True,
388                                                channel_2g=channel_2g,
389                                                channel_5g=channel_5g)
390
391    def two_clients_connect_to_wifi_network(self, dut1, dut2, config):
392        """Connect two clients to different BridgedAp instances.
393           This function will be called only when BridgedAp ON.
394
395        Args:
396            config: Wi-Fi config, e.g., {"SSID": "xxx", "password": "xxx"}
397        Steps:
398            Backup config.
399            Register SoftAp Callback.
400            Get SoftAp Infos.
401            Get BSSIDs from Infos.
402            Connect two clients to different BridgedAp instances.
403            Restore config.
404        """
405        # Make sure 2 instances enabled, and get BSSIDs from BridgedAp Infos.
406        callbackId = self.dut.droid.registerSoftApCallback()
407        infos = wutils.get_current_softap_infos(self.dut, callbackId, True)
408        self.dut.droid.unregisterSoftApCallback(callbackId)
409
410        if len(infos) == 0:
411            raise signals.TestFailure("No BridgedAp instance")
412        elif len(infos) == 1:
413            raise signals.TestFailure(
414                "Only one BridgedAp instance, should be two")
415        else:
416            bssid_5g = infos[0][wifi_constants.SOFTAP_INFO_BSSID_CALLBACK_KEY]
417            bssid_2g = infos[1][wifi_constants.SOFTAP_INFO_BSSID_CALLBACK_KEY]
418
419        # Two configs for BridgedAp 2G and 5G instances.
420        config_5g = config.copy()
421        config_2g = config.copy()
422        config_5g[WifiEnums.BSSID_KEY] = bssid_5g
423        config_2g[WifiEnums.BSSID_KEY] = bssid_2g
424
425        # Connect two clients to BridgedAp.
426        wutils.connect_to_wifi_network(dut1, config_5g,
427                                       check_connectivity=False)
428        wutils.connect_to_wifi_network(dut2, config_2g,
429                                       check_connectivity=False)
430
431        # Verify if Clients connect to the expected BridgedAp instances.
432        client1_bssid = wutils.get_wlan0_link(
433            self.client1)[wifi_constants.SOFTAP_INFO_BSSID_CALLBACK_KEY]
434        client2_bssid = wutils.get_wlan0_link(
435            self.client2)[wifi_constants.SOFTAP_INFO_BSSID_CALLBACK_KEY]
436        asserts.assert_true(client1_bssid == bssid_5g,
437                            "Client1 does not connect to the 5G instance")
438        asserts.assert_true(client2_bssid == bssid_2g,
439                            "Client2 does not connect to the 2G instance")
440
441    def client_connects_to_a_bridgeap(self, ad, band):
442        """One client connects to a BridgeAp instance
443
444        Args:
445            band: String; '2g' or '5g'.
446        """
447        callbackId = self.dut.droid.registerSoftApCallback()
448        infos = wutils.get_current_softap_infos(self.dut, callbackId, True)
449        self.dut.droid.unregisterSoftApCallback(callbackId)
450        # Make one client connects to 2G instance if band == '2g'.
451        if band == BAND_2G:
452            if (infos[0][wifi_constants.SOFTAP_INFO_FREQUENCY_CALLBACK_KEY]
453               in WifiEnums.ALL_2G_FREQUENCIES):
454                bssid_2g = (infos[0][wifi_constants.
455                            SOFTAP_INFO_BSSID_CALLBACK_KEY])
456            else:
457                bssid_2g = (infos[1][wifi_constants.
458                            SOFTAP_INFO_BSSID_CALLBACK_KEY])
459            config_2g = self.config.copy()
460            config_2g[WifiEnums.BSSID_KEY] = bssid_2g
461            wutils.connect_to_wifi_network(ad, config_2g,
462                                           check_connectivity=False)
463        # Make one client connects to 5G instance if band == '5g'.
464        elif band == BAND_5G:
465            if (infos[0][wifi_constants.SOFTAP_INFO_FREQUENCY_CALLBACK_KEY]
466               in WifiEnums.ALL_5G_FREQUENCIES):
467                bssid_5g = (infos[0][wifi_constants.
468                            SOFTAP_INFO_BSSID_CALLBACK_KEY])
469            else:
470                bssid_5g = (infos[1][wifi_constants.
471                            SOFTAP_INFO_BSSID_CALLBACK_KEY])
472            config_5g = self.config.copy()
473            config_5g[WifiEnums.BSSID_KEY] = bssid_5g
474            wutils.connect_to_wifi_network(ad, config_5g,
475                                           check_connectivity=False)
476
477    # Tests
478
479    @test_tracker_info(uuid="6f776b4a-b080-4b52-a330-52aa641b18f2")
480    def test_two_clients_ping_bridged_ap_5g_2g_wpa3_country_us(self):
481        """Test clients on different instances can ping each other.
482
483        Steps:
484            Backup config.
485            Make sure clients support WPA3 SAE.
486            Make sure DUT is able to enable BridgedAp.
487            Enable BridgedAp with bridged configuration.
488            RegisterSoftApCallback.
489            Check the bridged AP enabled succeed.
490            start sniffer and sniffing on BridgedAp channels.
491            Force client#1 connect to 5G.
492            Force client#2 connect to 2.4G.
493            Trigger client#1 and client#2 each other.
494            Stop sniffers.
495            Restore config.
496        """
497        # Backup config
498        original_softap_config = self.dut.droid.wifiGetApConfiguration()
499        # Make sure clients support WPA3 SAE.
500        self.verify_clients_support_wpa3_sae(self.client1, self.client2)
501        # Make sure DUT is able to enable BridgedAp.
502        is_supported = wutils.check_available_channels_in_bands_2_5(
503            self.dut, wutils.WifiEnums.CountryCode.US)
504        asserts.skip_if(not is_supported, "BridgedAp is not supported in {}"
505                        .format(wutils.WifiEnums.CountryCode.US))
506
507        # Enable BridgedAp and verify both 2G,5G instances have been enabled.
508        self.enable_bridged_ap(self.dut,
509                               WifiEnums.SoftApSecurityType.WPA3_SAE,
510                               bands=[WifiEnums.WIFI_CONFIG_SOFTAP_BAND_2G,
511                                      WifiEnums.WIFI_CONFIG_SOFTAP_BAND_2G_5G])
512        infos = self.verify_number_band_freq_of_bridged_ap(
513            self.dut, [WifiEnums.WIFI_CONFIG_SOFTAP_BAND_2G,
514                       WifiEnums.WIFI_CONFIG_SOFTAP_BAND_5G], False)
515
516        self.sniffing_bridgedap_channels(infos)
517
518        self.two_clients_connect_to_wifi_network(self.client1, self.client2,
519                                                 self.config)
520        # Trigger client#1 and client#2 ping each other.
521        wutils.validate_ping_between_two_clients(self.client1, self.client2)
522
523        # Restore config
524        wutils.save_wifi_soft_ap_config(self.dut, original_softap_config)
525    @test_tracker_info(uuid="8685a6cb-f7be-4384-b25b-23cecb4cb6dc")
526    def test_two_clients_ping_bridged_ap_5g_2g_wpa3_sae_transition_country_us(self):
527        """Test clients on different instances can ping each other.
528
529        Steps:
530            Refer to test_two_clients_ping_bridged_ap_5g_2g_wpa3_country_us,
531            but this case enable WPA3/WPA2-Personal SoftAp security type.
532        """
533        # Backup config
534        original_softap_config = self.dut.droid.wifiGetApConfiguration()
535        # Make sure clients support WPA3 SAE.
536        self.verify_clients_support_wpa3_sae(self.client1, self.client2)
537        # Make sure DUT is able to enable BridgedAp.
538        is_supported = wutils.check_available_channels_in_bands_2_5(
539            self.dut, wutils.WifiEnums.CountryCode.US)
540        asserts.skip_if(not is_supported, "BridgedAp is not supported in {}"
541                        .format(wutils.WifiEnums.CountryCode.US))
542
543        # Enable BridgedAp and verify both 2G,5G instances have been enabled.
544        self.enable_bridged_ap(self.dut,
545                               WifiEnums.SoftApSecurityType.WPA3_SAE_TRANSITION,
546                               bands=[WifiEnums.WIFI_CONFIG_SOFTAP_BAND_2G,
547                                      WifiEnums.WIFI_CONFIG_SOFTAP_BAND_2G_5G])
548        infos = self.verify_number_band_freq_of_bridged_ap(
549            self.dut, [WifiEnums.WIFI_CONFIG_SOFTAP_BAND_2G,
550                       WifiEnums.WIFI_CONFIG_SOFTAP_BAND_5G], False)
551
552        self.sniffing_bridgedap_channels(infos)
553
554        self.two_clients_connect_to_wifi_network(self.client1, self.client2,
555                                                 self.config)
556        # Trigger client#1 and client#2 ping each other.
557        wutils.validate_ping_between_two_clients(self.client1, self.client2)
558
559        # Restore config
560        wutils.save_wifi_soft_ap_config(self.dut, original_softap_config)
561
562    @test_tracker_info(uuid="b217d4de-cd09-4a8f-b27d-302ae5b86c7e")
563    def test_two_clients_ping_bridged_ap_5g_2g_wpa2_country_us(self):
564        """Test clients on different instances can ping each other.
565
566        Steps:
567            Refer to test_two_clients_ping_bridged_ap_5g_2g_wpa3_country_us,
568            but this case enable WPA2-Personal SoftAp security type.
569        """
570        # Backup config
571        original_softap_config = self.dut.droid.wifiGetApConfiguration()
572        # Make sure DUT is able to enable BridgedAp.
573        is_supported = wutils.check_available_channels_in_bands_2_5(
574            self.dut, wutils.WifiEnums.CountryCode.US)
575        asserts.skip_if(not is_supported, "BridgedAp is not supported in {}"
576                        .format(wutils.WifiEnums.CountryCode.US))
577
578        # Enable BridgedAp and verify both 2G,5G instances have been enabled.
579        self.enable_bridged_ap(self.dut,
580                               WifiEnums.SoftApSecurityType.WPA2,
581                               bands=[WifiEnums.WIFI_CONFIG_SOFTAP_BAND_2G,
582                                      WifiEnums.WIFI_CONFIG_SOFTAP_BAND_2G_5G])
583        infos = self.verify_number_band_freq_of_bridged_ap(
584            self.dut, [WifiEnums.WIFI_CONFIG_SOFTAP_BAND_2G,
585                       WifiEnums.WIFI_CONFIG_SOFTAP_BAND_5G], False)
586
587        self.sniffing_bridgedap_channels(infos)
588
589        self.two_clients_connect_to_wifi_network(self.client1, self.client2,
590                                                 self.config)
591        # Trigger client#1 and client#2 ping each other.
592        wutils.validate_ping_between_two_clients(self.client1, self.client2)
593
594        # Restore config
595        wutils.save_wifi_soft_ap_config(self.dut, original_softap_config)
596
597    @test_tracker_info(uuid="ef98a5ea-c7d5-4cc4-a2f8-e5fd44648788")
598    def test_two_clients_ping_bridged_ap_5g_2g_no_security_country_us(self):
599        """Test clients on different instances can ping each other.
600
601        Steps:
602            Refer to test_two_clients_ping_bridged_ap_5g_2g_wpa3_country_us,
603            but this case enable OPEN SoftAp security type.
604        """
605        # Backup config
606        original_softap_config = self.dut.droid.wifiGetApConfiguration()
607        # Make sure DUT is able to enable BridgedAp.
608        is_supported = wutils.check_available_channels_in_bands_2_5(
609            self.dut, wutils.WifiEnums.CountryCode.US)
610        asserts.skip_if(not is_supported, "BridgedAp is not supported in {}"
611                        .format(wutils.WifiEnums.CountryCode.US))
612
613        # Enable BridgedAp and verify both 2G,5G instances have been enabled.
614        self.enable_bridged_ap(self.dut,
615                               WifiEnums.SoftApSecurityType.OPEN,
616                               bands=[WifiEnums.WIFI_CONFIG_SOFTAP_BAND_2G,
617                                      WifiEnums.WIFI_CONFIG_SOFTAP_BAND_2G_5G])
618        infos = self.verify_number_band_freq_of_bridged_ap(
619            self.dut, [WifiEnums.WIFI_CONFIG_SOFTAP_BAND_2G,
620                       WifiEnums.WIFI_CONFIG_SOFTAP_BAND_5G], False)
621
622        self.sniffing_bridgedap_channels(infos)
623
624        self.two_clients_connect_to_wifi_network(self.client1, self.client2,
625                                                 self.config)
626        # Trigger client#1 and client#2 ping each other.
627        wutils.validate_ping_between_two_clients(self.client1, self.client2)
628
629        # Restore config
630        wutils.save_wifi_soft_ap_config(self.dut, original_softap_config)
631
632    @test_tracker_info(uuid="0325ee58-ed8e-489e-9dee-55740406f896")
633    def test_bridged_ap_5g_2g_and_sta_5g_dfs(self):
634        """Test if auto fallback to one single 2G AP mode when
635         BridgedAP enabled and STA connect to a 5G DFS channel.
636
637        Steps:
638            Backup config.
639            DUT enable BridgedAp.
640            start sniffer and sniffing on AP channels.
641            DUT connect to a 5G DFS channel Wi-Fi network.
642            Verify 5G instance is shutdown.
643            Stop sniffers.
644            Restore config.
645        """
646        # Backup config
647        original_softap_config = self.dut.droid.wifiGetApConfiguration()
648
649        # Make sure DUT is able to enable BridgedAp.
650        is_supported = wutils.check_available_channels_in_bands_2_5(
651            self.dut, wutils.WifiEnums.CountryCode.US)
652        asserts.skip_if(not is_supported, "BridgedAp is not supported in {}"
653                        .format(wutils.WifiEnums.CountryCode.US))
654
655        # Enable BridgedAp and verify both 2G,5G instances have been enabled.
656        self.enable_bridged_ap(self.dut,
657                               WifiEnums.SoftApSecurityType.WPA3_SAE,
658                               bands=[WifiEnums.WIFI_CONFIG_SOFTAP_BAND_2G,
659                                      WifiEnums.WIFI_CONFIG_SOFTAP_BAND_2G_5G])
660        self.verify_number_band_freq_of_bridged_ap(
661            self.dut, [WifiEnums.WIFI_CONFIG_SOFTAP_BAND_2G,
662                       WifiEnums.WIFI_CONFIG_SOFTAP_BAND_5G], False)
663
664        self.sniffing_ap_channels(channel1=None, channel2=132)
665        self.start_ap(channel_2g=None, channel_5g=132)
666        wutils.wifi_toggle_state(self.dut, True)
667        wutils.connect_to_wifi_network(self.dut, self.wpa_networks[0][BAND_5G])
668
669        self.verify_number_band_freq_of_bridged_ap(
670            self.dut, [WifiEnums.WIFI_CONFIG_SOFTAP_BAND_2G], False)
671
672        # Restore config
673        wutils.save_wifi_soft_ap_config(self.dut, original_softap_config)
674
675    @test_tracker_info(uuid="9a5d4ca9-67fc-412c-8114-01c43c34a76d")
676    def test_bridged_ap_5g_2g_and_sta_5g_non_dfs(self):
677        """Test 5G scc when BridgedAp enabled and 5G STA.
678
679        Steps:
680            Backup config.
681            DUT enable BridgedAp.
682            start sniffer and sniffing on AP channels.
683            DUT connect to a 5G non-DFS channel Wi-Fi network.
684            Verify STA frequency equals to 5G BridgedAp frequency.
685            Stop sniffers.
686            Restore config.
687        """
688        # Backup config
689        original_softap_config = self.dut.droid.wifiGetApConfiguration()
690
691        # Make sure DUT is able to enable BridgedAp.
692        is_supported = wutils.check_available_channels_in_bands_2_5(
693            self.dut, wutils.WifiEnums.CountryCode.US)
694        asserts.skip_if(not is_supported, "BridgedAp is not supported in {}"
695                        .format(wutils.WifiEnums.CountryCode.US))
696
697        # Enable BridgedAp and verify both 2G,5G instances have been enabled.
698        self.enable_bridged_ap(self.dut,
699                               WifiEnums.SoftApSecurityType.WPA3_SAE,
700                               bands=[WifiEnums.WIFI_CONFIG_SOFTAP_BAND_2G,
701                                      WifiEnums.WIFI_CONFIG_SOFTAP_BAND_2G_5G])
702        self.verify_number_band_freq_of_bridged_ap(
703            self.dut, [WifiEnums.WIFI_CONFIG_SOFTAP_BAND_2G,
704                       WifiEnums.WIFI_CONFIG_SOFTAP_BAND_5G], False)
705
706        self.sniffing_ap_channels(channel1=None, channel2=36)
707        self.start_ap(channel_2g=None, channel_5g=36)
708        wutils.wifi_toggle_state(self.dut, True)
709        wutils.connect_to_wifi_network(self.dut, self.wpa_networks[0][BAND_5G])
710
711        self.verify_number_band_freq_of_bridged_ap(
712            self.dut, [WifiEnums.WIFI_CONFIG_SOFTAP_BAND_2G,
713                       WifiEnums.WIFI_CONFIG_SOFTAP_BAND_5G], True)
714
715        # Restore config
716        wutils.save_wifi_soft_ap_config(self.dut, original_softap_config)
717
718    @test_tracker_info(uuid="e26e8a72-3e21-47b3-8fd8-4c4db5fb2573")
719    def test_bridged_ap_5g_2g_and_sta_2g(self):
720        """ Test 2G SCC when BridgedAp enable and 2G STA.
721
722        Steps:
723            Backup config.
724            DUT enable BridgedAp.
725            start sniffer and sniffing on AP channels.
726            STA connect to a 2G Wi-Fi network.
727            Verify STA frequency equals to 2G BridgedAp frequency.
728            Stop sniffers.
729            Restore config.
730        """
731        # Backup config
732        original_softap_config = self.dut.droid.wifiGetApConfiguration()
733
734        # Make sure DUT is able to enable BridgedAp.
735        is_supported = wutils.check_available_channels_in_bands_2_5(
736            self.dut, wutils.WifiEnums.CountryCode.US)
737        asserts.skip_if(not is_supported, "BridgedAp is not supported in {}"
738                        .format(wutils.WifiEnums.CountryCode.US))
739
740        # Enable BridgedAp and verify both 2G,5G instances have been enabled.
741        self.enable_bridged_ap(self.dut,
742                               WifiEnums.SoftApSecurityType.WPA3_SAE,
743                               bands=[WifiEnums.WIFI_CONFIG_SOFTAP_BAND_2G,
744                                      WifiEnums.WIFI_CONFIG_SOFTAP_BAND_2G_5G])
745        self.verify_number_band_freq_of_bridged_ap(
746            self.dut, [WifiEnums.WIFI_CONFIG_SOFTAP_BAND_2G,
747                       WifiEnums.WIFI_CONFIG_SOFTAP_BAND_5G], False)
748
749        self.sniffing_ap_channels(channel1=6, channel2=None)
750        self.start_ap(channel_2g=6, channel_5g=None)
751        wutils.wifi_toggle_state(self.dut, True)
752        wutils.connect_to_wifi_network(self.dut, self.wpa_networks[0][BAND_2G])
753
754        self.verify_number_band_freq_of_bridged_ap(
755            self.dut, [WifiEnums.WIFI_CONFIG_SOFTAP_BAND_2G,
756                       WifiEnums.WIFI_CONFIG_SOFTAP_BAND_5G], True)
757
758        # Restore config
759        wutils.save_wifi_soft_ap_config(self.dut, original_softap_config)
760
761    @test_tracker_info(uuid="b25f710a-2e53-456e-8280-dcdd37badd6c")
762    def test_sta_5g_dfs_and_bridged_ap_5g_2g(self):
763        """Test auto fallback to Single AP mode
764           when STA connect to a DFS channel.
765
766        Steps:
767            Backup config.
768            start sniffer and sniffing on AP channels.
769            Enable a Wi-Fi network.
770            DUT connect to a 5G DFS channel Wi-Fi network.
771            DUT enable BridgedAp.
772            Verify 5G instance is shutdown and only 2G instance enabled.
773            Stop sniffers.
774            Restore config.
775        """
776        # Backup config
777        original_softap_config = self.dut.droid.wifiGetApConfiguration()
778
779        # Make sure DUT is able to enable BridgedAp.
780        is_supported = wutils.check_available_channels_in_bands_2_5(
781            self.dut, wutils.WifiEnums.CountryCode.US)
782        asserts.skip_if(not is_supported, "BridgedAp is not supported in {}"
783                        .format(wutils.WifiEnums.CountryCode.US))
784
785        self.sniffing_ap_channels(channel1=None, channel2=132)
786        self.start_ap(channel_2g=None, channel_5g=132)
787        wutils.wifi_toggle_state(self.dut, True)
788        wutils.connect_to_wifi_network(self.dut, self.wpa_networks[0][BAND_5G])
789
790        # Enable BridgedAp
791        self.enable_bridged_ap(self.dut,
792                               WifiEnums.SoftApSecurityType.WPA3_SAE,
793                               bands=[WifiEnums.WIFI_CONFIG_SOFTAP_BAND_2G,
794                                      WifiEnums.WIFI_CONFIG_SOFTAP_BAND_2G_5G])
795        # # Verify only 2G instance enabled.
796        self.verify_number_band_freq_of_bridged_ap(
797            self.dut, [WifiEnums.WIFI_CONFIG_SOFTAP_BAND_2G], False)
798
799        # Restore config
800        wutils.save_wifi_soft_ap_config(self.dut, original_softap_config)
801
802    @test_tracker_info(uuid="6acaed3f-616f-4a03-a329-702e6cc537bd")
803    def test_sta_5g_non_dfs_and_bridged_ap_5g_2g(self):
804        """Test 5G scc when 5G STA and BridgedAp enabled.
805
806        Steps:
807            Backup config.
808            start sniffer and sniffing on AP channels.
809            Enable a Wi-Fi network.
810            DUT connect to a 5G non-DFS channel Wi-Fi network.
811            DUT enable BridgedAp.
812            Verify STA frequency equals to 5G BridgedAp frequency.
813            Stop sniffers.
814            Restore config.
815        """
816        # Backup config
817        original_softap_config = self.dut.droid.wifiGetApConfiguration()
818
819        # Make sure DUT is able to enable BridgedAp.
820        is_supported = wutils.check_available_channels_in_bands_2_5(
821            self.dut, wutils.WifiEnums.CountryCode.US)
822        asserts.skip_if(not is_supported, "BridgedAp is not supported in {}"
823                        .format(wutils.WifiEnums.CountryCode.US))
824
825        self.sniffing_ap_channels(channel1=None, channel2=36)
826        self.start_ap(channel_2g=None, channel_5g=36)
827        wutils.wifi_toggle_state(self.dut, True)
828        wutils.connect_to_wifi_network(self.dut, self.wpa_networks[0][BAND_5G])
829
830        # Enable BridgedAp and verify both 2G,5G instances have been enabled.
831        self.enable_bridged_ap(self.dut,
832                               WifiEnums.SoftApSecurityType.WPA3_SAE,
833                               bands=[WifiEnums.WIFI_CONFIG_SOFTAP_BAND_2G,
834                                      WifiEnums.WIFI_CONFIG_SOFTAP_BAND_2G_5G])
835        # Verify STA frequency equals to 5G BridgedAp frequency.
836        self.verify_number_band_freq_of_bridged_ap(
837            self.dut, [WifiEnums.WIFI_CONFIG_SOFTAP_BAND_2G,
838                       WifiEnums.WIFI_CONFIG_SOFTAP_BAND_5G], True)
839
840        # Restore config
841        wutils.save_wifi_soft_ap_config(self.dut, original_softap_config)
842
843    @test_tracker_info(uuid="e24e7f2d-f1d5-4dc7-aa6a-487677864d1d")
844    def test_sta_2g_and_bridged_ap_5g_2g(self):
845        """ Test 2G SCC when 2G STA and BridgedAp enable.
846
847        Steps:
848            Backup config.
849            start sniffer and sniffing on AP channels.
850            Enable a Wi-Fi network.
851            DUT connect to a 2G Wi-Fi network.
852            DUT enable BridgedAp.
853            Verify STA frequency equals to 2G BridgedAp frequency.
854            Stop sniffers.
855            Restore config.
856        """
857        # Backup config
858        original_softap_config = self.dut.droid.wifiGetApConfiguration()
859
860        # Make sure DUT is able to enable BridgedAp.
861        is_supported = wutils.check_available_channels_in_bands_2_5(
862            self.dut, wutils.WifiEnums.CountryCode.US)
863        asserts.skip_if(not is_supported, "BridgedAp is not supported in {}"
864                        .format(wutils.WifiEnums.CountryCode.US))
865
866        self.sniffing_ap_channels(channel1=6, channel2=None)
867        self.start_ap(channel_2g=6, channel_5g=None)
868        wutils.wifi_toggle_state(self.dut, True)
869        wutils.connect_to_wifi_network(self.dut, self.wpa_networks[0][BAND_2G])
870
871        # Enable BridgedAp and verify both 2G,5G instances have been enabled.
872        self.enable_bridged_ap(self.dut,
873                               WifiEnums.SoftApSecurityType.WPA3_SAE,
874                               bands=[WifiEnums.WIFI_CONFIG_SOFTAP_BAND_2G,
875                                      WifiEnums.WIFI_CONFIG_SOFTAP_BAND_2G_5G])
876        self.verify_number_band_freq_of_bridged_ap(
877            self.dut, [WifiEnums.WIFI_CONFIG_SOFTAP_BAND_2G,
878                       WifiEnums.WIFI_CONFIG_SOFTAP_BAND_5G], True)
879
880        # Restore config
881        wutils.save_wifi_soft_ap_config(self.dut, original_softap_config)
882
883    @test_tracker_info(uuid="927d564d-2ac4-4e6f-bb36-270efd519e0b")
884    def test_bridged_ap_5g_2g_shutdown_5g_2g_no_client(self):
885        """Test the BridgeAp shutdown mechanism with no client connect to it.
886
887        Steps:
888            Backup config.
889            DUT turns ON BridgedAp.
890            Verify no client connect to the BridgedAp.
891            Wait for 5 minutes.
892            Verify that 5G BridgedAp instance is shutdown.
893            Maks sure there is still no client connect to the BridgedAp.
894            Wait for 5 minutes.
895            Verify that 2G BridgedAp instance is shutdown.
896            Restore config.
897        """
898        # Backup config
899        original_softap_config = self.dut.droid.wifiGetApConfiguration()
900
901        # Make sure DUT is able to enable BridgedAp.
902        is_supported = wutils.check_available_channels_in_bands_2_5(
903            self.dut, wutils.WifiEnums.CountryCode.US)
904        asserts.skip_if(not is_supported, "BridgedAp is not supported in {}"
905                        .format(wutils.WifiEnums.CountryCode.US))
906
907        # Enable BridgedAp and verify both 2G,5G instances have been enabled.
908        self.enable_bridged_ap(self.dut,
909                               WifiEnums.SoftApSecurityType.WPA3_SAE,
910                               bands=[WifiEnums.WIFI_CONFIG_SOFTAP_BAND_2G,
911                                      WifiEnums.WIFI_CONFIG_SOFTAP_BAND_2G_5G])
912        infos = self.verify_number_band_freq_of_bridged_ap(
913            self.dut, [WifiEnums.WIFI_CONFIG_SOFTAP_BAND_2G,
914                       WifiEnums.WIFI_CONFIG_SOFTAP_BAND_5G], False)
915
916        # No client connection, wait 5 minutes, verify 5G is shutdown.
917        self.verify_expected_number_of_softap_clients(self.dut, 0)
918        self.wait_interval(BRIDGED_AP_SHUTDOWN_INTERVAL_5_MINUTES)
919        self.verify_number_band_freq_of_bridged_ap(
920            self.dut, [WifiEnums.WIFI_CONFIG_SOFTAP_BAND_2G], False)
921        # No client connection, wait 5 minutes, verify 2G is shutdown.
922        self.verify_expected_number_of_softap_clients(self.dut, 0)
923        self.wait_interval(BRIDGED_AP_SHUTDOWN_INTERVAL_5_MINUTES)
924
925        self.verify_number_band_freq_of_bridged_ap(self.dut, [], False)
926
927        # Restore config
928        wutils.save_wifi_soft_ap_config(self.dut, original_softap_config)
929
930    @test_tracker_info(uuid="4c5b210c-412f-40e4-84b6-2a12dbffa017")
931    def test_bridged_ap_5g_2g_shutdown_5g_auto_shutdown_2g(self):
932        """Test the BridgeAp shutdown mechanism with no client connect to it.
933
934        Steps:
935            Backup config.
936            DUT turns ON BridgedAp.
937            start sniffer and sniffing on BridgedAp channels.
938            Verify no client connect to the BridgedAp.
939            Wait for 5 minutes.
940            Verify that 5G BridgedAp instance is shutdown.
941            A client connect to the 2G BridgedAp.
942            The client disconnect from 2G BridgedAp.
943            Wait for 10 minutes.
944            Verify 2G BridgedAp is shutdown, no BridgedAp instance enabled.
945            Stop sniffers.
946            Restore config.
947        """
948        # Backup config
949        original_softap_config = self.dut.droid.wifiGetApConfiguration()
950
951        # Make sure DUT is able to enable BridgedAp.
952        is_supported = wutils.check_available_channels_in_bands_2_5(
953            self.dut, wutils.WifiEnums.CountryCode.US)
954        asserts.skip_if(not is_supported, "BridgedAp is not supported in {}"
955                        .format(wutils.WifiEnums.CountryCode.US))
956
957        # Enable BridgedAp and verify both 2G,5G instances have been enabled.
958        self.enable_bridged_ap(self.dut,
959                               WifiEnums.SoftApSecurityType.WPA3_SAE,
960                               bands=[WifiEnums.WIFI_CONFIG_SOFTAP_BAND_2G,
961                                      WifiEnums.WIFI_CONFIG_SOFTAP_BAND_2G_5G])
962        infos = self.verify_number_band_freq_of_bridged_ap(
963            self.dut, [WifiEnums.WIFI_CONFIG_SOFTAP_BAND_2G,
964                       WifiEnums.WIFI_CONFIG_SOFTAP_BAND_5G], False)
965
966        self.sniffing_bridgedap_channels(infos)
967
968        # Verify no connection to BridgedAp, wait for 5 mins, 5G shutdown.
969        self.verify_expected_number_of_softap_clients(self.dut, 0)
970        self.wait_interval(BRIDGED_AP_SHUTDOWN_INTERVAL_5_MINUTES)
971        self.verify_number_band_freq_of_bridged_ap(
972            self.dut, [WifiEnums.WIFI_CONFIG_SOFTAP_BAND_2G], False)
973
974        # A client connect to 2G BridgedAp instance.
975        callbackId = self.dut.droid.registerSoftApCallback()
976        infos = wutils.get_current_softap_infos(self.dut, callbackId, True)
977        self.dut.droid.unregisterSoftApCallback(callbackId)
978        bssid_2g = infos[0][wifi_constants.SOFTAP_INFO_BSSID_CALLBACK_KEY]
979        config_2g = self.config.copy()
980        config_2g[WifiEnums.BSSID_KEY] = bssid_2g
981        wutils.connect_to_wifi_network(self.client1, config_2g,
982                                       check_connectivity=False)
983        self.wait_interval(BRIDGED_AP_SHUTDOWN_INTERVAL_5_SECONDS)
984
985        # Client disconnect From 2G BridgedAp instance.
986        is_disconnect = self.client1.droid.wifiDisconnect()
987        self.client1.log.info("Disconnected from SoftAp")
988        if not is_disconnect:
989            raise signals.TestFailure("Wi-Fi is not disconnected as expect")
990        wutils.reset_wifi(self.client1)
991
992        # Verify 2G instance is still enabled.
993        self.wait_interval(INTERVAL_9_MINUTES)
994        self.verify_number_band_freq_of_bridged_ap(
995            self.dut, [WifiEnums.WIFI_CONFIG_SOFTAP_BAND_2G], False)
996
997        # Verify all BridgedAp instances are shutdown after 10 minutes.
998        self.wait_interval(INTERVAL_1_MINUTES)
999        self.verify_number_band_freq_of_bridged_ap(self.dut, [], False)
1000
1001        # Restore config
1002        wutils.save_wifi_soft_ap_config(self.dut, original_softap_config)
1003
1004    @test_tracker_info(uuid="2b1b4579-d610-4983-83f4-5fc34b3cdd6b")
1005    def test_bridged_ap_5g_2g_shutdown_5g_auto_shutdown_2g_after_10_mins(self):
1006        """Test the BridgeAp shutdown mechanism with no client connect to it.
1007
1008        Steps:
1009            Backup config.
1010            DUT turns ON BridgedAp.
1011            start sniffer and sniffing on BridgedAp channels.
1012            Verify no client connect to the BridgedAp.
1013            Wait for 5 minutes.
1014            Verify that 5G BridgedAp instance is shutdown.
1015            A client connect to the 2G BridgedAp at 7th minutes.
1016            The client disconnect from 2G BridgedAp at 9th minutes.
1017            Wait for 10 minutes.
1018            Verify 2G BridgedAp is shutdown, no BridgedAp instance enabled.
1019            Stop sniffers.
1020            Restore config.
1021        """
1022        # Backup config
1023        original_softap_config = self.dut.droid.wifiGetApConfiguration()
1024
1025        # Make sure DUT is able to enable BridgedAp.
1026        is_supported = wutils.check_available_channels_in_bands_2_5(
1027            self.dut, wutils.WifiEnums.CountryCode.US)
1028        asserts.skip_if(not is_supported, "BridgedAp is not supported in {}"
1029                        .format(wutils.WifiEnums.CountryCode.US))
1030
1031        # Enable BridgedAp and verify both 2G,5G instances have been enabled.
1032        self.enable_bridged_ap(self.dut,
1033                               WifiEnums.SoftApSecurityType.WPA3_SAE,
1034                               bands=[WifiEnums.WIFI_CONFIG_SOFTAP_BAND_2G,
1035                                      WifiEnums.WIFI_CONFIG_SOFTAP_BAND_2G_5G],
1036                               bridged_opportunistic_shutdown_enabled=True,
1037                               shutdown_timeout_enable=True)
1038        infos = self.verify_number_band_freq_of_bridged_ap(
1039            self.dut, [WifiEnums.WIFI_CONFIG_SOFTAP_BAND_2G,
1040                       WifiEnums.WIFI_CONFIG_SOFTAP_BAND_5G], False)
1041
1042        self.sniffing_bridgedap_channels(infos)
1043
1044        self.verify_expected_number_of_softap_clients(self.dut, 0)
1045        self.wait_interval(BRIDGED_AP_SHUTDOWN_INTERVAL_5_MINUTES)
1046        self.verify_number_band_freq_of_bridged_ap(
1047            self.dut, [WifiEnums.WIFI_CONFIG_SOFTAP_BAND_2G], False)
1048
1049        # Client connects to 2G instance at 7th mins.
1050        self.wait_interval(INTERVAL_2_MINUTES)
1051        callbackId = self.dut.droid.registerSoftApCallback()
1052        infos = wutils.get_current_softap_infos(self.dut, callbackId, True)
1053        self.dut.droid.unregisterSoftApCallback(callbackId)
1054        bssid_2g = infos[0][wifi_constants.SOFTAP_INFO_BSSID_CALLBACK_KEY]
1055        config_2g = self.config.copy()
1056        config_2g[WifiEnums.BSSID_KEY] = bssid_2g
1057        wutils.connect_to_wifi_network(self.client1, config_2g,
1058                                       check_connectivity=False)
1059        self.wait_interval(BRIDGED_AP_SHUTDOWN_INTERVAL_5_SECONDS)
1060
1061        # Client disconnect From 2G BridgedAp instance at 9th mins.
1062        self.wait_interval(INTERVAL_2_MINUTES)
1063        is_disconnect = self.client1.droid.wifiDisconnect()
1064        self.client1.log.info("Disconnected from SoftAp")
1065        if not is_disconnect:
1066            raise signals.TestFailure("Wi-Fi is not disconnected as expect")
1067        wutils.reset_wifi(self.client1)
1068
1069        # Make sure 2G instance is still enabled.
1070        self.wait_interval(INTERVAL_9_MINUTES)
1071        self.verify_number_band_freq_of_bridged_ap(
1072            self.dut, [WifiEnums.WIFI_CONFIG_SOFTAP_BAND_2G], False)
1073
1074        self.wait_interval(INTERVAL_1_MINUTES)
1075        self.verify_number_band_freq_of_bridged_ap(self.dut, [], False)
1076
1077        # Restore config
1078        wutils.save_wifi_soft_ap_config(self.dut, original_softap_config)
1079
1080    @test_tracker_info(uuid="1785a487-dd95-4c17-852d-3c9b7b7dd4c3")
1081    def test_bridged_ap_5g_2g_fallback_2g_country_jp(self):
1082        """Test BridgedAp fallback to Single AP mode with JP country code.
1083
1084        Steps:
1085            Backup config.
1086            Set DUT country code to "JP".
1087            DUT turns ON BridgedAp.
1088            Verify only 2G BridgedAp instance is enabled.
1089            Restore config.
1090        """
1091        # Backup config
1092        original_softap_config = self.dut.droid.wifiGetApConfiguration()
1093
1094        # Set country code to JP and enable BridgedAp
1095        self.set_country_code_and_verify(self.dut, WifiEnums.CountryCode.JAPAN)
1096
1097        # Enable BridgedAp
1098        self.enable_bridged_ap(self.dut,
1099                               WifiEnums.SoftApSecurityType.WPA3_SAE,
1100                               bands=[WifiEnums.WIFI_CONFIG_SOFTAP_BAND_2G,
1101                                      WifiEnums.WIFI_CONFIG_SOFTAP_BAND_2G_5G])
1102        # Verify only 2G BridgedAp instance enabled.
1103        infos = self.verify_number_band_freq_of_bridged_ap(
1104            self.dut, [WifiEnums.WIFI_CONFIG_SOFTAP_BAND_2G], False)
1105        self.sniffing_bridgedap_channels(infos)
1106
1107        # Restore config
1108        wutils.save_wifi_soft_ap_config(self.dut, original_softap_config)
1109
1110    @test_tracker_info(uuid="b5c7c6df-b181-4bba-a7b3-48fad0d7fa98")
1111    def test_bridged_ap_5g_2g_shutdown_2g_after_5_minutes(self):
1112        """Test the BridgeAp shutdown mechanism.
1113
1114        Steps:
1115            Backup config.
1116            DUT turns ON BridgedAp.
1117            start sniffer and sniffing on BridgedAp channels.
1118            A Client connect to BridgeAp 5G instance.
1119            Wait for 5 minutes.
1120            Verify 2G instance is shutdown and only 5G instance exists.
1121            Stop sniffers.
1122            Restore config."""
1123        # Backup config
1124        original_softap_config = self.dut.droid.wifiGetApConfiguration()
1125
1126        # Make sure DUT is able to enable BridgedAp.
1127        is_supported = wutils.check_available_channels_in_bands_2_5(
1128            self.dut, wutils.WifiEnums.CountryCode.US)
1129        asserts.skip_if(not is_supported, "BridgedAp is not supported in {}"
1130                        .format(wutils.WifiEnums.CountryCode.US))
1131
1132        # Enable BridgedAp and verify both 2G,5G instances have been enabled.
1133        self.enable_bridged_ap(self.dut,
1134                               WifiEnums.SoftApSecurityType.WPA3_SAE,
1135                               bands=[WifiEnums.WIFI_CONFIG_SOFTAP_BAND_2G,
1136                                      WifiEnums.WIFI_CONFIG_SOFTAP_BAND_2G_5G])
1137        infos = self.verify_number_band_freq_of_bridged_ap(
1138            self.dut, [WifiEnums.WIFI_CONFIG_SOFTAP_BAND_2G,
1139                       WifiEnums.WIFI_CONFIG_SOFTAP_BAND_5G], False)
1140
1141        self.sniffing_bridgedap_channels(infos)
1142
1143        # Client connects to the 5G BridgedAp instance.
1144        self.client_connects_to_a_bridgeap(self.client1, BAND_5G)
1145        self.wait_interval(BRIDGED_AP_SHUTDOWN_INTERVAL_5_MINUTES)
1146        # Verify there is only one client connects to the BridgedAp.
1147        self.verify_expected_number_of_softap_clients(self.dut, 1)
1148        # Verify the BridgedAp instance is 5G.
1149        self.verify_number_band_freq_of_bridged_ap(
1150            self.dut, [WifiEnums.WIFI_CONFIG_SOFTAP_BAND_5G], False)
1151        # Restore config
1152        wutils.save_wifi_soft_ap_config(self.dut, original_softap_config)
1153
1154    @test_tracker_info(uuid="683b2c7f-7f24-4324-be09-0b6554d5d7a8")
1155    def test_bridged_ap_5g_2g_shutdown_5g_after_5_minutes(self):
1156        """Test the BridgeAp shutdown mechanism.
1157
1158        Steps:
1159            Backup config.
1160            DUT turns ON BridgedAp.
1161            start sniffer and sniffing on BridgedAp channels.
1162            A Client connect to BridgeAp 2G instance.
1163            Wait for 5 minutes.
1164            Verify 5G instance is shutdown and only 2G instance exists.
1165            Stop sniffers.
1166            Restore config."""
1167        # Backup config
1168        original_softap_config = self.dut.droid.wifiGetApConfiguration()
1169
1170        # Make sure DUT is able to enable BridgedAp.
1171        is_supported = wutils.check_available_channels_in_bands_2_5(
1172            self.dut, wutils.WifiEnums.CountryCode.US)
1173        asserts.skip_if(not is_supported, "BridgedAp is not supported in {}"
1174                        .format(wutils.WifiEnums.CountryCode.US))
1175
1176        # Enable BridgedAp and verify both 2G,5G instances have been enabled.
1177        self.enable_bridged_ap(self.dut,
1178                               WifiEnums.SoftApSecurityType.WPA3_SAE,
1179                               bands=[WifiEnums.WIFI_CONFIG_SOFTAP_BAND_2G,
1180                                      WifiEnums.WIFI_CONFIG_SOFTAP_BAND_2G_5G])
1181        infos = self.verify_number_band_freq_of_bridged_ap(
1182            self.dut, [WifiEnums.WIFI_CONFIG_SOFTAP_BAND_2G,
1183                       WifiEnums.WIFI_CONFIG_SOFTAP_BAND_5G], False)
1184        self.sniffing_bridgedap_channels(infos)
1185
1186        # Client connects to the 2G BridgedAp instance.
1187        self.client_connects_to_a_bridgeap(self.client1, BAND_2G)
1188        self.wait_interval(BRIDGED_AP_SHUTDOWN_INTERVAL_5_MINUTES)
1189        # Verify there is only one client connects to the BridgedAp.
1190        self.verify_expected_number_of_softap_clients(self.dut, 1)
1191        # Verify the BridgedAp instance is 2G.
1192        self.verify_number_band_freq_of_bridged_ap(
1193            self.dut, [WifiEnums.WIFI_CONFIG_SOFTAP_BAND_2G], False)
1194        # Restore config
1195        wutils.save_wifi_soft_ap_config(self.dut, original_softap_config)
1196
1197    @test_tracker_info(uuid="6de46e5b-04c3-4fba-a21d-e914a3e34e24")
1198    def test_bridged_ap_5g_2g_no_shutdown_after_5_minutes(self):
1199        """Test clients on different instances can ping each other.
1200
1201        Steps:
1202            Backup config.
1203            Make sure clients support WPA3 SAE.
1204            Make sure DUT is able to enable BridgedAp.
1205            Enable BridgedAp with bridged configuration.
1206            RegisterSoftApCallback.
1207            Check the bridged AP enabled succeed.
1208            start sniffer and sniffing on BridgedAp channels.
1209            Client#1 connect to 5G instance.
1210            Client#2 connect to 2G instance.
1211            Wait for 5 minutes.
1212            Verify both 2G/5G BridgedAp instances are exist.
1213            Stop sniffers.
1214            Restore config.
1215        """
1216        # Backup config
1217        original_softap_config = self.dut.droid.wifiGetApConfiguration()
1218        # Make sure clients support WPA3 SAE.
1219        self.verify_clients_support_wpa3_sae(self.client1, self.client2)
1220        # Make sure DUT is able to enable BridgedAp.
1221        is_supported = wutils.check_available_channels_in_bands_2_5(
1222            self.dut, wutils.WifiEnums.CountryCode.US)
1223        asserts.skip_if(not is_supported, "BridgedAp is not supported in {}"
1224                        .format(wutils.WifiEnums.CountryCode.US))
1225
1226        # Enable BridgedAp and verify both 2G,5G instances have been enabled.
1227        self.enable_bridged_ap(self.dut,
1228                               WifiEnums.SoftApSecurityType.WPA3_SAE,
1229                               bands=[WifiEnums.WIFI_CONFIG_SOFTAP_BAND_2G,
1230                                      WifiEnums.WIFI_CONFIG_SOFTAP_BAND_2G_5G])
1231        infos = self.verify_number_band_freq_of_bridged_ap(
1232            self.dut, [WifiEnums.WIFI_CONFIG_SOFTAP_BAND_2G,
1233                       WifiEnums.WIFI_CONFIG_SOFTAP_BAND_5G], False)
1234
1235        self.sniffing_bridgedap_channels(infos)
1236
1237        self.two_clients_connect_to_wifi_network(self.client1, self.client2,
1238                                                 self.config)
1239        self.wait_interval(BRIDGED_AP_SHUTDOWN_INTERVAL_5_MINUTES)
1240        # Verify there are two clients connect to the BridgedAp.
1241        self.verify_expected_number_of_softap_clients(self.dut, 2)
1242        # Verify both 2G/5G BridgedAp instances are exist.
1243        self.verify_number_band_freq_of_bridged_ap(
1244            self.dut, [WifiEnums.WIFI_CONFIG_SOFTAP_BAND_2G,
1245                       WifiEnums.WIFI_CONFIG_SOFTAP_BAND_5G], False)
1246        # Restore config
1247        wutils.save_wifi_soft_ap_config(self.dut, original_softap_config)
1248
1249    @test_tracker_info(uuid="f8742dfb-5232-4fe8-b568-3a99a9356d59")
1250    def test_bridged_ap_5g_2g_extend_compatibility_on_no_shutdown_5g(self):
1251        """Test BridgedAp mechanism when "Extend compatibility is ON.
1252
1253        Steps:
1254            Backup config.
1255            Make sure clients support WPA3 SAE.
1256            Make sure DUT is able to enable BridgedAp.
1257            Enable BridgedAp with Extend compatibility is ON.
1258            RegisterSoftApCallback.
1259            Check the bridged AP enabled succeed.
1260            start sniffer and sniffing on BridgedAp channels.
1261            Client#1 connect to 2G.
1262            Verify both 2G/5G instances are exist.
1263            Stop sniffers.
1264            Restore config.
1265        """
1266        # Backup config
1267        original_softap_config = self.dut.droid.wifiGetApConfiguration()
1268        # Make sure clients support WPA3 SAE.
1269        self.verify_clients_support_wpa3_sae(self.client1, self.client2)
1270        # Make sure DUT is able to enable BridgedAp.
1271        is_supported = wutils.check_available_channels_in_bands_2_5(
1272            self.dut, wutils.WifiEnums.CountryCode.US)
1273        asserts.skip_if(not is_supported, "BridgedAp is not supported in {}"
1274                        .format(wutils.WifiEnums.CountryCode.US))
1275        # Enable BridgedAp with "Extend compatibility set to ON".
1276        self.enable_bridged_ap(self.dut,
1277                               WifiEnums.SoftApSecurityType.WPA3_SAE,
1278                               bands=[WifiEnums.WIFI_CONFIG_SOFTAP_BAND_2G,
1279                                      WifiEnums.WIFI_CONFIG_SOFTAP_BAND_2G_5G],
1280                               bridged_opportunistic_shutdown_enabled=False)
1281        # Client connects to the 2G BridgedAp instance and wait 5 minutes.
1282        self.client_connects_to_a_bridgeap(self.client1, BAND_2G)
1283        self.wait_interval(BRIDGED_AP_SHUTDOWN_INTERVAL_5_MINUTES)
1284        # Verify both 2G/5G BridgedAp instances exist.
1285        self.verify_number_band_freq_of_bridged_ap(
1286            self.dut, [WifiEnums.WIFI_CONFIG_SOFTAP_BAND_2G,
1287                       WifiEnums.WIFI_CONFIG_SOFTAP_BAND_5G], False)
1288        # Restore config
1289        wutils.save_wifi_soft_ap_config(self.dut, original_softap_config)
1290
1291    @test_tracker_info(uuid="050f8dd8-ed38-4f7a-87a9-9dbdade58cc7")
1292    def test_bridged_ap_5g_2g_extend_compatibility_on_no_shutdown_2g(self):
1293        """Test BridgedAp mechanism when "Extend compatibility is ON.
1294
1295        Steps:
1296            Backup config.
1297            Make sure clients support WPA3 SAE.
1298            Make sure DUT is able to enable BridgedAp.
1299            Enable BridgedAp with Extend compatibility is ON.
1300            RegisterSoftApCallback.
1301            Check the bridged AP enabled succeed.
1302            start sniffer and sniffing on BridgedAp channels.
1303            Client#1 connect to 5G.
1304            Verify both 2G/5G instances are exist.
1305            Stop sniffers.
1306            Restore config.
1307        """
1308        # Backup config
1309        original_softap_config = self.dut.droid.wifiGetApConfiguration()
1310        # Make sure clients support WPA3 SAE.
1311        self.verify_clients_support_wpa3_sae(self.client1, self.client2)
1312        # Make sure DUT is able to enable BridgedAp.
1313        is_supported = wutils.check_available_channels_in_bands_2_5(
1314            self.dut, wutils.WifiEnums.CountryCode.US)
1315        asserts.skip_if(not is_supported, "BridgedAp is not supported in {}"
1316                        .format(wutils.WifiEnums.CountryCode.US))
1317        # Enable BridgedAp with "Extend compatibility set to ON".
1318        self.enable_bridged_ap(self.dut,
1319                               WifiEnums.SoftApSecurityType.WPA3_SAE,
1320                               bands=[WifiEnums.WIFI_CONFIG_SOFTAP_BAND_2G,
1321                                      WifiEnums.WIFI_CONFIG_SOFTAP_BAND_2G_5G],
1322                               bridged_opportunistic_shutdown_enabled=False)
1323        # Client connects to the 5G BridgedAp instance and wait 5 minutes.
1324        self.client_connects_to_a_bridgeap(self.client1, BAND_5G)
1325        self.wait_interval(BRIDGED_AP_SHUTDOWN_INTERVAL_5_MINUTES)
1326        # Verify both 2G/5G BridgedAp instances exist.
1327        self.verify_number_band_freq_of_bridged_ap(
1328            self.dut, [WifiEnums.WIFI_CONFIG_SOFTAP_BAND_2G,
1329                       WifiEnums.WIFI_CONFIG_SOFTAP_BAND_5G], False)
1330        # Restore config
1331        wutils.save_wifi_soft_ap_config(self.dut, original_softap_config)
1332