]> rtime.felk.cvut.cz Git - can-eth-gw-linux.git/blob - net/ipv4/inet_diag.c
tcp: better retrans tracking for defer-accept
[can-eth-gw-linux.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 #include <linux/sock_diag.h>
37
38 static const struct inet_diag_handler **inet_diag_table;
39
40 struct inet_diag_entry {
41         __be32 *saddr;
42         __be32 *daddr;
43         u16 sport;
44         u16 dport;
45         u16 family;
46         u16 userlocks;
47 };
48
49 static DEFINE_MUTEX(inet_diag_table_mutex);
50
51 static const struct inet_diag_handler *inet_diag_lock_handler(int proto)
52 {
53         if (!inet_diag_table[proto])
54                 request_module("net-pf-%d-proto-%d-type-%d-%d", PF_NETLINK,
55                                NETLINK_SOCK_DIAG, AF_INET, proto);
56
57         mutex_lock(&inet_diag_table_mutex);
58         if (!inet_diag_table[proto])
59                 return ERR_PTR(-ENOENT);
60
61         return inet_diag_table[proto];
62 }
63
64 static inline void inet_diag_unlock_handler(
65         const struct inet_diag_handler *handler)
66 {
67         mutex_unlock(&inet_diag_table_mutex);
68 }
69
70 int inet_sk_diag_fill(struct sock *sk, struct inet_connection_sock *icsk,
71                               struct sk_buff *skb, struct inet_diag_req_v2 *req,
72                               struct user_namespace *user_ns,                   
73                               u32 portid, u32 seq, u16 nlmsg_flags,
74                               const struct nlmsghdr *unlh)
75 {
76         const struct inet_sock *inet = inet_sk(sk);
77         struct inet_diag_msg *r;
78         struct nlmsghdr  *nlh;
79         struct nlattr *attr;
80         void *info = NULL;
81         const struct inet_diag_handler *handler;
82         int ext = req->idiag_ext;
83
84         handler = inet_diag_table[req->sdiag_protocol];
85         BUG_ON(handler == NULL);
86
87         nlh = nlmsg_put(skb, portid, seq, unlh->nlmsg_type, sizeof(*r),
88                         nlmsg_flags);
89         if (!nlh)
90                 return -EMSGSIZE;
91
92         r = nlmsg_data(nlh);
93         BUG_ON(sk->sk_state == TCP_TIME_WAIT);
94
95         r->idiag_family = sk->sk_family;
96         r->idiag_state = sk->sk_state;
97         r->idiag_timer = 0;
98         r->idiag_retrans = 0;
99
100         r->id.idiag_if = sk->sk_bound_dev_if;
101         sock_diag_save_cookie(sk, r->id.idiag_cookie);
102
103         r->id.idiag_sport = inet->inet_sport;
104         r->id.idiag_dport = inet->inet_dport;
105         r->id.idiag_src[0] = inet->inet_rcv_saddr;
106         r->id.idiag_dst[0] = inet->inet_daddr;
107
108         if (nla_put_u8(skb, INET_DIAG_SHUTDOWN, sk->sk_shutdown))
109                 goto errout;
110
111         /* IPv6 dual-stack sockets use inet->tos for IPv4 connections,
112          * hence this needs to be included regardless of socket family.
113          */
114         if (ext & (1 << (INET_DIAG_TOS - 1)))
115                 if (nla_put_u8(skb, INET_DIAG_TOS, inet->tos) < 0)
116                         goto errout;
117
118 #if IS_ENABLED(CONFIG_IPV6)
119         if (r->idiag_family == AF_INET6) {
120                 const struct ipv6_pinfo *np = inet6_sk(sk);
121
122                 *(struct in6_addr *)r->id.idiag_src = np->rcv_saddr;
123                 *(struct in6_addr *)r->id.idiag_dst = np->daddr;
124
125                 if (ext & (1 << (INET_DIAG_TCLASS - 1)))
126                         if (nla_put_u8(skb, INET_DIAG_TCLASS, np->tclass) < 0)
127                                 goto errout;
128         }
129 #endif
130
131         r->idiag_uid = from_kuid_munged(user_ns, sock_i_uid(sk));
132         r->idiag_inode = sock_i_ino(sk);
133
134         if (ext & (1 << (INET_DIAG_MEMINFO - 1))) {
135                 struct inet_diag_meminfo minfo = {
136                         .idiag_rmem = sk_rmem_alloc_get(sk),
137                         .idiag_wmem = sk->sk_wmem_queued,
138                         .idiag_fmem = sk->sk_forward_alloc,
139                         .idiag_tmem = sk_wmem_alloc_get(sk),
140                 };
141
142                 if (nla_put(skb, INET_DIAG_MEMINFO, sizeof(minfo), &minfo) < 0)
143                         goto errout;
144         }
145
146         if (ext & (1 << (INET_DIAG_SKMEMINFO - 1)))
147                 if (sock_diag_put_meminfo(sk, skb, INET_DIAG_SKMEMINFO))
148                         goto errout;
149
150         if (icsk == NULL) {
151                 handler->idiag_get_info(sk, r, NULL);
152                 goto out;
153         }
154
155 #define EXPIRES_IN_MS(tmo)  DIV_ROUND_UP((tmo - jiffies) * 1000, HZ)
156
157         if (icsk->icsk_pending == ICSK_TIME_RETRANS) {
158                 r->idiag_timer = 1;
159                 r->idiag_retrans = icsk->icsk_retransmits;
160                 r->idiag_expires = EXPIRES_IN_MS(icsk->icsk_timeout);
161         } else if (icsk->icsk_pending == ICSK_TIME_PROBE0) {
162                 r->idiag_timer = 4;
163                 r->idiag_retrans = icsk->icsk_probes_out;
164                 r->idiag_expires = EXPIRES_IN_MS(icsk->icsk_timeout);
165         } else if (timer_pending(&sk->sk_timer)) {
166                 r->idiag_timer = 2;
167                 r->idiag_retrans = icsk->icsk_probes_out;
168                 r->idiag_expires = EXPIRES_IN_MS(sk->sk_timer.expires);
169         } else {
170                 r->idiag_timer = 0;
171                 r->idiag_expires = 0;
172         }
173 #undef EXPIRES_IN_MS
174
175         if (ext & (1 << (INET_DIAG_INFO - 1))) {
176                 attr = nla_reserve(skb, INET_DIAG_INFO,
177                                    sizeof(struct tcp_info));
178                 if (!attr)
179                         goto errout;
180
181                 info = nla_data(attr);
182         }
183
184         if ((ext & (1 << (INET_DIAG_CONG - 1))) && icsk->icsk_ca_ops)
185                 if (nla_put_string(skb, INET_DIAG_CONG,
186                                    icsk->icsk_ca_ops->name) < 0)
187                         goto errout;
188
189         handler->idiag_get_info(sk, r, info);
190
191         if (sk->sk_state < TCP_TIME_WAIT &&
192             icsk->icsk_ca_ops && icsk->icsk_ca_ops->get_info)
193                 icsk->icsk_ca_ops->get_info(sk, ext, skb);
194
195 out:
196         return nlmsg_end(skb, nlh);
197
198 errout:
199         nlmsg_cancel(skb, nlh);
200         return -EMSGSIZE;
201 }
202 EXPORT_SYMBOL_GPL(inet_sk_diag_fill);
203
204 static int inet_csk_diag_fill(struct sock *sk,
205                               struct sk_buff *skb, struct inet_diag_req_v2 *req,
206                               struct user_namespace *user_ns,
207                               u32 portid, u32 seq, u16 nlmsg_flags,
208                               const struct nlmsghdr *unlh)
209 {
210         return inet_sk_diag_fill(sk, inet_csk(sk),
211                         skb, req, user_ns, portid, seq, nlmsg_flags, unlh);
212 }
213
214 static int inet_twsk_diag_fill(struct inet_timewait_sock *tw,
215                                struct sk_buff *skb, struct inet_diag_req_v2 *req,
216                                u32 portid, u32 seq, u16 nlmsg_flags,
217                                const struct nlmsghdr *unlh)
218 {
219         long tmo;
220         struct inet_diag_msg *r;
221         struct nlmsghdr *nlh;
222
223         nlh = nlmsg_put(skb, portid, seq, unlh->nlmsg_type, sizeof(*r),
224                         nlmsg_flags);
225         if (!nlh)
226                 return -EMSGSIZE;
227
228         r = nlmsg_data(nlh);
229         BUG_ON(tw->tw_state != TCP_TIME_WAIT);
230
231         tmo = tw->tw_ttd - jiffies;
232         if (tmo < 0)
233                 tmo = 0;
234
235         r->idiag_family       = tw->tw_family;
236         r->idiag_retrans      = 0;
237         r->id.idiag_if        = tw->tw_bound_dev_if;
238         sock_diag_save_cookie(tw, r->id.idiag_cookie);
239         r->id.idiag_sport     = tw->tw_sport;
240         r->id.idiag_dport     = tw->tw_dport;
241         r->id.idiag_src[0]    = tw->tw_rcv_saddr;
242         r->id.idiag_dst[0]    = tw->tw_daddr;
243         r->idiag_state        = tw->tw_substate;
244         r->idiag_timer        = 3;
245         r->idiag_expires      = DIV_ROUND_UP(tmo * 1000, HZ);
246         r->idiag_rqueue       = 0;
247         r->idiag_wqueue       = 0;
248         r->idiag_uid          = 0;
249         r->idiag_inode        = 0;
250 #if IS_ENABLED(CONFIG_IPV6)
251         if (tw->tw_family == AF_INET6) {
252                 const struct inet6_timewait_sock *tw6 =
253                                                 inet6_twsk((struct sock *)tw);
254
255                 *(struct in6_addr *)r->id.idiag_src = tw6->tw_v6_rcv_saddr;
256                 *(struct in6_addr *)r->id.idiag_dst = tw6->tw_v6_daddr;
257         }
258 #endif
259
260         return nlmsg_end(skb, nlh);
261 }
262
263 static int sk_diag_fill(struct sock *sk, struct sk_buff *skb,
264                         struct inet_diag_req_v2 *r,
265                         struct user_namespace *user_ns,
266                         u32 portid, u32 seq, u16 nlmsg_flags,
267                         const struct nlmsghdr *unlh)
268 {
269         if (sk->sk_state == TCP_TIME_WAIT)
270                 return inet_twsk_diag_fill((struct inet_timewait_sock *)sk,
271                                            skb, r, portid, seq, nlmsg_flags,
272                                            unlh);
273         return inet_csk_diag_fill(sk, skb, r, user_ns, portid, seq, nlmsg_flags, unlh);
274 }
275
276 int inet_diag_dump_one_icsk(struct inet_hashinfo *hashinfo, struct sk_buff *in_skb,
277                 const struct nlmsghdr *nlh, struct inet_diag_req_v2 *req)
278 {
279         int err;
280         struct sock *sk;
281         struct sk_buff *rep;
282         struct net *net = sock_net(in_skb->sk);
283
284         err = -EINVAL;
285         if (req->sdiag_family == AF_INET) {
286                 sk = inet_lookup(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 IS_ENABLED(CONFIG_IPV6)
291         else if (req->sdiag_family == AF_INET6) {
292                 sk = inet6_lookup(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 out_nosk;
302         }
303
304         err = -ENOENT;
305         if (sk == NULL)
306                 goto out_nosk;
307
308         err = sock_diag_check_cookie(sk, req->id.idiag_cookie);
309         if (err)
310                 goto out;
311
312         rep = nlmsg_new(sizeof(struct inet_diag_msg) +
313                         sizeof(struct inet_diag_meminfo) +
314                         sizeof(struct tcp_info) + 64, GFP_KERNEL);
315         if (!rep) {
316                 err = -ENOMEM;
317                 goto out;
318         }
319
320         err = sk_diag_fill(sk, rep, req,
321                            sk_user_ns(NETLINK_CB(in_skb).ssk),
322                            NETLINK_CB(in_skb).portid,
323                            nlh->nlmsg_seq, 0, nlh);
324         if (err < 0) {
325                 WARN_ON(err == -EMSGSIZE);
326                 nlmsg_free(rep);
327                 goto out;
328         }
329         err = netlink_unicast(net->diag_nlsk, rep, NETLINK_CB(in_skb).portid,
330                               MSG_DONTWAIT);
331         if (err > 0)
332                 err = 0;
333
334 out:
335         if (sk) {
336                 if (sk->sk_state == TCP_TIME_WAIT)
337                         inet_twsk_put((struct inet_timewait_sock *)sk);
338                 else
339                         sock_put(sk);
340         }
341 out_nosk:
342         return err;
343 }
344 EXPORT_SYMBOL_GPL(inet_diag_dump_one_icsk);
345
346 static int inet_diag_get_exact(struct sk_buff *in_skb,
347                                const struct nlmsghdr *nlh,
348                                struct inet_diag_req_v2 *req)
349 {
350         const struct inet_diag_handler *handler;
351         int err;
352
353         handler = inet_diag_lock_handler(req->sdiag_protocol);
354         if (IS_ERR(handler))
355                 err = PTR_ERR(handler);
356         else
357                 err = handler->dump_one(in_skb, nlh, req);
358         inet_diag_unlock_handler(handler);
359
360         return err;
361 }
362
363 static int bitstring_match(const __be32 *a1, const __be32 *a2, int bits)
364 {
365         int words = bits >> 5;
366
367         bits &= 0x1f;
368
369         if (words) {
370                 if (memcmp(a1, a2, words << 2))
371                         return 0;
372         }
373         if (bits) {
374                 __be32 w1, w2;
375                 __be32 mask;
376
377                 w1 = a1[words];
378                 w2 = a2[words];
379
380                 mask = htonl((0xffffffff) << (32 - bits));
381
382                 if ((w1 ^ w2) & mask)
383                         return 0;
384         }
385
386         return 1;
387 }
388
389
390 static int inet_diag_bc_run(const struct nlattr *_bc,
391                 const struct inet_diag_entry *entry)
392 {
393         const void *bc = nla_data(_bc);
394         int len = nla_len(_bc);
395
396         while (len > 0) {
397                 int yes = 1;
398                 const struct inet_diag_bc_op *op = bc;
399
400                 switch (op->code) {
401                 case INET_DIAG_BC_NOP:
402                         break;
403                 case INET_DIAG_BC_JMP:
404                         yes = 0;
405                         break;
406                 case INET_DIAG_BC_S_GE:
407                         yes = entry->sport >= op[1].no;
408                         break;
409                 case INET_DIAG_BC_S_LE:
410                         yes = entry->sport <= op[1].no;
411                         break;
412                 case INET_DIAG_BC_D_GE:
413                         yes = entry->dport >= op[1].no;
414                         break;
415                 case INET_DIAG_BC_D_LE:
416                         yes = entry->dport <= op[1].no;
417                         break;
418                 case INET_DIAG_BC_AUTO:
419                         yes = !(entry->userlocks & SOCK_BINDPORT_LOCK);
420                         break;
421                 case INET_DIAG_BC_S_COND:
422                 case INET_DIAG_BC_D_COND: {
423                         struct inet_diag_hostcond *cond;
424                         __be32 *addr;
425
426                         cond = (struct inet_diag_hostcond *)(op + 1);
427                         if (cond->port != -1 &&
428                             cond->port != (op->code == INET_DIAG_BC_S_COND ?
429                                              entry->sport : entry->dport)) {
430                                 yes = 0;
431                                 break;
432                         }
433
434                         if (cond->prefix_len == 0)
435                                 break;
436
437                         if (op->code == INET_DIAG_BC_S_COND)
438                                 addr = entry->saddr;
439                         else
440                                 addr = entry->daddr;
441
442                         if (bitstring_match(addr, cond->addr,
443                                             cond->prefix_len))
444                                 break;
445                         if (entry->family == AF_INET6 &&
446                             cond->family == AF_INET) {
447                                 if (addr[0] == 0 && addr[1] == 0 &&
448                                     addr[2] == htonl(0xffff) &&
449                                     bitstring_match(addr + 3, cond->addr,
450                                                     cond->prefix_len))
451                                         break;
452                         }
453                         yes = 0;
454                         break;
455                 }
456                 }
457
458                 if (yes) {
459                         len -= op->yes;
460                         bc += op->yes;
461                 } else {
462                         len -= op->no;
463                         bc += op->no;
464                 }
465         }
466         return len == 0;
467 }
468
469 int inet_diag_bc_sk(const struct nlattr *bc, struct sock *sk)
470 {
471         struct inet_diag_entry entry;
472         struct inet_sock *inet = inet_sk(sk);
473
474         if (bc == NULL)
475                 return 1;
476
477         entry.family = sk->sk_family;
478 #if IS_ENABLED(CONFIG_IPV6)
479         if (entry.family == AF_INET6) {
480                 struct ipv6_pinfo *np = inet6_sk(sk);
481
482                 entry.saddr = np->rcv_saddr.s6_addr32;
483                 entry.daddr = np->daddr.s6_addr32;
484         } else
485 #endif
486         {
487                 entry.saddr = &inet->inet_rcv_saddr;
488                 entry.daddr = &inet->inet_daddr;
489         }
490         entry.sport = inet->inet_num;
491         entry.dport = ntohs(inet->inet_dport);
492         entry.userlocks = sk->sk_userlocks;
493
494         return inet_diag_bc_run(bc, &entry);
495 }
496 EXPORT_SYMBOL_GPL(inet_diag_bc_sk);
497
498 static int valid_cc(const void *bc, int len, int cc)
499 {
500         while (len >= 0) {
501                 const struct inet_diag_bc_op *op = bc;
502
503                 if (cc > len)
504                         return 0;
505                 if (cc == len)
506                         return 1;
507                 if (op->yes < 4 || op->yes & 3)
508                         return 0;
509                 len -= op->yes;
510                 bc  += op->yes;
511         }
512         return 0;
513 }
514
515 static int inet_diag_bc_audit(const void *bytecode, int bytecode_len)
516 {
517         const void *bc = bytecode;
518         int  len = bytecode_len;
519
520         while (len > 0) {
521                 const struct inet_diag_bc_op *op = bc;
522
523 //printk("BC: %d %d %d {%d} / %d\n", op->code, op->yes, op->no, op[1].no, len);
524                 switch (op->code) {
525                 case INET_DIAG_BC_AUTO:
526                 case INET_DIAG_BC_S_COND:
527                 case INET_DIAG_BC_D_COND:
528                 case INET_DIAG_BC_S_GE:
529                 case INET_DIAG_BC_S_LE:
530                 case INET_DIAG_BC_D_GE:
531                 case INET_DIAG_BC_D_LE:
532                 case INET_DIAG_BC_JMP:
533                         if (op->no < 4 || op->no > len + 4 || op->no & 3)
534                                 return -EINVAL;
535                         if (op->no < len &&
536                             !valid_cc(bytecode, bytecode_len, len - op->no))
537                                 return -EINVAL;
538                         break;
539                 case INET_DIAG_BC_NOP:
540                         break;
541                 default:
542                         return -EINVAL;
543                 }
544                 if (op->yes < 4 || op->yes > len + 4 || op->yes & 3)
545                         return -EINVAL;
546                 bc  += op->yes;
547                 len -= op->yes;
548         }
549         return len == 0 ? 0 : -EINVAL;
550 }
551
552 static int inet_csk_diag_dump(struct sock *sk,
553                               struct sk_buff *skb,
554                               struct netlink_callback *cb,
555                               struct inet_diag_req_v2 *r,
556                               const struct nlattr *bc)
557 {
558         if (!inet_diag_bc_sk(bc, sk))
559                 return 0;
560
561         return inet_csk_diag_fill(sk, skb, r,
562                                   sk_user_ns(NETLINK_CB(cb->skb).ssk),
563                                   NETLINK_CB(cb->skb).portid,
564                                   cb->nlh->nlmsg_seq, NLM_F_MULTI, cb->nlh);
565 }
566
567 static int inet_twsk_diag_dump(struct inet_timewait_sock *tw,
568                                struct sk_buff *skb,
569                                struct netlink_callback *cb,
570                                struct inet_diag_req_v2 *r,
571                                const struct nlattr *bc)
572 {
573         if (bc != NULL) {
574                 struct inet_diag_entry entry;
575
576                 entry.family = tw->tw_family;
577 #if IS_ENABLED(CONFIG_IPV6)
578                 if (tw->tw_family == AF_INET6) {
579                         struct inet6_timewait_sock *tw6 =
580                                                 inet6_twsk((struct sock *)tw);
581                         entry.saddr = tw6->tw_v6_rcv_saddr.s6_addr32;
582                         entry.daddr = tw6->tw_v6_daddr.s6_addr32;
583                 } else
584 #endif
585                 {
586                         entry.saddr = &tw->tw_rcv_saddr;
587                         entry.daddr = &tw->tw_daddr;
588                 }
589                 entry.sport = tw->tw_num;
590                 entry.dport = ntohs(tw->tw_dport);
591                 entry.userlocks = 0;
592
593                 if (!inet_diag_bc_run(bc, &entry))
594                         return 0;
595         }
596
597         return inet_twsk_diag_fill(tw, skb, r,
598                                    NETLINK_CB(cb->skb).portid,
599                                    cb->nlh->nlmsg_seq, NLM_F_MULTI, cb->nlh);
600 }
601
602 static int inet_diag_fill_req(struct sk_buff *skb, struct sock *sk,
603                               struct request_sock *req,
604                               struct user_namespace *user_ns,
605                               u32 portid, u32 seq,
606                               const struct nlmsghdr *unlh)
607 {
608         const struct inet_request_sock *ireq = inet_rsk(req);
609         struct inet_sock *inet = inet_sk(sk);
610         struct inet_diag_msg *r;
611         struct nlmsghdr *nlh;
612         long tmo;
613
614         nlh = nlmsg_put(skb, portid, seq, unlh->nlmsg_type, sizeof(*r),
615                         NLM_F_MULTI);
616         if (!nlh)
617                 return -EMSGSIZE;
618
619         r = nlmsg_data(nlh);
620         r->idiag_family = sk->sk_family;
621         r->idiag_state = TCP_SYN_RECV;
622         r->idiag_timer = 1;
623         r->idiag_retrans = req->num_retrans;
624
625         r->id.idiag_if = sk->sk_bound_dev_if;
626         sock_diag_save_cookie(req, r->id.idiag_cookie);
627
628         tmo = req->expires - jiffies;
629         if (tmo < 0)
630                 tmo = 0;
631
632         r->id.idiag_sport = inet->inet_sport;
633         r->id.idiag_dport = ireq->rmt_port;
634         r->id.idiag_src[0] = ireq->loc_addr;
635         r->id.idiag_dst[0] = ireq->rmt_addr;
636         r->idiag_expires = jiffies_to_msecs(tmo);
637         r->idiag_rqueue = 0;
638         r->idiag_wqueue = 0;
639         r->idiag_uid = from_kuid_munged(user_ns, sock_i_uid(sk));
640         r->idiag_inode = 0;
641 #if IS_ENABLED(CONFIG_IPV6)
642         if (r->idiag_family == AF_INET6) {
643                 *(struct in6_addr *)r->id.idiag_src = inet6_rsk(req)->loc_addr;
644                 *(struct in6_addr *)r->id.idiag_dst = inet6_rsk(req)->rmt_addr;
645         }
646 #endif
647
648         return nlmsg_end(skb, nlh);
649 }
650
651 static int inet_diag_dump_reqs(struct sk_buff *skb, struct sock *sk,
652                                struct netlink_callback *cb,
653                                struct inet_diag_req_v2 *r,
654                                const struct nlattr *bc)
655 {
656         struct inet_diag_entry entry;
657         struct inet_connection_sock *icsk = inet_csk(sk);
658         struct listen_sock *lopt;
659         struct inet_sock *inet = inet_sk(sk);
660         int j, s_j;
661         int reqnum, s_reqnum;
662         int err = 0;
663
664         s_j = cb->args[3];
665         s_reqnum = cb->args[4];
666
667         if (s_j > 0)
668                 s_j--;
669
670         entry.family = sk->sk_family;
671
672         read_lock_bh(&icsk->icsk_accept_queue.syn_wait_lock);
673
674         lopt = icsk->icsk_accept_queue.listen_opt;
675         if (!lopt || !lopt->qlen)
676                 goto out;
677
678         if (bc != NULL) {
679                 entry.sport = inet->inet_num;
680                 entry.userlocks = sk->sk_userlocks;
681         }
682
683         for (j = s_j; j < lopt->nr_table_entries; j++) {
684                 struct request_sock *req, *head = lopt->syn_table[j];
685
686                 reqnum = 0;
687                 for (req = head; req; reqnum++, req = req->dl_next) {
688                         struct inet_request_sock *ireq = inet_rsk(req);
689
690                         if (reqnum < s_reqnum)
691                                 continue;
692                         if (r->id.idiag_dport != ireq->rmt_port &&
693                             r->id.idiag_dport)
694                                 continue;
695
696                         if (bc) {
697                                 entry.saddr =
698 #if IS_ENABLED(CONFIG_IPV6)
699                                         (entry.family == AF_INET6) ?
700                                         inet6_rsk(req)->loc_addr.s6_addr32 :
701 #endif
702                                         &ireq->loc_addr;
703                                 entry.daddr =
704 #if IS_ENABLED(CONFIG_IPV6)
705                                         (entry.family == AF_INET6) ?
706                                         inet6_rsk(req)->rmt_addr.s6_addr32 :
707 #endif
708                                         &ireq->rmt_addr;
709                                 entry.dport = ntohs(ireq->rmt_port);
710
711                                 if (!inet_diag_bc_run(bc, &entry))
712                                         continue;
713                         }
714
715                         err = inet_diag_fill_req(skb, sk, req,
716                                                sk_user_ns(NETLINK_CB(cb->skb).ssk),
717                                                NETLINK_CB(cb->skb).portid,
718                                                cb->nlh->nlmsg_seq, cb->nlh);
719                         if (err < 0) {
720                                 cb->args[3] = j + 1;
721                                 cb->args[4] = reqnum;
722                                 goto out;
723                         }
724                 }
725
726                 s_reqnum = 0;
727         }
728
729 out:
730         read_unlock_bh(&icsk->icsk_accept_queue.syn_wait_lock);
731
732         return err;
733 }
734
735 void inet_diag_dump_icsk(struct inet_hashinfo *hashinfo, struct sk_buff *skb,
736                 struct netlink_callback *cb, struct inet_diag_req_v2 *r, struct nlattr *bc)
737 {
738         int i, num;
739         int s_i, s_num;
740         struct net *net = sock_net(skb->sk);
741
742         s_i = cb->args[1];
743         s_num = num = cb->args[2];
744
745         if (cb->args[0] == 0) {
746                 if (!(r->idiag_states & (TCPF_LISTEN | TCPF_SYN_RECV)))
747                         goto skip_listen_ht;
748
749                 for (i = s_i; i < INET_LHTABLE_SIZE; i++) {
750                         struct sock *sk;
751                         struct hlist_nulls_node *node;
752                         struct inet_listen_hashbucket *ilb;
753
754                         num = 0;
755                         ilb = &hashinfo->listening_hash[i];
756                         spin_lock_bh(&ilb->lock);
757                         sk_nulls_for_each(sk, node, &ilb->head) {
758                                 struct inet_sock *inet = inet_sk(sk);
759
760                                 if (!net_eq(sock_net(sk), net))
761                                         continue;
762
763                                 if (num < s_num) {
764                                         num++;
765                                         continue;
766                                 }
767
768                                 if (r->sdiag_family != AF_UNSPEC &&
769                                                 sk->sk_family != r->sdiag_family)
770                                         goto next_listen;
771
772                                 if (r->id.idiag_sport != inet->inet_sport &&
773                                     r->id.idiag_sport)
774                                         goto next_listen;
775
776                                 if (!(r->idiag_states & TCPF_LISTEN) ||
777                                     r->id.idiag_dport ||
778                                     cb->args[3] > 0)
779                                         goto syn_recv;
780
781                                 if (inet_csk_diag_dump(sk, skb, cb, r, bc) < 0) {
782                                         spin_unlock_bh(&ilb->lock);
783                                         goto done;
784                                 }
785
786 syn_recv:
787                                 if (!(r->idiag_states & TCPF_SYN_RECV))
788                                         goto next_listen;
789
790                                 if (inet_diag_dump_reqs(skb, sk, cb, r, bc) < 0) {
791                                         spin_unlock_bh(&ilb->lock);
792                                         goto done;
793                                 }
794
795 next_listen:
796                                 cb->args[3] = 0;
797                                 cb->args[4] = 0;
798                                 ++num;
799                         }
800                         spin_unlock_bh(&ilb->lock);
801
802                         s_num = 0;
803                         cb->args[3] = 0;
804                         cb->args[4] = 0;
805                 }
806 skip_listen_ht:
807                 cb->args[0] = 1;
808                 s_i = num = s_num = 0;
809         }
810
811         if (!(r->idiag_states & ~(TCPF_LISTEN | TCPF_SYN_RECV)))
812                 goto out;
813
814         for (i = s_i; i <= hashinfo->ehash_mask; i++) {
815                 struct inet_ehash_bucket *head = &hashinfo->ehash[i];
816                 spinlock_t *lock = inet_ehash_lockp(hashinfo, i);
817                 struct sock *sk;
818                 struct hlist_nulls_node *node;
819
820                 num = 0;
821
822                 if (hlist_nulls_empty(&head->chain) &&
823                         hlist_nulls_empty(&head->twchain))
824                         continue;
825
826                 if (i > s_i)
827                         s_num = 0;
828
829                 spin_lock_bh(lock);
830                 sk_nulls_for_each(sk, node, &head->chain) {
831                         struct inet_sock *inet = inet_sk(sk);
832
833                         if (!net_eq(sock_net(sk), net))
834                                 continue;
835                         if (num < s_num)
836                                 goto next_normal;
837                         if (!(r->idiag_states & (1 << sk->sk_state)))
838                                 goto next_normal;
839                         if (r->sdiag_family != AF_UNSPEC &&
840                                         sk->sk_family != r->sdiag_family)
841                                 goto next_normal;
842                         if (r->id.idiag_sport != inet->inet_sport &&
843                             r->id.idiag_sport)
844                                 goto next_normal;
845                         if (r->id.idiag_dport != inet->inet_dport &&
846                             r->id.idiag_dport)
847                                 goto next_normal;
848                         if (inet_csk_diag_dump(sk, skb, cb, r, bc) < 0) {
849                                 spin_unlock_bh(lock);
850                                 goto done;
851                         }
852 next_normal:
853                         ++num;
854                 }
855
856                 if (r->idiag_states & TCPF_TIME_WAIT) {
857                         struct inet_timewait_sock *tw;
858
859                         inet_twsk_for_each(tw, node,
860                                     &head->twchain) {
861                                 if (!net_eq(twsk_net(tw), net))
862                                         continue;
863
864                                 if (num < s_num)
865                                         goto next_dying;
866                                 if (r->sdiag_family != AF_UNSPEC &&
867                                                 tw->tw_family != r->sdiag_family)
868                                         goto next_dying;
869                                 if (r->id.idiag_sport != tw->tw_sport &&
870                                     r->id.idiag_sport)
871                                         goto next_dying;
872                                 if (r->id.idiag_dport != tw->tw_dport &&
873                                     r->id.idiag_dport)
874                                         goto next_dying;
875                                 if (inet_twsk_diag_dump(tw, skb, cb, r, bc) < 0) {
876                                         spin_unlock_bh(lock);
877                                         goto done;
878                                 }
879 next_dying:
880                                 ++num;
881                         }
882                 }
883                 spin_unlock_bh(lock);
884         }
885
886 done:
887         cb->args[1] = i;
888         cb->args[2] = num;
889 out:
890         ;
891 }
892 EXPORT_SYMBOL_GPL(inet_diag_dump_icsk);
893
894 static int __inet_diag_dump(struct sk_buff *skb, struct netlink_callback *cb,
895                 struct inet_diag_req_v2 *r, struct nlattr *bc)
896 {
897         const struct inet_diag_handler *handler;
898
899         handler = inet_diag_lock_handler(r->sdiag_protocol);
900         if (!IS_ERR(handler))
901                 handler->dump(skb, cb, r, bc);
902         inet_diag_unlock_handler(handler);
903
904         return skb->len;
905 }
906
907 static int inet_diag_dump(struct sk_buff *skb, struct netlink_callback *cb)
908 {
909         struct nlattr *bc = NULL;
910         int hdrlen = sizeof(struct inet_diag_req_v2);
911
912         if (nlmsg_attrlen(cb->nlh, hdrlen))
913                 bc = nlmsg_find_attr(cb->nlh, hdrlen, INET_DIAG_REQ_BYTECODE);
914
915         return __inet_diag_dump(skb, cb, nlmsg_data(cb->nlh), bc);
916 }
917
918 static inline int inet_diag_type2proto(int type)
919 {
920         switch (type) {
921         case TCPDIAG_GETSOCK:
922                 return IPPROTO_TCP;
923         case DCCPDIAG_GETSOCK:
924                 return IPPROTO_DCCP;
925         default:
926                 return 0;
927         }
928 }
929
930 static int inet_diag_dump_compat(struct sk_buff *skb, struct netlink_callback *cb)
931 {
932         struct inet_diag_req *rc = nlmsg_data(cb->nlh);
933         struct inet_diag_req_v2 req;
934         struct nlattr *bc = NULL;
935         int hdrlen = sizeof(struct inet_diag_req);
936
937         req.sdiag_family = AF_UNSPEC; /* compatibility */
938         req.sdiag_protocol = inet_diag_type2proto(cb->nlh->nlmsg_type);
939         req.idiag_ext = rc->idiag_ext;
940         req.idiag_states = rc->idiag_states;
941         req.id = rc->id;
942
943         if (nlmsg_attrlen(cb->nlh, hdrlen))
944                 bc = nlmsg_find_attr(cb->nlh, hdrlen, INET_DIAG_REQ_BYTECODE);
945
946         return __inet_diag_dump(skb, cb, &req, bc);
947 }
948
949 static int inet_diag_get_exact_compat(struct sk_buff *in_skb,
950                                const struct nlmsghdr *nlh)
951 {
952         struct inet_diag_req *rc = nlmsg_data(nlh);
953         struct inet_diag_req_v2 req;
954
955         req.sdiag_family = rc->idiag_family;
956         req.sdiag_protocol = inet_diag_type2proto(nlh->nlmsg_type);
957         req.idiag_ext = rc->idiag_ext;
958         req.idiag_states = rc->idiag_states;
959         req.id = rc->id;
960
961         return inet_diag_get_exact(in_skb, nlh, &req);
962 }
963
964 static int inet_diag_rcv_msg_compat(struct sk_buff *skb, struct nlmsghdr *nlh)
965 {
966         int hdrlen = sizeof(struct inet_diag_req);
967         struct net *net = sock_net(skb->sk);
968
969         if (nlh->nlmsg_type >= INET_DIAG_GETSOCK_MAX ||
970             nlmsg_len(nlh) < hdrlen)
971                 return -EINVAL;
972
973         if (nlh->nlmsg_flags & NLM_F_DUMP) {
974                 if (nlmsg_attrlen(nlh, hdrlen)) {
975                         struct nlattr *attr;
976
977                         attr = nlmsg_find_attr(nlh, hdrlen,
978                                                INET_DIAG_REQ_BYTECODE);
979                         if (attr == NULL ||
980                             nla_len(attr) < sizeof(struct inet_diag_bc_op) ||
981                             inet_diag_bc_audit(nla_data(attr), nla_len(attr)))
982                                 return -EINVAL;
983                 }
984                 {
985                         struct netlink_dump_control c = {
986                                 .dump = inet_diag_dump_compat,
987                         };
988                         return netlink_dump_start(net->diag_nlsk, skb, nlh, &c);
989                 }
990         }
991
992         return inet_diag_get_exact_compat(skb, nlh);
993 }
994
995 static int inet_diag_handler_dump(struct sk_buff *skb, struct nlmsghdr *h)
996 {
997         int hdrlen = sizeof(struct inet_diag_req_v2);
998         struct net *net = sock_net(skb->sk);
999
1000         if (nlmsg_len(h) < hdrlen)
1001                 return -EINVAL;
1002
1003         if (h->nlmsg_flags & NLM_F_DUMP) {
1004                 if (nlmsg_attrlen(h, hdrlen)) {
1005                         struct nlattr *attr;
1006                         attr = nlmsg_find_attr(h, hdrlen,
1007                                                INET_DIAG_REQ_BYTECODE);
1008                         if (attr == NULL ||
1009                             nla_len(attr) < sizeof(struct inet_diag_bc_op) ||
1010                             inet_diag_bc_audit(nla_data(attr), nla_len(attr)))
1011                                 return -EINVAL;
1012                 }
1013                 {
1014                         struct netlink_dump_control c = {
1015                                 .dump = inet_diag_dump,
1016                         };
1017                         return netlink_dump_start(net->diag_nlsk, skb, h, &c);
1018                 }
1019         }
1020
1021         return inet_diag_get_exact(skb, h, nlmsg_data(h));
1022 }
1023
1024 static const struct sock_diag_handler inet_diag_handler = {
1025         .family = AF_INET,
1026         .dump = inet_diag_handler_dump,
1027 };
1028
1029 static const struct sock_diag_handler inet6_diag_handler = {
1030         .family = AF_INET6,
1031         .dump = inet_diag_handler_dump,
1032 };
1033
1034 int inet_diag_register(const struct inet_diag_handler *h)
1035 {
1036         const __u16 type = h->idiag_type;
1037         int err = -EINVAL;
1038
1039         if (type >= IPPROTO_MAX)
1040                 goto out;
1041
1042         mutex_lock(&inet_diag_table_mutex);
1043         err = -EEXIST;
1044         if (inet_diag_table[type] == NULL) {
1045                 inet_diag_table[type] = h;
1046                 err = 0;
1047         }
1048         mutex_unlock(&inet_diag_table_mutex);
1049 out:
1050         return err;
1051 }
1052 EXPORT_SYMBOL_GPL(inet_diag_register);
1053
1054 void inet_diag_unregister(const struct inet_diag_handler *h)
1055 {
1056         const __u16 type = h->idiag_type;
1057
1058         if (type >= IPPROTO_MAX)
1059                 return;
1060
1061         mutex_lock(&inet_diag_table_mutex);
1062         inet_diag_table[type] = NULL;
1063         mutex_unlock(&inet_diag_table_mutex);
1064 }
1065 EXPORT_SYMBOL_GPL(inet_diag_unregister);
1066
1067 static int __init inet_diag_init(void)
1068 {
1069         const int inet_diag_table_size = (IPPROTO_MAX *
1070                                           sizeof(struct inet_diag_handler *));
1071         int err = -ENOMEM;
1072
1073         inet_diag_table = kzalloc(inet_diag_table_size, GFP_KERNEL);
1074         if (!inet_diag_table)
1075                 goto out;
1076
1077         err = sock_diag_register(&inet_diag_handler);
1078         if (err)
1079                 goto out_free_nl;
1080
1081         err = sock_diag_register(&inet6_diag_handler);
1082         if (err)
1083                 goto out_free_inet;
1084
1085         sock_diag_register_inet_compat(inet_diag_rcv_msg_compat);
1086 out:
1087         return err;
1088
1089 out_free_inet:
1090         sock_diag_unregister(&inet_diag_handler);
1091 out_free_nl:
1092         kfree(inet_diag_table);
1093         goto out;
1094 }
1095
1096 static void __exit inet_diag_exit(void)
1097 {
1098         sock_diag_unregister(&inet6_diag_handler);
1099         sock_diag_unregister(&inet_diag_handler);
1100         sock_diag_unregister_inet_compat(inet_diag_rcv_msg_compat);
1101         kfree(inet_diag_table);
1102 }
1103
1104 module_init(inet_diag_init);
1105 module_exit(inet_diag_exit);
1106 MODULE_LICENSE("GPL");
1107 MODULE_ALIAS_NET_PF_PROTO_TYPE(PF_NETLINK, NETLINK_SOCK_DIAG, 2 /* AF_INET */);
1108 MODULE_ALIAS_NET_PF_PROTO_TYPE(PF_NETLINK, NETLINK_SOCK_DIAG, 10 /* AF_INET6 */);