From d978bdcffa2bf105ee58a7fa895f57fdcfaf3195 Mon Sep 17 00:00:00 2001 From: Yan Yan Date: Tue, 30 Apr 2024 15:39:47 +0000 Subject: [PATCH] Support disabling IPsec packet loss detector Allow disabling detector for better configurability Bug: 336638836 Test: atest FrameworksVcnTests(new tests) && atest CtsVcnTestCases Flag: android.net.vcn.allow_disable_ipsec_loss_detector Change-Id: Icd7183d12fb287399a500ea9c0ee4125c749275c --- Vcn/flags/flags.aconfig | 10 ++++ .../IpSecPacketLossDetector.java | 23 +++++++- .../IpSecPacketLossDetectorTest.java | 53 +++++++++++++++++++ .../NetworkEvaluationTestBase.java | 1 + 4 files changed, 86 insertions(+), 1 deletion(-) diff --git a/Vcn/flags/flags.aconfig b/Vcn/flags/flags.aconfig index 6fde398528..eca0e93729 100644 --- a/Vcn/flags/flags.aconfig +++ b/Vcn/flags/flags.aconfig @@ -44,4 +44,14 @@ flag{ metadata { purpose: PURPOSE_BUGFIX } +} + +flag{ + name: "allow_disable_ipsec_loss_detector" + namespace: "vcn" + description: "Allow disabling IPsec packet loss detector" + bug: "336638836" + metadata { + purpose: PURPOSE_BUGFIX + } } \ No newline at end of file diff --git a/Vcn/service-b/src/com/android/server/vcn/routeselection/IpSecPacketLossDetector.java b/Vcn/service-b/src/com/android/server/vcn/routeselection/IpSecPacketLossDetector.java index 3619253749..4742532236 100644 --- a/Vcn/service-b/src/com/android/server/vcn/routeselection/IpSecPacketLossDetector.java +++ b/Vcn/service-b/src/com/android/server/vcn/routeselection/IpSecPacketLossDetector.java @@ -115,6 +115,10 @@ public class IpSecPacketLossDetector extends NetworkMetricMonitor { // validation failure. private static final int IPSEC_PACKET_LOSS_PERCENT_THRESHOLD_DEFAULT = 12; + /** Carriers can disable the detector by setting the threshold to -1 */ + @VisibleForTesting(visibility = Visibility.PRIVATE) + static final int IPSEC_PACKET_LOSS_PERCENT_THRESHOLD_DISABLE_DETECTOR = -1; + private static final int POLL_IPSEC_STATE_INTERVAL_SECONDS_DEFAULT = 20; // By default, there's no maximum limit enforced @@ -271,7 +275,10 @@ public class IpSecPacketLossDetector extends NetworkMetricMonitor { // When multiple parallel inbound transforms are created, NetworkMetricMonitor will be // enabled on the last one as a sample mInboundTransform = inboundTransform; - start(); + + if (!Flags.allowDisableIpsecLossDetector() || canStart()) { + start(); + } } @Override @@ -284,6 +291,14 @@ public class IpSecPacketLossDetector extends NetworkMetricMonitor { mPacketLossRatePercentThreshold = getPacketLossRatePercentThreshold(carrierConfig); mMaxSeqNumIncreasePerSecond = getMaxSeqNumIncreasePerSecond(carrierConfig); } + + if (Flags.allowDisableIpsecLossDetector() && canStart() != isStarted()) { + if (canStart()) { + start(); + } else { + stop(); + } + } } @Override @@ -298,6 +313,12 @@ public class IpSecPacketLossDetector extends NetworkMetricMonitor { mHandler.postDelayed(new PollIpSecStateRunnable(), mCancellationToken, 0L); } + private boolean canStart() { + return mInboundTransform != null + && mPacketLossRatePercentThreshold + != IPSEC_PACKET_LOSS_PERCENT_THRESHOLD_DISABLE_DETECTOR; + } + @Override protected void start() { super.start(); diff --git a/Vcn/tests/unit/java/com/android/server/vcn/routeselection/IpSecPacketLossDetectorTest.java b/Vcn/tests/unit/java/com/android/server/vcn/routeselection/IpSecPacketLossDetectorTest.java index c8b60e5c33..441a4ae6d9 100644 --- a/Vcn/tests/unit/java/com/android/server/vcn/routeselection/IpSecPacketLossDetectorTest.java +++ b/Vcn/tests/unit/java/com/android/server/vcn/routeselection/IpSecPacketLossDetectorTest.java @@ -20,6 +20,7 @@ import static android.net.vcn.VcnManager.VCN_NETWORK_SELECTION_IPSEC_PACKET_LOSS import static android.net.vcn.VcnManager.VCN_NETWORK_SELECTION_MAX_SEQ_NUM_INCREASE_PER_SECOND_KEY; import static android.net.vcn.VcnManager.VCN_NETWORK_SELECTION_POLL_IPSEC_STATE_INTERVAL_SECONDS_KEY; +import static com.android.server.vcn.routeselection.IpSecPacketLossDetector.IPSEC_PACKET_LOSS_PERCENT_THRESHOLD_DISABLE_DETECTOR; import static com.android.server.vcn.routeselection.IpSecPacketLossDetector.MIN_VALID_EXPECTED_RX_PACKET_NUM; import static com.android.server.vcn.routeselection.IpSecPacketLossDetector.getMaxSeqNumIncreasePerSecond; import static com.android.server.vcn.util.PersistableBundleUtils.PersistableBundleWrapper; @@ -584,4 +585,56 @@ public class IpSecPacketLossDetectorTest extends NetworkEvaluationTestBase { MAX_SEQ_NUM_INCREASE_DEFAULT_DISABLED, getMaxSeqNumIncreasePerSecond(mCarrierConfig)); } + + private IpSecPacketLossDetector newDetectorAndSetTransform(int threshold) throws Exception { + when(mCarrierConfig.getInt( + eq(VCN_NETWORK_SELECTION_IPSEC_PACKET_LOSS_PERCENT_THRESHOLD_KEY), + anyInt())) + .thenReturn(threshold); + + final IpSecPacketLossDetector detector = + new IpSecPacketLossDetector( + mVcnContext, + mNetwork, + mCarrierConfig, + mMetricMonitorCallback, + mDependencies); + + detector.setIsSelectedUnderlyingNetwork(true /* setIsSelected */); + detector.setInboundTransformInternal(mIpSecTransform); + + return detector; + } + + @Test + public void testDisableAndEnableDetectorWithCarrierConfig() throws Exception { + final IpSecPacketLossDetector detector = + newDetectorAndSetTransform(IPSEC_PACKET_LOSS_PERCENT_THRESHOLD_DISABLE_DETECTOR); + + assertFalse(detector.isStarted()); + + when(mCarrierConfig.getInt( + eq(VCN_NETWORK_SELECTION_IPSEC_PACKET_LOSS_PERCENT_THRESHOLD_KEY), + anyInt())) + .thenReturn(IPSEC_PACKET_LOSS_PERCENT_THRESHOLD); + detector.setCarrierConfig(mCarrierConfig); + + assertTrue(detector.isStarted()); + } + + @Test + public void testEnableAndDisableDetectorWithCarrierConfig() throws Exception { + final IpSecPacketLossDetector detector = + newDetectorAndSetTransform(IPSEC_PACKET_LOSS_PERCENT_THRESHOLD); + + assertTrue(detector.isStarted()); + + when(mCarrierConfig.getInt( + eq(VCN_NETWORK_SELECTION_IPSEC_PACKET_LOSS_PERCENT_THRESHOLD_KEY), + anyInt())) + .thenReturn(IPSEC_PACKET_LOSS_PERCENT_THRESHOLD_DISABLE_DETECTOR); + detector.setCarrierConfig(mCarrierConfig); + + assertFalse(detector.isStarted()); + } } diff --git a/Vcn/tests/unit/java/com/android/server/vcn/routeselection/NetworkEvaluationTestBase.java b/Vcn/tests/unit/java/com/android/server/vcn/routeselection/NetworkEvaluationTestBase.java index edad67896e..0439d5f54e 100644 --- a/Vcn/tests/unit/java/com/android/server/vcn/routeselection/NetworkEvaluationTestBase.java +++ b/Vcn/tests/unit/java/com/android/server/vcn/routeselection/NetworkEvaluationTestBase.java @@ -123,6 +123,7 @@ public abstract class NetworkEvaluationTestBase { mSetFlagsRule.enableFlags(Flags.FLAG_VALIDATE_NETWORK_ON_IPSEC_LOSS); mSetFlagsRule.enableFlags(Flags.FLAG_EVALUATE_IPSEC_LOSS_ON_LP_NC_CHANGE); mSetFlagsRule.enableFlags(Flags.FLAG_HANDLE_SEQ_NUM_LEAP); + mSetFlagsRule.enableFlags(Flags.FLAG_ALLOW_DISABLE_IPSEC_LOSS_DETECTOR); when(mNetwork.getNetId()).thenReturn(-1);