Merge "Pass all relevant resolver info to netd"

am: ce907ddfc4

Change-Id: If4f46b030fe141a6904a48966e5ab34ffb6b10bc
This commit is contained in:
Erik Kline
2018-03-24 01:07:10 +00:00
committed by android-build-merger
3 changed files with 64 additions and 26 deletions

View File

@@ -4535,17 +4535,17 @@ public class ConnectivityService extends IConnectivityManager.Stub
return nai.network.netId; return nai.network.netId;
} }
private void handleRegisterNetworkAgent(NetworkAgentInfo na) { private void handleRegisterNetworkAgent(NetworkAgentInfo nai) {
if (VDBG) log("Got NetworkAgent Messenger"); if (VDBG) log("Got NetworkAgent Messenger");
mNetworkAgentInfos.put(na.messenger, na); mNetworkAgentInfos.put(nai.messenger, nai);
synchronized (mNetworkForNetId) { synchronized (mNetworkForNetId) {
mNetworkForNetId.put(na.network.netId, na); mNetworkForNetId.put(nai.network.netId, nai);
} }
na.asyncChannel.connect(mContext, mTrackerHandler, na.messenger); nai.asyncChannel.connect(mContext, mTrackerHandler, nai.messenger);
NetworkInfo networkInfo = na.networkInfo; NetworkInfo networkInfo = nai.networkInfo;
na.networkInfo = null; nai.networkInfo = null;
updateNetworkInfo(na, networkInfo); updateNetworkInfo(nai, networkInfo);
updateUids(na, null, na.networkCapabilities); updateUids(nai, null, nai.networkCapabilities);
} }
private void updateLinkProperties(NetworkAgentInfo networkAgent, LinkProperties oldLp) { private void updateLinkProperties(NetworkAgentInfo networkAgent, LinkProperties oldLp) {

View File

@@ -192,6 +192,12 @@ 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();
final int[] params = { mSampleValidity, mSuccessThreshold, mMinSamples, mMaxSamples };
// 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
// NetworkMonitor to decide which networks need validation and runs the // NetworkMonitor to decide which networks need validation and runs the
@@ -204,23 +210,20 @@ public class DnsManager {
final boolean useTls = (privateDnsCfg != null) && privateDnsCfg.useTls; final boolean useTls = (privateDnsCfg != null) && privateDnsCfg.useTls;
final boolean strictMode = (privateDnsCfg != null) && privateDnsCfg.inStrictMode(); final boolean strictMode = (privateDnsCfg != null) && privateDnsCfg.inStrictMode();
final String tlsHostname = strictMode ? privateDnsCfg.hostname : ""; final String tlsHostname = strictMode ? privateDnsCfg.hostname : "";
final String[] tlsServers =
final String[] serverStrs = NetworkUtils.makeStrings( strictMode ? NetworkUtils.makeStrings(
strictMode ? Arrays.stream(privateDnsCfg.ips) Arrays.stream(privateDnsCfg.ips)
.filter((ip) -> lp.isReachable(ip)) .filter((ip) -> lp.isReachable(ip))
.collect(Collectors.toList()) .collect(Collectors.toList()))
: lp.getDnsServers()); : useTls ? assignedServers // Opportunistic
final String[] domainStrs = getDomainStrings(lp.getDomains()); : new String[0]; // Off
updateParametersSettings();
final int[] params = { mSampleValidity, mSuccessThreshold, mMinSamples, mMaxSamples };
Slog.d(TAG, String.format("setDnsConfigurationForNetwork(%d, %s, %s, %s, %s, %s)", Slog.d(TAG, String.format("setDnsConfigurationForNetwork(%d, %s, %s, %s, %s, %s)",
netId, Arrays.toString(serverStrs), Arrays.toString(domainStrs), netId, Arrays.toString(assignedServers), Arrays.toString(domainStrs),
Arrays.toString(params), useTls, tlsHostname)); Arrays.toString(params), tlsHostname, Arrays.toString(tlsServers)));
try { try {
mNMS.setDnsConfigurationForNetwork( mNMS.setDnsConfigurationForNetwork(
netId, serverStrs, domainStrs, params, useTls, tlsHostname); netId, assignedServers, domainStrs, params, tlsHostname, tlsServers);
} catch (Exception e) { } catch (Exception e) {
Slog.e(TAG, "Error setting DNS configuration: " + e); Slog.e(TAG, "Error setting DNS configuration: " + e);
return; return;

View File

@@ -63,6 +63,7 @@ import static org.mockito.Matchers.anyInt;
import static org.mockito.Matchers.anyString; import static org.mockito.Matchers.anyString;
import static org.mockito.Mockito.any; import static org.mockito.Mockito.any;
import static org.mockito.Mockito.atLeastOnce; import static org.mockito.Mockito.atLeastOnce;
import static org.mockito.Mockito.eq;
import static org.mockito.Mockito.mock; import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never; import static org.mockito.Mockito.never;
import static org.mockito.Mockito.reset; import static org.mockito.Mockito.reset;
@@ -133,6 +134,7 @@ import com.android.internal.util.test.BroadcastInterceptingContext;
import com.android.internal.util.test.FakeSettingsProvider; import com.android.internal.util.test.FakeSettingsProvider;
import com.android.server.connectivity.ConnectivityConstants; import com.android.server.connectivity.ConnectivityConstants;
import com.android.server.connectivity.DefaultNetworkMetrics; import com.android.server.connectivity.DefaultNetworkMetrics;
import com.android.server.connectivity.DnsManager;
import com.android.server.connectivity.IpConnectivityMetrics; import com.android.server.connectivity.IpConnectivityMetrics;
import com.android.server.connectivity.MockableSystemProperties; import com.android.server.connectivity.MockableSystemProperties;
import com.android.server.connectivity.NetworkAgentInfo; import com.android.server.connectivity.NetworkAgentInfo;
@@ -749,6 +751,7 @@ public class ConnectivityServiceTest {
// NetworkMonitor implementation allowing overriding of Internet connectivity probe result. // NetworkMonitor implementation allowing overriding of Internet connectivity probe result.
private class WrappedNetworkMonitor extends NetworkMonitor { private class WrappedNetworkMonitor extends NetworkMonitor {
public Handler connectivityHandler;
// HTTP response code fed back to NetworkMonitor for Internet connectivity probe. // HTTP response code fed back to NetworkMonitor for Internet connectivity probe.
public int gen204ProbeResult = 500; public int gen204ProbeResult = 500;
public String gen204ProbeRedirectUrl = null; public String gen204ProbeRedirectUrl = null;
@@ -758,6 +761,7 @@ public class ConnectivityServiceTest {
IpConnectivityLog log) { IpConnectivityLog log) {
super(context, handler, networkAgentInfo, defaultRequest, log, super(context, handler, networkAgentInfo, defaultRequest, log,
NetworkMonitor.NetworkMonitorSettings.DEFAULT); NetworkMonitor.NetworkMonitorSettings.DEFAULT);
connectivityHandler = handler;
} }
@Override @Override
@@ -3664,18 +3668,29 @@ public class ConnectivityServiceTest {
@Test @Test
public void testBasicDnsConfigurationPushed() throws Exception { public void testBasicDnsConfigurationPushed() throws Exception {
final String IFNAME = "test_rmnet_data0";
final String[] EMPTY_TLS_SERVERS = new String[0];
mCellNetworkAgent = new MockNetworkAgent(TRANSPORT_CELLULAR); mCellNetworkAgent = new MockNetworkAgent(TRANSPORT_CELLULAR);
waitForIdle(); waitForIdle();
verify(mNetworkManagementService, never()).setDnsConfigurationForNetwork( verify(mNetworkManagementService, never()).setDnsConfigurationForNetwork(
anyInt(), any(), any(), any(), anyBoolean(), anyString()); anyInt(), any(), any(), any(), anyString(), eq(EMPTY_TLS_SERVERS));
final LinkProperties cellLp = new LinkProperties(); final LinkProperties cellLp = new LinkProperties();
cellLp.setInterfaceName("test_rmnet_data0"); cellLp.setInterfaceName(IFNAME);
// Add IPv4 and IPv6 default routes, because DNS-over-TLS code does
// "is-reachable" testing in order to not program netd with unreachable
// nameservers that it might try repeated to validate.
cellLp.addLinkAddress(new LinkAddress("192.0.2.4/24"));
cellLp.addRoute(new RouteInfo((IpPrefix) null, InetAddress.getByName("192.0.2.4"), IFNAME));
cellLp.addLinkAddress(new LinkAddress("2001:db8:1::1/64"));
cellLp.addRoute(
new RouteInfo((IpPrefix) null, InetAddress.getByName("2001:db8:1::1"), IFNAME));
mCellNetworkAgent.sendLinkProperties(cellLp); mCellNetworkAgent.sendLinkProperties(cellLp);
mCellNetworkAgent.connect(false); mCellNetworkAgent.connect(false);
waitForIdle(); waitForIdle();
verify(mNetworkManagementService, times(1)).setDnsConfigurationForNetwork( verify(mNetworkManagementService, times(1)).setDnsConfigurationForNetwork(
anyInt(), mStringArrayCaptor.capture(), any(), any(), anyBoolean(), anyString()); anyInt(), mStringArrayCaptor.capture(), any(), any(),
anyString(), eq(EMPTY_TLS_SERVERS));
// CS tells netd about the empty DNS config for this network. // CS tells netd about the empty DNS config for this network.
assertEmpty(mStringArrayCaptor.getValue()); assertEmpty(mStringArrayCaptor.getValue());
reset(mNetworkManagementService); reset(mNetworkManagementService);
@@ -3684,7 +3699,8 @@ public class ConnectivityServiceTest {
mCellNetworkAgent.sendLinkProperties(cellLp); mCellNetworkAgent.sendLinkProperties(cellLp);
waitForIdle(); waitForIdle();
verify(mNetworkManagementService, times(1)).setDnsConfigurationForNetwork( verify(mNetworkManagementService, times(1)).setDnsConfigurationForNetwork(
anyInt(), mStringArrayCaptor.capture(), any(), any(), anyBoolean(), anyString()); anyInt(), mStringArrayCaptor.capture(), any(), any(),
anyString(), eq(EMPTY_TLS_SERVERS));
assertEquals(1, mStringArrayCaptor.getValue().length); assertEquals(1, mStringArrayCaptor.getValue().length);
assertTrue(ArrayUtils.contains(mStringArrayCaptor.getValue(), "2001:db8::1")); assertTrue(ArrayUtils.contains(mStringArrayCaptor.getValue(), "2001:db8::1"));
reset(mNetworkManagementService); reset(mNetworkManagementService);
@@ -3693,7 +3709,26 @@ public class ConnectivityServiceTest {
mCellNetworkAgent.sendLinkProperties(cellLp); mCellNetworkAgent.sendLinkProperties(cellLp);
waitForIdle(); waitForIdle();
verify(mNetworkManagementService, times(1)).setDnsConfigurationForNetwork( verify(mNetworkManagementService, times(1)).setDnsConfigurationForNetwork(
anyInt(), mStringArrayCaptor.capture(), any(), any(), anyBoolean(), anyString()); anyInt(), mStringArrayCaptor.capture(), any(), any(),
anyString(), eq(EMPTY_TLS_SERVERS));
assertEquals(2, mStringArrayCaptor.getValue().length);
assertTrue(ArrayUtils.containsAll(mStringArrayCaptor.getValue(),
new String[]{"2001:db8::1", "192.0.2.1"}));
reset(mNetworkManagementService);
final String TLS_SPECIFIER = "tls.example.com";
final String TLS_SERVER6 = "2001:db8:53::53";
final InetAddress[] TLS_IPS = new InetAddress[]{ InetAddress.getByName(TLS_SERVER6) };
final String[] TLS_SERVERS = new String[]{ TLS_SERVER6 };
final Handler h = mCellNetworkAgent.getWrappedNetworkMonitor().connectivityHandler;
h.sendMessage(h.obtainMessage(
NetworkMonitor.EVENT_PRIVATE_DNS_CONFIG_RESOLVED, 0,
mCellNetworkAgent.getNetwork().netId,
new DnsManager.PrivateDnsConfig(TLS_SPECIFIER, TLS_IPS)));
waitForIdle();
verify(mNetworkManagementService, times(1)).setDnsConfigurationForNetwork(
anyInt(), mStringArrayCaptor.capture(), any(), any(),
eq(TLS_SPECIFIER), eq(TLS_SERVERS));
assertEquals(2, mStringArrayCaptor.getValue().length); assertEquals(2, mStringArrayCaptor.getValue().length);
assertTrue(ArrayUtils.containsAll(mStringArrayCaptor.getValue(), assertTrue(ArrayUtils.containsAll(mStringArrayCaptor.getValue(),
new String[]{"2001:db8::1", "192.0.2.1"})); new String[]{"2001:db8::1", "192.0.2.1"}));