summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--common/moduleutils/src/android/net/shared/Layer2Information.java9
-rw-r--r--tests/integration/src/android/net/ip/IpClientIntegrationTest.java45
2 files changed, 43 insertions, 11 deletions
diff --git a/common/moduleutils/src/android/net/shared/Layer2Information.java b/common/moduleutils/src/android/net/shared/Layer2Information.java
index 6825a93..fa4f102 100644
--- a/common/moduleutils/src/android/net/shared/Layer2Information.java
+++ b/common/moduleutils/src/android/net/shared/Layer2Information.java
@@ -16,6 +16,7 @@
package android.net.shared;
+import android.annotation.Nullable;
import android.net.Layer2InformationParcelable;
import android.net.MacAddress;
@@ -23,14 +24,18 @@ import java.util.Objects;
/** @hide */
public class Layer2Information {
+ @Nullable
public final String mL2Key;
+ @Nullable
public final String mGroupHint;
+ @Nullable
public final MacAddress mBssid;
/**
* Create a Layer2Information with the specified configuration.
*/
- public Layer2Information(String l2Key, String groupHint, MacAddress bssid) {
+ public Layer2Information(@Nullable final String l2Key, @Nullable final String groupHint,
+ @Nullable final MacAddress bssid) {
mL2Key = l2Key;
mGroupHint = groupHint;
mBssid = bssid;
@@ -41,7 +46,7 @@ public class Layer2Information {
StringBuffer str = new StringBuffer();
str.append("L2Key: ").append(mL2Key);
str.append(", GroupHint: ").append(mGroupHint);
- str.append(", bssid: ").append(mBssid.toString());
+ str.append(", bssid: ").append(mBssid);
return str.toString();
}
diff --git a/tests/integration/src/android/net/ip/IpClientIntegrationTest.java b/tests/integration/src/android/net/ip/IpClientIntegrationTest.java
index e286439..a18d908 100644
--- a/tests/integration/src/android/net/ip/IpClientIntegrationTest.java
+++ b/tests/integration/src/android/net/ip/IpClientIntegrationTest.java
@@ -830,27 +830,32 @@ public class IpClientIntegrationTest {
}
}
+ private DhcpPacket assertDiscoverPacketOnPreconnectionStart() throws Exception {
+ final ArgumentCaptor<List<Layer2PacketParcelable>> l2PacketList =
+ ArgumentCaptor.forClass(List.class);
+
+ verify(mCb, timeout(TEST_TIMEOUT_MS)).onPreconnectionStart(l2PacketList.capture());
+ final byte[] payload = l2PacketList.getValue().get(0).payload;
+ DhcpPacket packet = DhcpPacket.decodeFullPacket(payload, payload.length, ENCAP_L2);
+ assertTrue(packet instanceof DhcpDiscoverPacket);
+ assertArrayEquals(INADDR_BROADCAST.getAddress(),
+ Arrays.copyOfRange(payload, IPV4_DST_ADDR_OFFSET, IPV4_DST_ADDR_OFFSET + 4));
+ return packet;
+ }
+
private void doIpClientProvisioningWithPreconnectionTest(
final boolean shouldReplyRapidCommitAck, final boolean shouldAbortPreconnection,
final boolean shouldFirePreconnectionTimeout,
final boolean timeoutBeforePreconnectionComplete) throws Exception {
final long currentTime = System.currentTimeMillis();
- final ArgumentCaptor<List<Layer2PacketParcelable>> l2PacketList =
- ArgumentCaptor.forClass(List.class);
final ArgumentCaptor<InterfaceConfigurationParcel> ifConfig =
ArgumentCaptor.forClass(InterfaceConfigurationParcel.class);
startIpClientProvisioning(true /* isDhcpLeaseCacheEnabled */,
shouldReplyRapidCommitAck, true /* isDhcpPreConnectionEnabled */,
false /* isDhcpIpConflictDetectEnabled */);
- verify(mCb, timeout(TEST_TIMEOUT_MS).times(1))
- .onPreconnectionStart(l2PacketList.capture());
- final byte[] payload = l2PacketList.getValue().get(0).payload;
- DhcpPacket packet = DhcpPacket.decodeFullPacket(payload, payload.length, ENCAP_L2);
+ DhcpPacket packet = assertDiscoverPacketOnPreconnectionStart();
final int preconnDiscoverTransId = packet.getTransactionId();
- assertTrue(packet instanceof DhcpDiscoverPacket);
- assertArrayEquals(INADDR_BROADCAST.getAddress(),
- Arrays.copyOfRange(payload, IPV4_DST_ADDR_OFFSET, IPV4_DST_ADDR_OFFSET + 4));
if (shouldAbortPreconnection) {
if (shouldFirePreconnectionTimeout && timeoutBeforePreconnectionComplete) {
@@ -1721,6 +1726,28 @@ public class IpClientIntegrationTest {
}
@Test
+ public void testDhcpClientPreconnection_WithoutLayer2InfoWhenStartingProv() throws Exception {
+ // For FILS connection, current bssid (also l2key and grouphint) is still null when
+ // starting provisioning since the L2 link hasn't been established yet. Ensure that
+ // IpClient won't crash even if initializing an Layer2Info class with null members.
+ ProvisioningConfiguration.Builder prov = new ProvisioningConfiguration.Builder()
+ .withoutIpReachabilityMonitor()
+ .withoutIPv6()
+ .withPreconnection()
+ .withLayer2Information(new Layer2Information(null /* l2key */, null /* grouphint */,
+ null /* bssid */));
+
+ mIpc.startProvisioning(prov.build());
+ assertDiscoverPacketOnPreconnectionStart();
+ verify(mCb).setNeighborDiscoveryOffload(true);
+
+ // Force IpClient transition to RunningState from PreconnectionState.
+ mIpc.notifyPreconnectionComplete(false /* success */);
+ HandlerUtilsKt.waitForIdle(mDependencies.mDhcpClient.getHandler(), TEST_TIMEOUT_MS);
+ verify(mCb, timeout(TEST_TIMEOUT_MS)).setFallbackMulticastFilter(false);
+ }
+
+ @Test
public void testDhcpDecline_conflictByArpReply() throws Exception {
doIpAddressConflictDetectionTest(true /* causeIpAddressConflict */,
false /* shouldReplyRapidCommitAck */, true /* isDhcpIpConflictDetectEnabled */,