@@ -2020,7 +2020,6 @@ fd_quic_lazy_ack_pkt( fd_quic_t * quic,
2020
2020
( ( pkt -> enc_level == fd_quic_enc_level_initial_id ) |
2021
2021
( pkt -> enc_level == fd_quic_enc_level_handshake_id ) );
2022
2022
if ( ack_sz_threshold_hit | force_instant_ack ) {
2023
- conn -> unacked_sz = 0UL ;
2024
2023
fd_quic_svc_prep_schedule ( conn , state -> now );
2025
2024
} else {
2026
2025
fd_quic_svc_prep_schedule ( conn , state -> now + quic -> config .ack_delay );
@@ -2252,6 +2251,8 @@ fd_quic_process_quic_packet_v1( fd_quic_t * quic,
2252
2251
break ;
2253
2252
}
2254
2253
2254
+ fd_quic_svc_schedule ( state -> svc_timers , conn );
2255
+
2255
2256
if ( FD_UNLIKELY ( rc == FD_QUIC_PARSE_FAIL ) ) {
2256
2257
FD_DEBUG ( FD_LOG_DEBUG (( "Rejected packet (type=%d)" , long_packet_type )); )
2257
2258
return FD_QUIC_PARSE_FAIL ;
@@ -2268,6 +2269,9 @@ fd_quic_process_quic_packet_v1( fd_quic_t * quic,
2268
2269
ulong dst_conn_id = fd_ulong_load_8 ( cur_ptr + 1 );
2269
2270
conn = fd_quic_conn_query ( state -> conn_map , dst_conn_id );
2270
2271
rc = fd_quic_handle_v1_one_rtt ( quic , conn , pkt , cur_ptr , cur_sz );
2272
+
2273
+ fd_quic_svc_schedule ( state -> svc_timers , conn );
2274
+
2271
2275
if ( FD_UNLIKELY ( rc == FD_QUIC_PARSE_FAIL ) ) {
2272
2276
return FD_QUIC_PARSE_FAIL ;
2273
2277
}
@@ -2283,6 +2287,7 @@ fd_quic_process_quic_packet_v1( fd_quic_t * quic,
2283
2287
int ack_type = fd_quic_lazy_ack_pkt ( quic , conn , pkt );
2284
2288
quic -> metrics .ack_tx [ ack_type ]++ ;
2285
2289
2290
+ /* fd_quic_lazy_ack_pkt may have prepped schedule */
2286
2291
fd_quic_svc_schedule ( state -> svc_timers , conn );
2287
2292
2288
2293
if ( pkt -> rtt_ack_time ) {
@@ -2462,6 +2467,11 @@ fd_quic_process_packet( fd_quic_t * quic,
2462
2467
}
2463
2468
2464
2469
rc = fd_quic_process_quic_packet_v1 ( quic , & pkt , cur_ptr , cur_sz );
2470
+ if ( FD_UNLIKELY ( fd_quic_svc_cnt_events ( state -> svc_timers ) != quic -> metrics .conn_active_cnt ) ) {
2471
+ FD_LOG_WARNING (( "only %lu out of %lu connections are in timer" ,
2472
+ fd_quic_svc_cnt_events ( state -> svc_timers ),
2473
+ quic -> metrics .conn_active_cnt ));
2474
+ }
2465
2475
2466
2476
/* 0UL means no progress, so fail */
2467
2477
if ( FD_UNLIKELY ( ( rc == FD_QUIC_PARSE_FAIL ) |
@@ -2491,6 +2501,11 @@ fd_quic_process_packet( fd_quic_t * quic,
2491
2501
/* short header packet
2492
2502
only one_rtt packets currently have short headers */
2493
2503
fd_quic_process_quic_packet_v1 ( quic , & pkt , cur_ptr , cur_sz );
2504
+ if ( FD_UNLIKELY ( fd_quic_svc_cnt_events ( state -> svc_timers ) != quic -> metrics .conn_active_cnt ) ) {
2505
+ FD_LOG_WARNING (( "only %lu out of %lu connections are in timer" ,
2506
+ fd_quic_svc_cnt_events ( state -> svc_timers ),
2507
+ quic -> metrics .conn_active_cnt ));
2508
+ }
2494
2509
}
2495
2510
2496
2511
/* main receive-side entry point */
@@ -2924,6 +2939,11 @@ fd_quic_service( fd_quic_t * quic ) {
2924
2939
long now_ticks = fd_tickcount ();
2925
2940
2926
2941
fd_quic_svc_timers_t * timers = state -> svc_timers ;
2942
+ if ( FD_UNLIKELY ( fd_quic_svc_cnt_events ( timers ) != quic -> metrics .conn_active_cnt ) ) {
2943
+ FD_LOG_WARNING (( "only %lu out of %lu connections are in timer" ,
2944
+ fd_quic_svc_cnt_events ( timers ),
2945
+ quic -> metrics .conn_active_cnt ));
2946
+ }
2927
2947
fd_quic_svc_event_t next = fd_quic_svc_timers_next ( timers , now , 1 /* pop */ );
2928
2948
if ( FD_UNLIKELY ( next .conn == NULL ) ) {
2929
2949
return 0 ;
@@ -3573,7 +3593,8 @@ fd_quic_conn_tx( fd_quic_t * quic,
3573
3593
ulong now = fd_quic_get_state ( quic )-> now ;
3574
3594
3575
3595
/* initialize expiry and tx_time */
3576
- fd_quic_pkt_meta_t pkt_meta_tmpl [1 ] = {{.expiry = now + 500000000UL , .tx_time = now }};
3596
+ ulong const retx_timeout = 1250UL * 1000000UL ; /* 1250M ticks ~ 500 ms?*/
3597
+ fd_quic_pkt_meta_t pkt_meta_tmpl [1 ] = {{.expiry = now + retx_timeout , .tx_time = now }};
3577
3598
// pkt_meta_tmpl->expiry = fd_quic_calc_expiry( conn, now );
3578
3599
//ulong margin = (ulong)(conn->rtt->smoothed_rtt) + (ulong)(3 * conn->rtt->var_rtt);
3579
3600
//if( margin < pkt_meta->expiry ) {
@@ -3852,7 +3873,6 @@ fd_quic_conn_tx( fd_quic_t * quic,
3852
3873
void
3853
3874
fd_quic_conn_service ( fd_quic_t * quic , fd_quic_conn_t * conn , ulong now ) {
3854
3875
(void )now ;
3855
- conn -> svc_meta .next_timeout = ULONG_MAX ;
3856
3876
3857
3877
/* Send new rtt measurement probe? */
3858
3878
if ( FD_UNLIKELY (now > conn -> last_ack + (ulong )conn -> rtt_period_ticks ) ) {
@@ -3951,6 +3971,7 @@ fd_quic_conn_service( fd_quic_t * quic, fd_quic_conn_t * conn, ulong now ) {
3951
3971
case FD_QUIC_CONN_STATE_INVALID :
3952
3972
/* fall thru */
3953
3973
default :
3974
+ FD_LOG_ERR (( "invalid conn state %u" , conn -> state ));
3954
3975
return ;
3955
3976
}
3956
3977
@@ -3976,12 +3997,6 @@ fd_quic_conn_free( fd_quic_t * quic,
3976
3997
3977
3998
fd_quic_state_t * state = fd_quic_get_state ( quic );
3978
3999
3979
- /* no need to remove this connection from the events queue
3980
- free is called from two places:
3981
- fini - service will never be called again. All events are destroyed
3982
- service - removes event before calling free. Event only allowed to be
3983
- enqueued once */
3984
-
3985
4000
/* remove all stream ids from map, and free stream */
3986
4001
3987
4002
/* remove used streams */
@@ -4038,12 +4053,12 @@ fd_quic_conn_free( fd_quic_t * quic,
4038
4053
}
4039
4054
conn -> tls_hs = NULL ;
4040
4055
4056
+ /* remove from service queue */
4041
4057
fd_quic_svc_cancel ( state -> svc_timers , conn );
4042
4058
4043
4059
/* put connection back in free list */
4044
4060
conn -> free_conn_next = state -> free_conn_list ;
4045
4061
state -> free_conn_list = conn -> conn_idx ;
4046
- fd_quic_set_conn_state ( conn , FD_QUIC_CONN_STATE_INVALID );
4047
4062
4048
4063
quic -> metrics .conn_active_cnt -- ;
4049
4064
@@ -4070,7 +4085,6 @@ fd_quic_connect( fd_quic_t * quic,
4070
4085
}
4071
4086
}
4072
4087
4073
-
4074
4088
fd_rng_t * rng = state -> _rng ;
4075
4089
4076
4090
/* create conn ids for us and them
0 commit comments