aboutsummaryrefslogtreecommitdiffstats
path: root/net/ipv4/inet_diag.c
diff options
context:
space:
mode:
authorPavel Emelyanov <xemul@parallels.com>2011-12-14 21:43:44 -0500
committerDavid S. Miller <davem@davemloft.net>2011-12-16 13:48:27 -0500
commitf65c1b534b99aef1809b893387b295963821549f (patch)
tree0718e1598b4d01c4c1817a3c663a312616f0dddd /net/ipv4/inet_diag.c
parentaec8dc62f66199aef153d86e1f90d9c1d14696e3 (diff)
sock_diag: Generalize requests cookies managements
The sk address is used as a cookie between dump/get_exact calls. It will be required for unix socket sdumping, so move it from inet_diag to sock_diag. Signed-off-by: Pavel Emelyanov <xemul@parallels.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipv4/inet_diag.c')
-rw-r--r--net/ipv4/inet_diag.c23
1 files changed, 4 insertions, 19 deletions
diff --git a/net/ipv4/inet_diag.c b/net/ipv4/inet_diag.c
index fa27313765f3..fb2e47ff59f7 100644
--- a/net/ipv4/inet_diag.c
+++ b/net/ipv4/inet_diag.c
@@ -102,8 +102,7 @@ int inet_sk_diag_fill(struct sock *sk, struct inet_connection_sock *icsk,
102 r->idiag_retrans = 0; 102 r->idiag_retrans = 0;
103 103
104 r->id.idiag_if = sk->sk_bound_dev_if; 104 r->id.idiag_if = sk->sk_bound_dev_if;
105 r->id.idiag_cookie[0] = (u32)(unsigned long)sk; 105 sock_diag_save_cookie(sk, r->id.idiag_cookie);
106 r->id.idiag_cookie[1] = (u32)(((unsigned long)sk >> 31) >> 1);
107 106
108 r->id.idiag_sport = inet->inet_sport; 107 r->id.idiag_sport = inet->inet_sport;
109 r->id.idiag_dport = inet->inet_dport; 108 r->id.idiag_dport = inet->inet_dport;
@@ -221,8 +220,7 @@ static int inet_twsk_diag_fill(struct inet_timewait_sock *tw,
221 r->idiag_family = tw->tw_family; 220 r->idiag_family = tw->tw_family;
222 r->idiag_retrans = 0; 221 r->idiag_retrans = 0;
223 r->id.idiag_if = tw->tw_bound_dev_if; 222 r->id.idiag_if = tw->tw_bound_dev_if;
224 r->id.idiag_cookie[0] = (u32)(unsigned long)tw; 223 sock_diag_save_cookie(tw, r->id.idiag_cookie);
225 r->id.idiag_cookie[1] = (u32)(((unsigned long)tw >> 31) >> 1);
226 r->id.idiag_sport = tw->tw_sport; 224 r->id.idiag_sport = tw->tw_sport;
227 r->id.idiag_dport = tw->tw_dport; 225 r->id.idiag_dport = tw->tw_dport;
228 r->id.idiag_src[0] = tw->tw_rcv_saddr; 226 r->id.idiag_src[0] = tw->tw_rcv_saddr;
@@ -261,18 +259,6 @@ static int sk_diag_fill(struct sock *sk, struct sk_buff *skb,
261 return inet_csk_diag_fill(sk, skb, r, pid, seq, nlmsg_flags, unlh); 259 return inet_csk_diag_fill(sk, skb, r, pid, seq, nlmsg_flags, unlh);
262} 260}
263 261
264int inet_diag_check_cookie(struct sock *sk, struct inet_diag_req *req)
265{
266 if ((req->id.idiag_cookie[0] != INET_DIAG_NOCOOKIE ||
267 req->id.idiag_cookie[1] != INET_DIAG_NOCOOKIE) &&
268 ((u32)(unsigned long)sk != req->id.idiag_cookie[0] ||
269 (u32)((((unsigned long)sk) >> 31) >> 1) != req->id.idiag_cookie[1]))
270 return -ESTALE;
271 else
272 return 0;
273}
274EXPORT_SYMBOL_GPL(inet_diag_check_cookie);
275
276int inet_diag_dump_one_icsk(struct inet_hashinfo *hashinfo, struct sk_buff *in_skb, 262int inet_diag_dump_one_icsk(struct inet_hashinfo *hashinfo, struct sk_buff *in_skb,
277 const struct nlmsghdr *nlh, struct inet_diag_req *req) 263 const struct nlmsghdr *nlh, struct inet_diag_req *req)
278{ 264{
@@ -304,7 +290,7 @@ int inet_diag_dump_one_icsk(struct inet_hashinfo *hashinfo, struct sk_buff *in_s
304 if (sk == NULL) 290 if (sk == NULL)
305 goto out_nosk; 291 goto out_nosk;
306 292
307 err = inet_diag_check_cookie(sk, req); 293 err = sock_diag_check_cookie(sk, req->id.idiag_cookie);
308 if (err) 294 if (err)
309 goto out; 295 goto out;
310 296
@@ -617,8 +603,7 @@ static int inet_diag_fill_req(struct sk_buff *skb, struct sock *sk,
617 r->idiag_retrans = req->retrans; 603 r->idiag_retrans = req->retrans;
618 604
619 r->id.idiag_if = sk->sk_bound_dev_if; 605 r->id.idiag_if = sk->sk_bound_dev_if;
620 r->id.idiag_cookie[0] = (u32)(unsigned long)req; 606 sock_diag_save_cookie(req, r->id.idiag_cookie);
621 r->id.idiag_cookie[1] = (u32)(((unsigned long)req >> 31) >> 1);
622 607
623 tmo = req->expires - jiffies; 608 tmo = req->expires - jiffies;
624 if (tmo < 0) 609 if (tmo < 0)