From 15f715a2ce9aaa5cfc72d065e0b83edafa4df5a8 Mon Sep 17 00:00:00 2001
From: huitema <huitema@huitema.net>
Date: Tue, 27 Nov 2018 17:31:07 -0800
Subject: [PATCH] Fix logging of retry packets and client side bug

---
 picoquic/logger.c          | 13 +++++++++----
 picoquic/packet.c          | 14 +++++++-------
 picoquic/sender.c          |  5 +++--
 picoquicfirst/test_log.txt |  0
 4 files changed, 19 insertions(+), 13 deletions(-)
 create mode 100644 picoquicfirst/test_log.txt

diff --git a/picoquic/logger.c b/picoquic/logger.c
index 9acf421c..40332f01 100644
--- a/picoquic/logger.c
+++ b/picoquic/logger.c
@@ -368,8 +368,10 @@ void picoquic_log_packet_header(FILE* F, uint64_t log_cnxid64, picoquic_packet_h
     default:
         /* Long packets. Log Vnum, both CID, Seq num, Payload length */
         fprintf(F, " Version %x,", ph->vn);
-        picoquic_log_prefix_initial_cid64(F, log_cnxid64);
 
+        fprintf(F, "\n");
+        picoquic_log_prefix_initial_cid64(F, log_cnxid64);
+        fprintf(F, "    ");
         picoquic_log_connection_id(F, &ph->dest_cnx_id);
         fprintf(F, ", ");
         picoquic_log_connection_id(F, &ph->srce_cnx_id);
@@ -440,6 +442,7 @@ void picoquic_log_retry_packet(FILE* F, uint64_t log_cnxid64,
         if (token_length > 0) {
             int printed_length = (token_length > 16) ? 16 : token_length; 
             picoquic_log_prefix_initial_cid64(F, log_cnxid64);
+            fprintf(F, "    Token: ");
             for (uint8_t i = 0; i < printed_length; i++) {
                 fprintf(F, "%02x", bytes[byte_index++]);
             }
@@ -1208,9 +1211,11 @@ void picoquic_log_outgoing_segment(void* F_log, int log_cnxid, picoquic_cnx_t* c
 
     ph.pn64 = sequence_number;
     ph.pn = (uint32_t)ph.pn64;
-    if (ph.pn_offset != 0) {
-        ph.offset = ph.pn_offset + 4; /* todo: should provide the actual length */
-        ph.payload_length -= 4;
+    if (ph.ptype != picoquic_packet_retry) {
+        if (ph.pn_offset != 0) {
+            ph.offset = ph.pn_offset + 4; /* todo: should provide the actual length */
+            ph.payload_length -= 4;
+        }
     }
     if (ph.ptype != picoquic_packet_version_negotiation) {
         if (ph.payload_length > checksum_length) {
diff --git a/picoquic/packet.c b/picoquic/packet.c
index 98c5b215..de57c904 100644
--- a/picoquic/packet.c
+++ b/picoquic/packet.c
@@ -1105,13 +1105,13 @@ int picoquic_incoming_client_handshake(
 {
     int ret = 0;
 
-if (cnx->cnx_state == picoquic_state_server_init
-    || cnx->cnx_state == picoquic_state_server_handshake
-    || cnx->cnx_state == picoquic_state_server_almost_ready
-    || cnx->cnx_state == picoquic_state_server_false_start
-    || cnx->cnx_state == picoquic_state_ready) {
-    if (picoquic_compare_connection_id(&ph->srce_cnx_id, &cnx->path[0]->remote_cnxid) != 0) {
-        ret = PICOQUIC_ERROR_CNXID_CHECK;
+    if (cnx->cnx_state == picoquic_state_server_init
+        || cnx->cnx_state == picoquic_state_server_handshake
+        || cnx->cnx_state == picoquic_state_server_almost_ready
+        || cnx->cnx_state == picoquic_state_server_false_start
+        || cnx->cnx_state == picoquic_state_ready) {
+        if (picoquic_compare_connection_id(&ph->srce_cnx_id, &cnx->path[0]->remote_cnxid) != 0) {
+            ret = PICOQUIC_ERROR_CNXID_CHECK;
     }
     else {
         /* Accept the incoming frames */
diff --git a/picoquic/sender.c b/picoquic/sender.c
index a126bbb3..065bbf54 100644
--- a/picoquic/sender.c
+++ b/picoquic/sender.c
@@ -1473,13 +1473,14 @@ int picoquic_prepare_packet_client_init(picoquic_cnx_t* cnx, picoquic_path_t * p
 
                         if (packet_type == picoquic_packet_initial && 
                             (cnx->crypto_context[1].aead_encrypt == NULL ||
-                                cnx->cnx_state == picoquic_state_client_renegotiate)) {
+                                cnx->cnx_state == picoquic_state_client_renegotiate ||
+                                cnx->original_cnxid.id_len != 0)) {
                             /* Pad to minimum packet length. But don't do that if the
                              * initial packet will be coalesced with 0-RTT packet */
                             while (length < send_buffer_max - checksum_overhead) {
                                 bytes[length++] = 0;
                             }
-                        }
+                        } 
 
                         if (packet_type == picoquic_packet_0rtt_protected) {
                             cnx->nb_zero_rtt_sent++;
diff --git a/picoquicfirst/test_log.txt b/picoquicfirst/test_log.txt
new file mode 100644
index 00000000..e69de29b
-- 
GitLab