forked from Minki/linux
net: diag: split inet_diag_dump_one_icsk into two
Currently, inet_diag_dump_one_icsk finds a socket and then dumps its information to userspace. Split it into a part that finds the socket and a part that dumps the information. Signed-off-by: Lorenzo Colitti <lorenzo@google.com> Acked-by: Eric Dumazet <edumazet@google.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
fec65bd4e8
commit
b613f56ec9
@ -3,6 +3,7 @@
|
||||
|
||||
#include <uapi/linux/inet_diag.h>
|
||||
|
||||
struct net;
|
||||
struct sock;
|
||||
struct inet_hashinfo;
|
||||
struct nlattr;
|
||||
@ -41,6 +42,10 @@ int inet_diag_dump_one_icsk(struct inet_hashinfo *hashinfo,
|
||||
struct sk_buff *in_skb, const struct nlmsghdr *nlh,
|
||||
const struct inet_diag_req_v2 *req);
|
||||
|
||||
struct sock *inet_diag_find_one_icsk(struct net *net,
|
||||
struct inet_hashinfo *hashinfo,
|
||||
const struct inet_diag_req_v2 *req);
|
||||
|
||||
int inet_diag_bc_sk(const struct nlattr *_bc, struct sock *sk);
|
||||
|
||||
extern int inet_diag_register(const struct inet_diag_handler *handler);
|
||||
|
@ -350,17 +350,12 @@ static int sk_diag_fill(struct sock *sk, struct sk_buff *skb,
|
||||
nlmsg_flags, unlh);
|
||||
}
|
||||
|
||||
int inet_diag_dump_one_icsk(struct inet_hashinfo *hashinfo,
|
||||
struct sk_buff *in_skb,
|
||||
const struct nlmsghdr *nlh,
|
||||
const struct inet_diag_req_v2 *req)
|
||||
struct sock *inet_diag_find_one_icsk(struct net *net,
|
||||
struct inet_hashinfo *hashinfo,
|
||||
const struct inet_diag_req_v2 *req)
|
||||
{
|
||||
struct net *net = sock_net(in_skb->sk);
|
||||
struct sk_buff *rep;
|
||||
struct sock *sk;
|
||||
int err;
|
||||
|
||||
err = -EINVAL;
|
||||
if (req->sdiag_family == AF_INET)
|
||||
sk = inet_lookup(net, hashinfo, req->id.idiag_dst[0],
|
||||
req->id.idiag_dport, req->id.idiag_src[0],
|
||||
@ -375,15 +370,33 @@ int inet_diag_dump_one_icsk(struct inet_hashinfo *hashinfo,
|
||||
req->id.idiag_if);
|
||||
#endif
|
||||
else
|
||||
goto out_nosk;
|
||||
return ERR_PTR(-EINVAL);
|
||||
|
||||
err = -ENOENT;
|
||||
if (!sk)
|
||||
goto out_nosk;
|
||||
return ERR_PTR(-ENOENT);
|
||||
|
||||
err = sock_diag_check_cookie(sk, req->id.idiag_cookie);
|
||||
if (err)
|
||||
goto out;
|
||||
if (sock_diag_check_cookie(sk, req->id.idiag_cookie)) {
|
||||
sock_gen_put(sk);
|
||||
return ERR_PTR(-ENOENT);
|
||||
}
|
||||
|
||||
return sk;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(inet_diag_find_one_icsk);
|
||||
|
||||
int inet_diag_dump_one_icsk(struct inet_hashinfo *hashinfo,
|
||||
struct sk_buff *in_skb,
|
||||
const struct nlmsghdr *nlh,
|
||||
const struct inet_diag_req_v2 *req)
|
||||
{
|
||||
struct net *net = sock_net(in_skb->sk);
|
||||
struct sk_buff *rep;
|
||||
struct sock *sk;
|
||||
int err;
|
||||
|
||||
sk = inet_diag_find_one_icsk(net, hashinfo, req);
|
||||
if (IS_ERR(sk))
|
||||
return PTR_ERR(sk);
|
||||
|
||||
rep = nlmsg_new(inet_sk_attr_size(), GFP_KERNEL);
|
||||
if (!rep) {
|
||||
@ -409,7 +422,6 @@ out:
|
||||
if (sk)
|
||||
sock_gen_put(sk);
|
||||
|
||||
out_nosk:
|
||||
return err;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(inet_diag_dump_one_icsk);
|
||||
|
Loading…
Reference in New Issue
Block a user