Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 553ee0cf authored by Xiao Ma's avatar Xiao Ma Committed by Automerger Merge Worker
Browse files

Merge "Fix the potential NPE when starting provisioning with FILS." into rvc-dev am: db6652aa

Change-Id: I001b378de6982971dee3819b3ec6d9f185cce5e9
parents 00fc40b6 db6652aa
Loading
Loading
Loading
Loading
+7 −2
Original line number Diff line number Diff line
@@ -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();
    }

+36 −9
Original line number Diff line number Diff line
@@ -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) {
@@ -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 */,