I've realised that something like this would be nice for convenience,
but not crucial.  I'd prefer not to pass the mbuf pointer, but there's
no decent way around it.

---
 sys/net/ifq.c | 12 +++++++++---
 sys/net/ifq.h |  1 +
 2 files changed, 10 insertions(+), 3 deletions(-)

diff --git sys/net/ifq.c sys/net/ifq.c
index f678c2b01fd..ee302e99c3b 100644
--- sys/net/ifq.c
+++ sys/net/ifq.c
@@ -330,10 +330,18 @@ ifq_dequeue(struct ifqueue *ifq)
        ifq_deq_commit(ifq, m);
 
        return (m);
 }
 
+void
+ifq_drop(struct ifqueue *ifq, struct mbuf *m)
+{
+       m_freem(m);
+       ifq->ifq_len--;
+       ifq->ifq_qdrops++;
+}
+
 unsigned int
 ifq_purge(struct ifqueue *ifq)
 {
        struct mbuf_list ml = MBUF_LIST_INITIALIZER();
        unsigned int rv;
@@ -418,13 +426,11 @@ priq_enq(struct ifqueue *ifq, struct mbuf *m)
        /* Find a lower priority queue to drop from */
        if (ifq_len(ifq) >= ifq->ifq_maxlen) {
                for (prio = 0; prio < m->m_pkthdr.pf.prio; prio++) {
                        pl = &pq->pq_lists[prio];
                        if (ml_len(pl) > 0) {
-                               m_freem(ml_dequeue(pl));
-                               ifq->ifq_len--;
-                               ifq->ifq_qdrops++;
+                               ifq_drop(ifq, ml_dequeue(pl));
                                break;
                        }
                }
                /*
                 * There's no lower priority queue that we can
diff --git sys/net/ifq.h sys/net/ifq.h
index 3a6891da6f6..df0193214c5 100644
--- sys/net/ifq.h
+++ sys/net/ifq.h
@@ -345,10 +345,11 @@ int                ifq_enqueue_try(struct ifqueue *, 
struct mbuf *);
 int             ifq_enqueue(struct ifqueue *, struct mbuf *);
 struct mbuf    *ifq_deq_begin(struct ifqueue *);
 void            ifq_deq_commit(struct ifqueue *, struct mbuf *);
 void            ifq_deq_rollback(struct ifqueue *, struct mbuf *);
 struct mbuf    *ifq_dequeue(struct ifqueue *);
+void            ifq_drop(struct ifqueue *, struct mbuf *);
 unsigned int    ifq_purge(struct ifqueue *);
 void           *ifq_q_enter(struct ifqueue *, const struct ifq_ops *);
 void            ifq_q_leave(struct ifqueue *, void *);
 void            ifq_serialize(struct ifqueue *, struct task *);
 int             ifq_is_serialized(struct ifqueue *);
-- 
2.12.0

Reply via email to