summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatt Caswell <matt@openssl.org>2023-05-08 14:26:30 +0100
committerMatt Caswell <matt@openssl.org>2023-05-24 12:18:33 +0100
commitcc87010d27f4dc3645ea718144bf387d8833e14c (patch)
treed3750f146067b10609356642538e583a69bbde55
parentb09e246aba584cd17d1d027f735f238b1b7f082c (diff)
Add more trace details for the remaining frame types
Prior to this commit we were just printing the fact that we had received or sent a frame of a particular type. We now provide more details about those frames. Reviewed-by: Tomas Mraz <tomas@openssl.org> Reviewed-by: Hugo Landau <hlandau@openssl.org> (Merged from https://github.com/openssl/openssl/pull/20914)
-rw-r--r--ssl/quic/quic_trace.c130
1 files changed, 95 insertions, 35 deletions
diff --git a/ssl/quic/quic_trace.c b/ssl/quic/quic_trace.c
index d84a2f65c6..058c0022a8 100644
--- a/ssl/quic/quic_trace.c
+++ b/ssl/quic/quic_trace.c
@@ -37,26 +37,40 @@ static const char *packet_type(int type)
}
}
-static const char *conn_id(QUIC_CONN_ID *id, char *buf, size_t buflen)
+/* Print a non-NUL terminated string to BIO */
+static void put_str(BIO *bio, char *str, size_t slen)
{
size_t i;
- char *obuf = buf;
- if (id->id_len == 0)
- return "<zero length id>";
+ for (i = 0; i < slen; i++)
+ BIO_printf(bio, "%c", str[i]);
+}
+
+static void put_data(BIO *bio, const uint8_t *data, size_t datalen)
+{
+ size_t i;
- if ((((size_t)id->id_len * 2) + 2) > buflen - 1)
- return "<id too long>"; /* Should never happen */
+ for (i = 0; i < datalen; i++)
+ BIO_printf(bio, "%02x", data[i]);
+}
- buf[0] = '0';
- buf[1]= 'x';
- buf += 2;
- buflen -= 2;
+static void put_conn_id(BIO *bio, QUIC_CONN_ID *id)
+{
+ if (id->id_len == 0) {
+ BIO_puts(bio, "<zero length id>");
+ return;
+ }
- for (i = 0; i < id->id_len; i++, buflen -= 2, buf += 2)
- BIO_snprintf(buf, buflen, "%02x", id->id[i]);
+ BIO_puts(bio, "0x");
+ put_data(bio, id->id, id->id_len);
+}
- return obuf;
+static void put_token(BIO *bio, const uint8_t *token, size_t token_len)
+{
+ if (token_len == 0)
+ BIO_puts(bio, "<zerlo length token>");
+ else
+ put_data(bio, token, token_len);
}
static int frame_ack(BIO *bio, PACKET *pkt)
@@ -64,6 +78,7 @@ static int frame_ack(BIO *bio, PACKET *pkt)
OSSL_QUIC_FRAME_ACK ack;
OSSL_QUIC_ACK_RANGE *ack_ranges = NULL;
uint64_t total_ranges = 0;
+ uint64_t i;
if (!ossl_quic_wire_peek_frame_ack_num_ranges(pkt, &total_ranges)
/* In case sizeof(uint64_t) > sizeof(size_t) */
@@ -75,10 +90,21 @@ static int frame_ack(BIO *bio, PACKET *pkt)
ack.ack_ranges = ack_ranges;
ack.num_ack_ranges = (size_t)total_ranges;
+ /* Ack delay exponent is 0, so we can get the raw delay time below */
if (!ossl_quic_wire_decode_frame_ack(pkt, 0, &ack, NULL))
return 0;
- /* TODO(QUIC): Display the ack data here */
+ BIO_printf(bio, " Largest acked: %lu\n", ack.ack_ranges[0].end);
+ BIO_printf(bio, " Ack delay (raw) %lu\n", ossl_time2ticks(ack.delay_time));
+ BIO_printf(bio, " Ack range count: %lu\n", total_ranges - 1);
+ BIO_printf(bio, " First ack range: %lu\n",
+ ack.ack_ranges[0].end - ack.ack_ranges[0].start);
+ for (i = 1; i < total_ranges; i++) {
+ BIO_printf(bio, " Gap: %lu\n",
+ ack.ack_ranges[i - 1].start - ack.ack_ranges[i].end - 2);
+ BIO_printf(bio, " Ack range len: %lu\n",
+ ack.ack_ranges[i].end - ack.ack_ranges[i].start);
+ }
OPENSSL_free(ack_ranges);
return 1;
@@ -91,7 +117,9 @@ static int frame_reset_stream(BIO *bio, PACKET *pkt)
if (!ossl_quic_wire_decode_frame_reset_stream(pkt, &frame_data))
return 0;
- /* TODO(QUIC): Display reset stream data here */
+ BIO_printf(bio, " Stream id: %lu\n", frame_data.stream_id);
+ BIO_printf(bio, " App Protocol Error Code: %lu\n", frame_data.app_error_code);
+ BIO_printf(bio, " Final size: %lu\n", frame_data.final_size);
return 1;
}
@@ -103,6 +131,9 @@ static int frame_stop_sending(BIO *bio, PACKET *pkt)
if (!ossl_quic_wire_decode_frame_stop_sending(pkt, &frame_data))
return 0;
+ BIO_printf(bio, " Stream id: %lu\n", frame_data.stream_id);
+ BIO_printf(bio, " App Protocol Error Code: %lu\n", frame_data.app_error_code);
+
return 1;
}
@@ -127,6 +158,10 @@ static int frame_new_token(BIO *bio, PACKET *pkt)
if (!ossl_quic_wire_decode_frame_new_token(pkt, &token, &token_len))
return 0;
+ BIO_puts(bio, " Token: ");
+ put_token(bio, token, token_len);
+ BIO_puts(bio, "\n");
+
return 1;
}
@@ -197,6 +232,8 @@ static int frame_max_data(BIO *bio, PACKET *pkt)
if (!ossl_quic_wire_decode_frame_max_data(pkt, &max_data))
return 0;
+ BIO_printf(bio, " Max Data: %lu\n", max_data);
+
return 1;
}
@@ -209,6 +246,8 @@ static int frame_max_stream_data(BIO *bio, PACKET *pkt)
&max_stream_data))
return 0;
+ BIO_printf(bio, " Max Stream Data: %lu\n", max_stream_data);
+
return 1;
}
@@ -219,6 +258,8 @@ static int frame_max_streams(BIO *bio, PACKET *pkt)
if (!ossl_quic_wire_decode_frame_max_streams(pkt, &max_streams))
return 0;
+ BIO_printf(bio, " Max Streams: %lu\n", max_streams);
+
return 1;
}
@@ -229,6 +270,8 @@ static int frame_data_blocked(BIO *bio, PACKET *pkt)
if (!ossl_quic_wire_decode_frame_data_blocked(pkt, &max_data))
return 0;
+ BIO_printf(bio, " Max Data: %lu\n", max_data);
+
return 1;
}
@@ -241,6 +284,9 @@ static int frame_stream_data_blocked(BIO *bio, PACKET *pkt)
&max_data))
return 0;
+ BIO_printf(bio, " Stream id: %lu\n", stream_id);
+ BIO_printf(bio, " Max Data: %lu\n", max_data);
+
return 1;
}
@@ -251,6 +297,8 @@ static int frame_streams_blocked(BIO *bio, PACKET *pkt)
if (!ossl_quic_wire_decode_frame_streams_blocked(pkt, &max_data))
return 0;
+ BIO_printf(bio, " Max Data: %lu\n", max_data);
+
return 1;
}
@@ -261,6 +309,14 @@ static int frame_new_conn_id(BIO *bio, PACKET *pkt)
if (!ossl_quic_wire_decode_frame_new_conn_id(pkt, &frame_data))
return 0;
+ BIO_printf(bio, " Sequence Number: %lu\n", frame_data.seq_num);
+ BIO_printf(bio, " Retire prior to: %lu\n", frame_data.retire_prior_to);
+ BIO_puts(bio, " Connection id: ");
+ put_conn_id(bio, &frame_data.conn_id);
+ BIO_puts(bio, "\n Stateless Reset Token: ");
+ put_data(bio, frame_data.stateless_reset_token, 16);
+ BIO_puts(bio, "\n");
+
return 1;
}
@@ -271,26 +327,32 @@ static int frame_retire_conn_id(BIO *bio, PACKET *pkt)
if (!ossl_quic_wire_decode_frame_retire_conn_id(pkt, &seq_num))
return 0;
+ BIO_printf(bio, " Sequence Number: %lu\n", seq_num);
+
return 1;
}
static int frame_path_challenge(BIO *bio, PACKET *pkt)
{
- uint64_t frame_data = 0;
+ uint64_t data = 0;
- if (!ossl_quic_wire_decode_frame_path_challenge(pkt, &frame_data))
+ if (!ossl_quic_wire_decode_frame_path_challenge(pkt, &data))
return 0;
+ BIO_printf(bio, " Data: %016lx\n", data);
+
return 1;
}
static int frame_path_response(BIO *bio, PACKET *pkt)
{
- uint64_t frame_data = 0;
+ uint64_t data = 0;
- if (!ossl_quic_wire_decode_frame_path_response(pkt, &frame_data))
+ if (!ossl_quic_wire_decode_frame_path_response(pkt, &data))
return 0;
+ BIO_printf(bio, " Data: %016lx\n", data);
+
return 1;
}
@@ -301,6 +363,11 @@ static int frame_conn_closed(BIO *bio, PACKET *pkt)
if (!ossl_quic_wire_decode_frame_conn_close(pkt, &frame_data))
return 0;
+ BIO_printf(bio, " Error Code: %lu\n", frame_data.error_code);
+ BIO_puts(bio, " Reason: ");
+ put_str(bio, frame_data.reason, frame_data.reason_len);
+ BIO_puts(bio, "\n");
+
return 1;
}
@@ -488,11 +555,6 @@ int ossl_quic_trace(int write_p, int version, int content_type,
case SSL3_RT_QUIC_PACKET:
{
QUIC_PKT_HDR hdr;
- /*
- * Max Conn id is 20 bytes (40 hex digits) plus "0x" bytes plus NUL
- * terminator
- */
- char tmpbuf[43];
size_t i;
if (!PACKET_buf_init(&pkt, buf, msglen))
@@ -510,20 +572,18 @@ int ossl_quic_trace(int write_p, int version, int content_type,
BIO_printf(bio, " Packet Type: %s\n", packet_type(hdr.type));
if (hdr.type != QUIC_PKT_TYPE_1RTT)
BIO_printf(bio, " Version: 0x%08x\n", hdr.version);
- BIO_printf(bio, " Destination Conn Id: %s\n",
- conn_id(&hdr.dst_conn_id, tmpbuf, sizeof(tmpbuf)));
- if (hdr.type != QUIC_PKT_TYPE_1RTT)
- BIO_printf(bio, " Source Conn Id: %s\n",
- conn_id(&hdr.src_conn_id, tmpbuf, sizeof(tmpbuf)));
+ BIO_puts(bio, " Destination Conn Id: ");
+ put_conn_id(bio, &hdr.dst_conn_id);
+ BIO_puts(bio, "\n");
+ if (hdr.type != QUIC_PKT_TYPE_1RTT) {
+ BIO_puts(bio, " Source Conn Id: ");
+ put_conn_id(bio, &hdr.src_conn_id);
+ BIO_puts(bio, "\n");
+ }
BIO_printf(bio, " Payload length: %zu\n", hdr.len);
if (hdr.type == QUIC_PKT_TYPE_INITIAL) {
BIO_puts(bio, " Token: ");
- if (hdr.token_len == 0) {
- BIO_puts(bio, "<zerlo length token>");
- } else {
- for (i = 0; i < hdr.token_len; i++)
- BIO_printf(bio, "%02x", hdr.token[i]);
- }
+ put_token(bio, hdr.token, hdr.token_len);
BIO_puts(bio, "\n");
}
if (hdr.type != QUIC_PKT_TYPE_VERSION_NEG