Test that DHCPv6 provisioning succeeds

Test: TH
Flag: EXEMPT mainline
Bug: 1000001
Change-Id: I88421058cd4bf0b982ccb6ae5362e4f037130114
This commit is contained in:
Patrick Rohr 2025-05-05 14:51:43 -07:00
commit 3db76bdfbc

View file

@ -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 <reified T : Dhcp6Packet> expectDhcp6Packet(): T {
private inline fun <reified T : Dhcp6Packet> expectDhcp6Packet(): Pair<Inet6Address, T> {
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<T>(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<Dhcp6SolicitPacket>()
networkCallback.assertNoCallback()
}
@Test
fun testProvisioning_triggeredByPflag() {
ndResponder.addRouterEntry(ROUTER_MAC, ROUTER_V6, RA_WITH_PFLAG)
val (srcAddr, solicit) = expectDhcp6Packet<Dhcp6SolicitPacket>()
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<Available>()
}
}