Commit 8d07d151 authored by Pavel Emelyanov's avatar Pavel Emelyanov Committed by David S. Miller

inet_diag: Introduce the byte-code run on an inet socket

The upcoming UDP module will require exactly this ability, so just
move the existing code to provide one.
Signed-off-by: default avatarPavel Emelyanov <xemul@parallels.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent efb3cb42
...@@ -135,6 +135,7 @@ struct tcpvegas_info { ...@@ -135,6 +135,7 @@ struct tcpvegas_info {
#ifdef __KERNEL__ #ifdef __KERNEL__
struct sock; struct sock;
struct inet_hashinfo; struct inet_hashinfo;
struct nlattr;
struct inet_diag_handler { struct inet_diag_handler {
struct inet_hashinfo *idiag_hashinfo; struct inet_hashinfo *idiag_hashinfo;
...@@ -144,6 +145,7 @@ struct inet_diag_handler { ...@@ -144,6 +145,7 @@ struct inet_diag_handler {
__u16 idiag_type; __u16 idiag_type;
}; };
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); int inet_diag_check_cookie(struct sock *sk, struct inet_diag_req *req);
extern int inet_diag_register(const struct inet_diag_handler *handler); extern int inet_diag_register(const struct inet_diag_handler *handler);
......
...@@ -449,6 +449,35 @@ static int inet_diag_bc_run(const struct nlattr *_bc, ...@@ -449,6 +449,35 @@ static int inet_diag_bc_run(const struct nlattr *_bc,
return len == 0; return len == 0;
} }
int inet_diag_bc_sk(const struct nlattr *bc, struct sock *sk)
{
struct inet_diag_entry entry;
struct inet_sock *inet = inet_sk(sk);
if (bc == NULL)
return 1;
entry.family = sk->sk_family;
#if defined(CONFIG_IPV6) || defined (CONFIG_IPV6_MODULE)
if (entry.family == AF_INET6) {
struct ipv6_pinfo *np = inet6_sk(sk);
entry.saddr = np->rcv_saddr.s6_addr32;
entry.daddr = np->daddr.s6_addr32;
} else
#endif
{
entry.saddr = &inet->inet_rcv_saddr;
entry.daddr = &inet->inet_daddr;
}
entry.sport = inet->inet_num;
entry.dport = ntohs(inet->inet_dport);
entry.userlocks = sk->sk_userlocks;
return inet_diag_bc_run(bc, &entry);
}
EXPORT_SYMBOL_GPL(inet_diag_bc_sk);
static int valid_cc(const void *bc, int len, int cc) static int valid_cc(const void *bc, int len, int cc)
{ {
while (len >= 0) { while (len >= 0) {
...@@ -509,30 +538,8 @@ static int inet_csk_diag_dump(struct sock *sk, ...@@ -509,30 +538,8 @@ static int inet_csk_diag_dump(struct sock *sk,
struct inet_diag_req *r, struct inet_diag_req *r,
const struct nlattr *bc) const struct nlattr *bc)
{ {
if (bc != NULL) { if (!inet_diag_bc_sk(bc, sk))
struct inet_diag_entry entry; return 0;
struct inet_sock *inet = inet_sk(sk);
entry.family = sk->sk_family;
#if defined(CONFIG_IPV6) || defined (CONFIG_IPV6_MODULE)
if (entry.family == AF_INET6) {
struct ipv6_pinfo *np = inet6_sk(sk);
entry.saddr = np->rcv_saddr.s6_addr32;
entry.daddr = np->daddr.s6_addr32;
} else
#endif
{
entry.saddr = &inet->inet_rcv_saddr;
entry.daddr = &inet->inet_daddr;
}
entry.sport = inet->inet_num;
entry.dport = ntohs(inet->inet_dport);
entry.userlocks = sk->sk_userlocks;
if (!inet_diag_bc_run(bc, &entry))
return 0;
}
return inet_csk_diag_fill(sk, skb, r, return inet_csk_diag_fill(sk, skb, r,
NETLINK_CB(cb->skb).pid, NETLINK_CB(cb->skb).pid,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment