summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/ConnectivityService.java1
-rw-r--r--services/net/java/android/net/ip/IpManager.java57
-rw-r--r--services/net/java/android/net/util/AvoidBadWifiTracker.java38
3 files changed, 74 insertions, 22 deletions
diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java
index 8ad9875bfd42..750b8417e5ea 100644
--- a/services/core/java/com/android/server/ConnectivityService.java
+++ b/services/core/java/com/android/server/ConnectivityService.java
@@ -856,6 +856,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
mAvoidBadWifiTracker = createAvoidBadWifiTracker(
mContext, mHandler, () -> rematchForAvoidBadWifiUpdate());
+ mAvoidBadWifiTracker.start();
}
private NetworkRequest createInternetRequestForTransport(
diff --git a/services/net/java/android/net/ip/IpManager.java b/services/net/java/android/net/ip/IpManager.java
index 39f14e5ee287..58b2dec578fe 100644
--- a/services/net/java/android/net/ip/IpManager.java
+++ b/services/net/java/android/net/ip/IpManager.java
@@ -438,6 +438,9 @@ public class IpManager extends StateMachine {
mCallback = new LoggingCallbackWrapper(callback);
mNwService = nwService;
+ mLocalLog = new LocalLog(MAX_LOG_RECORDS);
+ mMsgStateLogger = new MessageHandlingLogger();
+
mNetlinkTracker = new NetlinkTracker(
mInterfaceName,
new NetlinkTracker.Callback() {
@@ -451,48 +454,79 @@ public class IpManager extends StateMachine {
super.interfaceAdded(iface);
if (mClatInterfaceName.equals(iface)) {
mCallback.setNeighborDiscoveryOffload(false);
+ } else if (!mInterfaceName.equals(iface)) {
+ return;
}
+
+ final String msg = "interfaceAdded(" + iface +")";
+ logMsg(msg);
}
@Override
public void interfaceRemoved(String iface) {
super.interfaceRemoved(iface);
+ // TODO: Also observe mInterfaceName going down and take some
+ // kind of appropriate action.
if (mClatInterfaceName.equals(iface)) {
// TODO: consider sending a message to the IpManager main
// StateMachine thread, in case "NDO enabled" state becomes
// tied to more things that 464xlat operation.
mCallback.setNeighborDiscoveryOffload(true);
+ } else if (!mInterfaceName.equals(iface)) {
+ return;
}
+
+ final String msg = "interfaceRemoved(" + iface +")";
+ logMsg(msg);
}
- };
- try {
- mNwService.registerObserver(mNetlinkTracker);
- } catch (RemoteException e) {
- Log.e(mTag, "Couldn't register NetlinkTracker: " + e.toString());
- }
+ private void logMsg(String msg) {
+ Log.d(mTag, msg);
+ getHandler().post(() -> { mLocalLog.log("OBSERVED " + msg); });
+ }
+ };
- mAvoidBadWifiTracker = new AvoidBadWifiTracker(mContext, getHandler());
+ mLinkProperties = new LinkProperties();
+ mLinkProperties.setInterfaceName(mInterfaceName);
- resetLinkProperties();
+ mAvoidBadWifiTracker = new AvoidBadWifiTracker(mContext, getHandler(),
+ () -> { mLocalLog.log("OBSERVED AvoidBadWifi changed"); });
mProvisioningTimeoutAlarm = new WakeupMessage(mContext, getHandler(),
mTag + ".EVENT_PROVISIONING_TIMEOUT", EVENT_PROVISIONING_TIMEOUT);
mDhcpActionTimeoutAlarm = new WakeupMessage(mContext, getHandler(),
mTag + ".EVENT_DHCPACTION_TIMEOUT", EVENT_DHCPACTION_TIMEOUT);
- // Super simple StateMachine.
+ // Anything the StateMachine may access must have been instantiated
+ // before this point.
+ configureAndStartStateMachine();
+
+ // Anything that may send messages to the StateMachine must only be
+ // configured to do so after the StateMachine has started (above).
+ startStateMachineUpdaters();
+ }
+
+ private void configureAndStartStateMachine() {
addState(mStoppedState);
addState(mStartedState);
addState(mRunningState, mStartedState);
addState(mStoppingState);
setInitialState(mStoppedState);
- mLocalLog = new LocalLog(MAX_LOG_RECORDS);
- mMsgStateLogger = new MessageHandlingLogger();
+
super.start();
}
+ private void startStateMachineUpdaters() {
+ try {
+ mNwService.registerObserver(mNetlinkTracker);
+ } catch (RemoteException e) {
+ Log.e(mTag, "Couldn't register NetlinkTracker: " + e.toString());
+ }
+
+ mAvoidBadWifiTracker.start();
+ }
+
@Override
protected void onQuitting() {
mCallback.onQuit();
@@ -501,6 +535,7 @@ public class IpManager extends StateMachine {
// Shut down this IpManager instance altogether.
public void shutdown() {
stop();
+ mAvoidBadWifiTracker.shutdown();
quit();
}
diff --git a/services/net/java/android/net/util/AvoidBadWifiTracker.java b/services/net/java/android/net/util/AvoidBadWifiTracker.java
index c14e811e0584..2abaeb1ae35b 100644
--- a/services/net/java/android/net/util/AvoidBadWifiTracker.java
+++ b/services/net/java/android/net/util/AvoidBadWifiTracker.java
@@ -57,7 +57,11 @@ public class AvoidBadWifiTracker {
private final Context mContext;
private final Handler mHandler;
private final Runnable mReevaluateRunnable;
+ private final Uri mUri;
+ private final ContentResolver mResolver;
private final SettingObserver mSettingObserver;
+ private final BroadcastReceiver mBroadcastReceiver;
+
private volatile boolean mAvoidBadWifi = true;
public AvoidBadWifiTracker(Context ctx, Handler handler) {
@@ -68,19 +72,36 @@ public class AvoidBadWifiTracker {
mContext = ctx;
mHandler = handler;
mReevaluateRunnable = () -> { if (update() && cb != null) cb.run(); };
+ mUri = Settings.Global.getUriFor(NETWORK_AVOID_BAD_WIFI);
+ mResolver = mContext.getContentResolver();
mSettingObserver = new SettingObserver();
-
- final IntentFilter intentFilter = new IntentFilter();
- intentFilter.addAction(Intent.ACTION_CONFIGURATION_CHANGED);
- mContext.registerReceiverAsUser(new BroadcastReceiver() {
+ mBroadcastReceiver = new BroadcastReceiver() {
+ @Override
public void onReceive(Context context, Intent intent) {
reevaluate();
}
- }, UserHandle.ALL, intentFilter, null, null);
+ };
update();
}
+ public void start() {
+ mResolver.registerContentObserver(mUri, false, mSettingObserver);
+
+ final IntentFilter intentFilter = new IntentFilter();
+ intentFilter.addAction(Intent.ACTION_CONFIGURATION_CHANGED);
+ mContext.registerReceiverAsUser(
+ mBroadcastReceiver, UserHandle.ALL, intentFilter, null, null);
+
+ reevaluate();
+ }
+
+ public void shutdown() {
+ mResolver.unregisterContentObserver(mSettingObserver);
+
+ mContext.unregisterReceiver(mBroadcastReceiver);
+ }
+
public boolean currentValue() {
return mAvoidBadWifi;
}
@@ -100,8 +121,7 @@ public class AvoidBadWifiTracker {
}
public String getSettingsValue() {
- final ContentResolver resolver = mContext.getContentResolver();
- return Settings.Global.getString(resolver, NETWORK_AVOID_BAD_WIFI);
+ return Settings.Global.getString(mResolver, NETWORK_AVOID_BAD_WIFI);
}
@VisibleForTesting
@@ -117,12 +137,8 @@ public class AvoidBadWifiTracker {
}
private class SettingObserver extends ContentObserver {
- private final Uri mUri = Settings.Global.getUriFor(NETWORK_AVOID_BAD_WIFI);
-
public SettingObserver() {
super(null);
- final ContentResolver resolver = mContext.getContentResolver();
- resolver.registerContentObserver(mUri, false, this);
}
@Override