Skip to content

Commit 73ee4b7

Browse files
committed
Delete old unused tuples.
1 parent f209630 commit 73ee4b7

File tree

2 files changed

+37
-1
lines changed

2 files changed

+37
-1
lines changed

picoquic/picoquic_internal.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1286,6 +1286,7 @@ typedef struct st_picoquic_cnx_t {
12861286
unsigned int stream_blocked_unidir_sent : 1; /* If stream_blocked has been sent to peer and no stream limit update since */
12871287
unsigned int max_stream_data_needed : 1; /* If at least one stream needs more data */
12881288
unsigned int path_demotion_needed : 1; /* If at least one path was recently demoted */
1289+
unsigned int tuple_demotion_needed : 1; /* if at least one tuple should be deleted */
12891290
unsigned int alt_path_challenge_needed : 1; /* If at least one alt path challenge is needed or in progress */
12901291
unsigned int is_handshake_finished : 1; /* If there are no more packets to ack or retransmit in initial or handshake contexts */
12911292
unsigned int is_handshake_done_acked : 1; /* If the peer has acked the handshake done packet */

picoquic/sender.c

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2784,6 +2784,7 @@ uint8_t* picoquic_prepare_tuple_challenge_frames(picoquic_cnx_t* cnx, picoquic_p
27842784
picoquic_tuple_t* previous_tuple = NULL;
27852785

27862786
tuple->challenge_failed = 1;
2787+
tuple->demotion_time = current_time + (path_x->retransmit_timer << PICOQUIC_CHALLENGE_REPEAT_MAX);
27872788

27882789
while (next_tuple != NULL) {
27892790
if (next_tuple == tuple) {
@@ -4018,6 +4019,35 @@ uint64_t picoquic_tuple_challenge_time(picoquic_path_t* path_x, picoquic_tuple_
40184019
return next_challenge_time;
40194020
}
40204021

4022+
/* Remove old tuples that are not needed anymore.
4023+
*/
4024+
void picoquic_delete_demoted_tuples(picoquic_cnx_t* cnx, uint64_t current_time, uint64_t * next_wake_time)
4025+
{
4026+
for (int path_index = 0; path_index < cnx->nb_paths; path_index++) {
4027+
picoquic_path_t* path_x = cnx->path[path_index];
4028+
if (!path_x->path_is_demoted) {
4029+
/* examine each tuple record */
4030+
picoquic_tuple_t* tuple = path_x->first_tuple;
4031+
picoquic_tuple_t* next_tuple;
4032+
4033+
while (tuple != NULL && (next_tuple = tuple->next_tuple) != NULL) {
4034+
if (next_tuple->challenge_failed) {
4035+
if (current_time > next_tuple->demotion_time) {
4036+
picoquic_delete_tuple(path_x, next_tuple);
4037+
continue;
4038+
}
4039+
else if (*next_wake_time > next_tuple->demotion_time) {
4040+
*next_wake_time = next_tuple->demotion_time;
4041+
SET_LAST_WAKE(cnx->quic, PICOQUIC_SENDER);
4042+
}
4043+
}
4044+
tuple = next_tuple;
4045+
}
4046+
}
4047+
}
4048+
cnx->tuple_demotion_needed = 0;
4049+
}
4050+
40214051
/* picoquic_check_path_control_needed:
40224052
* Find whether a path needs to send a challenge or a response.
40234053
* Todo: consider the need to keep alive the paths marked as "backup"
@@ -4029,6 +4059,9 @@ picoquic_tuple_t* picoquic_check_path_control_needed(picoquic_cnx_t* cnx, picoqu
40294059

40304060
while (tuple != NULL) {
40314061
if (tuple->challenge_failed) {
4062+
if (tuple != path_x->first_tuple && current_time > tuple->demotion_time) {
4063+
cnx->tuple_demotion_needed = 1;
4064+
}
40324065
/* go to next tuple */
40334066
}
40344067
else if (tuple->response_required) {
@@ -4404,7 +4437,9 @@ int picoquic_prepare_packet_ex(picoquic_cnx_t* cnx,
44044437
if (cnx->path_demotion_needed) {
44054438
picoquic_delete_abandoned_paths(cnx, current_time, &next_wake_time);
44064439
}
4407-
4440+
if (cnx->tuple_demotion_needed) {
4441+
picoquic_delete_demoted_tuples(cnx, current_time, &next_wake_time);
4442+
}
44084443
/* Select the next path, and the corresponding addresses */
44094444
picoquic_select_next_path_tuple(cnx, current_time, &next_wake_time, &path_x, &tuple);
44104445
picoquic_set_path_addresses_from_tuple(tuple, p_addr_to, p_addr_from, if_index);

0 commit comments

Comments
 (0)