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"
199fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy" --zone ID			Assign/Lookup connection in zone ID\n"
209fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy	);
219fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy}
229fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy
23e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayusostatic void ct_help_v1(void)
24e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso{
25e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso	printf(
26e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso"CT target options:\n"
27e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso" --notrack			Don't track connection\n"
28e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso" --helper name			Use conntrack helper 'name' for connection\n"
29e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso" --timeout name 		Use timeout policy 'name' for connection\n"
30e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso" --ctevents event[,event...]	Generate specified conntrack events for connection\n"
31e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso" --expevents event[,event...]	Generate specified expectation events for connection\n"
32e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso" --zone ID			Assign/Lookup connection in zone ID\n"
33e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso	);
34e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso}
35e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso
36a05562e1e2fb2e18f34d29ec57c4217a3014d1f2Jan Engelhardtenum {
37a05562e1e2fb2e18f34d29ec57c4217a3014d1f2Jan Engelhardt	O_NOTRACK = 0,
38a05562e1e2fb2e18f34d29ec57c4217a3014d1f2Jan Engelhardt	O_HELPER,
39e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso	O_TIMEOUT,
40a05562e1e2fb2e18f34d29ec57c4217a3014d1f2Jan Engelhardt	O_CTEVENTS,
41a05562e1e2fb2e18f34d29ec57c4217a3014d1f2Jan Engelhardt	O_EXPEVENTS,
42a05562e1e2fb2e18f34d29ec57c4217a3014d1f2Jan Engelhardt	O_ZONE,
439fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy};
449fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy
45a05562e1e2fb2e18f34d29ec57c4217a3014d1f2Jan Engelhardt#define s struct xt_ct_target_info
46a05562e1e2fb2e18f34d29ec57c4217a3014d1f2Jan Engelhardtstatic const struct xt_option_entry ct_opts[] = {
47a05562e1e2fb2e18f34d29ec57c4217a3014d1f2Jan Engelhardt	{.name = "notrack", .id = O_NOTRACK, .type = XTTYPE_NONE},
48a05562e1e2fb2e18f34d29ec57c4217a3014d1f2Jan Engelhardt	{.name = "helper", .id = O_HELPER, .type = XTTYPE_STRING,
49a05562e1e2fb2e18f34d29ec57c4217a3014d1f2Jan Engelhardt	 .flags = XTOPT_PUT, XTOPT_POINTER(s, helper)},
50a05562e1e2fb2e18f34d29ec57c4217a3014d1f2Jan Engelhardt	{.name = "ctevents", .id = O_CTEVENTS, .type = XTTYPE_STRING},
51a05562e1e2fb2e18f34d29ec57c4217a3014d1f2Jan Engelhardt	{.name = "expevents", .id = O_EXPEVENTS, .type = XTTYPE_STRING},
52a05562e1e2fb2e18f34d29ec57c4217a3014d1f2Jan Engelhardt	{.name = "zone", .id = O_ZONE, .type = XTTYPE_UINT16,
53a05562e1e2fb2e18f34d29ec57c4217a3014d1f2Jan Engelhardt	 .flags = XTOPT_PUT, XTOPT_POINTER(s, zone)},
54a05562e1e2fb2e18f34d29ec57c4217a3014d1f2Jan Engelhardt	XTOPT_TABLEEND,
559fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy};
56a05562e1e2fb2e18f34d29ec57c4217a3014d1f2Jan Engelhardt#undef s
579fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy
58e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso#define s struct xt_ct_target_info_v1
59e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayusostatic const struct xt_option_entry ct_opts_v1[] = {
60e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso	{.name = "notrack", .id = O_NOTRACK, .type = XTTYPE_NONE},
61e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso	{.name = "helper", .id = O_HELPER, .type = XTTYPE_STRING,
62e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso	 .flags = XTOPT_PUT, XTOPT_POINTER(s, helper)},
63e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso	{.name = "timeout", .id = O_TIMEOUT, .type = XTTYPE_STRING,
64e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso	 .flags = XTOPT_PUT, XTOPT_POINTER(s, timeout)},
65e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso	{.name = "ctevents", .id = O_CTEVENTS, .type = XTTYPE_STRING},
66e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso	{.name = "expevents", .id = O_EXPEVENTS, .type = XTTYPE_STRING},
67e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso	{.name = "zone", .id = O_ZONE, .type = XTTYPE_UINT16,
68e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso	 .flags = XTOPT_PUT, XTOPT_POINTER(s, zone)},
69e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso	XTOPT_TABLEEND,
70e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso};
71e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso#undef s
72e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso
739fdbaa71452edaac9d5906716c15937f670341faPatrick McHardystruct event_tbl {
749fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy	const char	*name;
759fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy	unsigned int	event;
769fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy};
779fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy
789fdbaa71452edaac9d5906716c15937f670341faPatrick McHardystatic const struct event_tbl ct_event_tbl[] = {
799fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy	{ "new",		IPCT_NEW },
809fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy	{ "related",		IPCT_RELATED },
819fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy	{ "destroy",		IPCT_DESTROY },
829fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy	{ "reply",		IPCT_REPLY },
839fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy	{ "assured",		IPCT_ASSURED },
849fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy	{ "protoinfo",		IPCT_PROTOINFO },
859fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy	{ "helper",		IPCT_HELPER },
869fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy	{ "mark",		IPCT_MARK },
879fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy	{ "natseqinfo",		IPCT_NATSEQADJ },
889fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy	{ "secmark",		IPCT_SECMARK },
899fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy};
909fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy
919fdbaa71452edaac9d5906716c15937f670341faPatrick McHardystatic const struct event_tbl exp_event_tbl[] = {
929fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy	{ "new",		IPEXP_NEW },
939fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy};
949fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy
959fdbaa71452edaac9d5906716c15937f670341faPatrick McHardystatic uint32_t ct_parse_events(const struct event_tbl *tbl, unsigned int size,
969fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy				const char *events)
979fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy{
989fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy	char str[strlen(events) + 1], *e = str, *t;
999fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy	unsigned int mask = 0, i;
1009fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy
1019fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy	strcpy(str, events);
1029fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy	while ((t = strsep(&e, ","))) {
1039fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy		for (i = 0; i < size; i++) {
104bed2ba957d545b50c3eae6fb28fc0decadbc0dcbPablo Neira Ayuso			if (strcmp(t, tbl[i].name))
1059fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy				continue;
106bed2ba957d545b50c3eae6fb28fc0decadbc0dcbPablo Neira Ayuso			mask |= 1 << tbl[i].event;
1079fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy			break;
1089fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy		}
1099fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy
1109fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy		if (i == size)
1119fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy			xtables_error(PARAMETER_PROBLEM, "Unknown event type \"%s\"", t);
1129fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy	}
1139fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy
1149fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy	return mask;
1159fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy}
1169fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy
1179fdbaa71452edaac9d5906716c15937f670341faPatrick McHardystatic void ct_print_events(const char *pfx, const struct event_tbl *tbl,
1189fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy			    unsigned int size, uint32_t mask)
1199fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy{
1209fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy	const char *sep = "";
1219fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy	unsigned int i;
1229fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy
12373866357e4a7a0fdc1b293bf8863fee2bd56da9eJan Engelhardt	printf(" %s ", pfx);
1249fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy	for (i = 0; i < size; i++) {
1259fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy		if (mask & (1 << tbl[i].event)) {
1269fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy			printf("%s%s", sep, tbl[i].name);
1279fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy			sep = ",";
1289fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy		}
1299fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy	}
1309fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy}
1319fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy
132a05562e1e2fb2e18f34d29ec57c4217a3014d1f2Jan Engelhardtstatic void ct_parse(struct xt_option_call *cb)
1339fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy{
134a05562e1e2fb2e18f34d29ec57c4217a3014d1f2Jan Engelhardt	struct xt_ct_target_info *info = cb->data;
1359fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy
136a05562e1e2fb2e18f34d29ec57c4217a3014d1f2Jan Engelhardt	xtables_option_parse(cb);
137a05562e1e2fb2e18f34d29ec57c4217a3014d1f2Jan Engelhardt	switch (cb->entry->id) {
138a05562e1e2fb2e18f34d29ec57c4217a3014d1f2Jan Engelhardt	case O_NOTRACK:
1399fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy		info->flags |= XT_CT_NOTRACK;
1409fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy		break;
141a05562e1e2fb2e18f34d29ec57c4217a3014d1f2Jan Engelhardt	case O_CTEVENTS:
142a05562e1e2fb2e18f34d29ec57c4217a3014d1f2Jan Engelhardt		info->ct_events = ct_parse_events(ct_event_tbl, ARRAY_SIZE(ct_event_tbl), cb->arg);
1439fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy		break;
144a05562e1e2fb2e18f34d29ec57c4217a3014d1f2Jan Engelhardt	case O_EXPEVENTS:
145a05562e1e2fb2e18f34d29ec57c4217a3014d1f2Jan Engelhardt		info->exp_events = ct_parse_events(exp_event_tbl, ARRAY_SIZE(exp_event_tbl), cb->arg);
1469fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy		break;
1479fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy	}
1489fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy}
1499fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy
150e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayusostatic void ct_parse_v1(struct xt_option_call *cb)
151e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso{
152e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso	struct xt_ct_target_info_v1 *info = cb->data;
153e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso
154e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso	xtables_option_parse(cb);
155e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso	switch (cb->entry->id) {
156e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso	case O_NOTRACK:
157e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso		info->flags |= XT_CT_NOTRACK;
158e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso		break;
159e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso	case O_CTEVENTS:
160e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso		info->ct_events = ct_parse_events(ct_event_tbl,
161e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso						  ARRAY_SIZE(ct_event_tbl),
162e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso						  cb->arg);
163e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso		break;
164e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso	case O_EXPEVENTS:
165e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso		info->exp_events = ct_parse_events(exp_event_tbl,
166e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso						   ARRAY_SIZE(exp_event_tbl),
167e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso						   cb->arg);
168e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso		break;
169e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso	}
170e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso}
171e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso
1729fdbaa71452edaac9d5906716c15937f670341faPatrick McHardystatic void ct_print(const void *ip, const struct xt_entry_target *target, int numeric)
1739fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy{
1749fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy	const struct xt_ct_target_info *info =
1759fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy		(const struct xt_ct_target_info *)target->data;
1769fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy
17773866357e4a7a0fdc1b293bf8863fee2bd56da9eJan Engelhardt	printf(" CT");
1789fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy	if (info->flags & XT_CT_NOTRACK)
17973866357e4a7a0fdc1b293bf8863fee2bd56da9eJan Engelhardt		printf(" notrack");
1809fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy	if (info->helper[0])
18173866357e4a7a0fdc1b293bf8863fee2bd56da9eJan Engelhardt		printf(" helper %s", info->helper);
1829fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy	if (info->ct_events)
1839fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy		ct_print_events("ctevents", ct_event_tbl,
1849fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy				ARRAY_SIZE(ct_event_tbl), info->ct_events);
1859fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy	if (info->exp_events)
1869fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy		ct_print_events("expevents", exp_event_tbl,
1879fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy				ARRAY_SIZE(exp_event_tbl), info->exp_events);
1889f27e6b6f8638bde93e9901e999287ad5118f17cPatrick McHardy	if (info->zone)
1899f27e6b6f8638bde93e9901e999287ad5118f17cPatrick McHardy		printf("zone %u ", info->zone);
1909fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy}
1919fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy
192e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayusostatic void
193e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayusoct_print_v1(const void *ip, const struct xt_entry_target *target, int numeric)
194e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso{
195e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso	const struct xt_ct_target_info_v1 *info =
196e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso		(const struct xt_ct_target_info_v1 *)target->data;
197e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso
1987b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsik	if (info->flags & XT_CT_NOTRACK_ALIAS) {
1997b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsik		printf (" NOTRACK");
2007b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsik		return;
2017b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsik	}
202e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso	printf(" CT");
203e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso	if (info->flags & XT_CT_NOTRACK)
204e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso		printf(" notrack");
205e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso	if (info->helper[0])
206e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso		printf(" helper %s", info->helper);
207e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso	if (info->timeout[0])
208e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso		printf(" timeout %s", info->timeout);
209e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso	if (info->ct_events)
210e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso		ct_print_events("ctevents", ct_event_tbl,
211e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso				ARRAY_SIZE(ct_event_tbl), info->ct_events);
212e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso	if (info->exp_events)
213e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso		ct_print_events("expevents", exp_event_tbl,
214e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso				ARRAY_SIZE(exp_event_tbl), info->exp_events);
215e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso	if (info->zone)
216e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso		printf("zone %u ", info->zone);
217e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso}
218e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso
2199fdbaa71452edaac9d5906716c15937f670341faPatrick McHardystatic void ct_save(const void *ip, const struct xt_entry_target *target)
2209fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy{
2219fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy	const struct xt_ct_target_info *info =
2229fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy		(const struct xt_ct_target_info *)target->data;
2239fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy
2247b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsik	if (info->flags & XT_CT_NOTRACK_ALIAS)
2257b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsik		return;
2269fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy	if (info->flags & XT_CT_NOTRACK)
22773866357e4a7a0fdc1b293bf8863fee2bd56da9eJan Engelhardt		printf(" --notrack");
2289fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy	if (info->helper[0])
22973866357e4a7a0fdc1b293bf8863fee2bd56da9eJan Engelhardt		printf(" --helper %s", info->helper);
2309fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy	if (info->ct_events)
2319fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy		ct_print_events("--ctevents", ct_event_tbl,
2329fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy				ARRAY_SIZE(ct_event_tbl), info->ct_events);
2339fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy	if (info->exp_events)
2349fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy		ct_print_events("--expevents", exp_event_tbl,
2359fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy				ARRAY_SIZE(exp_event_tbl), info->exp_events);
2369f27e6b6f8638bde93e9901e999287ad5118f17cPatrick McHardy	if (info->zone)
23773866357e4a7a0fdc1b293bf8863fee2bd56da9eJan Engelhardt		printf(" --zone %u", info->zone);
2389fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy}
2399fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy
240e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayusostatic void ct_save_v1(const void *ip, const struct xt_entry_target *target)
241e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso{
242e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso	const struct xt_ct_target_info_v1 *info =
243e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso		(const struct xt_ct_target_info_v1 *)target->data;
244e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso
2457b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsik	if (info->flags & XT_CT_NOTRACK_ALIAS)
2467b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsik		return;
247e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso	if (info->flags & XT_CT_NOTRACK)
248e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso		printf(" --notrack");
249e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso	if (info->helper[0])
250e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso		printf(" --helper %s", info->helper);
251e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso	if (info->timeout[0])
252e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso		printf(" --timeout %s", info->timeout);
253e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso	if (info->ct_events)
254e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso		ct_print_events("--ctevents", ct_event_tbl,
255e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso				ARRAY_SIZE(ct_event_tbl), info->ct_events);
256e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso	if (info->exp_events)
257e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso		ct_print_events("--expevents", exp_event_tbl,
258e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso				ARRAY_SIZE(exp_event_tbl), info->exp_events);
259e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso	if (info->zone)
260e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso		printf(" --zone %u", info->zone);
261e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso}
262e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso
2637b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsikstatic const char *
2647b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsikct_print_name_alias(const struct xt_entry_target *target)
2657b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsik{
2667b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsik	struct xt_ct_target_info *info = (void *)target->data;
2677b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsik
2687b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsik	return info->flags & XT_CT_NOTRACK_ALIAS ? "NOTRACK" : "CT";
2697b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsik}
2707b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsik
27150f19190a60ff7d69e88406a71a2f27e09008566Jan Engelhardtstatic void notrack_ct0_tg_init(struct xt_entry_target *target)
27250f19190a60ff7d69e88406a71a2f27e09008566Jan Engelhardt{
27350f19190a60ff7d69e88406a71a2f27e09008566Jan Engelhardt	struct xt_ct_target_info *info = (void *)target->data;
27450f19190a60ff7d69e88406a71a2f27e09008566Jan Engelhardt
27550f19190a60ff7d69e88406a71a2f27e09008566Jan Engelhardt	info->flags = XT_CT_NOTRACK;
27650f19190a60ff7d69e88406a71a2f27e09008566Jan Engelhardt}
27750f19190a60ff7d69e88406a71a2f27e09008566Jan Engelhardt
27850f19190a60ff7d69e88406a71a2f27e09008566Jan Engelhardtstatic void notrack_ct1_tg_init(struct xt_entry_target *target)
27950f19190a60ff7d69e88406a71a2f27e09008566Jan Engelhardt{
28050f19190a60ff7d69e88406a71a2f27e09008566Jan Engelhardt	struct xt_ct_target_info_v1 *info = (void *)target->data;
28150f19190a60ff7d69e88406a71a2f27e09008566Jan Engelhardt
28250f19190a60ff7d69e88406a71a2f27e09008566Jan Engelhardt	info->flags = XT_CT_NOTRACK;
28350f19190a60ff7d69e88406a71a2f27e09008566Jan Engelhardt}
28450f19190a60ff7d69e88406a71a2f27e09008566Jan Engelhardt
2857b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsikstatic void notrack_ct2_tg_init(struct xt_entry_target *target)
2867b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsik{
2877b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsik	struct xt_ct_target_info_v1 *info = (void *)target->data;
2887b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsik
2897b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsik	info->flags = XT_CT_NOTRACK | XT_CT_NOTRACK_ALIAS;
2907b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsik}
2917b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsik
292e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayusostatic struct xtables_target ct_target_reg[] = {
293e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso	{
294e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso		.family		= NFPROTO_UNSPEC,
295e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso		.name		= "CT",
296e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso		.version	= XTABLES_VERSION,
297e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso		.size		= XT_ALIGN(sizeof(struct xt_ct_target_info)),
298e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso		.userspacesize	= offsetof(struct xt_ct_target_info, ct),
299e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso		.help		= ct_help,
300e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso		.print		= ct_print,
301e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso		.save		= ct_save,
302e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso		.x6_parse	= ct_parse,
303e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso		.x6_options	= ct_opts,
304e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso	},
305e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso	{
306e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso		.family		= NFPROTO_UNSPEC,
307e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso		.name		= "CT",
308e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso		.revision	= 1,
309e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso		.version	= XTABLES_VERSION,
310e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso		.size		= XT_ALIGN(sizeof(struct xt_ct_target_info_v1)),
311e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso		.userspacesize	= offsetof(struct xt_ct_target_info_v1, ct),
312e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso		.help		= ct_help_v1,
313e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso		.print		= ct_print_v1,
314e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso		.save		= ct_save_v1,
315e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso		.x6_parse	= ct_parse_v1,
316e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso		.x6_options	= ct_opts_v1,
317e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso	},
31850f19190a60ff7d69e88406a71a2f27e09008566Jan Engelhardt	{
3197b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsik		.family		= NFPROTO_UNSPEC,
3207b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsik		.name		= "CT",
3217b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsik		.revision	= 2,
3227b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsik		.version	= XTABLES_VERSION,
3237b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsik		.size		= XT_ALIGN(sizeof(struct xt_ct_target_info_v1)),
3247b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsik		.userspacesize	= offsetof(struct xt_ct_target_info_v1, ct),
3257b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsik		.help		= ct_help_v1,
3267b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsik		.print		= ct_print_v1,
3277b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsik		.save		= ct_save_v1,
3287b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsik		.alias		= ct_print_name_alias,
3297b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsik		.x6_parse	= ct_parse_v1,
3307b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsik		.x6_options	= ct_opts_v1,
3317b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsik	},
3327b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsik	{
33350f19190a60ff7d69e88406a71a2f27e09008566Jan Engelhardt		.family        = NFPROTO_UNSPEC,
33450f19190a60ff7d69e88406a71a2f27e09008566Jan Engelhardt		.name          = "NOTRACK",
33550f19190a60ff7d69e88406a71a2f27e09008566Jan Engelhardt		.real_name     = "CT",
33650f19190a60ff7d69e88406a71a2f27e09008566Jan Engelhardt		.revision      = 0,
33750f19190a60ff7d69e88406a71a2f27e09008566Jan Engelhardt		.version       = XTABLES_VERSION,
33850f19190a60ff7d69e88406a71a2f27e09008566Jan Engelhardt		.size          = XT_ALIGN(sizeof(struct xt_ct_target_info)),
33950f19190a60ff7d69e88406a71a2f27e09008566Jan Engelhardt		.userspacesize = offsetof(struct xt_ct_target_info, ct),
34050f19190a60ff7d69e88406a71a2f27e09008566Jan Engelhardt		.init          = notrack_ct0_tg_init,
34150f19190a60ff7d69e88406a71a2f27e09008566Jan Engelhardt	},
34250f19190a60ff7d69e88406a71a2f27e09008566Jan Engelhardt	{
34350f19190a60ff7d69e88406a71a2f27e09008566Jan Engelhardt		.family        = NFPROTO_UNSPEC,
34450f19190a60ff7d69e88406a71a2f27e09008566Jan Engelhardt		.name          = "NOTRACK",
34550f19190a60ff7d69e88406a71a2f27e09008566Jan Engelhardt		.real_name     = "CT",
34650f19190a60ff7d69e88406a71a2f27e09008566Jan Engelhardt		.revision      = 1,
34750f19190a60ff7d69e88406a71a2f27e09008566Jan Engelhardt		.version       = XTABLES_VERSION,
34850f19190a60ff7d69e88406a71a2f27e09008566Jan Engelhardt		.size          = XT_ALIGN(sizeof(struct xt_ct_target_info_v1)),
34950f19190a60ff7d69e88406a71a2f27e09008566Jan Engelhardt		.userspacesize = offsetof(struct xt_ct_target_info_v1, ct),
35050f19190a60ff7d69e88406a71a2f27e09008566Jan Engelhardt		.init          = notrack_ct1_tg_init,
35150f19190a60ff7d69e88406a71a2f27e09008566Jan Engelhardt	},
35250f19190a60ff7d69e88406a71a2f27e09008566Jan Engelhardt	{
35350f19190a60ff7d69e88406a71a2f27e09008566Jan Engelhardt		.family        = NFPROTO_UNSPEC,
35450f19190a60ff7d69e88406a71a2f27e09008566Jan Engelhardt		.name          = "NOTRACK",
3557b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsik		.real_name     = "CT",
3567b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsik		.revision      = 2,
3577b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsik		.ext_flags     = XTABLES_EXT_ALIAS,
3587b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsik		.version       = XTABLES_VERSION,
3597b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsik		.size          = XT_ALIGN(sizeof(struct xt_ct_target_info_v1)),
3607b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsik		.userspacesize = offsetof(struct xt_ct_target_info_v1, ct),
3617b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsik		.init          = notrack_ct2_tg_init,
3627b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsik	},
3637b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsik	{
3647b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsik		.family        = NFPROTO_UNSPEC,
3657b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsik		.name          = "NOTRACK",
36650f19190a60ff7d69e88406a71a2f27e09008566Jan Engelhardt		.revision      = 0,
36750f19190a60ff7d69e88406a71a2f27e09008566Jan Engelhardt		.version       = XTABLES_VERSION,
36850f19190a60ff7d69e88406a71a2f27e09008566Jan Engelhardt	},
3699fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy};
3709fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy
3719fdbaa71452edaac9d5906716c15937f670341faPatrick McHardyvoid _init(void)
3729fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy{
373e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso	xtables_register_targets(ct_target_reg, ARRAY_SIZE(ct_target_reg));
3749fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy}
375