diff --git a/include/haproxy/quic_stats-t.h b/include/haproxy/quic_stats-t.h index 08e9caadb..95d0af9e6 100644 --- a/include/haproxy/quic_stats-t.h +++ b/include/haproxy/quic_stats-t.h @@ -9,6 +9,7 @@ extern struct stats_module quic_stats_module; enum { + QUIC_ST_RXBUF_FULL, QUIC_ST_DROPPED_PACKET, QUIC_ST_DROPPED_PACKET_BUFOVERRUN, QUIC_ST_DROPPED_PARSING, @@ -52,6 +53,7 @@ enum { }; struct quic_counters { + long long rxbuf_full; /* receive operation cancelled due to full buffer */ long long dropped_pkt; /* total number of dropped packets */ long long dropped_pkt_bufoverrun;/* total number of dropped packets because of buffer overrun */ long long dropped_parsing; /* total number of dropped packets upon parsing errors */ diff --git a/src/quic_sock.c b/src/quic_sock.c index 0f8185a4a..03cb96377 100644 --- a/src/quic_sock.c +++ b/src/quic_sock.c @@ -389,13 +389,17 @@ void quic_sock_fd_iocb(int fd) max_sz = params->max_udp_payload_size; cspace = b_contig_space(buf); if (cspace < max_sz) { + struct proxy *px = l->bind_conf->frontend; + struct quic_counters *prx_counters = EXTRA_COUNTERS_GET(px->extra_counters_fe, &quic_stats_module); struct quic_dgram *dgram; /* Do no mark as full, and do not try to consume it * if the contiguous remaining space is not at the end */ - if (b_tail(buf) + cspace < b_wrap(buf)) + if (b_tail(buf) + cspace < b_wrap(buf)) { + HA_ATOMIC_INC(&prx_counters->rxbuf_full); goto out; + } /* Allocate a fake datagram, without data to locate * the end of the RX buffer (required during purging). @@ -414,8 +418,10 @@ void quic_sock_fd_iocb(int fd) /* Consume the remaining space */ b_add(buf, cspace); - if (b_contig_space(buf) < max_sz) + if (b_contig_space(buf) < max_sz) { + HA_ATOMIC_INC(&prx_counters->rxbuf_full); goto out; + } } dgram_buf = (unsigned char *)b_tail(buf); diff --git a/src/quic_stats.c b/src/quic_stats.c index 73b03e42a..652395158 100644 --- a/src/quic_stats.c +++ b/src/quic_stats.c @@ -3,6 +3,8 @@ #include static struct name_desc quic_stats[] = { + [QUIC_ST_RXBUF_FULL] = { .name = "quic_rxbuf_full", + .desc = "Total number of cancelled reception due to full receiver buffer" }, [QUIC_ST_DROPPED_PACKET] = { .name = "quic_dropped_pkt", .desc = "Total number of dropped packets" }, [QUIC_ST_DROPPED_PACKET_BUFOVERRUN] = { .name = "quic_dropped_pkt_bufoverrun", @@ -87,6 +89,7 @@ static void quic_fill_stats(void *data, struct field *stats) { struct quic_counters *counters = data; + stats[QUIC_ST_RXBUF_FULL] = mkf_u64(FN_COUNTER, counters->rxbuf_full); stats[QUIC_ST_DROPPED_PACKET] = mkf_u64(FN_COUNTER, counters->dropped_pkt); stats[QUIC_ST_DROPPED_PACKET_BUFOVERRUN] = mkf_u64(FN_COUNTER, counters->dropped_pkt_bufoverrun); stats[QUIC_ST_DROPPED_PARSING] = mkf_u64(FN_COUNTER, counters->dropped_parsing);