diff options
| author | 2011-06-27 12:56:47 -0700 | |
|---|---|---|
| committer | 2011-06-27 12:56:47 -0700 | |
| commit | 04b9cafb321af43e3844c640e38860ca60a3a36d (patch) | |
| tree | 82a3f30325caeadd65f4f4e50caa8f4fd5dfc7a3 | |
| parent | a20cdc06e599c6fef784a0a479e8329f95e4bd09 (diff) | |
| parent | f59c7d0f2ac8d489b6d8118543a57ea4a603eacf (diff) | |
Merge changes I0077e5e5,I42cbed69
* changes:
Hookup interface status to other clients
Revert "Revert "Propagate new link-status-change message to any NetworkManagementService""
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 |