summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Erik Kline <ek@google.com> 2016-02-11 20:36:41 +0900
committer Erik Kline <ek@google.com> 2016-02-16 18:11:47 +0900
commit93b1a36e31b42c5b33a0164f2832ab9aa12d9a00 (patch)
tree4dc42e68628a7aa0afba2b9f55346e0b6b13ea20
parente1bdbd216fef6d1f0bb6b3c61cc95abba3e67af7 (diff)
Add IpManager.ProvisioningRequest class
This class captures provisioning request parameters to be passed to IpManager#startProvisioning(). Bug: 26991160 Change-Id: I56652bbc4b9ae6cfca3f225a8d99cdfc01bb54d9
-rw-r--r--services/net/java/android/net/ip/IpManager.java120
1 files changed, 97 insertions, 23 deletions
diff --git a/services/net/java/android/net/ip/IpManager.java b/services/net/java/android/net/ip/IpManager.java
index a388a26d9e91..25cb793dcd5a 100644
--- a/services/net/java/android/net/ip/IpManager.java
+++ b/services/net/java/android/net/ip/IpManager.java
@@ -115,6 +115,64 @@ public class IpManager extends StateMachine {
public void onReachabilityLost(String logMsg) {}
}
+ /**
+ * This class encapsulates parameters to be passed to
+ * IpManager#startProvisioning(). A defensive copy is made by IpManager
+ * and the values specified herein are in force until IpManager#stop()
+ * is called.
+ *
+ * Example use:
+ *
+ * final ProvisioningConfiguration config =
+ * mIpManager.buildProvisioningConfiguration()
+ * .withPreDhcpAction()
+ * .build();
+ * mIpManager.startProvisioning(config);
+ * ...
+ * mIpManager.stop();
+ *
+ * The specified provisioning configuration will only be active until
+ * IpManager#stop() is called. Future calls to IpManager#startProvisioning()
+ * must specify the configuration again.
+ */
+ public static class ProvisioningConfiguration {
+
+ public static class Builder {
+ private ProvisioningConfiguration mConfig = new ProvisioningConfiguration();
+
+ public Builder withoutIpReachabilityMonitor() {
+ mConfig.mUsingIpReachabilityMonitor = false;
+ return this;
+ }
+
+ public Builder withPreDhcpAction() {
+ mConfig.mRequestedPreDhcpAction = true;
+ return this;
+ }
+
+ public Builder withStaticConfiguration(StaticIpConfiguration staticConfig) {
+ mConfig.mStaticIpConfig = staticConfig;
+ return this;
+ }
+
+ public ProvisioningConfiguration build() {
+ return new ProvisioningConfiguration(mConfig);
+ }
+ }
+
+ /* package */ boolean mUsingIpReachabilityMonitor = true;
+ /* package */ boolean mRequestedPreDhcpAction;
+ /* package */ StaticIpConfiguration mStaticIpConfig;
+
+ public ProvisioningConfiguration() {}
+
+ public ProvisioningConfiguration(ProvisioningConfiguration other) {
+ mUsingIpReachabilityMonitor = other.mUsingIpReachabilityMonitor;
+ mRequestedPreDhcpAction = other.mRequestedPreDhcpAction;
+ mStaticIpConfig = other.mStaticIpConfig;
+ }
+ }
+
private static final int CMD_STOP = 1;
private static final int CMD_START = 2;
private static final int CMD_CONFIRM = 3;
@@ -145,7 +203,7 @@ public class IpManager extends StateMachine {
private IpReachabilityMonitor mIpReachabilityMonitor;
private BaseDhcpStateMachine mDhcpStateMachine;
private DhcpResults mDhcpResults;
- private StaticIpConfiguration mStaticIpConfig;
+ private ProvisioningConfiguration mConfiguration;
/**
* Member variables accessed both from within the StateMachine thread
@@ -211,14 +269,24 @@ public class IpManager extends StateMachine {
mNetlinkTracker = null;
}
- public void startProvisioning(StaticIpConfiguration staticIpConfig) {
+ public static ProvisioningConfiguration.Builder buildProvisioningConfiguration() {
+ return new ProvisioningConfiguration.Builder();
+ }
+
+ public void startProvisioning(ProvisioningConfiguration req) {
getInterfaceIndex();
- sendMessage(CMD_START, staticIpConfig);
+ sendMessage(CMD_START, new ProvisioningConfiguration(req));
+ }
+
+ // TODO: Delete this.
+ public void startProvisioning(StaticIpConfiguration staticIpConfig) {
+ startProvisioning(buildProvisioningConfiguration()
+ .withStaticConfiguration(staticIpConfig)
+ .build());
}
public void startProvisioning() {
- getInterfaceIndex();
- sendMessage(CMD_START);
+ startProvisioning(new ProvisioningConfiguration());
}
public void stop() {
@@ -296,7 +364,7 @@ public class IpManager extends StateMachine {
private void resetLinkProperties() {
mNetlinkTracker.clearLinkProperties();
mDhcpResults = null;
- mStaticIpConfig = null;
+ mConfiguration = null;
synchronized (mLock) {
mLinkProperties = new LinkProperties();
@@ -533,7 +601,7 @@ public class IpManager extends StateMachine {
break;
case CMD_START:
- mStaticIpConfig = (StaticIpConfiguration) msg.obj;
+ mConfiguration = (ProvisioningConfiguration) msg.obj;
transitionTo(mStartedState);
break;
@@ -591,23 +659,23 @@ public class IpManager extends StateMachine {
Log.e(mTag, "Unable to change interface settings: " + ie);
}
- mIpReachabilityMonitor = new IpReachabilityMonitor(
- mContext,
- mInterfaceName,
- new IpReachabilityMonitor.Callback() {
- @Override
- public void notifyLost(InetAddress ip, String logMsg) {
- if (mCallback.usingIpReachabilityMonitor()) {
+ if (mConfiguration.mUsingIpReachabilityMonitor) {
+ mIpReachabilityMonitor = new IpReachabilityMonitor(
+ mContext,
+ mInterfaceName,
+ new IpReachabilityMonitor.Callback() {
+ @Override
+ public void notifyLost(InetAddress ip, String logMsg) {
mCallback.onReachabilityLost(logMsg);
}
- }
- });
+ });
+ }
// If we have a StaticIpConfiguration attempt to apply it and
// handle the result accordingly.
- if (mStaticIpConfig != null) {
+ if (mConfiguration.mStaticIpConfig != null) {
if (applyStaticIpConfig()) {
- handleIPv4Success(new DhcpResults(mStaticIpConfig));
+ handleIPv4Success(new DhcpResults(mConfiguration.mStaticIpConfig));
} else {
if (VDBG) { Log.d(mTag, "onProvisioningFailure()"); }
mCallback.onProvisioningFailure(getLinkProperties());
@@ -623,8 +691,10 @@ public class IpManager extends StateMachine {
@Override
public void exit() {
- mIpReachabilityMonitor.stop();
- mIpReachabilityMonitor = null;
+ if (mIpReachabilityMonitor != null) {
+ mIpReachabilityMonitor.stop();
+ mIpReachabilityMonitor = null;
+ }
if (mDhcpStateMachine != null) {
mDhcpStateMachine.sendMessage(DhcpClient.CMD_STOP_DHCP);
@@ -650,7 +720,7 @@ public class IpManager extends StateMachine {
// that both probes (a) on-link neighbors and (b) does
// a DHCPv4 RENEW. We used to do this on Wi-Fi framework
// roams.
- if (mCallback.usingIpReachabilityMonitor()) {
+ if (mIpReachabilityMonitor != null) {
mIpReachabilityMonitor.probeAll();
}
break;
@@ -679,7 +749,11 @@ public class IpManager extends StateMachine {
case DhcpClient.CMD_PRE_DHCP_ACTION:
if (VDBG) { Log.d(mTag, "onPreDhcpAction()"); }
- mCallback.onPreDhcpAction();
+ if (mConfiguration.mRequestedPreDhcpAction) {
+ mCallback.onPreDhcpAction();
+ } else {
+ sendMessage(EVENT_PRE_DHCP_ACTION_COMPLETE);
+ }
break;
case DhcpClient.CMD_POST_DHCP_ACTION: {
@@ -717,7 +791,7 @@ public class IpManager extends StateMachine {
private boolean applyStaticIpConfig() {
final InterfaceConfiguration ifcg = new InterfaceConfiguration();
- ifcg.setLinkAddress(mStaticIpConfig.ipAddress);
+ ifcg.setLinkAddress(mConfiguration.mStaticIpConfig.ipAddress);
ifcg.setInterfaceUp();
try {
mNwService.setInterfaceConfig(mInterfaceName, ifcg);