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

Commit 188f7f2e authored by Lorenzo Colitti's avatar Lorenzo Colitti Committed by Android Git Automerger
Browse files

am 450ce155: am 895b6726: Merge "Only stop/start clatd if necessary." into lmp-dev

* commit '450ce15537aa2c57bdbd9dae939fd13e70c8c488':
  Only stop/start clatd if necessary.
parents 34eae0f4 1d7142f2
Loading
Loading
Loading
Loading
+13 −18
Original line number Diff line number Diff line
@@ -4240,13 +4240,17 @@ public class ConnectivityService extends IConnectivityManager.Stub {
        LinkProperties newLp = networkAgent.linkProperties;
        int netId = networkAgent.network.netId;

        // The NetworkAgentInfo does not know whether clatd is running on its network or not. Before
        // we do anything else, make sure its LinkProperties are accurate.
        mClat.fixupLinkProperties(networkAgent, oldLp);

        updateInterfaces(newLp, oldLp, netId);
        updateMtu(newLp, oldLp);
        updateTcpBufferSizes(networkAgent);
        // TODO - figure out what to do for clat
//        for (LinkProperties lp : newLp.getStackedLinks()) {
//            updateMtu(lp, null);
//        }
        updateTcpBufferSizes(networkAgent);
        final boolean flushDns = updateRoutes(newLp, oldLp, netId);
        updateDnses(newLp, oldLp, netId, flushDns);
        updateClat(newLp, oldLp, networkAgent);
@@ -4254,25 +4258,16 @@ public class ConnectivityService extends IConnectivityManager.Stub {
    }

    private void updateClat(LinkProperties newLp, LinkProperties oldLp, NetworkAgentInfo na) {
        // Update 464xlat state.
        if (mClat.requiresClat(na)) {

            // If the connection was previously using clat, but is not using it now, stop the clat
            // daemon. Normally, this happens automatically when the connection disconnects, but if
            // the disconnect is not reported, or if the connection's LinkProperties changed for
            // some other reason (e.g., handoff changes the IP addresses on the link), it would
            // still be running. If it's not running, then stopping it is a no-op.
            if (Nat464Xlat.isRunningClat(oldLp) && !Nat464Xlat.isRunningClat(newLp)) {
                mClat.stopClat();
            }
            // If the link requires clat to be running, then start the daemon now.
            if (na.networkInfo.isConnected()) {
        final boolean wasRunningClat = mClat.isRunningClat(na);
        final boolean shouldRunClat = Nat464Xlat.requiresClat(na);

        if (!wasRunningClat && shouldRunClat) {
            // Start clatd. If it's already been started but is not running yet, this is a no-op.
            mClat.startClat(na);
            } else {
        } else if (wasRunningClat && !shouldRunClat) {
            mClat.stopClat();
        }
    }
    }

    private void updateInterfaces(LinkProperties newLp, LinkProperties oldLp, int netId) {
        CompareResult<String> interfaceDiff = new CompareResult<String>();
+33 −22
Original line number Diff line number Diff line
@@ -89,17 +89,20 @@ public class Nat464Xlat extends BaseNetworkObserver {
     * @param network the NetworkAgentInfo corresponding to the network.
     * @return true if the network requires clat, false otherwise.
     */
    public boolean requiresClat(NetworkAgentInfo network) {
        int netType = network.networkInfo.getType();
        LinkProperties lp = network.linkProperties;
    public static boolean requiresClat(NetworkAgentInfo nai) {
        final int netType = nai.networkInfo.getType();
        final boolean connected = nai.networkInfo.isConnected();
        final boolean hasIPv4Address =
                (nai.linkProperties != null) ? nai.linkProperties.hasIPv4Address() : false;
        Slog.d(TAG, "requiresClat: netType=" + netType +
                    ", connected=" + connected +
                    ", hasIPv4Address=" + hasIPv4Address);
        // Only support clat on mobile for now.
        Slog.d(TAG, "requiresClat: netType=" + netType + ", hasIPv4Address=" +
               lp.hasIPv4Address());
        return netType == TYPE_MOBILE && !lp.hasIPv4Address();
        return netType == TYPE_MOBILE && connected && !hasIPv4Address;
    }

    public static boolean isRunningClat(LinkProperties lp) {
      return lp != null && lp.getAllInterfaceNames().contains(CLAT_INTERFACE_NAME);
    public boolean isRunningClat(NetworkAgentInfo network) {
        return mNetworkMessenger == network.messenger;
    }

    /**
@@ -149,14 +152,6 @@ public class Nat464Xlat extends BaseNetworkObserver {
        }
    }

    public boolean isStarted() {
        return mIsStarted;
    }

    public boolean isRunning() {
        return mIsRunning;
    }

    private void updateConnectivityService() {
        Message msg = mHandler.obtainMessage(
            NetworkAgent.EVENT_NETWORK_PROPERTIES_CHANGED, mBaseLP);
@@ -165,6 +160,21 @@ public class Nat464Xlat extends BaseNetworkObserver {
        msg.sendToTarget();
    }

    // Copies the stacked clat link in oldLp, if any, to the LinkProperties in nai.
    public void fixupLinkProperties(NetworkAgentInfo nai, LinkProperties oldLp) {
        if (isRunningClat(nai) &&
                nai.linkProperties != null &&
                !nai.linkProperties.getAllInterfaceNames().contains(CLAT_INTERFACE_NAME)) {
            Slog.d(TAG, "clatd running, updating NAI for " + nai.linkProperties.getInterfaceName());
            for (LinkProperties stacked: oldLp.getStackedLinks()) {
                if (CLAT_INTERFACE_NAME.equals(stacked.getInterfaceName())) {
                    nai.linkProperties.addStackedLink(stacked);
                    break;
                }
            }
        }
    }

    @Override
    public void interfaceAdded(String iface) {
        if (iface.equals(CLAT_INTERFACE_NAME)) {
@@ -175,17 +185,18 @@ public class Nat464Xlat extends BaseNetworkObserver {
            // Create the LinkProperties for the clat interface by fetching the
            // IPv4 address for the interface and adding an IPv4 default route,
            // then stack the LinkProperties on top of the link it's running on.
            try {
                InterfaceConfiguration config = mNMService.getInterfaceConfig(iface);
                LinkAddress clatAddress = config.getLinkAddress();
                mLP.clear();
                mLP.setInterfaceName(iface);

                // Although the clat interface is a point-to-point tunnel, we don't
                // point the route directly at the interface because some apps don't
                // understand routes without gateways (see, e.g., http://b/9597256
                // http://b/9597516). Instead, set the next hop of the route to the
                // clat IPv4 address itself (for those apps, it doesn't matter what
                // the IP of the gateway is, only that there is one).
            try {
                InterfaceConfiguration config = mNMService.getInterfaceConfig(iface);
                LinkAddress clatAddress = config.getLinkAddress();
                mLP.clear();
                mLP.setInterfaceName(iface);
                RouteInfo ipv4Default = new RouteInfo(new LinkAddress(Inet4Address.ANY, 0),
                                                      clatAddress.getAddress(), iface);
                mLP.addRoute(ipv4Default);