summaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/brcm80211/brcmutil/utils.c
diff options
context:
space:
mode:
authorArend van Spriel <arend@broadcom.com>2013-03-03 12:45:31 +0100
committerJohn W. Linville <linville@tuxdriver.com>2013-03-06 22:28:48 +0100
commit17f14d7c1f306ad6a6d1cd253d7447a574785f07 (patch)
tree39d5a17a3d2d0becd1c064159874b65afb3c79d1 /drivers/net/wireless/brcm80211/brcmutil/utils.c
parentbrcmfmac: assure brcmf_txcomplete() is called in failure paths (diff)
downloadlinux-17f14d7c1f306ad6a6d1cd253d7447a574785f07.tar.xz
linux-17f14d7c1f306ad6a6d1cd253d7447a574785f07.zip
brcmutil: add dequeue function with filtering
Adding a packet dequeue function that will return packets that pass the provided match function. Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com> Reviewed-by: Hante Meuleman <meuleman@broadcom.com> Reviewed-by: Piotr Haber <phaber@broadcom.com> Signed-off-by: Arend van Spriel <arend@broadcom.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/brcm80211/brcmutil/utils.c')
-rw-r--r--drivers/net/wireless/brcm80211/brcmutil/utils.c25
1 files changed, 25 insertions, 0 deletions
diff --git a/drivers/net/wireless/brcm80211/brcmutil/utils.c b/drivers/net/wireless/brcm80211/brcmutil/utils.c
index 3e6405e06ac0..bf5e50fc21ba 100644
--- a/drivers/net/wireless/brcm80211/brcmutil/utils.c
+++ b/drivers/net/wireless/brcm80211/brcmutil/utils.c
@@ -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;