From 3f8794d043c45e9ce624e8d9cf6c22c7bbbead1b Mon Sep 17 00:00:00 2001 From: Frederic Lecaille Date: Tue, 13 Feb 2024 21:24:40 +0100 Subject: [PATCH] MINOR: quic: Add a counter for reordered packets A packet is considered as reordered when it is detected as lost because its packet number is above the largest acknowledeged packet number by at least the packet reordering threshold value. Add ->nb_reordered_pkt new quic_loss struct member at the same location that the number of lost packets to count such packets. Should be backported to 2.6. (cherry picked from commit 167e38e0e0296e899aa894d2f3db5ba2a0c68cb5) Signed-off-by: Christopher Faulet --- include/haproxy/quic_loss-t.h | 1 + include/haproxy/quic_loss.h | 1 + src/quic_cli.c | 4 ++-- src/quic_loss.c | 9 +++++++-- 4 files changed, 11 insertions(+), 4 deletions(-) diff --git a/include/haproxy/quic_loss-t.h b/include/haproxy/quic_loss-t.h index d1fea9f..0f07ddc 100644 --- a/include/haproxy/quic_loss-t.h +++ b/include/haproxy/quic_loss-t.h @@ -55,6 +55,7 @@ struct quic_loss { /* Number of NACKed sent PTO. */ unsigned int pto_count; unsigned long nb_lost_pkt; + unsigned long nb_reordered_pkt; }; #endif /* USE_QUIC */ diff --git a/include/haproxy/quic_loss.h b/include/haproxy/quic_loss.h index d2a0e77..fc713ca 100644 --- a/include/haproxy/quic_loss.h +++ b/include/haproxy/quic_loss.h @@ -40,6 +40,7 @@ static inline void quic_loss_init(struct quic_loss *ql) ql->rtt_min = 0; ql->pto_count = 0; ql->nb_lost_pkt = 0; + ql->nb_reordered_pkt = 0; } /* Return 1 if a persistent congestion is observed for a list of diff --git a/src/quic_cli.c b/src/quic_cli.c index 07a32f6..56301fa 100644 --- a/src/quic_cli.c +++ b/src/quic_cli.c @@ -204,10 +204,10 @@ static void dump_quic_full(struct show_quic_ctx *ctx, struct quic_conn *qc) } chunk_appendf(&trash, " srtt=%-4u rttvar=%-4u rttmin=%-4u ptoc=%-4u cwnd=%-6llu" - " mcwnd=%-6llu sentpkts=%-6llu lostpkts=%-6llu\n", + " mcwnd=%-6llu sentpkts=%-6llu lostpkts=%-6llu\n reorderedpkts=%-6llu", qc->path->loss.srtt, qc->path->loss.rtt_var, qc->path->loss.rtt_min, qc->path->loss.pto_count, (ullong)qc->path->cwnd, - (ullong)qc->path->mcwnd, (ullong)qc->cntrs.sent_pkt, (ullong)qc->path->loss.nb_lost_pkt); + (ullong)qc->path->mcwnd, (ullong)qc->cntrs.sent_pkt, (ullong)qc->path->loss.nb_lost_pkt, (ullong)qc->path->loss.nb_reordered_pkt); if (qc->cntrs.dropped_pkt) { chunk_appendf(&trash, " droppkts=%-6llu", qc->cntrs.dropped_pkt); diff --git a/src/quic_loss.c b/src/quic_loss.c index fa0e4ba..fd9568a 100644 --- a/src/quic_loss.c +++ b/src/quic_loss.c @@ -197,6 +197,7 @@ void qc_packet_loss_lookup(struct quic_pktns *pktns, struct quic_conn *qc, struct quic_tx_packet *pkt; int64_t largest_acked_pn; unsigned int loss_time_limit, time_sent; + int reordered; pkt = eb64_entry(&node->node, struct quic_tx_packet, pn_node); largest_acked_pn = pktns->rx.largest_acked_pn; @@ -206,8 +207,12 @@ void qc_packet_loss_lookup(struct quic_pktns *pktns, struct quic_conn *qc, time_sent = pkt->time_sent; loss_time_limit = tick_add(time_sent, loss_delay); - if (tick_is_le(loss_time_limit, now_ms) || - (int64_t)largest_acked_pn >= pkt->pn_node.key + pktthresh) { + + reordered = (int64_t)largest_acked_pn >= pkt->pn_node.key + pktthresh; + if (reordered) + ql->nb_reordered_pkt++; + + if (tick_is_le(loss_time_limit, now_ms) || reordered) { eb64_delete(&pkt->pn_node); LIST_APPEND(lost_pkts, &pkt->list); ql->nb_lost_pkt++; -- 1.7.10.4