10c3753b1d4226a6e7bea9619415cf40cadee1e58Patrick McHardy/*
20c3753b1d4226a6e7bea9619415cf40cadee1e58Patrick McHardy * Copyright (c) 2010-2013 Patrick McHardy <kaber@trash.net>
30c3753b1d4226a6e7bea9619415cf40cadee1e58Patrick McHardy */
40c3753b1d4226a6e7bea9619415cf40cadee1e58Patrick McHardy
59fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy#include <stdio.h>
69fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy#include <string.h>
79fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy#include <xtables.h>
89fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy#include <linux/netfilter/nf_conntrack_common.h>
99fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy#include <linux/netfilter/xt_CT.h>
109fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy
119fdbaa71452edaac9d5906716c15937f670341faPatrick McHardystatic void ct_help(void)
129fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy{
139fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy	printf(
149fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy"CT target options:\n"
159fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy" --notrack			Don't track connection\n"
169fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy" --helper name			Use conntrack helper 'name' for connection\n"
1789b6c32f88be47e83c3f6e7f8fee812088cb8c22Jan Engelhardt" --ctevents event[,event...]	Generate specified conntrack events for connection\n"
189fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy" --expevents event[,event...]	Generate specified expectation events for connection\n"
19c1b62f09259cdfa618cf63032de67689c991bd3eDaniel Borkmann" --zone {ID|mark}		Assign/Lookup connection in zone ID/packet nfmark\n"
20c1b62f09259cdfa618cf63032de67689c991bd3eDaniel Borkmann" --zone-orig {ID|mark}		Same as 'zone' option, but only applies to ORIGINAL direction\n"
21c1b62f09259cdfa618cf63032de67689c991bd3eDaniel Borkmann" --zone-reply {ID|mark} 	Same as 'zone' option, but only applies to REPLY direction\n"
229fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy	);
239fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy}
249fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy
25e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayusostatic void ct_help_v1(void)
26e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso{
27e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso	printf(
28e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso"CT target options:\n"
29e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso" --notrack			Don't track connection\n"
30e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso" --helper name			Use conntrack helper 'name' for connection\n"
31e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso" --timeout name 		Use timeout policy 'name' for connection\n"
32e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso" --ctevents event[,event...]	Generate specified conntrack events for connection\n"
33e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso" --expevents event[,event...]	Generate specified expectation events for connection\n"
34c1b62f09259cdfa618cf63032de67689c991bd3eDaniel Borkmann" --zone {ID|mark}		Assign/Lookup connection in zone ID/packet nfmark\n"
35c1b62f09259cdfa618cf63032de67689c991bd3eDaniel Borkmann" --zone-orig {ID|mark}		Same as 'zone' option, but only applies to ORIGINAL direction\n"
36c1b62f09259cdfa618cf63032de67689c991bd3eDaniel Borkmann" --zone-reply {ID|mark} 	Same as 'zone' option, but only applies to REPLY direction\n"
37e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso	);
38e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso}
39e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso
40a05562e1e2fb2e18f34d29ec57c4217a3014d1f2Jan Engelhardtenum {
41a05562e1e2fb2e18f34d29ec57c4217a3014d1f2Jan Engelhardt	O_NOTRACK = 0,
42a05562e1e2fb2e18f34d29ec57c4217a3014d1f2Jan Engelhardt	O_HELPER,
43e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso	O_TIMEOUT,
44a05562e1e2fb2e18f34d29ec57c4217a3014d1f2Jan Engelhardt	O_CTEVENTS,
45a05562e1e2fb2e18f34d29ec57c4217a3014d1f2Jan Engelhardt	O_EXPEVENTS,
46a05562e1e2fb2e18f34d29ec57c4217a3014d1f2Jan Engelhardt	O_ZONE,
47c1b62f09259cdfa618cf63032de67689c991bd3eDaniel Borkmann	O_ZONE_ORIG,
48c1b62f09259cdfa618cf63032de67689c991bd3eDaniel Borkmann	O_ZONE_REPLY,
499fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy};
509fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy
51a05562e1e2fb2e18f34d29ec57c4217a3014d1f2Jan Engelhardt#define s struct xt_ct_target_info
52a05562e1e2fb2e18f34d29ec57c4217a3014d1f2Jan Engelhardtstatic const struct xt_option_entry ct_opts[] = {
53a05562e1e2fb2e18f34d29ec57c4217a3014d1f2Jan Engelhardt	{.name = "notrack", .id = O_NOTRACK, .type = XTTYPE_NONE},
54a05562e1e2fb2e18f34d29ec57c4217a3014d1f2Jan Engelhardt	{.name = "helper", .id = O_HELPER, .type = XTTYPE_STRING,
55a05562e1e2fb2e18f34d29ec57c4217a3014d1f2Jan Engelhardt	 .flags = XTOPT_PUT, XTOPT_POINTER(s, helper)},
56a05562e1e2fb2e18f34d29ec57c4217a3014d1f2Jan Engelhardt	{.name = "ctevents", .id = O_CTEVENTS, .type = XTTYPE_STRING},
57a05562e1e2fb2e18f34d29ec57c4217a3014d1f2Jan Engelhardt	{.name = "expevents", .id = O_EXPEVENTS, .type = XTTYPE_STRING},
58c1b62f09259cdfa618cf63032de67689c991bd3eDaniel Borkmann	{.name = "zone-orig", .id = O_ZONE_ORIG, .type = XTTYPE_STRING},
59c1b62f09259cdfa618cf63032de67689c991bd3eDaniel Borkmann	{.name = "zone-reply", .id = O_ZONE_REPLY, .type = XTTYPE_STRING},
60c1b62f09259cdfa618cf63032de67689c991bd3eDaniel Borkmann	{.name = "zone", .id = O_ZONE, .type = XTTYPE_STRING},
61a05562e1e2fb2e18f34d29ec57c4217a3014d1f2Jan Engelhardt	XTOPT_TABLEEND,
629fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy};
63a05562e1e2fb2e18f34d29ec57c4217a3014d1f2Jan Engelhardt#undef s
649fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy
65e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso#define s struct xt_ct_target_info_v1
66e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayusostatic const struct xt_option_entry ct_opts_v1[] = {
67e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso	{.name = "notrack", .id = O_NOTRACK, .type = XTTYPE_NONE},
68e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso	{.name = "helper", .id = O_HELPER, .type = XTTYPE_STRING,
69e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso	 .flags = XTOPT_PUT, XTOPT_POINTER(s, helper)},
70e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso	{.name = "timeout", .id = O_TIMEOUT, .type = XTTYPE_STRING,
71e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso	 .flags = XTOPT_PUT, XTOPT_POINTER(s, timeout)},
72e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso	{.name = "ctevents", .id = O_CTEVENTS, .type = XTTYPE_STRING},
73e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso	{.name = "expevents", .id = O_EXPEVENTS, .type = XTTYPE_STRING},
74c1b62f09259cdfa618cf63032de67689c991bd3eDaniel Borkmann	{.name = "zone-orig", .id = O_ZONE_ORIG, .type = XTTYPE_STRING},
75c1b62f09259cdfa618cf63032de67689c991bd3eDaniel Borkmann	{.name = "zone-reply", .id = O_ZONE_REPLY, .type = XTTYPE_STRING},
76c1b62f09259cdfa618cf63032de67689c991bd3eDaniel Borkmann	{.name = "zone", .id = O_ZONE, .type = XTTYPE_STRING},
77e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso	XTOPT_TABLEEND,
78e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso};
79e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso#undef s
80e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso
819fdbaa71452edaac9d5906716c15937f670341faPatrick McHardystruct event_tbl {
829fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy	const char	*name;
839fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy	unsigned int	event;
849fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy};
859fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy
869fdbaa71452edaac9d5906716c15937f670341faPatrick McHardystatic const struct event_tbl ct_event_tbl[] = {
879fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy	{ "new",		IPCT_NEW },
889fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy	{ "related",		IPCT_RELATED },
899fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy	{ "destroy",		IPCT_DESTROY },
909fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy	{ "reply",		IPCT_REPLY },
919fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy	{ "assured",		IPCT_ASSURED },
929fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy	{ "protoinfo",		IPCT_PROTOINFO },
939fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy	{ "helper",		IPCT_HELPER },
949fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy	{ "mark",		IPCT_MARK },
959fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy	{ "natseqinfo",		IPCT_NATSEQADJ },
969fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy	{ "secmark",		IPCT_SECMARK },
979fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy};
989fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy
999fdbaa71452edaac9d5906716c15937f670341faPatrick McHardystatic const struct event_tbl exp_event_tbl[] = {
1009fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy	{ "new",		IPEXP_NEW },
1019fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy};
1029fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy
103c1b62f09259cdfa618cf63032de67689c991bd3eDaniel Borkmannstatic void ct_parse_zone_id(const char *opt, unsigned int opt_id,
104c1b62f09259cdfa618cf63032de67689c991bd3eDaniel Borkmann			     uint16_t *zone_id, uint16_t *flags)
105c1b62f09259cdfa618cf63032de67689c991bd3eDaniel Borkmann{
106c1b62f09259cdfa618cf63032de67689c991bd3eDaniel Borkmann	if (opt_id == O_ZONE_ORIG)
107c1b62f09259cdfa618cf63032de67689c991bd3eDaniel Borkmann		*flags |= XT_CT_ZONE_DIR_ORIG;
108c1b62f09259cdfa618cf63032de67689c991bd3eDaniel Borkmann	if (opt_id == O_ZONE_REPLY)
109c1b62f09259cdfa618cf63032de67689c991bd3eDaniel Borkmann		*flags |= XT_CT_ZONE_DIR_REPL;
110c1b62f09259cdfa618cf63032de67689c991bd3eDaniel Borkmann
111c1b62f09259cdfa618cf63032de67689c991bd3eDaniel Borkmann	*zone_id = 0;
112c1b62f09259cdfa618cf63032de67689c991bd3eDaniel Borkmann
113c1b62f09259cdfa618cf63032de67689c991bd3eDaniel Borkmann	if (strcasecmp(opt, "mark") == 0) {
114c1b62f09259cdfa618cf63032de67689c991bd3eDaniel Borkmann		*flags |= XT_CT_ZONE_MARK;
115c1b62f09259cdfa618cf63032de67689c991bd3eDaniel Borkmann	} else {
116c1b62f09259cdfa618cf63032de67689c991bd3eDaniel Borkmann		uintmax_t val;
117c1b62f09259cdfa618cf63032de67689c991bd3eDaniel Borkmann
118c1b62f09259cdfa618cf63032de67689c991bd3eDaniel Borkmann		if (!xtables_strtoul(opt, NULL, &val, 0, UINT16_MAX))
119c1b62f09259cdfa618cf63032de67689c991bd3eDaniel Borkmann			xtables_error(PARAMETER_PROBLEM,
120c1b62f09259cdfa618cf63032de67689c991bd3eDaniel Borkmann				      "Cannot parse %s as a zone ID\n", opt);
121c1b62f09259cdfa618cf63032de67689c991bd3eDaniel Borkmann
122c1b62f09259cdfa618cf63032de67689c991bd3eDaniel Borkmann		*zone_id = (uint16_t)val;
123c1b62f09259cdfa618cf63032de67689c991bd3eDaniel Borkmann	}
124c1b62f09259cdfa618cf63032de67689c991bd3eDaniel Borkmann}
125c1b62f09259cdfa618cf63032de67689c991bd3eDaniel Borkmann
126c1b62f09259cdfa618cf63032de67689c991bd3eDaniel Borkmannstatic void ct_print_zone_id(const char *pfx, uint16_t zone_id, uint16_t flags)
127c1b62f09259cdfa618cf63032de67689c991bd3eDaniel Borkmann{
128c1b62f09259cdfa618cf63032de67689c991bd3eDaniel Borkmann	printf(" %s", pfx);
129c1b62f09259cdfa618cf63032de67689c991bd3eDaniel Borkmann
130c1b62f09259cdfa618cf63032de67689c991bd3eDaniel Borkmann	if ((flags & (XT_CT_ZONE_DIR_ORIG |
131c1b62f09259cdfa618cf63032de67689c991bd3eDaniel Borkmann		      XT_CT_ZONE_DIR_REPL)) == XT_CT_ZONE_DIR_ORIG)
132c1b62f09259cdfa618cf63032de67689c991bd3eDaniel Borkmann		printf("-orig");
133c1b62f09259cdfa618cf63032de67689c991bd3eDaniel Borkmann	if ((flags & (XT_CT_ZONE_DIR_ORIG |
134c1b62f09259cdfa618cf63032de67689c991bd3eDaniel Borkmann		      XT_CT_ZONE_DIR_REPL)) == XT_CT_ZONE_DIR_REPL)
135c1b62f09259cdfa618cf63032de67689c991bd3eDaniel Borkmann		printf("-reply");
136c1b62f09259cdfa618cf63032de67689c991bd3eDaniel Borkmann	if (flags & XT_CT_ZONE_MARK)
137c1b62f09259cdfa618cf63032de67689c991bd3eDaniel Borkmann		printf(" mark");
138c1b62f09259cdfa618cf63032de67689c991bd3eDaniel Borkmann	else
139c1b62f09259cdfa618cf63032de67689c991bd3eDaniel Borkmann		printf(" %u", zone_id);
140c1b62f09259cdfa618cf63032de67689c991bd3eDaniel Borkmann}
141c1b62f09259cdfa618cf63032de67689c991bd3eDaniel Borkmann
1429fdbaa71452edaac9d5906716c15937f670341faPatrick McHardystatic uint32_t ct_parse_events(const struct event_tbl *tbl, unsigned int size,
1439fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy				const char *events)
1449fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy{
1459fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy	char str[strlen(events) + 1], *e = str, *t;
1469fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy	unsigned int mask = 0, i;
1479fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy
1489fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy	strcpy(str, events);
1499fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy	while ((t = strsep(&e, ","))) {
1509fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy		for (i = 0; i < size; i++) {
151bed2ba957d545b50c3eae6fb28fc0decadbc0dcbPablo Neira Ayuso			if (strcmp(t, tbl[i].name))
1529fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy				continue;
153bed2ba957d545b50c3eae6fb28fc0decadbc0dcbPablo Neira Ayuso			mask |= 1 << tbl[i].event;
1549fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy			break;
1559fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy		}
1569fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy
1579fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy		if (i == size)
1589fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy			xtables_error(PARAMETER_PROBLEM, "Unknown event type \"%s\"", t);
1599fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy	}
1609fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy
1619fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy	return mask;
1629fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy}
1639fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy
1649fdbaa71452edaac9d5906716c15937f670341faPatrick McHardystatic void ct_print_events(const char *pfx, const struct event_tbl *tbl,
1659fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy			    unsigned int size, uint32_t mask)
1669fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy{
1679fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy	const char *sep = "";
1689fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy	unsigned int i;
1699fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy
17073866357e4a7a0fdc1b293bf8863fee2bd56da9eJan Engelhardt	printf(" %s ", pfx);
1719fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy	for (i = 0; i < size; i++) {
1729fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy		if (mask & (1 << tbl[i].event)) {
1739fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy			printf("%s%s", sep, tbl[i].name);
1749fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy			sep = ",";
1759fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy		}
1769fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy	}
1779fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy}
1789fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy
179a05562e1e2fb2e18f34d29ec57c4217a3014d1f2Jan Engelhardtstatic void ct_parse(struct xt_option_call *cb)
1809fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy{
181a05562e1e2fb2e18f34d29ec57c4217a3014d1f2Jan Engelhardt	struct xt_ct_target_info *info = cb->data;
1829fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy
183a05562e1e2fb2e18f34d29ec57c4217a3014d1f2Jan Engelhardt	xtables_option_parse(cb);
184a05562e1e2fb2e18f34d29ec57c4217a3014d1f2Jan Engelhardt	switch (cb->entry->id) {
185a05562e1e2fb2e18f34d29ec57c4217a3014d1f2Jan Engelhardt	case O_NOTRACK:
1869fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy		info->flags |= XT_CT_NOTRACK;
1879fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy		break;
188c1b62f09259cdfa618cf63032de67689c991bd3eDaniel Borkmann	case O_ZONE_ORIG:
189c1b62f09259cdfa618cf63032de67689c991bd3eDaniel Borkmann	case O_ZONE_REPLY:
190c1b62f09259cdfa618cf63032de67689c991bd3eDaniel Borkmann	case O_ZONE:
191c1b62f09259cdfa618cf63032de67689c991bd3eDaniel Borkmann		ct_parse_zone_id(cb->arg, cb->entry->id, &info->zone,
192c1b62f09259cdfa618cf63032de67689c991bd3eDaniel Borkmann				 &info->flags);
193c1b62f09259cdfa618cf63032de67689c991bd3eDaniel Borkmann		break;
194a05562e1e2fb2e18f34d29ec57c4217a3014d1f2Jan Engelhardt	case O_CTEVENTS:
195a05562e1e2fb2e18f34d29ec57c4217a3014d1f2Jan Engelhardt		info->ct_events = ct_parse_events(ct_event_tbl, ARRAY_SIZE(ct_event_tbl), cb->arg);
1969fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy		break;
197a05562e1e2fb2e18f34d29ec57c4217a3014d1f2Jan Engelhardt	case O_EXPEVENTS:
198a05562e1e2fb2e18f34d29ec57c4217a3014d1f2Jan Engelhardt		info->exp_events = ct_parse_events(exp_event_tbl, ARRAY_SIZE(exp_event_tbl), cb->arg);
1999fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy		break;
2009fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy	}
2019fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy}
2029fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy
203e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayusostatic void ct_parse_v1(struct xt_option_call *cb)
204e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso{
205e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso	struct xt_ct_target_info_v1 *info = cb->data;
206e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso
207e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso	xtables_option_parse(cb);
208e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso	switch (cb->entry->id) {
209e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso	case O_NOTRACK:
210e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso		info->flags |= XT_CT_NOTRACK;
211e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso		break;
212c1b62f09259cdfa618cf63032de67689c991bd3eDaniel Borkmann	case O_ZONE_ORIG:
213c1b62f09259cdfa618cf63032de67689c991bd3eDaniel Borkmann	case O_ZONE_REPLY:
214c1b62f09259cdfa618cf63032de67689c991bd3eDaniel Borkmann	case O_ZONE:
215c1b62f09259cdfa618cf63032de67689c991bd3eDaniel Borkmann		ct_parse_zone_id(cb->arg, cb->entry->id, &info->zone,
216c1b62f09259cdfa618cf63032de67689c991bd3eDaniel Borkmann				 &info->flags);
217c1b62f09259cdfa618cf63032de67689c991bd3eDaniel Borkmann		break;
218e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso	case O_CTEVENTS:
219e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso		info->ct_events = ct_parse_events(ct_event_tbl,
220e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso						  ARRAY_SIZE(ct_event_tbl),
221e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso						  cb->arg);
222e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso		break;
223e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso	case O_EXPEVENTS:
224e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso		info->exp_events = ct_parse_events(exp_event_tbl,
225e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso						   ARRAY_SIZE(exp_event_tbl),
226e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso						   cb->arg);
227e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso		break;
228e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso	}
229e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso}
230e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso
2319fdbaa71452edaac9d5906716c15937f670341faPatrick McHardystatic void ct_print(const void *ip, const struct xt_entry_target *target, int numeric)
2329fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy{
2339fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy	const struct xt_ct_target_info *info =
2349fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy		(const struct xt_ct_target_info *)target->data;
2359fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy
23673866357e4a7a0fdc1b293bf8863fee2bd56da9eJan Engelhardt	printf(" CT");
2379fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy	if (info->flags & XT_CT_NOTRACK)
23873866357e4a7a0fdc1b293bf8863fee2bd56da9eJan Engelhardt		printf(" notrack");
2399fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy	if (info->helper[0])
24073866357e4a7a0fdc1b293bf8863fee2bd56da9eJan Engelhardt		printf(" helper %s", info->helper);
2419fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy	if (info->ct_events)
2429fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy		ct_print_events("ctevents", ct_event_tbl,
2439fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy				ARRAY_SIZE(ct_event_tbl), info->ct_events);
2449fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy	if (info->exp_events)
2459fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy		ct_print_events("expevents", exp_event_tbl,
2469fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy				ARRAY_SIZE(exp_event_tbl), info->exp_events);
247c1b62f09259cdfa618cf63032de67689c991bd3eDaniel Borkmann	if (info->flags & XT_CT_ZONE_MARK || info->zone)
248c1b62f09259cdfa618cf63032de67689c991bd3eDaniel Borkmann		ct_print_zone_id("zone", info->zone, info->flags);
2499fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy}
2509fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy
251e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayusostatic void
252e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayusoct_print_v1(const void *ip, const struct xt_entry_target *target, int numeric)
253e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso{
254e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso	const struct xt_ct_target_info_v1 *info =
255e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso		(const struct xt_ct_target_info_v1 *)target->data;
256e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso
2577b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsik	if (info->flags & XT_CT_NOTRACK_ALIAS) {
2587b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsik		printf (" NOTRACK");
2597b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsik		return;
2607b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsik	}
261e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso	printf(" CT");
262e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso	if (info->flags & XT_CT_NOTRACK)
263e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso		printf(" notrack");
264e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso	if (info->helper[0])
265e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso		printf(" helper %s", info->helper);
266e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso	if (info->timeout[0])
267e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso		printf(" timeout %s", info->timeout);
268e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso	if (info->ct_events)
269e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso		ct_print_events("ctevents", ct_event_tbl,
270e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso				ARRAY_SIZE(ct_event_tbl), info->ct_events);
271e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso	if (info->exp_events)
272e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso		ct_print_events("expevents", exp_event_tbl,
273e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso				ARRAY_SIZE(exp_event_tbl), info->exp_events);
274c1b62f09259cdfa618cf63032de67689c991bd3eDaniel Borkmann	if (info->flags & XT_CT_ZONE_MARK || info->zone)
275c1b62f09259cdfa618cf63032de67689c991bd3eDaniel Borkmann		ct_print_zone_id("zone", info->zone, info->flags);
276e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso}
277e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso
2789fdbaa71452edaac9d5906716c15937f670341faPatrick McHardystatic void ct_save(const void *ip, const struct xt_entry_target *target)
2799fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy{
2809fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy	const struct xt_ct_target_info *info =
2819fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy		(const struct xt_ct_target_info *)target->data;
2829fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy
2837b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsik	if (info->flags & XT_CT_NOTRACK_ALIAS)
2847b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsik		return;
2859fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy	if (info->flags & XT_CT_NOTRACK)
28673866357e4a7a0fdc1b293bf8863fee2bd56da9eJan Engelhardt		printf(" --notrack");
2879fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy	if (info->helper[0])
28873866357e4a7a0fdc1b293bf8863fee2bd56da9eJan Engelhardt		printf(" --helper %s", info->helper);
2899fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy	if (info->ct_events)
2909fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy		ct_print_events("--ctevents", ct_event_tbl,
2919fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy				ARRAY_SIZE(ct_event_tbl), info->ct_events);
2929fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy	if (info->exp_events)
2939fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy		ct_print_events("--expevents", exp_event_tbl,
2949fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy				ARRAY_SIZE(exp_event_tbl), info->exp_events);
295c1b62f09259cdfa618cf63032de67689c991bd3eDaniel Borkmann	if (info->flags & XT_CT_ZONE_MARK || info->zone)
296c1b62f09259cdfa618cf63032de67689c991bd3eDaniel Borkmann		ct_print_zone_id("--zone", info->zone, info->flags);
2979fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy}
2989fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy
299e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayusostatic void ct_save_v1(const void *ip, const struct xt_entry_target *target)
300e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso{
301e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso	const struct xt_ct_target_info_v1 *info =
302e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso		(const struct xt_ct_target_info_v1 *)target->data;
303e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso
3047b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsik	if (info->flags & XT_CT_NOTRACK_ALIAS)
3057b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsik		return;
306e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso	if (info->flags & XT_CT_NOTRACK)
307e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso		printf(" --notrack");
308e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso	if (info->helper[0])
309e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso		printf(" --helper %s", info->helper);
310e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso	if (info->timeout[0])
311e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso		printf(" --timeout %s", info->timeout);
312e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso	if (info->ct_events)
313e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso		ct_print_events("--ctevents", ct_event_tbl,
314e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso				ARRAY_SIZE(ct_event_tbl), info->ct_events);
315e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso	if (info->exp_events)
316e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso		ct_print_events("--expevents", exp_event_tbl,
317e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso				ARRAY_SIZE(exp_event_tbl), info->exp_events);
318c1b62f09259cdfa618cf63032de67689c991bd3eDaniel Borkmann	if (info->flags & XT_CT_ZONE_MARK || info->zone)
319c1b62f09259cdfa618cf63032de67689c991bd3eDaniel Borkmann		ct_print_zone_id("--zone", info->zone, info->flags);
320e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso}
321e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso
3227b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsikstatic const char *
3237b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsikct_print_name_alias(const struct xt_entry_target *target)
3247b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsik{
3257b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsik	struct xt_ct_target_info *info = (void *)target->data;
3267b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsik
3277b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsik	return info->flags & XT_CT_NOTRACK_ALIAS ? "NOTRACK" : "CT";
3287b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsik}
3297b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsik
33050f19190a60ff7d69e88406a71a2f27e09008566Jan Engelhardtstatic void notrack_ct0_tg_init(struct xt_entry_target *target)
33150f19190a60ff7d69e88406a71a2f27e09008566Jan Engelhardt{
33250f19190a60ff7d69e88406a71a2f27e09008566Jan Engelhardt	struct xt_ct_target_info *info = (void *)target->data;
33350f19190a60ff7d69e88406a71a2f27e09008566Jan Engelhardt
33450f19190a60ff7d69e88406a71a2f27e09008566Jan Engelhardt	info->flags = XT_CT_NOTRACK;
33550f19190a60ff7d69e88406a71a2f27e09008566Jan Engelhardt}
33650f19190a60ff7d69e88406a71a2f27e09008566Jan Engelhardt
33750f19190a60ff7d69e88406a71a2f27e09008566Jan Engelhardtstatic void notrack_ct1_tg_init(struct xt_entry_target *target)
33850f19190a60ff7d69e88406a71a2f27e09008566Jan Engelhardt{
33950f19190a60ff7d69e88406a71a2f27e09008566Jan Engelhardt	struct xt_ct_target_info_v1 *info = (void *)target->data;
34050f19190a60ff7d69e88406a71a2f27e09008566Jan Engelhardt
34150f19190a60ff7d69e88406a71a2f27e09008566Jan Engelhardt	info->flags = XT_CT_NOTRACK;
34250f19190a60ff7d69e88406a71a2f27e09008566Jan Engelhardt}
34350f19190a60ff7d69e88406a71a2f27e09008566Jan Engelhardt
3447b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsikstatic void notrack_ct2_tg_init(struct xt_entry_target *target)
3457b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsik{
3467b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsik	struct xt_ct_target_info_v1 *info = (void *)target->data;
3477b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsik
3487b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsik	info->flags = XT_CT_NOTRACK | XT_CT_NOTRACK_ALIAS;
3497b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsik}
3507b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsik
351e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayusostatic struct xtables_target ct_target_reg[] = {
352e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso	{
353e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso		.family		= NFPROTO_UNSPEC,
354e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso		.name		= "CT",
355e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso		.version	= XTABLES_VERSION,
356e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso		.size		= XT_ALIGN(sizeof(struct xt_ct_target_info)),
357e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso		.userspacesize	= offsetof(struct xt_ct_target_info, ct),
358e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso		.help		= ct_help,
359e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso		.print		= ct_print,
360e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso		.save		= ct_save,
361e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso		.x6_parse	= ct_parse,
362e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso		.x6_options	= ct_opts,
363e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso	},
364e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso	{
365e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso		.family		= NFPROTO_UNSPEC,
366e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso		.name		= "CT",
367e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso		.revision	= 1,
368e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso		.version	= XTABLES_VERSION,
369e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso		.size		= XT_ALIGN(sizeof(struct xt_ct_target_info_v1)),
370e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso		.userspacesize	= offsetof(struct xt_ct_target_info_v1, ct),
371e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso		.help		= ct_help_v1,
372e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso		.print		= ct_print_v1,
373e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso		.save		= ct_save_v1,
374e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso		.x6_parse	= ct_parse_v1,
375e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso		.x6_options	= ct_opts_v1,
376e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso	},
37750f19190a60ff7d69e88406a71a2f27e09008566Jan Engelhardt	{
3787b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsik		.family		= NFPROTO_UNSPEC,
3797b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsik		.name		= "CT",
3807b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsik		.revision	= 2,
3817b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsik		.version	= XTABLES_VERSION,
3827b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsik		.size		= XT_ALIGN(sizeof(struct xt_ct_target_info_v1)),
3837b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsik		.userspacesize	= offsetof(struct xt_ct_target_info_v1, ct),
3847b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsik		.help		= ct_help_v1,
3857b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsik		.print		= ct_print_v1,
3867b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsik		.save		= ct_save_v1,
3877b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsik		.alias		= ct_print_name_alias,
3887b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsik		.x6_parse	= ct_parse_v1,
3897b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsik		.x6_options	= ct_opts_v1,
3907b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsik	},
3917b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsik	{
39250f19190a60ff7d69e88406a71a2f27e09008566Jan Engelhardt		.family        = NFPROTO_UNSPEC,
39350f19190a60ff7d69e88406a71a2f27e09008566Jan Engelhardt		.name          = "NOTRACK",
39450f19190a60ff7d69e88406a71a2f27e09008566Jan Engelhardt		.real_name     = "CT",
39550f19190a60ff7d69e88406a71a2f27e09008566Jan Engelhardt		.revision      = 0,
39650f19190a60ff7d69e88406a71a2f27e09008566Jan Engelhardt		.version       = XTABLES_VERSION,
39750f19190a60ff7d69e88406a71a2f27e09008566Jan Engelhardt		.size          = XT_ALIGN(sizeof(struct xt_ct_target_info)),
39850f19190a60ff7d69e88406a71a2f27e09008566Jan Engelhardt		.userspacesize = offsetof(struct xt_ct_target_info, ct),
39950f19190a60ff7d69e88406a71a2f27e09008566Jan Engelhardt		.init          = notrack_ct0_tg_init,
40050f19190a60ff7d69e88406a71a2f27e09008566Jan Engelhardt	},
40150f19190a60ff7d69e88406a71a2f27e09008566Jan Engelhardt	{
40250f19190a60ff7d69e88406a71a2f27e09008566Jan Engelhardt		.family        = NFPROTO_UNSPEC,
40350f19190a60ff7d69e88406a71a2f27e09008566Jan Engelhardt		.name          = "NOTRACK",
40450f19190a60ff7d69e88406a71a2f27e09008566Jan Engelhardt		.real_name     = "CT",
40550f19190a60ff7d69e88406a71a2f27e09008566Jan Engelhardt		.revision      = 1,
40650f19190a60ff7d69e88406a71a2f27e09008566Jan Engelhardt		.version       = XTABLES_VERSION,
40750f19190a60ff7d69e88406a71a2f27e09008566Jan Engelhardt		.size          = XT_ALIGN(sizeof(struct xt_ct_target_info_v1)),
40850f19190a60ff7d69e88406a71a2f27e09008566Jan Engelhardt		.userspacesize = offsetof(struct xt_ct_target_info_v1, ct),
40950f19190a60ff7d69e88406a71a2f27e09008566Jan Engelhardt		.init          = notrack_ct1_tg_init,
41050f19190a60ff7d69e88406a71a2f27e09008566Jan Engelhardt	},
41150f19190a60ff7d69e88406a71a2f27e09008566Jan Engelhardt	{
41250f19190a60ff7d69e88406a71a2f27e09008566Jan Engelhardt		.family        = NFPROTO_UNSPEC,
41350f19190a60ff7d69e88406a71a2f27e09008566Jan Engelhardt		.name          = "NOTRACK",
4147b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsik		.real_name     = "CT",
4157b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsik		.revision      = 2,
4167b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsik		.ext_flags     = XTABLES_EXT_ALIAS,
4177b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsik		.version       = XTABLES_VERSION,
4187b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsik		.size          = XT_ALIGN(sizeof(struct xt_ct_target_info_v1)),
4197b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsik		.userspacesize = offsetof(struct xt_ct_target_info_v1, ct),
4207b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsik		.init          = notrack_ct2_tg_init,
4217b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsik	},
4227b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsik	{
4237b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsik		.family        = NFPROTO_UNSPEC,
4247b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsik		.name          = "NOTRACK",
42550f19190a60ff7d69e88406a71a2f27e09008566Jan Engelhardt		.revision      = 0,
42650f19190a60ff7d69e88406a71a2f27e09008566Jan Engelhardt		.version       = XTABLES_VERSION,
42750f19190a60ff7d69e88406a71a2f27e09008566Jan Engelhardt	},
4289fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy};
4299fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy
4309fdbaa71452edaac9d5906716c15937f670341faPatrick McHardyvoid _init(void)
4319fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy{
432e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso	xtables_register_targets(ct_target_reg, ARRAY_SIZE(ct_target_reg));
4339fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy}
434