From 45a66143277e66b685e1c32bd2241c373a51b29e Mon Sep 17 00:00:00 2001
From: Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>
Date: Sat, 8 Feb 2020 14:54:00 +0900
Subject: [PATCH] Move TP token and CID in paddr after handshake completion

Client doesn't read Short packet until handshake completes, so doing
these stuff in one place after handshake is much simpler.
---
 lib/ngtcp2_conn.c | 52 ++++++++++++++++++++---------------------------
 1 file changed, 22 insertions(+), 30 deletions(-)

diff --git a/lib/ngtcp2_conn.c b/lib/ngtcp2_conn.c
index 2ccdc8bd..22b57fa0 100644
--- a/lib/ngtcp2_conn.c
+++ b/lib/ngtcp2_conn.c
@@ -7294,6 +7294,8 @@ static ngtcp2_ssize conn_write_handshake(ngtcp2_conn *conn, uint8_t *dest,
   size_t server_hs_tx_left;
   ngtcp2_rcvry_stat *rcs = &conn->rcs;
   size_t pending_early_datalen;
+  ngtcp2_dcid *dcid;
+  ngtcp2_preferred_addr *paddr;
 
   cwnd = conn_cwnd_left(conn);
   destlen = ngtcp2_min(destlen, cwnd);
@@ -7386,6 +7388,26 @@ static ngtcp2_ssize conn_write_handshake(ngtcp2_conn *conn, uint8_t *dest,
 
     conn->state = NGTCP2_CS_POST_HANDSHAKE;
 
+    if (conn->remote.transport_params.preferred_address_present) {
+      assert(!ngtcp2_ringbuf_full(&conn->dcid.unused));
+
+      paddr = &conn->remote.transport_params.preferred_address;
+      dcid = ngtcp2_ringbuf_push_back(&conn->dcid.unused);
+      ngtcp2_dcid_init(dcid, 1, &paddr->cid, paddr->stateless_reset_token);
+    }
+
+    if (conn->remote.transport_params.stateless_reset_token_present) {
+      assert(conn->dcid.current.seq == 0);
+      memcpy(conn->dcid.current.token,
+             conn->remote.transport_params.stateless_reset_token,
+             sizeof(conn->dcid.current.token));
+    }
+
+    rv = conn_call_activate_dcid(conn, &conn->dcid.current);
+    if (rv != 0) {
+      return rv;
+    }
+
     conn_process_early_rtb(conn);
 
     rv = conn_process_buffered_protected_pkt(conn, &conn->pktns, ts);
@@ -7799,23 +7821,6 @@ int ngtcp2_conn_install_key(ngtcp2_conn *conn, const uint8_t *rx_secret,
   conn_sync_stream_id_limit(conn);
   conn->tx.max_offset = conn->remote.transport_params.initial_max_data;
 
-  if (!conn->server) {
-    /* For client, tell application that current DCID is active so
-      that we can easily process retire-prior-to in NCID from server
-      in 0.5 RTT packets. */
-    if (conn->remote.transport_params.stateless_reset_token_present &&
-        conn->dcid.current.seq == 0) {
-      memcpy(conn->dcid.current.token,
-             conn->remote.transport_params.stateless_reset_token,
-             sizeof(conn->dcid.current.token));
-    }
-
-    rv = conn_call_activate_dcid(conn, &conn->dcid.current);
-    if (rv != 0) {
-      return rv;
-    }
-  }
-
   return 0;
 }
 
@@ -7952,8 +7957,6 @@ conn_client_validate_transport_params(ngtcp2_conn *conn,
 int ngtcp2_conn_set_remote_transport_params(
     ngtcp2_conn *conn, const ngtcp2_transport_params *params) {
   int rv;
-  const ngtcp2_preferred_addr *paddr;
-  ngtcp2_dcid *dcid;
 
   assert(!(conn->flags & NGTCP2_CONN_FLAG_TRANSPORT_PARAM_RECVED));
 
@@ -7990,17 +7993,6 @@ int ngtcp2_conn_set_remote_transport_params(
 
   conn->flags |= NGTCP2_CONN_FLAG_TRANSPORT_PARAM_RECVED;
 
-  if (!conn->server && params->preferred_address_present) {
-    /* Although transport parameters are only effective after
-       handshake succeeds, we copy CID in prams->preferred_address to
-       conn->dcid.unused now in order to make the code simpler. */
-    assert(!ngtcp2_ringbuf_full(&conn->dcid.unused));
-
-    paddr = &params->preferred_address;
-    dcid = ngtcp2_ringbuf_push_back(&conn->dcid.unused);
-    ngtcp2_dcid_init(dcid, 1, &paddr->cid, paddr->stateless_reset_token);
-  }
-
   return 0;
 }
 
-- 
GitLab