Loading services/core/java/com/android/server/vcn/UnderlyingNetworkTracker.java +1 −1 Original line number Diff line number Diff line Loading @@ -409,7 +409,7 @@ public class UnderlyingNetworkTracker { } private void reevaluateNetworks() { if (mRouteSelectionCallback == null) { if (mIsQuitting || mRouteSelectionCallback == null) { return; // UnderlyingNetworkTracker has quit. } Loading services/core/java/com/android/server/vcn/VcnGatewayConnection.java +41 −2 Original line number Diff line number Diff line Loading @@ -75,6 +75,7 @@ import android.os.Message; import android.os.ParcelUuid; import android.os.PowerManager; import android.os.PowerManager.WakeLock; import android.os.Process; import android.os.SystemClock; import android.util.ArraySet; import android.util.Slog; Loading @@ -97,6 +98,7 @@ import java.net.Inet4Address; import java.net.Inet6Address; import java.net.InetAddress; import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.Objects; import java.util.Set; Loading Loading @@ -937,6 +939,14 @@ public class VcnGatewayConnection extends StateMachine { private WakeupMessage createScheduledAlarm( @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 // 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 Loading @@ -945,7 +955,7 @@ public class VcnGatewayConnection extends StateMachine { final WakeupMessage alarm = mDeps.newWakeupMessage( mVcnContext, getHandler(), handler, cmdName, () -> sendMessageAndAcquireWakeLock(delayedMessage)); alarm.schedule(mDeps.getElapsedRealTime() + delay); Loading Loading @@ -1572,6 +1582,9 @@ public class VcnGatewayConnection extends StateMachine { agent.sendNetworkCapabilities(caps); agent.sendLinkProperties(lp); agent.setUnderlyingNetworks( mUnderlying == null ? null : Collections.singletonList(mUnderlying.network)); } protected VcnNetworkAgent buildNetworkAgent( Loading Loading @@ -1613,6 +1626,10 @@ public class VcnGatewayConnection extends StateMachine { teardownAsynchronously(); } /* networkUnwantedCallback */, (status) -> { if (mIsQuitting) { return; // Ignore; VcnGatewayConnection quitting or already quit } switch (status) { case NetworkAgent.VALIDATION_STATUS_VALID: clearFailedAttemptCounterAndSafeModeAlarm(); Loading @@ -1632,6 +1649,8 @@ public class VcnGatewayConnection extends StateMachine { } /* validationStatusCallback */); agent.register(); agent.setUnderlyingNetworks( mUnderlying == null ? null : Collections.singletonList(mUnderlying.network)); agent.markConnected(); return agent; Loading Loading @@ -1972,7 +1991,7 @@ public class VcnGatewayConnection extends StateMachine { final int[] underlyingAdminUids = underlyingCaps.getAdministratorUids(); Arrays.sort(underlyingAdminUids); // Sort to allow contains check below. final int[] adminUids; int[] adminUids; if (underlyingCaps.getOwnerUid() > 0 // No owner UID specified && 0 > Arrays.binarySearch(// Owner UID not found in admin UID list. underlyingAdminUids, underlyingCaps.getOwnerUid())) { Loading @@ -1982,6 +2001,11 @@ public class VcnGatewayConnection extends StateMachine { } else { 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.setLinkUpstreamBandwidthKbps(underlyingCaps.getLinkUpstreamBandwidthKbps()); Loading Loading @@ -2170,6 +2194,16 @@ public class VcnGatewayConnection extends StateMachine { 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) { Slog.e(TAG, getLogPrefix() + msg); LOCAL_LOG.log(getLogPrefix() + "ERR: " + msg); Loading Loading @@ -2547,6 +2581,11 @@ public class VcnGatewayConnection extends StateMachine { 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 */ @Nullable public Network getNetwork() { Loading tests/vcn/java/com/android/server/vcn/UnderlyingNetworkTrackerTest.java +11 −0 Original line number Diff line number Diff line Loading @@ -476,5 +476,16 @@ public class UnderlyingNetworkTrackerTest { 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 } tests/vcn/java/com/android/server/vcn/VcnGatewayConnectionConnectedStateTest.java +6 −0 Original line number Diff line number Diff line Loading @@ -48,6 +48,8 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.mockito.Mockito.when; import static java.util.Collections.singletonList; import android.net.ConnectivityManager; import android.net.LinkAddress; import android.net.LinkProperties; Loading Loading @@ -233,6 +235,8 @@ public class VcnGatewayConnectionConnectedStateTest extends VcnGatewayConnection verify(mNetworkAgent).sendLinkProperties( argThat(lp -> expectedMtu == lp.getMtu() && TEST_TCP_BUFFER_SIZES_2.equals(lp.getTcpBufferSizes()))); verify(mNetworkAgent) .setUnderlyingNetworks(eq(singletonList(TEST_UNDERLYING_NETWORK_RECORD_2.network))); } private void triggerChildOpened() { Loading Loading @@ -293,6 +297,8 @@ public class VcnGatewayConnectionConnectedStateTest extends VcnGatewayConnection any(), any()); verify(mNetworkAgent).register(); verify(mNetworkAgent) .setUnderlyingNetworks(eq(singletonList(TEST_UNDERLYING_NETWORK_RECORD_1.network))); verify(mNetworkAgent).markConnected(); verify(mIpSecSvc) Loading tests/vcn/java/com/android/server/vcn/VcnGatewayConnectionTest.java +2 −2 Original line number Diff line number Diff line Loading @@ -68,7 +68,7 @@ import java.util.UUID; @RunWith(AndroidJUnit4.class) @SmallTest 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 int TEST_SIM_SLOT_INDEX = 1; Loading Loading @@ -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); assertEquals(TEST_UPSTREAM_BANDWIDTH, vcnCaps.getLinkUpstreamBandwidthKbps()); assertEquals(TEST_DOWNSTREAM_BANDWIDTH, vcnCaps.getLinkDownstreamBandwidthKbps()); Loading Loading
services/core/java/com/android/server/vcn/UnderlyingNetworkTracker.java +1 −1 Original line number Diff line number Diff line Loading @@ -409,7 +409,7 @@ public class UnderlyingNetworkTracker { } private void reevaluateNetworks() { if (mRouteSelectionCallback == null) { if (mIsQuitting || mRouteSelectionCallback == null) { return; // UnderlyingNetworkTracker has quit. } Loading
services/core/java/com/android/server/vcn/VcnGatewayConnection.java +41 −2 Original line number Diff line number Diff line Loading @@ -75,6 +75,7 @@ import android.os.Message; import android.os.ParcelUuid; import android.os.PowerManager; import android.os.PowerManager.WakeLock; import android.os.Process; import android.os.SystemClock; import android.util.ArraySet; import android.util.Slog; Loading @@ -97,6 +98,7 @@ import java.net.Inet4Address; import java.net.Inet6Address; import java.net.InetAddress; import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.Objects; import java.util.Set; Loading Loading @@ -937,6 +939,14 @@ public class VcnGatewayConnection extends StateMachine { private WakeupMessage createScheduledAlarm( @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 // 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 Loading @@ -945,7 +955,7 @@ public class VcnGatewayConnection extends StateMachine { final WakeupMessage alarm = mDeps.newWakeupMessage( mVcnContext, getHandler(), handler, cmdName, () -> sendMessageAndAcquireWakeLock(delayedMessage)); alarm.schedule(mDeps.getElapsedRealTime() + delay); Loading Loading @@ -1572,6 +1582,9 @@ public class VcnGatewayConnection extends StateMachine { agent.sendNetworkCapabilities(caps); agent.sendLinkProperties(lp); agent.setUnderlyingNetworks( mUnderlying == null ? null : Collections.singletonList(mUnderlying.network)); } protected VcnNetworkAgent buildNetworkAgent( Loading Loading @@ -1613,6 +1626,10 @@ public class VcnGatewayConnection extends StateMachine { teardownAsynchronously(); } /* networkUnwantedCallback */, (status) -> { if (mIsQuitting) { return; // Ignore; VcnGatewayConnection quitting or already quit } switch (status) { case NetworkAgent.VALIDATION_STATUS_VALID: clearFailedAttemptCounterAndSafeModeAlarm(); Loading @@ -1632,6 +1649,8 @@ public class VcnGatewayConnection extends StateMachine { } /* validationStatusCallback */); agent.register(); agent.setUnderlyingNetworks( mUnderlying == null ? null : Collections.singletonList(mUnderlying.network)); agent.markConnected(); return agent; Loading Loading @@ -1972,7 +1991,7 @@ public class VcnGatewayConnection extends StateMachine { final int[] underlyingAdminUids = underlyingCaps.getAdministratorUids(); Arrays.sort(underlyingAdminUids); // Sort to allow contains check below. final int[] adminUids; int[] adminUids; if (underlyingCaps.getOwnerUid() > 0 // No owner UID specified && 0 > Arrays.binarySearch(// Owner UID not found in admin UID list. underlyingAdminUids, underlyingCaps.getOwnerUid())) { Loading @@ -1982,6 +2001,11 @@ public class VcnGatewayConnection extends StateMachine { } else { 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.setLinkUpstreamBandwidthKbps(underlyingCaps.getLinkUpstreamBandwidthKbps()); Loading Loading @@ -2170,6 +2194,16 @@ public class VcnGatewayConnection extends StateMachine { 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) { Slog.e(TAG, getLogPrefix() + msg); LOCAL_LOG.log(getLogPrefix() + "ERR: " + msg); Loading Loading @@ -2547,6 +2581,11 @@ public class VcnGatewayConnection extends StateMachine { 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 */ @Nullable public Network getNetwork() { Loading
tests/vcn/java/com/android/server/vcn/UnderlyingNetworkTrackerTest.java +11 −0 Original line number Diff line number Diff line Loading @@ -476,5 +476,16 @@ public class UnderlyingNetworkTrackerTest { 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 }
tests/vcn/java/com/android/server/vcn/VcnGatewayConnectionConnectedStateTest.java +6 −0 Original line number Diff line number Diff line Loading @@ -48,6 +48,8 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.mockito.Mockito.when; import static java.util.Collections.singletonList; import android.net.ConnectivityManager; import android.net.LinkAddress; import android.net.LinkProperties; Loading Loading @@ -233,6 +235,8 @@ public class VcnGatewayConnectionConnectedStateTest extends VcnGatewayConnection verify(mNetworkAgent).sendLinkProperties( argThat(lp -> expectedMtu == lp.getMtu() && TEST_TCP_BUFFER_SIZES_2.equals(lp.getTcpBufferSizes()))); verify(mNetworkAgent) .setUnderlyingNetworks(eq(singletonList(TEST_UNDERLYING_NETWORK_RECORD_2.network))); } private void triggerChildOpened() { Loading Loading @@ -293,6 +297,8 @@ public class VcnGatewayConnectionConnectedStateTest extends VcnGatewayConnection any(), any()); verify(mNetworkAgent).register(); verify(mNetworkAgent) .setUnderlyingNetworks(eq(singletonList(TEST_UNDERLYING_NETWORK_RECORD_1.network))); verify(mNetworkAgent).markConnected(); verify(mIpSecSvc) Loading
tests/vcn/java/com/android/server/vcn/VcnGatewayConnectionTest.java +2 −2 Original line number Diff line number Diff line Loading @@ -68,7 +68,7 @@ import java.util.UUID; @RunWith(AndroidJUnit4.class) @SmallTest 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 int TEST_SIM_SLOT_INDEX = 1; Loading Loading @@ -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); assertEquals(TEST_UPSTREAM_BANDWIDTH, vcnCaps.getLinkUpstreamBandwidthKbps()); assertEquals(TEST_DOWNSTREAM_BANDWIDTH, vcnCaps.getLinkDownstreamBandwidthKbps()); Loading