Pass all default networks to NetworkStatsService
This will allow NetworkStatsService to treat traffic on these networks differently from traffic where the app selects a network that is not the default. Bug: 35142602 Test: runtest frameworks-net Change-Id: I5ea9d200d9fb153490c6108bb9390bf152f297da
This commit is contained in:
@@ -4962,10 +4962,12 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
|||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
loge("Exception setting default network :" + e);
|
loge("Exception setting default network :" + e);
|
||||||
}
|
}
|
||||||
|
|
||||||
notifyLockdownVpn(newNetwork);
|
notifyLockdownVpn(newNetwork);
|
||||||
handleApplyDefaultProxy(newNetwork.linkProperties.getHttpProxy());
|
handleApplyDefaultProxy(newNetwork.linkProperties.getHttpProxy());
|
||||||
updateTcpBufferSizes(newNetwork);
|
updateTcpBufferSizes(newNetwork);
|
||||||
mDnsManager.setDefaultDnsSystemProperties(newNetwork.linkProperties.getDnsServers());
|
mDnsManager.setDefaultDnsSystemProperties(newNetwork.linkProperties.getDnsServers());
|
||||||
|
notifyIfacesChangedForNetworkStats();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void processListenRequests(NetworkAgentInfo nai, boolean capabilitiesChanged) {
|
private void processListenRequests(NetworkAgentInfo nai, boolean capabilitiesChanged) {
|
||||||
@@ -5538,13 +5540,31 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
|||||||
notifyNetworkCallbacks(networkAgent, notifyType, 0);
|
notifyNetworkCallbacks(networkAgent, notifyType, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the list of all interfaces that could be used by network traffic that does not
|
||||||
|
* explicitly specify a network. This includes the default network, but also all VPNs that are
|
||||||
|
* currently connected.
|
||||||
|
*
|
||||||
|
* Must be called on the handler thread.
|
||||||
|
*/
|
||||||
|
private Network[] getDefaultNetworks() {
|
||||||
|
ArrayList<Network> defaultNetworks = new ArrayList<>();
|
||||||
|
NetworkAgentInfo defaultNetwork = getDefaultNetwork();
|
||||||
|
for (NetworkAgentInfo nai : mNetworkAgentInfos.values()) {
|
||||||
|
if (nai.everConnected && (nai == defaultNetwork || nai.isVPN())) {
|
||||||
|
defaultNetworks.add(nai.network);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return defaultNetworks.toArray(new Network[0]);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Notify NetworkStatsService that the set of active ifaces has changed, or that one of the
|
* Notify NetworkStatsService that the set of active ifaces has changed, or that one of the
|
||||||
* properties tracked by NetworkStatsService on an active iface has changed.
|
* properties tracked by NetworkStatsService on an active iface has changed.
|
||||||
*/
|
*/
|
||||||
private void notifyIfacesChangedForNetworkStats() {
|
private void notifyIfacesChangedForNetworkStats() {
|
||||||
try {
|
try {
|
||||||
mStatsService.forceUpdateIfaces();
|
mStatsService.forceUpdateIfaces(getDefaultNetworks());
|
||||||
} catch (Exception ignored) {
|
} catch (Exception ignored) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -5576,7 +5596,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
|||||||
success = mVpns.get(user).setUnderlyingNetworks(networks);
|
success = mVpns.get(user).setUnderlyingNetworks(networks);
|
||||||
}
|
}
|
||||||
if (success) {
|
if (success) {
|
||||||
notifyIfacesChangedForNetworkStats();
|
mHandler.post(() -> notifyIfacesChangedForNetworkStats());
|
||||||
}
|
}
|
||||||
return success;
|
return success;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3501,34 +3501,50 @@ public class ConnectivityServiceTest {
|
|||||||
@Test
|
@Test
|
||||||
public void testStatsIfacesChanged() throws Exception {
|
public void testStatsIfacesChanged() throws Exception {
|
||||||
mCellNetworkAgent = new MockNetworkAgent(TRANSPORT_CELLULAR);
|
mCellNetworkAgent = new MockNetworkAgent(TRANSPORT_CELLULAR);
|
||||||
|
mWiFiNetworkAgent = new MockNetworkAgent(TRANSPORT_WIFI);
|
||||||
|
|
||||||
|
Network[] onlyCell = new Network[]{mCellNetworkAgent.getNetwork()};
|
||||||
|
Network[] onlyWifi = new Network[]{mWiFiNetworkAgent.getNetwork()};
|
||||||
|
|
||||||
// Simple connection should have updated ifaces
|
// Simple connection should have updated ifaces
|
||||||
mCellNetworkAgent.connect(false);
|
mCellNetworkAgent.connect(false);
|
||||||
waitForIdle();
|
waitForIdle();
|
||||||
verify(mStatsService, atLeastOnce()).forceUpdateIfaces();
|
verify(mStatsService, atLeastOnce()).forceUpdateIfaces(onlyCell);
|
||||||
|
reset(mStatsService);
|
||||||
|
|
||||||
|
// Default network switch should update ifaces.
|
||||||
|
mWiFiNetworkAgent.connect(false);
|
||||||
|
waitForIdle();
|
||||||
|
verify(mStatsService, atLeastOnce()).forceUpdateIfaces(onlyWifi);
|
||||||
|
reset(mStatsService);
|
||||||
|
|
||||||
|
// Disconnect should update ifaces.
|
||||||
|
mWiFiNetworkAgent.disconnect();
|
||||||
|
waitForIdle();
|
||||||
|
verify(mStatsService, atLeastOnce()).forceUpdateIfaces(onlyCell);
|
||||||
reset(mStatsService);
|
reset(mStatsService);
|
||||||
|
|
||||||
// Metered change should update ifaces
|
// Metered change should update ifaces
|
||||||
mCellNetworkAgent.addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED);
|
mCellNetworkAgent.addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED);
|
||||||
waitForIdle();
|
waitForIdle();
|
||||||
verify(mStatsService, atLeastOnce()).forceUpdateIfaces();
|
verify(mStatsService, atLeastOnce()).forceUpdateIfaces(onlyCell);
|
||||||
reset(mStatsService);
|
reset(mStatsService);
|
||||||
|
|
||||||
mCellNetworkAgent.removeCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED);
|
mCellNetworkAgent.removeCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED);
|
||||||
waitForIdle();
|
waitForIdle();
|
||||||
verify(mStatsService, atLeastOnce()).forceUpdateIfaces();
|
verify(mStatsService, atLeastOnce()).forceUpdateIfaces(onlyCell);
|
||||||
reset(mStatsService);
|
reset(mStatsService);
|
||||||
|
|
||||||
// Captive portal change shouldn't update ifaces
|
// Captive portal change shouldn't update ifaces
|
||||||
mCellNetworkAgent.addCapability(NetworkCapabilities.NET_CAPABILITY_CAPTIVE_PORTAL);
|
mCellNetworkAgent.addCapability(NetworkCapabilities.NET_CAPABILITY_CAPTIVE_PORTAL);
|
||||||
waitForIdle();
|
waitForIdle();
|
||||||
verify(mStatsService, never()).forceUpdateIfaces();
|
verify(mStatsService, never()).forceUpdateIfaces(onlyCell);
|
||||||
reset(mStatsService);
|
reset(mStatsService);
|
||||||
|
|
||||||
// Roaming change should update ifaces
|
// Roaming change should update ifaces
|
||||||
mCellNetworkAgent.addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_ROAMING);
|
mCellNetworkAgent.addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_ROAMING);
|
||||||
waitForIdle();
|
waitForIdle();
|
||||||
verify(mStatsService, atLeastOnce()).forceUpdateIfaces();
|
verify(mStatsService, atLeastOnce()).forceUpdateIfaces(onlyCell);
|
||||||
reset(mStatsService);
|
reset(mStatsService);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -67,6 +67,7 @@ import android.net.IConnectivityManager;
|
|||||||
import android.net.INetworkManagementEventObserver;
|
import android.net.INetworkManagementEventObserver;
|
||||||
import android.net.INetworkStatsSession;
|
import android.net.INetworkStatsSession;
|
||||||
import android.net.LinkProperties;
|
import android.net.LinkProperties;
|
||||||
|
import android.net.Network;
|
||||||
import android.net.NetworkCapabilities;
|
import android.net.NetworkCapabilities;
|
||||||
import android.net.NetworkInfo;
|
import android.net.NetworkInfo;
|
||||||
import android.net.NetworkInfo.DetailedState;
|
import android.net.NetworkInfo.DetailedState;
|
||||||
@@ -136,6 +137,12 @@ public class NetworkStatsServiceTest {
|
|||||||
private static final int UID_BLUE = 1002;
|
private static final int UID_BLUE = 1002;
|
||||||
private static final int UID_GREEN = 1003;
|
private static final int UID_GREEN = 1003;
|
||||||
|
|
||||||
|
|
||||||
|
private static final Network WIFI_NETWORK = new Network(100);
|
||||||
|
private static final Network MOBILE_NETWORK = new Network(101);
|
||||||
|
private static final Network[] NETWORKS_WIFI = new Network[]{ WIFI_NETWORK };
|
||||||
|
private static final Network[] NETWORKS_MOBILE = new Network[]{ MOBILE_NETWORK };
|
||||||
|
|
||||||
private static final long WAIT_TIMEOUT = 2 * 1000; // 2 secs
|
private static final long WAIT_TIMEOUT = 2 * 1000; // 2 secs
|
||||||
private static final int INVALID_TYPE = -1;
|
private static final int INVALID_TYPE = -1;
|
||||||
|
|
||||||
@@ -231,7 +238,7 @@ public class NetworkStatsServiceTest {
|
|||||||
expectNetworkStatsUidDetail(buildEmptyStats());
|
expectNetworkStatsUidDetail(buildEmptyStats());
|
||||||
expectBandwidthControlCheck();
|
expectBandwidthControlCheck();
|
||||||
|
|
||||||
mService.forceUpdateIfaces();
|
mService.forceUpdateIfaces(NETWORKS_WIFI);
|
||||||
|
|
||||||
// verify service has empty history for wifi
|
// verify service has empty history for wifi
|
||||||
assertNetworkTotal(sTemplateWifi, 0L, 0L, 0L, 0L, 0);
|
assertNetworkTotal(sTemplateWifi, 0L, 0L, 0L, 0L, 0);
|
||||||
@@ -278,7 +285,7 @@ public class NetworkStatsServiceTest {
|
|||||||
expectNetworkStatsUidDetail(buildEmptyStats());
|
expectNetworkStatsUidDetail(buildEmptyStats());
|
||||||
expectBandwidthControlCheck();
|
expectBandwidthControlCheck();
|
||||||
|
|
||||||
mService.forceUpdateIfaces();
|
mService.forceUpdateIfaces(NETWORKS_WIFI);
|
||||||
|
|
||||||
// verify service has empty history for wifi
|
// verify service has empty history for wifi
|
||||||
assertNetworkTotal(sTemplateWifi, 0L, 0L, 0L, 0L, 0);
|
assertNetworkTotal(sTemplateWifi, 0L, 0L, 0L, 0L, 0);
|
||||||
@@ -356,7 +363,7 @@ public class NetworkStatsServiceTest {
|
|||||||
expectNetworkStatsUidDetail(buildEmptyStats());
|
expectNetworkStatsUidDetail(buildEmptyStats());
|
||||||
expectBandwidthControlCheck();
|
expectBandwidthControlCheck();
|
||||||
|
|
||||||
mService.forceUpdateIfaces();
|
mService.forceUpdateIfaces(NETWORKS_WIFI);
|
||||||
|
|
||||||
|
|
||||||
// modify some number on wifi, and trigger poll event
|
// modify some number on wifi, and trigger poll event
|
||||||
@@ -401,7 +408,7 @@ public class NetworkStatsServiceTest {
|
|||||||
expectNetworkStatsUidDetail(buildEmptyStats());
|
expectNetworkStatsUidDetail(buildEmptyStats());
|
||||||
expectBandwidthControlCheck();
|
expectBandwidthControlCheck();
|
||||||
|
|
||||||
mService.forceUpdateIfaces();
|
mService.forceUpdateIfaces(NETWORKS_MOBILE);
|
||||||
|
|
||||||
|
|
||||||
// create some traffic on first network
|
// create some traffic on first network
|
||||||
@@ -439,7 +446,7 @@ public class NetworkStatsServiceTest {
|
|||||||
.addValues(TEST_IFACE, UID_BLUE, SET_DEFAULT, TAG_NONE, 512L, 4L, 0L, 0L, 0L));
|
.addValues(TEST_IFACE, UID_BLUE, SET_DEFAULT, TAG_NONE, 512L, 4L, 0L, 0L, 0L));
|
||||||
expectBandwidthControlCheck();
|
expectBandwidthControlCheck();
|
||||||
|
|
||||||
mService.forceUpdateIfaces();
|
mService.forceUpdateIfaces(NETWORKS_MOBILE);
|
||||||
forcePollAndWaitForIdle();
|
forcePollAndWaitForIdle();
|
||||||
|
|
||||||
|
|
||||||
@@ -481,7 +488,7 @@ public class NetworkStatsServiceTest {
|
|||||||
expectNetworkStatsUidDetail(buildEmptyStats());
|
expectNetworkStatsUidDetail(buildEmptyStats());
|
||||||
expectBandwidthControlCheck();
|
expectBandwidthControlCheck();
|
||||||
|
|
||||||
mService.forceUpdateIfaces();
|
mService.forceUpdateIfaces(NETWORKS_WIFI);
|
||||||
|
|
||||||
|
|
||||||
// create some traffic
|
// create some traffic
|
||||||
@@ -543,7 +550,7 @@ public class NetworkStatsServiceTest {
|
|||||||
expectNetworkStatsUidDetail(buildEmptyStats());
|
expectNetworkStatsUidDetail(buildEmptyStats());
|
||||||
expectBandwidthControlCheck();
|
expectBandwidthControlCheck();
|
||||||
|
|
||||||
mService.forceUpdateIfaces();
|
mService.forceUpdateIfaces(NETWORKS_MOBILE);
|
||||||
|
|
||||||
|
|
||||||
// create some traffic
|
// create some traffic
|
||||||
@@ -573,7 +580,7 @@ public class NetworkStatsServiceTest {
|
|||||||
.addValues(TEST_IFACE, UID_RED, SET_DEFAULT, 0xF00D, 512L, 4L, 512L, 4L, 0L));
|
.addValues(TEST_IFACE, UID_RED, SET_DEFAULT, 0xF00D, 512L, 4L, 512L, 4L, 0L));
|
||||||
expectBandwidthControlCheck();
|
expectBandwidthControlCheck();
|
||||||
|
|
||||||
mService.forceUpdateIfaces();
|
mService.forceUpdateIfaces(NETWORKS_MOBILE);
|
||||||
forcePollAndWaitForIdle();
|
forcePollAndWaitForIdle();
|
||||||
|
|
||||||
|
|
||||||
@@ -605,7 +612,7 @@ public class NetworkStatsServiceTest {
|
|||||||
expectNetworkStatsUidDetail(buildEmptyStats());
|
expectNetworkStatsUidDetail(buildEmptyStats());
|
||||||
expectBandwidthControlCheck();
|
expectBandwidthControlCheck();
|
||||||
|
|
||||||
mService.forceUpdateIfaces();
|
mService.forceUpdateIfaces(NETWORKS_WIFI);
|
||||||
|
|
||||||
|
|
||||||
// create some traffic for two apps
|
// create some traffic for two apps
|
||||||
@@ -667,7 +674,7 @@ public class NetworkStatsServiceTest {
|
|||||||
expectNetworkStatsUidDetail(buildEmptyStats());
|
expectNetworkStatsUidDetail(buildEmptyStats());
|
||||||
expectBandwidthControlCheck();
|
expectBandwidthControlCheck();
|
||||||
|
|
||||||
mService.forceUpdateIfaces();
|
mService.forceUpdateIfaces(NETWORKS_WIFI);
|
||||||
|
|
||||||
|
|
||||||
// create some initial traffic
|
// create some initial traffic
|
||||||
@@ -728,7 +735,7 @@ public class NetworkStatsServiceTest {
|
|||||||
expectNetworkStatsUidDetail(buildEmptyStats());
|
expectNetworkStatsUidDetail(buildEmptyStats());
|
||||||
expectBandwidthControlCheck();
|
expectBandwidthControlCheck();
|
||||||
|
|
||||||
mService.forceUpdateIfaces();
|
mService.forceUpdateIfaces(NETWORKS_WIFI);
|
||||||
|
|
||||||
|
|
||||||
// create some initial traffic
|
// create some initial traffic
|
||||||
@@ -770,7 +777,7 @@ public class NetworkStatsServiceTest {
|
|||||||
expectNetworkStatsUidDetail(buildEmptyStats());
|
expectNetworkStatsUidDetail(buildEmptyStats());
|
||||||
expectBandwidthControlCheck();
|
expectBandwidthControlCheck();
|
||||||
|
|
||||||
mService.forceUpdateIfaces();
|
mService.forceUpdateIfaces(NETWORKS_MOBILE);
|
||||||
|
|
||||||
|
|
||||||
// Create some traffic
|
// Create some traffic
|
||||||
@@ -811,7 +818,7 @@ public class NetworkStatsServiceTest {
|
|||||||
expectNetworkStatsUidDetail(buildEmptyStats());
|
expectNetworkStatsUidDetail(buildEmptyStats());
|
||||||
expectBandwidthControlCheck();
|
expectBandwidthControlCheck();
|
||||||
|
|
||||||
mService.forceUpdateIfaces();
|
mService.forceUpdateIfaces(NETWORKS_MOBILE);
|
||||||
|
|
||||||
|
|
||||||
// create some tethering traffic
|
// create some tethering traffic
|
||||||
@@ -856,7 +863,7 @@ public class NetworkStatsServiceTest {
|
|||||||
expectNetworkStatsUidDetail(buildEmptyStats());
|
expectNetworkStatsUidDetail(buildEmptyStats());
|
||||||
expectBandwidthControlCheck();
|
expectBandwidthControlCheck();
|
||||||
|
|
||||||
mService.forceUpdateIfaces();
|
mService.forceUpdateIfaces(NETWORKS_WIFI);
|
||||||
|
|
||||||
// verify service has empty history for wifi
|
// verify service has empty history for wifi
|
||||||
assertNetworkTotal(sTemplateWifi, 0L, 0L, 0L, 0L, 0);
|
assertNetworkTotal(sTemplateWifi, 0L, 0L, 0L, 0L, 0);
|
||||||
@@ -1161,7 +1168,7 @@ public class NetworkStatsServiceTest {
|
|||||||
final NetworkCapabilities capabilities = new NetworkCapabilities();
|
final NetworkCapabilities capabilities = new NetworkCapabilities();
|
||||||
capabilities.setCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED, !isMetered);
|
capabilities.setCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED, !isMetered);
|
||||||
capabilities.setCapability(NetworkCapabilities.NET_CAPABILITY_NOT_ROAMING, true);
|
capabilities.setCapability(NetworkCapabilities.NET_CAPABILITY_NOT_ROAMING, true);
|
||||||
return new NetworkState(info, prop, capabilities, null, null, TEST_SSID);
|
return new NetworkState(info, prop, capabilities, WIFI_NETWORK, null, TEST_SSID);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static NetworkState buildMobile3gState(String subscriberId) {
|
private static NetworkState buildMobile3gState(String subscriberId) {
|
||||||
@@ -1178,7 +1185,7 @@ public class NetworkStatsServiceTest {
|
|||||||
final NetworkCapabilities capabilities = new NetworkCapabilities();
|
final NetworkCapabilities capabilities = new NetworkCapabilities();
|
||||||
capabilities.setCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED, false);
|
capabilities.setCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED, false);
|
||||||
capabilities.setCapability(NetworkCapabilities.NET_CAPABILITY_NOT_ROAMING, !isRoaming);
|
capabilities.setCapability(NetworkCapabilities.NET_CAPABILITY_NOT_ROAMING, !isRoaming);
|
||||||
return new NetworkState(info, prop, capabilities, null, subscriberId, null);
|
return new NetworkState(info, prop, capabilities, MOBILE_NETWORK, subscriberId, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static NetworkState buildMobile4gState(String iface) {
|
private static NetworkState buildMobile4gState(String iface) {
|
||||||
@@ -1189,7 +1196,7 @@ public class NetworkStatsServiceTest {
|
|||||||
final NetworkCapabilities capabilities = new NetworkCapabilities();
|
final NetworkCapabilities capabilities = new NetworkCapabilities();
|
||||||
capabilities.setCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED, false);
|
capabilities.setCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED, false);
|
||||||
capabilities.setCapability(NetworkCapabilities.NET_CAPABILITY_NOT_ROAMING, true);
|
capabilities.setCapability(NetworkCapabilities.NET_CAPABILITY_NOT_ROAMING, true);
|
||||||
return new NetworkState(info, prop, capabilities, null, null, null);
|
return new NetworkState(info, prop, capabilities, MOBILE_NETWORK, null, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
private NetworkStats buildEmptyStats() {
|
private NetworkStats buildEmptyStats() {
|
||||||
|
|||||||
Reference in New Issue
Block a user