diff options
Diffstat (limited to 'android/net/ip/IpClient.java')
-rw-r--r-- | android/net/ip/IpClient.java | 56 |
1 files changed, 46 insertions, 10 deletions
diff --git a/android/net/ip/IpClient.java b/android/net/ip/IpClient.java index 9863370e..87249dfc 100644 --- a/android/net/ip/IpClient.java +++ b/android/net/ip/IpClient.java @@ -40,6 +40,7 @@ import android.net.util.MultinetworkPolicyTracker; import android.net.util.NetdService; import android.net.util.NetworkConstants; import android.net.util.SharedLog; +import android.os.ConditionVariable; import android.os.INetworkManagementService; import android.os.Message; import android.os.RemoteException; @@ -150,6 +151,28 @@ public class IpClient extends StateMachine { public void setNeighborDiscoveryOffload(boolean enable) {} } + public static class WaitForProvisioningCallback extends Callback { + private final ConditionVariable mCV = new ConditionVariable(); + private LinkProperties mCallbackLinkProperties; + + public LinkProperties waitForProvisioning() { + mCV.block(); + return mCallbackLinkProperties; + } + + @Override + public void onProvisioningSuccess(LinkProperties newLp) { + mCallbackLinkProperties = newLp; + mCV.open(); + } + + @Override + public void onProvisioningFailure(LinkProperties newLp) { + mCallbackLinkProperties = null; + mCV.open(); + } + } + // Use a wrapper class to log in order to ensure complete and detailed // logging. This method is lighter weight than annotations/reflection // and has the following benefits: @@ -281,6 +304,11 @@ public class IpClient extends StateMachine { return this; } + public Builder withoutMultinetworkPolicyTracker() { + mConfig.mUsingMultinetworkPolicyTracker = false; + return this; + } + public Builder withoutIpReachabilityMonitor() { mConfig.mUsingIpReachabilityMonitor = false; return this; @@ -343,6 +371,7 @@ public class IpClient extends StateMachine { /* package */ boolean mEnableIPv4 = true; /* package */ boolean mEnableIPv6 = true; + /* package */ boolean mUsingMultinetworkPolicyTracker = true; /* package */ boolean mUsingIpReachabilityMonitor = true; /* package */ int mRequestedPreDhcpActionMs; /* package */ InitialConfiguration mInitialConfig; @@ -374,6 +403,7 @@ public class IpClient extends StateMachine { return new StringJoiner(", ", getClass().getSimpleName() + "{", "}") .add("mEnableIPv4: " + mEnableIPv4) .add("mEnableIPv6: " + mEnableIPv6) + .add("mUsingMultinetworkPolicyTracker: " + mUsingMultinetworkPolicyTracker) .add("mUsingIpReachabilityMonitor: " + mUsingIpReachabilityMonitor) .add("mRequestedPreDhcpActionMs: " + mRequestedPreDhcpActionMs) .add("mInitialConfig: " + mInitialConfig) @@ -559,7 +589,6 @@ public class IpClient extends StateMachine { private final NetlinkTracker mNetlinkTracker; private final WakeupMessage mProvisioningTimeoutAlarm; private final WakeupMessage mDhcpActionTimeoutAlarm; - private final MultinetworkPolicyTracker mMultinetworkPolicyTracker; private final SharedLog mLog; private final LocalLog mConnectivityPacketLog; private final MessageHandlingLogger mMsgStateLogger; @@ -573,6 +602,7 @@ public class IpClient extends StateMachine { */ private LinkProperties mLinkProperties; private ProvisioningConfiguration mConfiguration; + private MultinetworkPolicyTracker mMultinetworkPolicyTracker; private IpReachabilityMonitor mIpReachabilityMonitor; private DhcpClient mDhcpClient; private DhcpResults mDhcpResults; @@ -685,9 +715,6 @@ public class IpClient extends StateMachine { mLinkProperties = new LinkProperties(); mLinkProperties.setInterfaceName(mInterfaceName); - mMultinetworkPolicyTracker = new MultinetworkPolicyTracker(mContext, getHandler(), - () -> { mLog.log("OBSERVED AvoidBadWifi changed"); }); - mProvisioningTimeoutAlarm = new WakeupMessage(mContext, getHandler(), mTag + ".EVENT_PROVISIONING_TIMEOUT", EVENT_PROVISIONING_TIMEOUT); mDhcpActionTimeoutAlarm = new WakeupMessage(mContext, getHandler(), @@ -719,8 +746,6 @@ public class IpClient extends StateMachine { } catch (RemoteException e) { logError("Couldn't register NetlinkTracker: %s", e); } - - mMultinetworkPolicyTracker.start(); } private void stopStateMachineUpdaters() { @@ -729,8 +754,6 @@ public class IpClient extends StateMachine { } catch (RemoteException e) { logError("Couldn't unregister NetlinkTracker: %s", e); } - - mMultinetworkPolicyTracker.shutdown(); } @Override @@ -1028,7 +1051,8 @@ public class IpClient extends StateMachine { // Note that we can still be disconnected by IpReachabilityMonitor // if the IPv6 default gateway (but not the IPv6 DNS servers; see // accompanying code in IpReachabilityMonitor) is unreachable. - final boolean ignoreIPv6ProvisioningLoss = !mMultinetworkPolicyTracker.getAvoidBadWifi(); + final boolean ignoreIPv6ProvisioningLoss = (mMultinetworkPolicyTracker != null) + && !mMultinetworkPolicyTracker.getAvoidBadWifi(); // Additionally: // @@ -1490,7 +1514,7 @@ public class IpClient extends StateMachine { mContext.getResources().getBoolean(R.bool.config_apfDrop802_3Frames); apfConfig.ethTypeBlackList = mContext.getResources().getIntArray(R.array.config_apfEthTypeBlackList); - mApfFilter = ApfFilter.maybeCreate(apfConfig, mInterfaceParams, mCallback); + mApfFilter = ApfFilter.maybeCreate(mContext, apfConfig, mInterfaceParams, mCallback); // TODO: investigate the effects of any multicast filtering racing/interfering with the // rest of this IP configuration startup. if (mApfFilter == null) { @@ -1520,6 +1544,13 @@ public class IpClient extends StateMachine { return; } + if (mConfiguration.mUsingMultinetworkPolicyTracker) { + mMultinetworkPolicyTracker = new MultinetworkPolicyTracker( + mContext, getHandler(), + () -> { mLog.log("OBSERVED AvoidBadWifi changed"); }); + mMultinetworkPolicyTracker.start(); + } + if (mConfiguration.mUsingIpReachabilityMonitor && !startIpReachabilityMonitor()) { doImmediateProvisioningFailure( IpManagerEvent.ERROR_STARTING_IPREACHABILITYMONITOR); @@ -1537,6 +1568,11 @@ public class IpClient extends StateMachine { mIpReachabilityMonitor = null; } + if (mMultinetworkPolicyTracker != null) { + mMultinetworkPolicyTracker.shutdown(); + mMultinetworkPolicyTracker = null; + } + if (mDhcpClient != null) { mDhcpClient.sendMessage(DhcpClient.CMD_STOP_DHCP); mDhcpClient.doQuit(); |