From 1d83c55ccde77139a173445270948e3b8ebb5d35 Mon Sep 17 00:00:00 2001
From: huitema <huitema@huitema.net>
Date: Mon, 17 Dec 2018 16:21:08 -0800
Subject: [PATCH] Count usage of remote cnxid before retiring.

---
 picoquic/picoquic_internal.h |  1 +
 picoquic/quicctx.c           | 23 ++++++++++++++++++++++-
 2 files changed, 23 insertions(+), 1 deletion(-)

diff --git a/picoquic/picoquic_internal.h b/picoquic/picoquic_internal.h
index 664a120e..c994ab53 100644
--- a/picoquic/picoquic_internal.h
+++ b/picoquic/picoquic_internal.h
@@ -755,6 +755,7 @@ void picoquic_register_path(picoquic_cnx_t* cnx, picoquic_path_t * path_x);
 void picoquic_delete_path(picoquic_cnx_t* cnx, int path_index);
 void picoquic_demote_path(picoquic_cnx_t* cnx, int path_index, uint64_t current_time);
 void picoquic_promote_path_to_default(picoquic_cnx_t* cnx, int path_index, uint64_t current_time);
+int picoquic_count_remote_connection_id_ref(picoquic_cnx_t* cnx, picoquic_connection_id_t * cid);
 void picoquic_delete_abandoned_paths(picoquic_cnx_t* cnx, uint64_t current_time, uint64_t * next_wake_time);
 
 /* Management of the CNX-ID stash */
diff --git a/picoquic/quicctx.c b/picoquic/quicctx.c
index 3bd56eb1..6e1ac741 100644
--- a/picoquic/quicctx.c
+++ b/picoquic/quicctx.c
@@ -860,6 +860,26 @@ void picoquic_delete_path(picoquic_cnx_t* cnx, int path_index)
     cnx->path[cnx->nb_paths] = NULL;
 }
 
+/*
+ * Connection ID may be used on more than one path.
+ * Provide a count of how many such values we see.
+ */
+
+int picoquic_count_remote_connection_id_ref(picoquic_cnx_t* cnx, picoquic_connection_id_t * cid)
+{
+    int count = 0;
+    int path_index_current = 0;
+
+    while (path_index_current < cnx->nb_paths) {
+        if (picoquic_compare_connection_id(cid, &cnx->path[path_index_current]->remote_cnxid) == 0) {
+            count++;
+        }
+        path_index_current++;
+    }
+
+    return count;
+}
+
 /*
  * Path challenges may be abandoned if they are tried too many times without success. 
  */
@@ -896,7 +916,8 @@ void picoquic_delete_abandoned_paths(picoquic_cnx_t* cnx, uint64_t current_time,
 
     while (cnx->nb_paths > path_index_good) {
         int d_path = cnx->nb_paths - 1;
-        if (!picoquic_is_connection_id_null(cnx->path[d_path]->remote_cnxid)) {
+        if (!picoquic_is_connection_id_null(cnx->path[d_path]->remote_cnxid) &&
+            picoquic_count_remote_connection_id_ref(cnx, &cnx->path[d_path]->remote_cnxid) == 1) {
             (void)picoquic_queue_retire_connection_id_frame(cnx, cnx->path[d_path]->remote_cnxid_sequence);
         }
         picoquic_delete_path(cnx, d_path);
-- 
GitLab