aboutsummaryrefslogtreecommitdiffstats
path: root/net/ipv4/inet_diag.c
diff options
context:
space:
mode:
authorPavel Emelyanov <xemul@parallels.com>2011-12-06 03:05:24 -0500
committerDavid S. Miller <davem@davemloft.net>2011-12-06 13:58:01 -0500
commitf13c95f0e255e6d21762259875295cc212e6bc32 (patch)
treead60d56913b6be75b8735632af675a47f996c76d /net/ipv4/inet_diag.c
parent37f352b5e3e89337f7a9a3a90250b5dde3c5f40d (diff)
inet_diag: Switch from _GETSOCK to IPPROTO_ numbers
Sorry, but the vger didn't let this message go to the list. Re-sending it with less spam-filter-prone subject. When dumping the AF_INET/AF_INET6 sockets user will also specify the protocol, so prepare the protocol diag handlers to work with IPPROTO_ constants. 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.c34
1 files changed, 23 insertions, 11 deletions
diff --git a/net/ipv4/inet_diag.c b/net/ipv4/inet_diag.c
index 7aad6ad24dda..58caecc343b1 100644
--- a/net/ipv4/inet_diag.c
+++ b/net/ipv4/inet_diag.c
@@ -50,19 +50,31 @@ static struct sock *sdiagnl;
50#define INET_DIAG_PUT(skb, attrtype, attrlen) \ 50#define INET_DIAG_PUT(skb, attrtype, attrlen) \
51 RTA_DATA(__RTA_PUT(skb, attrtype, attrlen)) 51 RTA_DATA(__RTA_PUT(skb, attrtype, attrlen))
52 52
53static inline int inet_diag_type2proto(int type)
54{
55 switch (type) {
56 case TCPDIAG_GETSOCK:
57 return IPPROTO_TCP;
58 case DCCPDIAG_GETSOCK:
59 return IPPROTO_DCCP;
60 default:
61 return 0;
62 }
63}
64
53static DEFINE_MUTEX(inet_diag_table_mutex); 65static DEFINE_MUTEX(inet_diag_table_mutex);
54 66
55static const struct inet_diag_handler *inet_diag_lock_handler(int type) 67static const struct inet_diag_handler *inet_diag_lock_handler(int proto)
56{ 68{
57 if (!inet_diag_table[type]) 69 if (!inet_diag_table[proto])
58 request_module("net-pf-%d-proto-%d-type-%d", PF_NETLINK, 70 request_module("net-pf-%d-proto-%d-type-%d", PF_NETLINK,
59 NETLINK_SOCK_DIAG, type); 71 NETLINK_SOCK_DIAG, proto);
60 72
61 mutex_lock(&inet_diag_table_mutex); 73 mutex_lock(&inet_diag_table_mutex);
62 if (!inet_diag_table[type]) 74 if (!inet_diag_table[proto])
63 return ERR_PTR(-ENOENT); 75 return ERR_PTR(-ENOENT);
64 76
65 return inet_diag_table[type]; 77 return inet_diag_table[proto];
66} 78}
67 79
68static inline void inet_diag_unlock_handler( 80static inline void inet_diag_unlock_handler(
@@ -85,7 +97,7 @@ static int inet_csk_diag_fill(struct sock *sk,
85 unsigned char *b = skb_tail_pointer(skb); 97 unsigned char *b = skb_tail_pointer(skb);
86 const struct inet_diag_handler *handler; 98 const struct inet_diag_handler *handler;
87 99
88 handler = inet_diag_table[unlh->nlmsg_type]; 100 handler = inet_diag_table[inet_diag_type2proto(unlh->nlmsg_type)];
89 BUG_ON(handler == NULL); 101 BUG_ON(handler == NULL);
90 102
91 nlh = NLMSG_PUT(skb, pid, seq, unlh->nlmsg_type, sizeof(*r)); 103 nlh = NLMSG_PUT(skb, pid, seq, unlh->nlmsg_type, sizeof(*r));
@@ -257,7 +269,7 @@ static int inet_diag_get_exact(struct sk_buff *in_skb,
257 struct inet_hashinfo *hashinfo; 269 struct inet_hashinfo *hashinfo;
258 const struct inet_diag_handler *handler; 270 const struct inet_diag_handler *handler;
259 271
260 handler = inet_diag_lock_handler(nlh->nlmsg_type); 272 handler = inet_diag_lock_handler(inet_diag_type2proto(nlh->nlmsg_type));
261 if (IS_ERR(handler)) { 273 if (IS_ERR(handler)) {
262 err = PTR_ERR(handler); 274 err = PTR_ERR(handler);
263 goto unlock; 275 goto unlock;
@@ -707,7 +719,7 @@ static int inet_diag_dump(struct sk_buff *skb, struct netlink_callback *cb)
707 if (nlmsg_attrlen(cb->nlh, sizeof(struct inet_diag_req))) 719 if (nlmsg_attrlen(cb->nlh, sizeof(struct inet_diag_req)))
708 bc = nlmsg_find_attr(cb->nlh, sizeof(*r), INET_DIAG_REQ_BYTECODE); 720 bc = nlmsg_find_attr(cb->nlh, sizeof(*r), INET_DIAG_REQ_BYTECODE);
709 721
710 handler = inet_diag_lock_handler(cb->nlh->nlmsg_type); 722 handler = inet_diag_lock_handler(inet_diag_type2proto(cb->nlh->nlmsg_type));
711 if (IS_ERR(handler)) 723 if (IS_ERR(handler))
712 goto unlock; 724 goto unlock;
713 725
@@ -907,7 +919,7 @@ int inet_diag_register(const struct inet_diag_handler *h)
907 const __u16 type = h->idiag_type; 919 const __u16 type = h->idiag_type;
908 int err = -EINVAL; 920 int err = -EINVAL;
909 921
910 if (type >= INET_DIAG_GETSOCK_MAX) 922 if (type >= IPPROTO_MAX)
911 goto out; 923 goto out;
912 924
913 mutex_lock(&inet_diag_table_mutex); 925 mutex_lock(&inet_diag_table_mutex);
@@ -926,7 +938,7 @@ void inet_diag_unregister(const struct inet_diag_handler *h)
926{ 938{
927 const __u16 type = h->idiag_type; 939 const __u16 type = h->idiag_type;
928 940
929 if (type >= INET_DIAG_GETSOCK_MAX) 941 if (type >= IPPROTO_MAX)
930 return; 942 return;
931 943
932 mutex_lock(&inet_diag_table_mutex); 944 mutex_lock(&inet_diag_table_mutex);
@@ -937,7 +949,7 @@ EXPORT_SYMBOL_GPL(inet_diag_unregister);
937 949
938static int __init inet_diag_init(void) 950static int __init inet_diag_init(void)
939{ 951{
940 const int inet_diag_table_size = (INET_DIAG_GETSOCK_MAX * 952 const int inet_diag_table_size = (IPPROTO_MAX *
941 sizeof(struct inet_diag_handler *)); 953 sizeof(struct inet_diag_handler *));
942 int err = -ENOMEM; 954 int err = -ENOMEM;
943 955