ipv4: Missing sk_nulls_node_init() in ping_unhash().
[pandora-kernel.git] / net / ipv4 / inet_diag.c
1 /*
2  * inet_diag.c  Module for monitoring INET transport protocols sockets.
3  *
4  * Authors:     Alexey Kuznetsov, <kuznet@ms2.inr.ac.ru>
5  *
6  *      This program is free software; you can redistribute it and/or
7  *      modify it under the terms of the GNU General Public License
8  *      as published by the Free Software Foundation; either version
9  *      2 of the License, or (at your option) any later version.
10  */
11
12 #include <linux/kernel.h>
13 #include <linux/module.h>
14 #include <linux/types.h>
15 #include <linux/fcntl.h>
16 #include <linux/random.h>
17 #include <linux/slab.h>
18 #include <linux/cache.h>
19 #include <linux/init.h>
20 #include <linux/time.h>
21
22 #include <net/icmp.h>
23 #include <net/tcp.h>
24 #include <net/ipv6.h>
25 #include <net/inet_common.h>
26 #include <net/inet_connection_sock.h>
27 #include <net/inet_hashtables.h>
28 #include <net/inet_timewait_sock.h>
29 #include <net/inet6_hashtables.h>
30 #include <net/netlink.h>
31
32 #include <linux/inet.h>
33 #include <linux/stddef.h>
34
35 #include <linux/inet_diag.h>
36
37 static const struct inet_diag_handler **inet_diag_table;
38
39 struct inet_diag_entry {
40         __be32 *saddr;
41         __be32 *daddr;
42         u16 sport;
43         u16 dport;
44         u16 family;
45         u16 userlocks;
46 };
47
48 static struct sock *idiagnl;
49
50 #define INET_DIAG_PUT(skb, attrtype, attrlen) \
51         RTA_DATA(__RTA_PUT(skb, attrtype, attrlen))
52
53 static DEFINE_MUTEX(inet_diag_table_mutex);
54
55 static const struct inet_diag_handler *inet_diag_lock_handler(int type)
56 {
57         if (!inet_diag_table[type])
58                 request_module("net-pf-%d-proto-%d-type-%d", PF_NETLINK,
59                                NETLINK_INET_DIAG, type);
60
61         mutex_lock(&inet_diag_table_mutex);
62         if (!inet_diag_table[type])
63                 return ERR_PTR(-ENOENT);
64
65         return inet_diag_table[type];
66 }
67
68 static inline void inet_diag_unlock_handler(
69         const struct inet_diag_handler *handler)
70 {
71         mutex_unlock(&inet_diag_table_mutex);
72 }
73
74 static int inet_csk_diag_fill(struct sock *sk,
75                               struct sk_buff *skb,
76                               int ext, u32 pid, u32 seq, u16 nlmsg_flags,
77                               const struct nlmsghdr *unlh)
78 {
79         const struct inet_sock *inet = inet_sk(sk);
80         const struct inet_connection_sock *icsk = inet_csk(sk);
81         struct inet_diag_msg *r;
82         struct nlmsghdr  *nlh;
83         void *info = NULL;
84         struct inet_diag_meminfo  *minfo = NULL;
85         unsigned char    *b = skb_tail_pointer(skb);
86         const struct inet_diag_handler *handler;
87
88         handler = inet_diag_table[unlh->nlmsg_type];
89         BUG_ON(handler == NULL);
90
91         nlh = NLMSG_PUT(skb, pid, seq, unlh->nlmsg_type, sizeof(*r));
92         nlh->nlmsg_flags = nlmsg_flags;
93
94         r = NLMSG_DATA(nlh);
95         BUG_ON(sk->sk_state == TCP_TIME_WAIT);
96
97         if (ext & (1 << (INET_DIAG_MEMINFO - 1)))
98                 minfo = INET_DIAG_PUT(skb, INET_DIAG_MEMINFO, sizeof(*minfo));
99
100         if (ext & (1 << (INET_DIAG_INFO - 1)))
101                 info = INET_DIAG_PUT(skb, INET_DIAG_INFO,
102                                      handler->idiag_info_size);
103
104         if ((ext & (1 << (INET_DIAG_CONG - 1))) && icsk->icsk_ca_ops) {
105                 const size_t len = strlen(icsk->icsk_ca_ops->name);
106
107                 strcpy(INET_DIAG_PUT(skb, INET_DIAG_CONG, len + 1),
108                        icsk->icsk_ca_ops->name);
109         }
110
111         r->idiag_family = sk->sk_family;
112         r->idiag_state = sk->sk_state;
113         r->idiag_timer = 0;
114         r->idiag_retrans = 0;
115
116         r->id.idiag_if = sk->sk_bound_dev_if;
117         r->id.idiag_cookie[0] = (u32)(unsigned long)sk;
118         r->id.idiag_cookie[1] = (u32)(((unsigned long)sk >> 31) >> 1);
119
120         r->id.idiag_sport = inet->inet_sport;
121         r->id.idiag_dport = inet->inet_dport;
122
123         memset(&r->id.idiag_src, 0, sizeof(r->id.idiag_src));
124         memset(&r->id.idiag_dst, 0, sizeof(r->id.idiag_dst));
125
126         r->id.idiag_src[0] = inet->inet_rcv_saddr;
127         r->id.idiag_dst[0] = inet->inet_daddr;
128
129         /* IPv6 dual-stack sockets use inet->tos for IPv4 connections,
130          * hence this needs to be included regardless of socket family.
131          */
132         if (ext & (1 << (INET_DIAG_TOS - 1)))
133                 RTA_PUT_U8(skb, INET_DIAG_TOS, inet->tos);
134
135 #if defined(CONFIG_IPV6) || defined (CONFIG_IPV6_MODULE)
136         if (r->idiag_family == AF_INET6) {
137                 const struct ipv6_pinfo *np = inet6_sk(sk);
138
139                 if (ext & (1 << (INET_DIAG_TCLASS - 1)))
140                         RTA_PUT_U8(skb, INET_DIAG_TCLASS, np->tclass);
141
142                 ipv6_addr_copy((struct in6_addr *)r->id.idiag_src,
143                                &np->rcv_saddr);
144                 ipv6_addr_copy((struct in6_addr *)r->id.idiag_dst,
145                                &np->daddr);
146         }
147 #endif
148
149 #define EXPIRES_IN_MS(tmo)  DIV_ROUND_UP((tmo - jiffies) * 1000, HZ)
150
151         if (icsk->icsk_pending == ICSK_TIME_RETRANS) {
152                 r->idiag_timer = 1;
153                 r->idiag_retrans = icsk->icsk_retransmits;
154                 r->idiag_expires = EXPIRES_IN_MS(icsk->icsk_timeout);
155         } else if (icsk->icsk_pending == ICSK_TIME_PROBE0) {
156                 r->idiag_timer = 4;
157                 r->idiag_retrans = icsk->icsk_probes_out;
158                 r->idiag_expires = EXPIRES_IN_MS(icsk->icsk_timeout);
159         } else if (timer_pending(&sk->sk_timer)) {
160                 r->idiag_timer = 2;
161                 r->idiag_retrans = icsk->icsk_probes_out;
162                 r->idiag_expires = EXPIRES_IN_MS(sk->sk_timer.expires);
163         } else {
164                 r->idiag_timer = 0;
165                 r->idiag_expires = 0;
166         }
167 #undef EXPIRES_IN_MS
168
169         r->idiag_uid = sock_i_uid(sk);
170         r->idiag_inode = sock_i_ino(sk);
171
172         if (minfo) {
173                 minfo->idiag_rmem = sk_rmem_alloc_get(sk);
174                 minfo->idiag_wmem = sk->sk_wmem_queued;
175                 minfo->idiag_fmem = sk->sk_forward_alloc;
176                 minfo->idiag_tmem = sk_wmem_alloc_get(sk);
177         }
178
179         handler->idiag_get_info(sk, r, info);
180
181         if (sk->sk_state < TCP_TIME_WAIT &&
182             icsk->icsk_ca_ops && icsk->icsk_ca_ops->get_info)
183                 icsk->icsk_ca_ops->get_info(sk, ext, skb);
184
185         nlh->nlmsg_len = skb_tail_pointer(skb) - b;
186         return skb->len;
187
188 rtattr_failure:
189 nlmsg_failure:
190         nlmsg_trim(skb, b);
191         return -EMSGSIZE;
192 }
193
194 static int inet_twsk_diag_fill(struct inet_timewait_sock *tw,
195                                struct sk_buff *skb, int ext, u32 pid,
196                                u32 seq, u16 nlmsg_flags,
197                                const struct nlmsghdr *unlh)
198 {
199         long tmo;
200         struct inet_diag_msg *r;
201         const unsigned char *previous_tail = skb_tail_pointer(skb);
202         struct nlmsghdr *nlh = NLMSG_PUT(skb, pid, seq,
203                                          unlh->nlmsg_type, sizeof(*r));
204
205         r = NLMSG_DATA(nlh);
206         BUG_ON(tw->tw_state != TCP_TIME_WAIT);
207
208         nlh->nlmsg_flags = nlmsg_flags;
209
210         tmo = tw->tw_ttd - jiffies;
211         if (tmo < 0)
212                 tmo = 0;
213
214         r->idiag_family       = tw->tw_family;
215         r->idiag_retrans      = 0;
216
217         r->id.idiag_if        = tw->tw_bound_dev_if;
218         r->id.idiag_cookie[0] = (u32)(unsigned long)tw;
219         r->id.idiag_cookie[1] = (u32)(((unsigned long)tw >> 31) >> 1);
220
221         r->id.idiag_sport     = tw->tw_sport;
222         r->id.idiag_dport     = tw->tw_dport;
223
224         memset(&r->id.idiag_src, 0, sizeof(r->id.idiag_src));
225         memset(&r->id.idiag_dst, 0, sizeof(r->id.idiag_dst));
226
227         r->id.idiag_src[0]    = tw->tw_rcv_saddr;
228         r->id.idiag_dst[0]    = tw->tw_daddr;
229
230         r->idiag_state        = tw->tw_substate;
231         r->idiag_timer        = 3;
232         r->idiag_expires      = DIV_ROUND_UP(tmo * 1000, HZ);
233         r->idiag_rqueue       = 0;
234         r->idiag_wqueue       = 0;
235         r->idiag_uid          = 0;
236         r->idiag_inode        = 0;
237 #if defined(CONFIG_IPV6) || defined (CONFIG_IPV6_MODULE)
238         if (tw->tw_family == AF_INET6) {
239                 const struct inet6_timewait_sock *tw6 =
240                                                 inet6_twsk((struct sock *)tw);
241
242                 ipv6_addr_copy((struct in6_addr *)r->id.idiag_src,
243                                &tw6->tw_v6_rcv_saddr);
244                 ipv6_addr_copy((struct in6_addr *)r->id.idiag_dst,
245                                &tw6->tw_v6_daddr);
246         }
247 #endif
248         nlh->nlmsg_len = skb_tail_pointer(skb) - previous_tail;
249         return skb->len;
250 nlmsg_failure:
251         nlmsg_trim(skb, previous_tail);
252         return -EMSGSIZE;
253 }
254
255 static int sk_diag_fill(struct sock *sk, struct sk_buff *skb,
256                         int ext, u32 pid, u32 seq, u16 nlmsg_flags,
257                         const struct nlmsghdr *unlh)
258 {
259         if (sk->sk_state == TCP_TIME_WAIT)
260                 return inet_twsk_diag_fill((struct inet_timewait_sock *)sk,
261                                            skb, ext, pid, seq, nlmsg_flags,
262                                            unlh);
263         return inet_csk_diag_fill(sk, skb, ext, pid, seq, nlmsg_flags, unlh);
264 }
265
266 static int inet_diag_get_exact(struct sk_buff *in_skb,
267                                const struct nlmsghdr *nlh)
268 {
269         int err;
270         struct sock *sk;
271         struct inet_diag_req *req = NLMSG_DATA(nlh);
272         struct sk_buff *rep;
273         struct inet_hashinfo *hashinfo;
274         const struct inet_diag_handler *handler;
275
276         handler = inet_diag_lock_handler(nlh->nlmsg_type);
277         if (IS_ERR(handler)) {
278                 err = PTR_ERR(handler);
279                 goto unlock;
280         }
281
282         hashinfo = handler->idiag_hashinfo;
283         err = -EINVAL;
284
285         if (req->idiag_family == AF_INET) {
286                 sk = inet_lookup(&init_net, hashinfo, req->id.idiag_dst[0],
287                                  req->id.idiag_dport, req->id.idiag_src[0],
288                                  req->id.idiag_sport, req->id.idiag_if);
289         }
290 #if defined(CONFIG_IPV6) || defined (CONFIG_IPV6_MODULE)
291         else if (req->idiag_family == AF_INET6) {
292                 sk = inet6_lookup(&init_net, hashinfo,
293                                   (struct in6_addr *)req->id.idiag_dst,
294                                   req->id.idiag_dport,
295                                   (struct in6_addr *)req->id.idiag_src,
296                                   req->id.idiag_sport,
297                                   req->id.idiag_if);
298         }
299 #endif
300         else {
301                 goto unlock;
302         }
303
304         err = -ENOENT;
305         if (sk == NULL)
306                 goto unlock;
307
308         err = -ESTALE;
309         if ((req->id.idiag_cookie[0] != INET_DIAG_NOCOOKIE ||
310              req->id.idiag_cookie[1] != INET_DIAG_NOCOOKIE) &&
311             ((u32)(unsigned long)sk != req->id.idiag_cookie[0] ||
312              (u32)((((unsigned long)sk) >> 31) >> 1) != req->id.idiag_cookie[1]))
313                 goto out;
314
315         err = -ENOMEM;
316         rep = alloc_skb(NLMSG_SPACE((sizeof(struct inet_diag_msg) +
317                                      sizeof(struct inet_diag_meminfo) +
318                                      handler->idiag_info_size + 64)),
319                         GFP_KERNEL);
320         if (!rep)
321                 goto out;
322
323         err = sk_diag_fill(sk, rep, req->idiag_ext,
324                            NETLINK_CB(in_skb).pid,
325                            nlh->nlmsg_seq, 0, nlh);
326         if (err < 0) {
327                 WARN_ON(err == -EMSGSIZE);
328                 kfree_skb(rep);
329                 goto out;
330         }
331         err = netlink_unicast(idiagnl, rep, NETLINK_CB(in_skb).pid,
332                               MSG_DONTWAIT);
333         if (err > 0)
334                 err = 0;
335
336 out:
337         if (sk) {
338                 if (sk->sk_state == TCP_TIME_WAIT)
339                         inet_twsk_put((struct inet_timewait_sock *)sk);
340                 else
341                         sock_put(sk);
342         }
343 unlock:
344         inet_diag_unlock_handler(handler);
345         return err;
346 }
347
348 static int bitstring_match(const __be32 *a1, const __be32 *a2, int bits)
349 {
350         int words = bits >> 5;
351
352         bits &= 0x1f;
353
354         if (words) {
355                 if (memcmp(a1, a2, words << 2))
356                         return 0;
357         }
358         if (bits) {
359                 __be32 w1, w2;
360                 __be32 mask;
361
362                 w1 = a1[words];
363                 w2 = a2[words];
364
365                 mask = htonl((0xffffffff) << (32 - bits));
366
367                 if ((w1 ^ w2) & mask)
368                         return 0;
369         }
370
371         return 1;
372 }
373
374
375 static int inet_diag_bc_run(const void *bc, int len,
376                             const struct inet_diag_entry *entry)
377 {
378         while (len > 0) {
379                 int yes = 1;
380                 const struct inet_diag_bc_op *op = bc;
381
382                 switch (op->code) {
383                 case INET_DIAG_BC_NOP:
384                         break;
385                 case INET_DIAG_BC_JMP:
386                         yes = 0;
387                         break;
388                 case INET_DIAG_BC_S_GE:
389                         yes = entry->sport >= op[1].no;
390                         break;
391                 case INET_DIAG_BC_S_LE:
392                         yes = entry->sport <= op[1].no;
393                         break;
394                 case INET_DIAG_BC_D_GE:
395                         yes = entry->dport >= op[1].no;
396                         break;
397                 case INET_DIAG_BC_D_LE:
398                         yes = entry->dport <= op[1].no;
399                         break;
400                 case INET_DIAG_BC_AUTO:
401                         yes = !(entry->userlocks & SOCK_BINDPORT_LOCK);
402                         break;
403                 case INET_DIAG_BC_S_COND:
404                 case INET_DIAG_BC_D_COND: {
405                         struct inet_diag_hostcond *cond;
406                         __be32 *addr;
407
408                         cond = (struct inet_diag_hostcond *)(op + 1);
409                         if (cond->port != -1 &&
410                             cond->port != (op->code == INET_DIAG_BC_S_COND ?
411                                              entry->sport : entry->dport)) {
412                                 yes = 0;
413                                 break;
414                         }
415
416                         if (cond->prefix_len == 0)
417                                 break;
418
419                         if (op->code == INET_DIAG_BC_S_COND)
420                                 addr = entry->saddr;
421                         else
422                                 addr = entry->daddr;
423
424                         if (bitstring_match(addr, cond->addr,
425                                             cond->prefix_len))
426                                 break;
427                         if (entry->family == AF_INET6 &&
428                             cond->family == AF_INET) {
429                                 if (addr[0] == 0 && addr[1] == 0 &&
430                                     addr[2] == htonl(0xffff) &&
431                                     bitstring_match(addr + 3, cond->addr,
432                                                     cond->prefix_len))
433                                         break;
434                         }
435                         yes = 0;
436                         break;
437                 }
438                 }
439
440                 if (yes) {
441                         len -= op->yes;
442                         bc += op->yes;
443                 } else {
444                         len -= op->no;
445                         bc += op->no;
446                 }
447         }
448         return len == 0;
449 }
450
451 static int valid_cc(const void *bc, int len, int cc)
452 {
453         while (len >= 0) {
454                 const struct inet_diag_bc_op *op = bc;
455
456                 if (cc > len)
457                         return 0;
458                 if (cc == len)
459                         return 1;
460                 if (op->yes < 4 || op->yes & 3)
461                         return 0;
462                 len -= op->yes;
463                 bc  += op->yes;
464         }
465         return 0;
466 }
467
468 static int inet_diag_bc_audit(const void *bytecode, int bytecode_len)
469 {
470         const void *bc = bytecode;
471         int  len = bytecode_len;
472
473         while (len > 0) {
474                 const struct inet_diag_bc_op *op = bc;
475
476 //printk("BC: %d %d %d {%d} / %d\n", op->code, op->yes, op->no, op[1].no, len);
477                 switch (op->code) {
478                 case INET_DIAG_BC_AUTO:
479                 case INET_DIAG_BC_S_COND:
480                 case INET_DIAG_BC_D_COND:
481                 case INET_DIAG_BC_S_GE:
482                 case INET_DIAG_BC_S_LE:
483                 case INET_DIAG_BC_D_GE:
484                 case INET_DIAG_BC_D_LE:
485                 case INET_DIAG_BC_JMP:
486                         if (op->no < 4 || op->no > len + 4 || op->no & 3)
487                                 return -EINVAL;
488                         if (op->no < len &&
489                             !valid_cc(bytecode, bytecode_len, len - op->no))
490                                 return -EINVAL;
491                         break;
492                 case INET_DIAG_BC_NOP:
493                         break;
494                 default:
495                         return -EINVAL;
496                 }
497                 if (op->yes < 4 || op->yes > len + 4 || op->yes & 3)
498                         return -EINVAL;
499                 bc  += op->yes;
500                 len -= op->yes;
501         }
502         return len == 0 ? 0 : -EINVAL;
503 }
504
505 static int inet_csk_diag_dump(struct sock *sk,
506                               struct sk_buff *skb,
507                               struct netlink_callback *cb)
508 {
509         struct inet_diag_req *r = NLMSG_DATA(cb->nlh);
510
511         if (nlmsg_attrlen(cb->nlh, sizeof(*r))) {
512                 struct inet_diag_entry entry;
513                 const struct nlattr *bc = nlmsg_find_attr(cb->nlh,
514                                                           sizeof(*r),
515                                                           INET_DIAG_REQ_BYTECODE);
516                 struct inet_sock *inet = inet_sk(sk);
517
518                 entry.family = sk->sk_family;
519 #if defined(CONFIG_IPV6) || defined (CONFIG_IPV6_MODULE)
520                 if (entry.family == AF_INET6) {
521                         struct ipv6_pinfo *np = inet6_sk(sk);
522
523                         entry.saddr = np->rcv_saddr.s6_addr32;
524                         entry.daddr = np->daddr.s6_addr32;
525                 } else
526 #endif
527                 {
528                         entry.saddr = &inet->inet_rcv_saddr;
529                         entry.daddr = &inet->inet_daddr;
530                 }
531                 entry.sport = inet->inet_num;
532                 entry.dport = ntohs(inet->inet_dport);
533                 entry.userlocks = sk->sk_userlocks;
534
535                 if (!inet_diag_bc_run(nla_data(bc), nla_len(bc), &entry))
536                         return 0;
537         }
538
539         return inet_csk_diag_fill(sk, skb, r->idiag_ext,
540                                   NETLINK_CB(cb->skb).pid,
541                                   cb->nlh->nlmsg_seq, NLM_F_MULTI, cb->nlh);
542 }
543
544 static int inet_twsk_diag_dump(struct inet_timewait_sock *tw,
545                                struct sk_buff *skb,
546                                struct netlink_callback *cb)
547 {
548         struct inet_diag_req *r = NLMSG_DATA(cb->nlh);
549
550         if (nlmsg_attrlen(cb->nlh, sizeof(*r))) {
551                 struct inet_diag_entry entry;
552                 const struct nlattr *bc = nlmsg_find_attr(cb->nlh,
553                                                           sizeof(*r),
554                                                           INET_DIAG_REQ_BYTECODE);
555
556                 entry.family = tw->tw_family;
557 #if defined(CONFIG_IPV6) || defined (CONFIG_IPV6_MODULE)
558                 if (tw->tw_family == AF_INET6) {
559                         struct inet6_timewait_sock *tw6 =
560                                                 inet6_twsk((struct sock *)tw);
561                         entry.saddr = tw6->tw_v6_rcv_saddr.s6_addr32;
562                         entry.daddr = tw6->tw_v6_daddr.s6_addr32;
563                 } else
564 #endif
565                 {
566                         entry.saddr = &tw->tw_rcv_saddr;
567                         entry.daddr = &tw->tw_daddr;
568                 }
569                 entry.sport = tw->tw_num;
570                 entry.dport = ntohs(tw->tw_dport);
571                 entry.userlocks = 0;
572
573                 if (!inet_diag_bc_run(nla_data(bc), nla_len(bc), &entry))
574                         return 0;
575         }
576
577         return inet_twsk_diag_fill(tw, skb, r->idiag_ext,
578                                    NETLINK_CB(cb->skb).pid,
579                                    cb->nlh->nlmsg_seq, NLM_F_MULTI, cb->nlh);
580 }
581
582 static int inet_diag_fill_req(struct sk_buff *skb, struct sock *sk,
583                               struct request_sock *req, u32 pid, u32 seq,
584                               const struct nlmsghdr *unlh)
585 {
586         const struct inet_request_sock *ireq = inet_rsk(req);
587         struct inet_sock *inet = inet_sk(sk);
588         unsigned char *b = skb_tail_pointer(skb);
589         struct inet_diag_msg *r;
590         struct nlmsghdr *nlh;
591         long tmo;
592
593         nlh = NLMSG_PUT(skb, pid, seq, unlh->nlmsg_type, sizeof(*r));
594         nlh->nlmsg_flags = NLM_F_MULTI;
595         r = NLMSG_DATA(nlh);
596
597         r->idiag_family = sk->sk_family;
598         r->idiag_state = TCP_SYN_RECV;
599         r->idiag_timer = 1;
600         r->idiag_retrans = req->retrans;
601
602         r->id.idiag_if = sk->sk_bound_dev_if;
603         r->id.idiag_cookie[0] = (u32)(unsigned long)req;
604         r->id.idiag_cookie[1] = (u32)(((unsigned long)req >> 31) >> 1);
605
606         tmo = req->expires - jiffies;
607         if (tmo < 0)
608                 tmo = 0;
609
610         r->id.idiag_sport = inet->inet_sport;
611         r->id.idiag_dport = ireq->rmt_port;
612
613         memset(&r->id.idiag_src, 0, sizeof(r->id.idiag_src));
614         memset(&r->id.idiag_dst, 0, sizeof(r->id.idiag_dst));
615
616         r->id.idiag_src[0] = ireq->loc_addr;
617         r->id.idiag_dst[0] = ireq->rmt_addr;
618
619         r->idiag_expires = jiffies_to_msecs(tmo);
620         r->idiag_rqueue = 0;
621         r->idiag_wqueue = 0;
622         r->idiag_uid = sock_i_uid(sk);
623         r->idiag_inode = 0;
624 #if defined(CONFIG_IPV6) || defined (CONFIG_IPV6_MODULE)
625         if (r->idiag_family == AF_INET6) {
626                 ipv6_addr_copy((struct in6_addr *)r->id.idiag_src,
627                                &inet6_rsk(req)->loc_addr);
628                 ipv6_addr_copy((struct in6_addr *)r->id.idiag_dst,
629                                &inet6_rsk(req)->rmt_addr);
630         }
631 #endif
632         nlh->nlmsg_len = skb_tail_pointer(skb) - b;
633
634         return skb->len;
635
636 nlmsg_failure:
637         nlmsg_trim(skb, b);
638         return -1;
639 }
640
641 static int inet_diag_dump_reqs(struct sk_buff *skb, struct sock *sk,
642                                struct netlink_callback *cb)
643 {
644         struct inet_diag_entry entry;
645         struct inet_diag_req *r = NLMSG_DATA(cb->nlh);
646         struct inet_connection_sock *icsk = inet_csk(sk);
647         struct listen_sock *lopt;
648         const struct nlattr *bc = NULL;
649         struct inet_sock *inet = inet_sk(sk);
650         int j, s_j;
651         int reqnum, s_reqnum;
652         int err = 0;
653
654         s_j = cb->args[3];
655         s_reqnum = cb->args[4];
656
657         if (s_j > 0)
658                 s_j--;
659
660         entry.family = sk->sk_family;
661
662         read_lock_bh(&icsk->icsk_accept_queue.syn_wait_lock);
663
664         lopt = icsk->icsk_accept_queue.listen_opt;
665         if (!lopt || !lopt->qlen)
666                 goto out;
667
668         if (nlmsg_attrlen(cb->nlh, sizeof(*r))) {
669                 bc = nlmsg_find_attr(cb->nlh, sizeof(*r),
670                                      INET_DIAG_REQ_BYTECODE);
671                 entry.sport = inet->inet_num;
672                 entry.userlocks = sk->sk_userlocks;
673         }
674
675         for (j = s_j; j < lopt->nr_table_entries; j++) {
676                 struct request_sock *req, *head = lopt->syn_table[j];
677
678                 reqnum = 0;
679                 for (req = head; req; reqnum++, req = req->dl_next) {
680                         struct inet_request_sock *ireq = inet_rsk(req);
681
682                         if (reqnum < s_reqnum)
683                                 continue;
684                         if (r->id.idiag_dport != ireq->rmt_port &&
685                             r->id.idiag_dport)
686                                 continue;
687
688                         if (bc) {
689                                 entry.saddr =
690 #if defined(CONFIG_IPV6) || defined (CONFIG_IPV6_MODULE)
691                                         (entry.family == AF_INET6) ?
692                                         inet6_rsk(req)->loc_addr.s6_addr32 :
693 #endif
694                                         &ireq->loc_addr;
695                                 entry.daddr =
696 #if defined(CONFIG_IPV6) || defined (CONFIG_IPV6_MODULE)
697                                         (entry.family == AF_INET6) ?
698                                         inet6_rsk(req)->rmt_addr.s6_addr32 :
699 #endif
700                                         &ireq->rmt_addr;
701                                 entry.dport = ntohs(ireq->rmt_port);
702
703                                 if (!inet_diag_bc_run(nla_data(bc),
704                                                       nla_len(bc), &entry))
705                                         continue;
706                         }
707
708                         err = inet_diag_fill_req(skb, sk, req,
709                                                NETLINK_CB(cb->skb).pid,
710                                                cb->nlh->nlmsg_seq, cb->nlh);
711                         if (err < 0) {
712                                 cb->args[3] = j + 1;
713                                 cb->args[4] = reqnum;
714                                 goto out;
715                         }
716                 }
717
718                 s_reqnum = 0;
719         }
720
721 out:
722         read_unlock_bh(&icsk->icsk_accept_queue.syn_wait_lock);
723
724         return err;
725 }
726
727 static int inet_diag_dump(struct sk_buff *skb, struct netlink_callback *cb)
728 {
729         int i, num;
730         int s_i, s_num;
731         struct inet_diag_req *r = NLMSG_DATA(cb->nlh);
732         const struct inet_diag_handler *handler;
733         struct inet_hashinfo *hashinfo;
734
735         handler = inet_diag_lock_handler(cb->nlh->nlmsg_type);
736         if (IS_ERR(handler))
737                 goto unlock;
738
739         hashinfo = handler->idiag_hashinfo;
740
741         s_i = cb->args[1];
742         s_num = num = cb->args[2];
743
744         if (cb->args[0] == 0) {
745                 if (!(r->idiag_states & (TCPF_LISTEN | TCPF_SYN_RECV)))
746                         goto skip_listen_ht;
747
748                 for (i = s_i; i < INET_LHTABLE_SIZE; i++) {
749                         struct sock *sk;
750                         struct hlist_nulls_node *node;
751                         struct inet_listen_hashbucket *ilb;
752
753                         num = 0;
754                         ilb = &hashinfo->listening_hash[i];
755                         spin_lock_bh(&ilb->lock);
756                         sk_nulls_for_each(sk, node, &ilb->head) {
757                                 struct inet_sock *inet = inet_sk(sk);
758
759                                 if (num < s_num) {
760                                         num++;
761                                         continue;
762                                 }
763
764                                 if (r->id.idiag_sport != inet->inet_sport &&
765                                     r->id.idiag_sport)
766                                         goto next_listen;
767
768                                 if (!(r->idiag_states & TCPF_LISTEN) ||
769                                     r->id.idiag_dport ||
770                                     cb->args[3] > 0)
771                                         goto syn_recv;
772
773                                 if (inet_csk_diag_dump(sk, skb, cb) < 0) {
774                                         spin_unlock_bh(&ilb->lock);
775                                         goto done;
776                                 }
777
778 syn_recv:
779                                 if (!(r->idiag_states & TCPF_SYN_RECV))
780                                         goto next_listen;
781
782                                 if (inet_diag_dump_reqs(skb, sk, cb) < 0) {
783                                         spin_unlock_bh(&ilb->lock);
784                                         goto done;
785                                 }
786
787 next_listen:
788                                 cb->args[3] = 0;
789                                 cb->args[4] = 0;
790                                 ++num;
791                         }
792                         spin_unlock_bh(&ilb->lock);
793
794                         s_num = 0;
795                         cb->args[3] = 0;
796                         cb->args[4] = 0;
797                 }
798 skip_listen_ht:
799                 cb->args[0] = 1;
800                 s_i = num = s_num = 0;
801         }
802
803         if (!(r->idiag_states & ~(TCPF_LISTEN | TCPF_SYN_RECV)))
804                 goto unlock;
805
806         for (i = s_i; i <= hashinfo->ehash_mask; i++) {
807                 struct inet_ehash_bucket *head = &hashinfo->ehash[i];
808                 spinlock_t *lock = inet_ehash_lockp(hashinfo, i);
809                 struct sock *sk;
810                 struct hlist_nulls_node *node;
811
812                 num = 0;
813
814                 if (hlist_nulls_empty(&head->chain) &&
815                         hlist_nulls_empty(&head->twchain))
816                         continue;
817
818                 if (i > s_i)
819                         s_num = 0;
820
821                 spin_lock_bh(lock);
822                 sk_nulls_for_each(sk, node, &head->chain) {
823                         struct inet_sock *inet = inet_sk(sk);
824
825                         if (num < s_num)
826                                 goto next_normal;
827                         if (!(r->idiag_states & (1 << sk->sk_state)))
828                                 goto next_normal;
829                         if (r->id.idiag_sport != inet->inet_sport &&
830                             r->id.idiag_sport)
831                                 goto next_normal;
832                         if (r->id.idiag_dport != inet->inet_dport &&
833                             r->id.idiag_dport)
834                                 goto next_normal;
835                         if (inet_csk_diag_dump(sk, skb, cb) < 0) {
836                                 spin_unlock_bh(lock);
837                                 goto done;
838                         }
839 next_normal:
840                         ++num;
841                 }
842
843                 if (r->idiag_states & (TCPF_TIME_WAIT | TCPF_FIN_WAIT2)) {
844                         struct inet_timewait_sock *tw;
845
846                         inet_twsk_for_each(tw, node,
847                                     &head->twchain) {
848
849                                 if (num < s_num)
850                                         goto next_dying;
851                                 if (!(r->idiag_states & (1 << tw->tw_substate)))
852                                         goto next_dying;
853                                 if (r->id.idiag_sport != tw->tw_sport &&
854                                     r->id.idiag_sport)
855                                         goto next_dying;
856                                 if (r->id.idiag_dport != tw->tw_dport &&
857                                     r->id.idiag_dport)
858                                         goto next_dying;
859                                 if (inet_twsk_diag_dump(tw, skb, cb) < 0) {
860                                         spin_unlock_bh(lock);
861                                         goto done;
862                                 }
863 next_dying:
864                                 ++num;
865                         }
866                 }
867                 spin_unlock_bh(lock);
868         }
869
870 done:
871         cb->args[1] = i;
872         cb->args[2] = num;
873 unlock:
874         inet_diag_unlock_handler(handler);
875         return skb->len;
876 }
877
878 static int inet_diag_rcv_msg(struct sk_buff *skb, struct nlmsghdr *nlh)
879 {
880         int hdrlen = sizeof(struct inet_diag_req);
881
882         if (nlh->nlmsg_type >= INET_DIAG_GETSOCK_MAX ||
883             nlmsg_len(nlh) < hdrlen)
884                 return -EINVAL;
885
886         if (nlh->nlmsg_flags & NLM_F_DUMP) {
887                 if (nlmsg_attrlen(nlh, hdrlen)) {
888                         struct nlattr *attr;
889
890                         attr = nlmsg_find_attr(nlh, hdrlen,
891                                                INET_DIAG_REQ_BYTECODE);
892                         if (attr == NULL ||
893                             nla_len(attr) < sizeof(struct inet_diag_bc_op) ||
894                             inet_diag_bc_audit(nla_data(attr), nla_len(attr)))
895                                 return -EINVAL;
896                 }
897
898                 return netlink_dump_start(idiagnl, skb, nlh,
899                                           inet_diag_dump, NULL, 0);
900         }
901
902         return inet_diag_get_exact(skb, nlh);
903 }
904
905 static DEFINE_MUTEX(inet_diag_mutex);
906
907 static void inet_diag_rcv(struct sk_buff *skb)
908 {
909         mutex_lock(&inet_diag_mutex);
910         netlink_rcv_skb(skb, &inet_diag_rcv_msg);
911         mutex_unlock(&inet_diag_mutex);
912 }
913
914 int inet_diag_register(const struct inet_diag_handler *h)
915 {
916         const __u16 type = h->idiag_type;
917         int err = -EINVAL;
918
919         if (type >= INET_DIAG_GETSOCK_MAX)
920                 goto out;
921
922         mutex_lock(&inet_diag_table_mutex);
923         err = -EEXIST;
924         if (inet_diag_table[type] == NULL) {
925                 inet_diag_table[type] = h;
926                 err = 0;
927         }
928         mutex_unlock(&inet_diag_table_mutex);
929 out:
930         return err;
931 }
932 EXPORT_SYMBOL_GPL(inet_diag_register);
933
934 void inet_diag_unregister(const struct inet_diag_handler *h)
935 {
936         const __u16 type = h->idiag_type;
937
938         if (type >= INET_DIAG_GETSOCK_MAX)
939                 return;
940
941         mutex_lock(&inet_diag_table_mutex);
942         inet_diag_table[type] = NULL;
943         mutex_unlock(&inet_diag_table_mutex);
944 }
945 EXPORT_SYMBOL_GPL(inet_diag_unregister);
946
947 static int __init inet_diag_init(void)
948 {
949         const int inet_diag_table_size = (INET_DIAG_GETSOCK_MAX *
950                                           sizeof(struct inet_diag_handler *));
951         int err = -ENOMEM;
952
953         inet_diag_table = kzalloc(inet_diag_table_size, GFP_KERNEL);
954         if (!inet_diag_table)
955                 goto out;
956
957         idiagnl = netlink_kernel_create(&init_net, NETLINK_INET_DIAG, 0,
958                                         inet_diag_rcv, NULL, THIS_MODULE);
959         if (idiagnl == NULL)
960                 goto out_free_table;
961         err = 0;
962 out:
963         return err;
964 out_free_table:
965         kfree(inet_diag_table);
966         goto out;
967 }
968
969 static void __exit inet_diag_exit(void)
970 {
971         netlink_kernel_release(idiagnl);
972         kfree(inet_diag_table);
973 }
974
975 module_init(inet_diag_init);
976 module_exit(inet_diag_exit);
977 MODULE_LICENSE("GPL");
978 MODULE_ALIAS_NET_PF_PROTO(PF_NETLINK, NETLINK_INET_DIAG);