Loading services/core/java/com/android/server/connectivity/Nat464Xlat.java +38 −23 Original line number Diff line number Diff line Loading @@ -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; } } Loading Loading @@ -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); } Loading @@ -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. } } Loading Loading
services/core/java/com/android/server/connectivity/Nat464Xlat.java +38 −23 Original line number Diff line number Diff line Loading @@ -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; } } Loading Loading @@ -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); } Loading @@ -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. } } Loading