diff options
| author | 2024-03-22 18:08:07 +0000 | |
|---|---|---|
| committer | 2024-03-22 18:08:07 +0000 | |
| commit | 9a885d7439b4dff37f15e562fb1b15e959f76caf (patch) | |
| tree | 4040c5eb5a664150fe180328b3b8eb37bfbd3c19 | |
| parent | 5045c826571534f7b3b5f825356fad529c3c6e69 (diff) | |
| parent | 3402e84c50d38a50daff762f72abc36387651b6f (diff) | |
Merge "Re-evaluate IPsec packet loss on LP/NC change" into main
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(); +    }  } |