summaryrefslogtreecommitdiff
path: root/src/android/net/ip/IpClient.java
diff options
context:
space:
mode:
authorLorenzo Colitti <lorenzo@google.com>2019-11-02 01:02:39 +0900
committerLorenzo Colitti <lorenzo@google.com>2019-12-02 18:31:29 +0900
commit038f3cd08c8e7a296774409eab2eecaa6632c690 (patch)
tree7ba1bc668d145b383016d343bc027d8987d81f6c /src/android/net/ip/IpClient.java
parent1e868b324d7cf1d32f5705b0c6b23771c12b49fe (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.java84
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 {