Skip to content

Commit

Permalink
Add more trace details for the remaining frame types
Browse files Browse the repository at this point in the history
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 openssl/openssl#20914)
  • Loading branch information
mattcaswell authored and MrE-Fog committed Jun 4, 2023
1 parent d3673ad commit 1930a44
Showing 1 changed file with 95 additions and 35 deletions.
130 changes: 95 additions & 35 deletions ssl/quic/quic_trace.c
Original file line number Diff line number Diff line change
Expand Up @@ -37,33 +37,48 @@ 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)
{
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) */
Expand All @@ -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;
Expand All @@ -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;
}
Expand All @@ -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;
}

Expand All @@ -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;
}

Expand Down Expand Up @@ -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;
}

Expand All @@ -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;
}

Expand All @@ -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;
}

Expand All @@ -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;
}

Expand All @@ -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;
}

Expand All @@ -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;
}

Expand All @@ -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;
}

Expand All @@ -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;
}

Expand All @@ -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;
}

Expand Down Expand Up @@ -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))
Expand All @@ -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
Expand Down

0 comments on commit 1930a44

Please sign in to comment.