[NET]: make netlink user -> kernel interface synchronious
[safe/jmp/linux-2.6] / net / ipv4 / netfilter / ip_queue.c
index aaa3f5c..23cbfc7 100644 (file)
@@ -475,7 +475,7 @@ ipq_dev_drop(int ifindex)
 #define RCV_SKB_FAIL(err) do { netlink_ack(skb, nlh, (err)); return; } while (0)
 
 static inline void
-ipq_rcv_skb(struct sk_buff *skb)
+__ipq_rcv_skb(struct sk_buff *skb)
 {
        int status, type, pid, flags, nlmsglen, skblen;
        struct nlmsghdr *nlh;
@@ -533,19 +533,10 @@ ipq_rcv_skb(struct sk_buff *skb)
 }
 
 static void
-ipq_rcv_sk(struct sock *sk, int len)
+ipq_rcv_skb(struct sk_buff *skb)
 {
-       struct sk_buff *skb;
-       unsigned int qlen;
-
        mutex_lock(&ipqnl_mutex);
-
-       for (qlen = skb_queue_len(&sk->sk_receive_queue); qlen; qlen--) {
-               skb = skb_dequeue(&sk->sk_receive_queue);
-               ipq_rcv_skb(skb);
-               kfree_skb(skb);
-       }
-
+       __ipq_rcv_skb(skb);
        mutex_unlock(&ipqnl_mutex);
 }
 
@@ -670,7 +661,7 @@ static int __init ip_queue_init(void)
 
        netlink_register_notifier(&ipq_nl_notifier);
        ipqnl = netlink_kernel_create(&init_net, NETLINK_FIREWALL, 0,
-                                     ipq_rcv_sk, NULL, THIS_MODULE);
+                                     ipq_rcv_skb, NULL, THIS_MODULE);
        if (ipqnl == NULL) {
                printk(KERN_ERR "ip_queue: failed to create netlink socket\n");
                goto cleanup_netlink_notifier;