diff options
author | Arend van Spriel <arend@broadcom.com> | 2013-03-03 12:45:31 +0100 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2013-03-06 22:28:48 +0100 |
commit | 17f14d7c1f306ad6a6d1cd253d7447a574785f07 (patch) | |
tree | 39d5a17a3d2d0becd1c064159874b65afb3c79d1 /drivers/net/wireless/brcm80211/brcmutil/utils.c | |
parent | brcmfmac: assure brcmf_txcomplete() is called in failure paths (diff) | |
download | linux-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.c | 25 |
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; |