diff --git a/include/haproxy/quic_loss-t.h b/include/haproxy/quic_loss-t.h index d1fea9f7e..0f07ddc00 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 d2a0e776b..fc713ca07 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 07a32f6cb..56301fa84 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 fa0e4ba57..fd9568a50 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++;