Test that DHCPv6 provisioning succeeds
Test: TH Flag: EXEMPT mainline Bug: 1000001 Change-Id: I88421058cd4bf0b982ccb6ae5362e4f037130114
This commit is contained in:
parent
297945d661
commit
3db76bdfbc
1 changed files with 48 additions and 8 deletions
|
|
@ -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>()
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue