Add VCN underlying networks
This change declares underlying networks for the VCN for the purposes of app data accounting Bug: 190620024 Test: atest FrameworksVcnTests Original-Change: https://android-review.googlesource.com/1750241 Merged-In: Ida2cd5975250604064b0baed00bc7c201ea97c5e Change-Id: Ida2cd5975250604064b0baed00bc7c201ea97c5e
This commit is contained in:
@@ -409,7 +409,7 @@ public class UnderlyingNetworkTracker {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void reevaluateNetworks() {
|
private void reevaluateNetworks() {
|
||||||
if (mRouteSelectionCallback == null) {
|
if (mIsQuitting || mRouteSelectionCallback == null) {
|
||||||
return; // UnderlyingNetworkTracker has quit.
|
return; // UnderlyingNetworkTracker has quit.
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -75,6 +75,7 @@ import android.os.Message;
|
|||||||
import android.os.ParcelUuid;
|
import android.os.ParcelUuid;
|
||||||
import android.os.PowerManager;
|
import android.os.PowerManager;
|
||||||
import android.os.PowerManager.WakeLock;
|
import android.os.PowerManager.WakeLock;
|
||||||
|
import android.os.Process;
|
||||||
import android.os.SystemClock;
|
import android.os.SystemClock;
|
||||||
import android.util.ArraySet;
|
import android.util.ArraySet;
|
||||||
import android.util.Slog;
|
import android.util.Slog;
|
||||||
@@ -97,6 +98,7 @@ import java.net.Inet4Address;
|
|||||||
import java.net.Inet6Address;
|
import java.net.Inet6Address;
|
||||||
import java.net.InetAddress;
|
import java.net.InetAddress;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
@@ -937,6 +939,14 @@ public class VcnGatewayConnection extends StateMachine {
|
|||||||
|
|
||||||
private WakeupMessage createScheduledAlarm(
|
private WakeupMessage createScheduledAlarm(
|
||||||
@NonNull String cmdName, Message delayedMessage, long delay) {
|
@NonNull String cmdName, Message delayedMessage, long delay) {
|
||||||
|
final Handler handler = getHandler();
|
||||||
|
if (handler == null) {
|
||||||
|
logWarn(
|
||||||
|
"Attempted to schedule alarm after StateMachine has quit",
|
||||||
|
new IllegalStateException());
|
||||||
|
return null; // StateMachine has already quit.
|
||||||
|
}
|
||||||
|
|
||||||
// WakeupMessage uses Handler#dispatchMessage() to immediately handle the specified Runnable
|
// WakeupMessage uses Handler#dispatchMessage() to immediately handle the specified Runnable
|
||||||
// at the scheduled time. dispatchMessage() immediately executes and there may be queued
|
// at the scheduled time. dispatchMessage() immediately executes and there may be queued
|
||||||
// events that resolve the scheduled alarm pending in the queue. So, use the Runnable to
|
// events that resolve the scheduled alarm pending in the queue. So, use the Runnable to
|
||||||
@@ -945,7 +955,7 @@ public class VcnGatewayConnection extends StateMachine {
|
|||||||
final WakeupMessage alarm =
|
final WakeupMessage alarm =
|
||||||
mDeps.newWakeupMessage(
|
mDeps.newWakeupMessage(
|
||||||
mVcnContext,
|
mVcnContext,
|
||||||
getHandler(),
|
handler,
|
||||||
cmdName,
|
cmdName,
|
||||||
() -> sendMessageAndAcquireWakeLock(delayedMessage));
|
() -> sendMessageAndAcquireWakeLock(delayedMessage));
|
||||||
alarm.schedule(mDeps.getElapsedRealTime() + delay);
|
alarm.schedule(mDeps.getElapsedRealTime() + delay);
|
||||||
@@ -1572,6 +1582,9 @@ public class VcnGatewayConnection extends StateMachine {
|
|||||||
|
|
||||||
agent.sendNetworkCapabilities(caps);
|
agent.sendNetworkCapabilities(caps);
|
||||||
agent.sendLinkProperties(lp);
|
agent.sendLinkProperties(lp);
|
||||||
|
|
||||||
|
agent.setUnderlyingNetworks(
|
||||||
|
mUnderlying == null ? null : Collections.singletonList(mUnderlying.network));
|
||||||
}
|
}
|
||||||
|
|
||||||
protected VcnNetworkAgent buildNetworkAgent(
|
protected VcnNetworkAgent buildNetworkAgent(
|
||||||
@@ -1613,6 +1626,10 @@ public class VcnGatewayConnection extends StateMachine {
|
|||||||
teardownAsynchronously();
|
teardownAsynchronously();
|
||||||
} /* networkUnwantedCallback */,
|
} /* networkUnwantedCallback */,
|
||||||
(status) -> {
|
(status) -> {
|
||||||
|
if (mIsQuitting) {
|
||||||
|
return; // Ignore; VcnGatewayConnection quitting or already quit
|
||||||
|
}
|
||||||
|
|
||||||
switch (status) {
|
switch (status) {
|
||||||
case NetworkAgent.VALIDATION_STATUS_VALID:
|
case NetworkAgent.VALIDATION_STATUS_VALID:
|
||||||
clearFailedAttemptCounterAndSafeModeAlarm();
|
clearFailedAttemptCounterAndSafeModeAlarm();
|
||||||
@@ -1632,6 +1649,8 @@ public class VcnGatewayConnection extends StateMachine {
|
|||||||
} /* validationStatusCallback */);
|
} /* validationStatusCallback */);
|
||||||
|
|
||||||
agent.register();
|
agent.register();
|
||||||
|
agent.setUnderlyingNetworks(
|
||||||
|
mUnderlying == null ? null : Collections.singletonList(mUnderlying.network));
|
||||||
agent.markConnected();
|
agent.markConnected();
|
||||||
|
|
||||||
return agent;
|
return agent;
|
||||||
@@ -1972,7 +1991,7 @@ public class VcnGatewayConnection extends StateMachine {
|
|||||||
final int[] underlyingAdminUids = underlyingCaps.getAdministratorUids();
|
final int[] underlyingAdminUids = underlyingCaps.getAdministratorUids();
|
||||||
Arrays.sort(underlyingAdminUids); // Sort to allow contains check below.
|
Arrays.sort(underlyingAdminUids); // Sort to allow contains check below.
|
||||||
|
|
||||||
final int[] adminUids;
|
int[] adminUids;
|
||||||
if (underlyingCaps.getOwnerUid() > 0 // No owner UID specified
|
if (underlyingCaps.getOwnerUid() > 0 // No owner UID specified
|
||||||
&& 0 > Arrays.binarySearch(// Owner UID not found in admin UID list.
|
&& 0 > Arrays.binarySearch(// Owner UID not found in admin UID list.
|
||||||
underlyingAdminUids, underlyingCaps.getOwnerUid())) {
|
underlyingAdminUids, underlyingCaps.getOwnerUid())) {
|
||||||
@@ -1982,6 +2001,11 @@ public class VcnGatewayConnection extends StateMachine {
|
|||||||
} else {
|
} else {
|
||||||
adminUids = underlyingAdminUids;
|
adminUids = underlyingAdminUids;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Set owner & administrator UID
|
||||||
|
builder.setOwnerUid(Process.myUid());
|
||||||
|
adminUids = Arrays.copyOf(adminUids, adminUids.length + 1);
|
||||||
|
adminUids[adminUids.length - 1] = Process.myUid();
|
||||||
builder.setAdministratorUids(adminUids);
|
builder.setAdministratorUids(adminUids);
|
||||||
|
|
||||||
builder.setLinkUpstreamBandwidthKbps(underlyingCaps.getLinkUpstreamBandwidthKbps());
|
builder.setLinkUpstreamBandwidthKbps(underlyingCaps.getLinkUpstreamBandwidthKbps());
|
||||||
@@ -2170,6 +2194,16 @@ public class VcnGatewayConnection extends StateMachine {
|
|||||||
LOCAL_LOG.log(getLogPrefix() + "DBG: " + msg + tr);
|
LOCAL_LOG.log(getLogPrefix() + "DBG: " + msg + tr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void logWarn(String msg) {
|
||||||
|
Slog.w(TAG, getLogPrefix() + msg);
|
||||||
|
LOCAL_LOG.log(getLogPrefix() + "WARN: " + msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void logWarn(String msg, Throwable tr) {
|
||||||
|
Slog.w(TAG, getLogPrefix() + msg, tr);
|
||||||
|
LOCAL_LOG.log(getLogPrefix() + "WARN: " + msg + tr);
|
||||||
|
}
|
||||||
|
|
||||||
private void logErr(String msg) {
|
private void logErr(String msg) {
|
||||||
Slog.e(TAG, getLogPrefix() + msg);
|
Slog.e(TAG, getLogPrefix() + msg);
|
||||||
LOCAL_LOG.log(getLogPrefix() + "ERR: " + msg);
|
LOCAL_LOG.log(getLogPrefix() + "ERR: " + msg);
|
||||||
@@ -2547,6 +2581,11 @@ public class VcnGatewayConnection extends StateMachine {
|
|||||||
mImpl.sendLinkProperties(lp);
|
mImpl.sendLinkProperties(lp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Sends new NetworkCapabilities for the underlying NetworkAgent */
|
||||||
|
public void setUnderlyingNetworks(@Nullable List<Network> underlyingNetworks) {
|
||||||
|
mImpl.setUnderlyingNetworks(underlyingNetworks);
|
||||||
|
}
|
||||||
|
|
||||||
/** Retrieves the Network for the underlying NetworkAgent */
|
/** Retrieves the Network for the underlying NetworkAgent */
|
||||||
@Nullable
|
@Nullable
|
||||||
public Network getNetwork() {
|
public Network getNetwork() {
|
||||||
|
|||||||
@@ -476,5 +476,16 @@ public class UnderlyingNetworkTrackerTest {
|
|||||||
verifyNoMoreInteractions(mNetworkTrackerCb);
|
verifyNoMoreInteractions(mNetworkTrackerCb);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testRecordTrackerCallbackNotifiedAfterTeardown() {
|
||||||
|
UnderlyingNetworkListener cb = verifyRegistrationOnAvailableAndGetCallback();
|
||||||
|
mUnderlyingNetworkTracker.teardown();
|
||||||
|
|
||||||
|
cb.onCapabilitiesChanged(mNetwork, UPDATED_NETWORK_CAPABILITIES);
|
||||||
|
|
||||||
|
// Verify that the only call was during onAvailable()
|
||||||
|
verify(mNetworkTrackerCb, times(1)).onSelectedUnderlyingNetworkChanged(any());
|
||||||
|
}
|
||||||
|
|
||||||
// TODO (b/187991063): Add tests for network prioritization
|
// TODO (b/187991063): Add tests for network prioritization
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -48,6 +48,8 @@ import static org.mockito.Mockito.verify;
|
|||||||
import static org.mockito.Mockito.verifyNoMoreInteractions;
|
import static org.mockito.Mockito.verifyNoMoreInteractions;
|
||||||
import static org.mockito.Mockito.when;
|
import static org.mockito.Mockito.when;
|
||||||
|
|
||||||
|
import static java.util.Collections.singletonList;
|
||||||
|
|
||||||
import android.net.ConnectivityManager;
|
import android.net.ConnectivityManager;
|
||||||
import android.net.LinkAddress;
|
import android.net.LinkAddress;
|
||||||
import android.net.LinkProperties;
|
import android.net.LinkProperties;
|
||||||
@@ -233,6 +235,8 @@ public class VcnGatewayConnectionConnectedStateTest extends VcnGatewayConnection
|
|||||||
verify(mNetworkAgent).sendLinkProperties(
|
verify(mNetworkAgent).sendLinkProperties(
|
||||||
argThat(lp -> expectedMtu == lp.getMtu()
|
argThat(lp -> expectedMtu == lp.getMtu()
|
||||||
&& TEST_TCP_BUFFER_SIZES_2.equals(lp.getTcpBufferSizes())));
|
&& TEST_TCP_BUFFER_SIZES_2.equals(lp.getTcpBufferSizes())));
|
||||||
|
verify(mNetworkAgent)
|
||||||
|
.setUnderlyingNetworks(eq(singletonList(TEST_UNDERLYING_NETWORK_RECORD_2.network)));
|
||||||
}
|
}
|
||||||
|
|
||||||
private void triggerChildOpened() {
|
private void triggerChildOpened() {
|
||||||
@@ -293,6 +297,8 @@ public class VcnGatewayConnectionConnectedStateTest extends VcnGatewayConnection
|
|||||||
any(),
|
any(),
|
||||||
any());
|
any());
|
||||||
verify(mNetworkAgent).register();
|
verify(mNetworkAgent).register();
|
||||||
|
verify(mNetworkAgent)
|
||||||
|
.setUnderlyingNetworks(eq(singletonList(TEST_UNDERLYING_NETWORK_RECORD_1.network)));
|
||||||
verify(mNetworkAgent).markConnected();
|
verify(mNetworkAgent).markConnected();
|
||||||
|
|
||||||
verify(mIpSecSvc)
|
verify(mIpSecSvc)
|
||||||
|
|||||||
@@ -68,7 +68,7 @@ import java.util.UUID;
|
|||||||
@RunWith(AndroidJUnit4.class)
|
@RunWith(AndroidJUnit4.class)
|
||||||
@SmallTest
|
@SmallTest
|
||||||
public class VcnGatewayConnectionTest extends VcnGatewayConnectionTestBase {
|
public class VcnGatewayConnectionTest extends VcnGatewayConnectionTestBase {
|
||||||
private static final int TEST_UID = Process.myUid();
|
private static final int TEST_UID = Process.myUid() + 1;
|
||||||
|
|
||||||
private static final ParcelUuid TEST_PARCEL_UUID = new ParcelUuid(UUID.randomUUID());
|
private static final ParcelUuid TEST_PARCEL_UUID = new ParcelUuid(UUID.randomUUID());
|
||||||
private static final int TEST_SIM_SLOT_INDEX = 1;
|
private static final int TEST_SIM_SLOT_INDEX = 1;
|
||||||
@@ -137,7 +137,7 @@ public class VcnGatewayConnectionTest extends VcnGatewayConnectionTestBase {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
assertArrayEquals(new int[] {TEST_UID}, vcnCaps.getAdministratorUids());
|
assertArrayEquals(new int[] {Process.myUid(), TEST_UID}, vcnCaps.getAdministratorUids());
|
||||||
assertTrue(vcnCaps.getTransportInfo() instanceof VcnTransportInfo);
|
assertTrue(vcnCaps.getTransportInfo() instanceof VcnTransportInfo);
|
||||||
assertEquals(TEST_UPSTREAM_BANDWIDTH, vcnCaps.getLinkUpstreamBandwidthKbps());
|
assertEquals(TEST_UPSTREAM_BANDWIDTH, vcnCaps.getLinkUpstreamBandwidthKbps());
|
||||||
assertEquals(TEST_DOWNSTREAM_BANDWIDTH, vcnCaps.getLinkDownstreamBandwidthKbps());
|
assertEquals(TEST_DOWNSTREAM_BANDWIDTH, vcnCaps.getLinkDownstreamBandwidthKbps());
|
||||||
|
|||||||
Reference in New Issue
Block a user