Merge "Add VCN underlying networks" into sc-dev am: 053213b1cb

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/15191631

Change-Id: I7c7daeee0120ec92bf08a3c7d8e0ae2fc529ae7b
This commit is contained in:
TreeHugger Robot
2021-07-05 01:40:43 +00:00
committed by Automerger Merge Worker
5 changed files with 61 additions and 5 deletions

View File

@@ -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.
} }

View File

@@ -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() {

View File

@@ -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
} }

View File

@@ -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)

View File

@@ -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());