diff options
author | Pavel Emelyanov | 2011-12-09 06:22:44 +0000 |
---|---|---|
committer | David S. Miller | 2011-12-09 14:14:08 -0500 |
commit | 8d07d1518a074a08b90be02eee5ee15e60ac9779 (patch) | |
tree | 2409c19b8dc9b5cedf4160900e87ea987c2f892a | |
parent | efb3cb428dcde2356802b3f93e152efa7abc5a62 (diff) |
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: Pavel Emelyanov <xemul@parallels.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | include/linux/inet_diag.h | 2 | ||||
-rw-r--r-- | net/ipv4/inet_diag.c | 55 |
2 files changed, 33 insertions, 24 deletions
diff --git a/include/linux/inet_diag.h b/include/linux/inet_diag.h index 503674738368..907c899bd41b 100644 --- a/include/linux/inet_diag.h +++ b/include/linux/inet_diag.h @@ -135,6 +135,7 @@ struct tcpvegas_info { #ifdef __KERNEL__ struct sock; struct inet_hashinfo; +struct nlattr; struct inet_diag_handler { struct inet_hashinfo *idiag_hashinfo; @@ -144,6 +145,7 @@ struct inet_diag_handler { __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); extern int inet_diag_register(const struct inet_diag_handler *handler); diff --git a/net/ipv4/inet_diag.c b/net/ipv4/inet_diag.c index f50df2ed9af5..08e54989b041 100644 --- a/net/ipv4/inet_diag.c +++ b/net/ipv4/inet_diag.c @@ -449,6 +449,35 @@ static int inet_diag_bc_run(const struct nlattr *_bc, 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) { while (len >= 0) { @@ -509,30 +538,8 @@ static int inet_csk_diag_dump(struct sock *sk, struct inet_diag_req *r, const struct nlattr *bc) { - if (bc != NULL) { - struct inet_diag_entry entry; - 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; - } + if (!inet_diag_bc_sk(bc, sk)) + return 0; return inet_csk_diag_fill(sk, skb, r, NETLINK_CB(cb->skb).pid, |