diff options
| author | 2016-02-11 20:36:41 +0900 | |
|---|---|---|
| committer | 2016-02-16 18:11:47 +0900 | |
| commit | 93b1a36e31b42c5b33a0164f2832ab9aa12d9a00 (patch) | |
| tree | 4dc42e68628a7aa0afba2b9f55346e0b6b13ea20 | |
| parent | e1bdbd216fef6d1f0bb6b3c61cc95abba3e67af7 (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.java | 120 |
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); |