diff options
Diffstat (limited to 'net/ipv4/inet_diag.c')
-rw-r--r-- | net/ipv4/inet_diag.c | 34 |
1 files changed, 24 insertions, 10 deletions
diff --git a/net/ipv4/inet_diag.c b/net/ipv4/inet_diag.c index 985c5730e4fb..457db99c76df 100644 --- a/net/ipv4/inet_diag.c +++ b/net/ipv4/inet_diag.c | |||
@@ -50,9 +50,10 @@ static struct sock *idiagnl; | |||
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 | ||
53 | static int inet_diag_fill(struct sk_buff *skb, struct sock *sk, | 53 | static int inet_csk_diag_fill(struct sock *sk, |
54 | int ext, u32 pid, u32 seq, u16 nlmsg_flags, | 54 | struct sk_buff *skb, |
55 | const struct nlmsghdr *unlh) | 55 | int ext, u32 pid, u32 seq, u16 nlmsg_flags, |
56 | const struct nlmsghdr *unlh) | ||
56 | { | 57 | { |
57 | const struct inet_sock *inet = inet_sk(sk); | 58 | const struct inet_sock *inet = inet_sk(sk); |
58 | const struct inet_connection_sock *icsk = inet_csk(sk); | 59 | const struct inet_connection_sock *icsk = inet_csk(sk); |
@@ -212,6 +213,17 @@ nlmsg_failure: | |||
212 | return -1; | 213 | return -1; |
213 | } | 214 | } |
214 | 215 | ||
216 | static int sk_diag_fill(struct sock *sk, struct sk_buff *skb, | ||
217 | int ext, u32 pid, u32 seq, u16 nlmsg_flags, | ||
218 | const struct nlmsghdr *unlh) | ||
219 | { | ||
220 | if (sk->sk_state == TCP_TIME_WAIT) | ||
221 | return inet_twsk_diag_fill((struct inet_timewait_sock *)sk, | ||
222 | skb, ext, pid, seq, nlmsg_flags, | ||
223 | unlh); | ||
224 | return inet_csk_diag_fill(sk, skb, ext, pid, seq, nlmsg_flags, unlh); | ||
225 | } | ||
226 | |||
215 | static int inet_diag_get_exact(struct sk_buff *in_skb, | 227 | static int inet_diag_get_exact(struct sk_buff *in_skb, |
216 | const struct nlmsghdr *nlh) | 228 | const struct nlmsghdr *nlh) |
217 | { | 229 | { |
@@ -263,7 +275,7 @@ static int inet_diag_get_exact(struct sk_buff *in_skb, | |||
263 | if (!rep) | 275 | if (!rep) |
264 | goto out; | 276 | goto out; |
265 | 277 | ||
266 | if (inet_diag_fill(rep, sk, req->idiag_ext, | 278 | if (sk_diag_fill(sk, rep, req->idiag_ext, |
267 | NETLINK_CB(in_skb).pid, | 279 | NETLINK_CB(in_skb).pid, |
268 | nlh->nlmsg_seq, 0, nlh) <= 0) | 280 | nlh->nlmsg_seq, 0, nlh) <= 0) |
269 | BUG(); | 281 | BUG(); |
@@ -442,8 +454,9 @@ static int inet_diag_bc_audit(const void *bytecode, int bytecode_len) | |||
442 | return len == 0 ? 0 : -EINVAL; | 454 | return len == 0 ? 0 : -EINVAL; |
443 | } | 455 | } |
444 | 456 | ||
445 | static int inet_diag_dump_sock(struct sk_buff *skb, struct sock *sk, | 457 | static int inet_csk_diag_dump(struct sock *sk, |
446 | struct netlink_callback *cb) | 458 | struct sk_buff *skb, |
459 | struct netlink_callback *cb) | ||
447 | { | 460 | { |
448 | struct inet_diag_req *r = NLMSG_DATA(cb->nlh); | 461 | struct inet_diag_req *r = NLMSG_DATA(cb->nlh); |
449 | 462 | ||
@@ -473,8 +486,9 @@ static int inet_diag_dump_sock(struct sk_buff *skb, struct sock *sk, | |||
473 | return 0; | 486 | return 0; |
474 | } | 487 | } |
475 | 488 | ||
476 | return inet_diag_fill(skb, sk, r->idiag_ext, NETLINK_CB(cb->skb).pid, | 489 | return inet_csk_diag_fill(sk, skb, r->idiag_ext, |
477 | cb->nlh->nlmsg_seq, NLM_F_MULTI, cb->nlh); | 490 | NETLINK_CB(cb->skb).pid, |
491 | cb->nlh->nlmsg_seq, NLM_F_MULTI, cb->nlh); | ||
478 | } | 492 | } |
479 | 493 | ||
480 | static int inet_twsk_diag_dump(struct inet_timewait_sock *tw, | 494 | static int inet_twsk_diag_dump(struct inet_timewait_sock *tw, |
@@ -694,7 +708,7 @@ static int inet_diag_dump(struct sk_buff *skb, struct netlink_callback *cb) | |||
694 | cb->args[3] > 0) | 708 | cb->args[3] > 0) |
695 | goto syn_recv; | 709 | goto syn_recv; |
696 | 710 | ||
697 | if (inet_diag_dump_sock(skb, sk, cb) < 0) { | 711 | if (inet_csk_diag_dump(sk, skb, cb) < 0) { |
698 | inet_listen_unlock(hashinfo); | 712 | inet_listen_unlock(hashinfo); |
699 | goto done; | 713 | goto done; |
700 | } | 714 | } |
@@ -750,7 +764,7 @@ skip_listen_ht: | |||
750 | if (r->id.idiag_dport != inet->dport && | 764 | if (r->id.idiag_dport != inet->dport && |
751 | r->id.idiag_dport) | 765 | r->id.idiag_dport) |
752 | goto next_normal; | 766 | goto next_normal; |
753 | if (inet_diag_dump_sock(skb, sk, cb) < 0) { | 767 | if (inet_csk_diag_dump(sk, skb, cb) < 0) { |
754 | read_unlock_bh(&head->lock); | 768 | read_unlock_bh(&head->lock); |
755 | goto done; | 769 | goto done; |
756 | } | 770 | } |