From: Pavel Emelyanov <xemul@parallels.com>
To: David Miller <davem@davemloft.net>,
Linux Netdev List <netdev@vger.kernel.org>
Subject: [PATCH 8/13] inet_diag: Generalize inet_diag dump and get_exact calls
Date: Fri, 09 Dec 2011 20:23:18 +0400 [thread overview]
Message-ID: <4EE235F6.80009@parallels.com> (raw)
In-Reply-To: <4EE23561.5020804@parallels.com>
Introduce two callbacks in inet_diag_handler -- one for dumping all
sockets (with filters) and the other one for dumping a single sk.
Replace direct calls to icsk handlers with indirect calls to callbacks
provided by handlers.
Make existing TCP and DCCP handlers use provided helpers for icsk-s.
The UDP diag module will provide its own.
Signed-off-by: Pavel Emelyanov <xemul@parallels.com>
---
include/linux/inet_diag.h | 18 +++++++++++++++++-
net/dccp/diag.c | 15 ++++++++++++++-
net/ipv4/inet_diag.c | 11 ++++++-----
net/ipv4/tcp_diag.c | 15 ++++++++++++++-
4 files changed, 51 insertions(+), 8 deletions(-)
diff --git a/include/linux/inet_diag.h b/include/linux/inet_diag.h
index eaf5865..78972a1 100644
--- a/include/linux/inet_diag.h
+++ b/include/linux/inet_diag.h
@@ -138,9 +138,18 @@ struct inet_hashinfo;
struct nlattr;
struct nlmsghdr;
struct sk_buff;
+struct netlink_callback;
struct inet_diag_handler {
- struct inet_hashinfo *idiag_hashinfo;
+ void (*dump)(struct sk_buff *skb,
+ struct netlink_callback *cb,
+ struct inet_diag_req *r,
+ struct nlattr *bc);
+
+ int (*dump_one)(struct sk_buff *in_skb,
+ const struct nlmsghdr *nlh,
+ struct inet_diag_req *req);
+
void (*idiag_get_info)(struct sock *sk,
struct inet_diag_msg *r,
void *info);
@@ -152,6 +161,13 @@ int inet_sk_diag_fill(struct sock *sk, struct inet_connection_sock *icsk,
struct sk_buff *skb, struct inet_diag_req *req,
u32 pid, u32 seq, u16 nlmsg_flags,
const struct nlmsghdr *unlh);
+void inet_diag_dump_icsk(struct inet_hashinfo *h, struct sk_buff *skb,
+ struct netlink_callback *cb, struct inet_diag_req *r,
+ struct nlattr *bc);
+int inet_diag_dump_one_icsk(struct inet_hashinfo *hashinfo,
+ struct sk_buff *in_skb, const struct nlmsghdr *nlh,
+ struct inet_diag_req *req);
+
int inet_diag_bc_sk(const struct nlattr *_bc, struct sock *sk);
int inet_diag_check_cookie(struct sock *sk, struct inet_diag_req *req);
diff --git a/net/dccp/diag.c b/net/dccp/diag.c
index 9343f52..e29214d 100644
--- a/net/dccp/diag.c
+++ b/net/dccp/diag.c
@@ -48,8 +48,21 @@ static void dccp_diag_get_info(struct sock *sk, struct inet_diag_msg *r,
dccp_get_info(sk, _info);
}
+static void dccp_diag_dump(struct sk_buff *skb, struct netlink_callback *cb,
+ struct inet_diag_req *r, struct nlattr *bc)
+{
+ inet_diag_dump_icsk(&dccp_hashinfo, skb, cb, r, bc);
+}
+
+static int dccp_diag_dump_one(struct sk_buff *in_skb, const struct nlmsghdr *nlh,
+ struct inet_diag_req *req)
+{
+ return inet_diag_dump_one_icsk(&dccp_hashinfo, in_skb, nlh, req);
+}
+
static const struct inet_diag_handler dccp_diag_handler = {
- .idiag_hashinfo = &dccp_hashinfo,
+ .dump = dccp_diag_dump,
+ .dump_one = dccp_diag_dump_one,
.idiag_get_info = dccp_diag_get_info,
.idiag_type = IPPROTO_DCCP,
};
diff --git a/net/ipv4/inet_diag.c b/net/ipv4/inet_diag.c
index dc8611e..9b3e0b1 100644
--- a/net/ipv4/inet_diag.c
+++ b/net/ipv4/inet_diag.c
@@ -273,7 +273,7 @@ int inet_diag_check_cookie(struct sock *sk, struct inet_diag_req *req)
}
EXPORT_SYMBOL_GPL(inet_diag_check_cookie);
-static int inet_diag_dump_one_icsk(struct inet_hashinfo *hashinfo, struct sk_buff *in_skb,
+int inet_diag_dump_one_icsk(struct inet_hashinfo *hashinfo, struct sk_buff *in_skb,
const struct nlmsghdr *nlh, struct inet_diag_req *req)
{
int err;
@@ -339,6 +339,7 @@ out:
out_nosk:
return err;
}
+EXPORT_SYMBOL_GPL(inet_diag_dump_one_icsk);
static int inet_diag_get_exact(struct sk_buff *in_skb,
const struct nlmsghdr *nlh,
@@ -351,8 +352,7 @@ static int inet_diag_get_exact(struct sk_buff *in_skb,
if (IS_ERR(handler))
err = PTR_ERR(handler);
else
- err = inet_diag_dump_one_icsk(handler->idiag_hashinfo,
- in_skb, nlh, req);
+ err = handler->dump_one(in_skb, nlh, req);
inet_diag_unlock_handler(handler);
return err;
@@ -731,7 +731,7 @@ out:
return err;
}
-static void inet_diag_dump_icsk(struct inet_hashinfo *hashinfo, struct sk_buff *skb,
+void inet_diag_dump_icsk(struct inet_hashinfo *hashinfo, struct sk_buff *skb,
struct netlink_callback *cb, struct inet_diag_req *r, struct nlattr *bc)
{
int i, num;
@@ -880,6 +880,7 @@ done:
out:
;
}
+EXPORT_SYMBOL_GPL(inet_diag_dump_icsk);
static int __inet_diag_dump(struct sk_buff *skb, struct netlink_callback *cb,
struct inet_diag_req *r, struct nlattr *bc)
@@ -888,7 +889,7 @@ static int __inet_diag_dump(struct sk_buff *skb, struct netlink_callback *cb,
handler = inet_diag_lock_handler(r->sdiag_protocol);
if (!IS_ERR(handler))
- inet_diag_dump_icsk(handler->idiag_hashinfo, skb, cb, r, bc);
+ handler->dump(skb, cb, r, bc);
inet_diag_unlock_handler(handler);
return skb->len;
diff --git a/net/ipv4/tcp_diag.c b/net/ipv4/tcp_diag.c
index 42e6bec..6334b1f 100644
--- a/net/ipv4/tcp_diag.c
+++ b/net/ipv4/tcp_diag.c
@@ -34,8 +34,21 @@ static void tcp_diag_get_info(struct sock *sk, struct inet_diag_msg *r,
tcp_get_info(sk, info);
}
+static void tcp_diag_dump(struct sk_buff *skb, struct netlink_callback *cb,
+ struct inet_diag_req *r, struct nlattr *bc)
+{
+ inet_diag_dump_icsk(&tcp_hashinfo, skb, cb, r, bc);
+}
+
+static int tcp_diag_dump_one(struct sk_buff *in_skb, const struct nlmsghdr *nlh,
+ struct inet_diag_req *req)
+{
+ return inet_diag_dump_one_icsk(&tcp_hashinfo, in_skb, nlh, req);
+}
+
static const struct inet_diag_handler tcp_diag_handler = {
- .idiag_hashinfo = &tcp_hashinfo,
+ .dump = tcp_diag_dump,
+ .dump_one = tcp_diag_dump_one,
.idiag_get_info = tcp_diag_get_info,
.idiag_type = IPPROTO_TCP,
};
--
1.5.5.6
next prev parent reply other threads:[~2011-12-09 16:23 UTC|newest]
Thread overview: 31+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-12-09 16:20 [PATCH 0/13] Implement dumping udp sockets via sock_diag netlink Pavel Emelyanov
2011-12-09 16:21 ` [PATCH 1/13] inet_diag: Remove indirect sizeof from inet diag handlers Pavel Emelyanov
2011-12-09 16:21 ` [PATCH 2/13] inet_diag: Reduce the number of args for bytecode run routine Pavel Emelyanov
2011-12-09 16:21 ` [PATCH 3/13] inet_diag: Export inet diag cookie checking routine Pavel Emelyanov
2011-12-09 16:22 ` [PATCH 4/13] inet_diag: Split inet_diag_get_exact into parts Pavel Emelyanov
2011-12-09 16:22 ` [PATCH 5/13] " Pavel Emelyanov
2011-12-09 16:22 ` [PATCH 6/13] inet_diag: Introduce the byte-code run on an inet socket Pavel Emelyanov
2011-12-09 16:23 ` [PATCH 7/13] inet_diag: Introduce the inet socket dumping routine Pavel Emelyanov
2011-12-09 16:23 ` Pavel Emelyanov [this message]
2011-12-09 16:23 ` [PATCH 9/13] udp: Export code sk lookup routines Pavel Emelyanov
2011-12-09 16:23 ` [PATCH 10/13] udp_diag: Basic skeleton Pavel Emelyanov
2011-12-09 16:24 ` [PATCH 11/13] udp_diag: Implement the get_exact dumping functionality Pavel Emelyanov
2011-12-09 21:48 ` Eric Dumazet
2011-12-10 9:07 ` Pavel Emelyanov
2011-12-10 9:33 ` [PATCH 1/2] udp_diag: Make it module when ipv6 is a module Pavel Emelyanov
2011-12-10 9:35 ` [PATCH 2/2] udp_diag: Fix the !ipv6 case Pavel Emelyanov
2011-12-10 11:02 ` Eric Dumazet
2011-12-10 18:15 ` David Miller
2011-12-10 19:48 ` [PATCH net-next] net: use IS_ENABLED(CONFIG_IPV6) Eric Dumazet
2011-12-10 22:00 ` [PATCH net-next] drivers/net: " Joe Perches
2011-12-10 22:29 ` Eric Dumazet
2011-12-11 0:51 ` Joe Perches
2011-12-11 8:52 ` Eric Dumazet
2011-12-13 0:06 ` Joe Perches
2011-12-11 23:34 ` [PATCH net-next] net: " David Miller
2011-12-10 11:00 ` [PATCH 1/2] udp_diag: Make it module when ipv6 is a module Eric Dumazet
2011-12-10 18:15 ` David Miller
2011-12-09 16:24 ` [PATCH 12/13] udp_diag: Implement the dump-all functionality Pavel Emelyanov
2011-12-09 16:24 ` [PATCH 13/13] udp_diag: Wire the udp_diag module into kbuild Pavel Emelyanov
2011-12-09 16:26 ` [PATCH] iproute: Dump UDP sockets via netlink Pavel Emelyanov
2011-12-09 19:19 ` [PATCH 0/13] Implement dumping udp sockets via sock_diag netlink David Miller
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4EE235F6.80009@parallels.com \
--to=xemul@parallels.com \
--cc=davem@davemloft.net \
--cc=netdev@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.