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 5 months ago
committed by GitHub
parent
commit
33eb65c3b4
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 2
      mdig/Makefile
  2. 21
      nfq/packet_queue.c
  3. 6
      nfq/packet_queue.h

2
mdig/Makefile

@ -1,6 +1,6 @@
CC ?= cc CC ?= cc
OPTIMIZE ?= -Os OPTIMIZE ?= -Os
CFLAGS += -std=gnu99 $(OPTIMIZE) CFLAGS += -std=gnu99 $(OPTIMIZE) -flto=auto
CFLAGS_BSD = -Wno-address-of-packed-member CFLAGS_BSD = -Wno-address-of-packed-member
CFLAGS_WIN = -static CFLAGS_WIN = -static
LIBS = -lpthread LIBS = -lpthread

21
nfq/packet_queue.c

@ -6,7 +6,8 @@
void rawpacket_queue_init(struct rawpacket_tailhead *q) 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) 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 *rawpacket_dequeue(struct rawpacket_tailhead *q)
{ {
struct rawpacket *rp; struct rawpacket *rp;
rp = TAILQ_FIRST(q); rp = TAILQ_FIRST(&q->head);
if (rp) TAILQ_REMOVE(q, rp, next); if (rp)
{
TAILQ_REMOVE(&q->head, rp, next);
q->cached_count--;
}
return rp; return rp;
} }
void rawpacket_queue_destroy(struct rawpacket_tailhead *q) 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=len;
rp->len_payload=len_payload; rp->len_payload=len_payload;
TAILQ_INSERT_TAIL(q, rp, next); TAILQ_INSERT_TAIL(&q->head, rp, next);
q->cached_count++;
return rp; return rp;
} }
unsigned int rawpacket_queue_count(const struct rawpacket_tailhead *q) unsigned int rawpacket_queue_count(const struct rawpacket_tailhead *q)
{ {
const struct rawpacket *rp; return q->cached_count;
unsigned int ct=0;
TAILQ_FOREACH(rp, q, next) ct++;
return ct;
} }
bool rawpacket_queue_empty(const struct rawpacket_tailhead *q) bool rawpacket_queue_empty(const struct rawpacket_tailhead *q)
{ {
return !TAILQ_FIRST(q); return !TAILQ_FIRST(&q->head);
} }

6
nfq/packet_queue.h

@ -15,7 +15,11 @@ struct rawpacket
uint8_t *packet; uint8_t *packet;
TAILQ_ENTRY(rawpacket) next; 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_init(struct rawpacket_tailhead *q);
void rawpacket_queue_destroy(struct rawpacket_tailhead *q); void rawpacket_queue_destroy(struct rawpacket_tailhead *q);

Loading…
Cancel
Save