diff options
author | Lorenzo Colitti <lorenzo@google.com> | 2022-08-03 15:54:23 +0900 |
---|---|---|
committer | Samip Garg <samgarg@google.com> | 2022-12-13 18:11:12 +0000 |
commit | cfee0bbf71f7176181f4f653abea5c346a60fde6 (patch) | |
tree | 799cd95e915f619f14c686b98aa964babdabb87e | |
parent | 75d20a5fbeb4fa37ff5504d9301dbc6dd0d30af2 (diff) | |
download | net-cfee0bbf71f7176181f4f653abea5c346a60fde6.tar.gz |
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)
-rw-r--r-- | common/testutils/devicetests/com/android/testutils/RouterAdvertisementResponder.java | 33 |
1 files changed, 27 insertions, 6 deletions
diff --git a/common/testutils/devicetests/com/android/testutils/RouterAdvertisementResponder.java b/common/testutils/devicetests/com/android/testutils/RouterAdvertisementResponder.java index 91c3f766..51df9351 100644 --- a/common/testutils/devicetests/com/android/testutils/RouterAdvertisementResponder.java +++ b/common/testutils/devicetests/com/android/testutils/RouterAdvertisementResponder.java @@ -31,7 +31,6 @@ import static com.android.net.module.util.NetworkStackConstants.PIO_FLAG_ON_LINK 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.io.IOException; 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 @@ import java.util.Map; */ 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 @@ public class RouterAdvertisementResponder extends PacketResponder { 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() { |