Merge changes Iad296830,I826711bb,Ieb2a9b20,I6b688b00 am: 03c0059bb1 am: e57540d009
Original change: https://android-review.googlesource.com/c/platform/frameworks/base/+/1624741 MUST ONLY BE SUBMITTED BY AUTOMERGER Change-Id: I4f769e2f26a335e767a049916499d86c6c3cff5c
This commit is contained in:
@@ -23,7 +23,6 @@ import android.net.ConnectivityManager.NetworkCallback;
|
|||||||
import android.net.LinkProperties;
|
import android.net.LinkProperties;
|
||||||
import android.net.Network;
|
import android.net.Network;
|
||||||
import android.net.NetworkCapabilities;
|
import android.net.NetworkCapabilities;
|
||||||
import android.net.NetworkCapabilities.NetCapability;
|
|
||||||
import android.net.NetworkRequest;
|
import android.net.NetworkRequest;
|
||||||
import android.net.TelephonyNetworkSpecifier;
|
import android.net.TelephonyNetworkSpecifier;
|
||||||
import android.os.Handler;
|
import android.os.Handler;
|
||||||
@@ -115,33 +114,61 @@ public class UnderlyingNetworkTracker {
|
|||||||
getWifiNetworkRequest(), mHandler, mWifiBringupCallback);
|
getWifiNetworkRequest(), mHandler, mWifiBringupCallback);
|
||||||
updateSubIdsAndCellularRequests();
|
updateSubIdsAndCellularRequests();
|
||||||
|
|
||||||
// register Network-selection request used to decide selected underlying Network
|
// Register Network-selection request used to decide selected underlying Network. All
|
||||||
|
// underlying networks must be VCN managed in order to be used.
|
||||||
mConnectivityManager.requestBackgroundNetwork(
|
mConnectivityManager.requestBackgroundNetwork(
|
||||||
getNetworkRequestBase().build(), mHandler, mRouteSelectionCallback);
|
getBaseNetworkRequest(true /* requireVcnManaged */).build(),
|
||||||
|
mHandler,
|
||||||
|
mRouteSelectionCallback);
|
||||||
}
|
}
|
||||||
|
|
||||||
private NetworkRequest getWifiNetworkRequest() {
|
private NetworkRequest getWifiNetworkRequest() {
|
||||||
return getNetworkRequestBase().addTransportType(NetworkCapabilities.TRANSPORT_WIFI).build();
|
// Request exclusively VCN managed networks to ensure that we only ever keep carrier wifi
|
||||||
|
// alive.
|
||||||
|
return getBaseNetworkRequest(true /* requireVcnManaged */)
|
||||||
|
.addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
|
||||||
|
.build();
|
||||||
}
|
}
|
||||||
|
|
||||||
private NetworkRequest getCellNetworkRequestForSubId(int subId) {
|
private NetworkRequest getCellNetworkRequestForSubId(int subId) {
|
||||||
return getNetworkRequestBase()
|
// Do not request NOT_VCN_MANAGED to ensure that the TelephonyNetworkFactory has a
|
||||||
|
// fulfillable request to bring up underlying cellular Networks even if the VCN is already
|
||||||
|
// connected.
|
||||||
|
return getBaseNetworkRequest(false /* requireVcnManaged */)
|
||||||
.addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR)
|
.addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR)
|
||||||
.setNetworkSpecifier(new TelephonyNetworkSpecifier(subId))
|
.setNetworkSpecifier(new TelephonyNetworkSpecifier(subId))
|
||||||
.build();
|
.build();
|
||||||
}
|
}
|
||||||
|
|
||||||
private NetworkRequest.Builder getNetworkRequestBase() {
|
/**
|
||||||
NetworkRequest.Builder requestBase = new NetworkRequest.Builder();
|
* Builds and returns a NetworkRequest builder common to all Underlying Network requests
|
||||||
for (@NetCapability int capability : mRequiredUnderlyingNetworkCapabilities) {
|
*
|
||||||
|
* <p>A NetworkRequest may either (1) Require the presence of a capability by using
|
||||||
|
* addCapability(), (2) require the absence of a capability using unwanted capabilities, or (3)
|
||||||
|
* allow any state. Underlying networks are never desired to have the NOT_VCN_MANAGED
|
||||||
|
* capability, and only cases (2) and (3) are used.
|
||||||
|
*
|
||||||
|
* @param requireVcnManaged whether the underlying network is required to be VCN managed to
|
||||||
|
* match this request. If {@code true}, the NOT_VCN_MANAGED capability will be set as
|
||||||
|
* unwanted. Else, the NOT_VCN_MANAGED capability will be removed, and any state is
|
||||||
|
* acceptable.
|
||||||
|
*/
|
||||||
|
private NetworkRequest.Builder getBaseNetworkRequest(boolean requireVcnManaged) {
|
||||||
|
NetworkRequest.Builder requestBase =
|
||||||
|
new NetworkRequest.Builder()
|
||||||
|
.removeCapability(NetworkCapabilities.NET_CAPABILITY_TRUSTED)
|
||||||
|
.removeCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED)
|
||||||
|
.removeCapability(NetworkCapabilities.NET_CAPABILITY_NOT_VCN_MANAGED);
|
||||||
|
|
||||||
|
for (int capability : mRequiredUnderlyingNetworkCapabilities) {
|
||||||
requestBase.addCapability(capability);
|
requestBase.addCapability(capability);
|
||||||
}
|
}
|
||||||
|
|
||||||
return requestBase
|
if (requireVcnManaged) {
|
||||||
.removeCapability(NetworkCapabilities.NET_CAPABILITY_TRUSTED)
|
requestBase.addUnwantedCapability(NetworkCapabilities.NET_CAPABILITY_NOT_VCN_MANAGED);
|
||||||
.removeCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED)
|
}
|
||||||
.removeCapability(NetworkCapabilities.NET_CAPABILITY_NOT_VCN_MANAGED)
|
|
||||||
.addUnwantedCapability(NetworkCapabilities.NET_CAPABILITY_NOT_VCN_MANAGED);
|
return requestBase;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -299,9 +299,7 @@ public class Vcn extends Handler {
|
|||||||
for (VcnGatewayConnectionConfig gatewayConnectionConfig :
|
for (VcnGatewayConnectionConfig gatewayConnectionConfig :
|
||||||
mConfig.getGatewayConnectionConfigs()) {
|
mConfig.getGatewayConnectionConfigs()) {
|
||||||
if (isRequestSatisfiedByGatewayConnectionConfig(request, gatewayConnectionConfig)) {
|
if (isRequestSatisfiedByGatewayConnectionConfig(request, gatewayConnectionConfig)) {
|
||||||
Slog.v(
|
Slog.v(getLogTag(), "Bringing up new VcnGatewayConnection for request " + request);
|
||||||
getLogTag(),
|
|
||||||
"Bringing up new VcnGatewayConnection for request " + request.requestId);
|
|
||||||
|
|
||||||
final VcnGatewayConnection vcnGatewayConnection =
|
final VcnGatewayConnection vcnGatewayConnection =
|
||||||
mDeps.newVcnGatewayConnection(
|
mDeps.newVcnGatewayConnection(
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_CONGESTED;
|
|||||||
import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_METERED;
|
import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_METERED;
|
||||||
import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_ROAMING;
|
import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_ROAMING;
|
||||||
import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_SUSPENDED;
|
import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_SUSPENDED;
|
||||||
|
import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_VCN_MANAGED;
|
||||||
import static android.net.NetworkCapabilities.TRANSPORT_CELLULAR;
|
import static android.net.NetworkCapabilities.TRANSPORT_CELLULAR;
|
||||||
import static android.net.NetworkCapabilities.TRANSPORT_WIFI;
|
import static android.net.NetworkCapabilities.TRANSPORT_WIFI;
|
||||||
import static android.net.vcn.VcnManager.VCN_ERROR_CODE_CONFIG_ERROR;
|
import static android.net.vcn.VcnManager.VCN_ERROR_CODE_CONFIG_ERROR;
|
||||||
@@ -59,6 +60,7 @@ import android.net.ipsec.ike.exceptions.AuthenticationFailedException;
|
|||||||
import android.net.ipsec.ike.exceptions.IkeException;
|
import android.net.ipsec.ike.exceptions.IkeException;
|
||||||
import android.net.ipsec.ike.exceptions.IkeInternalException;
|
import android.net.ipsec.ike.exceptions.IkeInternalException;
|
||||||
import android.net.ipsec.ike.exceptions.IkeProtocolException;
|
import android.net.ipsec.ike.exceptions.IkeProtocolException;
|
||||||
|
import android.net.vcn.VcnControlPlaneIkeConfig;
|
||||||
import android.net.vcn.VcnGatewayConnectionConfig;
|
import android.net.vcn.VcnGatewayConnectionConfig;
|
||||||
import android.net.vcn.VcnTransportInfo;
|
import android.net.vcn.VcnTransportInfo;
|
||||||
import android.net.wifi.WifiInfo;
|
import android.net.wifi.WifiInfo;
|
||||||
@@ -1348,7 +1350,7 @@ public class VcnGatewayConnection extends StateMachine {
|
|||||||
mIkeSession = null;
|
mIkeSession = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
mIkeSession = buildIkeSession();
|
mIkeSession = buildIkeSession(mUnderlying.network);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -1726,6 +1728,7 @@ public class VcnGatewayConnection extends StateMachine {
|
|||||||
final NetworkCapabilities.Builder builder = new NetworkCapabilities.Builder();
|
final NetworkCapabilities.Builder builder = new NetworkCapabilities.Builder();
|
||||||
|
|
||||||
builder.addTransportType(TRANSPORT_CELLULAR);
|
builder.addTransportType(TRANSPORT_CELLULAR);
|
||||||
|
builder.addCapability(NET_CAPABILITY_NOT_VCN_MANAGED);
|
||||||
builder.addCapability(NET_CAPABILITY_NOT_CONGESTED);
|
builder.addCapability(NET_CAPABILITY_NOT_CONGESTED);
|
||||||
builder.addCapability(NET_CAPABILITY_NOT_SUSPENDED);
|
builder.addCapability(NET_CAPABILITY_NOT_SUSPENDED);
|
||||||
|
|
||||||
@@ -1939,23 +1942,29 @@ public class VcnGatewayConnection extends StateMachine {
|
|||||||
new EventDisconnectRequestedInfo(reason, shouldQuit));
|
new EventDisconnectRequestedInfo(reason, shouldQuit));
|
||||||
}
|
}
|
||||||
|
|
||||||
private IkeSessionParams buildIkeParams() {
|
private IkeSessionParams buildIkeParams(@NonNull Network network) {
|
||||||
// TODO: Implement this once IkeSessionParams is persisted
|
final VcnControlPlaneIkeConfig controlPlaneConfig =
|
||||||
return null;
|
(VcnControlPlaneIkeConfig) mConnectionConfig.getControlPlaneConfig();
|
||||||
|
final IkeSessionParams.Builder builder =
|
||||||
|
new IkeSessionParams.Builder(controlPlaneConfig.getIkeSessionParams());
|
||||||
|
builder.setConfiguredNetwork(network);
|
||||||
|
|
||||||
|
return builder.build();
|
||||||
}
|
}
|
||||||
|
|
||||||
private ChildSessionParams buildChildParams() {
|
private ChildSessionParams buildChildParams() {
|
||||||
// TODO: Implement this once IkeSessionParams is persisted
|
final VcnControlPlaneIkeConfig controlPlaneConfig =
|
||||||
return null;
|
(VcnControlPlaneIkeConfig) mConnectionConfig.getControlPlaneConfig();
|
||||||
|
return controlPlaneConfig.getChildSessionParams();
|
||||||
}
|
}
|
||||||
|
|
||||||
@VisibleForTesting(visibility = Visibility.PRIVATE)
|
@VisibleForTesting(visibility = Visibility.PRIVATE)
|
||||||
VcnIkeSession buildIkeSession() {
|
VcnIkeSession buildIkeSession(@NonNull Network network) {
|
||||||
final int token = ++mCurrentToken;
|
final int token = ++mCurrentToken;
|
||||||
|
|
||||||
return mDeps.newIkeSession(
|
return mDeps.newIkeSession(
|
||||||
mVcnContext,
|
mVcnContext,
|
||||||
buildIkeParams(),
|
buildIkeParams(network),
|
||||||
buildChildParams(),
|
buildChildParams(),
|
||||||
new IkeSessionCallbackImpl(token),
|
new IkeSessionCallbackImpl(token),
|
||||||
new VcnChildSessionCallback(token));
|
new VcnChildSessionCallback(token));
|
||||||
|
|||||||
@@ -194,29 +194,35 @@ public class UnderlyingNetworkTrackerTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private NetworkRequest getWifiRequest() {
|
private NetworkRequest getWifiRequest() {
|
||||||
return getExpectedRequestBase()
|
return getExpectedRequestBase(true)
|
||||||
.addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
|
.addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
|
||||||
.build();
|
.build();
|
||||||
}
|
}
|
||||||
|
|
||||||
private NetworkRequest getCellRequestForSubId(int subId) {
|
private NetworkRequest getCellRequestForSubId(int subId) {
|
||||||
return getExpectedRequestBase()
|
return getExpectedRequestBase(false)
|
||||||
.addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR)
|
.addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR)
|
||||||
.setNetworkSpecifier(new TelephonyNetworkSpecifier(subId))
|
.setNetworkSpecifier(new TelephonyNetworkSpecifier(subId))
|
||||||
.build();
|
.build();
|
||||||
}
|
}
|
||||||
|
|
||||||
private NetworkRequest getRouteSelectionRequest() {
|
private NetworkRequest getRouteSelectionRequest() {
|
||||||
return getExpectedRequestBase().build();
|
return getExpectedRequestBase(true).build();
|
||||||
}
|
}
|
||||||
|
|
||||||
private NetworkRequest.Builder getExpectedRequestBase() {
|
private NetworkRequest.Builder getExpectedRequestBase(boolean requireVcnManaged) {
|
||||||
return new NetworkRequest.Builder()
|
final NetworkRequest.Builder builder =
|
||||||
.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
|
new NetworkRequest.Builder()
|
||||||
.removeCapability(NetworkCapabilities.NET_CAPABILITY_TRUSTED)
|
.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
|
||||||
.removeCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED)
|
.removeCapability(NetworkCapabilities.NET_CAPABILITY_TRUSTED)
|
||||||
.removeCapability(NetworkCapabilities.NET_CAPABILITY_NOT_VCN_MANAGED)
|
.removeCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED)
|
||||||
.addUnwantedCapability(NetworkCapabilities.NET_CAPABILITY_NOT_VCN_MANAGED);
|
.removeCapability(NetworkCapabilities.NET_CAPABILITY_NOT_VCN_MANAGED);
|
||||||
|
|
||||||
|
if (requireVcnManaged) {
|
||||||
|
builder.addUnwantedCapability(NetworkCapabilities.NET_CAPABILITY_NOT_VCN_MANAGED);
|
||||||
|
}
|
||||||
|
|
||||||
|
return builder;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|||||||
@@ -73,7 +73,7 @@ public class VcnGatewayConnectionConnectedStateTest extends VcnGatewayConnection
|
|||||||
|
|
||||||
mGatewayConnection.setUnderlyingNetwork(TEST_UNDERLYING_NETWORK_RECORD_1);
|
mGatewayConnection.setUnderlyingNetwork(TEST_UNDERLYING_NETWORK_RECORD_1);
|
||||||
|
|
||||||
mIkeSession = mGatewayConnection.buildIkeSession();
|
mIkeSession = mGatewayConnection.buildIkeSession(TEST_UNDERLYING_NETWORK_RECORD_1.network);
|
||||||
mGatewayConnection.setIkeSession(mIkeSession);
|
mGatewayConnection.setIkeSession(mIkeSession);
|
||||||
|
|
||||||
mGatewayConnection.transitionTo(mGatewayConnection.mConnectedState);
|
mGatewayConnection.transitionTo(mGatewayConnection.mConnectedState);
|
||||||
|
|||||||
@@ -25,12 +25,15 @@ import static org.mockito.Matchers.any;
|
|||||||
import static org.mockito.Mockito.never;
|
import static org.mockito.Mockito.never;
|
||||||
import static org.mockito.Mockito.verify;
|
import static org.mockito.Mockito.verify;
|
||||||
|
|
||||||
|
import android.net.ipsec.ike.IkeSessionParams;
|
||||||
|
|
||||||
import androidx.test.filters.SmallTest;
|
import androidx.test.filters.SmallTest;
|
||||||
import androidx.test.runner.AndroidJUnit4;
|
import androidx.test.runner.AndroidJUnit4;
|
||||||
|
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
||||||
|
import org.mockito.ArgumentCaptor;
|
||||||
|
|
||||||
/** Tests for VcnGatewayConnection.ConnectingState */
|
/** Tests for VcnGatewayConnection.ConnectingState */
|
||||||
@RunWith(AndroidJUnit4.class)
|
@RunWith(AndroidJUnit4.class)
|
||||||
@@ -51,7 +54,12 @@ public class VcnGatewayConnectionConnectingStateTest extends VcnGatewayConnectio
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testEnterStateCreatesNewIkeSession() throws Exception {
|
public void testEnterStateCreatesNewIkeSession() throws Exception {
|
||||||
verify(mDeps).newIkeSession(any(), any(), any(), any(), any());
|
final ArgumentCaptor<IkeSessionParams> paramsCaptor =
|
||||||
|
ArgumentCaptor.forClass(IkeSessionParams.class);
|
||||||
|
verify(mDeps).newIkeSession(any(), paramsCaptor.capture(), any(), any(), any());
|
||||||
|
assertEquals(
|
||||||
|
TEST_UNDERLYING_NETWORK_RECORD_1.network,
|
||||||
|
paramsCaptor.getValue().getConfiguredNetwork());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|||||||
@@ -38,7 +38,8 @@ public class VcnGatewayConnectionDisconnectingStateTest extends VcnGatewayConnec
|
|||||||
public void setUp() throws Exception {
|
public void setUp() throws Exception {
|
||||||
super.setUp();
|
super.setUp();
|
||||||
|
|
||||||
mGatewayConnection.setIkeSession(mGatewayConnection.buildIkeSession());
|
mGatewayConnection.setIkeSession(
|
||||||
|
mGatewayConnection.buildIkeSession(TEST_UNDERLYING_NETWORK_RECORD_2.network));
|
||||||
|
|
||||||
// ensure that mGatewayConnection has an underlying Network before entering
|
// ensure that mGatewayConnection has an underlying Network before entering
|
||||||
// DisconnectingState
|
// DisconnectingState
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ package com.android.server.vcn;
|
|||||||
|
|
||||||
import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_METERED;
|
import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_METERED;
|
||||||
import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_ROAMING;
|
import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_ROAMING;
|
||||||
|
import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_VCN_MANAGED;
|
||||||
import static android.net.NetworkCapabilities.TRANSPORT_CELLULAR;
|
import static android.net.NetworkCapabilities.TRANSPORT_CELLULAR;
|
||||||
import static android.net.NetworkCapabilities.TRANSPORT_WIFI;
|
import static android.net.NetworkCapabilities.TRANSPORT_WIFI;
|
||||||
|
|
||||||
@@ -87,6 +88,7 @@ public class VcnGatewayConnectionTest extends VcnGatewayConnectionTestBase {
|
|||||||
private void verifyBuildNetworkCapabilitiesCommon(int transportType) {
|
private void verifyBuildNetworkCapabilitiesCommon(int transportType) {
|
||||||
final NetworkCapabilities underlyingCaps = new NetworkCapabilities();
|
final NetworkCapabilities underlyingCaps = new NetworkCapabilities();
|
||||||
underlyingCaps.addTransportType(transportType);
|
underlyingCaps.addTransportType(transportType);
|
||||||
|
underlyingCaps.addCapability(NET_CAPABILITY_NOT_VCN_MANAGED);
|
||||||
underlyingCaps.addCapability(NET_CAPABILITY_NOT_METERED);
|
underlyingCaps.addCapability(NET_CAPABILITY_NOT_METERED);
|
||||||
underlyingCaps.addCapability(NET_CAPABILITY_NOT_ROAMING);
|
underlyingCaps.addCapability(NET_CAPABILITY_NOT_ROAMING);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user