Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
[firefly-linux-kernel-4.4.55.git] / drivers / net / wireless / brcm80211 / brcmutil / utils.c
index 3e6405e06ac028687e1d12627874491e969d6e94..bf5e50fc21ba8653413c943dd774ae35000d1064 100644 (file)
@@ -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;