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