Skip to content

Commit 9120b1f

Browse files
authored
Merge pull request #2066 from lminiero/connection-close-reason
Extend CONNECTION_CLOSE APIs to support reason string
2 parents 4236e15 + dce8dc1 commit 9120b1f

6 files changed

Lines changed: 40 additions & 12 deletions

File tree

picoquic/frames.c

Lines changed: 26 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4389,12 +4389,20 @@ uint8_t * picoquic_format_connection_close_frame(picoquic_cnx_t* cnx,
43894389

43904390
const uint8_t* picoquic_decode_connection_close_frame(picoquic_cnx_t* cnx, const uint8_t* bytes, const uint8_t* bytes_max)
43914391
{
4392-
bytes = picoquic_frames_varint_decode(bytes + 1, bytes_max, &cnx->remote_error);
4392+
uint64_t reason_length = 0;
43934393

4394-
if (bytes == NULL ||
4395-
(bytes = picoquic_frames_varint_skip(bytes, bytes_max)) == NULL ||
4396-
(bytes = picoquic_frames_length_data_skip(bytes, bytes_max)) == NULL)
4397-
{
4394+
if ((bytes = picoquic_frames_varint_decode(bytes + 1, bytes_max, &cnx->remote_error)) != NULL &&
4395+
(bytes = picoquic_frames_varint_skip(bytes, bytes_max)) != NULL &&
4396+
(bytes = picoquic_frames_varint_decode(bytes, bytes_max, &reason_length)) != NULL){
4397+
const uint8_t* first_byte = bytes;
4398+
if (reason_length != 0 &&
4399+
(bytes = picoquic_frames_fixed_skip(bytes, bytes_max, reason_length)) != NULL &&
4400+
cnx->remote_error_reason == NULL) {
4401+
cnx->remote_error_reason = picoquic_string_create((char*)first_byte, (size_t)reason_length);
4402+
}
4403+
}
4404+
4405+
if (bytes == NULL) {
43984406
picoquic_connection_error(cnx, PICOQUIC_TRANSPORT_FRAME_FORMAT_ERROR,
43994407
picoquic_frame_type_connection_close);
44004408
}
@@ -4421,7 +4429,7 @@ uint8_t * picoquic_format_application_close_frame(picoquic_cnx_t* cnx,
44214429

44224430
if ((bytes = picoquic_frames_uint8_encode(bytes, bytes_max, picoquic_frame_type_application_close)) != NULL &&
44234431
(bytes = picoquic_frames_varint_encode(bytes, bytes_max, cnx->application_error)) != NULL &&
4424-
(bytes = picoquic_frames_uint8_encode(bytes, bytes_max, 0)) != NULL) {
4432+
(bytes = picoquic_frames_charz_encode(bytes, bytes_max, cnx->local_error_reason)) != NULL) {
44254433
*is_pure_ack = 0;
44264434
}
44274435
else {
@@ -4433,12 +4441,19 @@ uint8_t * picoquic_format_application_close_frame(picoquic_cnx_t* cnx,
44334441

44344442
const uint8_t* picoquic_decode_application_close_frame(picoquic_cnx_t* cnx, const uint8_t* bytes, const uint8_t* bytes_max)
44354443
{
4436-
bytes = picoquic_frames_varint_decode(bytes + 1, bytes_max, &cnx->remote_application_error);
4444+
uint64_t reason_length = 0;
44374445

4438-
if (bytes == NULL ||
4439-
/* TODO, maybe: skip frame type for compatibility with draft-13 */
4440-
(bytes = picoquic_frames_length_data_skip(bytes, bytes_max)) == NULL)
4441-
{
4446+
if ((bytes = picoquic_frames_varint_decode(bytes + 1, bytes_max, &cnx->remote_application_error)) != NULL &&
4447+
(bytes = picoquic_frames_varint_decode(bytes, bytes_max, &reason_length)) != NULL){
4448+
const uint8_t* first_byte = bytes;
4449+
if (reason_length != 0 &&
4450+
(bytes = picoquic_frames_fixed_skip(bytes, bytes_max, reason_length)) != NULL &&
4451+
cnx->remote_error_reason == NULL) {
4452+
cnx->remote_error_reason = picoquic_string_create((char*)first_byte, (size_t)reason_length);
4453+
}
4454+
}
4455+
4456+
if (bytes == NULL) {
44424457
picoquic_connection_error(cnx, PICOQUIC_TRANSPORT_FRAME_FORMAT_ERROR,
44434458
picoquic_frame_type_application_close);
44444459
}

picoquic/picoquic.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -934,6 +934,8 @@ int picoquic_start_client_cnx(picoquic_cnx_t* cnx);
934934
*/
935935
int picoquic_close(picoquic_cnx_t* cnx, uint64_t application_reason_code);
936936

937+
int picoquic_close_ex(picoquic_cnx_t* cnx, uint64_t application_reason_code, char const* error_reason);
938+
937939
void picoquic_close_immediate(picoquic_cnx_t* cnx);
938940

939941
void picoquic_delete_cnx(picoquic_cnx_t* cnx);

picoquic/picoquic_internal.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1357,6 +1357,7 @@ typedef struct st_picoquic_cnx_t {
13571357
uint64_t remote_application_error;
13581358
uint64_t remote_error;
13591359
uint64_t offending_frame_type;
1360+
char * remote_error_reason;
13601361
uint16_t retry_token_length;
13611362
uint8_t * retry_token;
13621363

picoquic/quicctx.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5102,6 +5102,11 @@ void picoquic_delete_cnx(picoquic_cnx_t* cnx)
51025102
cnx->sni = NULL;
51035103
}
51045104

5105+
if (cnx->remote_error_reason != NULL) {
5106+
free((void*)cnx->remote_error_reason);
5107+
cnx->remote_error_reason = NULL;
5108+
}
5109+
51055110
if (cnx->retry_token != NULL) {
51065111
free(cnx->retry_token);
51075112
cnx->retry_token = NULL;

picoquic/sender.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4196,6 +4196,11 @@ int picoquic_prepare_packet(picoquic_cnx_t* cnx,
41964196
}
41974197

41984198
int picoquic_close(picoquic_cnx_t* cnx, uint64_t application_reason_code)
4199+
{
4200+
return picoquic_close_ex(cnx, application_reason_code, NULL);
4201+
}
4202+
4203+
int picoquic_close_ex(picoquic_cnx_t* cnx, uint64_t application_reason_code, char const* error_reason)
41994204
{
42004205
int ret = 0;
42014206
uint64_t current_time = picoquic_get_quic_time(cnx->quic);
@@ -4211,6 +4216,7 @@ int picoquic_close(picoquic_cnx_t* cnx, uint64_t application_reason_code)
42114216
} else {
42124217
ret = -1;
42134218
}
4219+
cnx->local_error_reason = error_reason;
42144220
cnx->offending_frame_type = 0;
42154221
picoquic_reinsert_by_wake_time(cnx->quic, cnx, current_time);
42164222

picoquic/util.c

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -861,7 +861,6 @@ const uint8_t* picoquic_frames_cid_decode(const uint8_t* bytes, const uint8_t* b
861861
return bytes;
862862
}
863863

864-
865864
/* Predict length of a varint encoding */
866865
size_t picoquic_frames_varint_encode_length(uint64_t n64)
867866
{

0 commit comments

Comments
 (0)