summaryrefslogtreecommitdiffstats
path: root/sys/netpfil
diff options
context:
space:
mode:
authorluigi <luigi@FreeBSD.org>2013-11-22 05:02:37 +0000
committerluigi <luigi@FreeBSD.org>2013-11-22 05:02:37 +0000
commitde6fdc14ad3fabeca1ed014bfe2f737a217bfbeb (patch)
tree5ea3aa4169abaf5e0adfc0e484b798d5838332f8 /sys/netpfil
parent9b36fc77a208f9a7efc591425d19845509048bcf (diff)
downloadFreeBSD-src-de6fdc14ad3fabeca1ed014bfe2f737a217bfbeb.zip
FreeBSD-src-de6fdc14ad3fabeca1ed014bfe2f737a217bfbeb.tar.gz
add a counter on the struct mq (a queue of mbufs),
and add a block for userspace compiling.
Diffstat (limited to 'sys/netpfil')
-rw-r--r--sys/netpfil/ipfw/dn_sched.h1
-rw-r--r--sys/netpfil/ipfw/ip_dn_io.c30
-rw-r--r--sys/netpfil/ipfw/ip_dn_private.h1
3 files changed, 32 insertions, 0 deletions
diff --git a/sys/netpfil/ipfw/dn_sched.h b/sys/netpfil/ipfw/dn_sched.h
index ab823fe..0d28454 100644
--- a/sys/netpfil/ipfw/dn_sched.h
+++ b/sys/netpfil/ipfw/dn_sched.h
@@ -166,6 +166,7 @@ dn_dequeue(struct dn_queue *q)
if (m == NULL)
return NULL;
q->mq.head = m->m_nextpkt;
+ q->mq.count--;
/* Update stats for the queue */
q->ni.length--;
diff --git a/sys/netpfil/ipfw/ip_dn_io.c b/sys/netpfil/ipfw/ip_dn_io.c
index 7afa1e2..1748194 100644
--- a/sys/netpfil/ipfw/ip_dn_io.c
+++ b/sys/netpfil/ipfw/ip_dn_io.c
@@ -260,10 +260,39 @@ dn_tag_get(struct mbuf *m)
static inline void
mq_append(struct mq *q, struct mbuf *m)
{
+#ifdef USERSPACE
+ // buffers from netmap need to be copied
+ // XXX note that the routine is not expected to fail
+ ND("append %p to %p", m, q);
+ if (m->m_flags & M_STACK) {
+ struct mbuf *m_new;
+ void *p;
+ int l, ofs;
+
+ ofs = m->m_data - m->__m_extbuf;
+ // XXX allocate
+ MGETHDR(m_new, M_NOWAIT, MT_DATA);
+ ND("*** WARNING, volatile buf %p ext %p %d dofs %d m_new %p",
+ m, m->__m_extbuf, m->__m_extlen, ofs, m_new);
+ p = m_new->__m_extbuf; /* new pointer */
+ l = m_new->__m_extlen; /* new len */
+ if (l <= m->__m_extlen) {
+ panic("extlen too large");
+ }
+
+ *m_new = *m; // copy
+ m_new->m_flags &= ~M_STACK;
+ m_new->__m_extbuf = p; // point to new buffer
+ pkt_copy(m->__m_extbuf, p, m->__m_extlen);
+ m_new->m_data = p + ofs;
+ m = m_new;
+ }
+#endif /* USERSPACE */
if (q->head == NULL)
q->head = m;
else
q->tail->m_nextpkt = m;
+ q->count++;
q->tail = m;
m->m_nextpkt = NULL;
}
@@ -455,6 +484,7 @@ transmit_event(struct mq *q, struct delay_line *dline, uint64_t now)
if (!DN_KEY_LEQ(pkt->output_time, now))
break;
dline->mq.head = m->m_nextpkt;
+ dline->mq.count--;
mq_append(q, m);
}
if (m != NULL) {
diff --git a/sys/netpfil/ipfw/ip_dn_private.h b/sys/netpfil/ipfw/ip_dn_private.h
index 159ddc9..958c820 100644
--- a/sys/netpfil/ipfw/ip_dn_private.h
+++ b/sys/netpfil/ipfw/ip_dn_private.h
@@ -83,6 +83,7 @@ SLIST_HEAD(dn_alg_head, dn_alg);
struct mq { /* a basic queue of packets*/
struct mbuf *head, *tail;
+ int count;
};
static inline void
OpenPOWER on IntegriCloud