Revert "brcmfmac: move configuration of probe request IEs"
[platform/kernel/linux-rpi.git] / net / netfilter / nf_conntrack_netlink.c
1 /* Connection tracking via netlink socket. Allows for user space
2  * protocol helpers and general trouble making from userspace.
3  *
4  * (C) 2001 by Jay Schulist <jschlst@samba.org>
5  * (C) 2002-2006 by Harald Welte <laforge@gnumonks.org>
6  * (C) 2003 by Patrick Mchardy <kaber@trash.net>
7  * (C) 2005-2012 by Pablo Neira Ayuso <pablo@netfilter.org>
8  *
9  * Initial connection tracking via netlink development funded and
10  * generally made possible by Network Robots, Inc. (www.networkrobots.com)
11  *
12  * Further development of this code funded by Astaro AG (http://www.astaro.com)
13  *
14  * This software may be used and distributed according to the terms
15  * of the GNU General Public License, incorporated herein by reference.
16  */
17
18 #include <linux/init.h>
19 #include <linux/module.h>
20 #include <linux/kernel.h>
21 #include <linux/rculist.h>
22 #include <linux/rculist_nulls.h>
23 #include <linux/types.h>
24 #include <linux/timer.h>
25 #include <linux/security.h>
26 #include <linux/skbuff.h>
27 #include <linux/errno.h>
28 #include <linux/netlink.h>
29 #include <linux/spinlock.h>
30 #include <linux/interrupt.h>
31 #include <linux/slab.h>
32 #include <linux/siphash.h>
33
34 #include <linux/netfilter.h>
35 #include <net/netlink.h>
36 #include <net/sock.h>
37 #include <net/netfilter/nf_conntrack.h>
38 #include <net/netfilter/nf_conntrack_core.h>
39 #include <net/netfilter/nf_conntrack_expect.h>
40 #include <net/netfilter/nf_conntrack_helper.h>
41 #include <net/netfilter/nf_conntrack_seqadj.h>
42 #include <net/netfilter/nf_conntrack_l4proto.h>
43 #include <net/netfilter/nf_conntrack_tuple.h>
44 #include <net/netfilter/nf_conntrack_acct.h>
45 #include <net/netfilter/nf_conntrack_zones.h>
46 #include <net/netfilter/nf_conntrack_timestamp.h>
47 #include <net/netfilter/nf_conntrack_labels.h>
48 #include <net/netfilter/nf_conntrack_synproxy.h>
49 #if IS_ENABLED(CONFIG_NF_NAT)
50 #include <net/netfilter/nf_nat.h>
51 #include <net/netfilter/nf_nat_helper.h>
52 #endif
53
54 #include <linux/netfilter/nfnetlink.h>
55 #include <linux/netfilter/nfnetlink_conntrack.h>
56
57 #include "nf_internals.h"
58
59 MODULE_LICENSE("GPL");
60
61 static int ctnetlink_dump_tuples_proto(struct sk_buff *skb,
62                                 const struct nf_conntrack_tuple *tuple,
63                                 const struct nf_conntrack_l4proto *l4proto)
64 {
65         int ret = 0;
66         struct nlattr *nest_parms;
67
68         nest_parms = nla_nest_start(skb, CTA_TUPLE_PROTO);
69         if (!nest_parms)
70                 goto nla_put_failure;
71         if (nla_put_u8(skb, CTA_PROTO_NUM, tuple->dst.protonum))
72                 goto nla_put_failure;
73
74         if (likely(l4proto->tuple_to_nlattr))
75                 ret = l4proto->tuple_to_nlattr(skb, tuple);
76
77         nla_nest_end(skb, nest_parms);
78
79         return ret;
80
81 nla_put_failure:
82         return -1;
83 }
84
85 static int ipv4_tuple_to_nlattr(struct sk_buff *skb,
86                                 const struct nf_conntrack_tuple *tuple)
87 {
88         if (nla_put_in_addr(skb, CTA_IP_V4_SRC, tuple->src.u3.ip) ||
89             nla_put_in_addr(skb, CTA_IP_V4_DST, tuple->dst.u3.ip))
90                 return -EMSGSIZE;
91         return 0;
92 }
93
94 static int ipv6_tuple_to_nlattr(struct sk_buff *skb,
95                                 const struct nf_conntrack_tuple *tuple)
96 {
97         if (nla_put_in6_addr(skb, CTA_IP_V6_SRC, &tuple->src.u3.in6) ||
98             nla_put_in6_addr(skb, CTA_IP_V6_DST, &tuple->dst.u3.in6))
99                 return -EMSGSIZE;
100         return 0;
101 }
102
103 static int ctnetlink_dump_tuples_ip(struct sk_buff *skb,
104                                     const struct nf_conntrack_tuple *tuple)
105 {
106         int ret = 0;
107         struct nlattr *nest_parms;
108
109         nest_parms = nla_nest_start(skb, CTA_TUPLE_IP);
110         if (!nest_parms)
111                 goto nla_put_failure;
112
113         switch (tuple->src.l3num) {
114         case NFPROTO_IPV4:
115                 ret = ipv4_tuple_to_nlattr(skb, tuple);
116                 break;
117         case NFPROTO_IPV6:
118                 ret = ipv6_tuple_to_nlattr(skb, tuple);
119                 break;
120         }
121
122         nla_nest_end(skb, nest_parms);
123
124         return ret;
125
126 nla_put_failure:
127         return -1;
128 }
129
130 static int ctnetlink_dump_tuples(struct sk_buff *skb,
131                                  const struct nf_conntrack_tuple *tuple)
132 {
133         const struct nf_conntrack_l4proto *l4proto;
134         int ret;
135
136         rcu_read_lock();
137         ret = ctnetlink_dump_tuples_ip(skb, tuple);
138
139         if (ret >= 0) {
140                 l4proto = nf_ct_l4proto_find(tuple->dst.protonum);
141                 ret = ctnetlink_dump_tuples_proto(skb, tuple, l4proto);
142         }
143         rcu_read_unlock();
144         return ret;
145 }
146
147 static int ctnetlink_dump_zone_id(struct sk_buff *skb, int attrtype,
148                                   const struct nf_conntrack_zone *zone, int dir)
149 {
150         if (zone->id == NF_CT_DEFAULT_ZONE_ID || zone->dir != dir)
151                 return 0;
152         if (nla_put_be16(skb, attrtype, htons(zone->id)))
153                 goto nla_put_failure;
154         return 0;
155
156 nla_put_failure:
157         return -1;
158 }
159
160 static int ctnetlink_dump_status(struct sk_buff *skb, const struct nf_conn *ct)
161 {
162         if (nla_put_be32(skb, CTA_STATUS, htonl(ct->status)))
163                 goto nla_put_failure;
164         return 0;
165
166 nla_put_failure:
167         return -1;
168 }
169
170 static int ctnetlink_dump_timeout(struct sk_buff *skb, const struct nf_conn *ct,
171                                   bool skip_zero)
172 {
173         long timeout = nf_ct_expires(ct) / HZ;
174
175         if (skip_zero && timeout == 0)
176                 return 0;
177
178         if (nla_put_be32(skb, CTA_TIMEOUT, htonl(timeout)))
179                 goto nla_put_failure;
180         return 0;
181
182 nla_put_failure:
183         return -1;
184 }
185
186 static int ctnetlink_dump_protoinfo(struct sk_buff *skb, struct nf_conn *ct,
187                                     bool destroy)
188 {
189         const struct nf_conntrack_l4proto *l4proto;
190         struct nlattr *nest_proto;
191         int ret;
192
193         l4proto = nf_ct_l4proto_find(nf_ct_protonum(ct));
194         if (!l4proto->to_nlattr)
195                 return 0;
196
197         nest_proto = nla_nest_start(skb, CTA_PROTOINFO);
198         if (!nest_proto)
199                 goto nla_put_failure;
200
201         ret = l4proto->to_nlattr(skb, nest_proto, ct, destroy);
202
203         nla_nest_end(skb, nest_proto);
204
205         return ret;
206
207 nla_put_failure:
208         return -1;
209 }
210
211 static int ctnetlink_dump_helpinfo(struct sk_buff *skb,
212                                    const struct nf_conn *ct)
213 {
214         struct nlattr *nest_helper;
215         const struct nf_conn_help *help = nfct_help(ct);
216         struct nf_conntrack_helper *helper;
217
218         if (!help)
219                 return 0;
220
221         rcu_read_lock();
222         helper = rcu_dereference(help->helper);
223         if (!helper)
224                 goto out;
225
226         nest_helper = nla_nest_start(skb, CTA_HELP);
227         if (!nest_helper)
228                 goto nla_put_failure;
229         if (nla_put_string(skb, CTA_HELP_NAME, helper->name))
230                 goto nla_put_failure;
231
232         if (helper->to_nlattr)
233                 helper->to_nlattr(skb, ct);
234
235         nla_nest_end(skb, nest_helper);
236 out:
237         rcu_read_unlock();
238         return 0;
239
240 nla_put_failure:
241         rcu_read_unlock();
242         return -1;
243 }
244
245 static int
246 dump_counters(struct sk_buff *skb, struct nf_conn_acct *acct,
247               enum ip_conntrack_dir dir, int type)
248 {
249         enum ctattr_type attr = dir ? CTA_COUNTERS_REPLY: CTA_COUNTERS_ORIG;
250         struct nf_conn_counter *counter = acct->counter;
251         struct nlattr *nest_count;
252         u64 pkts, bytes;
253
254         if (type == IPCTNL_MSG_CT_GET_CTRZERO) {
255                 pkts = atomic64_xchg(&counter[dir].packets, 0);
256                 bytes = atomic64_xchg(&counter[dir].bytes, 0);
257         } else {
258                 pkts = atomic64_read(&counter[dir].packets);
259                 bytes = atomic64_read(&counter[dir].bytes);
260         }
261
262         nest_count = nla_nest_start(skb, attr);
263         if (!nest_count)
264                 goto nla_put_failure;
265
266         if (nla_put_be64(skb, CTA_COUNTERS_PACKETS, cpu_to_be64(pkts),
267                          CTA_COUNTERS_PAD) ||
268             nla_put_be64(skb, CTA_COUNTERS_BYTES, cpu_to_be64(bytes),
269                          CTA_COUNTERS_PAD))
270                 goto nla_put_failure;
271
272         nla_nest_end(skb, nest_count);
273
274         return 0;
275
276 nla_put_failure:
277         return -1;
278 }
279
280 static int
281 ctnetlink_dump_acct(struct sk_buff *skb, const struct nf_conn *ct, int type)
282 {
283         struct nf_conn_acct *acct = nf_conn_acct_find(ct);
284
285         if (!acct)
286                 return 0;
287
288         if (dump_counters(skb, acct, IP_CT_DIR_ORIGINAL, type) < 0)
289                 return -1;
290         if (dump_counters(skb, acct, IP_CT_DIR_REPLY, type) < 0)
291                 return -1;
292
293         return 0;
294 }
295
296 static int
297 ctnetlink_dump_timestamp(struct sk_buff *skb, const struct nf_conn *ct)
298 {
299         struct nlattr *nest_count;
300         const struct nf_conn_tstamp *tstamp;
301
302         tstamp = nf_conn_tstamp_find(ct);
303         if (!tstamp)
304                 return 0;
305
306         nest_count = nla_nest_start(skb, CTA_TIMESTAMP);
307         if (!nest_count)
308                 goto nla_put_failure;
309
310         if (nla_put_be64(skb, CTA_TIMESTAMP_START, cpu_to_be64(tstamp->start),
311                          CTA_TIMESTAMP_PAD) ||
312             (tstamp->stop != 0 && nla_put_be64(skb, CTA_TIMESTAMP_STOP,
313                                                cpu_to_be64(tstamp->stop),
314                                                CTA_TIMESTAMP_PAD)))
315                 goto nla_put_failure;
316         nla_nest_end(skb, nest_count);
317
318         return 0;
319
320 nla_put_failure:
321         return -1;
322 }
323
324 #ifdef CONFIG_NF_CONNTRACK_MARK
325 static int ctnetlink_dump_mark(struct sk_buff *skb, const struct nf_conn *ct)
326 {
327         u32 mark = READ_ONCE(ct->mark);
328
329         if (!mark)
330                 return 0;
331
332         if (nla_put_be32(skb, CTA_MARK, htonl(mark)))
333                 goto nla_put_failure;
334         return 0;
335
336 nla_put_failure:
337         return -1;
338 }
339 #else
340 #define ctnetlink_dump_mark(a, b) (0)
341 #endif
342
343 #ifdef CONFIG_NF_CONNTRACK_SECMARK
344 static int ctnetlink_dump_secctx(struct sk_buff *skb, const struct nf_conn *ct)
345 {
346         struct nlattr *nest_secctx;
347         int len, ret;
348         char *secctx;
349
350         ret = security_secid_to_secctx(ct->secmark, &secctx, &len);
351         if (ret)
352                 return 0;
353
354         ret = -1;
355         nest_secctx = nla_nest_start(skb, CTA_SECCTX);
356         if (!nest_secctx)
357                 goto nla_put_failure;
358
359         if (nla_put_string(skb, CTA_SECCTX_NAME, secctx))
360                 goto nla_put_failure;
361         nla_nest_end(skb, nest_secctx);
362
363         ret = 0;
364 nla_put_failure:
365         security_release_secctx(secctx, len);
366         return ret;
367 }
368 #else
369 #define ctnetlink_dump_secctx(a, b) (0)
370 #endif
371
372 #ifdef CONFIG_NF_CONNTRACK_LABELS
373 static inline int ctnetlink_label_size(const struct nf_conn *ct)
374 {
375         struct nf_conn_labels *labels = nf_ct_labels_find(ct);
376
377         if (!labels)
378                 return 0;
379         return nla_total_size(sizeof(labels->bits));
380 }
381
382 static int
383 ctnetlink_dump_labels(struct sk_buff *skb, const struct nf_conn *ct)
384 {
385         struct nf_conn_labels *labels = nf_ct_labels_find(ct);
386         unsigned int i;
387
388         if (!labels)
389                 return 0;
390
391         i = 0;
392         do {
393                 if (labels->bits[i] != 0)
394                         return nla_put(skb, CTA_LABELS, sizeof(labels->bits),
395                                        labels->bits);
396                 i++;
397         } while (i < ARRAY_SIZE(labels->bits));
398
399         return 0;
400 }
401 #else
402 #define ctnetlink_dump_labels(a, b) (0)
403 #define ctnetlink_label_size(a) (0)
404 #endif
405
406 #define master_tuple(ct) &(ct->master->tuplehash[IP_CT_DIR_ORIGINAL].tuple)
407
408 static int ctnetlink_dump_master(struct sk_buff *skb, const struct nf_conn *ct)
409 {
410         struct nlattr *nest_parms;
411
412         if (!(ct->status & IPS_EXPECTED))
413                 return 0;
414
415         nest_parms = nla_nest_start(skb, CTA_TUPLE_MASTER);
416         if (!nest_parms)
417                 goto nla_put_failure;
418         if (ctnetlink_dump_tuples(skb, master_tuple(ct)) < 0)
419                 goto nla_put_failure;
420         nla_nest_end(skb, nest_parms);
421
422         return 0;
423
424 nla_put_failure:
425         return -1;
426 }
427
428 static int
429 dump_ct_seq_adj(struct sk_buff *skb, const struct nf_ct_seqadj *seq, int type)
430 {
431         struct nlattr *nest_parms;
432
433         nest_parms = nla_nest_start(skb, type);
434         if (!nest_parms)
435                 goto nla_put_failure;
436
437         if (nla_put_be32(skb, CTA_SEQADJ_CORRECTION_POS,
438                          htonl(seq->correction_pos)) ||
439             nla_put_be32(skb, CTA_SEQADJ_OFFSET_BEFORE,
440                          htonl(seq->offset_before)) ||
441             nla_put_be32(skb, CTA_SEQADJ_OFFSET_AFTER,
442                          htonl(seq->offset_after)))
443                 goto nla_put_failure;
444
445         nla_nest_end(skb, nest_parms);
446
447         return 0;
448
449 nla_put_failure:
450         return -1;
451 }
452
453 static int ctnetlink_dump_ct_seq_adj(struct sk_buff *skb, struct nf_conn *ct)
454 {
455         struct nf_conn_seqadj *seqadj = nfct_seqadj(ct);
456         struct nf_ct_seqadj *seq;
457
458         if (!(ct->status & IPS_SEQ_ADJUST) || !seqadj)
459                 return 0;
460
461         spin_lock_bh(&ct->lock);
462         seq = &seqadj->seq[IP_CT_DIR_ORIGINAL];
463         if (dump_ct_seq_adj(skb, seq, CTA_SEQ_ADJ_ORIG) == -1)
464                 goto err;
465
466         seq = &seqadj->seq[IP_CT_DIR_REPLY];
467         if (dump_ct_seq_adj(skb, seq, CTA_SEQ_ADJ_REPLY) == -1)
468                 goto err;
469
470         spin_unlock_bh(&ct->lock);
471         return 0;
472 err:
473         spin_unlock_bh(&ct->lock);
474         return -1;
475 }
476
477 static int ctnetlink_dump_ct_synproxy(struct sk_buff *skb, struct nf_conn *ct)
478 {
479         struct nf_conn_synproxy *synproxy = nfct_synproxy(ct);
480         struct nlattr *nest_parms;
481
482         if (!synproxy)
483                 return 0;
484
485         nest_parms = nla_nest_start(skb, CTA_SYNPROXY);
486         if (!nest_parms)
487                 goto nla_put_failure;
488
489         if (nla_put_be32(skb, CTA_SYNPROXY_ISN, htonl(synproxy->isn)) ||
490             nla_put_be32(skb, CTA_SYNPROXY_ITS, htonl(synproxy->its)) ||
491             nla_put_be32(skb, CTA_SYNPROXY_TSOFF, htonl(synproxy->tsoff)))
492                 goto nla_put_failure;
493
494         nla_nest_end(skb, nest_parms);
495
496         return 0;
497
498 nla_put_failure:
499         return -1;
500 }
501
502 static int ctnetlink_dump_id(struct sk_buff *skb, const struct nf_conn *ct)
503 {
504         __be32 id = (__force __be32)nf_ct_get_id(ct);
505
506         if (nla_put_be32(skb, CTA_ID, id))
507                 goto nla_put_failure;
508         return 0;
509
510 nla_put_failure:
511         return -1;
512 }
513
514 static int ctnetlink_dump_use(struct sk_buff *skb, const struct nf_conn *ct)
515 {
516         if (nla_put_be32(skb, CTA_USE, htonl(refcount_read(&ct->ct_general.use))))
517                 goto nla_put_failure;
518         return 0;
519
520 nla_put_failure:
521         return -1;
522 }
523
524 /* all these functions access ct->ext. Caller must either hold a reference
525  * on ct or prevent its deletion by holding either the bucket spinlock or
526  * pcpu dying list lock.
527  */
528 static int ctnetlink_dump_extinfo(struct sk_buff *skb,
529                                   struct nf_conn *ct, u32 type)
530 {
531         if (ctnetlink_dump_acct(skb, ct, type) < 0 ||
532             ctnetlink_dump_timestamp(skb, ct) < 0 ||
533             ctnetlink_dump_helpinfo(skb, ct) < 0 ||
534             ctnetlink_dump_labels(skb, ct) < 0 ||
535             ctnetlink_dump_ct_seq_adj(skb, ct) < 0 ||
536             ctnetlink_dump_ct_synproxy(skb, ct) < 0)
537                 return -1;
538
539         return 0;
540 }
541
542 static int ctnetlink_dump_info(struct sk_buff *skb, struct nf_conn *ct)
543 {
544         if (ctnetlink_dump_status(skb, ct) < 0 ||
545             ctnetlink_dump_mark(skb, ct) < 0 ||
546             ctnetlink_dump_secctx(skb, ct) < 0 ||
547             ctnetlink_dump_id(skb, ct) < 0 ||
548             ctnetlink_dump_use(skb, ct) < 0 ||
549             ctnetlink_dump_master(skb, ct) < 0)
550                 return -1;
551
552         if (!test_bit(IPS_OFFLOAD_BIT, &ct->status) &&
553             (ctnetlink_dump_timeout(skb, ct, false) < 0 ||
554              ctnetlink_dump_protoinfo(skb, ct, false) < 0))
555                 return -1;
556
557         return 0;
558 }
559
560 static int
561 ctnetlink_fill_info(struct sk_buff *skb, u32 portid, u32 seq, u32 type,
562                     struct nf_conn *ct, bool extinfo, unsigned int flags)
563 {
564         const struct nf_conntrack_zone *zone;
565         struct nlmsghdr *nlh;
566         struct nlattr *nest_parms;
567         unsigned int event;
568
569         if (portid)
570                 flags |= NLM_F_MULTI;
571         event = nfnl_msg_type(NFNL_SUBSYS_CTNETLINK, IPCTNL_MSG_CT_NEW);
572         nlh = nfnl_msg_put(skb, portid, seq, event, flags, nf_ct_l3num(ct),
573                            NFNETLINK_V0, 0);
574         if (!nlh)
575                 goto nlmsg_failure;
576
577         zone = nf_ct_zone(ct);
578
579         nest_parms = nla_nest_start(skb, CTA_TUPLE_ORIG);
580         if (!nest_parms)
581                 goto nla_put_failure;
582         if (ctnetlink_dump_tuples(skb, nf_ct_tuple(ct, IP_CT_DIR_ORIGINAL)) < 0)
583                 goto nla_put_failure;
584         if (ctnetlink_dump_zone_id(skb, CTA_TUPLE_ZONE, zone,
585                                    NF_CT_ZONE_DIR_ORIG) < 0)
586                 goto nla_put_failure;
587         nla_nest_end(skb, nest_parms);
588
589         nest_parms = nla_nest_start(skb, CTA_TUPLE_REPLY);
590         if (!nest_parms)
591                 goto nla_put_failure;
592         if (ctnetlink_dump_tuples(skb, nf_ct_tuple(ct, IP_CT_DIR_REPLY)) < 0)
593                 goto nla_put_failure;
594         if (ctnetlink_dump_zone_id(skb, CTA_TUPLE_ZONE, zone,
595                                    NF_CT_ZONE_DIR_REPL) < 0)
596                 goto nla_put_failure;
597         nla_nest_end(skb, nest_parms);
598
599         if (ctnetlink_dump_zone_id(skb, CTA_ZONE, zone,
600                                    NF_CT_DEFAULT_ZONE_DIR) < 0)
601                 goto nla_put_failure;
602
603         if (ctnetlink_dump_info(skb, ct) < 0)
604                 goto nla_put_failure;
605         if (extinfo && ctnetlink_dump_extinfo(skb, ct, type) < 0)
606                 goto nla_put_failure;
607
608         nlmsg_end(skb, nlh);
609         return skb->len;
610
611 nlmsg_failure:
612 nla_put_failure:
613         nlmsg_cancel(skb, nlh);
614         return -1;
615 }
616
617 static const struct nla_policy cta_ip_nla_policy[CTA_IP_MAX + 1] = {
618         [CTA_IP_V4_SRC] = { .type = NLA_U32 },
619         [CTA_IP_V4_DST] = { .type = NLA_U32 },
620         [CTA_IP_V6_SRC] = { .len = sizeof(__be32) * 4 },
621         [CTA_IP_V6_DST] = { .len = sizeof(__be32) * 4 },
622 };
623
624 #if defined(CONFIG_NETFILTER_NETLINK_GLUE_CT) || defined(CONFIG_NF_CONNTRACK_EVENTS)
625 static size_t ctnetlink_proto_size(const struct nf_conn *ct)
626 {
627         const struct nf_conntrack_l4proto *l4proto;
628         size_t len, len4 = 0;
629
630         len = nla_policy_len(cta_ip_nla_policy, CTA_IP_MAX + 1);
631         len *= 3u; /* ORIG, REPLY, MASTER */
632
633         l4proto = nf_ct_l4proto_find(nf_ct_protonum(ct));
634         len += l4proto->nlattr_size;
635         if (l4proto->nlattr_tuple_size) {
636                 len4 = l4proto->nlattr_tuple_size();
637                 len4 *= 3u; /* ORIG, REPLY, MASTER */
638         }
639
640         return len + len4;
641 }
642 #endif
643
644 static inline size_t ctnetlink_acct_size(const struct nf_conn *ct)
645 {
646         if (!nf_ct_ext_exist(ct, NF_CT_EXT_ACCT))
647                 return 0;
648         return 2 * nla_total_size(0) /* CTA_COUNTERS_ORIG|REPL */
649                + 2 * nla_total_size_64bit(sizeof(uint64_t)) /* CTA_COUNTERS_PACKETS */
650                + 2 * nla_total_size_64bit(sizeof(uint64_t)) /* CTA_COUNTERS_BYTES */
651                ;
652 }
653
654 static inline int ctnetlink_secctx_size(const struct nf_conn *ct)
655 {
656 #ifdef CONFIG_NF_CONNTRACK_SECMARK
657         int len, ret;
658
659         ret = security_secid_to_secctx(ct->secmark, NULL, &len);
660         if (ret)
661                 return 0;
662
663         return nla_total_size(0) /* CTA_SECCTX */
664                + nla_total_size(sizeof(char) * len); /* CTA_SECCTX_NAME */
665 #else
666         return 0;
667 #endif
668 }
669
670 static inline size_t ctnetlink_timestamp_size(const struct nf_conn *ct)
671 {
672 #ifdef CONFIG_NF_CONNTRACK_TIMESTAMP
673         if (!nf_ct_ext_exist(ct, NF_CT_EXT_TSTAMP))
674                 return 0;
675         return nla_total_size(0) + 2 * nla_total_size_64bit(sizeof(uint64_t));
676 #else
677         return 0;
678 #endif
679 }
680
681 #ifdef CONFIG_NF_CONNTRACK_EVENTS
682 static size_t ctnetlink_nlmsg_size(const struct nf_conn *ct)
683 {
684         return NLMSG_ALIGN(sizeof(struct nfgenmsg))
685                + 3 * nla_total_size(0) /* CTA_TUPLE_ORIG|REPL|MASTER */
686                + 3 * nla_total_size(0) /* CTA_TUPLE_IP */
687                + 3 * nla_total_size(0) /* CTA_TUPLE_PROTO */
688                + 3 * nla_total_size(sizeof(u_int8_t)) /* CTA_PROTO_NUM */
689                + nla_total_size(sizeof(u_int32_t)) /* CTA_ID */
690                + nla_total_size(sizeof(u_int32_t)) /* CTA_STATUS */
691                + ctnetlink_acct_size(ct)
692                + ctnetlink_timestamp_size(ct)
693                + nla_total_size(sizeof(u_int32_t)) /* CTA_TIMEOUT */
694                + nla_total_size(0) /* CTA_PROTOINFO */
695                + nla_total_size(0) /* CTA_HELP */
696                + nla_total_size(NF_CT_HELPER_NAME_LEN) /* CTA_HELP_NAME */
697                + ctnetlink_secctx_size(ct)
698 #if IS_ENABLED(CONFIG_NF_NAT)
699                + 2 * nla_total_size(0) /* CTA_NAT_SEQ_ADJ_ORIG|REPL */
700                + 6 * nla_total_size(sizeof(u_int32_t)) /* CTA_NAT_SEQ_OFFSET */
701 #endif
702 #ifdef CONFIG_NF_CONNTRACK_MARK
703                + nla_total_size(sizeof(u_int32_t)) /* CTA_MARK */
704 #endif
705 #ifdef CONFIG_NF_CONNTRACK_ZONES
706                + nla_total_size(sizeof(u_int16_t)) /* CTA_ZONE|CTA_TUPLE_ZONE */
707 #endif
708                + ctnetlink_proto_size(ct)
709                + ctnetlink_label_size(ct)
710                ;
711 }
712
713 static int
714 ctnetlink_conntrack_event(unsigned int events, const struct nf_ct_event *item)
715 {
716         const struct nf_conntrack_zone *zone;
717         struct net *net;
718         struct nlmsghdr *nlh;
719         struct nlattr *nest_parms;
720         struct nf_conn *ct = item->ct;
721         struct sk_buff *skb;
722         unsigned int type;
723         unsigned int flags = 0, group;
724         int err;
725
726         if (events & (1 << IPCT_DESTROY)) {
727                 type = IPCTNL_MSG_CT_DELETE;
728                 group = NFNLGRP_CONNTRACK_DESTROY;
729         } else if (events & ((1 << IPCT_NEW) | (1 << IPCT_RELATED))) {
730                 type = IPCTNL_MSG_CT_NEW;
731                 flags = NLM_F_CREATE|NLM_F_EXCL;
732                 group = NFNLGRP_CONNTRACK_NEW;
733         } else if (events) {
734                 type = IPCTNL_MSG_CT_NEW;
735                 group = NFNLGRP_CONNTRACK_UPDATE;
736         } else
737                 return 0;
738
739         net = nf_ct_net(ct);
740         if (!item->report && !nfnetlink_has_listeners(net, group))
741                 return 0;
742
743         skb = nlmsg_new(ctnetlink_nlmsg_size(ct), GFP_ATOMIC);
744         if (skb == NULL)
745                 goto errout;
746
747         type = nfnl_msg_type(NFNL_SUBSYS_CTNETLINK, type);
748         nlh = nfnl_msg_put(skb, item->portid, 0, type, flags, nf_ct_l3num(ct),
749                            NFNETLINK_V0, 0);
750         if (!nlh)
751                 goto nlmsg_failure;
752
753         zone = nf_ct_zone(ct);
754
755         nest_parms = nla_nest_start(skb, CTA_TUPLE_ORIG);
756         if (!nest_parms)
757                 goto nla_put_failure;
758         if (ctnetlink_dump_tuples(skb, nf_ct_tuple(ct, IP_CT_DIR_ORIGINAL)) < 0)
759                 goto nla_put_failure;
760         if (ctnetlink_dump_zone_id(skb, CTA_TUPLE_ZONE, zone,
761                                    NF_CT_ZONE_DIR_ORIG) < 0)
762                 goto nla_put_failure;
763         nla_nest_end(skb, nest_parms);
764
765         nest_parms = nla_nest_start(skb, CTA_TUPLE_REPLY);
766         if (!nest_parms)
767                 goto nla_put_failure;
768         if (ctnetlink_dump_tuples(skb, nf_ct_tuple(ct, IP_CT_DIR_REPLY)) < 0)
769                 goto nla_put_failure;
770         if (ctnetlink_dump_zone_id(skb, CTA_TUPLE_ZONE, zone,
771                                    NF_CT_ZONE_DIR_REPL) < 0)
772                 goto nla_put_failure;
773         nla_nest_end(skb, nest_parms);
774
775         if (ctnetlink_dump_zone_id(skb, CTA_ZONE, zone,
776                                    NF_CT_DEFAULT_ZONE_DIR) < 0)
777                 goto nla_put_failure;
778
779         if (ctnetlink_dump_id(skb, ct) < 0)
780                 goto nla_put_failure;
781
782         if (ctnetlink_dump_status(skb, ct) < 0)
783                 goto nla_put_failure;
784
785         if (events & (1 << IPCT_DESTROY)) {
786                 if (ctnetlink_dump_timeout(skb, ct, true) < 0)
787                         goto nla_put_failure;
788
789                 if (ctnetlink_dump_acct(skb, ct, type) < 0 ||
790                     ctnetlink_dump_timestamp(skb, ct) < 0 ||
791                     ctnetlink_dump_protoinfo(skb, ct, true) < 0)
792                         goto nla_put_failure;
793         } else {
794                 if (ctnetlink_dump_timeout(skb, ct, false) < 0)
795                         goto nla_put_failure;
796
797                 if (events & (1 << IPCT_PROTOINFO) &&
798                     ctnetlink_dump_protoinfo(skb, ct, false) < 0)
799                         goto nla_put_failure;
800
801                 if ((events & (1 << IPCT_HELPER) || nfct_help(ct))
802                     && ctnetlink_dump_helpinfo(skb, ct) < 0)
803                         goto nla_put_failure;
804
805 #ifdef CONFIG_NF_CONNTRACK_SECMARK
806                 if ((events & (1 << IPCT_SECMARK) || ct->secmark)
807                     && ctnetlink_dump_secctx(skb, ct) < 0)
808                         goto nla_put_failure;
809 #endif
810                 if (events & (1 << IPCT_LABEL) &&
811                      ctnetlink_dump_labels(skb, ct) < 0)
812                         goto nla_put_failure;
813
814                 if (events & (1 << IPCT_RELATED) &&
815                     ctnetlink_dump_master(skb, ct) < 0)
816                         goto nla_put_failure;
817
818                 if (events & (1 << IPCT_SEQADJ) &&
819                     ctnetlink_dump_ct_seq_adj(skb, ct) < 0)
820                         goto nla_put_failure;
821
822                 if (events & (1 << IPCT_SYNPROXY) &&
823                     ctnetlink_dump_ct_synproxy(skb, ct) < 0)
824                         goto nla_put_failure;
825         }
826
827 #ifdef CONFIG_NF_CONNTRACK_MARK
828         if (events & (1 << IPCT_MARK) &&
829             ctnetlink_dump_mark(skb, ct) < 0)
830                 goto nla_put_failure;
831 #endif
832         nlmsg_end(skb, nlh);
833         err = nfnetlink_send(skb, net, item->portid, group, item->report,
834                              GFP_ATOMIC);
835         if (err == -ENOBUFS || err == -EAGAIN)
836                 return -ENOBUFS;
837
838         return 0;
839
840 nla_put_failure:
841         nlmsg_cancel(skb, nlh);
842 nlmsg_failure:
843         kfree_skb(skb);
844 errout:
845         if (nfnetlink_set_err(net, 0, group, -ENOBUFS) > 0)
846                 return -ENOBUFS;
847
848         return 0;
849 }
850 #endif /* CONFIG_NF_CONNTRACK_EVENTS */
851
852 static int ctnetlink_done(struct netlink_callback *cb)
853 {
854         if (cb->args[1])
855                 nf_ct_put((struct nf_conn *)cb->args[1]);
856         kfree(cb->data);
857         return 0;
858 }
859
860 struct ctnetlink_filter_u32 {
861         u32 val;
862         u32 mask;
863 };
864
865 struct ctnetlink_filter {
866         u8 family;
867
868         u_int32_t orig_flags;
869         u_int32_t reply_flags;
870
871         struct nf_conntrack_tuple orig;
872         struct nf_conntrack_tuple reply;
873         struct nf_conntrack_zone zone;
874
875         struct ctnetlink_filter_u32 mark;
876         struct ctnetlink_filter_u32 status;
877 };
878
879 static const struct nla_policy cta_filter_nla_policy[CTA_FILTER_MAX + 1] = {
880         [CTA_FILTER_ORIG_FLAGS]         = { .type = NLA_U32 },
881         [CTA_FILTER_REPLY_FLAGS]        = { .type = NLA_U32 },
882 };
883
884 static int ctnetlink_parse_filter(const struct nlattr *attr,
885                                   struct ctnetlink_filter *filter)
886 {
887         struct nlattr *tb[CTA_FILTER_MAX + 1];
888         int ret = 0;
889
890         ret = nla_parse_nested(tb, CTA_FILTER_MAX, attr, cta_filter_nla_policy,
891                                NULL);
892         if (ret)
893                 return ret;
894
895         if (tb[CTA_FILTER_ORIG_FLAGS]) {
896                 filter->orig_flags = nla_get_u32(tb[CTA_FILTER_ORIG_FLAGS]);
897                 if (filter->orig_flags & ~CTA_FILTER_F_ALL)
898                         return -EOPNOTSUPP;
899         }
900
901         if (tb[CTA_FILTER_REPLY_FLAGS]) {
902                 filter->reply_flags = nla_get_u32(tb[CTA_FILTER_REPLY_FLAGS]);
903                 if (filter->reply_flags & ~CTA_FILTER_F_ALL)
904                         return -EOPNOTSUPP;
905         }
906
907         return 0;
908 }
909
910 static int ctnetlink_parse_zone(const struct nlattr *attr,
911                                 struct nf_conntrack_zone *zone);
912 static int ctnetlink_parse_tuple_filter(const struct nlattr * const cda[],
913                                          struct nf_conntrack_tuple *tuple,
914                                          u32 type, u_int8_t l3num,
915                                          struct nf_conntrack_zone *zone,
916                                          u_int32_t flags);
917
918 static int ctnetlink_filter_parse_mark(struct ctnetlink_filter_u32 *mark,
919                                        const struct nlattr * const cda[])
920 {
921 #ifdef CONFIG_NF_CONNTRACK_MARK
922         if (cda[CTA_MARK]) {
923                 mark->val = ntohl(nla_get_be32(cda[CTA_MARK]));
924
925                 if (cda[CTA_MARK_MASK])
926                         mark->mask = ntohl(nla_get_be32(cda[CTA_MARK_MASK]));
927                 else
928                         mark->mask = 0xffffffff;
929         } else if (cda[CTA_MARK_MASK]) {
930                 return -EINVAL;
931         }
932 #endif
933         return 0;
934 }
935
936 static int ctnetlink_filter_parse_status(struct ctnetlink_filter_u32 *status,
937                                          const struct nlattr * const cda[])
938 {
939         if (cda[CTA_STATUS]) {
940                 status->val = ntohl(nla_get_be32(cda[CTA_STATUS]));
941                 if (cda[CTA_STATUS_MASK])
942                         status->mask = ntohl(nla_get_be32(cda[CTA_STATUS_MASK]));
943                 else
944                         status->mask = status->val;
945
946                 /* status->val == 0? always true, else always false. */
947                 if (status->mask == 0)
948                         return -EINVAL;
949         } else if (cda[CTA_STATUS_MASK]) {
950                 return -EINVAL;
951         }
952
953         /* CTA_STATUS is NLA_U32, if this fires UAPI needs to be extended */
954         BUILD_BUG_ON(__IPS_MAX_BIT >= 32);
955         return 0;
956 }
957
958 static struct ctnetlink_filter *
959 ctnetlink_alloc_filter(const struct nlattr * const cda[], u8 family)
960 {
961         struct ctnetlink_filter *filter;
962         int err;
963
964 #ifndef CONFIG_NF_CONNTRACK_MARK
965         if (cda[CTA_MARK] || cda[CTA_MARK_MASK])
966                 return ERR_PTR(-EOPNOTSUPP);
967 #endif
968
969         filter = kzalloc(sizeof(*filter), GFP_KERNEL);
970         if (filter == NULL)
971                 return ERR_PTR(-ENOMEM);
972
973         filter->family = family;
974
975         err = ctnetlink_filter_parse_mark(&filter->mark, cda);
976         if (err)
977                 goto err_filter;
978
979         err = ctnetlink_filter_parse_status(&filter->status, cda);
980         if (err)
981                 goto err_filter;
982
983         if (!cda[CTA_FILTER])
984                 return filter;
985
986         err = ctnetlink_parse_zone(cda[CTA_ZONE], &filter->zone);
987         if (err < 0)
988                 goto err_filter;
989
990         err = ctnetlink_parse_filter(cda[CTA_FILTER], filter);
991         if (err < 0)
992                 goto err_filter;
993
994         if (filter->orig_flags) {
995                 if (!cda[CTA_TUPLE_ORIG]) {
996                         err = -EINVAL;
997                         goto err_filter;
998                 }
999
1000                 err = ctnetlink_parse_tuple_filter(cda, &filter->orig,
1001                                                    CTA_TUPLE_ORIG,
1002                                                    filter->family,
1003                                                    &filter->zone,
1004                                                    filter->orig_flags);
1005                 if (err < 0)
1006                         goto err_filter;
1007         }
1008
1009         if (filter->reply_flags) {
1010                 if (!cda[CTA_TUPLE_REPLY]) {
1011                         err = -EINVAL;
1012                         goto err_filter;
1013                 }
1014
1015                 err = ctnetlink_parse_tuple_filter(cda, &filter->reply,
1016                                                    CTA_TUPLE_REPLY,
1017                                                    filter->family,
1018                                                    &filter->zone,
1019                                                    filter->reply_flags);
1020                 if (err < 0)
1021                         goto err_filter;
1022         }
1023
1024         return filter;
1025
1026 err_filter:
1027         kfree(filter);
1028
1029         return ERR_PTR(err);
1030 }
1031
1032 static bool ctnetlink_needs_filter(u8 family, const struct nlattr * const *cda)
1033 {
1034         return family || cda[CTA_MARK] || cda[CTA_FILTER] || cda[CTA_STATUS];
1035 }
1036
1037 static int ctnetlink_start(struct netlink_callback *cb)
1038 {
1039         const struct nlattr * const *cda = cb->data;
1040         struct ctnetlink_filter *filter = NULL;
1041         struct nfgenmsg *nfmsg = nlmsg_data(cb->nlh);
1042         u8 family = nfmsg->nfgen_family;
1043
1044         if (ctnetlink_needs_filter(family, cda)) {
1045                 filter = ctnetlink_alloc_filter(cda, family);
1046                 if (IS_ERR(filter))
1047                         return PTR_ERR(filter);
1048         }
1049
1050         cb->data = filter;
1051         return 0;
1052 }
1053
1054 static int ctnetlink_filter_match_tuple(struct nf_conntrack_tuple *filter_tuple,
1055                                         struct nf_conntrack_tuple *ct_tuple,
1056                                         u_int32_t flags, int family)
1057 {
1058         switch (family) {
1059         case NFPROTO_IPV4:
1060                 if ((flags & CTA_FILTER_FLAG(CTA_IP_SRC)) &&
1061                     filter_tuple->src.u3.ip != ct_tuple->src.u3.ip)
1062                         return  0;
1063
1064                 if ((flags & CTA_FILTER_FLAG(CTA_IP_DST)) &&
1065                     filter_tuple->dst.u3.ip != ct_tuple->dst.u3.ip)
1066                         return  0;
1067                 break;
1068         case NFPROTO_IPV6:
1069                 if ((flags & CTA_FILTER_FLAG(CTA_IP_SRC)) &&
1070                     !ipv6_addr_cmp(&filter_tuple->src.u3.in6,
1071                                    &ct_tuple->src.u3.in6))
1072                         return 0;
1073
1074                 if ((flags & CTA_FILTER_FLAG(CTA_IP_DST)) &&
1075                     !ipv6_addr_cmp(&filter_tuple->dst.u3.in6,
1076                                    &ct_tuple->dst.u3.in6))
1077                         return 0;
1078                 break;
1079         }
1080
1081         if ((flags & CTA_FILTER_FLAG(CTA_PROTO_NUM)) &&
1082             filter_tuple->dst.protonum != ct_tuple->dst.protonum)
1083                 return 0;
1084
1085         switch (ct_tuple->dst.protonum) {
1086         case IPPROTO_TCP:
1087         case IPPROTO_UDP:
1088                 if ((flags & CTA_FILTER_FLAG(CTA_PROTO_SRC_PORT)) &&
1089                     filter_tuple->src.u.tcp.port != ct_tuple->src.u.tcp.port)
1090                         return 0;
1091
1092                 if ((flags & CTA_FILTER_FLAG(CTA_PROTO_DST_PORT)) &&
1093                     filter_tuple->dst.u.tcp.port != ct_tuple->dst.u.tcp.port)
1094                         return 0;
1095                 break;
1096         case IPPROTO_ICMP:
1097                 if ((flags & CTA_FILTER_FLAG(CTA_PROTO_ICMP_TYPE)) &&
1098                     filter_tuple->dst.u.icmp.type != ct_tuple->dst.u.icmp.type)
1099                         return 0;
1100                 if ((flags & CTA_FILTER_FLAG(CTA_PROTO_ICMP_CODE)) &&
1101                     filter_tuple->dst.u.icmp.code != ct_tuple->dst.u.icmp.code)
1102                         return 0;
1103                 if ((flags & CTA_FILTER_FLAG(CTA_PROTO_ICMP_ID)) &&
1104                     filter_tuple->src.u.icmp.id != ct_tuple->src.u.icmp.id)
1105                         return 0;
1106                 break;
1107         case IPPROTO_ICMPV6:
1108                 if ((flags & CTA_FILTER_FLAG(CTA_PROTO_ICMPV6_TYPE)) &&
1109                     filter_tuple->dst.u.icmp.type != ct_tuple->dst.u.icmp.type)
1110                         return 0;
1111                 if ((flags & CTA_FILTER_FLAG(CTA_PROTO_ICMPV6_CODE)) &&
1112                     filter_tuple->dst.u.icmp.code != ct_tuple->dst.u.icmp.code)
1113                         return 0;
1114                 if ((flags & CTA_FILTER_FLAG(CTA_PROTO_ICMPV6_ID)) &&
1115                     filter_tuple->src.u.icmp.id != ct_tuple->src.u.icmp.id)
1116                         return 0;
1117                 break;
1118         }
1119
1120         return 1;
1121 }
1122
1123 static int ctnetlink_filter_match(struct nf_conn *ct, void *data)
1124 {
1125         struct ctnetlink_filter *filter = data;
1126         struct nf_conntrack_tuple *tuple;
1127         u32 status;
1128
1129         if (filter == NULL)
1130                 goto out;
1131
1132         /* Match entries of a given L3 protocol number.
1133          * If it is not specified, ie. l3proto == 0,
1134          * then match everything.
1135          */
1136         if (filter->family && nf_ct_l3num(ct) != filter->family)
1137                 goto ignore_entry;
1138
1139         if (filter->orig_flags) {
1140                 tuple = nf_ct_tuple(ct, IP_CT_DIR_ORIGINAL);
1141                 if (!ctnetlink_filter_match_tuple(&filter->orig, tuple,
1142                                                   filter->orig_flags,
1143                                                   filter->family))
1144                         goto ignore_entry;
1145         }
1146
1147         if (filter->reply_flags) {
1148                 tuple = nf_ct_tuple(ct, IP_CT_DIR_REPLY);
1149                 if (!ctnetlink_filter_match_tuple(&filter->reply, tuple,
1150                                                   filter->reply_flags,
1151                                                   filter->family))
1152                         goto ignore_entry;
1153         }
1154
1155 #ifdef CONFIG_NF_CONNTRACK_MARK
1156         if ((READ_ONCE(ct->mark) & filter->mark.mask) != filter->mark.val)
1157                 goto ignore_entry;
1158 #endif
1159         status = (u32)READ_ONCE(ct->status);
1160         if ((status & filter->status.mask) != filter->status.val)
1161                 goto ignore_entry;
1162
1163 out:
1164         return 1;
1165
1166 ignore_entry:
1167         return 0;
1168 }
1169
1170 static int
1171 ctnetlink_dump_table(struct sk_buff *skb, struct netlink_callback *cb)
1172 {
1173         unsigned int flags = cb->data ? NLM_F_DUMP_FILTERED : 0;
1174         struct net *net = sock_net(skb->sk);
1175         struct nf_conn *ct, *last;
1176         struct nf_conntrack_tuple_hash *h;
1177         struct hlist_nulls_node *n;
1178         struct nf_conn *nf_ct_evict[8];
1179         int res, i;
1180         spinlock_t *lockp;
1181
1182         last = (struct nf_conn *)cb->args[1];
1183         i = 0;
1184
1185         local_bh_disable();
1186         for (; cb->args[0] < nf_conntrack_htable_size; cb->args[0]++) {
1187 restart:
1188                 while (i) {
1189                         i--;
1190                         if (nf_ct_should_gc(nf_ct_evict[i]))
1191                                 nf_ct_kill(nf_ct_evict[i]);
1192                         nf_ct_put(nf_ct_evict[i]);
1193                 }
1194
1195                 lockp = &nf_conntrack_locks[cb->args[0] % CONNTRACK_LOCKS];
1196                 nf_conntrack_lock(lockp);
1197                 if (cb->args[0] >= nf_conntrack_htable_size) {
1198                         spin_unlock(lockp);
1199                         goto out;
1200                 }
1201                 hlist_nulls_for_each_entry(h, n, &nf_conntrack_hash[cb->args[0]],
1202                                            hnnode) {
1203                         if (NF_CT_DIRECTION(h) != IP_CT_DIR_ORIGINAL)
1204                                 continue;
1205                         ct = nf_ct_tuplehash_to_ctrack(h);
1206                         if (nf_ct_is_expired(ct)) {
1207                                 if (i < ARRAY_SIZE(nf_ct_evict) &&
1208                                     refcount_inc_not_zero(&ct->ct_general.use))
1209                                         nf_ct_evict[i++] = ct;
1210                                 continue;
1211                         }
1212
1213                         if (!net_eq(net, nf_ct_net(ct)))
1214                                 continue;
1215
1216                         if (cb->args[1]) {
1217                                 if (ct != last)
1218                                         continue;
1219                                 cb->args[1] = 0;
1220                         }
1221                         if (!ctnetlink_filter_match(ct, cb->data))
1222                                 continue;
1223
1224                         res =
1225                         ctnetlink_fill_info(skb, NETLINK_CB(cb->skb).portid,
1226                                             cb->nlh->nlmsg_seq,
1227                                             NFNL_MSG_TYPE(cb->nlh->nlmsg_type),
1228                                             ct, true, flags);
1229                         if (res < 0) {
1230                                 nf_conntrack_get(&ct->ct_general);
1231                                 cb->args[1] = (unsigned long)ct;
1232                                 spin_unlock(lockp);
1233                                 goto out;
1234                         }
1235                 }
1236                 spin_unlock(lockp);
1237                 if (cb->args[1]) {
1238                         cb->args[1] = 0;
1239                         goto restart;
1240                 }
1241         }
1242 out:
1243         local_bh_enable();
1244         if (last) {
1245                 /* nf ct hash resize happened, now clear the leftover. */
1246                 if ((struct nf_conn *)cb->args[1] == last)
1247                         cb->args[1] = 0;
1248
1249                 nf_ct_put(last);
1250         }
1251
1252         while (i) {
1253                 i--;
1254                 if (nf_ct_should_gc(nf_ct_evict[i]))
1255                         nf_ct_kill(nf_ct_evict[i]);
1256                 nf_ct_put(nf_ct_evict[i]);
1257         }
1258
1259         return skb->len;
1260 }
1261
1262 static int ipv4_nlattr_to_tuple(struct nlattr *tb[],
1263                                 struct nf_conntrack_tuple *t,
1264                                 u_int32_t flags)
1265 {
1266         if (flags & CTA_FILTER_FLAG(CTA_IP_SRC)) {
1267                 if (!tb[CTA_IP_V4_SRC])
1268                         return -EINVAL;
1269
1270                 t->src.u3.ip = nla_get_in_addr(tb[CTA_IP_V4_SRC]);
1271         }
1272
1273         if (flags & CTA_FILTER_FLAG(CTA_IP_DST)) {
1274                 if (!tb[CTA_IP_V4_DST])
1275                         return -EINVAL;
1276
1277                 t->dst.u3.ip = nla_get_in_addr(tb[CTA_IP_V4_DST]);
1278         }
1279
1280         return 0;
1281 }
1282
1283 static int ipv6_nlattr_to_tuple(struct nlattr *tb[],
1284                                 struct nf_conntrack_tuple *t,
1285                                 u_int32_t flags)
1286 {
1287         if (flags & CTA_FILTER_FLAG(CTA_IP_SRC)) {
1288                 if (!tb[CTA_IP_V6_SRC])
1289                         return -EINVAL;
1290
1291                 t->src.u3.in6 = nla_get_in6_addr(tb[CTA_IP_V6_SRC]);
1292         }
1293
1294         if (flags & CTA_FILTER_FLAG(CTA_IP_DST)) {
1295                 if (!tb[CTA_IP_V6_DST])
1296                         return -EINVAL;
1297
1298                 t->dst.u3.in6 = nla_get_in6_addr(tb[CTA_IP_V6_DST]);
1299         }
1300
1301         return 0;
1302 }
1303
1304 static int ctnetlink_parse_tuple_ip(struct nlattr *attr,
1305                                     struct nf_conntrack_tuple *tuple,
1306                                     u_int32_t flags)
1307 {
1308         struct nlattr *tb[CTA_IP_MAX+1];
1309         int ret = 0;
1310
1311         ret = nla_parse_nested_deprecated(tb, CTA_IP_MAX, attr, NULL, NULL);
1312         if (ret < 0)
1313                 return ret;
1314
1315         ret = nla_validate_nested_deprecated(attr, CTA_IP_MAX,
1316                                              cta_ip_nla_policy, NULL);
1317         if (ret)
1318                 return ret;
1319
1320         switch (tuple->src.l3num) {
1321         case NFPROTO_IPV4:
1322                 ret = ipv4_nlattr_to_tuple(tb, tuple, flags);
1323                 break;
1324         case NFPROTO_IPV6:
1325                 ret = ipv6_nlattr_to_tuple(tb, tuple, flags);
1326                 break;
1327         }
1328
1329         return ret;
1330 }
1331
1332 static const struct nla_policy proto_nla_policy[CTA_PROTO_MAX+1] = {
1333         [CTA_PROTO_NUM] = { .type = NLA_U8 },
1334 };
1335
1336 static int ctnetlink_parse_tuple_proto(struct nlattr *attr,
1337                                        struct nf_conntrack_tuple *tuple,
1338                                        u_int32_t flags)
1339 {
1340         const struct nf_conntrack_l4proto *l4proto;
1341         struct nlattr *tb[CTA_PROTO_MAX+1];
1342         int ret = 0;
1343
1344         ret = nla_parse_nested_deprecated(tb, CTA_PROTO_MAX, attr,
1345                                           proto_nla_policy, NULL);
1346         if (ret < 0)
1347                 return ret;
1348
1349         if (!(flags & CTA_FILTER_FLAG(CTA_PROTO_NUM)))
1350                 return 0;
1351
1352         if (!tb[CTA_PROTO_NUM])
1353                 return -EINVAL;
1354
1355         tuple->dst.protonum = nla_get_u8(tb[CTA_PROTO_NUM]);
1356
1357         rcu_read_lock();
1358         l4proto = nf_ct_l4proto_find(tuple->dst.protonum);
1359
1360         if (likely(l4proto->nlattr_to_tuple)) {
1361                 ret = nla_validate_nested_deprecated(attr, CTA_PROTO_MAX,
1362                                                      l4proto->nla_policy,
1363                                                      NULL);
1364                 if (ret == 0)
1365                         ret = l4proto->nlattr_to_tuple(tb, tuple, flags);
1366         }
1367
1368         rcu_read_unlock();
1369
1370         return ret;
1371 }
1372
1373 static int
1374 ctnetlink_parse_zone(const struct nlattr *attr,
1375                      struct nf_conntrack_zone *zone)
1376 {
1377         nf_ct_zone_init(zone, NF_CT_DEFAULT_ZONE_ID,
1378                         NF_CT_DEFAULT_ZONE_DIR, 0);
1379 #ifdef CONFIG_NF_CONNTRACK_ZONES
1380         if (attr)
1381                 zone->id = ntohs(nla_get_be16(attr));
1382 #else
1383         if (attr)
1384                 return -EOPNOTSUPP;
1385 #endif
1386         return 0;
1387 }
1388
1389 static int
1390 ctnetlink_parse_tuple_zone(struct nlattr *attr, enum ctattr_type type,
1391                            struct nf_conntrack_zone *zone)
1392 {
1393         int ret;
1394
1395         if (zone->id != NF_CT_DEFAULT_ZONE_ID)
1396                 return -EINVAL;
1397
1398         ret = ctnetlink_parse_zone(attr, zone);
1399         if (ret < 0)
1400                 return ret;
1401
1402         if (type == CTA_TUPLE_REPLY)
1403                 zone->dir = NF_CT_ZONE_DIR_REPL;
1404         else
1405                 zone->dir = NF_CT_ZONE_DIR_ORIG;
1406
1407         return 0;
1408 }
1409
1410 static const struct nla_policy tuple_nla_policy[CTA_TUPLE_MAX+1] = {
1411         [CTA_TUPLE_IP]          = { .type = NLA_NESTED },
1412         [CTA_TUPLE_PROTO]       = { .type = NLA_NESTED },
1413         [CTA_TUPLE_ZONE]        = { .type = NLA_U16 },
1414 };
1415
1416 #define CTA_FILTER_F_ALL_CTA_PROTO \
1417   (CTA_FILTER_F_CTA_PROTO_SRC_PORT | \
1418    CTA_FILTER_F_CTA_PROTO_DST_PORT | \
1419    CTA_FILTER_F_CTA_PROTO_ICMP_TYPE | \
1420    CTA_FILTER_F_CTA_PROTO_ICMP_CODE | \
1421    CTA_FILTER_F_CTA_PROTO_ICMP_ID | \
1422    CTA_FILTER_F_CTA_PROTO_ICMPV6_TYPE | \
1423    CTA_FILTER_F_CTA_PROTO_ICMPV6_CODE | \
1424    CTA_FILTER_F_CTA_PROTO_ICMPV6_ID)
1425
1426 static int
1427 ctnetlink_parse_tuple_filter(const struct nlattr * const cda[],
1428                               struct nf_conntrack_tuple *tuple, u32 type,
1429                               u_int8_t l3num, struct nf_conntrack_zone *zone,
1430                               u_int32_t flags)
1431 {
1432         struct nlattr *tb[CTA_TUPLE_MAX+1];
1433         int err;
1434
1435         memset(tuple, 0, sizeof(*tuple));
1436
1437         err = nla_parse_nested_deprecated(tb, CTA_TUPLE_MAX, cda[type],
1438                                           tuple_nla_policy, NULL);
1439         if (err < 0)
1440                 return err;
1441
1442         if (l3num != NFPROTO_IPV4 && l3num != NFPROTO_IPV6)
1443                 return -EOPNOTSUPP;
1444         tuple->src.l3num = l3num;
1445
1446         if (flags & CTA_FILTER_FLAG(CTA_IP_DST) ||
1447             flags & CTA_FILTER_FLAG(CTA_IP_SRC)) {
1448                 if (!tb[CTA_TUPLE_IP])
1449                         return -EINVAL;
1450
1451                 err = ctnetlink_parse_tuple_ip(tb[CTA_TUPLE_IP], tuple, flags);
1452                 if (err < 0)
1453                         return err;
1454         }
1455
1456         if (flags & CTA_FILTER_FLAG(CTA_PROTO_NUM)) {
1457                 if (!tb[CTA_TUPLE_PROTO])
1458                         return -EINVAL;
1459
1460                 err = ctnetlink_parse_tuple_proto(tb[CTA_TUPLE_PROTO], tuple, flags);
1461                 if (err < 0)
1462                         return err;
1463         } else if (flags & CTA_FILTER_FLAG(ALL_CTA_PROTO)) {
1464                 /* Can't manage proto flags without a protonum  */
1465                 return -EINVAL;
1466         }
1467
1468         if ((flags & CTA_FILTER_FLAG(CTA_TUPLE_ZONE)) && tb[CTA_TUPLE_ZONE]) {
1469                 if (!zone)
1470                         return -EINVAL;
1471
1472                 err = ctnetlink_parse_tuple_zone(tb[CTA_TUPLE_ZONE],
1473                                                  type, zone);
1474                 if (err < 0)
1475                         return err;
1476         }
1477
1478         /* orig and expect tuples get DIR_ORIGINAL */
1479         if (type == CTA_TUPLE_REPLY)
1480                 tuple->dst.dir = IP_CT_DIR_REPLY;
1481         else
1482                 tuple->dst.dir = IP_CT_DIR_ORIGINAL;
1483
1484         return 0;
1485 }
1486
1487 static int
1488 ctnetlink_parse_tuple(const struct nlattr * const cda[],
1489                       struct nf_conntrack_tuple *tuple, u32 type,
1490                       u_int8_t l3num, struct nf_conntrack_zone *zone)
1491 {
1492         return ctnetlink_parse_tuple_filter(cda, tuple, type, l3num, zone,
1493                                             CTA_FILTER_FLAG(ALL));
1494 }
1495
1496 static const struct nla_policy help_nla_policy[CTA_HELP_MAX+1] = {
1497         [CTA_HELP_NAME]         = { .type = NLA_NUL_STRING,
1498                                     .len = NF_CT_HELPER_NAME_LEN - 1 },
1499 };
1500
1501 static int ctnetlink_parse_help(const struct nlattr *attr, char **helper_name,
1502                                 struct nlattr **helpinfo)
1503 {
1504         int err;
1505         struct nlattr *tb[CTA_HELP_MAX+1];
1506
1507         err = nla_parse_nested_deprecated(tb, CTA_HELP_MAX, attr,
1508                                           help_nla_policy, NULL);
1509         if (err < 0)
1510                 return err;
1511
1512         if (!tb[CTA_HELP_NAME])
1513                 return -EINVAL;
1514
1515         *helper_name = nla_data(tb[CTA_HELP_NAME]);
1516
1517         if (tb[CTA_HELP_INFO])
1518                 *helpinfo = tb[CTA_HELP_INFO];
1519
1520         return 0;
1521 }
1522
1523 static const struct nla_policy ct_nla_policy[CTA_MAX+1] = {
1524         [CTA_TUPLE_ORIG]        = { .type = NLA_NESTED },
1525         [CTA_TUPLE_REPLY]       = { .type = NLA_NESTED },
1526         [CTA_STATUS]            = { .type = NLA_U32 },
1527         [CTA_PROTOINFO]         = { .type = NLA_NESTED },
1528         [CTA_HELP]              = { .type = NLA_NESTED },
1529         [CTA_NAT_SRC]           = { .type = NLA_NESTED },
1530         [CTA_TIMEOUT]           = { .type = NLA_U32 },
1531         [CTA_MARK]              = { .type = NLA_U32 },
1532         [CTA_ID]                = { .type = NLA_U32 },
1533         [CTA_NAT_DST]           = { .type = NLA_NESTED },
1534         [CTA_TUPLE_MASTER]      = { .type = NLA_NESTED },
1535         [CTA_NAT_SEQ_ADJ_ORIG]  = { .type = NLA_NESTED },
1536         [CTA_NAT_SEQ_ADJ_REPLY] = { .type = NLA_NESTED },
1537         [CTA_ZONE]              = { .type = NLA_U16 },
1538         [CTA_MARK_MASK]         = { .type = NLA_U32 },
1539         [CTA_LABELS]            = { .type = NLA_BINARY,
1540                                     .len = NF_CT_LABELS_MAX_SIZE },
1541         [CTA_LABELS_MASK]       = { .type = NLA_BINARY,
1542                                     .len = NF_CT_LABELS_MAX_SIZE },
1543         [CTA_FILTER]            = { .type = NLA_NESTED },
1544         [CTA_STATUS_MASK]       = { .type = NLA_U32 },
1545 };
1546
1547 static int ctnetlink_flush_iterate(struct nf_conn *ct, void *data)
1548 {
1549         if (test_bit(IPS_OFFLOAD_BIT, &ct->status))
1550                 return 0;
1551
1552         return ctnetlink_filter_match(ct, data);
1553 }
1554
1555 static int ctnetlink_flush_conntrack(struct net *net,
1556                                      const struct nlattr * const cda[],
1557                                      u32 portid, int report, u8 family)
1558 {
1559         struct ctnetlink_filter *filter = NULL;
1560
1561         if (ctnetlink_needs_filter(family, cda)) {
1562                 if (cda[CTA_FILTER])
1563                         return -EOPNOTSUPP;
1564
1565                 filter = ctnetlink_alloc_filter(cda, family);
1566                 if (IS_ERR(filter))
1567                         return PTR_ERR(filter);
1568         }
1569
1570         nf_ct_iterate_cleanup_net(net, ctnetlink_flush_iterate, filter,
1571                                   portid, report);
1572         kfree(filter);
1573
1574         return 0;
1575 }
1576
1577 static int ctnetlink_del_conntrack(struct sk_buff *skb,
1578                                    const struct nfnl_info *info,
1579                                    const struct nlattr * const cda[])
1580 {
1581         u8 family = info->nfmsg->nfgen_family;
1582         struct nf_conntrack_tuple_hash *h;
1583         struct nf_conntrack_tuple tuple;
1584         struct nf_conntrack_zone zone;
1585         struct nf_conn *ct;
1586         int err;
1587
1588         err = ctnetlink_parse_zone(cda[CTA_ZONE], &zone);
1589         if (err < 0)
1590                 return err;
1591
1592         if (cda[CTA_TUPLE_ORIG])
1593                 err = ctnetlink_parse_tuple(cda, &tuple, CTA_TUPLE_ORIG,
1594                                             family, &zone);
1595         else if (cda[CTA_TUPLE_REPLY])
1596                 err = ctnetlink_parse_tuple(cda, &tuple, CTA_TUPLE_REPLY,
1597                                             family, &zone);
1598         else {
1599                 u_int8_t u3 = info->nfmsg->version ? family : AF_UNSPEC;
1600
1601                 return ctnetlink_flush_conntrack(info->net, cda,
1602                                                  NETLINK_CB(skb).portid,
1603                                                  nlmsg_report(info->nlh), u3);
1604         }
1605
1606         if (err < 0)
1607                 return err;
1608
1609         h = nf_conntrack_find_get(info->net, &zone, &tuple);
1610         if (!h)
1611                 return -ENOENT;
1612
1613         ct = nf_ct_tuplehash_to_ctrack(h);
1614
1615         if (test_bit(IPS_OFFLOAD_BIT, &ct->status)) {
1616                 nf_ct_put(ct);
1617                 return -EBUSY;
1618         }
1619
1620         if (cda[CTA_ID]) {
1621                 __be32 id = nla_get_be32(cda[CTA_ID]);
1622
1623                 if (id != (__force __be32)nf_ct_get_id(ct)) {
1624                         nf_ct_put(ct);
1625                         return -ENOENT;
1626                 }
1627         }
1628
1629         nf_ct_delete(ct, NETLINK_CB(skb).portid, nlmsg_report(info->nlh));
1630         nf_ct_put(ct);
1631
1632         return 0;
1633 }
1634
1635 static int ctnetlink_get_conntrack(struct sk_buff *skb,
1636                                    const struct nfnl_info *info,
1637                                    const struct nlattr * const cda[])
1638 {
1639         u_int8_t u3 = info->nfmsg->nfgen_family;
1640         struct nf_conntrack_tuple_hash *h;
1641         struct nf_conntrack_tuple tuple;
1642         struct nf_conntrack_zone zone;
1643         struct sk_buff *skb2;
1644         struct nf_conn *ct;
1645         int err;
1646
1647         if (info->nlh->nlmsg_flags & NLM_F_DUMP) {
1648                 struct netlink_dump_control c = {
1649                         .start = ctnetlink_start,
1650                         .dump = ctnetlink_dump_table,
1651                         .done = ctnetlink_done,
1652                         .data = (void *)cda,
1653                 };
1654
1655                 return netlink_dump_start(info->sk, skb, info->nlh, &c);
1656         }
1657
1658         err = ctnetlink_parse_zone(cda[CTA_ZONE], &zone);
1659         if (err < 0)
1660                 return err;
1661
1662         if (cda[CTA_TUPLE_ORIG])
1663                 err = ctnetlink_parse_tuple(cda, &tuple, CTA_TUPLE_ORIG,
1664                                             u3, &zone);
1665         else if (cda[CTA_TUPLE_REPLY])
1666                 err = ctnetlink_parse_tuple(cda, &tuple, CTA_TUPLE_REPLY,
1667                                             u3, &zone);
1668         else
1669                 return -EINVAL;
1670
1671         if (err < 0)
1672                 return err;
1673
1674         h = nf_conntrack_find_get(info->net, &zone, &tuple);
1675         if (!h)
1676                 return -ENOENT;
1677
1678         ct = nf_ct_tuplehash_to_ctrack(h);
1679
1680         skb2 = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
1681         if (!skb2) {
1682                 nf_ct_put(ct);
1683                 return -ENOMEM;
1684         }
1685
1686         err = ctnetlink_fill_info(skb2, NETLINK_CB(skb).portid,
1687                                   info->nlh->nlmsg_seq,
1688                                   NFNL_MSG_TYPE(info->nlh->nlmsg_type), ct,
1689                                   true, 0);
1690         nf_ct_put(ct);
1691         if (err <= 0) {
1692                 kfree_skb(skb2);
1693                 return -ENOMEM;
1694         }
1695
1696         return nfnetlink_unicast(skb2, info->net, NETLINK_CB(skb).portid);
1697 }
1698
1699 static int ctnetlink_done_list(struct netlink_callback *cb)
1700 {
1701         if (cb->args[1])
1702                 nf_ct_put((struct nf_conn *)cb->args[1]);
1703         return 0;
1704 }
1705
1706 static int
1707 ctnetlink_dump_list(struct sk_buff *skb, struct netlink_callback *cb, bool dying)
1708 {
1709         struct nf_conn *ct, *last;
1710         struct nf_conntrack_tuple_hash *h;
1711         struct hlist_nulls_node *n;
1712         struct nfgenmsg *nfmsg = nlmsg_data(cb->nlh);
1713         u_int8_t l3proto = nfmsg->nfgen_family;
1714         int res;
1715         int cpu;
1716         struct hlist_nulls_head *list;
1717         struct net *net = sock_net(skb->sk);
1718
1719         if (cb->args[2])
1720                 return 0;
1721
1722         last = (struct nf_conn *)cb->args[1];
1723
1724         for (cpu = cb->args[0]; cpu < nr_cpu_ids; cpu++) {
1725                 struct ct_pcpu *pcpu;
1726
1727                 if (!cpu_possible(cpu))
1728                         continue;
1729
1730                 pcpu = per_cpu_ptr(net->ct.pcpu_lists, cpu);
1731                 spin_lock_bh(&pcpu->lock);
1732                 list = dying ? &pcpu->dying : &pcpu->unconfirmed;
1733 restart:
1734                 hlist_nulls_for_each_entry(h, n, list, hnnode) {
1735                         ct = nf_ct_tuplehash_to_ctrack(h);
1736                         if (l3proto && nf_ct_l3num(ct) != l3proto)
1737                                 continue;
1738                         if (cb->args[1]) {
1739                                 if (ct != last)
1740                                         continue;
1741                                 cb->args[1] = 0;
1742                         }
1743
1744                         /* We can't dump extension info for the unconfirmed
1745                          * list because unconfirmed conntracks can have
1746                          * ct->ext reallocated (and thus freed).
1747                          *
1748                          * In the dying list case ct->ext can't be free'd
1749                          * until after we drop pcpu->lock.
1750                          */
1751                         res = ctnetlink_fill_info(skb, NETLINK_CB(cb->skb).portid,
1752                                                   cb->nlh->nlmsg_seq,
1753                                                   NFNL_MSG_TYPE(cb->nlh->nlmsg_type),
1754                                                   ct, dying ? true : false, 0);
1755                         if (res < 0) {
1756                                 if (!refcount_inc_not_zero(&ct->ct_general.use))
1757                                         continue;
1758                                 cb->args[0] = cpu;
1759                                 cb->args[1] = (unsigned long)ct;
1760                                 spin_unlock_bh(&pcpu->lock);
1761                                 goto out;
1762                         }
1763                 }
1764                 if (cb->args[1]) {
1765                         cb->args[1] = 0;
1766                         goto restart;
1767                 }
1768                 spin_unlock_bh(&pcpu->lock);
1769         }
1770         cb->args[2] = 1;
1771 out:
1772         if (last)
1773                 nf_ct_put(last);
1774
1775         return skb->len;
1776 }
1777
1778 static int
1779 ctnetlink_dump_dying(struct sk_buff *skb, struct netlink_callback *cb)
1780 {
1781         return ctnetlink_dump_list(skb, cb, true);
1782 }
1783
1784 static int ctnetlink_get_ct_dying(struct sk_buff *skb,
1785                                   const struct nfnl_info *info,
1786                                   const struct nlattr * const cda[])
1787 {
1788         if (info->nlh->nlmsg_flags & NLM_F_DUMP) {
1789                 struct netlink_dump_control c = {
1790                         .dump = ctnetlink_dump_dying,
1791                         .done = ctnetlink_done_list,
1792                 };
1793                 return netlink_dump_start(info->sk, skb, info->nlh, &c);
1794         }
1795
1796         return -EOPNOTSUPP;
1797 }
1798
1799 static int
1800 ctnetlink_dump_unconfirmed(struct sk_buff *skb, struct netlink_callback *cb)
1801 {
1802         return ctnetlink_dump_list(skb, cb, false);
1803 }
1804
1805 static int ctnetlink_get_ct_unconfirmed(struct sk_buff *skb,
1806                                         const struct nfnl_info *info,
1807                                         const struct nlattr * const cda[])
1808 {
1809         if (info->nlh->nlmsg_flags & NLM_F_DUMP) {
1810                 struct netlink_dump_control c = {
1811                         .dump = ctnetlink_dump_unconfirmed,
1812                         .done = ctnetlink_done_list,
1813                 };
1814                 return netlink_dump_start(info->sk, skb, info->nlh, &c);
1815         }
1816
1817         return -EOPNOTSUPP;
1818 }
1819
1820 #if IS_ENABLED(CONFIG_NF_NAT)
1821 static int
1822 ctnetlink_parse_nat_setup(struct nf_conn *ct,
1823                           enum nf_nat_manip_type manip,
1824                           const struct nlattr *attr)
1825         __must_hold(RCU)
1826 {
1827         struct nf_nat_hook *nat_hook;
1828         int err;
1829
1830         nat_hook = rcu_dereference(nf_nat_hook);
1831         if (!nat_hook) {
1832 #ifdef CONFIG_MODULES
1833                 rcu_read_unlock();
1834                 nfnl_unlock(NFNL_SUBSYS_CTNETLINK);
1835                 if (request_module("nf-nat") < 0) {
1836                         nfnl_lock(NFNL_SUBSYS_CTNETLINK);
1837                         rcu_read_lock();
1838                         return -EOPNOTSUPP;
1839                 }
1840                 nfnl_lock(NFNL_SUBSYS_CTNETLINK);
1841                 rcu_read_lock();
1842                 nat_hook = rcu_dereference(nf_nat_hook);
1843                 if (nat_hook)
1844                         return -EAGAIN;
1845 #endif
1846                 return -EOPNOTSUPP;
1847         }
1848
1849         err = nat_hook->parse_nat_setup(ct, manip, attr);
1850         if (err == -EAGAIN) {
1851 #ifdef CONFIG_MODULES
1852                 rcu_read_unlock();
1853                 nfnl_unlock(NFNL_SUBSYS_CTNETLINK);
1854                 if (request_module("nf-nat-%u", nf_ct_l3num(ct)) < 0) {
1855                         nfnl_lock(NFNL_SUBSYS_CTNETLINK);
1856                         rcu_read_lock();
1857                         return -EOPNOTSUPP;
1858                 }
1859                 nfnl_lock(NFNL_SUBSYS_CTNETLINK);
1860                 rcu_read_lock();
1861 #else
1862                 err = -EOPNOTSUPP;
1863 #endif
1864         }
1865         return err;
1866 }
1867 #endif
1868
1869 static void
1870 __ctnetlink_change_status(struct nf_conn *ct, unsigned long on,
1871                           unsigned long off)
1872 {
1873         unsigned int bit;
1874
1875         /* Ignore these unchangable bits */
1876         on &= ~IPS_UNCHANGEABLE_MASK;
1877         off &= ~IPS_UNCHANGEABLE_MASK;
1878
1879         for (bit = 0; bit < __IPS_MAX_BIT; bit++) {
1880                 if (on & (1 << bit))
1881                         set_bit(bit, &ct->status);
1882                 else if (off & (1 << bit))
1883                         clear_bit(bit, &ct->status);
1884         }
1885 }
1886
1887 static int
1888 ctnetlink_change_status(struct nf_conn *ct, const struct nlattr * const cda[])
1889 {
1890         unsigned long d;
1891         unsigned int status = ntohl(nla_get_be32(cda[CTA_STATUS]));
1892         d = ct->status ^ status;
1893
1894         if (d & (IPS_EXPECTED|IPS_CONFIRMED|IPS_DYING))
1895                 /* unchangeable */
1896                 return -EBUSY;
1897
1898         if (d & IPS_SEEN_REPLY && !(status & IPS_SEEN_REPLY))
1899                 /* SEEN_REPLY bit can only be set */
1900                 return -EBUSY;
1901
1902         if (d & IPS_ASSURED && !(status & IPS_ASSURED))
1903                 /* ASSURED bit can only be set */
1904                 return -EBUSY;
1905
1906         __ctnetlink_change_status(ct, status, 0);
1907         return 0;
1908 }
1909
1910 static int
1911 ctnetlink_setup_nat(struct nf_conn *ct, const struct nlattr * const cda[])
1912 {
1913 #if IS_ENABLED(CONFIG_NF_NAT)
1914         int ret;
1915
1916         if (!cda[CTA_NAT_DST] && !cda[CTA_NAT_SRC])
1917                 return 0;
1918
1919         ret = ctnetlink_parse_nat_setup(ct, NF_NAT_MANIP_DST,
1920                                         cda[CTA_NAT_DST]);
1921         if (ret < 0)
1922                 return ret;
1923
1924         return ctnetlink_parse_nat_setup(ct, NF_NAT_MANIP_SRC,
1925                                          cda[CTA_NAT_SRC]);
1926 #else
1927         if (!cda[CTA_NAT_DST] && !cda[CTA_NAT_SRC])
1928                 return 0;
1929         return -EOPNOTSUPP;
1930 #endif
1931 }
1932
1933 static int ctnetlink_change_helper(struct nf_conn *ct,
1934                                    const struct nlattr * const cda[])
1935 {
1936         struct nf_conntrack_helper *helper;
1937         struct nf_conn_help *help = nfct_help(ct);
1938         char *helpname = NULL;
1939         struct nlattr *helpinfo = NULL;
1940         int err;
1941
1942         err = ctnetlink_parse_help(cda[CTA_HELP], &helpname, &helpinfo);
1943         if (err < 0)
1944                 return err;
1945
1946         /* don't change helper of sibling connections */
1947         if (ct->master) {
1948                 /* If we try to change the helper to the same thing twice,
1949                  * treat the second attempt as a no-op instead of returning
1950                  * an error.
1951                  */
1952                 err = -EBUSY;
1953                 if (help) {
1954                         rcu_read_lock();
1955                         helper = rcu_dereference(help->helper);
1956                         if (helper && !strcmp(helper->name, helpname))
1957                                 err = 0;
1958                         rcu_read_unlock();
1959                 }
1960
1961                 return err;
1962         }
1963
1964         if (!strcmp(helpname, "")) {
1965                 if (help && help->helper) {
1966                         /* we had a helper before ... */
1967                         nf_ct_remove_expectations(ct);
1968                         RCU_INIT_POINTER(help->helper, NULL);
1969                 }
1970
1971                 return 0;
1972         }
1973
1974         rcu_read_lock();
1975         helper = __nf_conntrack_helper_find(helpname, nf_ct_l3num(ct),
1976                                             nf_ct_protonum(ct));
1977         if (helper == NULL) {
1978                 rcu_read_unlock();
1979                 return -EOPNOTSUPP;
1980         }
1981
1982         if (help) {
1983                 if (help->helper == helper) {
1984                         /* update private helper data if allowed. */
1985                         if (helper->from_nlattr)
1986                                 helper->from_nlattr(helpinfo, ct);
1987                         err = 0;
1988                 } else
1989                         err = -EBUSY;
1990         } else {
1991                 /* we cannot set a helper for an existing conntrack */
1992                 err = -EOPNOTSUPP;
1993         }
1994
1995         rcu_read_unlock();
1996         return err;
1997 }
1998
1999 static int ctnetlink_change_timeout(struct nf_conn *ct,
2000                                     const struct nlattr * const cda[])
2001 {
2002         u64 timeout = (u64)ntohl(nla_get_be32(cda[CTA_TIMEOUT])) * HZ;
2003
2004         if (timeout > INT_MAX)
2005                 timeout = INT_MAX;
2006         WRITE_ONCE(ct->timeout, nfct_time_stamp + (u32)timeout);
2007
2008         if (test_bit(IPS_DYING_BIT, &ct->status))
2009                 return -ETIME;
2010
2011         return 0;
2012 }
2013
2014 #if defined(CONFIG_NF_CONNTRACK_MARK)
2015 static void ctnetlink_change_mark(struct nf_conn *ct,
2016                                     const struct nlattr * const cda[])
2017 {
2018         u32 mark, newmark, mask = 0;
2019
2020         if (cda[CTA_MARK_MASK])
2021                 mask = ~ntohl(nla_get_be32(cda[CTA_MARK_MASK]));
2022
2023         mark = ntohl(nla_get_be32(cda[CTA_MARK]));
2024         newmark = (READ_ONCE(ct->mark) & mask) ^ mark;
2025         if (newmark != READ_ONCE(ct->mark))
2026                 WRITE_ONCE(ct->mark, newmark);
2027 }
2028 #endif
2029
2030 static const struct nla_policy protoinfo_policy[CTA_PROTOINFO_MAX+1] = {
2031         [CTA_PROTOINFO_TCP]     = { .type = NLA_NESTED },
2032         [CTA_PROTOINFO_DCCP]    = { .type = NLA_NESTED },
2033         [CTA_PROTOINFO_SCTP]    = { .type = NLA_NESTED },
2034 };
2035
2036 static int ctnetlink_change_protoinfo(struct nf_conn *ct,
2037                                       const struct nlattr * const cda[])
2038 {
2039         const struct nlattr *attr = cda[CTA_PROTOINFO];
2040         const struct nf_conntrack_l4proto *l4proto;
2041         struct nlattr *tb[CTA_PROTOINFO_MAX+1];
2042         int err = 0;
2043
2044         err = nla_parse_nested_deprecated(tb, CTA_PROTOINFO_MAX, attr,
2045                                           protoinfo_policy, NULL);
2046         if (err < 0)
2047                 return err;
2048
2049         l4proto = nf_ct_l4proto_find(nf_ct_protonum(ct));
2050         if (l4proto->from_nlattr)
2051                 err = l4proto->from_nlattr(tb, ct);
2052
2053         return err;
2054 }
2055
2056 static const struct nla_policy seqadj_policy[CTA_SEQADJ_MAX+1] = {
2057         [CTA_SEQADJ_CORRECTION_POS]     = { .type = NLA_U32 },
2058         [CTA_SEQADJ_OFFSET_BEFORE]      = { .type = NLA_U32 },
2059         [CTA_SEQADJ_OFFSET_AFTER]       = { .type = NLA_U32 },
2060 };
2061
2062 static int change_seq_adj(struct nf_ct_seqadj *seq,
2063                           const struct nlattr * const attr)
2064 {
2065         int err;
2066         struct nlattr *cda[CTA_SEQADJ_MAX+1];
2067
2068         err = nla_parse_nested_deprecated(cda, CTA_SEQADJ_MAX, attr,
2069                                           seqadj_policy, NULL);
2070         if (err < 0)
2071                 return err;
2072
2073         if (!cda[CTA_SEQADJ_CORRECTION_POS])
2074                 return -EINVAL;
2075
2076         seq->correction_pos =
2077                 ntohl(nla_get_be32(cda[CTA_SEQADJ_CORRECTION_POS]));
2078
2079         if (!cda[CTA_SEQADJ_OFFSET_BEFORE])
2080                 return -EINVAL;
2081
2082         seq->offset_before =
2083                 ntohl(nla_get_be32(cda[CTA_SEQADJ_OFFSET_BEFORE]));
2084
2085         if (!cda[CTA_SEQADJ_OFFSET_AFTER])
2086                 return -EINVAL;
2087
2088         seq->offset_after =
2089                 ntohl(nla_get_be32(cda[CTA_SEQADJ_OFFSET_AFTER]));
2090
2091         return 0;
2092 }
2093
2094 static int
2095 ctnetlink_change_seq_adj(struct nf_conn *ct,
2096                          const struct nlattr * const cda[])
2097 {
2098         struct nf_conn_seqadj *seqadj = nfct_seqadj(ct);
2099         int ret = 0;
2100
2101         if (!seqadj)
2102                 return 0;
2103
2104         spin_lock_bh(&ct->lock);
2105         if (cda[CTA_SEQ_ADJ_ORIG]) {
2106                 ret = change_seq_adj(&seqadj->seq[IP_CT_DIR_ORIGINAL],
2107                                      cda[CTA_SEQ_ADJ_ORIG]);
2108                 if (ret < 0)
2109                         goto err;
2110
2111                 set_bit(IPS_SEQ_ADJUST_BIT, &ct->status);
2112         }
2113
2114         if (cda[CTA_SEQ_ADJ_REPLY]) {
2115                 ret = change_seq_adj(&seqadj->seq[IP_CT_DIR_REPLY],
2116                                      cda[CTA_SEQ_ADJ_REPLY]);
2117                 if (ret < 0)
2118                         goto err;
2119
2120                 set_bit(IPS_SEQ_ADJUST_BIT, &ct->status);
2121         }
2122
2123         spin_unlock_bh(&ct->lock);
2124         return 0;
2125 err:
2126         spin_unlock_bh(&ct->lock);
2127         return ret;
2128 }
2129
2130 static const struct nla_policy synproxy_policy[CTA_SYNPROXY_MAX + 1] = {
2131         [CTA_SYNPROXY_ISN]      = { .type = NLA_U32 },
2132         [CTA_SYNPROXY_ITS]      = { .type = NLA_U32 },
2133         [CTA_SYNPROXY_TSOFF]    = { .type = NLA_U32 },
2134 };
2135
2136 static int ctnetlink_change_synproxy(struct nf_conn *ct,
2137                                      const struct nlattr * const cda[])
2138 {
2139         struct nf_conn_synproxy *synproxy = nfct_synproxy(ct);
2140         struct nlattr *tb[CTA_SYNPROXY_MAX + 1];
2141         int err;
2142
2143         if (!synproxy)
2144                 return 0;
2145
2146         err = nla_parse_nested_deprecated(tb, CTA_SYNPROXY_MAX,
2147                                           cda[CTA_SYNPROXY], synproxy_policy,
2148                                           NULL);
2149         if (err < 0)
2150                 return err;
2151
2152         if (!tb[CTA_SYNPROXY_ISN] ||
2153             !tb[CTA_SYNPROXY_ITS] ||
2154             !tb[CTA_SYNPROXY_TSOFF])
2155                 return -EINVAL;
2156
2157         synproxy->isn = ntohl(nla_get_be32(tb[CTA_SYNPROXY_ISN]));
2158         synproxy->its = ntohl(nla_get_be32(tb[CTA_SYNPROXY_ITS]));
2159         synproxy->tsoff = ntohl(nla_get_be32(tb[CTA_SYNPROXY_TSOFF]));
2160
2161         return 0;
2162 }
2163
2164 static int
2165 ctnetlink_attach_labels(struct nf_conn *ct, const struct nlattr * const cda[])
2166 {
2167 #ifdef CONFIG_NF_CONNTRACK_LABELS
2168         size_t len = nla_len(cda[CTA_LABELS]);
2169         const void *mask = cda[CTA_LABELS_MASK];
2170
2171         if (len & (sizeof(u32)-1)) /* must be multiple of u32 */
2172                 return -EINVAL;
2173
2174         if (mask) {
2175                 if (nla_len(cda[CTA_LABELS_MASK]) == 0 ||
2176                     nla_len(cda[CTA_LABELS_MASK]) != len)
2177                         return -EINVAL;
2178                 mask = nla_data(cda[CTA_LABELS_MASK]);
2179         }
2180
2181         len /= sizeof(u32);
2182
2183         return nf_connlabels_replace(ct, nla_data(cda[CTA_LABELS]), mask, len);
2184 #else
2185         return -EOPNOTSUPP;
2186 #endif
2187 }
2188
2189 static int
2190 ctnetlink_change_conntrack(struct nf_conn *ct,
2191                            const struct nlattr * const cda[])
2192 {
2193         int err;
2194
2195         /* only allow NAT changes and master assignation for new conntracks */
2196         if (cda[CTA_NAT_SRC] || cda[CTA_NAT_DST] || cda[CTA_TUPLE_MASTER])
2197                 return -EOPNOTSUPP;
2198
2199         if (cda[CTA_HELP]) {
2200                 err = ctnetlink_change_helper(ct, cda);
2201                 if (err < 0)
2202                         return err;
2203         }
2204
2205         if (cda[CTA_TIMEOUT]) {
2206                 err = ctnetlink_change_timeout(ct, cda);
2207                 if (err < 0)
2208                         return err;
2209         }
2210
2211         if (cda[CTA_STATUS]) {
2212                 err = ctnetlink_change_status(ct, cda);
2213                 if (err < 0)
2214                         return err;
2215         }
2216
2217         if (cda[CTA_PROTOINFO]) {
2218                 err = ctnetlink_change_protoinfo(ct, cda);
2219                 if (err < 0)
2220                         return err;
2221         }
2222
2223 #if defined(CONFIG_NF_CONNTRACK_MARK)
2224         if (cda[CTA_MARK])
2225                 ctnetlink_change_mark(ct, cda);
2226 #endif
2227
2228         if (cda[CTA_SEQ_ADJ_ORIG] || cda[CTA_SEQ_ADJ_REPLY]) {
2229                 err = ctnetlink_change_seq_adj(ct, cda);
2230                 if (err < 0)
2231                         return err;
2232         }
2233
2234         if (cda[CTA_SYNPROXY]) {
2235                 err = ctnetlink_change_synproxy(ct, cda);
2236                 if (err < 0)
2237                         return err;
2238         }
2239
2240         if (cda[CTA_LABELS]) {
2241                 err = ctnetlink_attach_labels(ct, cda);
2242                 if (err < 0)
2243                         return err;
2244         }
2245
2246         return 0;
2247 }
2248
2249 static struct nf_conn *
2250 ctnetlink_create_conntrack(struct net *net,
2251                            const struct nf_conntrack_zone *zone,
2252                            const struct nlattr * const cda[],
2253                            struct nf_conntrack_tuple *otuple,
2254                            struct nf_conntrack_tuple *rtuple,
2255                            u8 u3)
2256 {
2257         struct nf_conn *ct;
2258         int err = -EINVAL;
2259         struct nf_conntrack_helper *helper;
2260         struct nf_conn_tstamp *tstamp;
2261         u64 timeout;
2262
2263         ct = nf_conntrack_alloc(net, zone, otuple, rtuple, GFP_ATOMIC);
2264         if (IS_ERR(ct))
2265                 return ERR_PTR(-ENOMEM);
2266
2267         if (!cda[CTA_TIMEOUT])
2268                 goto err1;
2269
2270         timeout = (u64)ntohl(nla_get_be32(cda[CTA_TIMEOUT])) * HZ;
2271         if (timeout > INT_MAX)
2272                 timeout = INT_MAX;
2273         ct->timeout = (u32)timeout + nfct_time_stamp;
2274
2275         rcu_read_lock();
2276         if (cda[CTA_HELP]) {
2277                 char *helpname = NULL;
2278                 struct nlattr *helpinfo = NULL;
2279
2280                 err = ctnetlink_parse_help(cda[CTA_HELP], &helpname, &helpinfo);
2281                 if (err < 0)
2282                         goto err2;
2283
2284                 helper = __nf_conntrack_helper_find(helpname, nf_ct_l3num(ct),
2285                                                     nf_ct_protonum(ct));
2286                 if (helper == NULL) {
2287                         rcu_read_unlock();
2288 #ifdef CONFIG_MODULES
2289                         if (request_module("nfct-helper-%s", helpname) < 0) {
2290                                 err = -EOPNOTSUPP;
2291                                 goto err1;
2292                         }
2293
2294                         rcu_read_lock();
2295                         helper = __nf_conntrack_helper_find(helpname,
2296                                                             nf_ct_l3num(ct),
2297                                                             nf_ct_protonum(ct));
2298                         if (helper) {
2299                                 err = -EAGAIN;
2300                                 goto err2;
2301                         }
2302                         rcu_read_unlock();
2303 #endif
2304                         err = -EOPNOTSUPP;
2305                         goto err1;
2306                 } else {
2307                         struct nf_conn_help *help;
2308
2309                         help = nf_ct_helper_ext_add(ct, GFP_ATOMIC);
2310                         if (help == NULL) {
2311                                 err = -ENOMEM;
2312                                 goto err2;
2313                         }
2314                         /* set private helper data if allowed. */
2315                         if (helper->from_nlattr)
2316                                 helper->from_nlattr(helpinfo, ct);
2317
2318                         /* disable helper auto-assignment for this entry */
2319                         ct->status |= IPS_HELPER;
2320                         RCU_INIT_POINTER(help->helper, helper);
2321                 }
2322         } else {
2323                 /* try an implicit helper assignation */
2324                 err = __nf_ct_try_assign_helper(ct, NULL, GFP_ATOMIC);
2325                 if (err < 0)
2326                         goto err2;
2327         }
2328
2329         err = ctnetlink_setup_nat(ct, cda);
2330         if (err < 0)
2331                 goto err2;
2332
2333         nf_ct_acct_ext_add(ct, GFP_ATOMIC);
2334         nf_ct_tstamp_ext_add(ct, GFP_ATOMIC);
2335         nf_ct_ecache_ext_add(ct, 0, 0, GFP_ATOMIC);
2336         nf_ct_labels_ext_add(ct);
2337         nfct_seqadj_ext_add(ct);
2338         nfct_synproxy_ext_add(ct);
2339
2340         /* we must add conntrack extensions before confirmation. */
2341         ct->status |= IPS_CONFIRMED;
2342
2343         if (cda[CTA_STATUS]) {
2344                 err = ctnetlink_change_status(ct, cda);
2345                 if (err < 0)
2346                         goto err2;
2347         }
2348
2349         if (cda[CTA_SEQ_ADJ_ORIG] || cda[CTA_SEQ_ADJ_REPLY]) {
2350                 err = ctnetlink_change_seq_adj(ct, cda);
2351                 if (err < 0)
2352                         goto err2;
2353         }
2354
2355         memset(&ct->proto, 0, sizeof(ct->proto));
2356         if (cda[CTA_PROTOINFO]) {
2357                 err = ctnetlink_change_protoinfo(ct, cda);
2358                 if (err < 0)
2359                         goto err2;
2360         }
2361
2362         if (cda[CTA_SYNPROXY]) {
2363                 err = ctnetlink_change_synproxy(ct, cda);
2364                 if (err < 0)
2365                         goto err2;
2366         }
2367
2368 #if defined(CONFIG_NF_CONNTRACK_MARK)
2369         if (cda[CTA_MARK])
2370                 ctnetlink_change_mark(ct, cda);
2371 #endif
2372
2373         /* setup master conntrack: this is a confirmed expectation */
2374         if (cda[CTA_TUPLE_MASTER]) {
2375                 struct nf_conntrack_tuple master;
2376                 struct nf_conntrack_tuple_hash *master_h;
2377                 struct nf_conn *master_ct;
2378
2379                 err = ctnetlink_parse_tuple(cda, &master, CTA_TUPLE_MASTER,
2380                                             u3, NULL);
2381                 if (err < 0)
2382                         goto err2;
2383
2384                 master_h = nf_conntrack_find_get(net, zone, &master);
2385                 if (master_h == NULL) {
2386                         err = -ENOENT;
2387                         goto err2;
2388                 }
2389                 master_ct = nf_ct_tuplehash_to_ctrack(master_h);
2390                 __set_bit(IPS_EXPECTED_BIT, &ct->status);
2391                 ct->master = master_ct;
2392         }
2393         tstamp = nf_conn_tstamp_find(ct);
2394         if (tstamp)
2395                 tstamp->start = ktime_get_real_ns();
2396
2397         err = nf_conntrack_hash_check_insert(ct);
2398         if (err < 0)
2399                 goto err2;
2400
2401         rcu_read_unlock();
2402
2403         return ct;
2404
2405 err2:
2406         rcu_read_unlock();
2407 err1:
2408         nf_conntrack_free(ct);
2409         return ERR_PTR(err);
2410 }
2411
2412 static int ctnetlink_new_conntrack(struct sk_buff *skb,
2413                                    const struct nfnl_info *info,
2414                                    const struct nlattr * const cda[])
2415 {
2416         struct nf_conntrack_tuple otuple, rtuple;
2417         struct nf_conntrack_tuple_hash *h = NULL;
2418         u_int8_t u3 = info->nfmsg->nfgen_family;
2419         struct nf_conntrack_zone zone;
2420         struct nf_conn *ct;
2421         int err;
2422
2423         err = ctnetlink_parse_zone(cda[CTA_ZONE], &zone);
2424         if (err < 0)
2425                 return err;
2426
2427         if (cda[CTA_TUPLE_ORIG]) {
2428                 err = ctnetlink_parse_tuple(cda, &otuple, CTA_TUPLE_ORIG,
2429                                             u3, &zone);
2430                 if (err < 0)
2431                         return err;
2432         }
2433
2434         if (cda[CTA_TUPLE_REPLY]) {
2435                 err = ctnetlink_parse_tuple(cda, &rtuple, CTA_TUPLE_REPLY,
2436                                             u3, &zone);
2437                 if (err < 0)
2438                         return err;
2439         }
2440
2441         if (cda[CTA_TUPLE_ORIG])
2442                 h = nf_conntrack_find_get(info->net, &zone, &otuple);
2443         else if (cda[CTA_TUPLE_REPLY])
2444                 h = nf_conntrack_find_get(info->net, &zone, &rtuple);
2445
2446         if (h == NULL) {
2447                 err = -ENOENT;
2448                 if (info->nlh->nlmsg_flags & NLM_F_CREATE) {
2449                         enum ip_conntrack_events events;
2450
2451                         if (!cda[CTA_TUPLE_ORIG] || !cda[CTA_TUPLE_REPLY])
2452                                 return -EINVAL;
2453                         if (otuple.dst.protonum != rtuple.dst.protonum)
2454                                 return -EINVAL;
2455
2456                         ct = ctnetlink_create_conntrack(info->net, &zone, cda,
2457                                                         &otuple, &rtuple, u3);
2458                         if (IS_ERR(ct))
2459                                 return PTR_ERR(ct);
2460
2461                         err = 0;
2462                         if (test_bit(IPS_EXPECTED_BIT, &ct->status))
2463                                 events = 1 << IPCT_RELATED;
2464                         else
2465                                 events = 1 << IPCT_NEW;
2466
2467                         if (cda[CTA_LABELS] &&
2468                             ctnetlink_attach_labels(ct, cda) == 0)
2469                                 events |= (1 << IPCT_LABEL);
2470
2471                         nf_conntrack_eventmask_report((1 << IPCT_REPLY) |
2472                                                       (1 << IPCT_ASSURED) |
2473                                                       (1 << IPCT_HELPER) |
2474                                                       (1 << IPCT_PROTOINFO) |
2475                                                       (1 << IPCT_SEQADJ) |
2476                                                       (1 << IPCT_MARK) |
2477                                                       (1 << IPCT_SYNPROXY) |
2478                                                       events,
2479                                                       ct, NETLINK_CB(skb).portid,
2480                                                       nlmsg_report(info->nlh));
2481                         nf_ct_put(ct);
2482                 }
2483
2484                 return err;
2485         }
2486         /* implicit 'else' */
2487
2488         err = -EEXIST;
2489         ct = nf_ct_tuplehash_to_ctrack(h);
2490         if (!(info->nlh->nlmsg_flags & NLM_F_EXCL)) {
2491                 err = ctnetlink_change_conntrack(ct, cda);
2492                 if (err == 0) {
2493                         nf_conntrack_eventmask_report((1 << IPCT_REPLY) |
2494                                                       (1 << IPCT_ASSURED) |
2495                                                       (1 << IPCT_HELPER) |
2496                                                       (1 << IPCT_LABEL) |
2497                                                       (1 << IPCT_PROTOINFO) |
2498                                                       (1 << IPCT_SEQADJ) |
2499                                                       (1 << IPCT_MARK) |
2500                                                       (1 << IPCT_SYNPROXY),
2501                                                       ct, NETLINK_CB(skb).portid,
2502                                                       nlmsg_report(info->nlh));
2503                 }
2504         }
2505
2506         nf_ct_put(ct);
2507         return err;
2508 }
2509
2510 static int
2511 ctnetlink_ct_stat_cpu_fill_info(struct sk_buff *skb, u32 portid, u32 seq,
2512                                 __u16 cpu, const struct ip_conntrack_stat *st)
2513 {
2514         struct nlmsghdr *nlh;
2515         unsigned int flags = portid ? NLM_F_MULTI : 0, event;
2516
2517         event = nfnl_msg_type(NFNL_SUBSYS_CTNETLINK,
2518                               IPCTNL_MSG_CT_GET_STATS_CPU);
2519         nlh = nfnl_msg_put(skb, portid, seq, event, flags, AF_UNSPEC,
2520                            NFNETLINK_V0, htons(cpu));
2521         if (!nlh)
2522                 goto nlmsg_failure;
2523
2524         if (nla_put_be32(skb, CTA_STATS_FOUND, htonl(st->found)) ||
2525             nla_put_be32(skb, CTA_STATS_INVALID, htonl(st->invalid)) ||
2526             nla_put_be32(skb, CTA_STATS_INSERT, htonl(st->insert)) ||
2527             nla_put_be32(skb, CTA_STATS_INSERT_FAILED,
2528                                 htonl(st->insert_failed)) ||
2529             nla_put_be32(skb, CTA_STATS_DROP, htonl(st->drop)) ||
2530             nla_put_be32(skb, CTA_STATS_EARLY_DROP, htonl(st->early_drop)) ||
2531             nla_put_be32(skb, CTA_STATS_ERROR, htonl(st->error)) ||
2532             nla_put_be32(skb, CTA_STATS_SEARCH_RESTART,
2533                                 htonl(st->search_restart)) ||
2534             nla_put_be32(skb, CTA_STATS_CLASH_RESOLVE,
2535                                 htonl(st->clash_resolve)) ||
2536             nla_put_be32(skb, CTA_STATS_CHAIN_TOOLONG,
2537                          htonl(st->chaintoolong)))
2538                 goto nla_put_failure;
2539
2540         nlmsg_end(skb, nlh);
2541         return skb->len;
2542
2543 nla_put_failure:
2544 nlmsg_failure:
2545         nlmsg_cancel(skb, nlh);
2546         return -1;
2547 }
2548
2549 static int
2550 ctnetlink_ct_stat_cpu_dump(struct sk_buff *skb, struct netlink_callback *cb)
2551 {
2552         int cpu;
2553         struct net *net = sock_net(skb->sk);
2554
2555         if (cb->args[0] == nr_cpu_ids)
2556                 return 0;
2557
2558         for (cpu = cb->args[0]; cpu < nr_cpu_ids; cpu++) {
2559                 const struct ip_conntrack_stat *st;
2560
2561                 if (!cpu_possible(cpu))
2562                         continue;
2563
2564                 st = per_cpu_ptr(net->ct.stat, cpu);
2565                 if (ctnetlink_ct_stat_cpu_fill_info(skb,
2566                                                     NETLINK_CB(cb->skb).portid,
2567                                                     cb->nlh->nlmsg_seq,
2568                                                     cpu, st) < 0)
2569                                 break;
2570         }
2571         cb->args[0] = cpu;
2572
2573         return skb->len;
2574 }
2575
2576 static int ctnetlink_stat_ct_cpu(struct sk_buff *skb,
2577                                  const struct nfnl_info *info,
2578                                  const struct nlattr * const cda[])
2579 {
2580         if (info->nlh->nlmsg_flags & NLM_F_DUMP) {
2581                 struct netlink_dump_control c = {
2582                         .dump = ctnetlink_ct_stat_cpu_dump,
2583                 };
2584                 return netlink_dump_start(info->sk, skb, info->nlh, &c);
2585         }
2586
2587         return 0;
2588 }
2589
2590 static int
2591 ctnetlink_stat_ct_fill_info(struct sk_buff *skb, u32 portid, u32 seq, u32 type,
2592                             struct net *net)
2593 {
2594         unsigned int flags = portid ? NLM_F_MULTI : 0, event;
2595         unsigned int nr_conntracks;
2596         struct nlmsghdr *nlh;
2597
2598         event = nfnl_msg_type(NFNL_SUBSYS_CTNETLINK, IPCTNL_MSG_CT_GET_STATS);
2599         nlh = nfnl_msg_put(skb, portid, seq, event, flags, AF_UNSPEC,
2600                            NFNETLINK_V0, 0);
2601         if (!nlh)
2602                 goto nlmsg_failure;
2603
2604         nr_conntracks = nf_conntrack_count(net);
2605         if (nla_put_be32(skb, CTA_STATS_GLOBAL_ENTRIES, htonl(nr_conntracks)))
2606                 goto nla_put_failure;
2607
2608         if (nla_put_be32(skb, CTA_STATS_GLOBAL_MAX_ENTRIES, htonl(nf_conntrack_max)))
2609                 goto nla_put_failure;
2610
2611         nlmsg_end(skb, nlh);
2612         return skb->len;
2613
2614 nla_put_failure:
2615 nlmsg_failure:
2616         nlmsg_cancel(skb, nlh);
2617         return -1;
2618 }
2619
2620 static int ctnetlink_stat_ct(struct sk_buff *skb, const struct nfnl_info *info,
2621                              const struct nlattr * const cda[])
2622 {
2623         struct sk_buff *skb2;
2624         int err;
2625
2626         skb2 = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
2627         if (skb2 == NULL)
2628                 return -ENOMEM;
2629
2630         err = ctnetlink_stat_ct_fill_info(skb2, NETLINK_CB(skb).portid,
2631                                           info->nlh->nlmsg_seq,
2632                                           NFNL_MSG_TYPE(info->nlh->nlmsg_type),
2633                                           sock_net(skb->sk));
2634         if (err <= 0) {
2635                 kfree_skb(skb2);
2636                 return -ENOMEM;
2637         }
2638
2639         return nfnetlink_unicast(skb2, info->net, NETLINK_CB(skb).portid);
2640 }
2641
2642 static const struct nla_policy exp_nla_policy[CTA_EXPECT_MAX+1] = {
2643         [CTA_EXPECT_MASTER]     = { .type = NLA_NESTED },
2644         [CTA_EXPECT_TUPLE]      = { .type = NLA_NESTED },
2645         [CTA_EXPECT_MASK]       = { .type = NLA_NESTED },
2646         [CTA_EXPECT_TIMEOUT]    = { .type = NLA_U32 },
2647         [CTA_EXPECT_ID]         = { .type = NLA_U32 },
2648         [CTA_EXPECT_HELP_NAME]  = { .type = NLA_NUL_STRING,
2649                                     .len = NF_CT_HELPER_NAME_LEN - 1 },
2650         [CTA_EXPECT_ZONE]       = { .type = NLA_U16 },
2651         [CTA_EXPECT_FLAGS]      = { .type = NLA_U32 },
2652         [CTA_EXPECT_CLASS]      = { .type = NLA_U32 },
2653         [CTA_EXPECT_NAT]        = { .type = NLA_NESTED },
2654         [CTA_EXPECT_FN]         = { .type = NLA_NUL_STRING },
2655 };
2656
2657 static struct nf_conntrack_expect *
2658 ctnetlink_alloc_expect(const struct nlattr *const cda[], struct nf_conn *ct,
2659                        struct nf_conntrack_helper *helper,
2660                        struct nf_conntrack_tuple *tuple,
2661                        struct nf_conntrack_tuple *mask);
2662
2663 #ifdef CONFIG_NETFILTER_NETLINK_GLUE_CT
2664 static size_t
2665 ctnetlink_glue_build_size(const struct nf_conn *ct)
2666 {
2667         return 3 * nla_total_size(0) /* CTA_TUPLE_ORIG|REPL|MASTER */
2668                + 3 * nla_total_size(0) /* CTA_TUPLE_IP */
2669                + 3 * nla_total_size(0) /* CTA_TUPLE_PROTO */
2670                + 3 * nla_total_size(sizeof(u_int8_t)) /* CTA_PROTO_NUM */
2671                + nla_total_size(sizeof(u_int32_t)) /* CTA_ID */
2672                + nla_total_size(sizeof(u_int32_t)) /* CTA_STATUS */
2673                + nla_total_size(sizeof(u_int32_t)) /* CTA_TIMEOUT */
2674                + nla_total_size(0) /* CTA_PROTOINFO */
2675                + nla_total_size(0) /* CTA_HELP */
2676                + nla_total_size(NF_CT_HELPER_NAME_LEN) /* CTA_HELP_NAME */
2677                + ctnetlink_secctx_size(ct)
2678                + ctnetlink_acct_size(ct)
2679                + ctnetlink_timestamp_size(ct)
2680 #if IS_ENABLED(CONFIG_NF_NAT)
2681                + 2 * nla_total_size(0) /* CTA_NAT_SEQ_ADJ_ORIG|REPL */
2682                + 6 * nla_total_size(sizeof(u_int32_t)) /* CTA_NAT_SEQ_OFFSET */
2683 #endif
2684 #ifdef CONFIG_NF_CONNTRACK_MARK
2685                + nla_total_size(sizeof(u_int32_t)) /* CTA_MARK */
2686 #endif
2687 #ifdef CONFIG_NF_CONNTRACK_ZONES
2688                + nla_total_size(sizeof(u_int16_t)) /* CTA_ZONE|CTA_TUPLE_ZONE */
2689 #endif
2690                + ctnetlink_proto_size(ct)
2691                ;
2692 }
2693
2694 static int __ctnetlink_glue_build(struct sk_buff *skb, struct nf_conn *ct)
2695 {
2696         const struct nf_conntrack_zone *zone;
2697         struct nlattr *nest_parms;
2698
2699         zone = nf_ct_zone(ct);
2700
2701         nest_parms = nla_nest_start(skb, CTA_TUPLE_ORIG);
2702         if (!nest_parms)
2703                 goto nla_put_failure;
2704         if (ctnetlink_dump_tuples(skb, nf_ct_tuple(ct, IP_CT_DIR_ORIGINAL)) < 0)
2705                 goto nla_put_failure;
2706         if (ctnetlink_dump_zone_id(skb, CTA_TUPLE_ZONE, zone,
2707                                    NF_CT_ZONE_DIR_ORIG) < 0)
2708                 goto nla_put_failure;
2709         nla_nest_end(skb, nest_parms);
2710
2711         nest_parms = nla_nest_start(skb, CTA_TUPLE_REPLY);
2712         if (!nest_parms)
2713                 goto nla_put_failure;
2714         if (ctnetlink_dump_tuples(skb, nf_ct_tuple(ct, IP_CT_DIR_REPLY)) < 0)
2715                 goto nla_put_failure;
2716         if (ctnetlink_dump_zone_id(skb, CTA_TUPLE_ZONE, zone,
2717                                    NF_CT_ZONE_DIR_REPL) < 0)
2718                 goto nla_put_failure;
2719         nla_nest_end(skb, nest_parms);
2720
2721         if (ctnetlink_dump_zone_id(skb, CTA_ZONE, zone,
2722                                    NF_CT_DEFAULT_ZONE_DIR) < 0)
2723                 goto nla_put_failure;
2724
2725         if (ctnetlink_dump_id(skb, ct) < 0)
2726                 goto nla_put_failure;
2727
2728         if (ctnetlink_dump_status(skb, ct) < 0)
2729                 goto nla_put_failure;
2730
2731         if (ctnetlink_dump_timeout(skb, ct, false) < 0)
2732                 goto nla_put_failure;
2733
2734         if (ctnetlink_dump_protoinfo(skb, ct, false) < 0)
2735                 goto nla_put_failure;
2736
2737         if (ctnetlink_dump_acct(skb, ct, IPCTNL_MSG_CT_GET) < 0 ||
2738             ctnetlink_dump_timestamp(skb, ct) < 0)
2739                 goto nla_put_failure;
2740
2741         if (ctnetlink_dump_helpinfo(skb, ct) < 0)
2742                 goto nla_put_failure;
2743
2744 #ifdef CONFIG_NF_CONNTRACK_SECMARK
2745         if (ct->secmark && ctnetlink_dump_secctx(skb, ct) < 0)
2746                 goto nla_put_failure;
2747 #endif
2748         if (ct->master && ctnetlink_dump_master(skb, ct) < 0)
2749                 goto nla_put_failure;
2750
2751         if ((ct->status & IPS_SEQ_ADJUST) &&
2752             ctnetlink_dump_ct_seq_adj(skb, ct) < 0)
2753                 goto nla_put_failure;
2754
2755         if (ctnetlink_dump_ct_synproxy(skb, ct) < 0)
2756                 goto nla_put_failure;
2757
2758 #ifdef CONFIG_NF_CONNTRACK_MARK
2759         if (ctnetlink_dump_mark(skb, ct) < 0)
2760                 goto nla_put_failure;
2761 #endif
2762         if (ctnetlink_dump_labels(skb, ct) < 0)
2763                 goto nla_put_failure;
2764         return 0;
2765
2766 nla_put_failure:
2767         return -ENOSPC;
2768 }
2769
2770 static int
2771 ctnetlink_glue_build(struct sk_buff *skb, struct nf_conn *ct,
2772                      enum ip_conntrack_info ctinfo,
2773                      u_int16_t ct_attr, u_int16_t ct_info_attr)
2774 {
2775         struct nlattr *nest_parms;
2776
2777         nest_parms = nla_nest_start(skb, ct_attr);
2778         if (!nest_parms)
2779                 goto nla_put_failure;
2780
2781         if (__ctnetlink_glue_build(skb, ct) < 0)
2782                 goto nla_put_failure;
2783
2784         nla_nest_end(skb, nest_parms);
2785
2786         if (nla_put_be32(skb, ct_info_attr, htonl(ctinfo)))
2787                 goto nla_put_failure;
2788
2789         return 0;
2790
2791 nla_put_failure:
2792         return -ENOSPC;
2793 }
2794
2795 static int
2796 ctnetlink_update_status(struct nf_conn *ct, const struct nlattr * const cda[])
2797 {
2798         unsigned int status = ntohl(nla_get_be32(cda[CTA_STATUS]));
2799         unsigned long d = ct->status ^ status;
2800
2801         if (d & IPS_SEEN_REPLY && !(status & IPS_SEEN_REPLY))
2802                 /* SEEN_REPLY bit can only be set */
2803                 return -EBUSY;
2804
2805         if (d & IPS_ASSURED && !(status & IPS_ASSURED))
2806                 /* ASSURED bit can only be set */
2807                 return -EBUSY;
2808
2809         /* This check is less strict than ctnetlink_change_status()
2810          * because callers often flip IPS_EXPECTED bits when sending
2811          * an NFQA_CT attribute to the kernel.  So ignore the
2812          * unchangeable bits but do not error out. Also user programs
2813          * are allowed to clear the bits that they are allowed to change.
2814          */
2815         __ctnetlink_change_status(ct, status, ~status);
2816         return 0;
2817 }
2818
2819 static int
2820 ctnetlink_glue_parse_ct(const struct nlattr *cda[], struct nf_conn *ct)
2821 {
2822         int err;
2823
2824         if (cda[CTA_TIMEOUT]) {
2825                 err = ctnetlink_change_timeout(ct, cda);
2826                 if (err < 0)
2827                         return err;
2828         }
2829         if (cda[CTA_STATUS]) {
2830                 err = ctnetlink_update_status(ct, cda);
2831                 if (err < 0)
2832                         return err;
2833         }
2834         if (cda[CTA_HELP]) {
2835                 err = ctnetlink_change_helper(ct, cda);
2836                 if (err < 0)
2837                         return err;
2838         }
2839         if (cda[CTA_LABELS]) {
2840                 err = ctnetlink_attach_labels(ct, cda);
2841                 if (err < 0)
2842                         return err;
2843         }
2844 #if defined(CONFIG_NF_CONNTRACK_MARK)
2845         if (cda[CTA_MARK]) {
2846                 ctnetlink_change_mark(ct, cda);
2847         }
2848 #endif
2849         return 0;
2850 }
2851
2852 static int
2853 ctnetlink_glue_parse(const struct nlattr *attr, struct nf_conn *ct)
2854 {
2855         struct nlattr *cda[CTA_MAX+1];
2856         int ret;
2857
2858         ret = nla_parse_nested_deprecated(cda, CTA_MAX, attr, ct_nla_policy,
2859                                           NULL);
2860         if (ret < 0)
2861                 return ret;
2862
2863         return ctnetlink_glue_parse_ct((const struct nlattr **)cda, ct);
2864 }
2865
2866 static int ctnetlink_glue_exp_parse(const struct nlattr * const *cda,
2867                                     const struct nf_conn *ct,
2868                                     struct nf_conntrack_tuple *tuple,
2869                                     struct nf_conntrack_tuple *mask)
2870 {
2871         int err;
2872
2873         err = ctnetlink_parse_tuple(cda, tuple, CTA_EXPECT_TUPLE,
2874                                     nf_ct_l3num(ct), NULL);
2875         if (err < 0)
2876                 return err;
2877
2878         return ctnetlink_parse_tuple(cda, mask, CTA_EXPECT_MASK,
2879                                      nf_ct_l3num(ct), NULL);
2880 }
2881
2882 static int
2883 ctnetlink_glue_attach_expect(const struct nlattr *attr, struct nf_conn *ct,
2884                              u32 portid, u32 report)
2885 {
2886         struct nlattr *cda[CTA_EXPECT_MAX+1];
2887         struct nf_conntrack_tuple tuple, mask;
2888         struct nf_conntrack_helper *helper = NULL;
2889         struct nf_conntrack_expect *exp;
2890         int err;
2891
2892         err = nla_parse_nested_deprecated(cda, CTA_EXPECT_MAX, attr,
2893                                           exp_nla_policy, NULL);
2894         if (err < 0)
2895                 return err;
2896
2897         err = ctnetlink_glue_exp_parse((const struct nlattr * const *)cda,
2898                                        ct, &tuple, &mask);
2899         if (err < 0)
2900                 return err;
2901
2902         if (cda[CTA_EXPECT_HELP_NAME]) {
2903                 const char *helpname = nla_data(cda[CTA_EXPECT_HELP_NAME]);
2904
2905                 helper = __nf_conntrack_helper_find(helpname, nf_ct_l3num(ct),
2906                                                     nf_ct_protonum(ct));
2907                 if (helper == NULL)
2908                         return -EOPNOTSUPP;
2909         }
2910
2911         exp = ctnetlink_alloc_expect((const struct nlattr * const *)cda, ct,
2912                                      helper, &tuple, &mask);
2913         if (IS_ERR(exp))
2914                 return PTR_ERR(exp);
2915
2916         err = nf_ct_expect_related_report(exp, portid, report, 0);
2917         nf_ct_expect_put(exp);
2918         return err;
2919 }
2920
2921 static void ctnetlink_glue_seqadj(struct sk_buff *skb, struct nf_conn *ct,
2922                                   enum ip_conntrack_info ctinfo, int diff)
2923 {
2924         if (!(ct->status & IPS_NAT_MASK))
2925                 return;
2926
2927         nf_ct_tcp_seqadj_set(skb, ct, ctinfo, diff);
2928 }
2929
2930 static struct nfnl_ct_hook ctnetlink_glue_hook = {
2931         .build_size     = ctnetlink_glue_build_size,
2932         .build          = ctnetlink_glue_build,
2933         .parse          = ctnetlink_glue_parse,
2934         .attach_expect  = ctnetlink_glue_attach_expect,
2935         .seq_adjust     = ctnetlink_glue_seqadj,
2936 };
2937 #endif /* CONFIG_NETFILTER_NETLINK_GLUE_CT */
2938
2939 /***********************************************************************
2940  * EXPECT
2941  ***********************************************************************/
2942
2943 static int ctnetlink_exp_dump_tuple(struct sk_buff *skb,
2944                                     const struct nf_conntrack_tuple *tuple,
2945                                     u32 type)
2946 {
2947         struct nlattr *nest_parms;
2948
2949         nest_parms = nla_nest_start(skb, type);
2950         if (!nest_parms)
2951                 goto nla_put_failure;
2952         if (ctnetlink_dump_tuples(skb, tuple) < 0)
2953                 goto nla_put_failure;
2954         nla_nest_end(skb, nest_parms);
2955
2956         return 0;
2957
2958 nla_put_failure:
2959         return -1;
2960 }
2961
2962 static int ctnetlink_exp_dump_mask(struct sk_buff *skb,
2963                                    const struct nf_conntrack_tuple *tuple,
2964                                    const struct nf_conntrack_tuple_mask *mask)
2965 {
2966         const struct nf_conntrack_l4proto *l4proto;
2967         struct nf_conntrack_tuple m;
2968         struct nlattr *nest_parms;
2969         int ret;
2970
2971         memset(&m, 0xFF, sizeof(m));
2972         memcpy(&m.src.u3, &mask->src.u3, sizeof(m.src.u3));
2973         m.src.u.all = mask->src.u.all;
2974         m.src.l3num = tuple->src.l3num;
2975         m.dst.protonum = tuple->dst.protonum;
2976
2977         nest_parms = nla_nest_start(skb, CTA_EXPECT_MASK);
2978         if (!nest_parms)
2979                 goto nla_put_failure;
2980
2981         rcu_read_lock();
2982         ret = ctnetlink_dump_tuples_ip(skb, &m);
2983         if (ret >= 0) {
2984                 l4proto = nf_ct_l4proto_find(tuple->dst.protonum);
2985                 ret = ctnetlink_dump_tuples_proto(skb, &m, l4proto);
2986         }
2987         rcu_read_unlock();
2988
2989         if (unlikely(ret < 0))
2990                 goto nla_put_failure;
2991
2992         nla_nest_end(skb, nest_parms);
2993
2994         return 0;
2995
2996 nla_put_failure:
2997         return -1;
2998 }
2999
3000 static const union nf_inet_addr any_addr;
3001
3002 static __be32 nf_expect_get_id(const struct nf_conntrack_expect *exp)
3003 {
3004         static __read_mostly siphash_key_t exp_id_seed;
3005         unsigned long a, b, c, d;
3006
3007         net_get_random_once(&exp_id_seed, sizeof(exp_id_seed));
3008
3009         a = (unsigned long)exp;
3010         b = (unsigned long)exp->helper;
3011         c = (unsigned long)exp->master;
3012         d = (unsigned long)siphash(&exp->tuple, sizeof(exp->tuple), &exp_id_seed);
3013
3014 #ifdef CONFIG_64BIT
3015         return (__force __be32)siphash_4u64((u64)a, (u64)b, (u64)c, (u64)d, &exp_id_seed);
3016 #else
3017         return (__force __be32)siphash_4u32((u32)a, (u32)b, (u32)c, (u32)d, &exp_id_seed);
3018 #endif
3019 }
3020
3021 static int
3022 ctnetlink_exp_dump_expect(struct sk_buff *skb,
3023                           const struct nf_conntrack_expect *exp)
3024 {
3025         struct nf_conn *master = exp->master;
3026         long timeout = ((long)exp->timeout.expires - (long)jiffies) / HZ;
3027         struct nf_conn_help *help;
3028 #if IS_ENABLED(CONFIG_NF_NAT)
3029         struct nlattr *nest_parms;
3030         struct nf_conntrack_tuple nat_tuple = {};
3031 #endif
3032         struct nf_ct_helper_expectfn *expfn;
3033
3034         if (timeout < 0)
3035                 timeout = 0;
3036
3037         if (ctnetlink_exp_dump_tuple(skb, &exp->tuple, CTA_EXPECT_TUPLE) < 0)
3038                 goto nla_put_failure;
3039         if (ctnetlink_exp_dump_mask(skb, &exp->tuple, &exp->mask) < 0)
3040                 goto nla_put_failure;
3041         if (ctnetlink_exp_dump_tuple(skb,
3042                                  &master->tuplehash[IP_CT_DIR_ORIGINAL].tuple,
3043                                  CTA_EXPECT_MASTER) < 0)
3044                 goto nla_put_failure;
3045
3046 #if IS_ENABLED(CONFIG_NF_NAT)
3047         if (!nf_inet_addr_cmp(&exp->saved_addr, &any_addr) ||
3048             exp->saved_proto.all) {
3049                 nest_parms = nla_nest_start(skb, CTA_EXPECT_NAT);
3050                 if (!nest_parms)
3051                         goto nla_put_failure;
3052
3053                 if (nla_put_be32(skb, CTA_EXPECT_NAT_DIR, htonl(exp->dir)))
3054                         goto nla_put_failure;
3055
3056                 nat_tuple.src.l3num = nf_ct_l3num(master);
3057                 nat_tuple.src.u3 = exp->saved_addr;
3058                 nat_tuple.dst.protonum = nf_ct_protonum(master);
3059                 nat_tuple.src.u = exp->saved_proto;
3060
3061                 if (ctnetlink_exp_dump_tuple(skb, &nat_tuple,
3062                                                 CTA_EXPECT_NAT_TUPLE) < 0)
3063                         goto nla_put_failure;
3064                 nla_nest_end(skb, nest_parms);
3065         }
3066 #endif
3067         if (nla_put_be32(skb, CTA_EXPECT_TIMEOUT, htonl(timeout)) ||
3068             nla_put_be32(skb, CTA_EXPECT_ID, nf_expect_get_id(exp)) ||
3069             nla_put_be32(skb, CTA_EXPECT_FLAGS, htonl(exp->flags)) ||
3070             nla_put_be32(skb, CTA_EXPECT_CLASS, htonl(exp->class)))
3071                 goto nla_put_failure;
3072         help = nfct_help(master);
3073         if (help) {
3074                 struct nf_conntrack_helper *helper;
3075
3076                 helper = rcu_dereference(help->helper);
3077                 if (helper &&
3078                     nla_put_string(skb, CTA_EXPECT_HELP_NAME, helper->name))
3079                         goto nla_put_failure;
3080         }
3081         expfn = nf_ct_helper_expectfn_find_by_symbol(exp->expectfn);
3082         if (expfn != NULL &&
3083             nla_put_string(skb, CTA_EXPECT_FN, expfn->name))
3084                 goto nla_put_failure;
3085
3086         return 0;
3087
3088 nla_put_failure:
3089         return -1;
3090 }
3091
3092 static int
3093 ctnetlink_exp_fill_info(struct sk_buff *skb, u32 portid, u32 seq,
3094                         int event, const struct nf_conntrack_expect *exp)
3095 {
3096         struct nlmsghdr *nlh;
3097         unsigned int flags = portid ? NLM_F_MULTI : 0;
3098
3099         event = nfnl_msg_type(NFNL_SUBSYS_CTNETLINK_EXP, event);
3100         nlh = nfnl_msg_put(skb, portid, seq, event, flags,
3101                            exp->tuple.src.l3num, NFNETLINK_V0, 0);
3102         if (!nlh)
3103                 goto nlmsg_failure;
3104
3105         if (ctnetlink_exp_dump_expect(skb, exp) < 0)
3106                 goto nla_put_failure;
3107
3108         nlmsg_end(skb, nlh);
3109         return skb->len;
3110
3111 nlmsg_failure:
3112 nla_put_failure:
3113         nlmsg_cancel(skb, nlh);
3114         return -1;
3115 }
3116
3117 #ifdef CONFIG_NF_CONNTRACK_EVENTS
3118 static int
3119 ctnetlink_expect_event(unsigned int events, const struct nf_exp_event *item)
3120 {
3121         struct nf_conntrack_expect *exp = item->exp;
3122         struct net *net = nf_ct_exp_net(exp);
3123         struct nlmsghdr *nlh;
3124         struct sk_buff *skb;
3125         unsigned int type, group;
3126         int flags = 0;
3127
3128         if (events & (1 << IPEXP_DESTROY)) {
3129                 type = IPCTNL_MSG_EXP_DELETE;
3130                 group = NFNLGRP_CONNTRACK_EXP_DESTROY;
3131         } else if (events & (1 << IPEXP_NEW)) {
3132                 type = IPCTNL_MSG_EXP_NEW;
3133                 flags = NLM_F_CREATE|NLM_F_EXCL;
3134                 group = NFNLGRP_CONNTRACK_EXP_NEW;
3135         } else
3136                 return 0;
3137
3138         if (!item->report && !nfnetlink_has_listeners(net, group))
3139                 return 0;
3140
3141         skb = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_ATOMIC);
3142         if (skb == NULL)
3143                 goto errout;
3144
3145         type = nfnl_msg_type(NFNL_SUBSYS_CTNETLINK_EXP, type);
3146         nlh = nfnl_msg_put(skb, item->portid, 0, type, flags,
3147                            exp->tuple.src.l3num, NFNETLINK_V0, 0);
3148         if (!nlh)
3149                 goto nlmsg_failure;
3150
3151         if (ctnetlink_exp_dump_expect(skb, exp) < 0)
3152                 goto nla_put_failure;
3153
3154         nlmsg_end(skb, nlh);
3155         nfnetlink_send(skb, net, item->portid, group, item->report, GFP_ATOMIC);
3156         return 0;
3157
3158 nla_put_failure:
3159         nlmsg_cancel(skb, nlh);
3160 nlmsg_failure:
3161         kfree_skb(skb);
3162 errout:
3163         nfnetlink_set_err(net, 0, 0, -ENOBUFS);
3164         return 0;
3165 }
3166 #endif
3167 static int ctnetlink_exp_done(struct netlink_callback *cb)
3168 {
3169         if (cb->args[1])
3170                 nf_ct_expect_put((struct nf_conntrack_expect *)cb->args[1]);
3171         return 0;
3172 }
3173
3174 static int
3175 ctnetlink_exp_dump_table(struct sk_buff *skb, struct netlink_callback *cb)
3176 {
3177         struct net *net = sock_net(skb->sk);
3178         struct nf_conntrack_expect *exp, *last;
3179         struct nfgenmsg *nfmsg = nlmsg_data(cb->nlh);
3180         u_int8_t l3proto = nfmsg->nfgen_family;
3181
3182         rcu_read_lock();
3183         last = (struct nf_conntrack_expect *)cb->args[1];
3184         for (; cb->args[0] < nf_ct_expect_hsize; cb->args[0]++) {
3185 restart:
3186                 hlist_for_each_entry_rcu(exp, &nf_ct_expect_hash[cb->args[0]],
3187                                          hnode) {
3188                         if (l3proto && exp->tuple.src.l3num != l3proto)
3189                                 continue;
3190
3191                         if (!net_eq(nf_ct_net(exp->master), net))
3192                                 continue;
3193
3194                         if (cb->args[1]) {
3195                                 if (exp != last)
3196                                         continue;
3197                                 cb->args[1] = 0;
3198                         }
3199                         if (ctnetlink_exp_fill_info(skb,
3200                                                     NETLINK_CB(cb->skb).portid,
3201                                                     cb->nlh->nlmsg_seq,
3202                                                     IPCTNL_MSG_EXP_NEW,
3203                                                     exp) < 0) {
3204                                 if (!refcount_inc_not_zero(&exp->use))
3205                                         continue;
3206                                 cb->args[1] = (unsigned long)exp;
3207                                 goto out;
3208                         }
3209                 }
3210                 if (cb->args[1]) {
3211                         cb->args[1] = 0;
3212                         goto restart;
3213                 }
3214         }
3215 out:
3216         rcu_read_unlock();
3217         if (last)
3218                 nf_ct_expect_put(last);
3219
3220         return skb->len;
3221 }
3222
3223 static int
3224 ctnetlink_exp_ct_dump_table(struct sk_buff *skb, struct netlink_callback *cb)
3225 {
3226         struct nf_conntrack_expect *exp, *last;
3227         struct nfgenmsg *nfmsg = nlmsg_data(cb->nlh);
3228         struct nf_conn *ct = cb->data;
3229         struct nf_conn_help *help = nfct_help(ct);
3230         u_int8_t l3proto = nfmsg->nfgen_family;
3231
3232         if (cb->args[0])
3233                 return 0;
3234
3235         rcu_read_lock();
3236         last = (struct nf_conntrack_expect *)cb->args[1];
3237 restart:
3238         hlist_for_each_entry_rcu(exp, &help->expectations, lnode) {
3239                 if (l3proto && exp->tuple.src.l3num != l3proto)
3240                         continue;
3241                 if (cb->args[1]) {
3242                         if (exp != last)
3243                                 continue;
3244                         cb->args[1] = 0;
3245                 }
3246                 if (ctnetlink_exp_fill_info(skb, NETLINK_CB(cb->skb).portid,
3247                                             cb->nlh->nlmsg_seq,
3248                                             IPCTNL_MSG_EXP_NEW,
3249                                             exp) < 0) {
3250                         if (!refcount_inc_not_zero(&exp->use))
3251                                 continue;
3252                         cb->args[1] = (unsigned long)exp;
3253                         goto out;
3254                 }
3255         }
3256         if (cb->args[1]) {
3257                 cb->args[1] = 0;
3258                 goto restart;
3259         }
3260         cb->args[0] = 1;
3261 out:
3262         rcu_read_unlock();
3263         if (last)
3264                 nf_ct_expect_put(last);
3265
3266         return skb->len;
3267 }
3268
3269 static int ctnetlink_dump_exp_ct(struct net *net, struct sock *ctnl,
3270                                  struct sk_buff *skb,
3271                                  const struct nlmsghdr *nlh,
3272                                  const struct nlattr * const cda[],
3273                                  struct netlink_ext_ack *extack)
3274 {
3275         int err;
3276         struct nfgenmsg *nfmsg = nlmsg_data(nlh);
3277         u_int8_t u3 = nfmsg->nfgen_family;
3278         struct nf_conntrack_tuple tuple;
3279         struct nf_conntrack_tuple_hash *h;
3280         struct nf_conn *ct;
3281         struct nf_conntrack_zone zone;
3282         struct netlink_dump_control c = {
3283                 .dump = ctnetlink_exp_ct_dump_table,
3284                 .done = ctnetlink_exp_done,
3285         };
3286
3287         err = ctnetlink_parse_tuple(cda, &tuple, CTA_EXPECT_MASTER,
3288                                     u3, NULL);
3289         if (err < 0)
3290                 return err;
3291
3292         err = ctnetlink_parse_zone(cda[CTA_EXPECT_ZONE], &zone);
3293         if (err < 0)
3294                 return err;
3295
3296         h = nf_conntrack_find_get(net, &zone, &tuple);
3297         if (!h)
3298                 return -ENOENT;
3299
3300         ct = nf_ct_tuplehash_to_ctrack(h);
3301         /* No expectation linked to this connection tracking. */
3302         if (!nfct_help(ct)) {
3303                 nf_ct_put(ct);
3304                 return 0;
3305         }
3306
3307         c.data = ct;
3308
3309         err = netlink_dump_start(ctnl, skb, nlh, &c);
3310         nf_ct_put(ct);
3311
3312         return err;
3313 }
3314
3315 static int ctnetlink_get_expect(struct sk_buff *skb,
3316                                 const struct nfnl_info *info,
3317                                 const struct nlattr * const cda[])
3318 {
3319         u_int8_t u3 = info->nfmsg->nfgen_family;
3320         struct nf_conntrack_tuple tuple;
3321         struct nf_conntrack_expect *exp;
3322         struct nf_conntrack_zone zone;
3323         struct sk_buff *skb2;
3324         int err;
3325
3326         if (info->nlh->nlmsg_flags & NLM_F_DUMP) {
3327                 if (cda[CTA_EXPECT_MASTER])
3328                         return ctnetlink_dump_exp_ct(info->net, info->sk, skb,
3329                                                      info->nlh, cda,
3330                                                      info->extack);
3331                 else {
3332                         struct netlink_dump_control c = {
3333                                 .dump = ctnetlink_exp_dump_table,
3334                                 .done = ctnetlink_exp_done,
3335                         };
3336                         return netlink_dump_start(info->sk, skb, info->nlh, &c);
3337                 }
3338         }
3339
3340         err = ctnetlink_parse_zone(cda[CTA_EXPECT_ZONE], &zone);
3341         if (err < 0)
3342                 return err;
3343
3344         if (cda[CTA_EXPECT_TUPLE])
3345                 err = ctnetlink_parse_tuple(cda, &tuple, CTA_EXPECT_TUPLE,
3346                                             u3, NULL);
3347         else if (cda[CTA_EXPECT_MASTER])
3348                 err = ctnetlink_parse_tuple(cda, &tuple, CTA_EXPECT_MASTER,
3349                                             u3, NULL);
3350         else
3351                 return -EINVAL;
3352
3353         if (err < 0)
3354                 return err;
3355
3356         exp = nf_ct_expect_find_get(info->net, &zone, &tuple);
3357         if (!exp)
3358                 return -ENOENT;
3359
3360         if (cda[CTA_EXPECT_ID]) {
3361                 __be32 id = nla_get_be32(cda[CTA_EXPECT_ID]);
3362
3363                 if (id != nf_expect_get_id(exp)) {
3364                         nf_ct_expect_put(exp);
3365                         return -ENOENT;
3366                 }
3367         }
3368
3369         skb2 = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
3370         if (!skb2) {
3371                 nf_ct_expect_put(exp);
3372                 return -ENOMEM;
3373         }
3374
3375         rcu_read_lock();
3376         err = ctnetlink_exp_fill_info(skb2, NETLINK_CB(skb).portid,
3377                                       info->nlh->nlmsg_seq, IPCTNL_MSG_EXP_NEW,
3378                                       exp);
3379         rcu_read_unlock();
3380         nf_ct_expect_put(exp);
3381         if (err <= 0) {
3382                 kfree_skb(skb2);
3383                 return -ENOMEM;
3384         }
3385
3386         return nfnetlink_unicast(skb2, info->net, NETLINK_CB(skb).portid);
3387 }
3388
3389 static bool expect_iter_name(struct nf_conntrack_expect *exp, void *data)
3390 {
3391         const struct nf_conn_help *m_help;
3392         const char *name = data;
3393
3394         m_help = nfct_help(exp->master);
3395
3396         return strcmp(m_help->helper->name, name) == 0;
3397 }
3398
3399 static bool expect_iter_all(struct nf_conntrack_expect *exp, void *data)
3400 {
3401         return true;
3402 }
3403
3404 static int ctnetlink_del_expect(struct sk_buff *skb,
3405                                 const struct nfnl_info *info,
3406                                 const struct nlattr * const cda[])
3407 {
3408         u_int8_t u3 = info->nfmsg->nfgen_family;
3409         struct nf_conntrack_expect *exp;
3410         struct nf_conntrack_tuple tuple;
3411         struct nf_conntrack_zone zone;
3412         int err;
3413
3414         if (cda[CTA_EXPECT_TUPLE]) {
3415                 /* delete a single expect by tuple */
3416                 err = ctnetlink_parse_zone(cda[CTA_EXPECT_ZONE], &zone);
3417                 if (err < 0)
3418                         return err;
3419
3420                 err = ctnetlink_parse_tuple(cda, &tuple, CTA_EXPECT_TUPLE,
3421                                             u3, NULL);
3422                 if (err < 0)
3423                         return err;
3424
3425                 /* bump usage count to 2 */
3426                 exp = nf_ct_expect_find_get(info->net, &zone, &tuple);
3427                 if (!exp)
3428                         return -ENOENT;
3429
3430                 if (cda[CTA_EXPECT_ID]) {
3431                         __be32 id = nla_get_be32(cda[CTA_EXPECT_ID]);
3432                         if (ntohl(id) != (u32)(unsigned long)exp) {
3433                                 nf_ct_expect_put(exp);
3434                                 return -ENOENT;
3435                         }
3436                 }
3437
3438                 /* after list removal, usage count == 1 */
3439                 spin_lock_bh(&nf_conntrack_expect_lock);
3440                 if (del_timer(&exp->timeout)) {
3441                         nf_ct_unlink_expect_report(exp, NETLINK_CB(skb).portid,
3442                                                    nlmsg_report(info->nlh));
3443                         nf_ct_expect_put(exp);
3444                 }
3445                 spin_unlock_bh(&nf_conntrack_expect_lock);
3446                 /* have to put what we 'get' above.
3447                  * after this line usage count == 0 */
3448                 nf_ct_expect_put(exp);
3449         } else if (cda[CTA_EXPECT_HELP_NAME]) {
3450                 char *name = nla_data(cda[CTA_EXPECT_HELP_NAME]);
3451
3452                 nf_ct_expect_iterate_net(info->net, expect_iter_name, name,
3453                                          NETLINK_CB(skb).portid,
3454                                          nlmsg_report(info->nlh));
3455         } else {
3456                 /* This basically means we have to flush everything*/
3457                 nf_ct_expect_iterate_net(info->net, expect_iter_all, NULL,
3458                                          NETLINK_CB(skb).portid,
3459                                          nlmsg_report(info->nlh));
3460         }
3461
3462         return 0;
3463 }
3464 static int
3465 ctnetlink_change_expect(struct nf_conntrack_expect *x,
3466                         const struct nlattr * const cda[])
3467 {
3468         if (cda[CTA_EXPECT_TIMEOUT]) {
3469                 if (!del_timer(&x->timeout))
3470                         return -ETIME;
3471
3472                 x->timeout.expires = jiffies +
3473                         ntohl(nla_get_be32(cda[CTA_EXPECT_TIMEOUT])) * HZ;
3474                 add_timer(&x->timeout);
3475         }
3476         return 0;
3477 }
3478
3479 static const struct nla_policy exp_nat_nla_policy[CTA_EXPECT_NAT_MAX+1] = {
3480         [CTA_EXPECT_NAT_DIR]    = { .type = NLA_U32 },
3481         [CTA_EXPECT_NAT_TUPLE]  = { .type = NLA_NESTED },
3482 };
3483
3484 static int
3485 ctnetlink_parse_expect_nat(const struct nlattr *attr,
3486                            struct nf_conntrack_expect *exp,
3487                            u_int8_t u3)
3488 {
3489 #if IS_ENABLED(CONFIG_NF_NAT)
3490         struct nlattr *tb[CTA_EXPECT_NAT_MAX+1];
3491         struct nf_conntrack_tuple nat_tuple = {};
3492         int err;
3493
3494         err = nla_parse_nested_deprecated(tb, CTA_EXPECT_NAT_MAX, attr,
3495                                           exp_nat_nla_policy, NULL);
3496         if (err < 0)
3497                 return err;
3498
3499         if (!tb[CTA_EXPECT_NAT_DIR] || !tb[CTA_EXPECT_NAT_TUPLE])
3500                 return -EINVAL;
3501
3502         err = ctnetlink_parse_tuple((const struct nlattr * const *)tb,
3503                                     &nat_tuple, CTA_EXPECT_NAT_TUPLE,
3504                                     u3, NULL);
3505         if (err < 0)
3506                 return err;
3507
3508         exp->saved_addr = nat_tuple.src.u3;
3509         exp->saved_proto = nat_tuple.src.u;
3510         exp->dir = ntohl(nla_get_be32(tb[CTA_EXPECT_NAT_DIR]));
3511
3512         return 0;
3513 #else
3514         return -EOPNOTSUPP;
3515 #endif
3516 }
3517
3518 static struct nf_conntrack_expect *
3519 ctnetlink_alloc_expect(const struct nlattr * const cda[], struct nf_conn *ct,
3520                        struct nf_conntrack_helper *helper,
3521                        struct nf_conntrack_tuple *tuple,
3522                        struct nf_conntrack_tuple *mask)
3523 {
3524         u_int32_t class = 0;
3525         struct nf_conntrack_expect *exp;
3526         struct nf_conn_help *help;
3527         int err;
3528
3529         help = nfct_help(ct);
3530         if (!help)
3531                 return ERR_PTR(-EOPNOTSUPP);
3532
3533         if (cda[CTA_EXPECT_CLASS] && helper) {
3534                 class = ntohl(nla_get_be32(cda[CTA_EXPECT_CLASS]));
3535                 if (class > helper->expect_class_max)
3536                         return ERR_PTR(-EINVAL);
3537         }
3538         exp = nf_ct_expect_alloc(ct);
3539         if (!exp)
3540                 return ERR_PTR(-ENOMEM);
3541
3542         if (cda[CTA_EXPECT_FLAGS]) {
3543                 exp->flags = ntohl(nla_get_be32(cda[CTA_EXPECT_FLAGS]));
3544                 exp->flags &= ~NF_CT_EXPECT_USERSPACE;
3545         } else {
3546                 exp->flags = 0;
3547         }
3548         if (cda[CTA_EXPECT_FN]) {
3549                 const char *name = nla_data(cda[CTA_EXPECT_FN]);
3550                 struct nf_ct_helper_expectfn *expfn;
3551
3552                 expfn = nf_ct_helper_expectfn_find_by_name(name);
3553                 if (expfn == NULL) {
3554                         err = -EINVAL;
3555                         goto err_out;
3556                 }
3557                 exp->expectfn = expfn->expectfn;
3558         } else
3559                 exp->expectfn = NULL;
3560
3561         exp->class = class;
3562         exp->master = ct;
3563         exp->helper = helper;
3564         exp->tuple = *tuple;
3565         exp->mask.src.u3 = mask->src.u3;
3566         exp->mask.src.u.all = mask->src.u.all;
3567
3568         if (cda[CTA_EXPECT_NAT]) {
3569                 err = ctnetlink_parse_expect_nat(cda[CTA_EXPECT_NAT],
3570                                                  exp, nf_ct_l3num(ct));
3571                 if (err < 0)
3572                         goto err_out;
3573         }
3574         return exp;
3575 err_out:
3576         nf_ct_expect_put(exp);
3577         return ERR_PTR(err);
3578 }
3579
3580 static int
3581 ctnetlink_create_expect(struct net *net,
3582                         const struct nf_conntrack_zone *zone,
3583                         const struct nlattr * const cda[],
3584                         u_int8_t u3, u32 portid, int report)
3585 {
3586         struct nf_conntrack_tuple tuple, mask, master_tuple;
3587         struct nf_conntrack_tuple_hash *h = NULL;
3588         struct nf_conntrack_helper *helper = NULL;
3589         struct nf_conntrack_expect *exp;
3590         struct nf_conn *ct;
3591         int err;
3592
3593         /* caller guarantees that those three CTA_EXPECT_* exist */
3594         err = ctnetlink_parse_tuple(cda, &tuple, CTA_EXPECT_TUPLE,
3595                                     u3, NULL);
3596         if (err < 0)
3597                 return err;
3598         err = ctnetlink_parse_tuple(cda, &mask, CTA_EXPECT_MASK,
3599                                     u3, NULL);
3600         if (err < 0)
3601                 return err;
3602         err = ctnetlink_parse_tuple(cda, &master_tuple, CTA_EXPECT_MASTER,
3603                                     u3, NULL);
3604         if (err < 0)
3605                 return err;
3606
3607         /* Look for master conntrack of this expectation */
3608         h = nf_conntrack_find_get(net, zone, &master_tuple);
3609         if (!h)
3610                 return -ENOENT;
3611         ct = nf_ct_tuplehash_to_ctrack(h);
3612
3613         rcu_read_lock();
3614         if (cda[CTA_EXPECT_HELP_NAME]) {
3615                 const char *helpname = nla_data(cda[CTA_EXPECT_HELP_NAME]);
3616
3617                 helper = __nf_conntrack_helper_find(helpname, u3,
3618                                                     nf_ct_protonum(ct));
3619                 if (helper == NULL) {
3620                         rcu_read_unlock();
3621 #ifdef CONFIG_MODULES
3622                         if (request_module("nfct-helper-%s", helpname) < 0) {
3623                                 err = -EOPNOTSUPP;
3624                                 goto err_ct;
3625                         }
3626                         rcu_read_lock();
3627                         helper = __nf_conntrack_helper_find(helpname, u3,
3628                                                             nf_ct_protonum(ct));
3629                         if (helper) {
3630                                 err = -EAGAIN;
3631                                 goto err_rcu;
3632                         }
3633                         rcu_read_unlock();
3634 #endif
3635                         err = -EOPNOTSUPP;
3636                         goto err_ct;
3637                 }
3638         }
3639
3640         exp = ctnetlink_alloc_expect(cda, ct, helper, &tuple, &mask);
3641         if (IS_ERR(exp)) {
3642                 err = PTR_ERR(exp);
3643                 goto err_rcu;
3644         }
3645
3646         err = nf_ct_expect_related_report(exp, portid, report, 0);
3647         nf_ct_expect_put(exp);
3648 err_rcu:
3649         rcu_read_unlock();
3650 err_ct:
3651         nf_ct_put(ct);
3652         return err;
3653 }
3654
3655 static int ctnetlink_new_expect(struct sk_buff *skb,
3656                                 const struct nfnl_info *info,
3657                                 const struct nlattr * const cda[])
3658 {
3659         u_int8_t u3 = info->nfmsg->nfgen_family;
3660         struct nf_conntrack_tuple tuple;
3661         struct nf_conntrack_expect *exp;
3662         struct nf_conntrack_zone zone;
3663         int err;
3664
3665         if (!cda[CTA_EXPECT_TUPLE]
3666             || !cda[CTA_EXPECT_MASK]
3667             || !cda[CTA_EXPECT_MASTER])
3668                 return -EINVAL;
3669
3670         err = ctnetlink_parse_zone(cda[CTA_EXPECT_ZONE], &zone);
3671         if (err < 0)
3672                 return err;
3673
3674         err = ctnetlink_parse_tuple(cda, &tuple, CTA_EXPECT_TUPLE,
3675                                     u3, NULL);
3676         if (err < 0)
3677                 return err;
3678
3679         spin_lock_bh(&nf_conntrack_expect_lock);
3680         exp = __nf_ct_expect_find(info->net, &zone, &tuple);
3681         if (!exp) {
3682                 spin_unlock_bh(&nf_conntrack_expect_lock);
3683                 err = -ENOENT;
3684                 if (info->nlh->nlmsg_flags & NLM_F_CREATE) {
3685                         err = ctnetlink_create_expect(info->net, &zone, cda, u3,
3686                                                       NETLINK_CB(skb).portid,
3687                                                       nlmsg_report(info->nlh));
3688                 }
3689                 return err;
3690         }
3691
3692         err = -EEXIST;
3693         if (!(info->nlh->nlmsg_flags & NLM_F_EXCL))
3694                 err = ctnetlink_change_expect(exp, cda);
3695         spin_unlock_bh(&nf_conntrack_expect_lock);
3696
3697         return err;
3698 }
3699
3700 static int
3701 ctnetlink_exp_stat_fill_info(struct sk_buff *skb, u32 portid, u32 seq, int cpu,
3702                              const struct ip_conntrack_stat *st)
3703 {
3704         struct nlmsghdr *nlh;
3705         unsigned int flags = portid ? NLM_F_MULTI : 0, event;
3706
3707         event = nfnl_msg_type(NFNL_SUBSYS_CTNETLINK,
3708                               IPCTNL_MSG_EXP_GET_STATS_CPU);
3709         nlh = nfnl_msg_put(skb, portid, seq, event, flags, AF_UNSPEC,
3710                            NFNETLINK_V0, htons(cpu));
3711         if (!nlh)
3712                 goto nlmsg_failure;
3713
3714         if (nla_put_be32(skb, CTA_STATS_EXP_NEW, htonl(st->expect_new)) ||
3715             nla_put_be32(skb, CTA_STATS_EXP_CREATE, htonl(st->expect_create)) ||
3716             nla_put_be32(skb, CTA_STATS_EXP_DELETE, htonl(st->expect_delete)))
3717                 goto nla_put_failure;
3718
3719         nlmsg_end(skb, nlh);
3720         return skb->len;
3721
3722 nla_put_failure:
3723 nlmsg_failure:
3724         nlmsg_cancel(skb, nlh);
3725         return -1;
3726 }
3727
3728 static int
3729 ctnetlink_exp_stat_cpu_dump(struct sk_buff *skb, struct netlink_callback *cb)
3730 {
3731         int cpu;
3732         struct net *net = sock_net(skb->sk);
3733
3734         if (cb->args[0] == nr_cpu_ids)
3735                 return 0;
3736
3737         for (cpu = cb->args[0]; cpu < nr_cpu_ids; cpu++) {
3738                 const struct ip_conntrack_stat *st;
3739
3740                 if (!cpu_possible(cpu))
3741                         continue;
3742
3743                 st = per_cpu_ptr(net->ct.stat, cpu);
3744                 if (ctnetlink_exp_stat_fill_info(skb, NETLINK_CB(cb->skb).portid,
3745                                                  cb->nlh->nlmsg_seq,
3746                                                  cpu, st) < 0)
3747                         break;
3748         }
3749         cb->args[0] = cpu;
3750
3751         return skb->len;
3752 }
3753
3754 static int ctnetlink_stat_exp_cpu(struct sk_buff *skb,
3755                                   const struct nfnl_info *info,
3756                                   const struct nlattr * const cda[])
3757 {
3758         if (info->nlh->nlmsg_flags & NLM_F_DUMP) {
3759                 struct netlink_dump_control c = {
3760                         .dump = ctnetlink_exp_stat_cpu_dump,
3761                 };
3762                 return netlink_dump_start(info->sk, skb, info->nlh, &c);
3763         }
3764
3765         return 0;
3766 }
3767
3768 #ifdef CONFIG_NF_CONNTRACK_EVENTS
3769 static struct nf_ct_event_notifier ctnl_notifier = {
3770         .ct_event = ctnetlink_conntrack_event,
3771         .exp_event = ctnetlink_expect_event,
3772 };
3773 #endif
3774
3775 static const struct nfnl_callback ctnl_cb[IPCTNL_MSG_MAX] = {
3776         [IPCTNL_MSG_CT_NEW]     = {
3777                 .call           = ctnetlink_new_conntrack,
3778                 .type           = NFNL_CB_MUTEX,
3779                 .attr_count     = CTA_MAX,
3780                 .policy         = ct_nla_policy
3781         },
3782         [IPCTNL_MSG_CT_GET]     = {
3783                 .call           = ctnetlink_get_conntrack,
3784                 .type           = NFNL_CB_MUTEX,
3785                 .attr_count     = CTA_MAX,
3786                 .policy         = ct_nla_policy
3787         },
3788         [IPCTNL_MSG_CT_DELETE]  = {
3789                 .call           = ctnetlink_del_conntrack,
3790                 .type           = NFNL_CB_MUTEX,
3791                 .attr_count     = CTA_MAX,
3792                 .policy         = ct_nla_policy
3793         },
3794         [IPCTNL_MSG_CT_GET_CTRZERO] = {
3795                 .call           = ctnetlink_get_conntrack,
3796                 .type           = NFNL_CB_MUTEX,
3797                 .attr_count     = CTA_MAX,
3798                 .policy         = ct_nla_policy
3799         },
3800         [IPCTNL_MSG_CT_GET_STATS_CPU] = {
3801                 .call           = ctnetlink_stat_ct_cpu,
3802                 .type           = NFNL_CB_MUTEX,
3803         },
3804         [IPCTNL_MSG_CT_GET_STATS] = {
3805                 .call           = ctnetlink_stat_ct,
3806                 .type           = NFNL_CB_MUTEX,
3807         },
3808         [IPCTNL_MSG_CT_GET_DYING] = {
3809                 .call           = ctnetlink_get_ct_dying,
3810                 .type           = NFNL_CB_MUTEX,
3811         },
3812         [IPCTNL_MSG_CT_GET_UNCONFIRMED] = {
3813                 .call           = ctnetlink_get_ct_unconfirmed,
3814                 .type           = NFNL_CB_MUTEX,
3815         },
3816 };
3817
3818 static const struct nfnl_callback ctnl_exp_cb[IPCTNL_MSG_EXP_MAX] = {
3819         [IPCTNL_MSG_EXP_GET] = {
3820                 .call           = ctnetlink_get_expect,
3821                 .type           = NFNL_CB_MUTEX,
3822                 .attr_count     = CTA_EXPECT_MAX,
3823                 .policy         = exp_nla_policy
3824         },
3825         [IPCTNL_MSG_EXP_NEW] = {
3826                 .call           = ctnetlink_new_expect,
3827                 .type           = NFNL_CB_MUTEX,
3828                 .attr_count     = CTA_EXPECT_MAX,
3829                 .policy         = exp_nla_policy
3830         },
3831         [IPCTNL_MSG_EXP_DELETE] = {
3832                 .call           = ctnetlink_del_expect,
3833                 .type           = NFNL_CB_MUTEX,
3834                 .attr_count     = CTA_EXPECT_MAX,
3835                 .policy         = exp_nla_policy
3836         },
3837         [IPCTNL_MSG_EXP_GET_STATS_CPU] = {
3838                 .call           = ctnetlink_stat_exp_cpu,
3839                 .type           = NFNL_CB_MUTEX,
3840         },
3841 };
3842
3843 static const struct nfnetlink_subsystem ctnl_subsys = {
3844         .name                           = "conntrack",
3845         .subsys_id                      = NFNL_SUBSYS_CTNETLINK,
3846         .cb_count                       = IPCTNL_MSG_MAX,
3847         .cb                             = ctnl_cb,
3848 };
3849
3850 static const struct nfnetlink_subsystem ctnl_exp_subsys = {
3851         .name                           = "conntrack_expect",
3852         .subsys_id                      = NFNL_SUBSYS_CTNETLINK_EXP,
3853         .cb_count                       = IPCTNL_MSG_EXP_MAX,
3854         .cb                             = ctnl_exp_cb,
3855 };
3856
3857 MODULE_ALIAS("ip_conntrack_netlink");
3858 MODULE_ALIAS_NFNL_SUBSYS(NFNL_SUBSYS_CTNETLINK);
3859 MODULE_ALIAS_NFNL_SUBSYS(NFNL_SUBSYS_CTNETLINK_EXP);
3860
3861 static int __net_init ctnetlink_net_init(struct net *net)
3862 {
3863 #ifdef CONFIG_NF_CONNTRACK_EVENTS
3864         nf_conntrack_register_notifier(net, &ctnl_notifier);
3865 #endif
3866         return 0;
3867 }
3868
3869 static void ctnetlink_net_pre_exit(struct net *net)
3870 {
3871 #ifdef CONFIG_NF_CONNTRACK_EVENTS
3872         nf_conntrack_unregister_notifier(net);
3873 #endif
3874 }
3875
3876 static struct pernet_operations ctnetlink_net_ops = {
3877         .init           = ctnetlink_net_init,
3878         .pre_exit       = ctnetlink_net_pre_exit,
3879 };
3880
3881 static int __init ctnetlink_init(void)
3882 {
3883         int ret;
3884
3885         ret = nfnetlink_subsys_register(&ctnl_subsys);
3886         if (ret < 0) {
3887                 pr_err("ctnetlink_init: cannot register with nfnetlink.\n");
3888                 goto err_out;
3889         }
3890
3891         ret = nfnetlink_subsys_register(&ctnl_exp_subsys);
3892         if (ret < 0) {
3893                 pr_err("ctnetlink_init: cannot register exp with nfnetlink.\n");
3894                 goto err_unreg_subsys;
3895         }
3896
3897         ret = register_pernet_subsys(&ctnetlink_net_ops);
3898         if (ret < 0) {
3899                 pr_err("ctnetlink_init: cannot register pernet operations\n");
3900                 goto err_unreg_exp_subsys;
3901         }
3902 #ifdef CONFIG_NETFILTER_NETLINK_GLUE_CT
3903         /* setup interaction between nf_queue and nf_conntrack_netlink. */
3904         RCU_INIT_POINTER(nfnl_ct_hook, &ctnetlink_glue_hook);
3905 #endif
3906         return 0;
3907
3908 err_unreg_exp_subsys:
3909         nfnetlink_subsys_unregister(&ctnl_exp_subsys);
3910 err_unreg_subsys:
3911         nfnetlink_subsys_unregister(&ctnl_subsys);
3912 err_out:
3913         return ret;
3914 }
3915
3916 static void __exit ctnetlink_exit(void)
3917 {
3918         unregister_pernet_subsys(&ctnetlink_net_ops);
3919         nfnetlink_subsys_unregister(&ctnl_exp_subsys);
3920         nfnetlink_subsys_unregister(&ctnl_subsys);
3921 #ifdef CONFIG_NETFILTER_NETLINK_GLUE_CT
3922         RCU_INIT_POINTER(nfnl_ct_hook, NULL);
3923 #endif
3924         synchronize_rcu();
3925 }
3926
3927 module_init(ctnetlink_init);
3928 module_exit(ctnetlink_exit);