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

Commit 13516845 authored by waynema's avatar waynema Committed by Wayne Ma
Browse files

Backwards-incompatible resolv module API change for making...

Backwards-incompatible resolv module API change for making setResolverConfiguration take a parcelable.

Test: built, flashed, booted
      atest FrameworksNetTests

Change-Id: I3b4e8672f5273c3baa9378025bfaef2e6514df64
parent 8ea6953a
Loading
Loading
Loading
Loading
+24 −15
Original line number Original line Diff line number Diff line
@@ -34,6 +34,7 @@ import android.net.IDnsResolver;
import android.net.LinkProperties;
import android.net.LinkProperties;
import android.net.Network;
import android.net.Network;
import android.net.NetworkUtils;
import android.net.NetworkUtils;
import android.net.ResolverParamsParcel;
import android.net.Uri;
import android.net.Uri;
import android.net.shared.PrivateDnsConfig;
import android.net.shared.PrivateDnsConfig;
import android.os.Binder;
import android.os.Binder;
@@ -311,11 +312,9 @@ public class DnsManager {


    public void setDnsConfigurationForNetwork(
    public void setDnsConfigurationForNetwork(
            int netId, LinkProperties lp, boolean isDefaultNetwork) {
            int netId, LinkProperties lp, boolean isDefaultNetwork) {
        final String[] assignedServers = NetworkUtils.makeStrings(lp.getDnsServers());
        final String[] domainStrs = getDomainStrings(lp.getDomains());


        updateParametersSettings();
        updateParametersSettings();
        final int[] params = { mSampleValidity, mSuccessThreshold, mMinSamples, mMaxSamples };
        final ResolverParamsParcel paramsParcel = new ResolverParamsParcel();


        // We only use the PrivateDnsConfig data pushed to this class instance
        // We only use the PrivateDnsConfig data pushed to this class instance
        // from ConnectivityService because it works in coordination with
        // from ConnectivityService because it works in coordination with
@@ -329,34 +328,44 @@ public class DnsManager {


        final boolean useTls = privateDnsCfg.useTls;
        final boolean useTls = privateDnsCfg.useTls;
        final boolean strictMode = privateDnsCfg.inStrictMode();
        final boolean strictMode = privateDnsCfg.inStrictMode();
        final String tlsHostname = strictMode ? privateDnsCfg.hostname : "";
        paramsParcel.netId = netId;
        final String[] tlsServers =
        paramsParcel.sampleValiditySeconds = mSampleValidity;
        paramsParcel.successThreshold = mSuccessThreshold;
        paramsParcel.minSamples = mMinSamples;
        paramsParcel.maxSamples = mMaxSamples;
        paramsParcel.servers = NetworkUtils.makeStrings(lp.getDnsServers());
        paramsParcel.domains = getDomainStrings(lp.getDomains());
        paramsParcel.tlsName = strictMode ? privateDnsCfg.hostname : "";
        paramsParcel.tlsServers =
                strictMode ? NetworkUtils.makeStrings(
                strictMode ? NetworkUtils.makeStrings(
                        Arrays.stream(privateDnsCfg.ips)
                        Arrays.stream(privateDnsCfg.ips)
                              .filter((ip) -> lp.isReachable(ip))
                              .filter((ip) -> lp.isReachable(ip))
                              .collect(Collectors.toList()))
                              .collect(Collectors.toList()))
                : useTls ? assignedServers  // Opportunistic
                : useTls ? paramsParcel.servers  // Opportunistic
                : new String[0];            // Off
                : new String[0];            // Off

        paramsParcel.tlsFingerprints = new String[0];
        // Prepare to track the validation status of the DNS servers in the
        // Prepare to track the validation status of the DNS servers in the
        // resolver config when private DNS is in opportunistic or strict mode.
        // resolver config when private DNS is in opportunistic or strict mode.
        if (useTls) {
        if (useTls) {
            if (!mPrivateDnsValidationMap.containsKey(netId)) {
            if (!mPrivateDnsValidationMap.containsKey(netId)) {
                mPrivateDnsValidationMap.put(netId, new PrivateDnsValidationStatuses());
                mPrivateDnsValidationMap.put(netId, new PrivateDnsValidationStatuses());
            }
            }
            mPrivateDnsValidationMap.get(netId).updateTrackedDnses(tlsServers, tlsHostname);
            mPrivateDnsValidationMap.get(netId).updateTrackedDnses(paramsParcel.tlsServers,
                    paramsParcel.tlsName);
        } else {
        } else {
            mPrivateDnsValidationMap.remove(netId);
            mPrivateDnsValidationMap.remove(netId);
        }
        }


        Slog.d(TAG, String.format("setDnsConfigurationForNetwork(%d, %s, %s, %s, %s, %s)",
        Slog.d(TAG, String.format("setDnsConfigurationForNetwork(%d, %s, %s, %d, %d, %d, %d, "
                netId, Arrays.toString(assignedServers), Arrays.toString(domainStrs),
                + "%d, %d, %s, %s)", paramsParcel.netId, Arrays.toString(paramsParcel.servers),
                Arrays.toString(params), tlsHostname, Arrays.toString(tlsServers)));
                Arrays.toString(paramsParcel.domains), paramsParcel.sampleValiditySeconds,
        final String[] tlsFingerprints = new String[0];
                paramsParcel.successThreshold, paramsParcel.minSamples,
                paramsParcel.maxSamples, paramsParcel.baseTimeoutMsec,
                paramsParcel.retryCount, paramsParcel.tlsName,
                Arrays.toString(paramsParcel.tlsServers)));

        try {
        try {
            mDnsResolver.setResolverConfiguration(
            mDnsResolver.setResolverConfiguration(paramsParcel);
                    netId, assignedServers, domainStrs, params,
                    tlsHostname, tlsServers, tlsFingerprints);
        } catch (RemoteException | ServiceSpecificException e) {
        } catch (RemoteException | ServiceSpecificException e) {
            Slog.e(TAG, "Error setting DNS configuration: " + e);
            Slog.e(TAG, "Error setting DNS configuration: " + e);
            return;
            return;
+42 −51
Original line number Original line Diff line number Diff line
@@ -131,6 +131,7 @@ import android.net.NetworkStackClient;
import android.net.NetworkState;
import android.net.NetworkState;
import android.net.NetworkUtils;
import android.net.NetworkUtils;
import android.net.ProxyInfo;
import android.net.ProxyInfo;
import android.net.ResolverParamsParcel;
import android.net.RouteInfo;
import android.net.RouteInfo;
import android.net.SocketKeepalive;
import android.net.SocketKeepalive;
import android.net.UidRange;
import android.net.UidRange;
@@ -262,7 +263,8 @@ public class ConnectivityServiceTest {
    @Mock INetd mMockNetd;
    @Mock INetd mMockNetd;
    @Mock NetworkStackClient mNetworkStack;
    @Mock NetworkStackClient mNetworkStack;


    private ArgumentCaptor<String[]> mStringArrayCaptor = ArgumentCaptor.forClass(String[].class);
    private ArgumentCaptor<ResolverParamsParcel> mResolverParamsParcelCaptor =
            ArgumentCaptor.forClass(ResolverParamsParcel.class);


    // This class exists to test bindProcessToNetwork and getBoundNetworkForProcess. These methods
    // This class exists to test bindProcessToNetwork and getBoundNetworkForProcess. These methods
    // do not go through ConnectivityService but talk to netd directly, so they don't automatically
    // do not go through ConnectivityService but talk to netd directly, so they don't automatically
@@ -4819,16 +4821,13 @@ public class ConnectivityServiceTest {
    @Test
    @Test
    public void testBasicDnsConfigurationPushed() throws Exception {
    public void testBasicDnsConfigurationPushed() throws Exception {
        setPrivateDnsSettings(PRIVATE_DNS_MODE_OPPORTUNISTIC, "ignored.example.com");
        setPrivateDnsSettings(PRIVATE_DNS_MODE_OPPORTUNISTIC, "ignored.example.com");
        ArgumentCaptor<String[]> tlsServers = ArgumentCaptor.forClass(String[].class);


        // Clear any interactions that occur as a result of CS starting up.
        // Clear any interactions that occur as a result of CS starting up.
        reset(mMockDnsResolver);
        reset(mMockDnsResolver);


        mCellNetworkAgent = new MockNetworkAgent(TRANSPORT_CELLULAR);
        mCellNetworkAgent = new MockNetworkAgent(TRANSPORT_CELLULAR);
        waitForIdle();
        waitForIdle();
        verify(mMockDnsResolver, never()).setResolverConfiguration(
        verify(mMockDnsResolver, never()).setResolverConfiguration(any());
                anyInt(), eq(EMPTY_STRING_ARRAY), any(), any(), eq(""),
                eq(EMPTY_STRING_ARRAY), eq(EMPTY_STRING_ARRAY));
        verifyNoMoreInteractions(mMockDnsResolver);
        verifyNoMoreInteractions(mMockDnsResolver);


        final LinkProperties cellLp = new LinkProperties();
        final LinkProperties cellLp = new LinkProperties();
@@ -4846,35 +4845,33 @@ public class ConnectivityServiceTest {
        mCellNetworkAgent.connect(false);
        mCellNetworkAgent.connect(false);
        waitForIdle();
        waitForIdle();
        // CS tells netd about the empty DNS config for this network.
        // CS tells netd about the empty DNS config for this network.
        verify(mMockDnsResolver, atLeastOnce()).setResolverConfiguration(
        verify(mMockDnsResolver, atLeastOnce()).setResolverConfiguration(any());
                anyInt(), eq(EMPTY_STRING_ARRAY), any(), any(), eq(""),
                eq(EMPTY_STRING_ARRAY), eq(EMPTY_STRING_ARRAY));
        reset(mMockDnsResolver);
        reset(mMockDnsResolver);


        cellLp.addDnsServer(InetAddress.getByName("2001:db8::1"));
        cellLp.addDnsServer(InetAddress.getByName("2001:db8::1"));
        mCellNetworkAgent.sendLinkProperties(cellLp);
        mCellNetworkAgent.sendLinkProperties(cellLp);
        waitForIdle();
        waitForIdle();
        verify(mMockDnsResolver, atLeastOnce()).setResolverConfiguration(
        verify(mMockDnsResolver, atLeastOnce()).setResolverConfiguration(
                anyInt(), mStringArrayCaptor.capture(), any(), any(),
                mResolverParamsParcelCaptor.capture());
                eq(""), tlsServers.capture(), eq(EMPTY_STRING_ARRAY));
        ResolverParamsParcel resolvrParams = mResolverParamsParcelCaptor.getValue();
        assertEquals(1, mStringArrayCaptor.getValue().length);
        assertEquals(1, resolvrParams.servers.length);
        assertTrue(ArrayUtils.contains(mStringArrayCaptor.getValue(), "2001:db8::1"));
        assertTrue(ArrayUtils.contains(resolvrParams.servers, "2001:db8::1"));
        // Opportunistic mode.
        // Opportunistic mode.
        assertTrue(ArrayUtils.contains(tlsServers.getValue(), "2001:db8::1"));
        assertTrue(ArrayUtils.contains(resolvrParams.tlsServers, "2001:db8::1"));
        reset(mMockDnsResolver);
        reset(mMockDnsResolver);


        cellLp.addDnsServer(InetAddress.getByName("192.0.2.1"));
        cellLp.addDnsServer(InetAddress.getByName("192.0.2.1"));
        mCellNetworkAgent.sendLinkProperties(cellLp);
        mCellNetworkAgent.sendLinkProperties(cellLp);
        waitForIdle();
        waitForIdle();
        verify(mMockDnsResolver, atLeastOnce()).setResolverConfiguration(
        verify(mMockDnsResolver, atLeastOnce()).setResolverConfiguration(
                anyInt(), mStringArrayCaptor.capture(), any(), any(),
                mResolverParamsParcelCaptor.capture());
                eq(""), tlsServers.capture(), eq(EMPTY_STRING_ARRAY));
        resolvrParams = mResolverParamsParcelCaptor.getValue();
        assertEquals(2, mStringArrayCaptor.getValue().length);
        assertEquals(2, resolvrParams.servers.length);
        assertTrue(ArrayUtils.containsAll(mStringArrayCaptor.getValue(),
        assertTrue(ArrayUtils.containsAll(resolvrParams.servers,
                new String[]{"2001:db8::1", "192.0.2.1"}));
                new String[]{"2001:db8::1", "192.0.2.1"}));
        // Opportunistic mode.
        // Opportunistic mode.
        assertEquals(2, tlsServers.getValue().length);
        assertEquals(2, resolvrParams.tlsServers.length);
        assertTrue(ArrayUtils.containsAll(tlsServers.getValue(),
        assertTrue(ArrayUtils.containsAll(resolvrParams.tlsServers,
                new String[]{"2001:db8::1", "192.0.2.1"}));
                new String[]{"2001:db8::1", "192.0.2.1"}));
        reset(mMockDnsResolver);
        reset(mMockDnsResolver);


@@ -4887,18 +4884,16 @@ public class ConnectivityServiceTest {


        waitForIdle();
        waitForIdle();
        verify(mMockDnsResolver, atLeastOnce()).setResolverConfiguration(
        verify(mMockDnsResolver, atLeastOnce()).setResolverConfiguration(
                anyInt(), mStringArrayCaptor.capture(), any(), any(),
                mResolverParamsParcelCaptor.capture());
                eq(TLS_SPECIFIER), eq(TLS_SERVERS), eq(EMPTY_STRING_ARRAY));
        resolvrParams = mResolverParamsParcelCaptor.getValue();
        assertEquals(2, mStringArrayCaptor.getValue().length);
        assertEquals(2, resolvrParams.servers.length);
        assertTrue(ArrayUtils.containsAll(mStringArrayCaptor.getValue(),
        assertTrue(ArrayUtils.containsAll(resolvrParams.servers,
                new String[]{"2001:db8::1", "192.0.2.1"}));
                new String[]{"2001:db8::1", "192.0.2.1"}));
        reset(mMockDnsResolver);
        reset(mMockDnsResolver);
    }
    }


    @Test
    @Test
    public void testPrivateDnsSettingsChange() throws Exception {
    public void testPrivateDnsSettingsChange() throws Exception {
        ArgumentCaptor<String[]> tlsServers = ArgumentCaptor.forClass(String[].class);

        // Clear any interactions that occur as a result of CS starting up.
        // Clear any interactions that occur as a result of CS starting up.
        reset(mMockDnsResolver);
        reset(mMockDnsResolver);


@@ -4913,9 +4908,7 @@ public class ConnectivityServiceTest {
        mCellNetworkAgent = new MockNetworkAgent(TRANSPORT_CELLULAR);
        mCellNetworkAgent = new MockNetworkAgent(TRANSPORT_CELLULAR);
        waitForIdle();
        waitForIdle();
        // CS tells netd about the empty DNS config for this network.
        // CS tells netd about the empty DNS config for this network.
        verify(mMockDnsResolver, never()).setResolverConfiguration(
        verify(mMockDnsResolver, never()).setResolverConfiguration(any());
                anyInt(), eq(EMPTY_STRING_ARRAY), any(), any(), eq(""),
                eq(EMPTY_STRING_ARRAY), eq(EMPTY_STRING_ARRAY));
        verifyNoMoreInteractions(mMockDnsResolver);
        verifyNoMoreInteractions(mMockDnsResolver);


        final LinkProperties cellLp = new LinkProperties();
        final LinkProperties cellLp = new LinkProperties();
@@ -4936,14 +4929,14 @@ public class ConnectivityServiceTest {
        mCellNetworkAgent.connect(false);
        mCellNetworkAgent.connect(false);
        waitForIdle();
        waitForIdle();
        verify(mMockDnsResolver, atLeastOnce()).setResolverConfiguration(
        verify(mMockDnsResolver, atLeastOnce()).setResolverConfiguration(
                anyInt(), mStringArrayCaptor.capture(), any(), any(),
                mResolverParamsParcelCaptor.capture());
                eq(""), tlsServers.capture(), eq(EMPTY_STRING_ARRAY));
        ResolverParamsParcel resolvrParams = mResolverParamsParcelCaptor.getValue();
        assertEquals(2, mStringArrayCaptor.getValue().length);
        assertEquals(2, resolvrParams.tlsServers.length);
        assertTrue(ArrayUtils.containsAll(mStringArrayCaptor.getValue(),
        assertTrue(ArrayUtils.containsAll(resolvrParams.tlsServers,
                new String[]{"2001:db8::1", "192.0.2.1"}));
                new String[]{"2001:db8::1", "192.0.2.1"}));
        // Opportunistic mode.
        // Opportunistic mode.
        assertEquals(2, tlsServers.getValue().length);
        assertEquals(2, resolvrParams.tlsServers.length);
        assertTrue(ArrayUtils.containsAll(tlsServers.getValue(),
        assertTrue(ArrayUtils.containsAll(resolvrParams.tlsServers,
                new String[]{"2001:db8::1", "192.0.2.1"}));
                new String[]{"2001:db8::1", "192.0.2.1"}));
        reset(mMockDnsResolver);
        reset(mMockDnsResolver);
        cellNetworkCallback.expectCallback(CallbackState.AVAILABLE, mCellNetworkAgent);
        cellNetworkCallback.expectCallback(CallbackState.AVAILABLE, mCellNetworkAgent);
@@ -4958,23 +4951,23 @@ public class ConnectivityServiceTest {


        setPrivateDnsSettings(PRIVATE_DNS_MODE_OFF, "ignored.example.com");
        setPrivateDnsSettings(PRIVATE_DNS_MODE_OFF, "ignored.example.com");
        verify(mMockDnsResolver, times(1)).setResolverConfiguration(
        verify(mMockDnsResolver, times(1)).setResolverConfiguration(
                anyInt(), mStringArrayCaptor.capture(), any(), any(),
                mResolverParamsParcelCaptor.capture());
                eq(""), eq(EMPTY_STRING_ARRAY), eq(EMPTY_STRING_ARRAY));
        resolvrParams = mResolverParamsParcelCaptor.getValue();
        assertEquals(2, mStringArrayCaptor.getValue().length);
        assertEquals(2, resolvrParams.servers.length);
        assertTrue(ArrayUtils.containsAll(mStringArrayCaptor.getValue(),
        assertTrue(ArrayUtils.containsAll(resolvrParams.servers,
                new String[]{"2001:db8::1", "192.0.2.1"}));
                new String[]{"2001:db8::1", "192.0.2.1"}));
        reset(mMockDnsResolver);
        reset(mMockDnsResolver);
        cellNetworkCallback.assertNoCallback();
        cellNetworkCallback.assertNoCallback();


        setPrivateDnsSettings(PRIVATE_DNS_MODE_OPPORTUNISTIC, "ignored.example.com");
        setPrivateDnsSettings(PRIVATE_DNS_MODE_OPPORTUNISTIC, "ignored.example.com");
        verify(mMockDnsResolver, atLeastOnce()).setResolverConfiguration(
        verify(mMockDnsResolver, atLeastOnce()).setResolverConfiguration(
                anyInt(), mStringArrayCaptor.capture(), any(), any(),
                mResolverParamsParcelCaptor.capture());
                eq(""), tlsServers.capture(), eq(EMPTY_STRING_ARRAY));
        resolvrParams = mResolverParamsParcelCaptor.getValue();
        assertEquals(2, mStringArrayCaptor.getValue().length);
        assertEquals(2, resolvrParams.servers.length);
        assertTrue(ArrayUtils.containsAll(mStringArrayCaptor.getValue(),
        assertTrue(ArrayUtils.containsAll(resolvrParams.servers,
                new String[]{"2001:db8::1", "192.0.2.1"}));
                new String[]{"2001:db8::1", "192.0.2.1"}));
        assertEquals(2, tlsServers.getValue().length);
        assertEquals(2, resolvrParams.tlsServers.length);
        assertTrue(ArrayUtils.containsAll(tlsServers.getValue(),
        assertTrue(ArrayUtils.containsAll(resolvrParams.tlsServers,
                new String[]{"2001:db8::1", "192.0.2.1"}));
                new String[]{"2001:db8::1", "192.0.2.1"}));
        reset(mMockDnsResolver);
        reset(mMockDnsResolver);
        cellNetworkCallback.assertNoCallback();
        cellNetworkCallback.assertNoCallback();
@@ -5826,9 +5819,7 @@ public class ConnectivityServiceTest {
        mCellNetworkAgent.sendLinkProperties(cellLp);
        mCellNetworkAgent.sendLinkProperties(cellLp);
        networkCallback.expectCallback(CallbackState.LINK_PROPERTIES, mCellNetworkAgent);
        networkCallback.expectCallback(CallbackState.LINK_PROPERTIES, mCellNetworkAgent);
        verify(mMockDnsResolver, times(1)).stopPrefix64Discovery(cellNetId);
        verify(mMockDnsResolver, times(1)).stopPrefix64Discovery(cellNetId);
        verify(mMockDnsResolver, atLeastOnce()).setResolverConfiguration(
        verify(mMockDnsResolver, atLeastOnce()).setResolverConfiguration(any());
                eq(cellNetId), eq(EMPTY_STRING_ARRAY), any(), any(),
                eq(""), eq(EMPTY_STRING_ARRAY), eq(EMPTY_STRING_ARRAY));


        verifyNoMoreInteractions(mMockNetd);
        verifyNoMoreInteractions(mMockNetd);
        verifyNoMoreInteractions(mMockDnsResolver);
        verifyNoMoreInteractions(mMockDnsResolver);
@@ -5871,10 +5862,10 @@ public class ConnectivityServiceTest {
        assertEquals(makeClatLinkProperties(myIpv4), stackedLpsAfterChange.get(0));
        assertEquals(makeClatLinkProperties(myIpv4), stackedLpsAfterChange.get(0));


        verify(mMockDnsResolver, times(1)).setResolverConfiguration(
        verify(mMockDnsResolver, times(1)).setResolverConfiguration(
                eq(cellNetId), mStringArrayCaptor.capture(), any(), any(),
                mResolverParamsParcelCaptor.capture());
                eq(""), eq(EMPTY_STRING_ARRAY), eq(EMPTY_STRING_ARRAY));
        ResolverParamsParcel resolvrParams = mResolverParamsParcelCaptor.getValue();
        assertEquals(1, mStringArrayCaptor.getValue().length);
        assertEquals(1, resolvrParams.servers.length);
        assertTrue(ArrayUtils.contains(mStringArrayCaptor.getValue(), "8.8.8.8"));
        assertTrue(ArrayUtils.contains(resolvrParams.servers, "8.8.8.8"));


        // Add ipv4 address, expect that clatd and prefix discovery are stopped and stacked
        // Add ipv4 address, expect that clatd and prefix discovery are stopped and stacked
        // linkproperties are cleaned up.
        // linkproperties are cleaned up.