diff --git a/mdig/Makefile b/mdig/Makefile index e4a011bc..4e6ea66b 100644 --- a/mdig/Makefile +++ b/mdig/Makefile @@ -1,6 +1,6 @@ CC ?= cc OPTIMIZE ?= -Os -CFLAGS += -std=gnu99 $(OPTIMIZE) +CFLAGS += -std=gnu99 $(OPTIMIZE) -flto=auto CFLAGS_BSD = -Wno-address-of-packed-member CFLAGS_WIN = -static LIBS = -lpthread diff --git a/nfq/packet_queue.c b/nfq/packet_queue.c index 3c63b1cd..64a5ecad 100644 --- a/nfq/packet_queue.c +++ b/nfq/packet_queue.c @@ -6,7 +6,8 @@ void rawpacket_queue_init(struct rawpacket_tailhead *q) { - TAILQ_INIT(q); + TAILQ_INIT(&q->head); + q->cached_count = 0; } void rawpacket_free(struct rawpacket *rp) { @@ -16,8 +17,12 @@ void rawpacket_free(struct rawpacket *rp) struct rawpacket *rawpacket_dequeue(struct rawpacket_tailhead *q) { struct rawpacket *rp; - rp = TAILQ_FIRST(q); - if (rp) TAILQ_REMOVE(q, rp, next); + rp = TAILQ_FIRST(&q->head); + if (rp) + { + TAILQ_REMOVE(&q->head, rp, next); + q->cached_count--; + } return rp; } void rawpacket_queue_destroy(struct rawpacket_tailhead *q) @@ -52,19 +57,17 @@ struct rawpacket *rawpacket_queue(struct rawpacket_tailhead *q,const struct sock rp->len=len; rp->len_payload=len_payload; - TAILQ_INSERT_TAIL(q, rp, next); + TAILQ_INSERT_TAIL(&q->head, 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) { - return !TAILQ_FIRST(q); + return !TAILQ_FIRST(&q->head); } diff --git a/nfq/packet_queue.h b/nfq/packet_queue.h index 6d2c81c8..8b218a7b 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); +TAILQ_HEAD(rawpacket_tailq, rawpacket); +struct rawpacket_tailhead { + struct rawpacket_tailq head; + unsigned int cached_count; +}; void rawpacket_queue_init(struct rawpacket_tailhead *q); void rawpacket_queue_destroy(struct rawpacket_tailhead *q);