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 = ["cnss_diag_file", "pixel_models"] 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