Read preferred IKE protocol from carrier config am: 4c195ab20e am: c294baaebb am: 591a5d4841

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

Change-Id: Icd916a03d76b6f83ac1b26d3f7a58b6cf2359028
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
chiachangwang
2023-03-20 04:33:05 +00:00
committed by Automerger Merge Worker

View File

@@ -31,6 +31,7 @@ import static android.net.ipsec.ike.IkeSessionParams.ESP_IP_VERSION_AUTO;
import static android.os.PowerWhitelistManager.REASON_VPN;
import static android.os.UserHandle.PER_USER_RANGE;
import static android.telephony.CarrierConfigManager.KEY_MIN_UDP_PORT_4500_NAT_TIMEOUT_SEC_INT;
import static android.telephony.CarrierConfigManager.KEY_PREFERRED_IKE_PROTOCOL_INT;
import static com.android.net.module.util.NetworkStackConstants.IPV6_MIN_MTU;
import static com.android.server.vcn.util.PersistableBundleUtils.STRING_DESERIALIZER;
@@ -269,6 +270,42 @@ public class Vpn {
@VisibleForTesting
static final int DEFAULT_UDP_PORT_4500_NAT_TIMEOUT_SEC_INT = 5 * 60;
/**
* Prefer using {@link IkeSessionParams.ESP_IP_VERSION_AUTO} and
* {@link IkeSessionParams.ESP_ENCAP_TYPE_AUTO} for ESP packets.
*
* This is one of the possible customization values for
* CarrierConfigManager.KEY_PREFERRED_IKE_PROTOCOL_INT.
*/
@VisibleForTesting
public static final int PREFERRED_IKE_PROTOCOL_AUTO = 0;
/**
* Prefer using {@link IkeSessionParams.ESP_IP_VERSION_IPV4} and
* {@link IkeSessionParams.ESP_ENCAP_TYPE_UDP} for ESP packets.
*
* This is one of the possible customization values for
* CarrierConfigManager.KEY_PREFERRED_IKE_PROTOCOL_INT.
*/
@VisibleForTesting
public static final int PREFERRED_IKE_PROTOCOL_IPV4_UDP = 40;
/**
* Prefer using {@link IkeSessionParams.ESP_IP_VERSION_IPV6} and
* {@link IkeSessionParams.ESP_ENCAP_TYPE_UDP} for ESP packets.
*
* Do not use this value for production code. Its numeric value will change in future versions.
*/
@VisibleForTesting
public static final int PREFERRED_IKE_PROTOCOL_IPV6_UDP = 60;
/**
* Prefer using {@link IkeSessionParams.ESP_IP_VERSION_IPV6} and
* {@link IkeSessionParams.ESP_ENCAP_TYPE_NONE} for ESP packets.
*
* This is one of the possible customization values for
* CarrierConfigManager.KEY_PREFERRED_IKE_PROTOCOL_INT.
*/
@VisibleForTesting
public static final int PREFERRED_IKE_PROTOCOL_IPV6_ESP = 61;
// TODO: create separate trackers for each unique VPN to support
// automated reconnection
@@ -326,12 +363,13 @@ public class Vpn {
private final LocalLog mVpnManagerEvents = new LocalLog(MAX_EVENTS_LOGS);
/**
* Cached Map of <subscription ID, keepalive delay ms> since retrieving the PersistableBundle
* Cached Map of <subscription ID, CarrierConfigInfo> since retrieving the PersistableBundle
* and the target value from CarrierConfigManager is somewhat expensive as it has hundreds of
* fields. This cache is cleared when the carrier config changes to ensure data freshness.
*/
@GuardedBy("this")
private final SparseArray<Integer> mCachedKeepalivePerSubId = new SparseArray<>();
private final SparseArray<CarrierConfigInfo> mCachedCarrierConfigInfoPerSubId =
new SparseArray<>();
/**
* Whether to keep the connection active after rebooting, or upgrading or reinstalling. This
@@ -378,6 +416,28 @@ public class Vpn {
void checkInterruptAndDelay(boolean sleepLonger) throws InterruptedException;
}
private static class CarrierConfigInfo {
public final String mccMnc;
public final int keepaliveDelayMs;
public final int encapType;
public final int ipVersion;
CarrierConfigInfo(String mccMnc, int keepaliveDelayMs,
int encapType,
int ipVersion) {
this.mccMnc = mccMnc;
this.keepaliveDelayMs = keepaliveDelayMs;
this.encapType = encapType;
this.ipVersion = ipVersion;
}
@Override
public String toString() {
return "CarrierConfigInfo(" + mccMnc + ") [keepaliveDelayMs=" + keepaliveDelayMs
+ ", encapType=" + encapType + ", ipVersion=" + ipVersion + "]";
}
}
@VisibleForTesting
public static class Dependencies {
public boolean isCallerSystem() {
@@ -2923,7 +2983,7 @@ public class Vpn {
public void onCarrierConfigChanged(int slotIndex, int subId, int carrierId,
int specificCarrierId) {
synchronized (Vpn.this) {
mCachedKeepalivePerSubId.remove(subId);
mCachedCarrierConfigInfoPerSubId.remove(subId);
// Ignore stale runner.
if (mVpnRunner != Vpn.IkeV2VpnRunner.this) return;
@@ -3388,47 +3448,105 @@ public class Vpn {
}
private int guessEspIpVersionForNetwork() {
// TODO : guess the IP version based on carrier if auto IP version selection is enabled
return ESP_IP_VERSION_AUTO;
final CarrierConfigInfo carrierconfig = getCarrierConfig();
final int ipVersion = (carrierconfig != null)
? carrierconfig.ipVersion : ESP_IP_VERSION_AUTO;
if (carrierconfig != null) {
Log.d(TAG, "Get customized IP version(" + ipVersion + ") on SIM("
+ carrierconfig.mccMnc + ")");
}
return ipVersion;
}
private int guessEspEncapTypeForNetwork() {
// TODO : guess the ESP encap type based on carrier if auto IP version selection is
// enabled
return ESP_ENCAP_TYPE_AUTO;
final CarrierConfigInfo carrierconfig = getCarrierConfig();
final int encapType = (carrierconfig != null)
? carrierconfig.encapType : ESP_ENCAP_TYPE_AUTO;
if (carrierconfig != null) {
Log.d(TAG, "Get customized encap type(" + encapType + ") on SIM("
+ carrierconfig.mccMnc + ")");
}
return encapType;
}
private int guessNattKeepaliveTimerForNetwork() {
final CarrierConfigInfo carrierconfig = getCarrierConfig();
final int natKeepalive = (carrierconfig != null)
? carrierconfig.keepaliveDelayMs : AUTOMATIC_KEEPALIVE_DELAY_SECONDS;
if (carrierconfig != null) {
Log.d(TAG, "Get customized keepalive(" + natKeepalive + ") on SIM("
+ carrierconfig.mccMnc + ")");
}
return natKeepalive;
}
private CarrierConfigInfo getCarrierConfig() {
final int subId = getCellSubIdForNetworkCapabilities(mUnderlyingNetworkCapabilities);
if (subId == SubscriptionManager.INVALID_SUBSCRIPTION_ID) {
Log.d(TAG, "Underlying network is not a cellular network");
return AUTOMATIC_KEEPALIVE_DELAY_SECONDS;
return null;
}
synchronized (Vpn.this) {
if (mCachedKeepalivePerSubId.contains(subId)) {
Log.d(TAG, "Get cached keepalive config");
return mCachedKeepalivePerSubId.get(subId);
if (mCachedCarrierConfigInfoPerSubId.contains(subId)) {
Log.d(TAG, "Get cached config");
return mCachedCarrierConfigInfoPerSubId.get(subId);
}
final TelephonyManager perSubTm = mTelephonyManager.createForSubscriptionId(subId);
if (perSubTm.getSimApplicationState() != TelephonyManager.SIM_STATE_LOADED) {
Log.d(TAG, "SIM card is not ready on sub " + subId);
return AUTOMATIC_KEEPALIVE_DELAY_SECONDS;
}
final PersistableBundle carrierConfig =
mCarrierConfigManager.getConfigForSubId(subId);
if (!CarrierConfigManager.isConfigForIdentifiedCarrier(carrierConfig)) {
return AUTOMATIC_KEEPALIVE_DELAY_SECONDS;
}
final int natKeepalive =
carrierConfig.getInt(KEY_MIN_UDP_PORT_4500_NAT_TIMEOUT_SEC_INT);
mCachedKeepalivePerSubId.put(subId, natKeepalive);
Log.d(TAG, "Get customized keepalive=" + natKeepalive);
return natKeepalive;
}
final TelephonyManager perSubTm = mTelephonyManager.createForSubscriptionId(subId);
if (perSubTm.getSimApplicationState() != TelephonyManager.SIM_STATE_LOADED) {
Log.d(TAG, "SIM card is not ready on sub " + subId);
return null;
}
final PersistableBundle carrierConfig =
mCarrierConfigManager.getConfigForSubId(subId);
if (!CarrierConfigManager.isConfigForIdentifiedCarrier(carrierConfig)) {
return null;
}
final int natKeepalive =
carrierConfig.getInt(KEY_MIN_UDP_PORT_4500_NAT_TIMEOUT_SEC_INT);
final int preferredIpPortocol =
carrierConfig.getInt(KEY_PREFERRED_IKE_PROTOCOL_INT);
final String mccMnc = perSubTm.getSimOperator(subId);
final CarrierConfigInfo info =
buildCarrierConfigInfo(mccMnc, natKeepalive, preferredIpPortocol);
synchronized (Vpn.this) {
mCachedCarrierConfigInfoPerSubId.put(subId, info);
}
return info;
}
private CarrierConfigInfo buildCarrierConfigInfo(String mccMnc,
int natKeepalive, int preferredIpPortocol) {
final int ipVersion;
final int encapType;
switch (preferredIpPortocol) {
case PREFERRED_IKE_PROTOCOL_AUTO:
ipVersion = IkeSessionParams.ESP_IP_VERSION_AUTO;
encapType = IkeSessionParams.ESP_ENCAP_TYPE_AUTO;
break;
case PREFERRED_IKE_PROTOCOL_IPV4_UDP:
ipVersion = IkeSessionParams.ESP_IP_VERSION_IPV4;
encapType = IkeSessionParams.ESP_ENCAP_TYPE_UDP;
break;
case PREFERRED_IKE_PROTOCOL_IPV6_UDP:
ipVersion = IkeSessionParams.ESP_IP_VERSION_IPV6;
encapType = IkeSessionParams.ESP_ENCAP_TYPE_UDP;
break;
case PREFERRED_IKE_PROTOCOL_IPV6_ESP:
ipVersion = IkeSessionParams.ESP_IP_VERSION_IPV6;
encapType = IkeSessionParams.ESP_ENCAP_TYPE_NONE;
break;
default:
ipVersion = IkeSessionParams.ESP_IP_VERSION_AUTO;
encapType = IkeSessionParams.ESP_ENCAP_TYPE_AUTO;
break;
}
return new CarrierConfigInfo(mccMnc, natKeepalive, encapType, ipVersion);
}
boolean maybeMigrateIkeSession(@NonNull Network underlyingNetwork) {
@@ -4884,7 +5002,7 @@ public class Vpn {
pw.println("Reset session scheduled");
}
}
pw.println("mCachedKeepalivePerSubId=" + mCachedKeepalivePerSubId);
pw.println("mCachedCarrierConfigInfoPerSubId=" + mCachedCarrierConfigInfoPerSubId);
pw.println("mUnderlyNetworkChanges (most recent first):");
pw.increaseIndent();