OSDN Git Service

DO NOT MERGE Pick upstream intf with valid IP conf
authorIrfan Sheriff <isheriff@google.com>
Mon, 17 Jan 2011 20:38:30 +0000 (12:38 -0800)
committerIrfan Sheriff <isheriff@google.com>
Fri, 25 Mar 2011 17:09:55 +0000 (10:09 -0700)
As a work around for the issue of picking
the wrong interface, add a check for selecting
an upstream interface that has a valid IP configuration

Bug: 3362306
Change-Id: I3e8ab5ef30b69f1adab755d83f5b65c078f73936

core/java/android/net/InterfaceConfiguration.java
services/java/com/android/server/connectivity/Tethering.java

index 915c5d7..dcea3af 100644 (file)
@@ -51,6 +51,24 @@ public class InterfaceConfiguration implements Parcelable {
             append(addr & 0xff);
     }
 
+    /**
+     * This function determines if the interface is up and has a valid IP
+     * configuration (IP address has a non zero octet).
+     *
+     * Note: It is supposed to be quick and hence should not initiate
+     * any network activity
+     */
+    public boolean isActive() {
+        try {
+            if(interfaceFlags.contains("up")) {
+                if (ipAddr != 0) return true;
+            }
+        } catch (NullPointerException e) {
+            return false;
+        }
+        return false;
+    }
+
     /** Implement the Parcelable interface {@hide} */
     public int describeContents() {
         return 0;
index f774b29..1ec9b51 100644 (file)
@@ -1173,18 +1173,18 @@ public class Tethering extends INetworkManagementEventObserver.Stub {
                 for (String iface : ifaces) {
                     for (String regex : mUpstreamIfaceRegexs) {
                         if (iface.matches(regex)) {
-                            // verify it is up!
+                            // verify it is active
                             InterfaceConfiguration ifcg = null;
                             try {
                                 ifcg = service.getInterfaceConfig(iface);
+                                if (ifcg.isActive()) {
+                                    return iface;
+                                }
                             } catch (Exception e) {
                                 Log.e(TAG, "Error getting iface config :" + e);
                                 // ignore - try next
                                 continue;
                             }
-                            if (ifcg.interfaceFlags.contains("up")) {
-                                return iface;
-                            }
                         }
                     }
                 }