Merge "Follow-up CL to the change at aosp/1523097." am: eacfd4f49b
Original change: https://android-review.googlesource.com/c/platform/packages/modules/NetworkStack/+/1566861
Change-Id: If90156470c712618c58122d2916d2913cb2505f2
diff --git a/common/networkstackclient/src/android/net/shared/ProvisioningConfiguration.java b/common/networkstackclient/src/android/net/shared/ProvisioningConfiguration.java
index 6ee9b73..4bace16 100644
--- a/common/networkstackclient/src/android/net/shared/ProvisioningConfiguration.java
+++ b/common/networkstackclient/src/android/net/shared/ProvisioningConfiguration.java
@@ -239,7 +239,7 @@
*
* @param: options customized DHCP option stable parcelable list.
*/
- public Builder withDhcpOptions(List<DhcpOption> options) {
+ public Builder withDhcpOptions(@Nullable List<DhcpOption> options) {
mConfig.mDhcpOptions = options;
return this;
}
diff --git a/src/android/net/dhcp/DhcpPacket.java b/src/android/net/dhcp/DhcpPacket.java
index 1331a24..76dc807 100644
--- a/src/android/net/dhcp/DhcpPacket.java
+++ b/src/android/net/dhcp/DhcpPacket.java
@@ -403,7 +403,7 @@
// Set in unit tests, to ensure that the test does not break when run on different devices and
// on different releases.
- static String testOverrideVendorId = null;
+ static String sTestOverrideVendorId = null;
protected DhcpPacket(int transId, short secs, Inet4Address clientIp, Inet4Address yourIp,
Inet4Address nextIp, Inet4Address relayIp,
@@ -779,7 +779,7 @@
* with the customized option value if any.
*/
private static String getVendorId(@Nullable List<DhcpOption> customizedClientOptions) {
- if (testOverrideVendorId != null) return testOverrideVendorId;
+ if (sTestOverrideVendorId != null) return sTestOverrideVendorId;
String vendorId = "android-dhcp-" + Build.VERSION.RELEASE;
if (customizedClientOptions != null) {
diff --git a/tests/integration/src/android/net/ip/IpClientIntegrationTest.kt b/tests/integration/src/android/net/ip/IpClientIntegrationTest.kt
index b217ebb..748ee5a 100644
--- a/tests/integration/src/android/net/ip/IpClientIntegrationTest.kt
+++ b/tests/integration/src/android/net/ip/IpClientIntegrationTest.kt
@@ -17,10 +17,14 @@
package android.net.ip
import android.net.ipmemorystore.NetworkAttributes
+import android.net.ipmemorystore.OnNetworkAttributesRetrievedListener
+import android.net.ipmemorystore.Status
+import android.net.ipmemorystore.Status.SUCCESS
import android.util.ArrayMap
import java.net.Inet6Address
import kotlin.test.assertEquals
import org.mockito.Mockito.any
+import org.mockito.Mockito.doAnswer
import org.mockito.ArgumentCaptor
import org.mockito.Mockito.eq
import org.mockito.Mockito.never
@@ -69,4 +73,12 @@
override fun assertNeverNotifyNeighborLost() {
verify(mCallback, never()).notifyLost(any(), any())
}
+
+ override fun storeNetworkAttributes(l2Key: String, na: NetworkAttributes) {
+ doAnswer { inv ->
+ val listener = inv.getArgument<OnNetworkAttributesRetrievedListener>(1)
+ listener.onNetworkAttributesRetrieved(Status(SUCCESS), l2Key, na)
+ true
+ }.`when`(mIpMemoryStore).retrieveNetworkAttributes(eq(l2Key), any())
+ }
}
diff --git a/tests/integration/src/android/net/ip/IpClientIntegrationTestCommon.java b/tests/integration/src/android/net/ip/IpClientIntegrationTestCommon.java
index 2b00fb1..c69645c 100644
--- a/tests/integration/src/android/net/ip/IpClientIntegrationTestCommon.java
+++ b/tests/integration/src/android/net/ip/IpClientIntegrationTestCommon.java
@@ -516,6 +516,8 @@
protected abstract NetworkAttributes getStoredNetworkAttributes(String l2Key, long timeout);
+ protected abstract void storeNetworkAttributes(String l2Key, NetworkAttributes na);
+
protected abstract void assertIpMemoryNeverStoreNetworkAttributes(String l2Key, long timeout);
protected abstract void assertNotifyNeighborLost(Inet6Address targetIp);
@@ -2681,20 +2683,20 @@
verifyDhcpPacketRequestsIPv6OnlyPreferredOption(DhcpRequestPacket.class);
}
+ private void setUpRetrievedNetworkAttributesForInitRebootState() {
+ final NetworkAttributes na = new NetworkAttributes.Builder()
+ .setAssignedV4Address(CLIENT_ADDR)
+ .setAssignedV4AddressExpiry(Long.MAX_VALUE) // lease is always valid
+ .setMtu(new Integer(TEST_DEFAULT_MTU))
+ .setCluster(TEST_CLUSTER)
+ .setDnsAddresses(Collections.singletonList(SERVER_ADDR))
+ .build();
+ storeNetworkAttributes(TEST_L2KEY, na);
+ }
+
private void startFromInitRebootStateWithIPv6OnlyPreferredOption(final Integer ipv6OnlyWaitTime,
final long expectedWaitSecs) throws Exception {
- doAnswer(invocation -> {
- ((OnNetworkAttributesRetrievedListener) invocation.getArgument(1))
- .onNetworkAttributesRetrieved(new Status(SUCCESS), TEST_L2KEY,
- new NetworkAttributes.Builder()
- .setAssignedV4Address(CLIENT_ADDR)
- .setAssignedV4AddressExpiry(Long.MAX_VALUE) // lease is always valid
- .setMtu(new Integer(TEST_DEFAULT_MTU))
- .setCluster(TEST_CLUSTER)
- .setDnsAddresses(Collections.singletonList(SERVER_ADDR))
- .build());
- return null;
- }).when(mIpMemoryStore).retrieveNetworkAttributes(eq(TEST_L2KEY), any());
+ setUpRetrievedNetworkAttributesForInitRebootState();
final ProvisioningConfiguration config = new ProvisioningConfiguration.Builder()
.withoutIpReachabilityMonitor()
@@ -2821,7 +2823,7 @@
);
private DhcpPacket doCustomizedDhcpOptionsTest(final List<DhcpOption> options,
- final ScanResultInfo info) throws Exception {
+ final ScanResultInfo info, boolean isDhcpLeaseCacheEnabled) throws Exception {
ProvisioningConfiguration.Builder prov = new ProvisioningConfiguration.Builder()
.withoutIpReachabilityMonitor()
.withLayer2Information(new Layer2Information(TEST_L2KEY, TEST_CLUSTER,
@@ -2830,7 +2832,7 @@
.withDhcpOptions(options)
.withoutIPv6();
- setDhcpFeatures(false /* isDhcpLeaseCacheEnabled */, false /* isRapidCommitEnabled */,
+ setDhcpFeatures(isDhcpLeaseCacheEnabled, false /* isRapidCommitEnabled */,
false /* isDhcpIpConflictDetectEnabled */, false /* isIPv6OnlyPreferredEnabled */);
startIpClientProvisioning(prov.build());
@@ -2841,10 +2843,11 @@
}
@Test
- public void testCustomizedDhcpOptions() throws Exception {
+ public void testDiscoverCustomizedDhcpOptions() throws Exception {
final ScanResultInfo info = makeScanResultInfo(0xdd /* vendor-specificIE */, TEST_OEM_OUI,
(byte) 0x17 /* vendor-specific IE type */);
- final DhcpPacket packet = doCustomizedDhcpOptionsTest(TEST_OEM_DHCP_OPTIONS, info);
+ final DhcpPacket packet = doCustomizedDhcpOptionsTest(TEST_OEM_DHCP_OPTIONS, info,
+ false /* isDhcpLeaseCacheEnabled */);
assertTrue(packet instanceof DhcpDiscoverPacket);
assertEquals(packet.mVendorId, TEST_OEM_VENDOR_ID);
@@ -2852,10 +2855,11 @@
}
@Test
- public void testCustomizedDhcpOptions_nullDhcpOptions() throws Exception {
+ public void testDiscoverCustomizedDhcpOptions_nullDhcpOptions() throws Exception {
final ScanResultInfo info = makeScanResultInfo(0xdd /* vendor-specificIE */, TEST_OEM_OUI,
(byte) 0x17 /* vendor-specific IE type */);
- final DhcpPacket packet = doCustomizedDhcpOptionsTest(null /* options */, info);
+ final DhcpPacket packet = doCustomizedDhcpOptionsTest(null /* options */, info,
+ false /* isDhcpLeaseCacheEnabled */);
assertTrue(packet instanceof DhcpDiscoverPacket);
assertEquals(packet.mVendorId, new String("android-dhcp-" + Build.VERSION.RELEASE));
@@ -2863,9 +2867,9 @@
}
@Test
- public void testCustomizedDhcpOptions_nullScanResultInfo() throws Exception {
+ public void testDiscoverCustomizedDhcpOptions_nullScanResultInfo() throws Exception {
final DhcpPacket packet = doCustomizedDhcpOptionsTest(TEST_OEM_DHCP_OPTIONS,
- null /* scanResultInfo */);
+ null /* scanResultInfo */, false /* isDhcpLeaseCacheEnabled */);
assertTrue(packet instanceof DhcpDiscoverPacket);
assertEquals(packet.mVendorId, new String("android-dhcp-" + Build.VERSION.RELEASE));
@@ -2873,10 +2877,11 @@
}
@Test
- public void testCustomizedDhcpOptions_disallowedOui() throws Exception {
+ public void testDiscoverCustomizedDhcpOptions_disallowedOui() throws Exception {
final ScanResultInfo info = makeScanResultInfo(0xdd /* vendor-specificIE */,
new byte[]{ 0x00, 0x11, 0x22} /* oui */, (byte) 0x17 /* vendor-specific IE type */);
- final DhcpPacket packet = doCustomizedDhcpOptionsTest(TEST_OEM_DHCP_OPTIONS, info);
+ final DhcpPacket packet = doCustomizedDhcpOptionsTest(TEST_OEM_DHCP_OPTIONS, info,
+ false /* isDhcpLeaseCacheEnabled */);
assertTrue(packet instanceof DhcpDiscoverPacket);
assertEquals(packet.mVendorId, new String("android-dhcp-" + Build.VERSION.RELEASE));
@@ -2884,10 +2889,11 @@
}
@Test
- public void testCustomizedDhcpOptions_invalidIeId() throws Exception {
+ public void testDiscoverCustomizedDhcpOptions_invalidIeId() throws Exception {
final ScanResultInfo info = makeScanResultInfo(0xde /* vendor-specificIE */, TEST_OEM_OUI,
(byte) 0x17 /* vendor-specific IE type */);
- final DhcpPacket packet = doCustomizedDhcpOptionsTest(TEST_OEM_DHCP_OPTIONS, info);
+ final DhcpPacket packet = doCustomizedDhcpOptionsTest(TEST_OEM_DHCP_OPTIONS, info,
+ false /* isDhcpLeaseCacheEnabled */);
assertTrue(packet instanceof DhcpDiscoverPacket);
assertEquals(packet.mVendorId, new String("android-dhcp-" + Build.VERSION.RELEASE));
@@ -2895,10 +2901,11 @@
}
@Test
- public void testCustomizedDhcpOptions_invalidVendorSpecificType() throws Exception {
+ public void testDiscoverCustomizedDhcpOptions_invalidVendorSpecificType() throws Exception {
final ScanResultInfo info = makeScanResultInfo(0xdd /* vendor-specificIE */, TEST_OEM_OUI,
(byte) 0x10 /* vendor-specific IE type */);
- final DhcpPacket packet = doCustomizedDhcpOptionsTest(TEST_OEM_DHCP_OPTIONS, info);
+ final DhcpPacket packet = doCustomizedDhcpOptionsTest(TEST_OEM_DHCP_OPTIONS, info,
+ false /* isDhcpLeaseCacheEnabled */);
assertTrue(packet instanceof DhcpDiscoverPacket);
assertEquals(packet.mVendorId, new String("android-dhcp-" + Build.VERSION.RELEASE));
@@ -2906,7 +2913,7 @@
}
@Test
- public void testCustomizedDhcpOptions_disallowedOption() throws Exception {
+ public void testDisoverCustomizedDhcpOptions_disallowedOption() throws Exception {
final List<DhcpOption> options = Arrays.asList(
makeDhcpOption((byte) 60, TEST_OEM_VENDOR_ID.getBytes()),
makeDhcpOption((byte) 77, TEST_OEM_USER_CLASS_INFO),
@@ -2914,7 +2921,8 @@
makeDhcpOption((byte) 26, HexDump.toByteArray(TEST_DEFAULT_MTU)));
final ScanResultInfo info = makeScanResultInfo(0xdd /* vendor-specificIE */, TEST_OEM_OUI,
(byte) 0x17 /* vendor-specific IE type */);
- final DhcpPacket packet = doCustomizedDhcpOptionsTest(options, info);
+ final DhcpPacket packet = doCustomizedDhcpOptionsTest(options, info,
+ false /* isDhcpLeaseCacheEnabled */);
assertTrue(packet instanceof DhcpDiscoverPacket);
assertEquals(packet.mVendorId, TEST_OEM_VENDOR_ID);
@@ -2923,7 +2931,7 @@
}
@Test
- public void testCustomizedDhcpOptions_disallowedParamRequestOption() throws Exception {
+ public void testDiscoverCustomizedDhcpOptions_disallowedParamRequestOption() throws Exception {
final List<DhcpOption> options = Arrays.asList(
makeDhcpOption((byte) 60, TEST_OEM_VENDOR_ID.getBytes()),
makeDhcpOption((byte) 77, TEST_OEM_USER_CLASS_INFO),
@@ -2931,7 +2939,8 @@
makeDhcpOption((byte) 42, null));
final ScanResultInfo info = makeScanResultInfo(0xdd /* vendor-specificIE */, TEST_OEM_OUI,
(byte) 0x17 /* vendor-specific IE type */);
- final DhcpPacket packet = doCustomizedDhcpOptionsTest(options, info);
+ final DhcpPacket packet = doCustomizedDhcpOptionsTest(options, info,
+ false /* isDhcpLeaseCacheEnabled */);
assertTrue(packet instanceof DhcpDiscoverPacket);
assertEquals(packet.mVendorId, TEST_OEM_VENDOR_ID);
@@ -2939,6 +2948,160 @@
assertFalse(packet.hasRequestedParam((byte) 42 /* NTP_SERVER */));
}
+ @Test
+ public void testDiscoverCustomizedDhcpOptions_ParameterRequestListOnly() throws Exception {
+ final List<DhcpOption> options = Arrays.asList(
+ // DHCP_USER_CLASS
+ makeDhcpOption((byte) 77, null));
+ final ScanResultInfo info = makeScanResultInfo(0xdd /* vendor-specificIE */, TEST_OEM_OUI,
+ (byte) 0x17 /* vendor-specific IE type */);
+ final DhcpPacket packet = doCustomizedDhcpOptionsTest(options, info,
+ false /* isDhcpLeaseCacheEnabled */);
+
+ assertTrue(packet instanceof DhcpDiscoverPacket);
+ assertTrue(packet.hasRequestedParam((byte) 77 /* DHCP_USER_CLASS */));
+ assertNull(packet.mUserClass);
+ }
+
+ @Test
+ public void testRequestCustomizedDhcpOptions() throws Exception {
+ setUpRetrievedNetworkAttributesForInitRebootState();
+
+ final ScanResultInfo info = makeScanResultInfo(0xdd /* vendor-specificIE */, TEST_OEM_OUI,
+ (byte) 0x17 /* vendor-specific IE type */);
+ final DhcpPacket packet = doCustomizedDhcpOptionsTest(TEST_OEM_DHCP_OPTIONS, info,
+ true /* isDhcpLeaseCacheEnabled */);
+
+ assertTrue(packet instanceof DhcpRequestPacket);
+ assertEquals(packet.mVendorId, TEST_OEM_VENDOR_ID);
+ assertArrayEquals(packet.mUserClass, TEST_OEM_USER_CLASS_INFO);
+ }
+
+ @Test
+ public void testRequestCustomizedDhcpOptions_nullDhcpOptions() throws Exception {
+ setUpRetrievedNetworkAttributesForInitRebootState();
+
+ final ScanResultInfo info = makeScanResultInfo(0xdd /* vendor-specificIE */, TEST_OEM_OUI,
+ (byte) 0x17 /* vendor-specific IE type */);
+ final DhcpPacket packet = doCustomizedDhcpOptionsTest(null /* options */, info,
+ true /* isDhcpLeaseCacheEnabled */);
+
+ assertTrue(packet instanceof DhcpRequestPacket);
+ assertEquals(packet.mVendorId, new String("android-dhcp-" + Build.VERSION.RELEASE));
+ assertNull(packet.mUserClass);
+ }
+
+ @Test
+ public void testRequestCustomizedDhcpOptions_nullScanResultInfo() throws Exception {
+ setUpRetrievedNetworkAttributesForInitRebootState();
+
+ final DhcpPacket packet = doCustomizedDhcpOptionsTest(TEST_OEM_DHCP_OPTIONS,
+ null /* scanResultInfo */, true /* isDhcpLeaseCacheEnabled */);
+
+ assertTrue(packet instanceof DhcpRequestPacket);
+ assertEquals(packet.mVendorId, new String("android-dhcp-" + Build.VERSION.RELEASE));
+ assertNull(packet.mUserClass);
+ }
+
+ @Test
+ public void testRequestCustomizedDhcpOptions_disallowedOui() throws Exception {
+ setUpRetrievedNetworkAttributesForInitRebootState();
+
+ final ScanResultInfo info = makeScanResultInfo(0xdd /* vendor-specificIE */,
+ new byte[]{ 0x00, 0x11, 0x22} /* oui */, (byte) 0x17 /* vendor-specific IE type */);
+ final DhcpPacket packet = doCustomizedDhcpOptionsTest(TEST_OEM_DHCP_OPTIONS, info,
+ true /* isDhcpLeaseCacheEnabled */);
+
+ assertTrue(packet instanceof DhcpRequestPacket);
+ assertEquals(packet.mVendorId, new String("android-dhcp-" + Build.VERSION.RELEASE));
+ assertNull(packet.mUserClass);
+ }
+
+ @Test
+ public void testRequestCustomizedDhcpOptions_invalidIeId() throws Exception {
+ setUpRetrievedNetworkAttributesForInitRebootState();
+
+ final ScanResultInfo info = makeScanResultInfo(0xde /* vendor-specificIE */, TEST_OEM_OUI,
+ (byte) 0x17 /* vendor-specific IE type */);
+ final DhcpPacket packet = doCustomizedDhcpOptionsTest(TEST_OEM_DHCP_OPTIONS, info,
+ true /* isDhcpLeaseCacheEnabled */);
+
+ assertTrue(packet instanceof DhcpRequestPacket);
+ assertEquals(packet.mVendorId, new String("android-dhcp-" + Build.VERSION.RELEASE));
+ assertNull(packet.mUserClass);
+ }
+
+ @Test
+ public void testRequestCustomizedDhcpOptions_invalidVendorSpecificType() throws Exception {
+ setUpRetrievedNetworkAttributesForInitRebootState();
+
+ final ScanResultInfo info = makeScanResultInfo(0xdd /* vendor-specificIE */, TEST_OEM_OUI,
+ (byte) 0x10 /* vendor-specific IE type */);
+ final DhcpPacket packet = doCustomizedDhcpOptionsTest(TEST_OEM_DHCP_OPTIONS, info,
+ true /* isDhcpLeaseCacheEnabled */);
+
+ assertTrue(packet instanceof DhcpRequestPacket);
+ assertEquals(packet.mVendorId, new String("android-dhcp-" + Build.VERSION.RELEASE));
+ assertNull(packet.mUserClass);
+ }
+
+ @Test
+ public void testRequestCustomizedDhcpOptions_disallowedOption() throws Exception {
+ setUpRetrievedNetworkAttributesForInitRebootState();
+
+ final List<DhcpOption> options = Arrays.asList(
+ makeDhcpOption((byte) 60, TEST_OEM_VENDOR_ID.getBytes()),
+ makeDhcpOption((byte) 77, TEST_OEM_USER_CLASS_INFO),
+ // Option 26: MTU
+ makeDhcpOption((byte) 26, HexDump.toByteArray(TEST_DEFAULT_MTU)));
+ final ScanResultInfo info = makeScanResultInfo(0xdd /* vendor-specificIE */, TEST_OEM_OUI,
+ (byte) 0x17 /* vendor-specific IE type */);
+ final DhcpPacket packet = doCustomizedDhcpOptionsTest(options, info,
+ true /* isDhcpLeaseCacheEnabled */);
+
+ assertTrue(packet instanceof DhcpRequestPacket);
+ assertEquals(packet.mVendorId, TEST_OEM_VENDOR_ID);
+ assertArrayEquals(packet.mUserClass, TEST_OEM_USER_CLASS_INFO);
+ assertNull(packet.mMtu);
+ }
+
+ @Test
+ public void testRequestCustomizedDhcpOptions_disallowedParamRequestOption() throws Exception {
+ setUpRetrievedNetworkAttributesForInitRebootState();
+
+ final List<DhcpOption> options = Arrays.asList(
+ makeDhcpOption((byte) 60, TEST_OEM_VENDOR_ID.getBytes()),
+ makeDhcpOption((byte) 77, TEST_OEM_USER_CLASS_INFO),
+ // NTP_SERVER
+ makeDhcpOption((byte) 42, null));
+ final ScanResultInfo info = makeScanResultInfo(0xdd /* vendor-specificIE */, TEST_OEM_OUI,
+ (byte) 0x17 /* vendor-specific IE type */);
+ final DhcpPacket packet = doCustomizedDhcpOptionsTest(options, info,
+ true /* isDhcpLeaseCacheEnabled */);
+
+ assertTrue(packet instanceof DhcpRequestPacket);
+ assertEquals(packet.mVendorId, TEST_OEM_VENDOR_ID);
+ assertArrayEquals(packet.mUserClass, TEST_OEM_USER_CLASS_INFO);
+ assertFalse(packet.hasRequestedParam((byte) 42 /* NTP_SERVER */));
+ }
+
+ @Test
+ public void testRequestCustomizedDhcpOptions_ParameterRequestListOnly() throws Exception {
+ setUpRetrievedNetworkAttributesForInitRebootState();
+
+ final List<DhcpOption> options = Arrays.asList(
+ // DHCP_USER_CLASS
+ makeDhcpOption((byte) 77, null));
+ final ScanResultInfo info = makeScanResultInfo(0xdd /* vendor-specificIE */, TEST_OEM_OUI,
+ (byte) 0x17 /* vendor-specific IE type */);
+ final DhcpPacket packet = doCustomizedDhcpOptionsTest(options, info,
+ true /* isDhcpLeaseCacheEnabled */);
+
+ assertTrue(packet instanceof DhcpRequestPacket);
+ assertTrue(packet.hasRequestedParam((byte) 77 /* DHCP_USER_CLASS */));
+ assertNull(packet.mUserClass);
+ }
+
private void assertGratuitousNa(final NeighborAdvertisement na) throws Exception {
final MacAddress etherMulticast =
NetworkStackUtils.ipv6MulticastToEthernetMulticast(IPV6_ADDR_ALL_ROUTERS_MULTICAST);
diff --git a/tests/integration/src/android/net/ip/IpClientRootTest.kt b/tests/integration/src/android/net/ip/IpClientRootTest.kt
index 8a99e4f..80c2b8e 100644
--- a/tests/integration/src/android/net/ip/IpClientRootTest.kt
+++ b/tests/integration/src/android/net/ip/IpClientRootTest.kt
@@ -271,4 +271,8 @@
override fun assertNeverNotifyNeighborLost() {
verify(mCb, never()).onReachabilityLost(anyString())
}
+
+ override fun storeNetworkAttributes(l2Key: String, na: NetworkAttributes) {
+ mStore.storeNetworkAttributes(l2Key, na, null /* listener */)
+ }
}
diff --git a/tests/unit/src/android/net/dhcp/DhcpPacketTest.java b/tests/unit/src/android/net/dhcp/DhcpPacketTest.java
index d0c49d3..1a1f6c3 100644
--- a/tests/unit/src/android/net/dhcp/DhcpPacketTest.java
+++ b/tests/unit/src/android/net/dhcp/DhcpPacketTest.java
@@ -96,12 +96,12 @@
@Before
public void setUp() {
- DhcpPacket.testOverrideVendorId = "android-dhcp-???";
+ DhcpPacket.sTestOverrideVendorId = "android-dhcp-???";
}
@After
public void tearDown() {
- DhcpPacket.testOverrideVendorId = null;
+ DhcpPacket.sTestOverrideVendorId = null;
}
class TestDhcpPacket extends DhcpPacket {