aboutsummaryrefslogtreecommitdiffstats
path: root/net
diff options
context:
space:
mode:
authorPatrick McHardy <kaber@trash.net>2007-03-14 16:39:45 -0700
committerDavid S. Miller <davem@sunset.davemloft.net>2007-04-25 22:25:44 -0700
commit73c361862c2be2e4ed6019da283fe1b422107f16 (patch)
tree2ac3e081fc9e3a84dc57b5a25e15e0e284488c3c /net
parent[NETFILTER]: nfnetlink: use mutex instead of semaphore (diff)
downloadlinux-dev-73c361862c2be2e4ed6019da283fe1b422107f16.tar.xz
linux-dev-73c361862c2be2e4ed6019da283fe1b422107f16.zip
[NETFILTER]: nfnetlink: use netlink_run_queue()
Signed-off-by: Patrick McHardy <kaber@trash.net> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net')
-rw-r--r--net/netfilter/nfnetlink.c51
1 files changed, 4 insertions, 47 deletions
diff --git a/net/netfilter/nfnetlink.c b/net/netfilter/nfnetlink.c
index 7865a47c981e..5be6ac478fd4 100644
--- a/net/netfilter/nfnetlink.c
+++ b/net/netfilter/nfnetlink.c
@@ -301,59 +301,16 @@ err_inval:
return -1;
}
-/* Process one packet of messages. */
-static inline int nfnetlink_rcv_skb(struct sk_buff *skb)
-{
- int err;
- struct nlmsghdr *nlh;
-
- while (skb->len >= NLMSG_SPACE(0)) {
- u32 rlen;
-
- nlh = (struct nlmsghdr *)skb->data;
- if (nlh->nlmsg_len < sizeof(struct nlmsghdr)
- || skb->len < nlh->nlmsg_len)
- return 0;
- rlen = NLMSG_ALIGN(nlh->nlmsg_len);
- if (rlen > skb->len)
- rlen = skb->len;
- if (nfnetlink_rcv_msg(skb, nlh, &err)) {
- if (!err)
- return -1;
- netlink_ack(skb, nlh, err);
- } else
- if (nlh->nlmsg_flags & NLM_F_ACK)
- netlink_ack(skb, nlh, 0);
- skb_pull(skb, rlen);
- }
-
- return 0;
-}
-
static void nfnetlink_rcv(struct sock *sk, int len)
{
- do {
- struct sk_buff *skb;
+ unsigned int qlen = 0;
+ do {
if (nfnl_trylock())
return;
-
- while ((skb = skb_dequeue(&sk->sk_receive_queue)) != NULL) {
- if (nfnetlink_rcv_skb(skb)) {
- if (skb->len)
- skb_queue_head(&sk->sk_receive_queue,
- skb);
- else
- kfree_skb(skb);
- break;
- }
- kfree_skb(skb);
- }
-
- /* don't call nfnl_unlock, since it would reenter
- * with further packet processing */
+ netlink_run_queue(sk, &qlen, nfnetlink_rcv_msg);
__nfnl_unlock();
- } while(nfnl && nfnl->sk_receive_queue.qlen);
+ } while (qlen);
}
static void __exit nfnetlink_exit(void)