Browse Source
Merge pull request #5 from vemneyy/copilot/conduct-code-review
nfq: remove O(n) delayed-queue length scans from packet hot path
pull/2093/head
vemneyy
4 months ago
committed by
GitHub
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with
18 additions and
11 deletions
-
mdig/Makefile
-
nfq/packet_queue.c
-
nfq/packet_queue.h
|
|
|
@ -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 |
|
|
|
|
|
|
|
@ -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); |
|
|
|
} |
|
|
|
|
|
|
|
@ -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); |
|
|
|
|