Merge changes Icb062ffb,I66c4e8f5,I85247411,Id47c19b7,Ib713c4ae, ... am: 0b32981970 am: b4a492f581 am: 59c5f07871

Change-Id: I213d2cdca4187ed30293dc433cfee9e8af782b6e
This commit is contained in:
Automerger Merge Worker
2020-02-04 13:48:46 +00:00
3 changed files with 126 additions and 62 deletions

View File

@@ -6188,12 +6188,16 @@ public class ConnectivityService extends IConnectivityManager.Stub
} }
} }
private void sendUpdatedScoreToFactories(NetworkRequest networkRequest, NetworkAgentInfo nai) { private void sendUpdatedScoreToFactories(@NonNull NetworkRequest networkRequest,
int score = 0; @Nullable NetworkAgentInfo nai) {
int serial = 0; final int score;
final int serial;
if (nai != null) { if (nai != null) {
score = nai.getCurrentScore(); score = nai.getCurrentScore();
serial = nai.factorySerialNumber; serial = nai.factorySerialNumber;
} else {
score = 0;
serial = 0;
} }
if (VDBG || DDBG){ if (VDBG || DDBG){
log("sending new Min Network Score(" + score + "): " + networkRequest.toString()); log("sending new Min Network Score(" + score + "): " + networkRequest.toString());
@@ -6356,20 +6360,28 @@ public class ConnectivityService extends IConnectivityManager.Stub
} }
} }
private void makeDefault(@NonNull final NetworkAgentInfo newNetwork) { private void makeDefault(@Nullable final NetworkAgentInfo newNetwork) {
if (DBG) log("Switching to new default network: " + newNetwork); if (DBG) log("Switching to new default network: " + newNetwork);
mDefaultNetworkNai = newNetwork;
try { try {
if (null != newNetwork) {
mNMS.setDefaultNetId(newNetwork.network.netId); mNMS.setDefaultNetId(newNetwork.network.netId);
} else {
mNMS.clearDefaultNetId();
}
} catch (Exception e) { } catch (Exception e) {
loge("Exception setting default network :" + e); loge("Exception setting default network :" + e);
} }
mDefaultNetworkNai = newNetwork;
notifyLockdownVpn(newNetwork); notifyLockdownVpn(newNetwork);
handleApplyDefaultProxy(newNetwork.linkProperties.getHttpProxy()); handleApplyDefaultProxy(null != newNetwork
updateTcpBufferSizes(newNetwork.linkProperties.getTcpBufferSizes()); ? newNetwork.linkProperties.getHttpProxy() : null);
mDnsManager.setDefaultDnsSystemProperties(newNetwork.linkProperties.getDnsServers()); updateTcpBufferSizes(null != newNetwork
? newNetwork.linkProperties.getTcpBufferSizes() : null);
mDnsManager.setDefaultDnsSystemProperties(null != newNetwork
? newNetwork.linkProperties.getDnsServers() : Collections.EMPTY_LIST);
notifyIfacesChangedForNetworkStats(); notifyIfacesChangedForNetworkStats();
// Fix up the NetworkCapabilities of any VPNs that don't specify underlying networks. // Fix up the NetworkCapabilities of any VPNs that don't specify underlying networks.
updateAllVpnsCapabilities(); updateAllVpnsCapabilities();
@@ -6448,6 +6460,16 @@ public class ConnectivityService extends IConnectivityManager.Stub
void addRematchedNetwork(@NonNull final NetworkBgStatePair network) { void addRematchedNetwork(@NonNull final NetworkBgStatePair network) {
mRematchedNetworks.add(network); mRematchedNetworks.add(network);
} }
// Will return null if this reassignment does not change the network assigned to
// the passed request.
@Nullable
private RequestReassignment getReassignment(@NonNull final NetworkRequestInfo nri) {
for (final RequestReassignment event : getRequestReassignments()) {
if (nri == event.mRequest) return event;
}
return null;
}
} }
private ArrayMap<NetworkRequestInfo, NetworkAgentInfo> computeRequestReassignmentForNetwork( private ArrayMap<NetworkRequestInfo, NetworkAgentInfo> computeRequestReassignmentForNetwork(
@@ -6514,8 +6536,6 @@ public class ConnectivityService extends IConnectivityManager.Stub
@NonNull final NetworkAgentInfo newNetwork, final long now) { @NonNull final NetworkAgentInfo newNetwork, final long now) {
ensureRunningOnConnectivityServiceThread(); ensureRunningOnConnectivityServiceThread();
if (!newNetwork.everConnected) return; if (!newNetwork.everConnected) return;
boolean isNewDefault = false;
NetworkAgentInfo oldDefaultNetwork = null;
changes.addRematchedNetwork(new NetworkReassignment.NetworkBgStatePair(newNetwork, changes.addRematchedNetwork(new NetworkReassignment.NetworkBgStatePair(newNetwork,
newNetwork.isBackgroundNetwork())); newNetwork.isBackgroundNetwork()));
@@ -6532,6 +6552,8 @@ public class ConnectivityService extends IConnectivityManager.Stub
final NetworkRequestInfo nri = entry.getKey(); final NetworkRequestInfo nri = entry.getKey();
final NetworkAgentInfo previousSatisfier = nri.mSatisfier; final NetworkAgentInfo previousSatisfier = nri.mSatisfier;
final NetworkAgentInfo newSatisfier = entry.getValue(); final NetworkAgentInfo newSatisfier = entry.getValue();
changes.addRequestReassignment(new NetworkReassignment.RequestReassignment(
nri, previousSatisfier, newSatisfier));
if (newSatisfier != null) { if (newSatisfier != null) {
if (VDBG) log("rematch for " + newSatisfier.name()); if (VDBG) log("rematch for " + newSatisfier.name());
if (previousSatisfier != null) { if (previousSatisfier != null) {
@@ -6544,25 +6566,9 @@ public class ConnectivityService extends IConnectivityManager.Stub
if (VDBG || DDBG) log(" accepting network in place of null"); if (VDBG || DDBG) log(" accepting network in place of null");
} }
newSatisfier.unlingerRequest(nri.request); newSatisfier.unlingerRequest(nri.request);
nri.mSatisfier = newSatisfier;
if (!newSatisfier.addRequest(nri.request)) { if (!newSatisfier.addRequest(nri.request)) {
Slog.wtf(TAG, "BUG: " + newSatisfier.name() + " already has " + nri.request); Slog.wtf(TAG, "BUG: " + newSatisfier.name() + " already has " + nri.request);
} }
changes.addRequestReassignment(new NetworkReassignment.RequestReassignment(
nri, previousSatisfier, newSatisfier));
// Tell NetworkProviders about the new score, so they can stop
// trying to connect if they know they cannot match it.
// TODO - this could get expensive if we have a lot of requests for this
// network. Think about if there is a way to reduce this. Push
// netid->request mapping to each provider?
sendUpdatedScoreToFactories(nri.request, newSatisfier);
if (isDefaultRequest(nri)) {
isNewDefault = true;
oldDefaultNetwork = previousSatisfier;
if (previousSatisfier != null) {
mLingerMonitor.noteLingerDefaultNetwork(previousSatisfier, newSatisfier);
}
}
} else { } else {
// If "newNetwork" is listed as satisfying "nri" but no longer satisfies "nri", // If "newNetwork" is listed as satisfying "nri" but no longer satisfies "nri",
// mark it as no longer satisfying "nri". Because networks are processed by // mark it as no longer satisfying "nri". Because networks are processed by
@@ -6576,35 +6582,8 @@ public class ConnectivityService extends IConnectivityManager.Stub
" request " + nri.request.requestId); " request " + nri.request.requestId);
} }
newNetwork.removeRequest(nri.request.requestId); newNetwork.removeRequest(nri.request.requestId);
if (previousSatisfier == newNetwork) {
nri.mSatisfier = null;
if (isDefaultRequest(nri)) mDefaultNetworkNai = null;
sendUpdatedScoreToFactories(nri.request, null);
} else {
Slog.wtf(TAG, "BUG: Removing request " + nri.request.requestId + " from " +
newNetwork.name() +
" without updating mSatisfier or providers!");
} }
// TODO: Technically, sending CALLBACK_LOST here is nri.mSatisfier = newSatisfier;
// incorrect if there is a replacement network currently
// connected that can satisfy nri, which is a request
// (not a listen). However, the only capability that can both
// a) be requested and b) change is NET_CAPABILITY_TRUSTED,
// so this code is only incorrect for a network that loses
// the TRUSTED capability, which is a rare case.
callCallbackForRequest(nri, newNetwork, ConnectivityManager.CALLBACK_LOST, 0);
}
}
if (isNewDefault) {
updateDataActivityTracking(newNetwork, oldDefaultNetwork);
// Notify system services that this network is up.
makeDefault(newNetwork);
// Log 0 -> X and Y -> X default network transitions, where X is the new default.
mDeps.getMetricsLogger().defaultNetworkMetrics().logDefaultNetworkEvent(
now, newNetwork, oldDefaultNetwork);
// Have a new default network, release the transition wakelock in
scheduleReleaseNetworkTransitionWakelock();
} }
} }
@@ -6632,14 +6611,48 @@ public class ConnectivityService extends IConnectivityManager.Stub
rematchNetworkAndRequests(changes, nai, now); rematchNetworkAndRequests(changes, nai, now);
} }
final NetworkAgentInfo newDefaultNetwork = getDefaultNetwork(); final NetworkRequestInfo defaultRequestInfo = mNetworkRequests.get(mDefaultRequest);
final NetworkReassignment.RequestReassignment reassignment =
changes.getReassignment(defaultRequestInfo);
final NetworkAgentInfo newDefaultNetwork =
null != reassignment ? reassignment.mNewNetwork : oldDefaultNetwork;
if (oldDefaultNetwork != newDefaultNetwork) {
if (oldDefaultNetwork != null) {
mLingerMonitor.noteLingerDefaultNetwork(oldDefaultNetwork, newDefaultNetwork);
}
updateDataActivityTracking(newDefaultNetwork, oldDefaultNetwork);
// Notify system services of the new default.
makeDefault(newDefaultNetwork);
// Log 0 -> X and Y -> X default network transitions, where X is the new default.
mDeps.getMetricsLogger().defaultNetworkMetrics().logDefaultNetworkEvent(
now, newDefaultNetwork, oldDefaultNetwork);
// Have a new default network, release the transition wakelock in
scheduleReleaseNetworkTransitionWakelock();
}
// Notify requested networks are available after the default net is switched, but // Notify requested networks are available after the default net is switched, but
// before LegacyTypeTracker sends legacy broadcasts // before LegacyTypeTracker sends legacy broadcasts
for (final NetworkReassignment.RequestReassignment event : for (final NetworkReassignment.RequestReassignment event :
changes.getRequestReassignments()) { changes.getRequestReassignments()) {
// Tell NetworkProviders about the new score, so they can stop
// trying to connect if they know they cannot match it.
// TODO - this could get expensive if there are a lot of outstanding requests for this
// network. Think of a way to reduce this. Push netid->request mapping to each factory?
sendUpdatedScoreToFactories(event.mRequest.request, event.mNewNetwork);
if (null != event.mNewNetwork) { if (null != event.mNewNetwork) {
notifyNetworkAvailable(event.mNewNetwork, event.mRequest); notifyNetworkAvailable(event.mNewNetwork, event.mRequest);
} else {
// TODO: Technically, sending CALLBACK_LOST here is
// incorrect if there is a replacement network currently
// connected that can satisfy nri, which is a request
// (not a listen). However, the only capability that can both
// a) be requested and b) change is NET_CAPABILITY_TRUSTED,
// so this code is only incorrect for a network that loses
// the TRUSTED capability, which is a rare case.
callCallbackForRequest(event.mRequest, event.mOldNetwork,
ConnectivityManager.CALLBACK_LOST, 0);
} }
} }

View File

@@ -16,6 +16,10 @@
package com.android.server.connectivity; package com.android.server.connectivity;
import static android.net.ConnectivityManager.NETID_UNSET;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.app.PendingIntent; import android.app.PendingIntent;
import android.content.ComponentName; import android.content.ComponentName;
import android.content.Context; import android.content.Context;
@@ -27,18 +31,16 @@ import android.text.TextUtils;
import android.text.format.DateUtils; import android.text.format.DateUtils;
import android.util.Log; import android.util.Log;
import android.util.SparseArray; import android.util.SparseArray;
import android.util.SparseIntArray;
import android.util.SparseBooleanArray; import android.util.SparseBooleanArray;
import java.util.Arrays; import android.util.SparseIntArray;
import java.util.HashMap;
import com.android.internal.R; import com.android.internal.R;
import com.android.internal.annotations.VisibleForTesting; import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.util.MessageUtils; import com.android.internal.util.MessageUtils;
import com.android.server.connectivity.NetworkNotificationManager;
import com.android.server.connectivity.NetworkNotificationManager.NotificationType; import com.android.server.connectivity.NetworkNotificationManager.NotificationType;
import static android.net.ConnectivityManager.NETID_UNSET; import java.util.Arrays;
import java.util.HashMap;
/** /**
* Class that monitors default network linger events and possibly notifies the user of network * Class that monitors default network linger events and possibly notifies the user of network
@@ -206,8 +208,19 @@ public class LingerMonitor {
mEverNotified.put(fromNai.network.netId, true); mEverNotified.put(fromNai.network.netId, true);
} }
/**
* Put up or dismiss a notification or toast for of a change in the default network if needed.
*
* Putting up a notification when switching from no network to some network is not supported
* and as such this method can't be called with a null |fromNai|. It can be called with a
* null |toNai| if there isn't a default network any more.
*
* @param fromNai switching from this NAI
* @param toNai switching to this NAI
*/
// The default network changed from fromNai to toNai due to a change in score. // The default network changed from fromNai to toNai due to a change in score.
public void noteLingerDefaultNetwork(NetworkAgentInfo fromNai, NetworkAgentInfo toNai) { public void noteLingerDefaultNetwork(@NonNull final NetworkAgentInfo fromNai,
@Nullable final NetworkAgentInfo toNai) {
if (VDBG) { if (VDBG) {
Log.d(TAG, "noteLingerDefaultNetwork from=" + fromNai.name() + Log.d(TAG, "noteLingerDefaultNetwork from=" + fromNai.name() +
" everValidated=" + fromNai.everValidated + " everValidated=" + fromNai.everValidated +
@@ -221,6 +234,10 @@ public class LingerMonitor {
// Internet access). // Internet access).
maybeStopNotifying(fromNai); maybeStopNotifying(fromNai);
// If the network was simply lost (either because it disconnected or because it stopped
// being the default with no replacement), then don't show a notification.
if (null == toNai) return;
// If this network never validated, don't notify. Otherwise, we could do things like: // If this network never validated, don't notify. Otherwise, we could do things like:
// //
// 1. Unvalidated wifi connects. // 1. Unvalidated wifi connects.

View File

@@ -5741,6 +5741,40 @@ public class ConnectivityServiceTest {
mCm.unregisterNetworkCallback(defaultCallback); mCm.unregisterNetworkCallback(defaultCallback);
} }
@Test
public final void testLoseTrusted() throws Exception {
final NetworkRequest trustedRequest = new NetworkRequest.Builder()
.addCapability(NET_CAPABILITY_TRUSTED)
.build();
final TestNetworkCallback trustedCallback = new TestNetworkCallback();
mCm.requestNetwork(trustedRequest, trustedCallback);
mCellNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_CELLULAR);
mCellNetworkAgent.connect(true);
trustedCallback.expectAvailableThenValidatedCallbacks(mCellNetworkAgent);
verify(mNetworkManagementService).setDefaultNetId(eq(mCellNetworkAgent.getNetwork().netId));
mWiFiNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_WIFI);
mWiFiNetworkAgent.connect(true);
trustedCallback.expectAvailableDoubleValidatedCallbacks(mWiFiNetworkAgent);
verify(mNetworkManagementService).setDefaultNetId(eq(mWiFiNetworkAgent.getNetwork().netId));
mWiFiNetworkAgent.removeCapability(NET_CAPABILITY_TRUSTED);
// There is currently a bug where losing the TRUSTED capability will send a LOST
// callback to requests before the available callback, in spite of the semantics
// of the requests dictating this should not happen. This is considered benign, but
// ideally should be fixed in the future.
trustedCallback.expectCallback(CallbackEntry.LOST, mWiFiNetworkAgent);
trustedCallback.expectAvailableCallbacksValidated(mCellNetworkAgent);
verify(mNetworkManagementService).setDefaultNetId(eq(mCellNetworkAgent.getNetwork().netId));
mCellNetworkAgent.removeCapability(NET_CAPABILITY_TRUSTED);
trustedCallback.expectCallback(CallbackEntry.LOST, mCellNetworkAgent);
verify(mNetworkManagementService).clearDefaultNetId();
mCm.unregisterNetworkCallback(trustedCallback);
}
@Ignore // 40%+ flakiness : figure out why and re-enable. @Ignore // 40%+ flakiness : figure out why and re-enable.
@Test @Test
public final void testBatteryStatsNetworkType() throws Exception { public final void testBatteryStatsNetworkType() throws Exception {