From: Alberto Leiva Popper Date: Tue, 7 Jul 2026 22:53:22 +0000 (-0600) Subject: Cache the client request queue size X-Git-Tag: 1.7.0.experimental~10 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=3857d45efc759dec46996e20e2c5341279a403f8;p=thirdparty%2FFORT-validator.git Cache the client request queue size --- diff --git a/src/rtr/pdu_stream.c b/src/rtr/pdu_stream.c index bb28cbc1..71c46fd3 100644 --- a/src/rtr/pdu_stream.c +++ b/src/rtr/pdu_stream.c @@ -48,6 +48,7 @@ struct pdu_stream *pdustream_create(int fd, char const *addr) result->claimed = false; TAILQ_INIT(&result->requests); + result->reqcount = 0; result->eos = false; @@ -443,30 +444,21 @@ create_request(struct pdu_stream *stream, struct pdu_header *hdr, static int queue_request(struct pdu_stream *stream, struct rtr_request *req) { - struct rtr_request *node; - unsigned int i; - if (TAILQ_EMPTY(&stream->requests)) { TAILQ_INSERT_HEAD(&stream->requests, req, lh); - pr_op_debug("Queued first request: %s", stream->addr); + stream->reqcount++; return 0; } - i = 0; - TAILQ_FOREACH(node, &stream->requests, lh) { - if ((++i) >= 4) - break; - - if (TAILQ_NEXT(node, lh) == NULL) { - TAILQ_INSERT_AFTER(&stream->requests, node, req, lh); - pr_op_debug("Queued request: %s", stream->addr); - return 0; - } + if (stream->reqcount >= 4) { + pr_op_err("%s: Too many simultaneous requests; Dropping RTR connection.", + stream->addr); + return ENOSPC; } - pr_op_err("%s: Too many simultaneous requests; Dropping RTR connection.", - stream->addr); - return ENOSPC; + TAILQ_INSERT_TAIL(&stream->requests, req, lh); + stream->reqcount++; + return 0; } /* diff --git a/src/rtr/pdu_stream.h b/src/rtr/pdu_stream.h index 313bd129..7bbdf13f 100644 --- a/src/rtr/pdu_stream.h +++ b/src/rtr/pdu_stream.h @@ -21,6 +21,7 @@ struct pdu_stream { /* It's an *input* stream. */ bool claimed; TAILQ_HEAD(, rtr_request) requests; /* No more than 4 nodes */ + unsigned int reqcount; bool eos; /* end of (input) stream */ }; diff --git a/src/rtr/rtr.c b/src/rtr/rtr.c index 9b6e4e79..d0e3b799 100644 --- a/src/rtr/rtr.c +++ b/src/rtr/rtr.c @@ -360,8 +360,10 @@ next_request(struct pdu_stream *client) struct rtr_request *req; req = TAILQ_FIRST(&client->requests); - if (req) + if (req) { TAILQ_REMOVE(&client->requests, req, lh); + client->reqcount--; + } return req; } diff --git a/test/rtr/pdu_stream_test.c b/test/rtr/pdu_stream_test.c index 1821d4ad..a4b46827 100644 --- a/test/rtr/pdu_stream_test.c +++ b/test/rtr/pdu_stream_test.c @@ -89,6 +89,7 @@ pop_request(struct pdu_stream *stream) request = TAILQ_FIRST(&stream->requests); ck_assert_ptr_ne(NULL, request); TAILQ_REMOVE(&stream->requests, request, lh); + stream->reqcount--; return request; }