nf_conntrack_netlink.c 50.7 KB
Newer Older
1 2 3 4
/* Connection tracking via netlink socket. Allows for user space
 * protocol helpers and general trouble making from userspace.
 *
 * (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-2008 by Pablo Neira Ayuso <pablo@netfilter.org>
8
 *
9
 * Initial connection tracking via netlink development funded and
10 11 12 13 14 15 16 17 18 19 20
 * generally made possible by Network Robots, Inc. (www.networkrobots.com)
 *
 * Further development of this code funded by Astaro AG (http://www.astaro.com)
 *
 * This software may be used and distributed according to the terms
 * of the GNU General Public License, incorporated herein by reference.
 */

#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
21
#include <linux/rculist.h>
22
#include <linux/rculist_nulls.h>
23 24
#include <linux/types.h>
#include <linux/timer.h>
25
#include <linux/security.h>
26 27 28 29
#include <linux/skbuff.h>
#include <linux/errno.h>
#include <linux/netlink.h>
#include <linux/spinlock.h>
30
#include <linux/interrupt.h>
31
#include <linux/slab.h>
32 33

#include <linux/netfilter.h>
34
#include <net/netlink.h>
35
#include <net/sock.h>
36 37
#include <net/netfilter/nf_conntrack.h>
#include <net/netfilter/nf_conntrack_core.h>
38
#include <net/netfilter/nf_conntrack_expect.h>
39 40
#include <net/netfilter/nf_conntrack_helper.h>
#include <net/netfilter/nf_conntrack_l3proto.h>
41
#include <net/netfilter/nf_conntrack_l4proto.h>
42
#include <net/netfilter/nf_conntrack_tuple.h>
43
#include <net/netfilter/nf_conntrack_acct.h>
44
#include <net/netfilter/nf_conntrack_zones.h>
45 46 47 48
#ifdef CONFIG_NF_NAT_NEEDED
#include <net/netfilter/nf_nat_core.h>
#include <net/netfilter/nf_nat_protocol.h>
#endif
49 50 51 52 53 54

#include <linux/netfilter/nfnetlink.h>
#include <linux/netfilter/nfnetlink_conntrack.h>

MODULE_LICENSE("GPL");

55
static char __initdata version[] = "0.93";
56 57

static inline int
58
ctnetlink_dump_tuples_proto(struct sk_buff *skb,
59
			    const struct nf_conntrack_tuple *tuple,
60
			    struct nf_conntrack_l4proto *l4proto)
61 62
{
	int ret = 0;
63
	struct nlattr *nest_parms;
64

65 66 67
	nest_parms = nla_nest_start(skb, CTA_TUPLE_PROTO | NLA_F_NESTED);
	if (!nest_parms)
		goto nla_put_failure;
68
	NLA_PUT_U8(skb, CTA_PROTO_NUM, tuple->dst.protonum);
69

70 71
	if (likely(l4proto->tuple_to_nlattr))
		ret = l4proto->tuple_to_nlattr(skb, tuple);
72

73
	nla_nest_end(skb, nest_parms);
74 75 76

	return ret;

77
nla_put_failure:
78 79 80 81
	return -1;
}

static inline int
82 83 84
ctnetlink_dump_tuples_ip(struct sk_buff *skb,
			 const struct nf_conntrack_tuple *tuple,
			 struct nf_conntrack_l3proto *l3proto)
85 86
{
	int ret = 0;
87 88 89 90 91
	struct nlattr *nest_parms;

	nest_parms = nla_nest_start(skb, CTA_TUPLE_IP | NLA_F_NESTED);
	if (!nest_parms)
		goto nla_put_failure;
92

93 94
	if (likely(l3proto->tuple_to_nlattr))
		ret = l3proto->tuple_to_nlattr(skb, tuple);
95

96
	nla_nest_end(skb, nest_parms);
97

98 99
	return ret;

100
nla_put_failure:
101 102 103
	return -1;
}

104
static int
105 106 107 108 109
ctnetlink_dump_tuples(struct sk_buff *skb,
		      const struct nf_conntrack_tuple *tuple)
{
	int ret;
	struct nf_conntrack_l3proto *l3proto;
110
	struct nf_conntrack_l4proto *l4proto;
111

112
	l3proto = __nf_ct_l3proto_find(tuple->src.l3num);
113
	ret = ctnetlink_dump_tuples_ip(skb, tuple, l3proto);
114 115 116 117

	if (unlikely(ret < 0))
		return ret;

118
	l4proto = __nf_ct_l4proto_find(tuple->src.l3num, tuple->dst.protonum);
119
	ret = ctnetlink_dump_tuples_proto(skb, tuple, l4proto);
120 121 122 123 124 125 126

	return ret;
}

static inline int
ctnetlink_dump_status(struct sk_buff *skb, const struct nf_conn *ct)
{
127
	NLA_PUT_BE32(skb, CTA_STATUS, htonl(ct->status));
128 129
	return 0;

130
nla_put_failure:
131 132 133 134 135 136
	return -1;
}

static inline int
ctnetlink_dump_timeout(struct sk_buff *skb, const struct nf_conn *ct)
{
137
	long timeout = (ct->timeout.expires - jiffies) / HZ;
138

139
	if (timeout < 0)
140
		timeout = 0;
141

142
	NLA_PUT_BE32(skb, CTA_TIMEOUT, htonl(timeout));
143 144
	return 0;

145
nla_put_failure:
146 147 148 149
	return -1;
}

static inline int
150
ctnetlink_dump_protoinfo(struct sk_buff *skb, struct nf_conn *ct)
151
{
152
	struct nf_conntrack_l4proto *l4proto;
153
	struct nlattr *nest_proto;
154 155
	int ret;

156 157
	l4proto = __nf_ct_l4proto_find(nf_ct_l3num(ct), nf_ct_protonum(ct));
	if (!l4proto->to_nlattr)
158
		return 0;
159

160 161 162
	nest_proto = nla_nest_start(skb, CTA_PROTOINFO | NLA_F_NESTED);
	if (!nest_proto)
		goto nla_put_failure;
163

164
	ret = l4proto->to_nlattr(skb, nest_proto, ct);
165

166
	nla_nest_end(skb, nest_proto);
167 168 169

	return ret;

170
nla_put_failure:
171 172 173 174 175 176
	return -1;
}

static inline int
ctnetlink_dump_helpinfo(struct sk_buff *skb, const struct nf_conn *ct)
{
177
	struct nlattr *nest_helper;
178
	const struct nf_conn_help *help = nfct_help(ct);
179
	struct nf_conntrack_helper *helper;
180

181
	if (!help)
182
		return 0;
183

184 185 186 187
	helper = rcu_dereference(help->helper);
	if (!helper)
		goto out;

188 189 190
	nest_helper = nla_nest_start(skb, CTA_HELP | NLA_F_NESTED);
	if (!nest_helper)
		goto nla_put_failure;
191
	NLA_PUT_STRING(skb, CTA_HELP_NAME, helper->name);
192

193 194
	if (helper->to_nlattr)
		helper->to_nlattr(skb, ct);
195

196
	nla_nest_end(skb, nest_helper);
197
out:
198 199
	return 0;

200
nla_put_failure:
201 202 203
	return -1;
}

204
static int
205 206 207 208
ctnetlink_dump_counters(struct sk_buff *skb, const struct nf_conn *ct,
			enum ip_conntrack_dir dir)
{
	enum ctattr_type type = dir ? CTA_COUNTERS_REPLY: CTA_COUNTERS_ORIG;
209
	struct nlattr *nest_count;
210 211 212 213 214
	const struct nf_conn_counter *acct;

	acct = nf_conn_acct_find(ct);
	if (!acct)
		return 0;
215

216 217 218 219
	nest_count = nla_nest_start(skb, type | NLA_F_NESTED);
	if (!nest_count)
		goto nla_put_failure;

220 221 222 223
	NLA_PUT_BE64(skb, CTA_COUNTERS_PACKETS,
		     cpu_to_be64(acct[dir].packets));
	NLA_PUT_BE64(skb, CTA_COUNTERS_BYTES,
		     cpu_to_be64(acct[dir].bytes));
224

225
	nla_nest_end(skb, nest_count);
226 227 228

	return 0;

229
nla_put_failure:
230 231 232 233 234 235 236
	return -1;
}

#ifdef CONFIG_NF_CONNTRACK_MARK
static inline int
ctnetlink_dump_mark(struct sk_buff *skb, const struct nf_conn *ct)
{
237
	NLA_PUT_BE32(skb, CTA_MARK, htonl(ct->mark));
238 239
	return 0;

240
nla_put_failure:
241 242 243 244 245 246
	return -1;
}
#else
#define ctnetlink_dump_mark(a, b) (0)
#endif

247 248
#ifdef CONFIG_NF_CONNTRACK_SECMARK
static inline int
249
ctnetlink_dump_secctx(struct sk_buff *skb, const struct nf_conn *ct)
250
{
251 252 253 254 255 256 257 258 259 260 261 262
	struct nlattr *nest_secctx;
	int len, ret;
	char *secctx;

	ret = security_secid_to_secctx(ct->secmark, &secctx, &len);
	if (ret)
		return ret;

	ret = -1;
	nest_secctx = nla_nest_start(skb, CTA_SECCTX | NLA_F_NESTED);
	if (!nest_secctx)
		goto nla_put_failure;
263

264 265 266 267
	NLA_PUT_STRING(skb, CTA_SECCTX_NAME, secctx);
	nla_nest_end(skb, nest_secctx);

	ret = 0;
268
nla_put_failure:
269 270
	security_release_secctx(secctx, len);
	return ret;
271 272
}
#else
273
#define ctnetlink_dump_secctx(a, b) (0)
274 275
#endif

276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298
#define master_tuple(ct) &(ct->master->tuplehash[IP_CT_DIR_ORIGINAL].tuple)

static inline int
ctnetlink_dump_master(struct sk_buff *skb, const struct nf_conn *ct)
{
	struct nlattr *nest_parms;

	if (!(ct->status & IPS_EXPECTED))
		return 0;

	nest_parms = nla_nest_start(skb, CTA_TUPLE_MASTER | NLA_F_NESTED);
	if (!nest_parms)
		goto nla_put_failure;
	if (ctnetlink_dump_tuples(skb, master_tuple(ct)) < 0)
		goto nla_put_failure;
	nla_nest_end(skb, nest_parms);

	return 0;

nla_put_failure:
	return -1;
}

299
#ifdef CONFIG_NF_NAT_NEEDED
300
static int
301 302 303 304 305 306 307 308
dump_nat_seq_adj(struct sk_buff *skb, const struct nf_nat_seq *natseq, int type)
{
	struct nlattr *nest_parms;

	nest_parms = nla_nest_start(skb, type | NLA_F_NESTED);
	if (!nest_parms)
		goto nla_put_failure;

309 310 311 312 313 314
	NLA_PUT_BE32(skb, CTA_NAT_SEQ_CORRECTION_POS,
		     htonl(natseq->correction_pos));
	NLA_PUT_BE32(skb, CTA_NAT_SEQ_OFFSET_BEFORE,
		     htonl(natseq->offset_before));
	NLA_PUT_BE32(skb, CTA_NAT_SEQ_OFFSET_AFTER,
		     htonl(natseq->offset_after));
315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346

	nla_nest_end(skb, nest_parms);

	return 0;

nla_put_failure:
	return -1;
}

static inline int
ctnetlink_dump_nat_seq_adj(struct sk_buff *skb, const struct nf_conn *ct)
{
	struct nf_nat_seq *natseq;
	struct nf_conn_nat *nat = nfct_nat(ct);

	if (!(ct->status & IPS_SEQ_ADJUST) || !nat)
		return 0;

	natseq = &nat->seq[IP_CT_DIR_ORIGINAL];
	if (dump_nat_seq_adj(skb, natseq, CTA_NAT_SEQ_ADJ_ORIG) == -1)
		return -1;

	natseq = &nat->seq[IP_CT_DIR_REPLY];
	if (dump_nat_seq_adj(skb, natseq, CTA_NAT_SEQ_ADJ_REPLY) == -1)
		return -1;

	return 0;
}
#else
#define ctnetlink_dump_nat_seq_adj(a, b) (0)
#endif

347 348 349
static inline int
ctnetlink_dump_id(struct sk_buff *skb, const struct nf_conn *ct)
{
350
	NLA_PUT_BE32(skb, CTA_ID, htonl((unsigned long)ct));
351 352
	return 0;

353
nla_put_failure:
354 355 356 357 358 359
	return -1;
}

static inline int
ctnetlink_dump_use(struct sk_buff *skb, const struct nf_conn *ct)
{
360
	NLA_PUT_BE32(skb, CTA_USE, htonl(atomic_read(&ct->ct_general.use)));
361 362
	return 0;

363
nla_put_failure:
364 365 366 367 368
	return -1;
}

static int
ctnetlink_fill_info(struct sk_buff *skb, u32 pid, u32 seq,
369
		    int event, struct nf_conn *ct)
370 371 372
{
	struct nlmsghdr *nlh;
	struct nfgenmsg *nfmsg;
373
	struct nlattr *nest_parms;
374
	unsigned int flags = pid ? NLM_F_MULTI : 0;
375 376

	event |= NFNL_SUBSYS_CTNETLINK << 8;
377 378 379
	nlh = nlmsg_put(skb, pid, seq, event, sizeof(*nfmsg), flags);
	if (nlh == NULL)
		goto nlmsg_failure;
380

381
	nfmsg = nlmsg_data(nlh);
382
	nfmsg->nfgen_family = nf_ct_l3num(ct);
383 384 385
	nfmsg->version      = NFNETLINK_V0;
	nfmsg->res_id	    = 0;

386 387 388
	nest_parms = nla_nest_start(skb, CTA_TUPLE_ORIG | NLA_F_NESTED);
	if (!nest_parms)
		goto nla_put_failure;
389
	if (ctnetlink_dump_tuples(skb, nf_ct_tuple(ct, IP_CT_DIR_ORIGINAL)) < 0)
390 391
		goto nla_put_failure;
	nla_nest_end(skb, nest_parms);
392

393 394 395
	nest_parms = nla_nest_start(skb, CTA_TUPLE_REPLY | NLA_F_NESTED);
	if (!nest_parms)
		goto nla_put_failure;
396
	if (ctnetlink_dump_tuples(skb, nf_ct_tuple(ct, IP_CT_DIR_REPLY)) < 0)
397 398
		goto nla_put_failure;
	nla_nest_end(skb, nest_parms);
399

400 401 402
	if (nf_ct_zone(ct))
		NLA_PUT_BE16(skb, CTA_ZONE, htons(nf_ct_zone(ct)));

403 404 405 406 407 408 409
	if (ctnetlink_dump_status(skb, ct) < 0 ||
	    ctnetlink_dump_timeout(skb, ct) < 0 ||
	    ctnetlink_dump_counters(skb, ct, IP_CT_DIR_ORIGINAL) < 0 ||
	    ctnetlink_dump_counters(skb, ct, IP_CT_DIR_REPLY) < 0 ||
	    ctnetlink_dump_protoinfo(skb, ct) < 0 ||
	    ctnetlink_dump_helpinfo(skb, ct) < 0 ||
	    ctnetlink_dump_mark(skb, ct) < 0 ||
410
	    ctnetlink_dump_secctx(skb, ct) < 0 ||
411
	    ctnetlink_dump_id(skb, ct) < 0 ||
412
	    ctnetlink_dump_use(skb, ct) < 0 ||
413
	    ctnetlink_dump_master(skb, ct) < 0 ||
414
	    ctnetlink_dump_nat_seq_adj(skb, ct) < 0)
415
		goto nla_put_failure;
416

417
	nlmsg_end(skb, nlh);
418 419 420
	return skb->len;

nlmsg_failure:
421
nla_put_failure:
422
	nlmsg_cancel(skb, nlh);
423 424 425 426
	return -1;
}

#ifdef CONFIG_NF_CONNTRACK_EVENTS
427 428
static inline size_t
ctnetlink_proto_size(const struct nf_conn *ct)
429 430 431
{
	struct nf_conntrack_l3proto *l3proto;
	struct nf_conntrack_l4proto *l4proto;
432 433 434 435 436 437 438 439 440 441 442 443 444
	size_t len = 0;

	rcu_read_lock();
	l3proto = __nf_ct_l3proto_find(nf_ct_l3num(ct));
	len += l3proto->nla_size;

	l4proto = __nf_ct_l4proto_find(nf_ct_l3num(ct), nf_ct_protonum(ct));
	len += l4proto->nla_size;
	rcu_read_unlock();

	return len;
}

445 446 447 448 449 450 451 452 453 454 455
static inline size_t
ctnetlink_counters_size(const struct nf_conn *ct)
{
	if (!nf_ct_ext_exist(ct, NF_CT_EXT_ACCT))
		return 0;
	return 2 * nla_total_size(0) /* CTA_COUNTERS_ORIG|REPL */
	       + 2 * nla_total_size(sizeof(uint64_t)) /* CTA_COUNTERS_PACKETS */
	       + 2 * nla_total_size(sizeof(uint64_t)) /* CTA_COUNTERS_BYTES */
	       ;
}

456 457 458 459 460 461 462 463 464 465 466
#ifdef CONFIG_NF_CONNTRACK_SECMARK
static int ctnetlink_nlmsg_secctx_size(const struct nf_conn *ct)
{
	int len;

	security_secid_to_secctx(ct->secmark, NULL, &len);

	return sizeof(char) * len;
}
#endif

467 468 469 470 471 472 473 474 475 476
static inline size_t
ctnetlink_nlmsg_size(const struct nf_conn *ct)
{
	return NLMSG_ALIGN(sizeof(struct nfgenmsg))
	       + 3 * nla_total_size(0) /* CTA_TUPLE_ORIG|REPL|MASTER */
	       + 3 * nla_total_size(0) /* CTA_TUPLE_IP */
	       + 3 * nla_total_size(0) /* CTA_TUPLE_PROTO */
	       + 3 * nla_total_size(sizeof(u_int8_t)) /* CTA_PROTO_NUM */
	       + nla_total_size(sizeof(u_int32_t)) /* CTA_ID */
	       + nla_total_size(sizeof(u_int32_t)) /* CTA_STATUS */
477
	       + ctnetlink_counters_size(ct)
478 479 480 481
	       + nla_total_size(sizeof(u_int32_t)) /* CTA_TIMEOUT */
	       + nla_total_size(0) /* CTA_PROTOINFO */
	       + nla_total_size(0) /* CTA_HELP */
	       + nla_total_size(NF_CT_HELPER_NAME_LEN) /* CTA_HELP_NAME */
482
#ifdef CONFIG_NF_CONNTRACK_SECMARK
483 484
	       + nla_total_size(0) /* CTA_SECCTX */
	       + nla_total_size(ctnetlink_nlmsg_secctx_size(ct)) /* CTA_SECCTX_NAME */
485 486
#endif
#ifdef CONFIG_NF_NAT_NEEDED
487 488
	       + 2 * nla_total_size(0) /* CTA_NAT_SEQ_ADJ_ORIG|REPL */
	       + 6 * nla_total_size(sizeof(u_int32_t)) /* CTA_NAT_SEQ_OFFSET */
489 490
#endif
#ifdef CONFIG_NF_CONNTRACK_MARK
491
	       + nla_total_size(sizeof(u_int32_t)) /* CTA_MARK */
492
#endif
493 494
	       + ctnetlink_proto_size(ct)
	       ;
495 496
}

497 498
static int
ctnetlink_conntrack_event(unsigned int events, struct nf_ct_event *item)
499
{
500
	struct net *net;
501 502
	struct nlmsghdr *nlh;
	struct nfgenmsg *nfmsg;
503
	struct nlattr *nest_parms;
504
	struct nf_conn *ct = item->ct;
505 506 507
	struct sk_buff *skb;
	unsigned int type;
	unsigned int flags = 0, group;
508
	int err;
509 510

	/* ignore our fake conntrack entry */
511
	if (nf_ct_is_untracked(ct))
512
		return 0;
513

514
	if (events & (1 << IPCT_DESTROY)) {
515 516
		type = IPCTNL_MSG_CT_DELETE;
		group = NFNLGRP_CONNTRACK_DESTROY;
517
	} else  if (events & ((1 << IPCT_NEW) | (1 << IPCT_RELATED))) {
518 519 520
		type = IPCTNL_MSG_CT_NEW;
		flags = NLM_F_CREATE|NLM_F_EXCL;
		group = NFNLGRP_CONNTRACK_NEW;
521
	} else  if (events) {
522 523 524
		type = IPCTNL_MSG_CT_NEW;
		group = NFNLGRP_CONNTRACK_UPDATE;
	} else
525
		return 0;
526

527 528
	net = nf_ct_net(ct);
	if (!item->report && !nfnetlink_has_listeners(net, group))
529
		return 0;
530

531 532
	skb = nlmsg_new(ctnetlink_nlmsg_size(ct), GFP_ATOMIC);
	if (skb == NULL)
533
		goto errout;
534 535

	type |= NFNL_SUBSYS_CTNETLINK << 8;
536 537 538
	nlh = nlmsg_put(skb, item->pid, 0, type, sizeof(*nfmsg), flags);
	if (nlh == NULL)
		goto nlmsg_failure;
539

540
	nfmsg = nlmsg_data(nlh);
541
	nfmsg->nfgen_family = nf_ct_l3num(ct);
542 543 544
	nfmsg->version	= NFNETLINK_V0;
	nfmsg->res_id	= 0;

545
	rcu_read_lock();
546 547 548
	nest_parms = nla_nest_start(skb, CTA_TUPLE_ORIG | NLA_F_NESTED);
	if (!nest_parms)
		goto nla_put_failure;
549
	if (ctnetlink_dump_tuples(skb, nf_ct_tuple(ct, IP_CT_DIR_ORIGINAL)) < 0)
550 551
		goto nla_put_failure;
	nla_nest_end(skb, nest_parms);
552

553 554 555
	nest_parms = nla_nest_start(skb, CTA_TUPLE_REPLY | NLA_F_NESTED);
	if (!nest_parms)
		goto nla_put_failure;
556
	if (ctnetlink_dump_tuples(skb, nf_ct_tuple(ct, IP_CT_DIR_REPLY)) < 0)
557 558
		goto nla_put_failure;
	nla_nest_end(skb, nest_parms);
559

560 561 562
	if (nf_ct_zone(ct))
		NLA_PUT_BE16(skb, CTA_ZONE, htons(nf_ct_zone(ct)));

563 564 565
	if (ctnetlink_dump_id(skb, ct) < 0)
		goto nla_put_failure;

566 567 568
	if (ctnetlink_dump_status(skb, ct) < 0)
		goto nla_put_failure;

569
	if (events & (1 << IPCT_DESTROY)) {
570 571
		if (ctnetlink_dump_counters(skb, ct, IP_CT_DIR_ORIGINAL) < 0 ||
		    ctnetlink_dump_counters(skb, ct, IP_CT_DIR_REPLY) < 0)
572
			goto nla_put_failure;
573 574
	} else {
		if (ctnetlink_dump_timeout(skb, ct) < 0)
575
			goto nla_put_failure;
576

577
		if (events & (1 << IPCT_PROTOINFO)
578
		    && ctnetlink_dump_protoinfo(skb, ct) < 0)
579
			goto nla_put_failure;
580

581
		if ((events & (1 << IPCT_HELPER) || nfct_help(ct))
582
		    && ctnetlink_dump_helpinfo(skb, ct) < 0)
583
			goto nla_put_failure;
584

585
#ifdef CONFIG_NF_CONNTRACK_SECMARK
586
		if ((events & (1 << IPCT_SECMARK) || ct->secmark)
587
		    && ctnetlink_dump_secctx(skb, ct) < 0)
588
			goto nla_put_failure;
589
#endif
590

591
		if (events & (1 << IPCT_RELATED) &&
592 593 594
		    ctnetlink_dump_master(skb, ct) < 0)
			goto nla_put_failure;

595
		if (events & (1 << IPCT_NATSEQADJ) &&
596 597
		    ctnetlink_dump_nat_seq_adj(skb, ct) < 0)
			goto nla_put_failure;
598
	}
599

600
#ifdef CONFIG_NF_CONNTRACK_MARK
601
	if ((events & (1 << IPCT_MARK) || ct->mark)
602 603 604
	    && ctnetlink_dump_mark(skb, ct) < 0)
		goto nla_put_failure;
#endif
605
	rcu_read_unlock();
606

607
	nlmsg_end(skb, nlh);
608
	err = nfnetlink_send(skb, net, item->pid, group, item->report,
609
			     GFP_ATOMIC);
610 611 612
	if (err == -ENOBUFS || err == -EAGAIN)
		return -ENOBUFS;

613
	return 0;
614

615
nla_put_failure:
616
	rcu_read_unlock();
617
	nlmsg_cancel(skb, nlh);
618
nlmsg_failure:
619
	kfree_skb(skb);
620
errout:
621 622 623
	if (nfnetlink_set_err(net, 0, group, -ENOBUFS) > 0)
		return -ENOBUFS;

624
	return 0;
625 626 627 628 629
}
#endif /* CONFIG_NF_CONNTRACK_EVENTS */

static int ctnetlink_done(struct netlink_callback *cb)
{
630 631
	if (cb->args[1])
		nf_ct_put((struct nf_conn *)cb->args[1]);
632 633 634 635 636 637
	return 0;
}

static int
ctnetlink_dump_table(struct sk_buff *skb, struct netlink_callback *cb)
{
638
	struct net *net = sock_net(skb->sk);
639
	struct nf_conn *ct, *last;
640
	struct nf_conntrack_tuple_hash *h;
641
	struct hlist_nulls_node *n;
642
	struct nfgenmsg *nfmsg = nlmsg_data(cb->nlh);
643
	u_int8_t l3proto = nfmsg->nfgen_family;
644

645
	rcu_read_lock();
646
	last = (struct nf_conn *)cb->args[1];
647
	for (; cb->args[0] < net->ct.htable_size; cb->args[0]++) {
648
restart:
649
		hlist_nulls_for_each_entry_rcu(h, n, &net->ct.hash[cb->args[0]],
650
					 hnnode) {
651
			if (NF_CT_DIRECTION(h) != IP_CT_DIR_ORIGINAL)
652 653
				continue;
			ct = nf_ct_tuplehash_to_ctrack(h);
654 655
			if (!atomic_inc_not_zero(&ct->ct_general.use))
				continue;
656 657 658
			/* Dump entries of a given L3 protocol number.
			 * If it is not specified, ie. l3proto == 0,
			 * then dump everything. */
659
			if (l3proto && nf_ct_l3num(ct) != l3proto)
660
				goto releasect;
661 662
			if (cb->args[1]) {
				if (ct != last)
663
					goto releasect;
664
				cb->args[1] = 0;
665
			}
666
			if (ctnetlink_fill_info(skb, NETLINK_CB(cb->skb).pid,
667
						cb->nlh->nlmsg_seq,
668
						IPCTNL_MSG_CT_NEW, ct) < 0) {
669
				cb->args[1] = (unsigned long)ct;
670
				goto out;
671
			}
672

673
			if (NFNL_MSG_TYPE(cb->nlh->nlmsg_type) ==
674 675 676 677 678 679 680
						IPCTNL_MSG_CT_GET_CTRZERO) {
				struct nf_conn_counter *acct;

				acct = nf_conn_acct_find(ct);
				if (acct)
					memset(acct, 0, sizeof(struct nf_conn_counter[IP_CT_DIR_MAX]));
			}
681 682
releasect:
		nf_ct_put(ct);
683
		}
684
		if (cb->args[1]) {
685 686
			cb->args[1] = 0;
			goto restart;
687 688
		}
	}
689
out:
690
	rcu_read_unlock();
691 692
	if (last)
		nf_ct_put(last);
693 694 695 696 697

	return skb->len;
}

static inline int
698
ctnetlink_parse_tuple_ip(struct nlattr *attr, struct nf_conntrack_tuple *tuple)
699
{
700
	struct nlattr *tb[CTA_IP_MAX+1];
701 702 703
	struct nf_conntrack_l3proto *l3proto;
	int ret = 0;

704
	nla_parse_nested(tb, CTA_IP_MAX, attr, NULL);
705

706 707
	rcu_read_lock();
	l3proto = __nf_ct_l3proto_find(tuple->src.l3num);
708

709 710 711 712 713 714
	if (likely(l3proto->nlattr_to_tuple)) {
		ret = nla_validate_nested(attr, CTA_IP_MAX,
					  l3proto->nla_policy);
		if (ret == 0)
			ret = l3proto->nlattr_to_tuple(tb, tuple);
	}
715

716
	rcu_read_unlock();
717 718 719 720

	return ret;
}

721 722
static const struct nla_policy proto_nla_policy[CTA_PROTO_MAX+1] = {
	[CTA_PROTO_NUM]	= { .type = NLA_U8 },
723 724 725
};

static inline int
726
ctnetlink_parse_tuple_proto(struct nlattr *attr,
727 728
			    struct nf_conntrack_tuple *tuple)
{
729
	struct nlattr *tb[CTA_PROTO_MAX+1];
730
	struct nf_conntrack_l4proto *l4proto;
731 732
	int ret = 0;

733 734 735
	ret = nla_parse_nested(tb, CTA_PROTO_MAX, attr, proto_nla_policy);
	if (ret < 0)
		return ret;
736

737
	if (!tb[CTA_PROTO_NUM])
738
		return -EINVAL;
739
	tuple->dst.protonum = nla_get_u8(tb[CTA_PROTO_NUM]);
740

741 742
	rcu_read_lock();
	l4proto = __nf_ct_l4proto_find(tuple->src.l3num, tuple->dst.protonum);
743

744 745 746 747 748 749
	if (likely(l4proto->nlattr_to_tuple)) {
		ret = nla_validate_nested(attr, CTA_PROTO_MAX,
					  l4proto->nla_policy);
		if (ret == 0)
			ret = l4proto->nlattr_to_tuple(tb, tuple);
	}
750

751
	rcu_read_unlock();
752

753 754 755
	return ret;
}

756 757 758 759 760
static const struct nla_policy tuple_nla_policy[CTA_TUPLE_MAX+1] = {
	[CTA_TUPLE_IP]		= { .type = NLA_NESTED },
	[CTA_TUPLE_PROTO]	= { .type = NLA_NESTED },
};

761
static int
762 763
ctnetlink_parse_tuple(const struct nlattr * const cda[],
		      struct nf_conntrack_tuple *tuple,
764 765
		      enum ctattr_tuple type, u_int8_t l3num)
{
766
	struct nlattr *tb[CTA_TUPLE_MAX+1];
767 768 769 770
	int err;

	memset(tuple, 0, sizeof(*tuple));

771
	nla_parse_nested(tb, CTA_TUPLE_MAX, cda[type], tuple_nla_policy);
772

773
	if (!tb[CTA_TUPLE_IP])
774 775 776 777
		return -EINVAL;

	tuple->src.l3num = l3num;

778
	err = ctnetlink_parse_tuple_ip(tb[CTA_TUPLE_IP], tuple);
779 780 781
	if (err < 0)
		return err;

782
	if (!tb[CTA_TUPLE_PROTO])
783 784
		return -EINVAL;

785
	err = ctnetlink_parse_tuple_proto(tb[CTA_TUPLE_PROTO], tuple);
786 787 788 789 790 791 792 793 794 795 796 797
	if (err < 0)
		return err;

	/* orig and expect tuples get DIR_ORIGINAL */
	if (type == CTA_TUPLE_REPLY)
		tuple->dst.dir = IP_CT_DIR_REPLY;
	else
		tuple->dst.dir = IP_CT_DIR_ORIGINAL;

	return 0;
}

798 799 800 801 802 803 804 805 806 807 808 809 810 811 812
static int
ctnetlink_parse_zone(const struct nlattr *attr, u16 *zone)
{
	if (attr)
#ifdef CONFIG_NF_CONNTRACK_ZONES
		*zone = ntohs(nla_get_be16(attr));
#else
		return -EOPNOTSUPP;
#endif
	else
		*zone = 0;

	return 0;
}

813 814 815 816
static const struct nla_policy help_nla_policy[CTA_HELP_MAX+1] = {
	[CTA_HELP_NAME]		= { .type = NLA_NUL_STRING },
};

817
static inline int
818
ctnetlink_parse_help(const struct nlattr *attr, char **helper_name)
819
{
820
	struct nlattr *tb[CTA_HELP_MAX+1];
821

822
	nla_parse_nested(tb, CTA_HELP_MAX, attr, help_nla_policy);
823

824
	if (!tb[CTA_HELP_NAME])
825 826
		return -EINVAL;

827
	*helper_name = nla_data(tb[CTA_HELP_NAME]);
828 829 830 831

	return 0;
}

832
static const struct nla_policy ct_nla_policy[CTA_MAX+1] = {
833 834
	[CTA_TUPLE_ORIG]	= { .type = NLA_NESTED },
	[CTA_TUPLE_REPLY]	= { .type = NLA_NESTED },
835
	[CTA_STATUS] 		= { .type = NLA_U32 },
836 837 838
	[CTA_PROTOINFO]		= { .type = NLA_NESTED },
	[CTA_HELP]		= { .type = NLA_NESTED },
	[CTA_NAT_SRC]		= { .type = NLA_NESTED },
839 840 841
	[CTA_TIMEOUT] 		= { .type = NLA_U32 },
	[CTA_MARK]		= { .type = NLA_U32 },
	[CTA_ID]		= { .type = NLA_U32 },
842 843
	[CTA_NAT_DST]		= { .type = NLA_NESTED },
	[CTA_TUPLE_MASTER]	= { .type = NLA_NESTED },
844
	[CTA_ZONE]		= { .type = NLA_U16 },
845 846 847
};

static int
848
ctnetlink_del_conntrack(struct sock *ctnl, struct sk_buff *skb,
849 850
			const struct nlmsghdr *nlh,
			const struct nlattr * const cda[])
851
{
852
	struct net *net = sock_net(ctnl);
853 854 855
	struct nf_conntrack_tuple_hash *h;
	struct nf_conntrack_tuple tuple;
	struct nf_conn *ct;
856
	struct nfgenmsg *nfmsg = nlmsg_data(nlh);
857
	u_int8_t u3 = nfmsg->nfgen_family;
858 859 860 861 862 863
	u16 zone;
	int err;

	err = ctnetlink_parse_zone(cda[CTA_ZONE], &zone);
	if (err < 0)
		return err;
864

865
	if (cda[CTA_TUPLE_ORIG])
866
		err = ctnetlink_parse_tuple(cda, &tuple, CTA_TUPLE_ORIG, u3);
867
	else if (cda[CTA_TUPLE_REPLY])
868 869 870
		err = ctnetlink_parse_tuple(cda, &tuple, CTA_TUPLE_REPLY, u3);
	else {
		/* Flush the whole table */
871
		nf_conntrack_flush_report(net,
872 873
					 NETLINK_CB(skb).pid,
					 nlmsg_report(nlh));
874 875 876 877 878 879
		return 0;
	}

	if (err < 0)
		return err;

880
	h = nf_conntrack_find_get(net, zone, &tuple);
881
	if (!h)
882 883 884
		return -ENOENT;

	ct = nf_ct_tuplehash_to_ctrack(h);
885

886
	if (cda[CTA_ID]) {
887
		u_int32_t id = ntohl(nla_get_be32(cda[CTA_ID]));
888
		if (id != (u32)(unsigned long)ct) {
889 890 891
			nf_ct_put(ct);
			return -ENOENT;
		}
892
	}
893

894 895 896 897 898 899 900 901 902
	if (nf_conntrack_event_report(IPCT_DESTROY, ct,
				      NETLINK_CB(skb).pid,
				      nlmsg_report(nlh)) < 0) {
		nf_ct_delete_from_lists(ct);
		/* we failed to report the event, try later */
		nf_ct_insert_dying_list(ct);
		nf_ct_put(ct);
		return 0;
	}
903 904 905 906

	/* death_by_timeout would report the event again */
	set_bit(IPS_DYING_BIT, &ct->status);

907
	nf_ct_kill(ct);
908 909 910 911 912 913
	nf_ct_put(ct);

	return 0;
}

static int
914
ctnetlink_get_conntrack(struct sock *ctnl, struct sk_buff *skb,
915 916
			const struct nlmsghdr *nlh,
			const struct nlattr * const cda[])
917
{
918
	struct net *net = sock_net(ctnl);
919 920 921 922
	struct nf_conntrack_tuple_hash *h;
	struct nf_conntrack_tuple tuple;
	struct nf_conn *ct;
	struct sk_buff *skb2 = NULL;
923
	struct nfgenmsg *nfmsg = nlmsg_data(nlh);
924
	u_int8_t u3 = nfmsg->nfgen_family;
925 926
	u16 zone;
	int err;
927

928
	if (nlh->nlmsg_flags & NLM_F_DUMP)
929 930
		return netlink_dump_start(ctnl, skb, nlh, ctnetlink_dump_table,
					  ctnetlink_done);
931

932 933 934 935
	err = ctnetlink_parse_zone(cda[CTA_ZONE], &zone);
	if (err < 0)
		return err;

936
	if (cda[CTA_TUPLE_ORIG])
937
		err = ctnetlink_parse_tuple(cda, &tuple, CTA_TUPLE_ORIG, u3);
938
	else if (cda[CTA_TUPLE_REPLY])
939 940 941 942 943 944 945
		err = ctnetlink_parse_tuple(cda, &tuple, CTA_TUPLE_REPLY, u3);
	else
		return -EINVAL;

	if (err < 0)
		return err;

946
	h = nf_conntrack_find_get(net, zone, &tuple);
947
	if (!h)
948
		return -ENOENT;
949

950 951 952
	ct = nf_ct_tuplehash_to_ctrack(h);

	err = -ENOMEM;
953 954
	skb2 = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
	if (skb2 == NULL) {
955 956 957 958
		nf_ct_put(ct);
		return -ENOMEM;
	}

959
	rcu_read_lock();
960
	err = ctnetlink_fill_info(skb2, NETLINK_CB(skb).pid, nlh->nlmsg_seq,
961
				  IPCTNL_MSG_CT_NEW, ct);
962
	rcu_read_unlock();
963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978
	nf_ct_put(ct);
	if (err <= 0)
		goto free;

	err = netlink_unicast(ctnl, skb2, NETLINK_CB(skb).pid, MSG_DONTWAIT);
	if (err < 0)
		goto out;

	return 0;

free:
	kfree_skb(skb2);
out:
	return err;
}

979
#ifdef CONFIG_NF_NAT_NEEDED
980 981 982
static int
ctnetlink_parse_nat_setup(struct nf_conn *ct,
			  enum nf_nat_manip_type manip,
983
			  const struct nlattr *attr)
984 985 986 987 988
{
	typeof(nfnetlink_parse_nat_setup_hook) parse_nat_setup;

	parse_nat_setup = rcu_dereference(nfnetlink_parse_nat_setup_hook);
	if (!parse_nat_setup) {
989
#ifdef CONFIG_MODULES
990
		rcu_read_unlock();
991
		spin_unlock_bh(&nf_conntrack_lock);
992 993 994
		nfnl_unlock();
		if (request_module("nf-nat-ipv4") < 0) {
			nfnl_lock();
995
			spin_lock_bh(&nf_conntrack_lock);
996 997 998 999
			rcu_read_lock();
			return -EOPNOTSUPP;
		}
		nfnl_lock();
1000
		spin_lock_bh(&nf_conntrack_lock);
1001 1002 1003 1004 1005 1006 1007 1008 1009
		rcu_read_lock();
		if (nfnetlink_parse_nat_setup_hook)
			return -EAGAIN;
#endif
		return -EOPNOTSUPP;
	}

	return parse_nat_setup(ct, manip, attr);
}
1010
#endif
1011

1012
static int
1013
ctnetlink_change_status(struct nf_conn *ct, const struct nlattr * const cda[])
1014 1015
{
	unsigned long d;
1016
	unsigned int status = ntohl(nla_get_be32(cda[CTA_STATUS]));
1017 1018 1019 1020
	d = ct->status ^ status;

	if (d & (IPS_EXPECTED|IPS_CONFIRMED|IPS_DYING))
		/* unchangeable */
1021
		return -EBUSY;
1022

1023 1024
	if (d & IPS_SEEN_REPLY && !(status & IPS_SEEN_REPLY))
		/* SEEN_REPLY bit can only be set */
1025
		return -EBUSY;
1026

1027 1028
	if (d & IPS_ASSURED && !(status & IPS_ASSURED))
		/* ASSURED bit can only be set */
1029
		return -EBUSY;
1030 1031 1032

	/* Be careful here, modifying NAT bits can screw up things,
	 * so don't let users modify them directly if they don't pass
1033
	 * nf_nat_range. */
1034 1035 1036 1037
	ct->status |= status & ~(IPS_NAT_DONE_MASK | IPS_NAT_MASK);
	return 0;
}

1038
static int
1039
ctnetlink_change_nat(struct nf_conn *ct, const struct nlattr * const cda[])
1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062
{
#ifdef CONFIG_NF_NAT_NEEDED
	int ret;

	if (cda[CTA_NAT_DST]) {
		ret = ctnetlink_parse_nat_setup(ct,
						IP_NAT_MANIP_DST,
						cda[CTA_NAT_DST]);
		if (ret < 0)
			return ret;
	}
	if (cda[CTA_NAT_SRC]) {
		ret = ctnetlink_parse_nat_setup(ct,
						IP_NAT_MANIP_SRC,
						cda[CTA_NAT_SRC]);
		if (ret < 0)
			return ret;
	}
	return 0;
#else
	return -EOPNOTSUPP;
#endif
}
1063 1064

static inline int
1065
ctnetlink_change_helper(struct nf_conn *ct, const struct nlattr * const cda[])
1066 1067
{
	struct nf_conntrack_helper *helper;
1068
	struct nf_conn_help *help = nfct_help(ct);
1069
	char *helpname = NULL;
1070 1071 1072 1073
	int err;

	/* don't change helper of sibling connections */
	if (ct->master)
1074
		return -EBUSY;
1075

1076
	err = ctnetlink_parse_help(cda[CTA_HELP], &helpname);
1077 1078 1079
	if (err < 0)
		return err;

1080 1081
	if (!strcmp(helpname, "")) {
		if (help && help->helper) {
1082 1083
			/* we had a helper before ... */
			nf_ct_remove_expectations(ct);
1084
			rcu_assign_pointer(help->helper, NULL);
1085
		}
1086 1087

		return 0;
1088
	}
1089

1090 1091
	helper = __nf_conntrack_helper_find(helpname, nf_ct_l3num(ct),
					    nf_ct_protonum(ct));
1092 1093 1094 1095 1096 1097 1098 1099 1100 1101
	if (helper == NULL) {
#ifdef CONFIG_MODULES
		spin_unlock_bh(&nf_conntrack_lock);

		if (request_module("nfct-helper-%s", helpname) < 0) {
			spin_lock_bh(&nf_conntrack_lock);
			return -EOPNOTSUPP;
		}

		spin_lock_bh(&nf_conntrack_lock);
1102 1103
		helper = __nf_conntrack_helper_find(helpname, nf_ct_l3num(ct),
						    nf_ct_protonum(ct));
1104 1105 1106
		if (helper)
			return -EAGAIN;
#endif
1107
		return -EOPNOTSUPP;
1108
	}
1109

1110 1111 1112 1113 1114 1115 1116 1117
	if (help) {
		if (help->helper == helper)
			return 0;
		if (help->helper)
			return -EBUSY;
		/* need to zero data of old helper */
		memset(&help->help, 0, sizeof(help->help));
	} else {
1118 1119
		/* we cannot set a helper for an existing conntrack */
		return -EOPNOTSUPP;
1120
	}
1121

1122
	rcu_assign_pointer(help->helper, helper);
1123 1124 1125 1126 1127

	return 0;
}

static inline int
1128
ctnetlink_change_timeout(struct nf_conn *ct, const struct nlattr * const cda[])
1129
{
1130
	u_int32_t timeout = ntohl(nla_get_be32(cda[CTA_TIMEOUT]));
1131

1132 1133 1134 1135 1136 1137 1138 1139 1140
	if (!del_timer(&ct->timeout))
		return -ETIME;

	ct->timeout.expires = jiffies + timeout * HZ;
	add_timer(&ct->timeout);

	return 0;
}

1141 1142 1143 1144 1145 1146
static const struct nla_policy protoinfo_policy[CTA_PROTOINFO_MAX+1] = {
	[CTA_PROTOINFO_TCP]	= { .type = NLA_NESTED },
	[CTA_PROTOINFO_DCCP]	= { .type = NLA_NESTED },
	[CTA_PROTOINFO_SCTP]	= { .type = NLA_NESTED },
};

1147
static inline int
1148
ctnetlink_change_protoinfo(struct nf_conn *ct, const struct nlattr * const cda[])
1149
{
1150 1151
	const struct nlattr *attr = cda[CTA_PROTOINFO];
	struct nlattr *tb[CTA_PROTOINFO_MAX+1];
1152
	struct nf_conntrack_l4proto *l4proto;
1153 1154
	int err = 0;

1155
	nla_parse_nested(tb, CTA_PROTOINFO_MAX, attr, protoinfo_policy);
1156

1157 1158
	rcu_read_lock();
	l4proto = __nf_ct_l4proto_find(nf_ct_l3num(ct), nf_ct_protonum(ct));
1159 1160
	if (l4proto->from_nlattr)
		err = l4proto->from_nlattr(tb, ct);
1161
	rcu_read_unlock();
1162 1163 1164 1165

	return err;
}

1166
#ifdef CONFIG_NF_NAT_NEEDED
1167 1168 1169 1170 1171 1172
static const struct nla_policy nat_seq_policy[CTA_NAT_SEQ_MAX+1] = {
	[CTA_NAT_SEQ_CORRECTION_POS]	= { .type = NLA_U32 },
	[CTA_NAT_SEQ_OFFSET_BEFORE]	= { .type = NLA_U32 },
	[CTA_NAT_SEQ_OFFSET_AFTER]	= { .type = NLA_U32 },
};

1173
static inline int
1174
change_nat_seq_adj(struct nf_nat_seq *natseq, const struct nlattr * const attr)
1175 1176 1177
{
	struct nlattr *cda[CTA_NAT_SEQ_MAX+1];

1178
	nla_parse_nested(cda, CTA_NAT_SEQ_MAX, attr, nat_seq_policy);
1179 1180 1181 1182 1183

	if (!cda[CTA_NAT_SEQ_CORRECTION_POS])
		return -EINVAL;

	natseq->correction_pos =
1184
		ntohl(nla_get_be32(cda[CTA_NAT_SEQ_CORRECTION_POS]));
1185 1186 1187 1188 1189

	if (!cda[CTA_NAT_SEQ_OFFSET_BEFORE])
		return -EINVAL;

	natseq->offset_before =
1190
		ntohl(nla_get_be32(cda[CTA_NAT_SEQ_OFFSET_BEFORE]));
1191 1192 1193 1194 1195

	if (!cda[CTA_NAT_SEQ_OFFSET_AFTER])
		return -EINVAL;

	natseq->offset_after =
1196
		ntohl(nla_get_be32(cda[CTA_NAT_SEQ_OFFSET_AFTER]));
1197 1198 1199 1200 1201

	return 0;
}

static int
1202 1203
ctnetlink_change_nat_seq_adj(struct nf_conn *ct,
			     const struct nlattr * const cda[])
1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232
{
	int ret = 0;
	struct nf_conn_nat *nat = nfct_nat(ct);

	if (!nat)
		return 0;

	if (cda[CTA_NAT_SEQ_ADJ_ORIG]) {
		ret = change_nat_seq_adj(&nat->seq[IP_CT_DIR_ORIGINAL],
					 cda[CTA_NAT_SEQ_ADJ_ORIG]);
		if (ret < 0)
			return ret;

		ct->status |= IPS_SEQ_ADJUST;
	}

	if (cda[CTA_NAT_SEQ_ADJ_REPLY]) {
		ret = change_nat_seq_adj(&nat->seq[IP_CT_DIR_REPLY],
					 cda[CTA_NAT_SEQ_ADJ_REPLY]);
		if (ret < 0)
			return ret;

		ct->status |= IPS_SEQ_ADJUST;
	}

	return 0;
}
#endif

1233
static int
1234 1235
ctnetlink_change_conntrack(struct nf_conn *ct,
			   const struct nlattr * const cda[])
1236 1237 1238
{
	int err;

1239 1240 1241 1242
	/* only allow NAT changes and master assignation for new conntracks */
	if (cda[CTA_NAT_SRC] || cda[CTA_NAT_DST] || cda[CTA_TUPLE_MASTER])
		return -EOPNOTSUPP;

1243
	if (cda[CTA_HELP]) {
1244 1245 1246 1247 1248
		err = ctnetlink_change_helper(ct, cda);
		if (err < 0)
			return err;
	}

1249
	if (cda[CTA_TIMEOUT]) {
1250 1251 1252 1253 1254
		err = ctnetlink_change_timeout(ct, cda);
		if (err < 0)
			return err;
	}

1255
	if (cda[CTA_STATUS]) {
1256 1257 1258 1259 1260
		err = ctnetlink_change_status(ct, cda);
		if (err < 0)
			return err;
	}

1261
	if (cda[CTA_PROTOINFO]) {
1262 1263 1264 1265 1266
		err = ctnetlink_change_protoinfo(ct, cda);
		if (err < 0)
			return err;
	}

1267
#if defined(CONFIG_NF_CONNTRACK_MARK)
1268
	if (cda[CTA_MARK])
1269
		ct->mark = ntohl(nla_get_be32(cda[CTA_MARK]));
1270 1271
#endif

1272 1273 1274 1275 1276 1277 1278 1279
#ifdef CONFIG_NF_NAT_NEEDED
	if (cda[CTA_NAT_SEQ_ADJ_ORIG] || cda[CTA_NAT_SEQ_ADJ_REPLY]) {
		err = ctnetlink_change_nat_seq_adj(ct, cda);
		if (err < 0)
			return err;
	}
#endif

1280 1281 1282
	return 0;
}

1283
static struct nf_conn *
1284
ctnetlink_create_conntrack(struct net *net, u16 zone,
1285
			   const struct nlattr * const cda[],
1286
			   struct nf_conntrack_tuple *otuple,
1287
			   struct nf_conntrack_tuple *rtuple,
1288
			   u8 u3)
1289 1290 1291
{
	struct nf_conn *ct;
	int err = -EINVAL;
1292
	struct nf_conntrack_helper *helper;
1293

1294
	ct = nf_conntrack_alloc(net, zone, otuple, rtuple, GFP_ATOMIC);
1295
	if (IS_ERR(ct))
1296
		return ERR_PTR(-ENOMEM);
1297

1298
	if (!cda[CTA_TIMEOUT])
1299
		goto err1;
1300
	ct->timeout.expires = ntohl(nla_get_be32(cda[CTA_TIMEOUT]));
1301 1302 1303

	ct->timeout.expires = jiffies + ct->timeout.expires * HZ;

1304
	rcu_read_lock();
1305
 	if (cda[CTA_HELP]) {
1306
		char *helpname = NULL;
1307 1308
 
 		err = ctnetlink_parse_help(cda[CTA_HELP], &helpname);
1309 1310
 		if (err < 0)
			goto err2;
1311

1312 1313
		helper = __nf_conntrack_helper_find(helpname, nf_ct_l3num(ct),
						    nf_ct_protonum(ct));
1314 1315 1316 1317 1318
		if (helper == NULL) {
			rcu_read_unlock();
#ifdef CONFIG_MODULES
			if (request_module("nfct-helper-%s", helpname) < 0) {
				err = -EOPNOTSUPP;
1319
				goto err1;
1320 1321 1322
			}

			rcu_read_lock();
1323 1324 1325
			helper = __nf_conntrack_helper_find(helpname,
							    nf_ct_l3num(ct),
							    nf_ct_protonum(ct));
1326 1327
			if (helper) {
				err = -EAGAIN;
1328
				goto err2;
1329 1330 1331 1332
			}
			rcu_read_unlock();
#endif
			err = -EOPNOTSUPP;
1333
			goto err1;
1334 1335 1336 1337 1338 1339
		} else {
			struct nf_conn_help *help;

			help = nf_ct_helper_ext_add(ct, GFP_ATOMIC);
			if (help == NULL) {
				err = -ENOMEM;
1340
				goto err2;
1341 1342 1343 1344 1345 1346 1347
			}

			/* not in hash table yet so not strictly necessary */
			rcu_assign_pointer(help->helper, helper);
		}
	} else {
		/* try an implicit helper assignation */
1348
		err = __nf_ct_try_assign_helper(ct, NULL, GFP_ATOMIC);
1349 1350
		if (err < 0)
			goto err2;
1351 1352
	}

1353 1354
	if (cda[CTA_NAT_SRC] || cda[CTA_NAT_DST]) {
		err = ctnetlink_change_nat(ct, cda);
1355 1356
		if (err < 0)
			goto err2;
1357 1358
	}

1359 1360 1361 1362 1363 1364 1365
	nf_ct_acct_ext_add(ct, GFP_ATOMIC);
	nf_ct_ecache_ext_add(ct, 0, 0, GFP_ATOMIC);
	/* we must add conntrack extensions before confirmation. */
	ct->status |= IPS_CONFIRMED;

	if (cda[CTA_STATUS]) {
		err = ctnetlink_change_status(ct, cda);
1366 1367
		if (err < 0)
			goto err2;
1368
	}
1369

1370 1371 1372
#ifdef CONFIG_NF_NAT_NEEDED
	if (cda[CTA_NAT_SEQ_ADJ_ORIG] || cda[CTA_NAT_SEQ_ADJ_REPLY]) {
		err = ctnetlink_change_nat_seq_adj(ct, cda);
1373 1374
		if (err < 0)
			goto err2;
1375 1376 1377
	}
#endif

1378
	if (cda[CTA_PROTOINFO]) {
1379
		err = ctnetlink_change_protoinfo(ct, cda);
1380 1381
		if (err < 0)
			goto err2;
1382 1383
	}

1384
#if defined(CONFIG_NF_CONNTRACK_MARK)
1385
	if (cda[CTA_MARK])
1386
		ct->mark = ntohl(nla_get_be32(cda[CTA_MARK]));
1387 1388
#endif

1389
	/* setup master conntrack: this is a confirmed expectation */
1390 1391 1392 1393 1394 1395 1396
	if (cda[CTA_TUPLE_MASTER]) {
		struct nf_conntrack_tuple master;
		struct nf_conntrack_tuple_hash *master_h;
		struct nf_conn *master_ct;

		err = ctnetlink_parse_tuple(cda, &master, CTA_TUPLE_MASTER, u3);
		if (err < 0)
1397
			goto err2;
1398

1399
		master_h = nf_conntrack_find_get(net, zone, &master);
1400 1401
		if (master_h == NULL) {
			err = -ENOENT;
1402
			goto err2;
1403 1404
		}
		master_ct = nf_ct_tuplehash_to_ctrack(master_h);
1405
		__set_bit(IPS_EXPECTED_BIT, &ct->status);
1406
		ct->master = master_ct;
1407
	}
1408

1409 1410
	add_timer(&ct->timeout);
	nf_conntrack_hash_insert(ct);
1411
	rcu_read_unlock();
1412

1413
	return ct;
1414

1415 1416 1417
err2:
	rcu_read_unlock();
err1:
1418
	nf_conntrack_free(ct);
1419
	return ERR_PTR(err);
1420 1421
}

1422 1423
static int
ctnetlink_new_conntrack(struct sock *ctnl, struct sk_buff *skb,
1424 1425
			const struct nlmsghdr *nlh,
			const struct nlattr * const cda[])
1426
{
1427
	struct net *net = sock_net(ctnl);
1428 1429
	struct nf_conntrack_tuple otuple, rtuple;
	struct nf_conntrack_tuple_hash *h = NULL;
1430
	struct nfgenmsg *nfmsg = nlmsg_data(nlh);
1431
	u_int8_t u3 = nfmsg->nfgen_family;
1432 1433 1434 1435 1436 1437
	u16 zone;
	int err;

	err = ctnetlink_parse_zone(cda[CTA_ZONE], &zone);
	if (err < 0)
		return err;
1438

1439
	if (cda[CTA_TUPLE_ORIG]) {
1440 1441 1442 1443 1444
		err = ctnetlink_parse_tuple(cda, &otuple, CTA_TUPLE_ORIG, u3);
		if (err < 0)
			return err;
	}

1445
	if (cda[CTA_TUPLE_REPLY]) {
1446 1447 1448 1449 1450
		err = ctnetlink_parse_tuple(cda, &rtuple, CTA_TUPLE_REPLY, u3);
		if (err < 0)
			return err;
	}

1451
	spin_lock_bh(&nf_conntrack_lock);
1452
	if (cda[CTA_TUPLE_ORIG])
1453
		h = __nf_conntrack_find(net, zone, &otuple);
1454
	else if (cda[CTA_TUPLE_REPLY])
1455
		h = __nf_conntrack_find(net, zone, &rtuple);
1456 1457 1458

	if (h == NULL) {
		err = -ENOENT;
1459 1460
		if (nlh->nlmsg_flags & NLM_F_CREATE) {
			struct nf_conn *ct;
1461
			enum ip_conntrack_events events;
1462

1463
			ct = ctnetlink_create_conntrack(net, zone, cda, &otuple,
1464 1465 1466
							&rtuple, u3);
			if (IS_ERR(ct)) {
				err = PTR_ERR(ct);
1467 1468
				goto out_unlock;
			}
1469 1470 1471
			err = 0;
			nf_conntrack_get(&ct->ct_general);
			spin_unlock_bh(&nf_conntrack_lock);
1472 1473 1474 1475 1476
			if (test_bit(IPS_EXPECTED_BIT, &ct->status))
				events = IPCT_RELATED;
			else
				events = IPCT_NEW;

1477 1478
			nf_conntrack_eventmask_report((1 << IPCT_REPLY) |
						      (1 << IPCT_ASSURED) |
1479 1480 1481 1482 1483 1484
						      (1 << IPCT_HELPER) |
						      (1 << IPCT_PROTOINFO) |
						      (1 << IPCT_NATSEQADJ) |
						      (1 << IPCT_MARK) | events,
						      ct, NETLINK_CB(skb).pid,
						      nlmsg_report(nlh));
1485 1486 1487
			nf_ct_put(ct);
		} else
			spin_unlock_bh(&nf_conntrack_lock);
1488

1489 1490 1491 1492 1493 1494 1495
		return err;
	}
	/* implicit 'else' */

	/* We manipulate the conntrack inside the global conntrack table lock,
	 * so there's no need to increase the refcount */
	err = -EEXIST;
1496
	if (!(nlh->nlmsg_flags & NLM_F_EXCL)) {
1497 1498 1499 1500 1501 1502
		struct nf_conn *ct = nf_ct_tuplehash_to_ctrack(h);

		err = ctnetlink_change_conntrack(ct, cda);
		if (err == 0) {
			nf_conntrack_get(&ct->ct_general);
			spin_unlock_bh(&nf_conntrack_lock);
1503 1504
			nf_conntrack_eventmask_report((1 << IPCT_REPLY) |
						      (1 << IPCT_ASSURED) |
1505 1506 1507 1508 1509 1510
						      (1 << IPCT_HELPER) |
						      (1 << IPCT_PROTOINFO) |
						      (1 << IPCT_NATSEQADJ) |
						      (1 << IPCT_MARK),
						      ct, NETLINK_CB(skb).pid,
						      nlmsg_report(nlh));
1511 1512 1513 1514 1515
			nf_ct_put(ct);
		} else
			spin_unlock_bh(&nf_conntrack_lock);

		return err;
1516
	}
1517 1518

out_unlock:
1519
	spin_unlock_bh(&nf_conntrack_lock);
1520 1521 1522
	return err;
}

1523 1524 1525
/***********************************************************************
 * EXPECT
 ***********************************************************************/
1526 1527 1528 1529 1530 1531

static inline int
ctnetlink_exp_dump_tuple(struct sk_buff *skb,
			 const struct nf_conntrack_tuple *tuple,
			 enum ctattr_expect type)
{
1532
	struct nlattr *nest_parms;
1533

1534 1535 1536
	nest_parms = nla_nest_start(skb, type | NLA_F_NESTED);
	if (!nest_parms)
		goto nla_put_failure;
1537
	if (ctnetlink_dump_tuples(skb, tuple) < 0)
1538 1539
		goto nla_put_failure;
	nla_nest_end(skb, nest_parms);
1540 1541 1542

	return 0;

1543
nla_put_failure:
1544
	return -1;
1545
}
1546

1547 1548 1549
static inline int
ctnetlink_exp_dump_mask(struct sk_buff *skb,
			const struct nf_conntrack_tuple *tuple,
1550
			const struct nf_conntrack_tuple_mask *mask)
1551 1552 1553
{
	int ret;
	struct nf_conntrack_l3proto *l3proto;
1554
	struct nf_conntrack_l4proto *l4proto;
1555
	struct nf_conntrack_tuple m;
1556
	struct nlattr *nest_parms;
1557 1558 1559

	memset(&m, 0xFF, sizeof(m));
	memcpy(&m.src.u3, &mask->src.u3, sizeof(m.src.u3));
1560 1561
	m.src.u.all = mask->src.u.all;
	m.dst.protonum = tuple->dst.protonum;
1562

1563 1564 1565
	nest_parms = nla_nest_start(skb, CTA_EXPECT_MASK | NLA_F_NESTED);
	if (!nest_parms)
		goto nla_put_failure;
1566

1567
	l3proto = __nf_ct_l3proto_find(tuple->src.l3num);
1568
	ret = ctnetlink_dump_tuples_ip(skb, &m, l3proto);
1569 1570

	if (unlikely(ret < 0))
1571
		goto nla_put_failure;
1572

1573
	l4proto = __nf_ct_l4proto_find(tuple->src.l3num, tuple->dst.protonum);
1574
	ret = ctnetlink_dump_tuples_proto(skb, &m, l4proto);
1575
	if (unlikely(ret < 0))
1576
		goto nla_put_failure;
1577

1578
	nla_nest_end(skb, nest_parms);
1579 1580 1581

	return 0;

1582
nla_put_failure:
1583 1584 1585
	return -1;
}

1586
static int
1587
ctnetlink_exp_dump_expect(struct sk_buff *skb,
1588
			  const struct nf_conntrack_expect *exp)
1589 1590
{
	struct nf_conn *master = exp->master;
1591
	struct nf_conntrack_helper *helper;
1592 1593 1594 1595
	long timeout = (exp->timeout.expires - jiffies) / HZ;

	if (timeout < 0)
		timeout = 0;
1596 1597

	if (ctnetlink_exp_dump_tuple(skb, &exp->tuple, CTA_EXPECT_TUPLE) < 0)
1598
		goto nla_put_failure;
1599
	if (ctnetlink_exp_dump_mask(skb, &exp->tuple, &exp->mask) < 0)
1600
		goto nla_put_failure;
1601 1602 1603
	if (ctnetlink_exp_dump_tuple(skb,
				 &master->tuplehash[IP_CT_DIR_ORIGINAL].tuple,
				 CTA_EXPECT_MASTER) < 0)
1604
		goto nla_put_failure;
1605

1606
	NLA_PUT_BE32(skb, CTA_EXPECT_TIMEOUT, htonl(timeout));
1607
	NLA_PUT_BE32(skb, CTA_EXPECT_ID, htonl((unsigned long)exp));
1608 1609 1610
	helper = rcu_dereference(nfct_help(master)->helper);
	if (helper)
		NLA_PUT_STRING(skb, CTA_EXPECT_HELP_NAME, helper->name);
1611 1612

	return 0;
1613

1614
nla_put_failure:
1615 1616 1617 1618 1619
	return -1;
}

static int
ctnetlink_exp_fill_info(struct sk_buff *skb, u32 pid, u32 seq,
1620
			int event, const struct nf_conntrack_expect *exp)
1621 1622 1623
{
	struct nlmsghdr *nlh;
	struct nfgenmsg *nfmsg;
1624
	unsigned int flags = pid ? NLM_F_MULTI : 0;
1625 1626

	event |= NFNL_SUBSYS_CTNETLINK_EXP << 8;
1627 1628 1629
	nlh = nlmsg_put(skb, pid, seq, event, sizeof(*nfmsg), flags);
	if (nlh == NULL)
		goto nlmsg_failure;
1630

1631
	nfmsg = nlmsg_data(nlh);
1632 1633 1634 1635 1636
	nfmsg->nfgen_family = exp->tuple.src.l3num;
	nfmsg->version	    = NFNETLINK_V0;
	nfmsg->res_id	    = 0;

	if (ctnetlink_exp_dump_expect(skb, exp) < 0)
1637
		goto nla_put_failure;
1638

1639
	nlmsg_end(skb, nlh);
1640 1641 1642
	return skb->len;

nlmsg_failure:
1643
nla_put_failure:
1644
	nlmsg_cancel(skb, nlh);
1645 1646 1647 1648
	return -1;
}

#ifdef CONFIG_NF_CONNTRACK_EVENTS
1649 1650
static int
ctnetlink_expect_event(unsigned int events, struct nf_exp_event *item)
1651
{
1652 1653
	struct nf_conntrack_expect *exp = item->exp;
	struct net *net = nf_ct_exp_net(exp);
1654 1655 1656 1657 1658 1659
	struct nlmsghdr *nlh;
	struct nfgenmsg *nfmsg;
	struct sk_buff *skb;
	unsigned int type;
	int flags = 0;

1660
	if (events & (1 << IPEXP_NEW)) {
1661 1662 1663
		type = IPCTNL_MSG_EXP_NEW;
		flags = NLM_F_CREATE|NLM_F_EXCL;
	} else
1664
		return 0;
1665

1666
	if (!item->report &&
1667
	    !nfnetlink_has_listeners(net, NFNLGRP_CONNTRACK_EXP_NEW))
1668
		return 0;
1669

1670 1671
	skb = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_ATOMIC);
	if (skb == NULL)
1672
		goto errout;
1673

1674
	type |= NFNL_SUBSYS_CTNETLINK_EXP << 8;
1675 1676 1677
	nlh = nlmsg_put(skb, item->pid, 0, type, sizeof(*nfmsg), flags);
	if (nlh == NULL)
		goto nlmsg_failure;
1678

1679
	nfmsg = nlmsg_data(nlh);
1680 1681 1682 1683
	nfmsg->nfgen_family = exp->tuple.src.l3num;
	nfmsg->version	    = NFNETLINK_V0;
	nfmsg->res_id	    = 0;

1684
	rcu_read_lock();
1685
	if (ctnetlink_exp_dump_expect(skb, exp) < 0)
1686
		goto nla_put_failure;
1687
	rcu_read_unlock();
1688

1689
	nlmsg_end(skb, nlh);
1690
	nfnetlink_send(skb, net, item->pid, NFNLGRP_CONNTRACK_EXP_NEW,
1691 1692
		       item->report, GFP_ATOMIC);
	return 0;
1693

1694
nla_put_failure:
1695
	rcu_read_unlock();
1696
	nlmsg_cancel(skb, nlh);
1697
nlmsg_failure:
1698
	kfree_skb(skb);
1699
errout:
1700
	nfnetlink_set_err(net, 0, 0, -ENOBUFS);
1701
	return 0;
1702 1703
}
#endif
1704 1705
static int ctnetlink_exp_done(struct netlink_callback *cb)
{
1706 1707
	if (cb->args[1])
		nf_ct_expect_put((struct nf_conntrack_expect *)cb->args[1]);
1708 1709
	return 0;
}
1710 1711 1712 1713

static int
ctnetlink_exp_dump_table(struct sk_buff *skb, struct netlink_callback *cb)
{
1714
	struct net *net = sock_net(skb->sk);
1715
	struct nf_conntrack_expect *exp, *last;
1716
	struct nfgenmsg *nfmsg = nlmsg_data(cb->nlh);
1717
	struct hlist_node *n;
1718
	u_int8_t l3proto = nfmsg->nfgen_family;
1719

1720
	rcu_read_lock();
1721 1722
	last = (struct nf_conntrack_expect *)cb->args[1];
	for (; cb->args[0] < nf_ct_expect_hsize; cb->args[0]++) {
1723
restart:
1724
		hlist_for_each_entry(exp, n, &net->ct.expect_hash[cb->args[0]],
1725 1726
				     hnode) {
			if (l3proto && exp->tuple.src.l3num != l3proto)
1727
				continue;
1728 1729 1730 1731 1732
			if (cb->args[1]) {
				if (exp != last)
					continue;
				cb->args[1] = 0;
			}
1733 1734
			if (ctnetlink_exp_fill_info(skb,
						    NETLINK_CB(cb->skb).pid,
1735 1736
						    cb->nlh->nlmsg_seq,
						    IPCTNL_MSG_EXP_NEW,
1737
						    exp) < 0) {
1738 1739
				if (!atomic_inc_not_zero(&exp->use))
					continue;
1740 1741 1742
				cb->args[1] = (unsigned long)exp;
				goto out;
			}
1743
		}
1744 1745 1746
		if (cb->args[1]) {
			cb->args[1] = 0;
			goto restart;
1747 1748
		}
	}
1749
out:
1750
	rcu_read_unlock();
1751 1752
	if (last)
		nf_ct_expect_put(last);
1753 1754 1755 1756

	return skb->len;
}

1757
static const struct nla_policy exp_nla_policy[CTA_EXPECT_MAX+1] = {
1758 1759 1760
	[CTA_EXPECT_MASTER]	= { .type = NLA_NESTED },
	[CTA_EXPECT_TUPLE]	= { .type = NLA_NESTED },
	[CTA_EXPECT_MASK]	= { .type = NLA_NESTED },
1761 1762
	[CTA_EXPECT_TIMEOUT]	= { .type = NLA_U32 },
	[CTA_EXPECT_ID]		= { .type = NLA_U32 },
1763
	[CTA_EXPECT_HELP_NAME]	= { .type = NLA_NUL_STRING },
1764 1765 1766
};

static int
1767
ctnetlink_get_expect(struct sock *ctnl, struct sk_buff *skb,
1768 1769
		     const struct nlmsghdr *nlh,
		     const struct nlattr * const cda[])
1770
{
1771
	struct net *net = sock_net(ctnl);
1772 1773 1774
	struct nf_conntrack_tuple tuple;
	struct nf_conntrack_expect *exp;
	struct sk_buff *skb2;
1775
	struct nfgenmsg *nfmsg = nlmsg_data(nlh);
1776
	u_int8_t u3 = nfmsg->nfgen_family;
1777 1778
	u16 zone;
	int err;
1779 1780

	if (nlh->nlmsg_flags & NLM_F_DUMP) {
1781 1782
		return netlink_dump_start(ctnl, skb, nlh,
					  ctnetlink_exp_dump_table,
1783
					  ctnetlink_exp_done);
1784 1785
	}

1786 1787 1788 1789
	err = ctnetlink_parse_zone(cda[CTA_EXPECT_ZONE], &zone);
	if (err < 0)
		return err;

1790
	if (cda[CTA_EXPECT_MASTER])
1791 1792 1793 1794 1795 1796 1797
		err = ctnetlink_parse_tuple(cda, &tuple, CTA_EXPECT_MASTER, u3);
	else
		return -EINVAL;

	if (err < 0)
		return err;

1798
	exp = nf_ct_expect_find_get(net, zone, &tuple);
1799 1800 1801
	if (!exp)
		return -ENOENT;

1802
	if (cda[CTA_EXPECT_ID]) {
1803
		__be32 id = nla_get_be32(cda[CTA_EXPECT_ID]);
1804
		if (ntohl(id) != (u32)(unsigned long)exp) {
1805
			nf_ct_expect_put(exp);
1806 1807
			return -ENOENT;
		}
1808
	}
1809 1810

	err = -ENOMEM;
1811 1812
	skb2 = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
	if (skb2 == NULL)
1813
		goto out;
1814

1815
	rcu_read_lock();
1816
	err = ctnetlink_exp_fill_info(skb2, NETLINK_CB(skb).pid,
1817
				      nlh->nlmsg_seq, IPCTNL_MSG_EXP_NEW, exp);
1818
	rcu_read_unlock();
1819 1820 1821
	if (err <= 0)
		goto free;

1822
	nf_ct_expect_put(exp);
1823 1824 1825 1826 1827 1828

	return netlink_unicast(ctnl, skb2, NETLINK_CB(skb).pid, MSG_DONTWAIT);

free:
	kfree_skb(skb2);
out:
1829
	nf_ct_expect_put(exp);
1830 1831 1832 1833
	return err;
}

static int
1834
ctnetlink_del_expect(struct sock *ctnl, struct sk_buff *skb,
1835 1836
		     const struct nlmsghdr *nlh,
		     const struct nlattr * const cda[])
1837
{
1838
	struct net *net = sock_net(ctnl);
1839
	struct nf_conntrack_expect *exp;
1840
	struct nf_conntrack_tuple tuple;
1841
	struct nfgenmsg *nfmsg = nlmsg_data(nlh);
1842
	struct hlist_node *n, *next;
1843
	u_int8_t u3 = nfmsg->nfgen_family;
1844
	unsigned int i;
1845
	u16 zone;
1846 1847
	int err;

1848
	if (cda[CTA_EXPECT_TUPLE]) {
1849
		/* delete a single expect by tuple */
1850 1851 1852 1853
		err = ctnetlink_parse_zone(cda[CTA_EXPECT_ZONE], &zone);
		if (err < 0)
			return err;

1854 1855 1856 1857 1858
		err = ctnetlink_parse_tuple(cda, &tuple, CTA_EXPECT_TUPLE, u3);
		if (err < 0)
			return err;

		/* bump usage count to 2 */
1859
		exp = nf_ct_expect_find_get(net, zone, &tuple);
1860 1861 1862
		if (!exp)
			return -ENOENT;

1863
		if (cda[CTA_EXPECT_ID]) {
1864
			__be32 id = nla_get_be32(cda[CTA_EXPECT_ID]);
1865
			if (ntohl(id) != (u32)(unsigned long)exp) {
1866
				nf_ct_expect_put(exp);
1867 1868 1869 1870 1871
				return -ENOENT;
			}
		}

		/* after list removal, usage count == 1 */
1872
		nf_ct_unexpect_related(exp);
1873
		/* have to put what we 'get' above.
1874
		 * after this line usage count == 0 */
1875
		nf_ct_expect_put(exp);
1876 1877
	} else if (cda[CTA_EXPECT_HELP_NAME]) {
		char *name = nla_data(cda[CTA_EXPECT_HELP_NAME]);
1878
		struct nf_conn_help *m_help;
1879 1880

		/* delete all expectations for this helper */
1881
		spin_lock_bh(&nf_conntrack_lock);
1882 1883
		for (i = 0; i < nf_ct_expect_hsize; i++) {
			hlist_for_each_entry_safe(exp, n, next,
1884
						  &net->ct.expect_hash[i],
1885 1886
						  hnode) {
				m_help = nfct_help(exp->master);
1887 1888
				if (!strcmp(m_help->helper->name, name) &&
				    del_timer(&exp->timeout)) {
1889 1890 1891
					nf_ct_unlink_expect(exp);
					nf_ct_expect_put(exp);
				}
1892 1893
			}
		}
1894
		spin_unlock_bh(&nf_conntrack_lock);
1895 1896
	} else {
		/* This basically means we have to flush everything*/
1897
		spin_lock_bh(&nf_conntrack_lock);
1898 1899
		for (i = 0; i < nf_ct_expect_hsize; i++) {
			hlist_for_each_entry_safe(exp, n, next,
1900
						  &net->ct.expect_hash[i],
1901 1902 1903 1904 1905
						  hnode) {
				if (del_timer(&exp->timeout)) {
					nf_ct_unlink_expect(exp);
					nf_ct_expect_put(exp);
				}
1906 1907
			}
		}
1908
		spin_unlock_bh(&nf_conntrack_lock);
1909 1910 1911 1912 1913
	}

	return 0;
}
static int
1914 1915
ctnetlink_change_expect(struct nf_conntrack_expect *x,
			const struct nlattr * const cda[])
1916 1917 1918 1919 1920
{
	return -EOPNOTSUPP;
}

static int
1921 1922
ctnetlink_create_expect(struct net *net, u16 zone,
			const struct nlattr * const cda[],
1923
			u_int8_t u3,
1924
			u32 pid, int report)
1925 1926 1927 1928 1929
{
	struct nf_conntrack_tuple tuple, mask, master_tuple;
	struct nf_conntrack_tuple_hash *h = NULL;
	struct nf_conntrack_expect *exp;
	struct nf_conn *ct;
1930
	struct nf_conn_help *help;
1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944
	int err = 0;

	/* caller guarantees that those three CTA_EXPECT_* exist */
	err = ctnetlink_parse_tuple(cda, &tuple, CTA_EXPECT_TUPLE, u3);
	if (err < 0)
		return err;
	err = ctnetlink_parse_tuple(cda, &mask, CTA_EXPECT_MASK, u3);
	if (err < 0)
		return err;
	err = ctnetlink_parse_tuple(cda, &master_tuple, CTA_EXPECT_MASTER, u3);
	if (err < 0)
		return err;

	/* Look for master conntrack of this expectation */
1945
	h = nf_conntrack_find_get(net, zone, &master_tuple);
1946 1947 1948
	if (!h)
		return -ENOENT;
	ct = nf_ct_tuplehash_to_ctrack(h);
1949
	help = nfct_help(ct);
1950

1951
	if (!help || !help->helper) {
1952
		/* such conntrack hasn't got any helper, abort */
1953
		err = -EOPNOTSUPP;
1954 1955 1956
		goto out;
	}

1957
	exp = nf_ct_expect_alloc(ct);
1958 1959 1960 1961
	if (!exp) {
		err = -ENOMEM;
		goto out;
	}
1962

1963
	exp->class = 0;
1964 1965 1966
	exp->expectfn = NULL;
	exp->flags = 0;
	exp->master = ct;
1967
	exp->helper = NULL;
1968
	memcpy(&exp->tuple, &tuple, sizeof(struct nf_conntrack_tuple));
1969 1970
	memcpy(&exp->mask.src.u3, &mask.src.u3, sizeof(exp->mask.src.u3));
	exp->mask.src.u.all = mask.src.u.all;
1971

1972
	err = nf_ct_expect_related_report(exp, pid, report);
1973
	nf_ct_expect_put(exp);
1974

1975
out:
1976 1977 1978 1979 1980 1981
	nf_ct_put(nf_ct_tuplehash_to_ctrack(h));
	return err;
}

static int
ctnetlink_new_expect(struct sock *ctnl, struct sk_buff *skb,
1982 1983
		     const struct nlmsghdr *nlh,
		     const struct nlattr * const cda[])
1984
{
1985
	struct net *net = sock_net(ctnl);
1986 1987
	struct nf_conntrack_tuple tuple;
	struct nf_conntrack_expect *exp;
1988
	struct nfgenmsg *nfmsg = nlmsg_data(nlh);
1989
	u_int8_t u3 = nfmsg->nfgen_family;
1990 1991
	u16 zone;
	int err;
1992

1993 1994 1995
	if (!cda[CTA_EXPECT_TUPLE]
	    || !cda[CTA_EXPECT_MASK]
	    || !cda[CTA_EXPECT_MASTER])
1996 1997
		return -EINVAL;

1998 1999 2000 2001
	err = ctnetlink_parse_zone(cda[CTA_EXPECT_ZONE], &zone);
	if (err < 0)
		return err;

2002 2003 2004 2005
	err = ctnetlink_parse_tuple(cda, &tuple, CTA_EXPECT_TUPLE, u3);
	if (err < 0)
		return err;

2006
	spin_lock_bh(&nf_conntrack_lock);
2007
	exp = __nf_ct_expect_find(net, zone, &tuple);
2008 2009

	if (!exp) {
2010
		spin_unlock_bh(&nf_conntrack_lock);
2011
		err = -ENOENT;
2012
		if (nlh->nlmsg_flags & NLM_F_CREATE) {
2013
			err = ctnetlink_create_expect(net, zone, cda,
2014 2015 2016 2017
						      u3,
						      NETLINK_CB(skb).pid,
						      nlmsg_report(nlh));
		}
2018 2019 2020 2021 2022 2023
		return err;
	}

	err = -EEXIST;
	if (!(nlh->nlmsg_flags & NLM_F_EXCL))
		err = ctnetlink_change_expect(exp, cda);
2024
	spin_unlock_bh(&nf_conntrack_lock);
2025 2026 2027 2028 2029

	return err;
}

#ifdef CONFIG_NF_CONNTRACK_EVENTS
2030 2031
static struct nf_ct_event_notifier ctnl_notifier = {
	.fcn = ctnetlink_conntrack_event,
2032 2033
};

2034 2035
static struct nf_exp_event_notifier ctnl_notifier_exp = {
	.fcn = ctnetlink_expect_event,
2036 2037 2038
};
#endif

2039
static const struct nfnl_callback ctnl_cb[IPCTNL_MSG_MAX] = {
2040
	[IPCTNL_MSG_CT_NEW]		= { .call = ctnetlink_new_conntrack,
2041 2042
					    .attr_count = CTA_MAX,
					    .policy = ct_nla_policy },
2043
	[IPCTNL_MSG_CT_GET] 		= { .call = ctnetlink_get_conntrack,
2044 2045
					    .attr_count = CTA_MAX,
					    .policy = ct_nla_policy },
2046
	[IPCTNL_MSG_CT_DELETE]  	= { .call = ctnetlink_del_conntrack,
2047 2048
					    .attr_count = CTA_MAX,
					    .policy = ct_nla_policy },
2049
	[IPCTNL_MSG_CT_GET_CTRZERO] 	= { .call = ctnetlink_get_conntrack,
2050 2051
					    .attr_count = CTA_MAX,
					    .policy = ct_nla_policy },
2052 2053
};

2054
static const struct nfnl_callback ctnl_exp_cb[IPCTNL_MSG_EXP_MAX] = {
2055
	[IPCTNL_MSG_EXP_GET]		= { .call = ctnetlink_get_expect,
2056 2057
					    .attr_count = CTA_EXPECT_MAX,
					    .policy = exp_nla_policy },
2058
	[IPCTNL_MSG_EXP_NEW]		= { .call = ctnetlink_new_expect,
2059 2060
					    .attr_count = CTA_EXPECT_MAX,
					    .policy = exp_nla_policy },
2061
	[IPCTNL_MSG_EXP_DELETE]		= { .call = ctnetlink_del_expect,
2062 2063
					    .attr_count = CTA_EXPECT_MAX,
					    .policy = exp_nla_policy },
2064 2065
};

2066
static const struct nfnetlink_subsystem ctnl_subsys = {
2067 2068 2069 2070 2071 2072
	.name				= "conntrack",
	.subsys_id			= NFNL_SUBSYS_CTNETLINK,
	.cb_count			= IPCTNL_MSG_MAX,
	.cb				= ctnl_cb,
};

2073
static const struct nfnetlink_subsystem ctnl_exp_subsys = {
2074 2075 2076 2077 2078 2079
	.name				= "conntrack_expect",
	.subsys_id			= NFNL_SUBSYS_CTNETLINK_EXP,
	.cb_count			= IPCTNL_MSG_EXP_MAX,
	.cb				= ctnl_exp_cb,
};

2080
MODULE_ALIAS("ip_conntrack_netlink");
2081
MODULE_ALIAS_NFNL_SUBSYS(NFNL_SUBSYS_CTNETLINK);
2082
MODULE_ALIAS_NFNL_SUBSYS(NFNL_SUBSYS_CTNETLINK_EXP);
2083 2084 2085 2086 2087

static int __init ctnetlink_init(void)
{
	int ret;

2088
	pr_info("ctnetlink v%s: registering with nfnetlink.\n", version);
2089 2090
	ret = nfnetlink_subsys_register(&ctnl_subsys);
	if (ret < 0) {
2091
		pr_err("ctnetlink_init: cannot register with nfnetlink.\n");
2092 2093 2094 2095 2096
		goto err_out;
	}

	ret = nfnetlink_subsys_register(&ctnl_exp_subsys);
	if (ret < 0) {
2097
		pr_err("ctnetlink_init: cannot register exp with nfnetlink.\n");
2098 2099 2100 2101 2102 2103
		goto err_unreg_subsys;
	}

#ifdef CONFIG_NF_CONNTRACK_EVENTS
	ret = nf_conntrack_register_notifier(&ctnl_notifier);
	if (ret < 0) {
2104
		pr_err("ctnetlink_init: cannot register notifier.\n");
2105 2106 2107
		goto err_unreg_exp_subsys;
	}

2108
	ret = nf_ct_expect_register_notifier(&ctnl_notifier_exp);
2109
	if (ret < 0) {
2110
		pr_err("ctnetlink_init: cannot expect register notifier.\n");
2111 2112 2113 2114 2115 2116 2117 2118 2119 2120 2121 2122 2123 2124 2125 2126 2127 2128 2129 2130
		goto err_unreg_notifier;
	}
#endif

	return 0;

#ifdef CONFIG_NF_CONNTRACK_EVENTS
err_unreg_notifier:
	nf_conntrack_unregister_notifier(&ctnl_notifier);
err_unreg_exp_subsys:
	nfnetlink_subsys_unregister(&ctnl_exp_subsys);
#endif
err_unreg_subsys:
	nfnetlink_subsys_unregister(&ctnl_subsys);
err_out:
	return ret;
}

static void __exit ctnetlink_exit(void)
{
2131
	pr_info("ctnetlink: unregistering from nfnetlink.\n");
2132 2133

#ifdef CONFIG_NF_CONNTRACK_EVENTS
2134
	nf_ct_expect_unregister_notifier(&ctnl_notifier_exp);
2135 2136 2137 2138 2139 2140 2141 2142 2143
	nf_conntrack_unregister_notifier(&ctnl_notifier);
#endif

	nfnetlink_subsys_unregister(&ctnl_exp_subsys);
	nfnetlink_subsys_unregister(&ctnl_subsys);
}

module_init(ctnetlink_init);
module_exit(ctnetlink_exit);