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

Commit 3a6906b9 authored by Lorenzo Colitti's avatar Lorenzo Colitti Committed by Android (Google) Code Review
Browse files

Merge "Refactor the Nat464Xlat function for simplicity." into rvc-dev

parents b99fc7b3 879c0eb0
Loading
Loading
Loading
Loading
+38 −23
Original line number Diff line number Diff line
@@ -213,12 +213,10 @@ public class Nat464Xlat extends BaseNetworkObserver {
        }
        mIface = null;
        mBaseIface = null;
        mState = State.IDLE;
        if (requiresClat(mNetwork)) {
            mState = State.DISCOVERING;
        } else {
            stopPrefixDiscovery();
            mState = State.IDLE;
        }
    }

@@ -285,6 +283,7 @@ public class Nat464Xlat extends BaseNetworkObserver {
    private void stopPrefixDiscovery() {
        try {
            mDnsResolver.stopPrefix64Discovery(getNetId());
            mState = State.IDLE;
        } catch (RemoteException | ServiceSpecificException e) {
            Slog.e(TAG, "Error stopping prefix discovery on netId " + getNetId() + ": " + e);
        }
@@ -294,27 +293,43 @@ public class Nat464Xlat extends BaseNetworkObserver {
     * Starts/stops NAT64 prefix discovery and clatd as necessary.
     */
    public void update() {
        // TODO: turn this class into a proper StateMachine. // http://b/126113090
        // TODO: turn this class into a proper StateMachine. http://b/126113090
        switch (mState) {
            case IDLE:
                if (requiresClat(mNetwork)) {
            if (!isPrefixDiscoveryStarted()) {
                startPrefixDiscovery();
            } else if (shouldStartClat(mNetwork)) {
                    // Network is detected to be IPv6-only.
                    // TODO: consider going to STARTING directly if the NAT64 prefix is already
                    // known. This would however result in clatd running without prefix discovery
                    // running, which might be a surprising combination.
                    startPrefixDiscovery();  // Enters DISCOVERING state.
                    return;
                }
                break;

            case DISCOVERING:
                if (shouldStartClat(mNetwork)) {
                    // NAT64 prefix detected. Start clatd.
                // TODO: support the NAT64 prefix changing after it's been discovered. There is no
                // need to support this at the moment because it cannot happen without changes to
                // the Dns64Configuration code in netd.
                start();
            } else {
                // NAT64 prefix removed. Stop clatd and go back into DISCOVERING state.
                stop();
                    start();  // Enters STARTING state.
                    return;
                }
        } else {
            // Network no longer requires clat. Stop clat and prefix discovery.
            if (isStarted()) {
                if (!requiresClat(mNetwork)) {
                    // IPv4 address added. Go back to IDLE state.
                    stopPrefixDiscovery();
                    return;
                }
                break;

            case STARTING:
            case RUNNING:
                // NAT64 prefix removed, or IPv4 address added.
                // Stop clatd and go back into DISCOVERING or idle.
                if (!shouldStartClat(mNetwork)) {
                    stop();
            } else if (isPrefixDiscoveryStarted()) {
                leaveStartedState();
                }
                break;
                // TODO: support the NAT64 prefix changing after it's been discovered. There is
                // no need to support this at the moment because it cannot happen without
                // changes to the Dns64Configuration code in netd.
        }
    }