diff options
author | Lorenzo Colitti <lorenzo@google.com> | 2019-11-02 01:02:39 +0900 |
---|---|---|
committer | Lorenzo Colitti <lorenzo@google.com> | 2019-12-02 18:31:29 +0900 |
commit | 038f3cd08c8e7a296774409eab2eecaa6632c690 (patch) | |
tree | 7ba1bc668d145b383016d343bc027d8987d81f6c /src/android/net/ip/IpClient.java | |
parent | 1e868b324d7cf1d32f5705b0c6b23771c12b49fe (diff) |
Add a ClearingIpAddressesState.
This simplifies StartedState a bit, and should have no impact on
behaviour.
Test: atest IpClientIntegrationTest
Change-Id: Ie897307925a9af571a622c823d4c641956e607f3
Diffstat (limited to 'src/android/net/ip/IpClient.java')
-rw-r--r-- | src/android/net/ip/IpClient.java | 84 |
1 files changed, 53 insertions, 31 deletions
diff --git a/src/android/net/ip/IpClient.java b/src/android/net/ip/IpClient.java index 8808ee2..669dbfd 100644 --- a/src/android/net/ip/IpClient.java +++ b/src/android/net/ip/IpClient.java @@ -310,7 +310,7 @@ public class IpClient extends StateMachine { // Internal commands to use instead of trying to call transitionTo() inside // a given State's enter() method. Calling transitionTo() from enter/exit // encounters a Log.wtf() that can cause trouble on eng builds. - private static final int CMD_JUMP_STARTED_TO_RUNNING = 100; + private static final int CMD_ADDRESSES_CLEARED = 100; private static final int CMD_JUMP_RUNNING_TO_STOPPING = 101; private static final int CMD_JUMP_STOPPING_TO_STOPPED = 102; @@ -342,6 +342,7 @@ public class IpClient extends StateMachine { private final State mStoppedState = new StoppedState(); private final State mStoppingState = new StoppingState(); + private final State mClearingIpAddressesState = new ClearingIpAddressesState(); private final State mStartedState = new StartedState(); private final State mRunningState = new RunningState(); @@ -621,6 +622,7 @@ public class IpClient extends StateMachine { // CHECKSTYLE:OFF IndentationCheck addState(mStoppedState); addState(mStartedState); + addState(mClearingIpAddressesState, mStartedState); addState(mRunningState, mStartedState); addState(mStoppingState); // CHECKSTYLE:ON IndentationCheck @@ -1355,7 +1357,7 @@ public class IpClient extends StateMachine { case CMD_START: mConfiguration = (android.net.shared.ProvisioningConfiguration) msg.obj; - transitionTo(mStartedState); + transitionTo(mClearingIpAddressesState); break; case EVENT_NETLINK_LINKPROPERTIES_CHANGED: @@ -1437,18 +1439,11 @@ public class IpClient extends StateMachine { } } - class StartedState extends State { + class ClearingIpAddressesState extends State { @Override public void enter() { - mStartTimeMillis = SystemClock.elapsedRealtime(); - if (mConfiguration.mProvisioningTimeoutMs > 0) { - final long alarmTime = SystemClock.elapsedRealtime() - + mConfiguration.mProvisioningTimeoutMs; - mProvisioningTimeoutAlarm.schedule(alarmTime); - } - if (readyToProceed()) { - deferMessage(obtainMessage(CMD_JUMP_STARTED_TO_RUNNING)); + deferMessage(obtainMessage(CMD_ADDRESSES_CLEARED)); } else { // Clear all IPv4 and IPv6 before proceeding to RunningState. // Clean up any leftover state from an abnormal exit from @@ -1458,21 +1453,12 @@ public class IpClient extends StateMachine { } @Override - public void exit() { - mProvisioningTimeoutAlarm.cancel(); - } - - @Override public boolean processMessage(Message msg) { switch (msg.what) { - case CMD_JUMP_STARTED_TO_RUNNING: + case CMD_ADDRESSES_CLEARED: transitionTo(mRunningState); break; - case CMD_STOP: - transitionTo(mStoppingState); - break; - case EVENT_NETLINK_LINKPROPERTIES_CHANGED: handleLinkPropertiesUpdate(NO_CALLBACKS); if (readyToProceed()) { @@ -1480,6 +1466,50 @@ public class IpClient extends StateMachine { } break; + case CMD_STOP: + case EVENT_PROVISIONING_TIMEOUT: + // Fall through to StartedState. + return NOT_HANDLED; + + default: + // It's safe to process messages out of order because the + // only message that can both + // a) be received at this time and + // b) affect provisioning state + // is EVENT_NETLINK_LINKPROPERTIES_CHANGED (handled above). + deferMessage(msg); + } + return HANDLED; + } + + private boolean readyToProceed() { + return (!mLinkProperties.hasIpv4Address() && !mLinkProperties.hasGlobalIpv6Address()); + } + } + + class StartedState extends State { + @Override + public void enter() { + mStartTimeMillis = SystemClock.elapsedRealtime(); + if (mConfiguration.mProvisioningTimeoutMs > 0) { + final long alarmTime = SystemClock.elapsedRealtime() + + mConfiguration.mProvisioningTimeoutMs; + mProvisioningTimeoutAlarm.schedule(alarmTime); + } + } + + @Override + public void exit() { + mProvisioningTimeoutAlarm.cancel(); + } + + @Override + public boolean processMessage(Message msg) { + switch (msg.what) { + case CMD_STOP: + transitionTo(mStoppingState); + break; + case CMD_UPDATE_L2KEY_GROUPHINT: { final Pair<String, String> args = (Pair<String, String>) msg.obj; mL2Key = args.first; @@ -1497,22 +1527,14 @@ public class IpClient extends StateMachine { case EVENT_PROVISIONING_TIMEOUT: handleProvisioningFailure(); break; + default: - // It's safe to process messages out of order because the - // only message that can both - // a) be received at this time and - // b) affect provisioning state - // is EVENT_NETLINK_LINKPROPERTIES_CHANGED (handled above). - deferMessage(msg); + return NOT_HANDLED; } mMsgStateLogger.handled(this, getCurrentState()); return HANDLED; } - - private boolean readyToProceed() { - return (!mLinkProperties.hasIpv4Address() && !mLinkProperties.hasGlobalIpv6Address()); - } } class RunningState extends State { |