@@ -2784,6 +2784,7 @@ uint8_t* picoquic_prepare_tuple_challenge_frames(picoquic_cnx_t* cnx, picoquic_p
2784
2784
picoquic_tuple_t * previous_tuple = NULL ;
2785
2785
2786
2786
tuple -> challenge_failed = 1 ;
2787
+ tuple -> demotion_time = current_time + (path_x -> retransmit_timer << PICOQUIC_CHALLENGE_REPEAT_MAX );
2787
2788
2788
2789
while (next_tuple != NULL ) {
2789
2790
if (next_tuple == tuple ) {
@@ -4018,6 +4019,35 @@ uint64_t picoquic_tuple_challenge_time(picoquic_path_t* path_x, picoquic_tuple_
4018
4019
return next_challenge_time ;
4019
4020
}
4020
4021
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
+
4021
4051
/* picoquic_check_path_control_needed:
4022
4052
* Find whether a path needs to send a challenge or a response.
4023
4053
* 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
4029
4059
4030
4060
while (tuple != NULL ) {
4031
4061
if (tuple -> challenge_failed ) {
4062
+ if (tuple != path_x -> first_tuple && current_time > tuple -> demotion_time ) {
4063
+ cnx -> tuple_demotion_needed = 1 ;
4064
+ }
4032
4065
/* go to next tuple */
4033
4066
}
4034
4067
else if (tuple -> response_required ) {
@@ -4404,7 +4437,9 @@ int picoquic_prepare_packet_ex(picoquic_cnx_t* cnx,
4404
4437
if (cnx -> path_demotion_needed ) {
4405
4438
picoquic_delete_abandoned_paths (cnx , current_time , & next_wake_time );
4406
4439
}
4407
-
4440
+ if (cnx -> tuple_demotion_needed ) {
4441
+ picoquic_delete_demoted_tuples (cnx , current_time , & next_wake_time );
4442
+ }
4408
4443
/* Select the next path, and the corresponding addresses */
4409
4444
picoquic_select_next_path_tuple (cnx , current_time , & next_wake_time , & path_x , & tuple );
4410
4445
picoquic_set_path_addresses_from_tuple (tuple , p_addr_to , p_addr_from , if_index );
0 commit comments