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
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
OPTIMIZE ?= -Os
CFLAGS += -std=gnu99 $(OPTIMIZE)
CFLAGS += -std=gnu99 $(OPTIMIZE) -flto=auto
CFLAGS_BSD = -Wno-address-of-packed-member
CFLAGS_WIN = -static
LIBS = -lpthread

21
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);
}

6
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);

Loading…
Cancel
Save