Always try to set/remove default routes
Must clean up default route if a default 3g connection is replaced
by a non-default (ie, mms) connection on the same interface.
Also stop mucking with all connections dns and routes - do it only
for the connection that has changed.
bug:2865974
Change-Id: I589a0b2768b5e67b608fde181e7ddbd7fce4f491
diff --git a/services/java/com/android/server/ConnectivityService.java b/services/java/com/android/server/ConnectivityService.java
index 311efc8..a204b36 100644
--- a/services/java/com/android/server/ConnectivityService.java
+++ b/services/java/com/android/server/ConnectivityService.java
@@ -605,7 +605,7 @@
!network.isTeardownRequested()) {
if (ni.isConnected() == true) {
// add the pid-specific dns
- handleDnsConfigurationChange();
+ handleDnsConfigurationChange(networkType);
if (DBG) Slog.d(TAG, "special network already active");
return Phone.APN_ALREADY_ACTIVE;
}
@@ -967,7 +967,7 @@
}
}
// do this before we broadcast the change
- handleConnectivityChange();
+ handleConnectivityChange(prevNetType);
sendStickyBroadcast(intent);
/*
@@ -1123,9 +1123,6 @@
}
}
- // do this before we broadcast the change
- handleConnectivityChange();
-
sendStickyBroadcast(intent);
/*
* If the failover network is already connected, then immediately send
@@ -1204,7 +1201,7 @@
}
thisNet.setTeardownRequested(false);
updateNetworkSettings(thisNet);
- handleConnectivityChange();
+ handleConnectivityChange(type);
sendConnectedBroadcast(info);
}
@@ -1231,38 +1228,29 @@
}
/**
- * After any kind of change in the connectivity state of any network,
- * make sure that anything that depends on the connectivity state of
- * more than one network is set up correctly. We're mainly concerned
- * with making sure that the list of DNS servers is set up according
- * to which networks are connected, and ensuring that the right routing
- * table entries exist.
+ * After a change in the connectivity state of a network. We're mainly
+ * concerned with making sure that the list of DNS servers is set up
+ * according to which networks are connected, and ensuring that the
+ * right routing table entries exist.
*/
- private void handleConnectivityChange() {
+ private void handleConnectivityChange(int netType) {
/*
* If a non-default network is enabled, add the host routes that
- * will allow it's DNS servers to be accessed. Only
- * If both mobile and wifi are enabled, add the host routes that
- * will allow MMS traffic to pass on the mobile network. But
- * remove the default route for the mobile network, so that there
- * will be only one default route, to ensure that all traffic
- * except MMS will travel via Wi-Fi.
+ * will allow it's DNS servers to be accessed.
*/
- handleDnsConfigurationChange();
+ handleDnsConfigurationChange(netType);
- for (int netType : mPriorityList) {
- if (mNetTrackers[netType].getNetworkInfo().isConnected()) {
- if (mNetAttributes[netType].isDefault()) {
- addDefaultRoute(mNetTrackers[netType]);
- } else {
- addPrivateDnsRoutes(mNetTrackers[netType]);
- }
+ if (mNetTrackers[netType].getNetworkInfo().isConnected()) {
+ if (mNetAttributes[netType].isDefault()) {
+ addDefaultRoute(mNetTrackers[netType]);
} else {
- if (mNetAttributes[netType].isDefault()) {
- removeDefaultRoute(mNetTrackers[netType]);
- } else {
- removePrivateDnsRoutes(mNetTrackers[netType]);
- }
+ addPrivateDnsRoutes(mNetTrackers[netType]);
+ }
+ } else {
+ if (mNetAttributes[netType].isDefault()) {
+ removeDefaultRoute(mNetTrackers[netType]);
+ } else {
+ removePrivateDnsRoutes(mNetTrackers[netType]);
}
}
}
@@ -1310,18 +1298,13 @@
if (p == null) return;
String interfaceName = p.getInterfaceName();
InetAddress defaultGatewayAddr = p.getGateway();
- boolean defaultRouteSet = nt.isDefaultRouteSet();
- if ((interfaceName != null) && (defaultGatewayAddr != null ) &&
- (defaultRouteSet == false)) {
- boolean error = (NetworkUtils.setDefaultRoute(interfaceName, defaultGatewayAddr) < 0);
-
- if (DBG && !error) {
+ if ((interfaceName != null) && (defaultGatewayAddr != null )) {
+ if ((NetworkUtils.setDefaultRoute(interfaceName, defaultGatewayAddr) >= 0) && DBG) {
NetworkInfo networkInfo = nt.getNetworkInfo();
Slog.d(TAG, "addDefaultRoute for " + networkInfo.getTypeName() +
" (" + interfaceName + "), GatewayAddr=" + defaultGatewayAddr);
}
- nt.defaultRouteSet(!error);
}
}
@@ -1330,16 +1313,13 @@
NetworkProperties p = nt.getNetworkProperties();
if (p == null) return;
String interfaceName = p.getInterfaceName();
- boolean defaultRouteSet = nt.isDefaultRouteSet();
- if (interfaceName != null && defaultRouteSet == true) {
- boolean error = (NetworkUtils.removeDefaultRoute(interfaceName) < 0);
- if (DBG && !error) {
+ if (interfaceName != null) {
+ if ((NetworkUtils.removeDefaultRoute(interfaceName) >= 0) && DBG) {
NetworkInfo networkInfo = nt.getNetworkInfo();
Slog.d(TAG, "removeDefaultRoute for " + networkInfo.getTypeName() + " (" +
interfaceName + ")");
}
- nt.defaultRouteSet(error);
}
}
@@ -1480,42 +1460,37 @@
SystemProperties.set("net.dnschange", "" + (n+1));
}
- private void handleDnsConfigurationChange() {
+ private void handleDnsConfigurationChange(int netType) {
// add default net's dns entries
- for (int x = mPriorityList.length-1; x>= 0; x--) {
- int netType = mPriorityList[x];
- NetworkStateTracker nt = mNetTrackers[netType];
- if (nt != null && nt.getNetworkInfo().isConnected() &&
- !nt.isTeardownRequested()) {
- NetworkProperties p = nt.getNetworkProperties();
- if (p == null) continue;
- Collection<InetAddress> dnses = p.getDnses();
- if (mNetAttributes[netType].isDefault()) {
- int j = 1;
- for (InetAddress dns : dnses) {
- if (DBG) {
- Slog.d(TAG, "adding dns " + dns + " for " +
- nt.getNetworkInfo().getTypeName());
- }
- SystemProperties.set("net.dns" + j++, dns.getHostAddress());
+ NetworkStateTracker nt = mNetTrackers[netType];
+ if (nt != null && nt.getNetworkInfo().isConnected() && !nt.isTeardownRequested()) {
+ NetworkProperties p = nt.getNetworkProperties();
+ if (p == null) return;
+ Collection<InetAddress> dnses = p.getDnses();
+ if (mNetAttributes[netType].isDefault()) {
+ int j = 1;
+ for (InetAddress dns : dnses) {
+ if (DBG) {
+ Slog.d(TAG, "adding dns " + dns + " for " +
+ nt.getNetworkInfo().getTypeName());
}
- for (int k=j ; k<mNumDnsEntries; k++) {
- if (DBG) Slog.d(TAG, "erasing net.dns" + k);
- SystemProperties.set("net.dns" + k, "");
- }
- mNumDnsEntries = j;
- } else {
- // set per-pid dns for attached secondary nets
- List pids = mNetRequestersPids[netType];
- for (int y=0; y< pids.size(); y++) {
- Integer pid = (Integer)pids.get(y);
- writePidDns(dnses, pid.intValue());
- }
+ SystemProperties.set("net.dns" + j++, dns.getHostAddress());
+ }
+ for (int k=j ; k<mNumDnsEntries; k++) {
+ if (DBG) Slog.d(TAG, "erasing net.dns" + k);
+ SystemProperties.set("net.dns" + k, "");
+ }
+ mNumDnsEntries = j;
+ } else {
+ // set per-pid dns for attached secondary nets
+ List pids = mNetRequestersPids[netType];
+ for (int y=0; y< pids.size(); y++) {
+ Integer pid = (Integer)pids.get(y);
+ writePidDns(dnses, pid.intValue());
}
}
+ bumpDns();
}
-
- bumpDns();
}
private int getRestoreDefaultNetworkDelay() {
@@ -1654,9 +1629,11 @@
(Notification) msg.obj);
case NetworkStateTracker.EVENT_CONFIGURATION_CHANGED:
- handleDnsConfigurationChange();
+ // TODO - make this handle ip/proxy/gateway/dns changes
+ info = (NetworkInfo) msg.obj;
+ type = info.getType();
+ handleDnsConfigurationChange(type);
break;
-
case NetworkStateTracker.EVENT_ROAMING_CHANGED:
// fill me in
break;