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

Commit 3d813151 authored by Xiao Ma's avatar Xiao Ma Committed by Automerger Merge Worker
Browse files

Merge "Add unit test on getting initial BSSID in IpClientTest." am: 01db53a5

Original change: https://android-review.googlesource.com/c/platform/packages/modules/NetworkStack/+/1711434

Change-Id: I9bdd1aeda00011c3aa2f7a447f06568c311486c0
parents 36910953 01db53a5
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -1411,7 +1411,7 @@ public class ApfFilter {
        //     pass
        // if it's ICMPv6 RS to any:
        //   drop
        // if it's ICMPv6 NA to ff02::1 or ff02::2:
        // if it's ICMPv6 NA to anything in ff02::/120
        //   drop
        // if keepalive ack
        //   drop
@@ -1495,7 +1495,7 @@ public class ApfFilter {
     * <li>Drop all broadcast non-IP non-ARP packets.
     * <li>Pass all non-ICMPv6 IPv6 packets,
     * <li>Pass all non-IPv4 and non-IPv6 packets,
     * <li>Drop IPv6 ICMPv6 NAs to ff02::1 or ff02::2.
     * <li>Drop IPv6 ICMPv6 NAs to anything in ff02::/120.
     * <li>Drop IPv6 ICMPv6 RSs.
     * <li>Filter IPv4 packets (see generateIPv4FilterLocked())
     * <li>Filter IPv6 packets (see generateIPv6FilterLocked())
+14 −9
Original line number Diff line number Diff line
@@ -61,6 +61,7 @@ import android.net.metrics.IpConnectivityLog;
import android.net.metrics.IpManagerEvent;
import android.net.networkstack.aidl.dhcp.DhcpOption;
import android.net.shared.InitialConfiguration;
import android.net.shared.Layer2Information;
import android.net.shared.ProvisioningConfiguration;
import android.net.shared.ProvisioningConfiguration.ScanResultInfo;
import android.net.shared.ProvisioningConfiguration.ScanResultInfo.InformationElement;
@@ -147,6 +148,7 @@ import java.util.stream.Collectors;
 * @hide
 */
public class IpClient extends StateMachine {
    private static final String TAG = IpClient.class.getSimpleName();
    private static final boolean DBG = false;

    // For message logging.
@@ -872,26 +874,28 @@ public class IpClient extends StateMachine {
                false /* defaultEnabled */);
    }

    private void setInitialBssid(final ProvisioningConfiguration req) {
        final ScanResultInfo scanResultInfo = req.mScanResultInfo;
        mCurrentBssid = null;
    @VisibleForTesting
    static MacAddress getInitialBssid(final Layer2Information layer2Info,
            final ScanResultInfo scanResultInfo, boolean isAtLeastS) {
        MacAddress bssid = null;
        // http://b/185202634
        // ScanResultInfo is not populated in some situations.
        // On S and above, prefer getting the BSSID from the Layer2Info.
        // On R and below, get the BSSID from the ScanResultInfo and fall back to
        // getting it from the Layer2Info. This ensures no regressions if any R
        // devices pass in a null or meaningless BSSID in the Layer2Info.
        if (!ShimUtils.isAtLeastS() && scanResultInfo != null) {
        if (!isAtLeastS && scanResultInfo != null) {
            try {
                mCurrentBssid = MacAddress.fromString(scanResultInfo.getBssid());
                bssid = MacAddress.fromString(scanResultInfo.getBssid());
            } catch (IllegalArgumentException e) {
                Log.wtf(mTag, "Invalid BSSID: " + scanResultInfo.getBssid()
                Log.wtf(TAG, "Invalid BSSID: " + scanResultInfo.getBssid()
                        + " in provisioning configuration", e);
            }
        }
        if (mCurrentBssid == null && req.mLayer2Info != null) {
            mCurrentBssid = req.mLayer2Info.mBssid;
        if (bssid == null && layer2Info != null) {
            bssid = layer2Info.mBssid;
        }
        return bssid;
    }

    private boolean shouldDisableAcceptRaOnProvisioningLoss() {
@@ -922,7 +926,8 @@ public class IpClient extends StateMachine {
            return;
        }

        setInitialBssid(req);
        mCurrentBssid = getInitialBssid(req.mLayer2Info, req.mScanResultInfo,
                ShimUtils.isAtLeastS());
        if (req.mLayer2Info != null) {
            mL2Key = req.mLayer2Info.mL2Key;
            mCluster = req.mLayer2Info.mCluster;
+0 −115
Original line number Diff line number Diff line
@@ -3007,119 +3007,4 @@ public abstract class IpClientIntegrationTestCommon {
        assertEquals(0, naList.size());
        assertEquals(1, arpList.size());
    }

    private void doInitialBssidSetupTest(final Layer2Information layer2Info,
            final ScanResultInfo scanResultInfo) throws Exception {
        ProvisioningConfiguration.Builder prov = new ProvisioningConfiguration.Builder()
                .withoutIpReachabilityMonitor()
                .withLayer2Information(layer2Info)
                .withScanResultInfo(scanResultInfo)
                .withDisplayName("\"0001docomo\"")
                .withoutIPv6();

        setDhcpFeatures(false /* isDhcpLeaseCacheEnabled */, true /* shouldReplyRapidCommitAck */,
                false /* isDhcpIpConflictDetectEnabled */, false /* isIPv6OnlyPreferredEnabled */);
        startIpClientProvisioning(prov.build());

        handleDhcpPackets(true /* isSuccessLease */, TEST_LEASE_DURATION_S,
                true /* shouldReplyRapidCommitAck */, TEST_DEFAULT_MTU, null /* serverSentUrl */);
        verifyIPv4OnlyProvisioningSuccess(Collections.singletonList(CLIENT_ADDR));
        forceLayer2Roaming();
    }

    @Test @IgnoreUpTo(Build.VERSION_CODES.R)
    public void testSetInitialBssidFromLayer2Info() throws Exception {
        final Layer2Information layer2Info = new Layer2Information(TEST_L2KEY, TEST_CLUSTER,
                MacAddress.fromString(TEST_DEFAULT_BSSID));

        doInitialBssidSetupTest(layer2Info, null /* scanResultInfo */);

        // Initial BSSID comes from layer2Info, it's different with target roaming bssid,
        // then verify that DHCPREQUEST packet is sent after roaming.
        final DhcpPacket packet = getNextDhcpPacket();
        assertTrue(packet instanceof DhcpRequestPacket);
    }

    @Test @IgnoreUpTo(Build.VERSION_CODES.R)
    public void testSetInitialBssidFromLayer2Info_NullBssid() throws Exception {
        final Layer2Information layer2Info = new Layer2Information(TEST_L2KEY, TEST_CLUSTER,
                null /* bssid */);
        final ScanResultInfo scanResultInfo =
                makeScanResultInfo(TEST_DEFAULT_SSID, TEST_DHCP_ROAM_BSSID);

        doInitialBssidSetupTest(layer2Info, scanResultInfo);

        // Initial BSSID comes from layer2Info, it's null, no DHCPREQUEST packet
        // will be sent after roaming.
        final DhcpPacket packet = getNextDhcpPacket(TEST_TIMEOUT_MS);
        assertNull(packet);
    }

    @Test @IgnoreUpTo(Build.VERSION_CODES.R)
    public void testSetInitialBssidFromLayer2Info_SameRoamingBssid() throws Exception {
        final Layer2Information layer2Info = new Layer2Information(TEST_L2KEY, TEST_CLUSTER,
                MacAddress.fromString(TEST_DHCP_ROAM_BSSID));

        doInitialBssidSetupTest(layer2Info, null /* scanResultInfo */);

        // Initial BSSID comes from layer2Info, it's same with target roaming bssid,
        // no DHCPREQUEST packet will be sent after roaming.
        final DhcpPacket packet = getNextDhcpPacket(TEST_TIMEOUT_MS);
        assertNull(packet);
    }

    @Test @IgnoreAfter(Build.VERSION_CODES.R)
    public void testSetInitialBssidFromScanResultInfo() throws Exception {
        final ScanResultInfo scanResultInfo =
                makeScanResultInfo(TEST_DEFAULT_SSID, TEST_DEFAULT_BSSID);

        doInitialBssidSetupTest(null /* layer2Info */, scanResultInfo);

        // Initial BSSID comes from ScanResultInfo, it's different with target roaming bssid,
        // then verify that DHCPREQUEST packet is sent after roaming.
        final DhcpPacket packet = getNextDhcpPacket();
        assertTrue(packet instanceof DhcpRequestPacket);
    }

    @Test @IgnoreAfter(Build.VERSION_CODES.R)
    public void testSetInitialBssidFromScanResultInfo_SameRoamingBssid() throws Exception {
        final ScanResultInfo scanResultInfo =
                makeScanResultInfo(TEST_DEFAULT_SSID, TEST_DHCP_ROAM_BSSID);

        doInitialBssidSetupTest(null /* layer2Info */, scanResultInfo);

        // Initial BSSID comes from ScanResultInfo, it's same with target roaming bssid,
        // no DHCPREQUEST packet will be sent after roaming.
        final DhcpPacket packet = getNextDhcpPacket(TEST_TIMEOUT_MS);
        assertNull(packet);
    }

    @Test @IgnoreAfter(Build.VERSION_CODES.R)
    public void testSetInitialBssidFromScanResultInfo_BrokenInitialBssid() throws Exception {
        final ScanResultInfo scanResultInfo =
                makeScanResultInfo(TEST_DEFAULT_SSID, "00:11:22:33:44:");

        doInitialBssidSetupTest(null /* layer2Info */, scanResultInfo);

        // Initial BSSID comes from ScanResultInfo, it's broken MAC address format and fallback
        // to null layer2Info, no DHCPREQUEST packet will be sent after roaming.
        final DhcpPacket packet = getNextDhcpPacket(TEST_TIMEOUT_MS);
        assertNull(packet);
    }

    @Test @IgnoreAfter(Build.VERSION_CODES.R)
    public void testSetInitialBssidFromScanResultInfo_BrokenInitialBssidFallback()
            throws Exception {
        final Layer2Information layer2Info = new Layer2Information(TEST_L2KEY, TEST_CLUSTER,
                MacAddress.fromString(TEST_DEFAULT_BSSID));
        final ScanResultInfo scanResultInfo =
                makeScanResultInfo(TEST_DEFAULT_SSID, "00:11:22:33:44:");

        doInitialBssidSetupTest(layer2Info, scanResultInfo);

        // Initial BSSID comes from ScanResultInfo, it's broken MAC address format and fallback
        // to check layer2Info, then verify DHCPREQUEST packet will be sent after roaming.
        final DhcpPacket packet = getNextDhcpPacket();
        assertTrue(packet instanceof DhcpRequestPacket);
    }
}
+109 −0
Original line number Diff line number Diff line
@@ -21,6 +21,7 @@ import static android.system.OsConstants.RT_SCOPE_UNIVERSE;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import static org.mockito.Mockito.any;
@@ -55,7 +56,9 @@ import android.net.apf.ApfFilter.ApfConfiguration;
import android.net.ipmemorystore.NetworkAttributes;
import android.net.metrics.IpConnectivityLog;
import android.net.shared.InitialConfiguration;
import android.net.shared.Layer2Information;
import android.net.shared.ProvisioningConfiguration;
import android.net.shared.ProvisioningConfiguration.ScanResultInfo;
import android.net.util.InterfaceParams;
import android.os.Build;

@@ -83,9 +86,12 @@ import org.mockito.MockitoAnnotations;
import java.net.Inet4Address;
import java.net.Inet6Address;
import java.net.InetAddress;
import java.nio.ByteBuffer;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Random;
import java.util.Set;


@@ -107,6 +113,8 @@ public class IpClientTest {
    private static final int TEST_TIMEOUT_MS = 400;
    private static final String TEST_L2KEY = "some l2key";
    private static final String TEST_CLUSTER = "some cluster";
    private static final String TEST_SSID = "test_ssid";
    private static final String TEST_BSSID = "00:11:22:33:44:55";

    private static final String TEST_GLOBAL_ADDRESS = "1234:4321::548d:2db2:4fcf:ef75/64";
    private static final String[] TEST_LOCAL_ADDRESSES = {
@@ -709,6 +717,107 @@ public class IpClientTest {
        verifyShutdown(ipc);
    }

    private ScanResultInfo makeScanResultInfo(final String ssid, final String bssid) {
        final ByteBuffer payload = ByteBuffer.allocate(14 /* oui + type + data */);
        final byte[] data = new byte[10];
        new Random().nextBytes(data);
        payload.put(new byte[] { 0x00, 0x1A, 0x11 });
        payload.put((byte) 0x06);
        payload.put(data);

        final ScanResultInfo.InformationElement ie =
                new ScanResultInfo.InformationElement(0xdd /* IE id */, payload);
        return new ScanResultInfo(ssid, bssid, Collections.singletonList(ie));
    }

    @Test
    public void testGetInitialBssidOnSOrAbove() throws Exception {
        final IpClient ipc = makeIpClient(TEST_IFNAME);
        final Layer2Information layer2Info = new Layer2Information(TEST_L2KEY, TEST_CLUSTER,
                MacAddress.fromString(TEST_BSSID));
        final MacAddress bssid = ipc.getInitialBssid(layer2Info, null /* ScanReqsultInfo */,
                true /* isAtLeastS */);
        assertEquals(bssid, MacAddress.fromString(TEST_BSSID));
    }

    @Test
    public void testGetInitialBssidOnSOrAbove_NullBssid() throws Exception {
        final IpClient ipc = makeIpClient(TEST_IFNAME);
        final Layer2Information layer2Info = new Layer2Information(TEST_L2KEY, TEST_CLUSTER,
                null /* bssid */);
        final ScanResultInfo scanResultInfo = makeScanResultInfo(TEST_SSID, TEST_BSSID);
        final MacAddress bssid = ipc.getInitialBssid(layer2Info, scanResultInfo,
                true /* isAtLeastS */);
        assertNull(bssid);
    }

    @Test
    public void testGetInitialBssidOnSOrAbove_NullLayer2Info() throws Exception {
        final IpClient ipc = makeIpClient(TEST_IFNAME);
        final ScanResultInfo scanResultInfo = makeScanResultInfo(TEST_SSID, TEST_BSSID);
        final MacAddress bssid = ipc.getInitialBssid(null /* layer2Info */, scanResultInfo,
                true /* isAtLeastS */);
        assertNull(bssid);
    }

    @Test
    public void testGetInitialBssidBeforeS() throws Exception {
        final IpClient ipc = makeIpClient(TEST_IFNAME);
        final Layer2Information layer2Info = new Layer2Information(TEST_L2KEY, TEST_CLUSTER,
                MacAddress.fromString(TEST_BSSID));
        final ScanResultInfo scanResultInfo = makeScanResultInfo(TEST_SSID, TEST_BSSID);
        final MacAddress bssid = ipc.getInitialBssid(layer2Info, scanResultInfo,
                false /* isAtLeastS */);
        assertEquals(bssid, MacAddress.fromString(TEST_BSSID));
    }

    @Test
    public void testGetInitialBssidBeforeS_NullLayer2Info() throws Exception {
        final IpClient ipc = makeIpClient(TEST_IFNAME);
        final ScanResultInfo scanResultInfo = makeScanResultInfo(TEST_SSID, TEST_BSSID);
        final MacAddress bssid = ipc.getInitialBssid(null /* layer2Info */, scanResultInfo,
                false /* isAtLeastS */);
        assertEquals(bssid, MacAddress.fromString(TEST_BSSID));
    }

    @Test
    public void testGetInitialBssidBeforeS_BrokenInitialBssid() throws Exception {
        final IpClient ipc = makeIpClient(TEST_IFNAME);
        final ScanResultInfo scanResultInfo = makeScanResultInfo(TEST_SSID, "00:11:22:33:44:");
        final MacAddress bssid = ipc.getInitialBssid(null /* layer2Info */, scanResultInfo,
                false /* isAtLeastS */);
        assertNull(bssid);
    }

    @Test
    public void testGetInitialBssidBeforeS_BrokenInitialBssidFallback() throws Exception {
        final IpClient ipc = makeIpClient(TEST_IFNAME);
        final Layer2Information layer2Info = new Layer2Information(TEST_L2KEY, TEST_CLUSTER,
                MacAddress.fromString(TEST_BSSID));
        final ScanResultInfo scanResultInfo = makeScanResultInfo(TEST_SSID, "00:11:22:33:44:");
        final MacAddress bssid = ipc.getInitialBssid(layer2Info, scanResultInfo,
                false /* isAtLeastS */);
        assertEquals(bssid, MacAddress.fromString(TEST_BSSID));
    }

    @Test
    public void testGetInitialBssidBeforeS_NullScanResultInfoFallback() throws Exception {
        final IpClient ipc = makeIpClient(TEST_IFNAME);
        final Layer2Information layer2Info = new Layer2Information(TEST_L2KEY, TEST_CLUSTER,
                MacAddress.fromString(TEST_BSSID));
        final MacAddress bssid = ipc.getInitialBssid(layer2Info, null /* scanResultInfo */,
                false /* isAtLeastS */);
        assertEquals(bssid, MacAddress.fromString(TEST_BSSID));
    }

    @Test
    public void testGetInitialBssidBeforeS_NullScanResultInfoAndLayer2Info() throws Exception {
        final IpClient ipc = makeIpClient(TEST_IFNAME);
        final MacAddress bssid = ipc.getInitialBssid(null /* layer2Info */,
                null /* scanResultInfo */, false /* isAtLeastS */);
        assertNull(bssid);
    }

    interface Fn<A,B> {
        B call(A a) throws Exception;
    }