From 6f2924549560b506168122a402322e09d218aa14 Mon Sep 17 00:00:00 2001
From: Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>
Date: Sat, 8 Aug 2020 15:47:08 +0900
Subject: [PATCH] Make rtb_reclaim_frame return the number of frames that are
 reclaimed

---
 lib/ngtcp2_rtb.c | 39 +++++++++++++++++++++------------------
 1 file changed, 21 insertions(+), 18 deletions(-)

diff --git a/lib/ngtcp2_rtb.c b/lib/ngtcp2_rtb.c
index 326495e0..05a16a2f 100644
--- a/lib/ngtcp2_rtb.c
+++ b/lib/ngtcp2_rtb.c
@@ -293,17 +293,21 @@ static void rtb_on_remove(ngtcp2_rtb *rtb, ngtcp2_rtb_entry *ent,
   }
 }
 
-static int rtb_reclaim_frame(ngtcp2_rtb *rtb, int *preclaimed,
-                             ngtcp2_conn *conn, ngtcp2_pktns *pktns,
-                             ngtcp2_rtb_entry *ent) {
+/*
+ * rtb_reclaim_frame queues unacknowledged frames included in |ent|
+ * for retransmission.  The re-queued frames are not deleted from
+ * |ent|.  It returns the number of frames queued.
+ */
+static ngtcp2_ssize rtb_reclaim_frame(ngtcp2_rtb *rtb, ngtcp2_conn *conn,
+                                      ngtcp2_pktns *pktns,
+                                      ngtcp2_rtb_entry *ent) {
   ngtcp2_frame_chain *frc, *nfrc, **pfrc = &pktns->tx.frq;
   ngtcp2_frame *fr;
   ngtcp2_strm *strm;
   ngtcp2_range gap, range;
+  size_t num_reclaimed = 0;
   int rv;
 
-  *preclaimed = 0;
-
   /* PADDING only (or PADDING + ACK ) packets will have NULL
      ent->frc. */
   /* TODO Reconsider the order of pfrc */
@@ -355,7 +359,7 @@ static int rtb_reclaim_frame(ngtcp2_rtb *rtb, int *preclaimed,
         }
       }
 
-      *preclaimed = 1;
+      ++num_reclaimed;
 
       continue;
     case NGTCP2_FRAME_CRYPTO:
@@ -389,7 +393,7 @@ static int rtb_reclaim_frame(ngtcp2_rtb *rtb, int *preclaimed,
         return rv;
       }
 
-      *preclaimed = 1;
+      ++num_reclaimed;
 
       continue;
     case NGTCP2_FRAME_NEW_TOKEN:
@@ -421,21 +425,21 @@ static int rtb_reclaim_frame(ngtcp2_rtb *rtb, int *preclaimed,
       break;
     }
 
-    *preclaimed = 1;
+    ++num_reclaimed;
 
     nfrc->next = *pfrc;
     *pfrc = nfrc;
     pfrc = &nfrc->next;
   }
 
-  return 0;
+  return (ngtcp2_ssize)num_reclaimed;
 }
 
 static int rtb_on_pkt_lost(ngtcp2_rtb *rtb, ngtcp2_ksl_it *it,
                            ngtcp2_rtb_entry *ent, ngtcp2_conn *conn,
                            ngtcp2_pktns *pktns, ngtcp2_tstamp ts) {
   int rv;
-  int reclaimed;
+  ngtcp2_ssize reclaimed;
 
   ngtcp2_log_pkt_lost(rtb->log, ent->hd.pkt_num, ent->hd.type, ent->hd.flags,
                       ent->ts);
@@ -466,9 +470,9 @@ static int rtb_on_pkt_lost(ngtcp2_rtb *rtb, ngtcp2_ksl_it *it,
       assert(!(ent->flags & NGTCP2_RTB_FLAG_LOST_RETRANSMITTED));
       assert(UINT64_MAX == ent->lost_ts);
 
-      rv = rtb_reclaim_frame(rtb, &reclaimed, conn, pktns, ent);
-      if (rv != 0) {
-        return rv;
+      reclaimed = rtb_reclaim_frame(rtb, conn, pktns, ent);
+      if (reclaimed < 0) {
+        return (int)reclaimed;
       }
 
       if (reclaimed) {
@@ -1114,8 +1118,7 @@ ngtcp2_ssize ngtcp2_rtb_reclaim_on_pto(ngtcp2_rtb *rtb, ngtcp2_conn *conn,
                                        ngtcp2_pktns *pktns, size_t num_pkts) {
   ngtcp2_ksl_it it;
   ngtcp2_rtb_entry *ent;
-  int rv;
-  int reclaimed;
+  ngtcp2_ssize reclaimed;
   size_t atmost = num_pkts;
 
   it = ngtcp2_ksl_end(&rtb->ents);
@@ -1131,9 +1134,9 @@ ngtcp2_ssize ngtcp2_rtb_reclaim_on_pto(ngtcp2_rtb *rtb, ngtcp2_conn *conn,
 
     assert(ent->frc);
 
-    rv = rtb_reclaim_frame(rtb, &reclaimed, conn, pktns, ent);
-    if (rv != 0) {
-      return rv;
+    reclaimed = rtb_reclaim_frame(rtb, conn, pktns, ent);
+    if (reclaimed < 0) {
+      return reclaimed;
     }
 
     /* Mark reclaimed even if reclaimed == 0 so that we can skip it in
-- 
GitLab