libxt_connmark.c revision 69f564e3890976461de0016cd81171ff8bfa8353
1469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte/* Shared library add-on to iptables to add connmark matching support.
2469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte *
3469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte * (C) 2002,2004 MARA Systems AB <http://www.marasystems.com>
4469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte * by Henrik Nordstrom <hno@marasystems.com>
5469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte *
6469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte * Version 1.1
7469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte *
8469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte * This program is free software; you can redistribute it and/or modify
9469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte * it under the terms of the GNU General Public License as published by
10469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte * the Free Software Foundation; either version 2 of the License, or
11469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte * (at your option) any later version.
12469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte *
13469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte * This program is distributed in the hope that it will be useful,
14469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte * but WITHOUT ANY WARRANTY; without even the implied warranty of
15469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte * GNU General Public License for more details.
17469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte *
18469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte * You should have received a copy of the GNU General Public License
19469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte * along with this program; if not, write to the Free Software
20469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
21469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte */
22469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte#include <stdio.h>
23469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte#include <netdb.h>
24469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte#include <string.h>
25469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte#include <stdlib.h>
26469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte#include <getopt.h>
27469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte
28c57c155312a544482a6b8a3c0f7224b00cfaae20Yasuyuki KOZAKAI#include <xtables.h>
29c57c155312a544482a6b8a3c0f7224b00cfaae20Yasuyuki KOZAKAI#include <linux/netfilter/xt_connmark.h>
30469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte
31a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardtenum {
32a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt	F_MARK = 1 << 0,
33a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt};
34a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt
35a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardtstatic void connmark_mt_help(void)
36469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte{
37469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte	printf(
38a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt"connmark match options:\n"
398b7c64d6ba156a99008fcd810cba874c73294333Jan Engelhardt"[!] --mark value[/mask]    Match ctmark value with optional mask\n");
40469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte}
41469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte
42a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardtstatic const struct option connmark_mt_opts[] = {
43a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt	{.name = "mark", .has_arg = true, .val = '1'},
449ee386a1b6d7704b259460152c959ab0e79e02aaMax Kellermann	{ .name = NULL }
45469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte};
46469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte
47a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardtstatic int
48a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardtconnmark_mt_parse(int c, char **argv, int invert, unsigned int *flags,
49a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt                  const void *entry, struct xt_entry_match **match)
50a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt{
51a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt	struct xt_connmark_mtinfo1 *info = (void *)(*match)->data;
52a80975497968e69b23f56bf15d346c65bec381f2Jan Engelhardt	unsigned int mark, mask = UINT32_MAX;
53a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt	char *end;
54a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt
55a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt	switch (c) {
56a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt	case '1': /* --mark */
57a41545ca7cde43e0ba53260ba74bd9bf74025a68Jan Engelhardt		xtables_param_act(XTF_ONLY_ONCE, "connmark", "--mark", *flags & F_MARK);
585f2922cfc0bbfbeb878f5c12e9fb3eb602ae5507Jan Engelhardt		if (!xtables_strtoui(optarg, &end, &mark, 0, UINT32_MAX))
59a41545ca7cde43e0ba53260ba74bd9bf74025a68Jan Engelhardt			xtables_param_act(XTF_BAD_VALUE, "connmark", "--mark", optarg);
60a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt		if (*end == '/')
615f2922cfc0bbfbeb878f5c12e9fb3eb602ae5507Jan Engelhardt			if (!xtables_strtoui(end + 1, &end, &mask, 0, UINT32_MAX))
62a41545ca7cde43e0ba53260ba74bd9bf74025a68Jan Engelhardt				xtables_param_act(XTF_BAD_VALUE, "connmark", "--mark", optarg);
63a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt		if (*end != '\0')
64a41545ca7cde43e0ba53260ba74bd9bf74025a68Jan Engelhardt			xtables_param_act(XTF_BAD_VALUE, "connmark", "--mark", optarg);
65a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt
66a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt		if (invert)
67a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt			info->invert = true;
68a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt		info->mark = mark;
69a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt		info->mask = mask;
70a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt		*flags    |= F_MARK;
71a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt		return true;
72a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt	}
73a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt	return false;
74a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt}
75a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt
76469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Weltestatic int
77181dead3f13befe02769ef479bcbb51801b7fc4eJan Engelhardtconnmark_parse(int c, char **argv, int invert, unsigned int *flags,
78181dead3f13befe02769ef479bcbb51801b7fc4eJan Engelhardt               const void *entry, struct xt_entry_match **match)
79469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte{
80c57c155312a544482a6b8a3c0f7224b00cfaae20Yasuyuki KOZAKAI	struct xt_connmark_info *markinfo = (struct xt_connmark_info *)(*match)->data;
81469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte
82469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte	switch (c) {
83469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte		char *end;
84469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte	case '1':
850f16c725aadaac7e670d632ecbaea3661ff00827Jan Engelhardt		xtables_check_inverse(optarg, &invert, &optind, 0);
86469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte
87469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte		markinfo->mark = strtoul(optarg, &end, 0);
88469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte		markinfo->mask = 0xffffffffUL;
89469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte
90469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte		if (*end == '/')
91469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte			markinfo->mask = strtoul(end+1, &end, 0);
92469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte
93469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte		if (*end != '\0' || end == optarg)
941829ed482efbc8b390cc760d012b3a4450494e1aJan Engelhardt			xtables_error(PARAMETER_PROBLEM, "Bad MARK value \"%s\"", optarg);
95469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte		if (invert)
96469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte			markinfo->invert = 1;
97469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte		*flags = 1;
98469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte		break;
99469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte
100469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte	default:
101469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte		return 0;
102469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte	}
103469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte	return 1;
104469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte}
105469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte
106a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardtstatic void print_mark(unsigned int mark, unsigned int mask)
107469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte{
108a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt	if (mask != 0xffffffffU)
109a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt		printf("0x%x/0x%x ", mark, mask);
110469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte	else
111a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt		printf("0x%x ", mark);
112469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte}
113469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte
114a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardtstatic void connmark_mt_check(unsigned int flags)
115469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte{
116a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt	if (flags == 0)
1171829ed482efbc8b390cc760d012b3a4450494e1aJan Engelhardt		xtables_error(PARAMETER_PROBLEM,
118a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt		           "connmark: The --mark option is required");
119469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte}
120469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte
121469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Weltestatic void
122181dead3f13befe02769ef479bcbb51801b7fc4eJan Engelhardtconnmark_print(const void *ip, const struct xt_entry_match *match, int numeric)
123469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte{
12469f564e3890976461de0016cd81171ff8bfa8353Jan Engelhardt	const struct xt_connmark_info *info = (const void *)match->data;
125469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte
126469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte	printf("CONNMARK match ");
127469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte	if (info->invert)
128469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte		printf("!");
129a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt	print_mark(info->mark, info->mask);
130a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt}
131a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt
132a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardtstatic void
133a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardtconnmark_mt_print(const void *ip, const struct xt_entry_match *match, int numeric)
134a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt{
135a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt	const struct xt_connmark_mtinfo1 *info = (const void *)match->data;
136a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt
137a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt	printf("connmark match ");
138a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt	if (info->invert)
139a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt		printf("!");
140a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt	print_mark(info->mark, info->mask);
141469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte}
142469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte
143181dead3f13befe02769ef479bcbb51801b7fc4eJan Engelhardtstatic void connmark_save(const void *ip, const struct xt_entry_match *match)
144469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte{
14569f564e3890976461de0016cd81171ff8bfa8353Jan Engelhardt	const struct xt_connmark_info *info = (const void *)match->data;
146469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte
147469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte	if (info->invert)
148469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte		printf("! ");
149469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte
150469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte	printf("--mark ");
151a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt	print_mark(info->mark, info->mask);
152a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt}
153a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt
154a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardtstatic void
155a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardtconnmark_mt_save(const void *ip, const struct xt_entry_match *match)
156a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt{
157a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt	const struct xt_connmark_mtinfo1 *info = (const void *)match->data;
158a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt
159a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt	if (info->invert)
160a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt		printf("! ");
161a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt
162a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt	printf("--mark ");
163a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt	print_mark(info->mark, info->mask);
164469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte}
165469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte
166a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardtstatic struct xtables_match connmark_mt_reg_v0 = {
16703d99486d8283552705b58dc55b6085dffc38792Jan Engelhardt	.family		= NFPROTO_IPV4,
168c57c155312a544482a6b8a3c0f7224b00cfaae20Yasuyuki KOZAKAI	.name		= "connmark",
169a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt	.revision	= 0,
1708b7c64d6ba156a99008fcd810cba874c73294333Jan Engelhardt	.version	= XTABLES_VERSION,
171c57c155312a544482a6b8a3c0f7224b00cfaae20Yasuyuki KOZAKAI	.size		= XT_ALIGN(sizeof(struct xt_connmark_info)),
172c57c155312a544482a6b8a3c0f7224b00cfaae20Yasuyuki KOZAKAI	.userspacesize	= XT_ALIGN(sizeof(struct xt_connmark_info)),
173a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt	.help		= connmark_mt_help,
174181dead3f13befe02769ef479bcbb51801b7fc4eJan Engelhardt	.parse		= connmark_parse,
175a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt	.final_check	= connmark_mt_check,
176181dead3f13befe02769ef479bcbb51801b7fc4eJan Engelhardt	.print		= connmark_print,
177181dead3f13befe02769ef479bcbb51801b7fc4eJan Engelhardt	.save		= connmark_save,
178a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt	.extra_opts	= connmark_mt_opts,
179c57c155312a544482a6b8a3c0f7224b00cfaae20Yasuyuki KOZAKAI};
180c57c155312a544482a6b8a3c0f7224b00cfaae20Yasuyuki KOZAKAI
181a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardtstatic struct xtables_match connmark_mt6_reg_v0 = {
18203d99486d8283552705b58dc55b6085dffc38792Jan Engelhardt	.family		= NFPROTO_IPV6,
183c57c155312a544482a6b8a3c0f7224b00cfaae20Yasuyuki KOZAKAI	.name		= "connmark",
184a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt	.revision	= 0,
1858b7c64d6ba156a99008fcd810cba874c73294333Jan Engelhardt	.version	= XTABLES_VERSION,
186c57c155312a544482a6b8a3c0f7224b00cfaae20Yasuyuki KOZAKAI	.size		= XT_ALIGN(sizeof(struct xt_connmark_info)),
187c57c155312a544482a6b8a3c0f7224b00cfaae20Yasuyuki KOZAKAI	.userspacesize	= XT_ALIGN(sizeof(struct xt_connmark_info)),
188a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt	.help		= connmark_mt_help,
189181dead3f13befe02769ef479bcbb51801b7fc4eJan Engelhardt	.parse		= connmark_parse,
190a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt	.final_check	= connmark_mt_check,
191181dead3f13befe02769ef479bcbb51801b7fc4eJan Engelhardt	.print		= connmark_print,
192181dead3f13befe02769ef479bcbb51801b7fc4eJan Engelhardt	.save		= connmark_save,
193a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt	.extra_opts	= connmark_mt_opts,
194a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt};
195a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt
196a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardtstatic struct xtables_match connmark_mt_reg = {
1978b7c64d6ba156a99008fcd810cba874c73294333Jan Engelhardt	.version        = XTABLES_VERSION,
198a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt	.name           = "connmark",
199a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt	.revision       = 1,
20003d99486d8283552705b58dc55b6085dffc38792Jan Engelhardt	.family         = NFPROTO_IPV4,
201a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt	.size           = XT_ALIGN(sizeof(struct xt_connmark_mtinfo1)),
202a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt	.userspacesize  = XT_ALIGN(sizeof(struct xt_connmark_mtinfo1)),
203a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt	.help           = connmark_mt_help,
204a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt	.parse          = connmark_mt_parse,
205a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt	.final_check    = connmark_mt_check,
206a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt	.print          = connmark_mt_print,
207a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt	.save           = connmark_mt_save,
208a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt	.extra_opts     = connmark_mt_opts,
209a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt};
210a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt
211a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardtstatic struct xtables_match connmark_mt6_reg = {
2128b7c64d6ba156a99008fcd810cba874c73294333Jan Engelhardt	.version        = XTABLES_VERSION,
213a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt	.name           = "connmark",
214a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt	.revision       = 1,
21503d99486d8283552705b58dc55b6085dffc38792Jan Engelhardt	.family         = NFPROTO_IPV6,
216a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt	.size           = XT_ALIGN(sizeof(struct xt_connmark_mtinfo1)),
217a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt	.userspacesize  = XT_ALIGN(sizeof(struct xt_connmark_mtinfo1)),
218a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt	.help           = connmark_mt_help,
219a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt	.parse          = connmark_mt_parse,
220a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt	.final_check    = connmark_mt_check,
221a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt	.print          = connmark_mt_print,
222a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt	.save           = connmark_mt_save,
223a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt	.extra_opts     = connmark_mt_opts,
224469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte};
225469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte
226469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Weltevoid _init(void)
227469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte{
228a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt	xtables_register_match(&connmark_mt_reg_v0);
229a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt	xtables_register_match(&connmark_mt6_reg_v0);
230a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt	xtables_register_match(&connmark_mt_reg);
231a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt	xtables_register_match(&connmark_mt6_reg);
232469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte}
233