dcsctp: Fix incorrect merge conflict from last CL

A refactoring was lost after revision 3 of
https://webrtc-review.googlesource.com/c/src/+/377122
due to an incorrect merging/cherry-picking.

Reapplied it.

Bug: webrtc:396373001
Change-Id: Ice7a8e94ad984cb308eb9cab83df2e9ecca3d53c
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/377283
Commit-Queue: Victor Boivie <boivie@webrtc.org>
Reviewed-by: Harald Alvestrand <hta@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#43912}
diff --git a/net/dcsctp/tx/retransmission_queue.cc b/net/dcsctp/tx/retransmission_queue.cc
index d81c912..65b572e 100644
--- a/net/dcsctp/tx/retransmission_queue.cc
+++ b/net/dcsctp/tx/retransmission_queue.cc
@@ -456,12 +456,23 @@
   size_t old_unacked_packet_bytes = unacked_packet_bytes();
   size_t old_rwnd = rwnd_;
 
-  // Calculate the bandwidth budget (how many bytes that is
-  // allowed to be sent), and fill that up first with chunks that are
-  // scheduled to be retransmitted. If there is still budget, send new chunks
-  // (which will have their TSN assigned here.)
+  // Calculate the bandwidth budget (how many bytes that is allowed to be sent).
+  size_t max_packet_bytes_allowed_by_cwnd =
+      old_unacked_packet_bytes >= cwnd_ ? 0 : cwnd_ - old_unacked_packet_bytes;
+  size_t max_packet_bytes_allowed_by_rwnd =
+      RoundUpTo4(rwnd() + data_chunk_header_size_);
+
+  if (outstanding_data_.unacked_items() == 0) {
+    // https://datatracker.ietf.org/doc/html/rfc4960#section-6.1
+    // ... However, regardless of the value of rwnd (including if it is 0), the
+    // data sender can always have one DATA chunk in flight to the receiver if
+    // allowed by cwnd (see rule B, below).
+    max_packet_bytes_allowed_by_rwnd = options_.mtu;
+  }
   size_t max_bytes =
-      RoundDownTo4(std::min(max_bytes_to_send(), bytes_remaining_in_packet));
+      RoundDownTo4(std::min(std::min(max_packet_bytes_allowed_by_cwnd,
+                                     max_packet_bytes_allowed_by_rwnd),
+                            bytes_remaining_in_packet));
 
   to_be_sent = outstanding_data_.GetChunksToBeRetransmitted(max_bytes);
 
@@ -544,21 +555,6 @@
   return ret;
 }
 
-size_t RetransmissionQueue::max_bytes_to_send() const {
-  size_t left =
-      unacked_packet_bytes() >= cwnd_ ? 0 : cwnd_ - unacked_packet_bytes();
-
-  if (unacked_packet_bytes() == 0) {
-    // https://datatracker.ietf.org/doc/html/rfc4960#section-6.1
-    // ... However, regardless of the value of rwnd (including if it is 0), the
-    // data sender can always have one DATA chunk in flight to the receiver if
-    // allowed by cwnd (see rule B, below).
-    return left;
-  }
-
-  return std::min(rwnd(), left);
-}
-
 void RetransmissionQueue::PrepareResetStream(StreamID stream_id) {
   // TODO(boivie): These calls are now only affecting the send queue. The
   // packet buffer can also change behavior - for example draining the chunk
diff --git a/net/dcsctp/tx/retransmission_queue.h b/net/dcsctp/tx/retransmission_queue.h
index 69e0ba2..4d8766c 100644
--- a/net/dcsctp/tx/retransmission_queue.h
+++ b/net/dcsctp/tx/retransmission_queue.h
@@ -210,10 +210,6 @@
                : CongestionAlgorithmPhase::kCongestionAvoidance;
   }
 
-  // Returns the number of bytes that may be sent in a single packet according
-  // to the congestion control algorithm.
-  size_t max_bytes_to_send() const;
-
   DcSctpSocketCallbacks& callbacks_;
   const DcSctpOptions options_;
   // If the peer supports RFC3758 - SCTP Partial Reliability Extension.