summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYan Yan <evitayan@google.com>2024-03-20 22:27:08 +0000
committerYan Yan <evitayan@google.com>2024-03-22 01:51:32 +0000
commit3402e84c50d38a50daff762f72abc36387651b6f (patch)
tree9a4706bee695ffe06c243a781f90714bb75b7e58
parent356e0e163a2a9f59288ae7b225ebe91addb33111 (diff)
downloadbase-3402e84c50d38a50daff762f72abc36387651b6f.tar.gz
Re-evaluate IPsec packet loss on LP/NC change
Bug: 323238888 Test: atest FrameworksVcnTests(new tests) Change-Id: I83f2da42fe0ffed5d4403429e968510c7eeabec1
-rw-r--r--services/core/java/com/android/server/vcn/routeselection/IpSecPacketLossDetector.java12
-rw-r--r--services/core/java/com/android/server/vcn/routeselection/NetworkMetricMonitor.java5
-rw-r--r--services/core/java/com/android/server/vcn/routeselection/UnderlyingNetworkEvaluator.java13
-rw-r--r--tests/vcn/java/com/android/server/vcn/routeselection/IpSecPacketLossDetectorTest.java28
-rw-r--r--tests/vcn/java/com/android/server/vcn/routeselection/NetworkEvaluationTestBase.java1
-rw-r--r--tests/vcn/java/com/android/server/vcn/routeselection/UnderlyingNetworkEvaluatorTest.java33
6 files changed, 92 insertions, 0 deletions
diff --git a/services/core/java/com/android/server/vcn/routeselection/IpSecPacketLossDetector.java b/services/core/java/com/android/server/vcn/routeselection/IpSecPacketLossDetector.java
index f3d7dd19ecc2..ed9fa65dee15 100644
--- a/services/core/java/com/android/server/vcn/routeselection/IpSecPacketLossDetector.java
+++ b/services/core/java/com/android/server/vcn/routeselection/IpSecPacketLossDetector.java
@@ -210,6 +210,18 @@ public class IpSecPacketLossDetector extends NetworkMetricMonitor {
}
@Override
+ public void onLinkPropertiesOrCapabilitiesChanged() {
+ if (!isStarted()) return;
+
+ reschedulePolling();
+ }
+
+ private void reschedulePolling() {
+ mHandler.removeCallbacksAndEqualMessages(mCancellationToken);
+ mHandler.postDelayed(new PollIpSecStateRunnable(), mCancellationToken, 0L);
+ }
+
+ @Override
protected void start() {
super.start();
clearTransformStateAndPollingEvents();
diff --git a/services/core/java/com/android/server/vcn/routeselection/NetworkMetricMonitor.java b/services/core/java/com/android/server/vcn/routeselection/NetworkMetricMonitor.java
index 4bacf3b8abe5..a1b212f8d3d7 100644
--- a/services/core/java/com/android/server/vcn/routeselection/NetworkMetricMonitor.java
+++ b/services/core/java/com/android/server/vcn/routeselection/NetworkMetricMonitor.java
@@ -186,6 +186,11 @@ public abstract class NetworkMetricMonitor implements AutoCloseable {
// Subclasses MUST override it if they care
}
+ /** Called when LinkProperties or NetworkCapabilities have changed */
+ public void onLinkPropertiesOrCapabilitiesChanged() {
+ // Subclasses MUST override it if they care
+ }
+
public boolean isValidationFailed() {
return mIsValidationFailed;
}
diff --git a/services/core/java/com/android/server/vcn/routeselection/UnderlyingNetworkEvaluator.java b/services/core/java/com/android/server/vcn/routeselection/UnderlyingNetworkEvaluator.java
index 2f4cf5e5d8c7..78e06d46c74c 100644
--- a/services/core/java/com/android/server/vcn/routeselection/UnderlyingNetworkEvaluator.java
+++ b/services/core/java/com/android/server/vcn/routeselection/UnderlyingNetworkEvaluator.java
@@ -25,6 +25,7 @@ import android.net.IpSecTransform;
import android.net.LinkProperties;
import android.net.Network;
import android.net.NetworkCapabilities;
+import android.net.vcn.Flags;
import android.net.vcn.VcnManager;
import android.net.vcn.VcnUnderlyingNetworkTemplate;
import android.os.Handler;
@@ -295,6 +296,12 @@ public class UnderlyingNetworkEvaluator {
updatePriorityClass(
underlyingNetworkTemplates, subscriptionGroup, lastSnapshot, carrierConfig);
+
+ if (Flags.evaluateIpsecLossOnLpNcChange()) {
+ for (NetworkMetricMonitor monitor : mMetricMonitors) {
+ monitor.onLinkPropertiesOrCapabilitiesChanged();
+ }
+ }
}
/** Set the LinkProperties */
@@ -308,6 +315,12 @@ public class UnderlyingNetworkEvaluator {
updatePriorityClass(
underlyingNetworkTemplates, subscriptionGroup, lastSnapshot, carrierConfig);
+
+ if (Flags.evaluateIpsecLossOnLpNcChange()) {
+ for (NetworkMetricMonitor monitor : mMetricMonitors) {
+ monitor.onLinkPropertiesOrCapabilitiesChanged();
+ }
+ }
}
/** Set whether the network is blocked */
diff --git a/tests/vcn/java/com/android/server/vcn/routeselection/IpSecPacketLossDetectorTest.java b/tests/vcn/java/com/android/server/vcn/routeselection/IpSecPacketLossDetectorTest.java
index 5107943c3528..fdf8fb8d3c41 100644
--- a/tests/vcn/java/com/android/server/vcn/routeselection/IpSecPacketLossDetectorTest.java
+++ b/tests/vcn/java/com/android/server/vcn/routeselection/IpSecPacketLossDetectorTest.java
@@ -34,6 +34,7 @@ import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.reset;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@@ -417,4 +418,31 @@ public class IpSecPacketLossDetectorTest extends NetworkEvaluationTestBase {
checkGetPacketLossRate(oldState, 20000, 14000, 4096, 19);
checkGetPacketLossRate(oldState, 20000, 14000, 3000, 10);
}
+
+ // Verify the polling event is scheduled with expected delays
+ private void verifyPollEventDelayAndScheduleNext(long expectedDelayMs) {
+ if (expectedDelayMs > 0) {
+ mTestLooper.dispatchAll();
+ verify(mIpSecTransform, never()).requestIpSecTransformState(any(), any());
+ mTestLooper.moveTimeForward(expectedDelayMs);
+ }
+
+ mTestLooper.dispatchAll();
+ verify(mIpSecTransform).requestIpSecTransformState(any(), any());
+ reset(mIpSecTransform);
+ }
+
+ @Test
+ public void testOnLinkPropertiesOrCapabilitiesChange() throws Exception {
+ // Start the monitor; verify the 1st poll is scheduled without delay
+ startMonitorAndCaptureStateReceiver();
+ verifyPollEventDelayAndScheduleNext(0 /* expectedDelayMs */);
+
+ // Verify the 2nd poll is rescheduled without delay
+ mIpSecPacketLossDetector.onLinkPropertiesOrCapabilitiesChanged();
+ verifyPollEventDelayAndScheduleNext(0 /* expectedDelayMs */);
+
+ // Verify the 3rd poll is scheduled with configured delay
+ verifyPollEventDelayAndScheduleNext(POLL_IPSEC_STATE_INTERVAL_MS);
+ }
}
diff --git a/tests/vcn/java/com/android/server/vcn/routeselection/NetworkEvaluationTestBase.java b/tests/vcn/java/com/android/server/vcn/routeselection/NetworkEvaluationTestBase.java
index 444208edc473..af6daa17e223 100644
--- a/tests/vcn/java/com/android/server/vcn/routeselection/NetworkEvaluationTestBase.java
+++ b/tests/vcn/java/com/android/server/vcn/routeselection/NetworkEvaluationTestBase.java
@@ -122,6 +122,7 @@ public abstract class NetworkEvaluationTestBase {
MockitoAnnotations.initMocks(this);
mSetFlagsRule.enableFlags(Flags.FLAG_VALIDATE_NETWORK_ON_IPSEC_LOSS);
+ mSetFlagsRule.enableFlags(Flags.FLAG_EVALUATE_IPSEC_LOSS_ON_LP_NC_CHANGE);
when(mNetwork.getNetId()).thenReturn(-1);
diff --git a/tests/vcn/java/com/android/server/vcn/routeselection/UnderlyingNetworkEvaluatorTest.java b/tests/vcn/java/com/android/server/vcn/routeselection/UnderlyingNetworkEvaluatorTest.java
index aa81efe9a1ce..1d6872195e81 100644
--- a/tests/vcn/java/com/android/server/vcn/routeselection/UnderlyingNetworkEvaluatorTest.java
+++ b/tests/vcn/java/com/android/server/vcn/routeselection/UnderlyingNetworkEvaluatorTest.java
@@ -31,6 +31,7 @@ import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyObject;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.reset;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@@ -333,4 +334,36 @@ public class UnderlyingNetworkEvaluatorTest extends NetworkEvaluationTestBase {
.compare(penalized, notPenalized);
assertEquals(1, result);
}
+
+ @Test
+ public void testNotifyNetworkMetricMonitorOnLpChange() throws Exception {
+ // Clear calls invoked when initializing mNetworkEvaluator
+ reset(mIpSecPacketLossDetector);
+
+ final UnderlyingNetworkEvaluator evaluator = newUnderlyingNetworkEvaluator();
+ evaluator.setNetworkCapabilities(
+ CELL_NETWORK_CAPABILITIES,
+ VcnGatewayConnectionConfig.DEFAULT_UNDERLYING_NETWORK_TEMPLATES,
+ SUB_GROUP,
+ mSubscriptionSnapshot,
+ mCarrierConfig);
+
+ verify(mIpSecPacketLossDetector).onLinkPropertiesOrCapabilitiesChanged();
+ }
+
+ @Test
+ public void testNotifyNetworkMetricMonitorOnNcChange() throws Exception {
+ // Clear calls invoked when initializing mNetworkEvaluator
+ reset(mIpSecPacketLossDetector);
+
+ final UnderlyingNetworkEvaluator evaluator = newUnderlyingNetworkEvaluator();
+ evaluator.setLinkProperties(
+ LINK_PROPERTIES,
+ VcnGatewayConnectionConfig.DEFAULT_UNDERLYING_NETWORK_TEMPLATES,
+ SUB_GROUP,
+ mSubscriptionSnapshot,
+ mCarrierConfig);
+
+ verify(mIpSecPacketLossDetector).onLinkPropertiesOrCapabilitiesChanged();
+ }
}