Add field trial to reset BWE if Network adapter changes instead of if IP address changes

Bug: webrtc:14928, webrtc:42225231
Change-Id: I7c3d8d87cb2d0fe8dad5794c6247876c17c73f74
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/350561
Reviewed-by: Jonas Oreland <jonaso@webrtc.org>
Commit-Queue: Per Kjellander <perkj@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#42324}
diff --git a/call/rtp_transport_controller_send.cc b/call/rtp_transport_controller_send.cc
index 0104d3d..f667417 100644
--- a/call/rtp_transport_controller_send.cc
+++ b/call/rtp_transport_controller_send.cc
@@ -95,6 +95,8 @@
           !env_.field_trials().IsEnabled("WebRTC-Bwe-NoFeedbackReset")),
       add_pacing_to_cwin_(env_.field_trials().IsEnabled(
           "WebRTC-AddPacingToCongestionWindowPushback")),
+      reset_bwe_on_adapter_id_change_(
+          env_.field_trials().IsEnabled("WebRTC-Bwe-ResetOnAdapterIdChange")),
       relay_bandwidth_cap_("relay_cap", DataRate::PlusInfinity()),
       transport_overhead_bytes_per_packet_(0),
       network_available_(false),
@@ -295,18 +297,23 @@
 bool RtpTransportControllerSend::IsRelevantRouteChange(
     const rtc::NetworkRoute& old_route,
     const rtc::NetworkRoute& new_route) const {
-  // TODO(bugs.webrtc.org/11438): Experiment with using more information/
-  // other conditions.
   bool connected_changed = old_route.connected != new_route.connected;
-  bool route_ids_changed =
-      old_route.local.network_id() != new_route.local.network_id() ||
-      old_route.remote.network_id() != new_route.remote.network_id();
-  if (relay_bandwidth_cap_->IsFinite()) {
-    bool relaying_changed = IsRelayed(old_route) != IsRelayed(new_route);
-    return connected_changed || route_ids_changed || relaying_changed;
+  bool route_ids_changed = false;
+  bool relaying_changed = false;
+
+  if (reset_bwe_on_adapter_id_change_) {
+    route_ids_changed =
+        old_route.local.adapter_id() != new_route.local.adapter_id() ||
+        old_route.remote.adapter_id() != new_route.remote.adapter_id();
   } else {
-    return connected_changed || route_ids_changed;
+    route_ids_changed =
+        old_route.local.network_id() != new_route.local.network_id() ||
+        old_route.remote.network_id() != new_route.remote.network_id();
   }
+  if (relay_bandwidth_cap_->IsFinite()) {
+    relaying_changed = IsRelayed(old_route) != IsRelayed(new_route);
+  }
+  return connected_changed || route_ids_changed || relaying_changed;
 }
 
 void RtpTransportControllerSend::OnNetworkRouteChanged(
diff --git a/call/rtp_transport_controller_send.h b/call/rtp_transport_controller_send.h
index 68f14b4..eada78e 100644
--- a/call/rtp_transport_controller_send.h
+++ b/call/rtp_transport_controller_send.h
@@ -152,6 +152,7 @@
   SequenceChecker sequence_checker_;
   TaskQueueBase* task_queue_;
   PacketRouter packet_router_;
+
   std::vector<std::unique_ptr<RtpVideoSenderInterface>> video_rtp_senders_
       RTC_GUARDED_BY(&sequence_checker_);
   RtpBitrateConfigurator bitrate_configurator_;
@@ -193,6 +194,8 @@
 
   const bool reset_feedback_on_route_change_;
   const bool add_pacing_to_cwin_;
+  const bool reset_bwe_on_adapter_id_change_;
+
   FieldTrialParameter<DataRate> relay_bandwidth_cap_;
 
   size_t transport_overhead_bytes_per_packet_ RTC_GUARDED_BY(sequence_checker_);
diff --git a/experiments/field_trials.py b/experiments/field_trials.py
index e40af98..2c85ab3 100755
--- a/experiments/field_trials.py
+++ b/experiments/field_trials.py
@@ -62,6 +62,9 @@
     FieldTrial('WebRTC-Bwe-LimitPacingFactorByUpperLinkCapacityEstimate',
                42220543,
                date(2025, 1, 1)),
+    FieldTrial('WebRTC-Bwe-ResetOnAdapterIdChange',
+               42225231,
+               date(2025, 5, 30)),
     FieldTrial('WebRTC-DataChannelMessageInterleaving',
                41481008,
                date(2024, 10, 1)),