diff --git a/tests/integration/src/android/net/Dhcp6PdTest.kt b/tests/integration/src/android/net/Dhcp6PdTest.kt index ba7edebbfa..894c3a091d 100644 --- a/tests/integration/src/android/net/Dhcp6PdTest.kt +++ b/tests/integration/src/android/net/Dhcp6PdTest.kt @@ -34,10 +34,17 @@ import com.android.testutils.AutoCloseTestInterfaceRule import com.android.testutils.DevSdkIgnoreRule import com.android.testutils.DevSdkIgnoreRunner import com.android.testutils.DeviceConfigRule +import com.android.testutils.Dhcp6IaPdOpt +import com.android.testutils.Dhcp6Pkt +import com.android.testutils.EtherPkt import com.android.testutils.EthernetTestInterface +import com.android.testutils.Ip6Pkt import com.android.testutils.NdResponder +import com.android.testutils.PacketBuilder import com.android.testutils.RaPkt +import com.android.testutils.RecorderCallback.CallbackEntry.Available import com.android.testutils.TestableNetworkCallback +import com.android.testutils.UdpPkt import com.android.testutils.runAsShell import java.net.Inet6Address import java.net.InetAddress @@ -62,7 +69,11 @@ private val REQUEST: NetworkRequest = NetworkRequest.Builder() .removeCapability(NET_CAPABILITY_TRUSTED) .build() private val ROUTER_MAC = MacAddress.fromString("01:02:03:04:05:06") -private val ROUTER_V6 = InetAddress.getByName("fe80::0102:03ff:fe04:0506") as Inet6Address +private val ROUTER_V6 = InetAddress.getByName("fe80::1") as Inet6Address +private val RA_WITH_PFLAG = RaPkt() + .addPioOption(prefix = "2001:db8::/64", flags = "LAP") + .addRdnssOption(dns = "2001:4860:4860::8888,2001:4860:4860::8844") + .addSllaOption("1:2:3:4:5:6") @AppModeFull(reason = "Instant apps can't access EthernetManager") @RunWith(DevSdkIgnoreRunner::class) @@ -135,21 +146,50 @@ class Dhcp6PdTest { return true } - private inline fun expectDhcp6Packet(): T { + private inline fun expectDhcp6Packet(): Pair { val l2bytes = eventuallyExpectPacket(::isDhcp6Packet) + + // Read src v6 address from byte array. + val arr = ByteArray(16) + val bb = ByteBuffer.wrap(l2bytes) + bb.position(14 + 8) + bb.get(arr) + val srcAddr = InetAddress.getByAddress(arr) as Inet6Address + val dhcp6bytes = l2bytes.drop(14 + 40 + 8).toByteArray() val packet = Dhcp6Packet.decode(dhcp6bytes, dhcp6bytes.size) assertIs(packet) - return packet as T + return Pair(srcAddr, packet as T) + } + + private fun EthernetTestInterface.sendPacket(p: PacketBuilder) { + packetReader.sendResponse(ByteBuffer.wrap(p.build())) } @Test fun testSolicit_triggeredByPflag() { - val ra = RaPkt() - .addPioOption(prefix = "2001:db8::/64", flags = "LAP") - .addRdnssOption(dns = "2001:4860:4860::8888,2001:4860:4860::8844") - .addSllaOption("1:2:3:4:5:6") - ndResponder.addRouterEntry(ROUTER_MAC, ROUTER_V6, ra) + ndResponder.addRouterEntry(ROUTER_MAC, ROUTER_V6, RA_WITH_PFLAG) expectDhcp6Packet() + networkCallback.assertNoCallback() + } + + @Test + fun testProvisioning_triggeredByPflag() { + ndResponder.addRouterEntry(ROUTER_MAC, ROUTER_V6, RA_WITH_PFLAG) + val (srcAddr, solicit) = expectDhcp6Packet() + + val ether = EtherPkt(src = ROUTER_MAC, dst = localMac) + val ipv6 = Ip6Pkt(src = ROUTER_V6, dst = srcAddr) + val udp = UdpPkt(sport = 547, dport = 546) + val dhcp6 = Dhcp6Pkt(type = "REPLY", transId = solicit.transactionId) + .addRapidCommitOption() + .addClientIdentifierOption(solicit.clientDuid) + .addServerIdentifierOption(byteArrayOf(1, 2, 3, 4, 5, 6)) + val dhcp6_pd = Dhcp6IaPdOpt(iaid = solicit.iaid) + .addIaPrefixOption(prefix = "2001:db8:1234::/64") + val pkt = ether / ipv6 / udp / dhcp6 / dhcp6_pd + iface.sendPacket(pkt) + + networkCallback.expect() } }