diff --git a/nfq/packet_queue.c b/nfq/packet_queue.c index 3c63b1cd..4888d590 100644 --- a/nfq/packet_queue.c +++ b/nfq/packet_queue.c @@ -7,6 +7,7 @@ void rawpacket_queue_init(struct rawpacket_tailhead *q) { TAILQ_INIT(q); + q->cached_count = 0; } void rawpacket_free(struct rawpacket *rp) { @@ -17,7 +18,11 @@ struct rawpacket *rawpacket_dequeue(struct rawpacket_tailhead *q) { struct rawpacket *rp; rp = TAILQ_FIRST(q); - if (rp) TAILQ_REMOVE(q, rp, next); + if (rp) + { + TAILQ_REMOVE(q, rp, next); + q->cached_count--; + } return rp; } void rawpacket_queue_destroy(struct rawpacket_tailhead *q) @@ -53,16 +58,14 @@ struct rawpacket *rawpacket_queue(struct rawpacket_tailhead *q,const struct sock rp->len_payload=len_payload; TAILQ_INSERT_TAIL(q, rp, next); + q->cached_count++; return rp; } unsigned int rawpacket_queue_count(const struct rawpacket_tailhead *q) { - const struct rawpacket *rp; - unsigned int ct=0; - TAILQ_FOREACH(rp, q, next) ct++; - return ct; + return q->cached_count; } bool rawpacket_queue_empty(const struct rawpacket_tailhead *q) { diff --git a/nfq/packet_queue.h b/nfq/packet_queue.h index 6d2c81c8..221f7f5b 100644 --- a/nfq/packet_queue.h +++ b/nfq/packet_queue.h @@ -15,7 +15,11 @@ struct rawpacket uint8_t *packet; TAILQ_ENTRY(rawpacket) next; }; -TAILQ_HEAD(rawpacket_tailhead, rawpacket); +struct rawpacket_tailhead { + struct rawpacket *tqh_first; + struct rawpacket **tqh_last; + unsigned int cached_count; +}; void rawpacket_queue_init(struct rawpacket_tailhead *q); void rawpacket_queue_destroy(struct rawpacket_tailhead *q);