summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Mike J. Chen <mjchen@google.com> 2011-06-27 12:56:47 -0700
committer Android (Google) Code Review <android-gerrit@google.com> 2011-06-27 12:56:47 -0700
commit04b9cafb321af43e3844c640e38860ca60a3a36d (patch)
tree82a3f30325caeadd65f4f4e50caa8f4fd5dfc7a3
parenta20cdc06e599c6fef784a0a479e8329f95e4bd09 (diff)
parentf59c7d0f2ac8d489b6d8118543a57ea4a603eacf (diff)
Merge changes I0077e5e5,I42cbed69
* changes: Hookup interface status to other clients Revert "Revert "Propagate new link-status-change message to any NetworkManagementService""
-rw-r--r--core/java/android/net/EthernetDataTracker.java40
-rw-r--r--core/java/android/net/INetworkManagementEventObserver.aidl15
-rw-r--r--services/java/com/android/server/NetworkManagementService.java26
-rw-r--r--services/java/com/android/server/ThrottleService.java7
-rw-r--r--services/java/com/android/server/connectivity/Tethering.java11
-rw-r--r--services/java/com/android/server/connectivity/Vpn.java6
6 files changed, 84 insertions, 21 deletions
diff --git a/core/java/android/net/EthernetDataTracker.java b/core/java/android/net/EthernetDataTracker.java
index 6f922476d06c..a866436ed77d 100644
--- a/core/java/android/net/EthernetDataTracker.java
+++ b/core/java/android/net/EthernetDataTracker.java
@@ -53,6 +53,7 @@ public class EthernetDataTracker implements NetworkStateTracker {
private AtomicInteger mDefaultGatewayAddr = new AtomicInteger(0);
private AtomicBoolean mDefaultRouteSet = new AtomicBoolean(false);
+ private static boolean mLinkUp;
private LinkProperties mLinkProperties;
private LinkCapabilities mLinkCapabilities;
private NetworkInfo mNetworkInfo;
@@ -74,8 +75,25 @@ public class EthernetDataTracker implements NetworkStateTracker {
mTracker = tracker;
}
- public void interfaceLinkStatusChanged(String iface, boolean up) {
- Log.d(TAG, "Interface " + iface + " link " + (up ? "up" : "down"));
+ public void interfaceStatusChanged(String iface, boolean up) {
+ Log.d(TAG, "Interface status changed: " + iface + (up ? "up" : "down"));
+ }
+
+ public void interfaceLinkStateChanged(String iface, boolean up) {
+ if (mIface.equals(iface) && mLinkUp != up) {
+ Log.d(TAG, "Interface " + iface + " link " + (up ? "up" : "down"));
+ mLinkUp = up;
+
+ // use DHCP
+ if (up) {
+ mTracker.reconnect();
+ } else {
+ NetworkUtils.stopDhcp(mIface);
+ mTracker.mNetworkInfo.setIsAvailable(false);
+ mTracker.mNetworkInfo.setDetailedState(DetailedState.DISCONNECTED,
+ null, null);
+ }
+ }
}
public void interfaceAdded(String iface) {
@@ -91,6 +109,7 @@ public class EthernetDataTracker implements NetworkStateTracker {
mNetworkInfo = new NetworkInfo(ConnectivityManager.TYPE_ETHERNET, 0, NETWORKTYPE, "");
mLinkProperties = new LinkProperties();
mLinkCapabilities = new LinkCapabilities();
+ mLinkUp = false;
mNetworkInfo.setIsAvailable(false);
setTeardownRequested(false);
@@ -182,14 +201,11 @@ public class EthernetDataTracker implements NetworkStateTracker {
// register for notifications from NetworkManagement Service
IBinder b = ServiceManager.getService(Context.NETWORKMANAGEMENT_SERVICE);
INetworkManagementService service = INetworkManagementService.Stub.asInterface(b);
+
mInterfaceObserver = new InterfaceObserver(this);
- try {
- service.registerObserver(mInterfaceObserver);
- } catch (RemoteException e) {
- Log.e(TAG, "Could not register InterfaceObserver " + e);
- }
- // connect to an ethernet interface that already exists
+ // enable and try to connect to an ethernet interface that
+ // already exists
sIfaceMatch = context.getResources().getString(
com.android.internal.R.string.config_ethernet_iface_regex);
try {
@@ -197,6 +213,8 @@ public class EthernetDataTracker implements NetworkStateTracker {
for (String iface : ifaces) {
if (iface.matches(sIfaceMatch)) {
mIface = iface;
+ InterfaceConfiguration config = service.getInterfaceConfig(iface);
+ mLinkUp = config.isActive();
reconnect();
break;
}
@@ -204,6 +222,12 @@ public class EthernetDataTracker implements NetworkStateTracker {
} catch (RemoteException e) {
Log.e(TAG, "Could not get list of interfaces " + e);
}
+
+ try {
+ service.registerObserver(mInterfaceObserver);
+ } catch (RemoteException e) {
+ Log.e(TAG, "Could not register InterfaceObserver " + e);
+ }
}
/**
diff --git a/core/java/android/net/INetworkManagementEventObserver.aidl b/core/java/android/net/INetworkManagementEventObserver.aidl
index d30b63dab806..4436e6e444ee 100644
--- a/core/java/android/net/INetworkManagementEventObserver.aidl
+++ b/core/java/android/net/INetworkManagementEventObserver.aidl
@@ -23,12 +23,21 @@ package android.net;
*/
interface INetworkManagementEventObserver {
/**
- * Interface link status has changed.
+ * Interface configuration status has changed.
*
* @param iface The interface.
- * @param link True if link is up.
+ * @param up True if the interface has been enabled.
*/
- void interfaceLinkStatusChanged(String iface, boolean link);
+ void interfaceStatusChanged(String iface, boolean up);
+
+ /**
+ * Interface physical-layer link state has changed. For Ethernet,
+ * this method is invoked when the cable is plugged in or unplugged.
+ *
+ * @param iface The interface.
+ * @param up True if the physical link-layer connection signal is valid.
+ */
+ void interfaceLinkStateChanged(String iface, boolean up);
/**
* An interface has been added to the system
diff --git a/services/java/com/android/server/NetworkManagementService.java b/services/java/com/android/server/NetworkManagementService.java
index 2b01c5e158e2..e730d0d6311b 100644
--- a/services/java/com/android/server/NetworkManagementService.java
+++ b/services/java/com/android/server/NetworkManagementService.java
@@ -141,12 +141,26 @@ class NetworkManagementService extends INetworkManagementService.Stub {
}
/**
- * Notify our observers of an interface link status change
+ * Notify our observers of an interface status change
*/
- private void notifyInterfaceLinkStatusChanged(String iface, boolean link) {
+ private void notifyInterfaceStatusChanged(String iface, boolean up) {
for (INetworkManagementEventObserver obs : mObservers) {
try {
- obs.interfaceLinkStatusChanged(iface, link);
+ obs.interfaceStatusChanged(iface, up);
+ } catch (Exception ex) {
+ Slog.w(TAG, "Observer notifier failed", ex);
+ }
+ }
+ }
+
+ /**
+ * Notify our observers of an interface link state change
+ * (typically, an Ethernet cable has been plugged-in or unplugged).
+ */
+ private void notifyInterfaceLinkStateChanged(String iface, boolean up) {
+ for (INetworkManagementEventObserver obs : mObservers) {
+ try {
+ obs.interfaceLinkStateChanged(iface, up);
} catch (Exception ex) {
Slog.w(TAG, "Observer notifier failed", ex);
}
@@ -207,6 +221,7 @@ class NetworkManagementService extends INetworkManagementService.Stub {
* Format: "NNN Iface added <name>"
* "NNN Iface removed <name>"
* "NNN Iface changed <name> <up/down>"
+ * "NNN Iface linkstatus <name> <up/down>"
*/
if (cooked.length < 4 || !cooked[1].equals("Iface")) {
throw new IllegalStateException(
@@ -219,7 +234,10 @@ class NetworkManagementService extends INetworkManagementService.Stub {
notifyInterfaceRemoved(cooked[3]);
return true;
} else if (cooked[2].equals("changed") && cooked.length == 5) {
- notifyInterfaceLinkStatusChanged(cooked[3], cooked[4].equals("up"));
+ notifyInterfaceStatusChanged(cooked[3], cooked[4].equals("up"));
+ return true;
+ } else if (cooked[2].equals("linkstate") && cooked.length == 5) {
+ notifyInterfaceLinkStateChanged(cooked[3], cooked[4].equals("up"));
return true;
}
throw new IllegalStateException(
diff --git a/services/java/com/android/server/ThrottleService.java b/services/java/com/android/server/ThrottleService.java
index 7266d7dd4f1d..d81dfdbc1b8d 100644
--- a/services/java/com/android/server/ThrottleService.java
+++ b/services/java/com/android/server/ThrottleService.java
@@ -179,14 +179,17 @@ public class ThrottleService extends IThrottleManager.Stub {
mIface = iface;
}
- public void interfaceLinkStatusChanged(String iface, boolean link) {
- if (link) {
+ public void interfaceStatusChanged(String iface, boolean up) {
+ if (up) {
if (TextUtils.equals(iface, mIface)) {
mHandler.obtainMessage(mMsg).sendToTarget();
}
}
}
+ public void interfaceLinkStateChanged(String iface, boolean up) {
+ }
+
public void interfaceAdded(String iface) {
// TODO - an interface added in the UP state should also trigger a StatusChanged
// notification..
diff --git a/services/java/com/android/server/connectivity/Tethering.java b/services/java/com/android/server/connectivity/Tethering.java
index 911cac2bcc3d..5f6c9630196e 100644
--- a/services/java/com/android/server/connectivity/Tethering.java
+++ b/services/java/com/android/server/connectivity/Tethering.java
@@ -189,8 +189,8 @@ public class Tethering extends INetworkManagementEventObserver.Stub {
mDnsServers[1] = DNS_DEFAULT_SERVER2;
}
- public void interfaceLinkStatusChanged(String iface, boolean link) {
- if (DEBUG) Log.d(TAG, "interfaceLinkStatusChanged " + iface + ", " + link);
+ public void interfaceStatusChanged(String iface, boolean up) {
+ if (DEBUG) Log.d(TAG, "interfaceStatusChanged " + iface + ", " + up);
boolean found = false;
boolean usb = false;
if (isWifi(iface)) {
@@ -205,7 +205,7 @@ public class Tethering extends INetworkManagementEventObserver.Stub {
synchronized (mIfaces) {
TetherInterfaceSM sm = mIfaces.get(iface);
- if (link) {
+ if (up) {
if (sm == null) {
sm = new TetherInterfaceSM(iface, mLooper, usb);
mIfaces.put(iface, sm);
@@ -220,6 +220,11 @@ public class Tethering extends INetworkManagementEventObserver.Stub {
}
}
+ public void interfaceLinkStateChanged(String iface, boolean up) {
+ if (DEBUG) Log.d(TAG, "interfaceLinkStateChanged " + iface + ", " + up);
+ interfaceStatusChanged(iface, up);
+ }
+
private boolean isUsb(String iface) {
for (String regex : mTetherableUsbRegexs) {
if (iface.matches(regex)) return true;
diff --git a/services/java/com/android/server/connectivity/Vpn.java b/services/java/com/android/server/connectivity/Vpn.java
index 47813f8f7b69..db3b61e5cb17 100644
--- a/services/java/com/android/server/connectivity/Vpn.java
+++ b/services/java/com/android/server/connectivity/Vpn.java
@@ -173,7 +173,11 @@ public class Vpn extends INetworkManagementEventObserver.Stub {
}
// INetworkManagementEventObserver.Stub
- public void interfaceLinkStatusChanged(String name, boolean up) {
+ public void interfaceStatusChanged(String name, boolean up) {
+ }
+
+ // INetworkManagementEventObserver.Stub
+ public void interfaceLinkStateChanged(String name, boolean up) {
}
// INetworkManagementEventObserver.Stub