Skip to content

Commit 1796acc

Browse files
authored
Merge pull request #1850 from private-octopus/multipath-draft-13
Multipath draft 13
2 parents 7d9ccc4 + b2c1dcf commit 1796acc

17 files changed

+118
-73
lines changed

CMakeLists.txt

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ else()
88
endif()
99

1010
project(picoquic
11-
VERSION 1.1.31.0
11+
VERSION 1.1.32.0
1212
DESCRIPTION "picoquic library"
1313
LANGUAGES C CXX)
1414

UnitTest1/unittest1.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -2841,8 +2841,8 @@ namespace UnitTest1
28412841
Assert::AreEqual(ret, 0);
28422842
}
28432843

2844-
TEST_METHOD(multipath_standby) {
2845-
int ret = multipath_standby_test();
2844+
TEST_METHOD(multipath_backup) {
2845+
int ret = multipath_backup_test();
28462846

28472847
Assert::AreEqual(ret, 0);
28482848
}

loglib/qlog.c

+3
Original file line numberDiff line numberDiff line change
@@ -833,8 +833,11 @@ void qlog_paths_blocked_frame(FILE* f, bytestream* s)
833833
void qlog_path_cid_blocked_frame(FILE* f, bytestream* s)
834834
{
835835
uint64_t path_id = 0;
836+
uint64_t next_sequence_number = 0;
836837
byteread_vint(s, &path_id);
838+
byteread_vint(s, &next_sequence_number);
837839
fprintf(f, ", \"path_id\": %"PRIu64, path_id);
840+
fprintf(f, ", \"next_sequence_number\": %"PRIu64, next_sequence_number);
838841
}
839842

840843
void qlog_reset_stream_frame(FILE* f, bytestream* s)

picoquic/frames.c

+63-26
Original file line numberDiff line numberDiff line change
@@ -5508,9 +5508,9 @@ int picoquic_queue_path_abandon_frame(picoquic_cnx_t* cnx,
55085508
return ret;
55095509
}
55105510

5511-
/* Multipath PATH STANDBY and AVAILABLE frames
5511+
/* Multipath PATH BACKUP and AVAILABLE frames
55125512
*/
5513-
uint8_t* picoquic_format_path_available_or_standby_frame(
5513+
uint8_t* picoquic_format_path_available_or_backup_frame(
55145514
uint8_t* bytes, const uint8_t* bytes_max, uint64_t frame_type,
55155515
uint64_t path_id, uint64_t sequence, int* more_data)
55165516
{
@@ -5525,7 +5525,7 @@ uint8_t* picoquic_format_path_available_or_standby_frame(
55255525
return bytes;
55265526
}
55275527

5528-
int picoquic_queue_path_available_or_standby_frame(
5528+
int picoquic_queue_path_available_or_backup_frame(
55295529
picoquic_cnx_t * cnx, picoquic_path_t * path_x, picoquic_path_status_enum status)
55305530
{
55315531
int ret = 0;
@@ -5544,7 +5544,7 @@ int picoquic_queue_path_available_or_standby_frame(
55445544
path_x->p_remote_cnxid->sequence;
55455545
int is_pure_ack = 0;
55465546
int more_data = 0;
5547-
uint8_t* bytes_next = picoquic_format_path_available_or_standby_frame(
5547+
uint8_t* bytes_next = picoquic_format_path_available_or_backup_frame(
55485548
frame_buffer, frame_buffer + sizeof(frame_buffer), frame_type, path_id, sequence, &more_data);
55495549
size_t consumed = bytes_next - frame_buffer;
55505550
ret = picoquic_queue_misc_frame(cnx, frame_buffer, consumed, is_pure_ack,
@@ -5557,7 +5557,7 @@ int picoquic_queue_path_available_or_standby_frame(
55575557
return ret;
55585558
}
55595559

5560-
const uint8_t* picoquic_skip_path_available_or_standby_frame(const uint8_t* bytes, const uint8_t* bytes_max)
5560+
const uint8_t* picoquic_skip_path_available_or_backup_frame(const uint8_t* bytes, const uint8_t* bytes_max)
55615561
{
55625562
/* This code assumes that the frame type is already skipped */
55635563
if ((bytes = picoquic_frames_varint_skip(bytes, bytes_max)) != NULL){
@@ -5566,7 +5566,7 @@ const uint8_t* picoquic_skip_path_available_or_standby_frame(const uint8_t* byte
55665566
return bytes;
55675567
}
55685568

5569-
const uint8_t* picoquic_parse_path_available_or_standby_frame(const uint8_t* bytes, const uint8_t* bytes_max,
5569+
const uint8_t* picoquic_parse_path_available_or_backup_frame(const uint8_t* bytes, const uint8_t* bytes_max,
55705570
uint64_t* path_id, uint64_t* sequence)
55715571
{
55725572
if ((bytes = picoquic_frames_varint_decode(bytes, bytes_max, path_id)) != NULL){
@@ -5575,7 +5575,7 @@ const uint8_t* picoquic_parse_path_available_or_standby_frame(const uint8_t* byt
55755575
return bytes;
55765576
}
55775577

5578-
const uint8_t* picoquic_decode_path_available_or_standby_frame(const uint8_t* bytes, const uint8_t* bytes_max,
5578+
const uint8_t* picoquic_decode_path_available_or_backup_frame(const uint8_t* bytes, const uint8_t* bytes_max,
55795579
uint64_t frame_id64, picoquic_cnx_t* cnx, uint64_t current_time)
55805580
{
55815581
uint64_t path_id;
@@ -5588,7 +5588,7 @@ const uint8_t* picoquic_decode_path_available_or_standby_frame(const uint8_t* by
55885588
picoquic_connection_error_ex(cnx, PICOQUIC_TRANSPORT_FRAME_FORMAT_ERROR,
55895589
frame_id64, "multipath not negotiated");
55905590
}
5591-
else if ((bytes = picoquic_parse_path_available_or_standby_frame(bytes, bytes_max, &path_id, &sequence)) == NULL) {
5591+
else if ((bytes = picoquic_parse_path_available_or_backup_frame(bytes, bytes_max, &path_id, &sequence)) == NULL) {
55925592
/* Bad frame encoding */
55935593
picoquic_connection_error_ex(cnx, PICOQUIC_TRANSPORT_FRAME_FORMAT_ERROR,
55945594
frame_id64, "bad status frame");
@@ -5599,18 +5599,18 @@ const uint8_t* picoquic_decode_path_available_or_standby_frame(const uint8_t* by
55995599
if (path_number < 0) {
56005600
/* Invalid path ID. Just ignore this frame. Add line in log for debug */
56015601
picoquic_log_app_message(cnx, "Ignore path %s frame with invalid ID: %" PRIu64,
5602-
(frame_id64 == picoquic_frame_type_path_available)?"available":"standby", path_id);
5602+
(frame_id64 == picoquic_frame_type_path_available)?"available":"backup", path_id);
56035603
}
56045604
else {
56055605
if (cnx->path[path_number]->status_sequence_to_receive_next > sequence) {
56065606
/* Old frame, ignore. */
56075607
}
56085608
else {
5609-
/* Status will be set to 1 for standby, 2 for available.
5610-
* Default status is 0?
5609+
/* Status will be set to 1 for backup, 0 for available.
5610+
* Default status is 0.
56115611
*/
56125612
cnx->path[path_number]->status_sequence_to_receive_next = sequence + 1;
5613-
cnx->path[path_number]->path_is_standby = (frame_id64 == picoquic_frame_type_path_available) ? 0:1;
5613+
cnx->path[path_number]->path_is_backup = (frame_id64 == picoquic_frame_type_path_available) ? 0:1;
56145614
}
56155615
}
56165616
}
@@ -5626,7 +5626,7 @@ int picoquic_path_available_or_backup_frame_need_repeat(picoquic_cnx_t* cnx, con
56265626

56275627
*no_need_to_repeat = 0;
56285628

5629-
if ((bytes = picoquic_parse_path_available_or_standby_frame(bytes, bytes_max, &path_id, &sequence)) == NULL){
5629+
if ((bytes = picoquic_parse_path_available_or_backup_frame(bytes, bytes_max, &path_id, &sequence)) == NULL){
56305630
/* Malformed frame, do not retransmit */
56315631
*no_need_to_repeat = 1;
56325632
}
@@ -5871,18 +5871,37 @@ int picoquic_process_ack_of_paths_blocked_frame(picoquic_cnx_t* cnx, const uint8
58715871

58725872
/* PATH CID BLOCKED frame */
58735873
uint8_t* picoquic_format_path_cid_blocked_frame(
5874-
uint8_t* bytes, const uint8_t* bytes_max, uint64_t path_id, int* more_data)
5874+
uint8_t* bytes, const uint8_t* bytes_max, uint64_t path_id, uint64_t next_sequence_number, int* more_data)
58755875
{
58765876
/* This code assumes that the frame type is already skipped */
58775877
uint8_t* bytes0 = bytes;
58785878
if ((bytes = picoquic_frames_varint_encode(bytes, bytes_max, picoquic_frame_type_path_cid_blocked)) == NULL ||
5879-
(bytes = picoquic_frames_varint_encode(bytes, bytes_max, path_id)) == NULL) {
5879+
(bytes = picoquic_frames_varint_encode(bytes, bytes_max, path_id)) == NULL ||
5880+
(bytes = picoquic_frames_varint_encode(bytes, bytes_max, next_sequence_number)) == NULL) {
58805881
bytes = bytes0;
58815882
*more_data = 1;
58825883
}
58835884
return bytes;
58845885
}
58855886

5887+
uint64_t picoquic_path_cid_next_sequence_number(picoquic_path_t * path_x)
5888+
{
5889+
picoquic_remote_cnxid_stash_t* stash = picoquic_find_or_create_remote_cnxid_stash(path_x->cnx, path_x->unique_path_id, 0);
5890+
uint64_t next_sequence_number = 0;
5891+
5892+
if (stash != NULL) {
5893+
picoquic_remote_cnxid_t* remote_cnxid = stash->cnxid_stash_first;
5894+
5895+
while (remote_cnxid != NULL) {
5896+
if (remote_cnxid->sequence >= next_sequence_number) {
5897+
next_sequence_number = remote_cnxid->sequence + 1;
5898+
}
5899+
remote_cnxid = remote_cnxid->next;
5900+
}
5901+
}
5902+
return next_sequence_number;
5903+
}
5904+
58865905
int picoquic_queue_path_cid_blocked_frame(
58875906
picoquic_path_t * path_x)
58885907
{
@@ -5891,8 +5910,10 @@ int picoquic_queue_path_cid_blocked_frame(
58915910
uint8_t frame_buffer[256];
58925911
int is_pure_ack = 0;
58935912
int more_data = 0;
5913+
uint64_t next_sequence_number = picoquic_path_cid_next_sequence_number(path_x);
58945914
uint8_t* bytes_next = picoquic_format_path_cid_blocked_frame(
5895-
frame_buffer, frame_buffer + sizeof(frame_buffer), path_x->unique_path_id, &more_data);
5915+
frame_buffer, frame_buffer + sizeof(frame_buffer), path_x->unique_path_id,
5916+
next_sequence_number, &more_data);
58965917
size_t consumed = bytes_next - frame_buffer;
58975918
ret = picoquic_queue_misc_frame(path_x->cnx, frame_buffer, consumed, is_pure_ack,
58985919
picoquic_packet_context_application);
@@ -5905,21 +5926,26 @@ int picoquic_queue_path_cid_blocked_frame(
59055926
const uint8_t* picoquic_skip_path_cid_blocked_frame(const uint8_t* bytes, const uint8_t* bytes_max)
59065927
{
59075928
/* This code assumes that the frame type is already skipped */
5908-
bytes = picoquic_frames_varint_skip(bytes, bytes_max);
5929+
if ((bytes = picoquic_frames_varint_skip(bytes, bytes_max)) != NULL) {
5930+
bytes = picoquic_frames_varint_skip(bytes, bytes_max);
5931+
}
59095932
return bytes;
59105933
}
59115934

59125935
const uint8_t* picoquic_parse_path_cid_blocked_frame(const uint8_t* bytes, const uint8_t* bytes_max,
5913-
uint64_t* max_path_id)
5936+
uint64_t* unique_path_id, uint64_t * next_sequence_number)
59145937
{
5915-
bytes = picoquic_frames_varint_decode(bytes, bytes_max, max_path_id);
5938+
if ((bytes = picoquic_frames_varint_decode(bytes, bytes_max, unique_path_id)) != NULL) {
5939+
bytes = picoquic_frames_varint_decode(bytes, bytes_max, next_sequence_number);
5940+
}
59165941
return bytes;
59175942
}
59185943

59195944
const uint8_t* picoquic_decode_path_cid_blocked_frame(const uint8_t* bytes, const uint8_t* bytes_max,
59205945
picoquic_cnx_t* cnx)
59215946
{
5922-
uint64_t path_id;
5947+
uint64_t unique_path_id = 0;
5948+
uint64_t next_sequence_number = 0;
59235949

59245950
/* This code assumes that the frame type is already skipped */
59255951

@@ -5928,7 +5954,7 @@ const uint8_t* picoquic_decode_path_cid_blocked_frame(const uint8_t* bytes, cons
59285954
picoquic_connection_error_ex(cnx, PICOQUIC_TRANSPORT_FRAME_FORMAT_ERROR,
59295955
picoquic_frame_type_path_cid_blocked, "multipath extension not negotiated");
59305956
}
5931-
else if ((bytes = picoquic_parse_path_cid_blocked_frame(bytes, bytes_max, &path_id)) == NULL) {
5957+
else if ((bytes = picoquic_parse_path_cid_blocked_frame(bytes, bytes_max, &unique_path_id, &next_sequence_number)) == NULL) {
59325958
/* Bad frame encoding */
59335959
picoquic_connection_error_ex(cnx, PICOQUIC_TRANSPORT_FRAME_FORMAT_ERROR,
59345960
picoquic_frame_type_path_cid_blocked, "bad path blocked frame");
@@ -5941,10 +5967,11 @@ int picoquic_path_cid_blocked_frame_needs_repeat(picoquic_cnx_t* cnx, const uint
59415967
{
59425968
int ret = 0;
59435969
uint64_t unique_path_id = 0;
5970+
uint64_t next_sequence_number = 0;
59445971

59455972
*no_need_to_repeat = 0;
59465973

5947-
if ((bytes = picoquic_parse_path_cid_blocked_frame(bytes, bytes_max, &unique_path_id)) == NULL) {
5974+
if ((bytes = picoquic_parse_path_cid_blocked_frame(bytes, bytes_max, &unique_path_id, &next_sequence_number)) == NULL) {
59485975
/* Malformed frame, do not retransmit */
59495976
*no_need_to_repeat = 1;
59505977
}
@@ -5960,6 +5987,15 @@ int picoquic_path_cid_blocked_frame_needs_repeat(picoquic_cnx_t* cnx, const uint
59605987
/* the blocked frame was already acknowledged */
59615988
*no_need_to_repeat = 1;
59625989
}
5990+
else {
5991+
uint64_t current_next_number = picoquic_path_cid_next_sequence_number(cnx->path[path_index]);
5992+
5993+
if (current_next_number > next_sequence_number)
5994+
{
5995+
/* New CID is now available */
5996+
*no_need_to_repeat = 1;
5997+
}
5998+
}
59635999
}
59646000
return ret;
59656001
}
@@ -5969,8 +6005,9 @@ int picoquic_process_ack_of_path_cid_blocked_frame(picoquic_cnx_t* cnx, const ui
59696005
{
59706006
int ret = 0;
59716007
uint64_t unique_path_id = 0;
6008+
uint64_t next_sequence_number = 0;
59726009

5973-
const uint8_t* bytes_next = picoquic_parse_path_cid_blocked_frame(bytes, bytes + bytes_max, &unique_path_id);
6010+
const uint8_t* bytes_next = picoquic_parse_path_cid_blocked_frame(bytes, bytes + bytes_max, &unique_path_id, &next_sequence_number);
59746011

59756012
if (bytes_next != NULL) {
59766013
/* Find the path context for the path ID */
@@ -6504,7 +6541,7 @@ int picoquic_decode_frames(picoquic_cnx_t* cnx, picoquic_path_t * path_x, const
65046541
break;
65056542
case picoquic_frame_type_path_backup:
65066543
case picoquic_frame_type_path_available:
6507-
bytes = picoquic_decode_path_available_or_standby_frame(bytes, bytes_max, frame_id64, cnx, current_time);
6544+
bytes = picoquic_decode_path_available_or_backup_frame(bytes, bytes_max, frame_id64, cnx, current_time);
65086545
ack_needed = 1;
65096546
break;
65106547
case picoquic_frame_type_max_path_id:
@@ -6852,7 +6889,7 @@ int picoquic_skip_frame(const uint8_t* bytes, size_t bytes_maxsize, size_t* cons
68526889
break;
68536890
case picoquic_frame_type_path_backup:
68546891
case picoquic_frame_type_path_available:
6855-
bytes = picoquic_skip_path_available_or_standby_frame(bytes, bytes_max);
6892+
bytes = picoquic_skip_path_available_or_backup_frame(bytes, bytes_max);
68566893
*pure_ack = 0;
68576894
break;
68586895
case picoquic_frame_type_max_path_id:
@@ -6864,7 +6901,7 @@ int picoquic_skip_frame(const uint8_t* bytes, size_t bytes_maxsize, size_t* cons
68646901
*pure_ack = 0;
68656902
break;
68666903
case picoquic_frame_type_path_cid_blocked:
6867-
bytes = picoquic_skip_paths_blocked_frame(bytes, bytes_max);
6904+
bytes = picoquic_skip_path_cid_blocked_frame(bytes, bytes_max);
68686905
*pure_ack = 0;
68696906
break;
68706907
case picoquic_frame_type_bdp:

picoquic/logger.c

+7-5
Original file line numberDiff line numberDiff line change
@@ -1398,7 +1398,7 @@ size_t textlog_path_abandon_frame(FILE* F, const uint8_t* bytes, size_t bytes_ma
13981398
return byte_index;
13991399
}
14001400

1401-
size_t textlog_path_available_or_standby_frame(FILE* F, const uint8_t* bytes, size_t bytes_max)
1401+
size_t textlog_path_available_or_backup_frame(FILE* F, const uint8_t* bytes, size_t bytes_max)
14021402
{
14031403
const uint8_t* bytes_end = bytes + bytes_max;
14041404
const uint8_t* bytes0 = bytes;
@@ -1500,9 +1500,11 @@ size_t textlog_path_cid_blocked_frame(FILE* F, const uint8_t* bytes, size_t byte
15001500
const uint8_t* bytes0 = bytes;
15011501
uint64_t frame_id = 0;
15021502
uint64_t path_id;
1503+
uint64_t next_sequence_number;
15031504
size_t byte_index = 0;
15041505
if ((bytes = picoquic_frames_varint_decode(bytes, bytes_end, &frame_id)) == NULL ||
1505-
(bytes = picoquic_frames_varint_decode(bytes, bytes_end, &path_id)) == NULL) {
1506+
(bytes = picoquic_frames_varint_decode(bytes, bytes_end, &path_id)) == NULL ||
1507+
(bytes = picoquic_frames_varint_decode(bytes, bytes_end, &next_sequence_number)) == NULL) {
15061508
/* log format error */
15071509
fprintf(F, " Malformed %s frame: ", textlog_frame_names(frame_id));
15081510
/* log format error */
@@ -1516,9 +1518,9 @@ size_t textlog_path_cid_blocked_frame(FILE* F, const uint8_t* bytes, size_t byte
15161518
byte_index = bytes_max;
15171519
}
15181520
else {
1519-
fprintf(F, " %s, path_id: %" PRIu64 "\n",
1521+
fprintf(F, " %s, path_id: %" PRIu64 ", next_sequence_number: %" PRIu64 "\n",
15201522
textlog_frame_names(picoquic_frame_type_path_cid_blocked),
1521-
path_id);
1523+
path_id, next_sequence_number);
15221524
byte_index = (bytes - bytes0);
15231525
}
15241526
return byte_index;
@@ -1753,7 +1755,7 @@ void picoquic_textlog_frames(FILE* F, uint64_t cnx_id64, const uint8_t* bytes, s
17531755
break;
17541756
case picoquic_frame_type_path_backup:
17551757
case picoquic_frame_type_path_available:
1756-
byte_index += textlog_path_available_or_standby_frame(F, bytes + byte_index, length - byte_index);
1758+
byte_index += textlog_path_available_or_backup_frame(F, bytes + byte_index, length - byte_index);
17571759
break;
17581760
case picoquic_frame_type_max_path_id:
17591761
byte_index += textlog_max_path_id_frame(F, bytes + byte_index, length - byte_index);

picoquic/logwriter.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -443,7 +443,7 @@ static const uint8_t* picoquic_log_path_available_or_backup_frame(FILE* f, const
443443
{
444444
const uint8_t* bytes_begin = bytes;
445445
bytes = picoquic_log_varint_skip(bytes, bytes_max); /* frame type as varint */
446-
bytes = picoquic_skip_path_available_or_standby_frame(bytes, bytes_max); /* skip available or standby frame */
446+
bytes = picoquic_skip_path_available_or_backup_frame(bytes, bytes_max); /* skip available or backup frame */
447447
picoquic_binlog_frame(f, bytes_begin, bytes);
448448

449449
return bytes;

picoquic/picoquic.h

+4-2
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@
4040
extern "C" {
4141
#endif
4242

43-
#define PICOQUIC_VERSION "1.1.31.0"
43+
#define PICOQUIC_VERSION "1.1.32.0"
4444
#define PICOQUIC_ERROR_CLASS 0x400
4545
#define PICOQUIC_ERROR_DUPLICATE (PICOQUIC_ERROR_CLASS + 1)
4646
#define PICOQUIC_ERROR_AEAD_CHECK (PICOQUIC_ERROR_CLASS + 3)
@@ -137,6 +137,8 @@ extern "C" {
137137

138138
#define PICOQUIC_TRANSPORT_APPLICATION_ABANDON (0x4150504C4142414E)
139139
#define PICOQUIC_TRANSPORT_RESOURCE_LIMIT_REACHED (0x5245534C494D4954)
140+
#define PICOQUIC_TRANSPORT_UNSTABLE_INTERFACE (0x554e5f494e5446)
141+
#define PICOQUIC_TRANSPORT_NO_CID_AVAILABLE (0x4e4f5f4349445f)
140142

141143
#define PICOQUIC_MAX_PACKET_SIZE 1536
142144
#define PICOQUIC_INITIAL_MTU_IPV4 1252
@@ -227,7 +229,7 @@ typedef enum {
227229

228230
typedef enum {
229231
picoquic_path_status_available = 0, /* Path available for sending */
230-
picoquic_path_status_standby = 1 /* Do not use if other path available */
232+
picoquic_path_status_backup = 1 /* Do not use if other path available */
231233
} picoquic_path_status_enum;
232234

233235
/*

picoquic/picoquic_internal.h

+4-4
Original file line numberDiff line numberDiff line change
@@ -588,7 +588,7 @@ typedef uint64_t picoquic_tp_enum;
588588
#define picoquic_tp_grease_quic_bit 0x2ab2
589589
#define picoquic_tp_version_negotiation 0x11
590590
#define picoquic_tp_enable_bdp_frame 0xebd9 /* per draft-kuhn-quic-0rtt-bdp-09 */
591-
#define picoquic_tp_initial_max_path_id 0x0f739bbc1b666d0cull /* per draft quic multipath 12 */
591+
#define picoquic_tp_initial_max_path_id 0x0f739bbc1b666d0cull /* per draft quic multipath 12 */
592592
#define picoquic_tp_address_discovery 0x9f81a176 /* per draft-seemann-quic-address-discovery */
593593

594594
/* Callback for converting binary log to quic log at the end of a connection.
@@ -1094,7 +1094,7 @@ typedef struct st_picoquic_path_t {
10941094
unsigned int challenge_failed : 1;
10951095
unsigned int response_required : 1;
10961096
unsigned int nat_challenge_required : 1;
1097-
unsigned int path_is_standby : 1;
1097+
unsigned int path_is_backup : 1;
10981098
unsigned int path_is_demoted : 1;
10991099
unsigned int path_abandon_received : 1;
11001100
unsigned int path_abandon_sent : 1;
@@ -2042,8 +2042,8 @@ void picoquic_update_peer_addr(picoquic_path_t* path_x, const struct sockaddr* p
20422042

20432043
int picoquic_skip_frame(const uint8_t* bytes, size_t bytes_max, size_t* consumed, int* pure_ack);
20442044
const uint8_t* picoquic_skip_path_abandon_frame(const uint8_t* bytes, const uint8_t* bytes_max);
2045-
const uint8_t* picoquic_skip_path_available_or_standby_frame(const uint8_t* bytes, const uint8_t* bytes_max);
2046-
int picoquic_queue_path_available_or_standby_frame(
2045+
const uint8_t* picoquic_skip_path_available_or_backup_frame(const uint8_t* bytes, const uint8_t* bytes_max);
2046+
int picoquic_queue_path_available_or_backup_frame(
20472047
picoquic_cnx_t* cnx, picoquic_path_t* path_x, picoquic_path_status_enum status);
20482048
/* Internal only API, notify that next path is now allowed. */
20492049
void picoquic_test_and_signal_new_path_allowed(picoquic_cnx_t* cnx);

0 commit comments

Comments
 (0)