aboutsummaryrefslogtreecommitdiffstats
path: root/net/ipv4/inet_diag.c
diff options
context:
space:
mode:
authorPavel Emelyanov <xemul@parallels.com>2011-12-09 01:22:26 -0500
committerDavid S. Miller <davem@davemloft.net>2011-12-09 14:14:08 -0500
commitefb3cb428dcde2356802b3f93e152efa7abc5a62 (patch)
treedb735c5f128fb22785944c71232521e4726cffab /net/ipv4/inet_diag.c
parent476f7dbff30a7c122899d753c9119d9233928380 (diff)
inet_diag: Split inet_diag_get_exact into parts
Similar to previous patch: the 1st part locks the inet handler and will get generalized and the 2nd one dumps icsk-s and will be used by TCP and DCCP handlers. Signed-off-by: Pavel Emelyanov <xemul@parallels.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipv4/inet_diag.c')
-rw-r--r--net/ipv4/inet_diag.c28
1 files changed, 16 insertions, 12 deletions
diff --git a/net/ipv4/inet_diag.c b/net/ipv4/inet_diag.c
index 64abe476e2a6..f50df2ed9af5 100644
--- a/net/ipv4/inet_diag.c
+++ b/net/ipv4/inet_diag.c
@@ -709,19 +709,11 @@ out:
709 return err; 709 return err;
710} 710}
711 711
712static int __inet_diag_dump(struct sk_buff *skb, struct netlink_callback *cb, 712static void inet_diag_dump_icsk(struct inet_hashinfo *hashinfo, struct sk_buff *skb,
713 struct inet_diag_req *r, struct nlattr *bc) 713 struct netlink_callback *cb, struct inet_diag_req *r, struct nlattr *bc)
714{ 714{
715 int i, num; 715 int i, num;
716 int s_i, s_num; 716 int s_i, s_num;
717 const struct inet_diag_handler *handler;
718 struct inet_hashinfo *hashinfo;
719
720 handler = inet_diag_lock_handler(r->sdiag_protocol);
721 if (IS_ERR(handler))
722 goto unlock;
723
724 hashinfo = handler->idiag_hashinfo;
725 717
726 s_i = cb->args[1]; 718 s_i = cb->args[1];
727 s_num = num = cb->args[2]; 719 s_num = num = cb->args[2];
@@ -790,7 +782,7 @@ skip_listen_ht:
790 } 782 }
791 783
792 if (!(r->idiag_states & ~(TCPF_LISTEN | TCPF_SYN_RECV))) 784 if (!(r->idiag_states & ~(TCPF_LISTEN | TCPF_SYN_RECV)))
793 goto unlock; 785 goto out;
794 786
795 for (i = s_i; i <= hashinfo->ehash_mask; i++) { 787 for (i = s_i; i <= hashinfo->ehash_mask; i++) {
796 struct inet_ehash_bucket *head = &hashinfo->ehash[i]; 788 struct inet_ehash_bucket *head = &hashinfo->ehash[i];
@@ -863,8 +855,20 @@ next_dying:
863done: 855done:
864 cb->args[1] = i; 856 cb->args[1] = i;
865 cb->args[2] = num; 857 cb->args[2] = num;
866unlock: 858out:
859 ;
860}
861
862static int __inet_diag_dump(struct sk_buff *skb, struct netlink_callback *cb,
863 struct inet_diag_req *r, struct nlattr *bc)
864{
865 const struct inet_diag_handler *handler;
866
867 handler = inet_diag_lock_handler(r->sdiag_protocol);
868 if (!IS_ERR(handler))
869 inet_diag_dump_icsk(handler->idiag_hashinfo, skb, cb, r, bc);
867 inet_diag_unlock_handler(handler); 870 inet_diag_unlock_handler(handler);
871
868 return skb->len; 872 return skb->len;
869} 873}
870 874