Loading common/moduleutils/src/android/net/shared/Layer2Information.java +7 −2 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package android.net.shared; import android.annotation.Nullable; import android.net.Layer2InformationParcelable; import android.net.MacAddress; Loading @@ -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; Loading @@ -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(); } Loading tests/integration/src/android/net/ip/IpClientIntegrationTest.java +36 −9 Original line number Diff line number Diff line Loading @@ -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) { Loading Loading @@ -1720,6 +1725,28 @@ public class IpClientIntegrationTest { false /* timeoutBeforePreconnectionComplete */); } @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 */, Loading Loading
common/moduleutils/src/android/net/shared/Layer2Information.java +7 −2 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package android.net.shared; import android.annotation.Nullable; import android.net.Layer2InformationParcelable; import android.net.MacAddress; Loading @@ -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; Loading @@ -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(); } Loading
tests/integration/src/android/net/ip/IpClientIntegrationTest.java +36 −9 Original line number Diff line number Diff line Loading @@ -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) { Loading Loading @@ -1720,6 +1725,28 @@ public class IpClientIntegrationTest { false /* timeoutBeforePreconnectionComplete */); } @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 */, Loading