Skip to content

Commit a7ca168

Browse files
committed
Reset MTU if tuple changes.
1 parent e10f0e2 commit a7ca168

File tree

2 files changed

+28
-16
lines changed

2 files changed

+28
-16
lines changed

picoquic/frames.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4744,7 +4744,7 @@ const uint8_t* picoquic_decode_path_response_frame(picoquic_cnx_t* cnx, const ui
47444744
previous_tuple->next_tuple = tuple->next_tuple;
47454745
tuple->next_tuple = path_x->first_tuple;
47464746
path_x->first_tuple = tuple;
4747-
4747+
picoquic_reset_path_mtu(path_x);
47484748
if (cnx->are_path_callbacks_enabled &&
47494749
cnx->callback_fn(cnx, path_x->unique_path_id, NULL, 0, picoquic_callback_path_available,
47504750
cnx->callback_ctx, path_x->app_path_ctx) != 0) {

picoquic/sender.c

Lines changed: 27 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -4054,10 +4054,14 @@ picoquic_tuple_t* picoquic_check_path_control_needed(picoquic_cnx_t* cnx, picoqu
40544054
/* Find available paths:
40554055
* Check that there is at least one available path. If not, promote one of the candidates.
40564056
*/
4057-
int picoquic_verify_path_available(picoquic_cnx_t * cnx, picoquic_path_t** next_path, uint64_t current_time)
4057+
int picoquic_verify_path_available(picoquic_cnx_t * cnx, picoquic_path_t** next_path, uint64_t * min_retransmit, uint64_t current_time)
40584058
{
40594059
int backup_index = -1;
40604060
int nb_available = 0;
4061+
uint64_t best_available_retransmit = UINT64_MAX;
4062+
uint64_t best_backup_retransmit = UINT64_MAX;
4063+
4064+
*min_retransmit = 0;
40614065

40624066
for (int path_index = 0; path_index < cnx->nb_paths; path_index++) {
40634067
picoquic_path_t* path_x = cnx->path[path_index];
@@ -4068,24 +4072,33 @@ int picoquic_verify_path_available(picoquic_cnx_t * cnx, picoquic_path_t** next_
40684072
cnx->congestion_alg->alg_init(cnx, path_x, cnx->congestion_alg_option_string, current_time);
40694073
}
40704074
/* track the available paths */
4071-
/* TODO: handle number of retransmissions? */
40724075
if (path_x->path_is_backup) {
4073-
if (backup_index < 0) {
4076+
if (backup_index < 0 || path_x->nb_retransmit < best_backup_retransmit) {
4077+
best_backup_retransmit = path_x->nb_retransmit;
40744078
backup_index = path_index;
40754079
}
40764080
}
40774081
else
40784082
{
4079-
*next_path = path_x;
4083+
if (path_x->nb_retransmit < best_available_retransmit) {
4084+
best_available_retransmit = path_x->nb_retransmit;
4085+
*next_path = path_x;
4086+
nb_available = 0;
4087+
}
40804088
nb_available++;
40814089
}
40824090
}
40834091
}
4084-
if (nb_available == 0 && backup_index >= 0) {
4092+
if (best_available_retransmit > 0 && best_backup_retransmit < best_available_retransmit){
40854093
cnx->path[backup_index]->path_is_backup = 0;
40864094
*next_path = cnx->path[backup_index];
4087-
nb_available += 1;
4088-
/* TODO: some logging. Queue PATH_AVAILABLE frame. */
4095+
nb_available = 1;
4096+
*min_retransmit = best_backup_retransmit;
4097+
/* TODO: some logging. Queue PATH_AVAILABLE frame? */
4098+
}
4099+
else
4100+
{
4101+
*min_retransmit = best_available_retransmit;
40894102
}
40904103
return nb_available;
40914104
}
@@ -4095,7 +4108,7 @@ int picoquic_verify_path_available(picoquic_cnx_t * cnx, picoquic_path_t** next_
40954108
*/
40964109

40974110
void picoquic_sort_available_paths(picoquic_cnx_t * cnx, uint64_t current_time, uint64_t* next_wake_time,
4098-
picoquic_path_t** next_path, picoquic_tuple_t** next_tuple)
4111+
picoquic_path_t** next_path, uint64_t min_retransmit, picoquic_tuple_t** next_tuple)
40994112
{
41004113
int data_path_cwin = -1;
41014114
int data_path_pacing = -1;
@@ -4115,7 +4128,7 @@ void picoquic_sort_available_paths(picoquic_cnx_t * cnx, uint64_t current_time,
41154128
/* Clear the nominal ack path flag from all path -- it will be reset to the low RTT path later */
41164129
path_x->is_nominal_ack_path = 0;
41174130
/* Only continue processing if the path is available */
4118-
if (path_x->path_is_backup || !path_x->first_tuple->challenge_verified || path_x->path_is_demoted) {
4131+
if (path_x->path_is_backup || !path_x->first_tuple->challenge_verified || path_x->path_is_demoted || path_x->nb_retransmit > min_retransmit) {
41194132
continue;
41204133
}
41214134
/* This path is a candidate for min rtt */
@@ -4221,6 +4234,7 @@ void picoquic_select_next_path_tuple(picoquic_cnx_t* cnx, uint64_t current_time,
42214234
picoquic_path_t** next_path, picoquic_tuple_t** next_tuple)
42224235
{
42234236
int nb_available = 0;
4237+
uint64_t min_retransmit = 0;
42244238

42254239
*next_path = NULL;
42264240
*next_tuple = NULL;
@@ -4236,24 +4250,24 @@ void picoquic_select_next_path_tuple(picoquic_cnx_t* cnx, uint64_t current_time,
42364250
(*next_path)->challenger++;
42374251
break;
42384252
}
4239-
else if (cnx->path[path_index]->first_tuple->challenge_verified && cnx->path[path_index]->nb_retransmit > 0 &&
4253+
else if (cnx->nb_paths > 0 && cnx->path[path_index]->first_tuple->challenge_verified && cnx->path[path_index]->nb_retransmit > 0 &&
42404254
cnx->cnx_state == picoquic_state_ready && cnx->path[path_index]->bytes_in_transit == 0) {
42414255
cnx->path[path_index]->is_multipath_probe_needed = 1;
42424256
*next_path = cnx->path[path_index];
4257+
*next_tuple = (*next_path)->first_tuple;
42434258
(*next_path)->challenger++;
42444259
break;
42454260
}
42464261
}
42474262
if (*next_path != NULL) {
4248-
*next_tuple = (*next_path)->first_tuple;
42494263
/* we are done */
42504264
}
42514265
else if (cnx->nb_paths == 1) {
42524266
/* No choice, just use this path -- this is the default if multipath is not selected. */
42534267
*next_path = cnx->path[0];
42544268
*next_tuple = (*next_path)->first_tuple;
42554269
}
4256-
else if ((nb_available = picoquic_verify_path_available(cnx, next_path, current_time)) < 2) {
4270+
else if ((nb_available = picoquic_verify_path_available(cnx, next_path, &min_retransmit, current_time)) < 2) {
42574271
/* Only 0 or 1 path to chose from. Just select that. */
42584272
if (*next_path == NULL) {
42594273
*next_path = cnx->path[0];
@@ -4265,7 +4279,7 @@ void picoquic_select_next_path_tuple(picoquic_cnx_t* cnx, uint64_t current_time,
42654279
* available path that can send ACK, or paced data, or congestion
42664280
* controlled data.
42674281
*/
4268-
picoquic_sort_available_paths(cnx, current_time, next_wake_time, next_path, next_tuple);
4282+
picoquic_sort_available_paths(cnx, current_time, next_wake_time, next_path, min_retransmit, next_tuple);
42694283
}
42704284
}
42714285

@@ -4285,8 +4299,6 @@ static void picoquic_set_path_addresses_from_tuple(picoquic_tuple_t* tuple,
42854299
}
42864300
}
42874301

4288-
4289-
42904302
/* manage the CC timer, if any */
42914303
static int picoquic_check_cc_feedback_timer(picoquic_cnx_t* cnx, uint64_t* next_wake_time, uint64_t current_time)
42924304
{

0 commit comments

Comments
 (0)