1#!/usr/bin/env python3.4 2# 3# Copyright 2018 - 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 17import time 18from acts.test_decorators import test_tracker_info 19from acts_contrib.test_utils.power import PowerWiFiBaseTest as PWBT 20from acts_contrib.test_utils.wifi import wifi_power_test_utils as wputils 21from acts.controllers import packet_sender as pkt_utils 22from acts.controllers.adb_lib.error import AdbCommandError 23 24RA_SHORT_LIFETIME = 3 25RA_LONG_LIFETIME = 1000 26DNS_LONG_LIFETIME = 300 27DNS_SHORT_LIFETIME = 3 28 29 30class PowerWiFimulticastTest(PWBT.PowerWiFiBaseTest): 31 def setup_class(self): 32 super().setup_class() 33 self.unpack_userparams(sub_mask="255.255.255.0", 34 mac_dst="get_from_dut", 35 mac_src="get_local", 36 ipv4_dst="get_from_dut", 37 ipv4_src="get_local", 38 ipv6_dst="get_from_dut", 39 ipv6_src="get_local", 40 ipv6_src_type="LINK_LOCAL", 41 ipv4_gwt="192.168.1.1", 42 mac_dst_fake="40:90:28:EF:4B:20", 43 ipv4_dst_fake="192.168.1.60", 44 ipv6_dst_fake="fe80::300f:40ee:ee0a:5000", 45 interval=1) 46 47 def set_connection(self): 48 """Setup connection between AP and client. 49 50 Setup connection between AP and phone, change DTIMx1 and get information 51 such as IP addresses to prepare packet construction. 52 53 """ 54 attrs = ['screen_status', 'wifi_band'] 55 indices = [2, 4] 56 self.decode_test_configs(attrs, indices) 57 # Change DTIMx1 on the phone to receive all Multicast packets 58 59 # Starts from P21 device, the dtim setting method is changed to use adb. 60 # If no file match '/vendor/firmware/wlan/*/*.ini', use adb to change 61 # the dtim. 62 change_dtim_with_adb = False 63 try: 64 self.dut.adb.shell('ls /vendor/firmware/wlan/*/*.ini') 65 except AdbCommandError as e: 66 change_dtim_with_adb = True 67 68 if not change_dtim_with_adb: 69 # Initialize the dut to rock-bottom state 70 rebooted = wputils.change_dtim( 71 self.dut, 72 gEnableModulatedDTIM=1, 73 gMaxLIModulatedDTIM=10) 74 if rebooted: 75 self.dut_rockbottom() 76 self.dut.log.info('DTIM value of the phone is now DTIMx1') 77 78 self.setup_ap_connection( 79 self.main_network[self.test_configs.wifi_band]) 80 # Wait for DHCP with timeout of 60 seconds 81 wputils.wait_for_dhcp(self.pkt_sender.interface) 82 83 if change_dtim_with_adb: 84 self.dut.log.info('No ini file for dtim, change dtim with adb') 85 wputils.change_dtim_adb(self.dut, gEnableModulatedDTIM=1) 86 87 # Set the desired screen status 88 if self.test_configs.screen_status == 'OFF': 89 self.dut.droid.goToSleepNow() 90 self.dut.log.info('Screen is OFF') 91 time.sleep(5) 92 93 def sendPacketAndMeasure(self, packet): 94 """Packet injection template function 95 96 Args: 97 packet: packet to be sent/inject 98 """ 99 # Start sending packets and measure power 100 self.pkt_sender.start_sending(packet, self.interval) 101 self.measure_power_and_validate() 102 103 # Test cases - screen OFF 104 @test_tracker_info(uuid='b5378aaf-7949-48ac-95fb-ee94c85d49c3') 105 def test_screen_OFF_band_5g_directed_arp(self): 106 self.set_connection() 107 self.pkt_gen_config = wputils.create_pkt_config(self) 108 pkt_gen = pkt_utils.ArpGenerator(**self.pkt_gen_config) 109 packet = pkt_gen.generate() 110 self.sendPacketAndMeasure(packet) 111 112 @test_tracker_info(uuid='3b5d348d-70bf-483d-8736-13da569473aa') 113 def test_screen_OFF_band_5g_misdirected_arp(self): 114 self.set_connection() 115 self.pkt_gen_config = wputils.create_pkt_config(self) 116 pkt_gen = pkt_utils.ArpGenerator(**self.pkt_gen_config) 117 packet = pkt_gen.generate(ip_dst=self.ipv4_dst_fake) 118 self.sendPacketAndMeasure(packet) 119 120 @test_tracker_info(uuid='dd3ff80d-97ce-4408-92f8-f2c72ce8d79c') 121 def test_screen_OFF_band_5g_unicast_invalid_ip_arp_request(self): 122 self.set_connection() 123 self.pkt_gen_config = wputils.create_pkt_config(self) 124 pkt_gen = pkt_utils.ArpGenerator(**self.pkt_gen_config) 125 packet = pkt_gen.generate(ip_dst='0.0.0.0', 126 eth_dst=self.pkt_gen_config['dst_mac']) 127 self.sendPacketAndMeasure(packet) 128 129 @test_tracker_info(uuid='5dcb16f1-725c-45de-8103-340104d60a22') 130 def test_screen_OFF_band_5g_unicast_misdirected_arp_request(self): 131 self.set_connection() 132 self.pkt_gen_config = wputils.create_pkt_config(self) 133 pkt_gen = pkt_utils.ArpGenerator(**self.pkt_gen_config) 134 packet = pkt_gen.generate(ip_dst=self.ipv4_dst_fake, 135 eth_dst=self.pkt_gen_config['dst_mac']) 136 self.sendPacketAndMeasure(packet) 137 138 @test_tracker_info(uuid='5ec4800f-a82e-4462-8b65-4fcd0b1940a2') 139 def test_screen_OFF_band_5g_unicast_invalid_src_arp_reply(self): 140 self.set_connection() 141 self.pkt_gen_config = wputils.create_pkt_config(self) 142 pkt_gen = pkt_utils.ArpGenerator(**self.pkt_gen_config) 143 packet = pkt_gen.generate(op='is-at', 144 ip_src='0.0.0.0', 145 ip_dst=self.ipv4_dst_fake, 146 hwdst=self.mac_dst_fake, 147 eth_dst=self.pkt_gen_config['dst_mac']) 148 self.sendPacketAndMeasure(packet) 149 150 @test_tracker_info(uuid='6c5c0e9e-7a00-43d0-a6e8-355141467703') 151 def test_screen_OFF_band_5g_unicast_misdirected_arp_reply(self): 152 self.set_connection() 153 self.pkt_gen_config = wputils.create_pkt_config(self) 154 pkt_gen = pkt_utils.ArpGenerator(**self.pkt_gen_config) 155 packet = pkt_gen.generate(op='is-at', 156 ip_dst=self.ipv4_dst_fake, 157 hwdst=self.mac_dst_fake, 158 eth_dst=self.pkt_gen_config['dst_mac']) 159 self.sendPacketAndMeasure(packet) 160 161 @test_tracker_info(uuid='8e534d3b-5a25-429a-a1bb-8119d7d28b5a') 162 def test_screen_OFF_band_5g_directed_ns(self): 163 self.set_connection() 164 self.pkt_gen_config = wputils.create_pkt_config(self) 165 pkt_gen = pkt_utils.NsGenerator(**self.pkt_gen_config) 166 packet = pkt_gen.generate() 167 self.sendPacketAndMeasure(packet) 168 169 @test_tracker_info(uuid='536d716d-f30b-4d20-9976-e2cbc36c3415') 170 def test_screen_OFF_band_5g_misdirected_ns(self): 171 self.set_connection() 172 self.pkt_gen_config = wputils.create_pkt_config(self) 173 pkt_gen = pkt_utils.NsGenerator(**self.pkt_gen_config) 174 packet = pkt_gen.generate(ip_dst=self.ipv6_dst_fake) 175 self.sendPacketAndMeasure(packet) 176 177 @test_tracker_info(uuid='5eed3174-8e94-428e-8527-19a9b5a90322') 178 def test_screen_OFF_band_5g_ra_short(self): 179 self.set_connection() 180 self.pkt_gen_config = wputils.create_pkt_config(self) 181 pkt_gen = pkt_utils.RaGenerator(**self.pkt_gen_config) 182 packet = pkt_gen.generate(RA_SHORT_LIFETIME) 183 self.sendPacketAndMeasure(packet) 184 185 @test_tracker_info(uuid='67867bae-f1c5-44a4-9bd0-2b832ac8059c') 186 def test_screen_OFF_band_5g_ra_long(self): 187 self.set_connection() 188 self.pkt_gen_config = wputils.create_pkt_config(self) 189 pkt_gen = pkt_utils.RaGenerator(**self.pkt_gen_config) 190 packet = pkt_gen.generate(RA_LONG_LIFETIME) 191 self.sendPacketAndMeasure(packet) 192 193 @test_tracker_info(uuid='db19bc94-3513-45c4-b3a5-d6219649d0bb') 194 def test_screen_OFF_band_5g_directed_dhcp_offer(self): 195 self.set_connection() 196 self.pkt_gen_config = wputils.create_pkt_config(self) 197 pkt_gen = pkt_utils.DhcpOfferGenerator(**self.pkt_gen_config) 198 packet = pkt_gen.generate() 199 self.sendPacketAndMeasure(packet) 200 201 @test_tracker_info(uuid='a8059869-40ee-4cf3-a957-4b7aed03fcf9') 202 def test_screen_OFF_band_5g_misdirected_dhcp_offer(self): 203 self.set_connection() 204 self.pkt_gen_config = wputils.create_pkt_config(self) 205 pkt_gen = pkt_utils.DhcpOfferGenerator(**self.pkt_gen_config) 206 packet = pkt_gen.generate(self.mac_dst_fake, self.ipv4_dst_fake) 207 self.sendPacketAndMeasure(packet) 208 209 @test_tracker_info(uuid='6e663f0a-3eb5-46f6-a79e-311baebd5d2a') 210 def test_screen_OFF_band_5g_ra_rnds_short(self): 211 self.set_connection() 212 self.pkt_gen_config = wputils.create_pkt_config(self) 213 pkt_gen = pkt_utils.RaGenerator(**self.pkt_gen_config) 214 packet = pkt_gen.generate(RA_LONG_LIFETIME, 215 enableDNS=True, 216 dns_lifetime=DNS_SHORT_LIFETIME) 217 self.sendPacketAndMeasure(packet) 218 219 @test_tracker_info(uuid='84d2f1ff-bd4f-46c6-9b06-826d9b14909c') 220 def test_screen_OFF_band_5g_ra_rnds_long(self): 221 self.set_connection() 222 self.pkt_gen_config = wputils.create_pkt_config(self) 223 pkt_gen = pkt_utils.RaGenerator(**self.pkt_gen_config) 224 packet = pkt_gen.generate(RA_LONG_LIFETIME, 225 enableDNS=True, 226 dns_lifetime=DNS_LONG_LIFETIME) 227 self.sendPacketAndMeasure(packet) 228 229 @test_tracker_info(uuid='4a17e74f-3e7f-4e90-ac9e-884a7c13cede') 230 def test_screen_OFF_band_5g_directed_ping6(self): 231 self.set_connection() 232 self.pkt_gen_config = wputils.create_pkt_config(self) 233 pkt_gen = pkt_utils.Ping6Generator(**self.pkt_gen_config) 234 packet = pkt_gen.generate() 235 self.sendPacketAndMeasure(packet) 236 237 @test_tracker_info(uuid='ab249e0d-58ba-4b55-8a81-e1e4fb04780a') 238 def test_screen_OFF_band_5g_misdirected_ping6(self): 239 self.set_connection() 240 self.pkt_gen_config = wputils.create_pkt_config(self) 241 pkt_gen = pkt_utils.Ping6Generator(**self.pkt_gen_config) 242 packet = pkt_gen.generate(self.ipv6_dst_fake, pkt_utils.MAC_BROADCAST) 243 self.sendPacketAndMeasure(packet) 244 245 @test_tracker_info(uuid='e37112e6-5c35-4c89-8d15-f5a44e69be0b') 246 def test_screen_OFF_band_5g_directed_ping4(self): 247 self.set_connection() 248 self.pkt_gen_config = wputils.create_pkt_config(self) 249 pkt_gen = pkt_utils.Ping4Generator(**self.pkt_gen_config) 250 packet = pkt_gen.generate() 251 self.sendPacketAndMeasure(packet) 252 253 @test_tracker_info(uuid='afd4a011-63a9-46c3-8a75-13f515ba8475') 254 def test_screen_OFF_band_5g_misdirected_ping4(self): 255 self.set_connection() 256 self.pkt_gen_config = wputils.create_pkt_config(self) 257 pkt_gen = pkt_utils.Ping4Generator(**self.pkt_gen_config) 258 packet = pkt_gen.generate(self.ipv4_dst_fake, pkt_utils.MAC_BROADCAST) 259 self.sendPacketAndMeasure(packet) 260 261 @test_tracker_info(uuid='03f0e845-fd66-4120-a79d-5eb64d49b6cd') 262 def test_screen_OFF_band_5g_mdns6(self): 263 self.set_connection() 264 self.pkt_gen_config = wputils.create_pkt_config(self) 265 pkt_gen = pkt_utils.Mdns6Generator(**self.pkt_gen_config) 266 packet = pkt_gen.generate() 267 self.sendPacketAndMeasure(packet) 268 269 @test_tracker_info(uuid='dcbb0aec-512d-48bd-b743-024697ce511b') 270 def test_screen_OFF_band_5g_mdns4(self): 271 self.set_connection() 272 self.pkt_gen_config = wputils.create_pkt_config(self) 273 pkt_gen = pkt_utils.Mdns4Generator(**self.pkt_gen_config) 274 packet = pkt_gen.generate() 275 self.sendPacketAndMeasure(packet) 276 277 @test_tracker_info(uuid='16dabe69-27a6-470b-a474-4774cd3e4715') 278 def test_screen_OFF_band_5g_dot3(self): 279 self.set_connection() 280 self.pkt_gen_config = wputils.create_pkt_config(self) 281 pkt_gen = pkt_utils.Dot3Generator(**self.pkt_gen_config) 282 packet = pkt_gen.generate() 283 self.sendPacketAndMeasure(packet) 284 285 @test_tracker_info(uuid='55d00670-f34b-4289-95fa-b618e509c15c') 286 def test_screen_OFF_band_5g_dot3_llc(self): 287 self.set_connection() 288 self.pkt_gen_config = wputils.create_pkt_config(self) 289 pkt_gen = pkt_utils.Dot3Generator(**self.pkt_gen_config) 290 packet = pkt_gen.generate_llc() 291 self.sendPacketAndMeasure(packet) 292 293 @test_tracker_info(uuid='75ba3435-fe63-4a21-8cbe-2f631043f632') 294 def test_screen_OFF_band_5g_dot3_snap(self): 295 self.set_connection() 296 self.pkt_gen_config = wputils.create_pkt_config(self) 297 pkt_gen = pkt_utils.Dot3Generator(**self.pkt_gen_config) 298 packet = pkt_gen.generate_snap() 299 self.sendPacketAndMeasure(packet) 300 301 # Test cases: screen ON 302 @test_tracker_info(uuid='b9550149-bf36-4f86-9b4b-6e900756a90e') 303 def test_screen_ON_band_5g_directed_arp(self): 304 self.set_connection() 305 self.pkt_gen_config = wputils.create_pkt_config(self) 306 pkt_gen = pkt_utils.ArpGenerator(**self.pkt_gen_config) 307 packet = pkt_gen.generate() 308 self.sendPacketAndMeasure(packet) 309 310 @test_tracker_info(uuid='406dffae-104e-46cb-9ec2-910aac7aca39') 311 def test_screen_ON_band_5g_misdirected_arp(self): 312 self.set_connection() 313 self.pkt_gen_config = wputils.create_pkt_config(self) 314 pkt_gen = pkt_utils.ArpGenerator(**self.pkt_gen_config) 315 packet = pkt_gen.generate(self.ipv4_dst_fake) 316 self.sendPacketAndMeasure(packet) 317 318 @test_tracker_info(uuid='be4cb543-c710-4041-a770-819e82a6d164') 319 def test_screen_ON_band_5g_directed_ns(self): 320 self.set_connection() 321 self.pkt_gen_config = wputils.create_pkt_config(self) 322 pkt_gen = pkt_utils.NsGenerator(**self.pkt_gen_config) 323 packet = pkt_gen.generate() 324 self.sendPacketAndMeasure(packet) 325 326 @test_tracker_info(uuid='de21d24f-e03e-47a1-8bbb-11953200e870') 327 def test_screen_ON_band_5g_misdirected_ns(self): 328 self.set_connection() 329 self.pkt_gen_config = wputils.create_pkt_config(self) 330 pkt_gen = pkt_utils.NsGenerator(**self.pkt_gen_config) 331 packet = pkt_gen.generate(self.ipv6_dst_fake) 332 self.sendPacketAndMeasure(packet) 333 334 @test_tracker_info(uuid='b424a170-5095-4b47-82eb-50f7b7fdf35d') 335 def test_screen_ON_band_5g_ra_short(self): 336 self.set_connection() 337 self.pkt_gen_config = wputils.create_pkt_config(self) 338 pkt_gen = pkt_utils.RaGenerator(**self.pkt_gen_config) 339 packet = pkt_gen.generate(RA_SHORT_LIFETIME) 340 self.sendPacketAndMeasure(packet) 341 342 @test_tracker_info(uuid='ab627e59-2ee8-4c0d-970b-eeb1d1cecdc1') 343 def test_screen_ON_band_5g_ra_long(self): 344 self.set_connection() 345 self.pkt_gen_config = wputils.create_pkt_config(self) 346 pkt_gen = pkt_utils.RaGenerator(**self.pkt_gen_config) 347 packet = pkt_gen.generate(RA_LONG_LIFETIME) 348 self.sendPacketAndMeasure(packet) 349 350 @test_tracker_info(uuid='ee6514ab-1814-44b9-ba01-63f77ba77c34') 351 def test_screen_ON_band_5g_directed_dhcp_offer(self): 352 self.set_connection() 353 self.pkt_gen_config = wputils.create_pkt_config(self) 354 pkt_gen = pkt_utils.DhcpOfferGenerator(**self.pkt_gen_config) 355 packet = pkt_gen.generate() 356 self.sendPacketAndMeasure(packet) 357 358 @test_tracker_info(uuid='eaebfe98-32da-4ebc-bca7-3b7026d99a4f') 359 def test_screen_ON_band_5g_misdirected_dhcp_offer(self): 360 self.set_connection() 361 self.pkt_gen_config = wputils.create_pkt_config(self) 362 pkt_gen = pkt_utils.DhcpOfferGenerator(**self.pkt_gen_config) 363 packet = pkt_gen.generate(self.mac_dst_fake, self.ipv4_dst_fake) 364 self.sendPacketAndMeasure(packet) 365 366 @test_tracker_info(uuid='f0e2193f-bf6a-441b-b9c1-bb7b65787cd5') 367 def test_screen_ON_band_5g_ra_rnds_short(self): 368 self.set_connection() 369 self.pkt_gen_config = wputils.create_pkt_config(self) 370 pkt_gen = pkt_utils.RaGenerator(**self.pkt_gen_config) 371 packet = pkt_gen.generate(RA_LONG_LIFETIME, 372 enableDNS=True, 373 dns_lifetime=DNS_SHORT_LIFETIME) 374 self.sendPacketAndMeasure(packet) 375 376 @test_tracker_info(uuid='62b99cd7-75bf-45be-b93f-bb037a13b3e2') 377 def test_screen_ON_band_5g_ra_rnds_long(self): 378 self.set_connection() 379 self.pkt_gen_config = wputils.create_pkt_config(self) 380 pkt_gen = pkt_utils.RaGenerator(**self.pkt_gen_config) 381 packet = pkt_gen.generate(RA_LONG_LIFETIME, 382 enableDNS=True, 383 dns_lifetime=DNS_LONG_LIFETIME) 384 self.sendPacketAndMeasure(packet) 385 386 @test_tracker_info(uuid='4088af4c-a64b-4fc1-848c-688936cc6c12') 387 def test_screen_ON_band_5g_directed_ping6(self): 388 self.set_connection() 389 self.pkt_gen_config = wputils.create_pkt_config(self) 390 pkt_gen = pkt_utils.Ping6Generator(**self.pkt_gen_config) 391 packet = pkt_gen.generate() 392 self.sendPacketAndMeasure(packet) 393 394 @test_tracker_info(uuid='3179e327-e6ac-4dae-bb8a-f3940f21094d') 395 def test_screen_ON_band_5g_misdirected_ping6(self): 396 self.set_connection() 397 self.pkt_gen_config = wputils.create_pkt_config(self) 398 pkt_gen = pkt_utils.Ping6Generator(**self.pkt_gen_config) 399 packet = pkt_gen.generate(self.ipv6_dst_fake, pkt_utils.MAC_BROADCAST) 400 self.sendPacketAndMeasure(packet) 401 402 @test_tracker_info(uuid='90c70e8a-74fd-4878-89c6-5e15c3ede318') 403 def test_screen_ON_band_5g_directed_ping4(self): 404 self.set_connection() 405 self.pkt_gen_config = wputils.create_pkt_config(self) 406 pkt_gen = pkt_utils.Ping4Generator(**self.pkt_gen_config) 407 packet = pkt_gen.generate() 408 self.sendPacketAndMeasure(packet) 409 410 @test_tracker_info(uuid='dcfabbc7-a7e1-4a92-a38d-8ebe7aa2e063') 411 def test_screen_ON_band_5g_misdirected_ping4(self): 412 self.set_connection() 413 self.pkt_gen_config = wputils.create_pkt_config(self) 414 pkt_gen = pkt_utils.Ping4Generator(**self.pkt_gen_config) 415 packet = pkt_gen.generate(self.ipv4_dst_fake, pkt_utils.MAC_BROADCAST) 416 self.sendPacketAndMeasure(packet) 417 418 @test_tracker_info(uuid='117814db-f94d-4239-a7ab-033482b1da52') 419 def test_screen_ON_band_5g_mdns6(self): 420 self.set_connection() 421 self.pkt_gen_config = wputils.create_pkt_config(self) 422 pkt_gen = pkt_utils.Mdns6Generator(**self.pkt_gen_config) 423 packet = pkt_gen.generate() 424 self.sendPacketAndMeasure(packet) 425 426 @test_tracker_info(uuid='ce6ad7e2-21f3-4e68-9c0d-d0e14e0a7c53') 427 def test_screen_ON_band_5g_mdns4(self): 428 self.set_connection() 429 self.pkt_gen_config = wputils.create_pkt_config(self) 430 pkt_gen = pkt_utils.Mdns4Generator(**self.pkt_gen_config) 431 packet = pkt_gen.generate() 432 self.sendPacketAndMeasure(packet) 433