44#include <haproxy/quic_cc-t.h>
55#include <haproxy/quic_cc_drs.h>
66#include <haproxy/quic_tx-t.h>
7+ #include <haproxy/task.h>
78#include <haproxy/ticks.h>
89#include <haproxy/window_filter.h>
910
1011static void quic_cc_rs_init (struct quic_cc_rs * rs )
1112{
12- rs -> interval = UINT32_MAX ;
13+ rs -> interval_ns = UINT64_MAX ;
1314 rs -> delivered = 0 ;
1415 rs -> prior_delivered = 0 ;
15- rs -> prior_time = TICK_ETERNITY ;
16+ rs -> prior_time_ns = 0 ;
1617 rs -> tx_in_flight = 0 ;
1718 rs -> lost = 0 ;
1819 rs -> prior_lost = 0 ;
19- rs -> send_elapsed = 0 ;
20- rs -> ack_elapsed = 0 ;
20+ rs -> send_elapsed_ns = 0 ;
21+ rs -> ack_elapsed_ns = 0 ;
2122 rs -> last_end_seq = -1 ;
2223 rs -> is_app_limited = 0 ;
2324}
@@ -31,8 +32,8 @@ void quic_cc_drs_init(struct quic_cc_drs *drs)
3132 drs -> delivered = 0 ;
3233 drs -> lost = 0 ;
3334 drs -> last_seq = -1 ;
34- drs -> delivered_time = TICK_ETERNITY ;
35- drs -> first_sent_time = TICK_ETERNITY ;
35+ drs -> delivered_time_ns = 0 ;
36+ drs -> first_sent_time_ns = 0 ;
3637 drs -> app_limited = 0 ;
3738 drs -> is_cwnd_limited = 0 ;
3839}
@@ -44,12 +45,12 @@ void quic_cc_drs_on_pkt_sent(struct quic_cc_path *path,
4445 struct quic_tx_packet * pkt , struct quic_cc_drs * drs )
4546{
4647 if (!path -> in_flight )
47- drs -> first_sent_time = drs -> delivered_time = pkt -> time_sent ;
48+ drs -> first_sent_time_ns = drs -> delivered_time_ns = pkt -> time_sent_ns ;
4849
49- pkt -> rs .first_sent_time = drs -> first_sent_time ;
50- pkt -> rs .delivered_time = drs -> delivered_time ;
51- pkt -> rs .delivered = drs -> delivered ;
52- pkt -> rs .is_app_limited = drs -> app_limited != 0 ;
50+ pkt -> rs .first_sent_time_ns = drs -> first_sent_time_ns ;
51+ pkt -> rs .delivered_time_ns = drs -> delivered_time_ns ;
52+ pkt -> rs .delivered = drs -> delivered ;
53+ pkt -> rs .is_app_limited = drs -> app_limited != 0 ;
5354
5455 pkt -> rs .tx_in_flight = path -> in_flight + pkt -> len ;
5556 pkt -> rs .lost = drs -> lost ;
@@ -62,8 +63,8 @@ void quic_cc_drs_on_pkt_sent(struct quic_cc_path *path,
6263static inline int quic_cc_drs_is_newest_packet (struct quic_cc_drs * drs ,
6364 struct quic_tx_packet * pkt )
6465{
65- return tick_is_lt ( drs -> first_sent_time , pkt -> time_sent ) ||
66- (pkt -> time_sent == drs -> first_sent_time &&
66+ return drs -> first_sent_time_ns < pkt -> time_sent_ns ||
67+ (pkt -> time_sent_ns == drs -> first_sent_time_ns &&
6768 pkt -> rs .end_seq > drs -> rs .last_end_seq );
6869}
6970
@@ -83,32 +84,32 @@ static inline int quic_cc_drs_is_newest_packet(struct quic_cc_drs *drs,
8384 * RFC UpdateRateSample() called from first part of GenerateRateSample().
8485 */
8586void quic_cc_drs_update_rate_sample (struct quic_cc_drs * drs ,
86- struct quic_tx_packet * pkt )
87+ struct quic_tx_packet * pkt , uint64_t time_ns )
8788{
8889 struct quic_cc_rs * rs = & drs -> rs ;
8990
90- if (!tick_isset ( pkt -> rs .delivered_time ) )
91+ if (!pkt -> rs .delivered_time_ns )
9192 return ;
9293
9394 drs -> delivered += pkt -> len ;
94- drs -> delivered_time = now_ms ;
95+ drs -> delivered_time_ns = time_ns ;
9596 /* Update info using the newest packet. */
96- if (tick_isset ( rs -> prior_time ) && !quic_cc_drs_is_newest_packet (drs , pkt ))
97+ if (rs -> prior_time_ns && !quic_cc_drs_is_newest_packet (drs , pkt ))
9798 return ;
9899
99100 rs -> prior_delivered = pkt -> rs .delivered ;
100- rs -> prior_time = pkt -> rs .delivered_time ;
101+ rs -> prior_time_ns = pkt -> rs .delivered_time_ns ;
101102 rs -> is_app_limited = pkt -> rs .is_app_limited ;
102- rs -> send_elapsed = pkt -> time_sent - pkt -> rs .first_sent_time ;
103- rs -> ack_elapsed = drs -> delivered_time - pkt -> rs .delivered_time ;
103+ rs -> send_elapsed_ns = pkt -> time_sent_ns - pkt -> rs .first_sent_time_ns ;
104+ rs -> ack_elapsed_ns = drs -> delivered_time_ns - pkt -> rs .delivered_time_ns ;
104105 rs -> tx_in_flight = pkt -> rs .tx_in_flight ;
105106 rs -> prior_lost = pkt -> rs .lost ;
106107 rs -> last_end_seq = pkt -> rs .end_seq ;
107- drs -> first_sent_time = pkt -> time_sent ;
108+ drs -> first_sent_time_ns = pkt -> time_sent_ns ;
108109 /* Mark the packet as delivered once it's SACKed to
109110 * avoid being used again when it's cumulatively acked.
110111 */
111- pkt -> rs .delivered_time = TICK_ETERNITY ;
112+ pkt -> rs .delivered_time_ns = 0 ;
112113}
113114
114115/* RFC https://datatracker.ietf.org/doc/draft-ietf-ccwg-bbr/
@@ -131,25 +132,25 @@ void quic_cc_drs_on_ack_recv(struct quic_cc_drs *drs, struct quic_cc_path *path,
131132 ++ drs -> round_count ;
132133 }
133134
134- if (!tick_isset ( rs -> prior_time ) )
135+ if (!rs -> prior_time_ns )
135136 return ;
136137
137- rs -> interval = MAX (rs -> send_elapsed , rs -> ack_elapsed );
138+ rs -> interval_ns = MAX (rs -> send_elapsed_ns , rs -> ack_elapsed_ns );
138139
139140 BUG_ON (drs -> delivered <= rs -> prior_delivered );
140141 rs -> delivered = drs -> delivered - rs -> prior_delivered ;
141142 BUG_ON (drs -> lost < rs -> prior_lost );
142143 rs -> lost = drs -> lost - rs -> prior_lost ;
143144
144- if (rs -> interval < path -> loss .rtt_min ) {
145- rs -> interval = UINT32_MAX ;
145+ if (rs -> interval_ns < path -> loss .rtt_min * 1000000 ) {
146+ rs -> interval_ns = UINT64_MAX ;
146147 return ;
147148 }
148149
149- if (!rs -> interval )
150+ if (!rs -> interval_ns )
150151 return ;
151152
152- rate = rs -> delivered * 1000 / rs -> interval ;
153+ rate = rs -> delivered * 1000000000 / rs -> interval_ns ;
153154 if (rate >= wf_get_max (& drs -> wf ) || !drs -> app_limited )
154155 path -> delivery_rate = wf_max_update (& drs -> wf , rate , drs -> round_count );
155156}
0 commit comments