Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 04b9cafb authored by Mike J. Chen's avatar Mike J. Chen Committed by Android (Google) Code Review
Browse files

Merge changes I0077e5e5,I42cbed69

* changes:
  Hookup interface status to other clients
  Revert "Revert "Propagate new link-status-change message to any NetworkManagementService""
parents a20cdc06 f59c7d0f
Loading
Loading
Loading
Loading
+32 −8
Original line number Diff line number Diff line
@@ -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) {
        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);
        }
    }

    /**
+12 −3
Original line number Diff line number Diff line
@@ -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
+22 −4
Original line number Diff line number Diff line
@@ -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(
+5 −2
Original line number Diff line number Diff line
@@ -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..
+8 −3
Original line number Diff line number Diff line
@@ -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;
Loading