|
@@ -116,6 +116,31 @@ struct sk_buff *brcmu_pktq_pdeq(struct pktq *pq, int prec)
|
|
|
}
|
|
|
EXPORT_SYMBOL(brcmu_pktq_pdeq);
|
|
|
|
|
|
+/*
|
|
|
+ * precedence based dequeue with match function. Passing a NULL pointer
|
|
|
+ * for the match function parameter is considered to be a wildcard so
|
|
|
+ * any packet on the queue is returned. In that case it is no different
|
|
|
+ * from brcmu_pktq_pdeq() above.
|
|
|
+ */
|
|
|
+struct sk_buff *brcmu_pktq_pdeq_match(struct pktq *pq, int prec,
|
|
|
+ bool (*match_fn)(struct sk_buff *skb,
|
|
|
+ void *arg), void *arg)
|
|
|
+{
|
|
|
+ struct sk_buff_head *q;
|
|
|
+ struct sk_buff *p, *next;
|
|
|
+
|
|
|
+ q = &pq->q[prec].skblist;
|
|
|
+ skb_queue_walk_safe(q, p, next) {
|
|
|
+ if (match_fn == NULL || match_fn(p, arg)) {
|
|
|
+ skb_unlink(p, q);
|
|
|
+ pq->len--;
|
|
|
+ return p;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return NULL;
|
|
|
+}
|
|
|
+EXPORT_SYMBOL(brcmu_pktq_pdeq_match);
|
|
|
+
|
|
|
struct sk_buff *brcmu_pktq_pdeq_tail(struct pktq *pq, int prec)
|
|
|
{
|
|
|
struct sk_buff_head *q;
|