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;