Randomize the prefix used by RouterAdvertisementResponder.
Currently RouterAdvertisementResponder always uses a prefix of
2001:db8::/64, even if there are multiple instances on different
interfaces. Randomize the prefix instead.
Test: TH
Bug: 240323229
Bug: 235559605
Bug: 259849956
Change-Id: I585ca804845f4278187602a6c9816470dcea04f8
Merged-In: I585ca804845f4278187602a6c9816470dcea04f8
(cherry picked from commit 6ab502437e77fde3346f45376fc6212d2825b27b)
diff --git a/common/testutils/devicetests/com/android/testutils/RouterAdvertisementResponder.java b/common/testutils/devicetests/com/android/testutils/RouterAdvertisementResponder.java
index 91c3f76..51df935 100644
--- a/common/testutils/devicetests/com/android/testutils/RouterAdvertisementResponder.java
+++ b/common/testutils/devicetests/com/android/testutils/RouterAdvertisementResponder.java
@@ -31,7 +31,6 @@
import android.net.InetAddresses;
import android.net.IpPrefix;
-import android.net.LinkAddress;
import android.net.MacAddress;
import android.util.ArrayMap;
import android.util.Pair;
@@ -50,6 +49,8 @@
import java.net.Inet6Address;
import java.nio.ByteBuffer;
import java.util.Map;
+import java.util.Objects;
+import java.util.Random;
/**
* ND (RA & NA) responder class useful for tests that require a provisioned IPv6 interface.
@@ -57,16 +58,30 @@
*/
public class RouterAdvertisementResponder extends PacketResponder {
private static final String TAG = "RouterAdvertisementResponder";
- private static final LinkAddress SLAAC_PREFIX = new LinkAddress("2001:db8::/64");
private static final Inet6Address DNS_SERVER =
(Inet6Address) InetAddresses.parseNumericAddress("2001:4860:4860::64");
private final TapPacketReader mPacketReader;
// Maps IPv6 address to MacAddress and isRouter boolean.
private final Map<Inet6Address, Pair<MacAddress, Boolean>> mNeighborMap = new ArrayMap<>();
+ private final IpPrefix mPrefix;
- public RouterAdvertisementResponder(TapPacketReader packetReader) {
+ public RouterAdvertisementResponder(TapPacketReader packetReader, IpPrefix prefix) {
super(packetReader, RouterAdvertisementResponder::isRsOrNs, TAG);
mPacketReader = packetReader;
+ mPrefix = Objects.requireNonNull(prefix);
+ }
+
+ public RouterAdvertisementResponder(TapPacketReader packetReader) {
+ this(packetReader, makeRandomPrefix());
+ }
+
+ private static IpPrefix makeRandomPrefix() {
+ final byte[] prefixBytes = new IpPrefix("2001:db8::/64").getAddress().getAddress();
+ final Random r = new Random();
+ for (int i = 4; i < 8; i++) {
+ prefixBytes[i] = (byte) r.nextInt();
+ }
+ return new IpPrefix(prefixBytes, 64);
}
/** Returns true if the packet is a router solicitation or neighbor solicitation message. */
@@ -103,11 +118,17 @@
mNeighborMap.put(ip, new Pair<>(mac, false));
}
+ /**
+ * @return the prefix that is announced in the Router Advertisements sent by this object.
+ */
+ public IpPrefix getPrefix() {
+ return mPrefix;
+ }
+
private ByteBuffer buildPrefixOption() {
return PrefixInformationOption.build(
- new IpPrefix(SLAAC_PREFIX.getAddress(), SLAAC_PREFIX.getPrefixLength()),
- (byte) (PIO_FLAG_ON_LINK | PIO_FLAG_AUTONOMOUS), 3600/*valid lifetime*/,
- 3600/*preferred lifetime*/);
+ mPrefix, (byte) (PIO_FLAG_ON_LINK | PIO_FLAG_AUTONOMOUS),
+ 3600 /* valid lifetime */, 3600 /* preferred lifetime */);
}
private ByteBuffer buildRdnssOption() {