aboutsummaryrefslogtreecommitdiffstats
path: root/net/ipv4
diff options
context:
space:
mode:
Diffstat (limited to 'net/ipv4')
-rw-r--r--net/ipv4/fib_frontend.c9
-rw-r--r--net/ipv4/inet_diag.c12
-rw-r--r--net/ipv4/netfilter/ip_queue.c17
3 files changed, 14 insertions, 24 deletions
diff --git a/net/ipv4/fib_frontend.c b/net/ipv4/fib_frontend.c
index f823ca34cb12..a5cba2349605 100644
--- a/net/ipv4/fib_frontend.c
+++ b/net/ipv4/fib_frontend.c
@@ -62,6 +62,9 @@ static struct hlist_head fib_table_hash[FIB_TABLE_HASHSZ];
62#define FIB_TABLE_HASHSZ 256 62#define FIB_TABLE_HASHSZ 256
63static struct hlist_head fib_table_hash[FIB_TABLE_HASHSZ]; 63static struct hlist_head fib_table_hash[FIB_TABLE_HASHSZ];
64 64
65static struct sock *fibnl = NULL;
66
67
65struct fib_table *fib_new_table(u32 id) 68struct fib_table *fib_new_table(u32 id)
66{ 69{
67 struct fib_table *tb; 70 struct fib_table *tb;
@@ -811,13 +814,13 @@ static void nl_fib_input(struct sock *sk, int len)
811 pid = NETLINK_CB(skb).pid; /* pid of sending process */ 814 pid = NETLINK_CB(skb).pid; /* pid of sending process */
812 NETLINK_CB(skb).pid = 0; /* from kernel */ 815 NETLINK_CB(skb).pid = 0; /* from kernel */
813 NETLINK_CB(skb).dst_group = 0; /* unicast */ 816 NETLINK_CB(skb).dst_group = 0; /* unicast */
814 netlink_unicast(sk, skb, pid, MSG_DONTWAIT); 817 netlink_unicast(fibnl, skb, pid, MSG_DONTWAIT);
815} 818}
816 819
817static void nl_fib_lookup_init(void) 820static void nl_fib_lookup_init(void)
818{ 821{
819 netlink_kernel_create(&init_net, NETLINK_FIB_LOOKUP, 0, nl_fib_input, 822 fibnl = netlink_kernel_create(&init_net, NETLINK_FIB_LOOKUP, 0,
820 NULL, THIS_MODULE); 823 nl_fib_input, NULL, THIS_MODULE);
821} 824}
822 825
823static void fib_disable_ip(struct net_device *dev, int force) 826static void fib_disable_ip(struct net_device *dev, int force)
diff --git a/net/ipv4/inet_diag.c b/net/ipv4/inet_diag.c
index b04a6ee5a9a1..7eb83ebed2ec 100644
--- a/net/ipv4/inet_diag.c
+++ b/net/ipv4/inet_diag.c
@@ -839,15 +839,11 @@ static int inet_diag_rcv_msg(struct sk_buff *skb, struct nlmsghdr *nlh)
839 839
840static DEFINE_MUTEX(inet_diag_mutex); 840static DEFINE_MUTEX(inet_diag_mutex);
841 841
842static void inet_diag_rcv(struct sock *sk, int len) 842static void inet_diag_rcv(struct sk_buff *skb)
843{ 843{
844 unsigned int qlen = 0; 844 mutex_lock(&inet_diag_mutex);
845 845 netlink_rcv_skb(skb, &inet_diag_rcv_msg);
846 do { 846 mutex_unlock(&inet_diag_mutex);
847 mutex_lock(&inet_diag_mutex);
848 qlen = netlink_run_queue(sk, qlen, &inet_diag_rcv_msg);
849 mutex_unlock(&inet_diag_mutex);
850 } while (qlen);
851} 847}
852 848
853static DEFINE_SPINLOCK(inet_diag_register_lock); 849static DEFINE_SPINLOCK(inet_diag_register_lock);
diff --git a/net/ipv4/netfilter/ip_queue.c b/net/ipv4/netfilter/ip_queue.c
index aaa3f5c56761..23cbfc7c80fd 100644
--- a/net/ipv4/netfilter/ip_queue.c
+++ b/net/ipv4/netfilter/ip_queue.c
@@ -475,7 +475,7 @@ ipq_dev_drop(int ifindex)
475#define RCV_SKB_FAIL(err) do { netlink_ack(skb, nlh, (err)); return; } while (0) 475#define RCV_SKB_FAIL(err) do { netlink_ack(skb, nlh, (err)); return; } while (0)
476 476
477static inline void 477static inline void
478ipq_rcv_skb(struct sk_buff *skb) 478__ipq_rcv_skb(struct sk_buff *skb)
479{ 479{
480 int status, type, pid, flags, nlmsglen, skblen; 480 int status, type, pid, flags, nlmsglen, skblen;
481 struct nlmsghdr *nlh; 481 struct nlmsghdr *nlh;
@@ -533,19 +533,10 @@ ipq_rcv_skb(struct sk_buff *skb)
533} 533}
534 534
535static void 535static void
536ipq_rcv_sk(struct sock *sk, int len) 536ipq_rcv_skb(struct sk_buff *skb)
537{ 537{
538 struct sk_buff *skb;
539 unsigned int qlen;
540
541 mutex_lock(&ipqnl_mutex); 538 mutex_lock(&ipqnl_mutex);
542 539 __ipq_rcv_skb(skb);
543 for (qlen = skb_queue_len(&sk->sk_receive_queue); qlen; qlen--) {
544 skb = skb_dequeue(&sk->sk_receive_queue);
545 ipq_rcv_skb(skb);
546 kfree_skb(skb);
547 }
548
549 mutex_unlock(&ipqnl_mutex); 540 mutex_unlock(&ipqnl_mutex);
550} 541}
551 542
@@ -670,7 +661,7 @@ static int __init ip_queue_init(void)
670 661
671 netlink_register_notifier(&ipq_nl_notifier); 662 netlink_register_notifier(&ipq_nl_notifier);
672 ipqnl = netlink_kernel_create(&init_net, NETLINK_FIREWALL, 0, 663 ipqnl = netlink_kernel_create(&init_net, NETLINK_FIREWALL, 0,
673 ipq_rcv_sk, NULL, THIS_MODULE); 664 ipq_rcv_skb, NULL, THIS_MODULE);
674 if (ipqnl == NULL) { 665 if (ipqnl == NULL) {
675 printk(KERN_ERR "ip_queue: failed to create netlink socket\n"); 666 printk(KERN_ERR "ip_queue: failed to create netlink socket\n");
676 goto cleanup_netlink_notifier; 667 goto cleanup_netlink_notifier;