1f4b737fb0c52a95a48f2e313ed4cff43db720ad6Jan Engelhardt#include <stdbool.h>
2e6869a8f59d779ff4d5a0984c86d80db7078496Marc Boucher#include <stdio.h>
36e22228b00cc485282db16b9637315a60b6dbd10Yasuyuki KOZAKAI#include <xtables.h>
46e22228b00cc485282db16b9637315a60b6dbd10Yasuyuki KOZAKAI#include <linux/netfilter/xt_MARK.h>
5e6869a8f59d779ff4d5a0984c86d80db7078496Marc Boucher
6350661a6eb089f3e54e67e022db9e16ea280499fJan Engelhardt/* Version 0 */
7350661a6eb089f3e54e67e022db9e16ea280499fJan Engelhardtstruct xt_mark_target_info {
8350661a6eb089f3e54e67e022db9e16ea280499fJan Engelhardt	unsigned long mark;
9350661a6eb089f3e54e67e022db9e16ea280499fJan Engelhardt};
10350661a6eb089f3e54e67e022db9e16ea280499fJan Engelhardt
11350661a6eb089f3e54e67e022db9e16ea280499fJan Engelhardt/* Version 1 */
12350661a6eb089f3e54e67e022db9e16ea280499fJan Engelhardtenum {
13350661a6eb089f3e54e67e022db9e16ea280499fJan Engelhardt	XT_MARK_SET=0,
14350661a6eb089f3e54e67e022db9e16ea280499fJan Engelhardt	XT_MARK_AND,
15350661a6eb089f3e54e67e022db9e16ea280499fJan Engelhardt	XT_MARK_OR,
16350661a6eb089f3e54e67e022db9e16ea280499fJan Engelhardt};
17350661a6eb089f3e54e67e022db9e16ea280499fJan Engelhardt
18350661a6eb089f3e54e67e022db9e16ea280499fJan Engelhardtstruct xt_mark_target_info_v1 {
19350661a6eb089f3e54e67e022db9e16ea280499fJan Engelhardt	unsigned long mark;
207ac405297ec38449b30e3b05fd6bf2082fd3d803Jan Engelhardt	uint8_t mode;
21350661a6eb089f3e54e67e022db9e16ea280499fJan Engelhardt};
22350661a6eb089f3e54e67e022db9e16ea280499fJan Engelhardt
23f4b737fb0c52a95a48f2e313ed4cff43db720ad6Jan Engelhardtenum {
2460756e7f8be9242b606f1b5fbcb38f45e4de29c5Jan Engelhardt	O_SET_MARK = 0,
2560756e7f8be9242b606f1b5fbcb38f45e4de29c5Jan Engelhardt	O_AND_MARK,
2660756e7f8be9242b606f1b5fbcb38f45e4de29c5Jan Engelhardt	O_OR_MARK,
2760756e7f8be9242b606f1b5fbcb38f45e4de29c5Jan Engelhardt	O_XOR_MARK,
2860756e7f8be9242b606f1b5fbcb38f45e4de29c5Jan Engelhardt	O_SET_XMARK,
2960756e7f8be9242b606f1b5fbcb38f45e4de29c5Jan Engelhardt	F_SET_MARK  = 1 << O_SET_MARK,
3060756e7f8be9242b606f1b5fbcb38f45e4de29c5Jan Engelhardt	F_AND_MARK  = 1 << O_AND_MARK,
3160756e7f8be9242b606f1b5fbcb38f45e4de29c5Jan Engelhardt	F_OR_MARK   = 1 << O_OR_MARK,
3260756e7f8be9242b606f1b5fbcb38f45e4de29c5Jan Engelhardt	F_XOR_MARK  = 1 << O_XOR_MARK,
3360756e7f8be9242b606f1b5fbcb38f45e4de29c5Jan Engelhardt	F_SET_XMARK = 1 << O_SET_XMARK,
3460756e7f8be9242b606f1b5fbcb38f45e4de29c5Jan Engelhardt	F_ANY       = F_SET_MARK | F_AND_MARK | F_OR_MARK |
3560756e7f8be9242b606f1b5fbcb38f45e4de29c5Jan Engelhardt	              F_XOR_MARK | F_SET_XMARK,
36f4b737fb0c52a95a48f2e313ed4cff43db720ad6Jan Engelhardt};
37f4b737fb0c52a95a48f2e313ed4cff43db720ad6Jan Engelhardt
38932e648f38ac16b1ea14c1f66f23951388448c5aJan Engelhardtstatic void MARK_help(void)
39e6869a8f59d779ff4d5a0984c86d80db7078496Marc Boucher{
40e6869a8f59d779ff4d5a0984c86d80db7078496Marc Boucher	printf(
418b7c64d6ba156a99008fcd810cba874c73294333Jan Engelhardt"MARK target options:\n"
42e6869a8f59d779ff4d5a0984c86d80db7078496Marc Boucher"  --set-mark value                   Set nfmark value\n"
433aef54dce4f9bbe0b466478fd33a1d3131efbbb8Rusty Russell"  --and-mark value                   Binary AND the nfmark with value\n"
448b7c64d6ba156a99008fcd810cba874c73294333Jan Engelhardt"  --or-mark  value                   Binary OR  the nfmark with value\n");
45e6869a8f59d779ff4d5a0984c86d80db7078496Marc Boucher}
46e6869a8f59d779ff4d5a0984c86d80db7078496Marc Boucher
4760756e7f8be9242b606f1b5fbcb38f45e4de29c5Jan Engelhardtstatic const struct xt_option_entry MARK_opts[] = {
4860756e7f8be9242b606f1b5fbcb38f45e4de29c5Jan Engelhardt	{.name = "set-mark", .id = O_SET_MARK, .type = XTTYPE_UINT32,
4960756e7f8be9242b606f1b5fbcb38f45e4de29c5Jan Engelhardt	 .excl = F_ANY},
5060756e7f8be9242b606f1b5fbcb38f45e4de29c5Jan Engelhardt	{.name = "and-mark", .id = O_AND_MARK, .type = XTTYPE_UINT32,
5160756e7f8be9242b606f1b5fbcb38f45e4de29c5Jan Engelhardt	 .excl = F_ANY},
5260756e7f8be9242b606f1b5fbcb38f45e4de29c5Jan Engelhardt	{.name = "or-mark", .id = O_OR_MARK, .type = XTTYPE_UINT32,
5360756e7f8be9242b606f1b5fbcb38f45e4de29c5Jan Engelhardt	 .excl = F_ANY},
5460756e7f8be9242b606f1b5fbcb38f45e4de29c5Jan Engelhardt	XTOPT_TABLEEND,
55e6869a8f59d779ff4d5a0984c86d80db7078496Marc Boucher};
56e6869a8f59d779ff4d5a0984c86d80db7078496Marc Boucher
5760756e7f8be9242b606f1b5fbcb38f45e4de29c5Jan Engelhardtstatic const struct xt_option_entry mark_tg_opts[] = {
5860756e7f8be9242b606f1b5fbcb38f45e4de29c5Jan Engelhardt	{.name = "set-xmark", .id = O_SET_XMARK, .type = XTTYPE_MARKMASK32,
5960756e7f8be9242b606f1b5fbcb38f45e4de29c5Jan Engelhardt	 .excl = F_ANY},
6060756e7f8be9242b606f1b5fbcb38f45e4de29c5Jan Engelhardt	{.name = "set-mark", .id = O_SET_MARK, .type = XTTYPE_MARKMASK32,
6160756e7f8be9242b606f1b5fbcb38f45e4de29c5Jan Engelhardt	 .excl = F_ANY},
6260756e7f8be9242b606f1b5fbcb38f45e4de29c5Jan Engelhardt	{.name = "and-mark", .id = O_AND_MARK, .type = XTTYPE_UINT32,
6360756e7f8be9242b606f1b5fbcb38f45e4de29c5Jan Engelhardt	 .excl = F_ANY},
6460756e7f8be9242b606f1b5fbcb38f45e4de29c5Jan Engelhardt	{.name = "or-mark", .id = O_OR_MARK, .type = XTTYPE_UINT32,
6560756e7f8be9242b606f1b5fbcb38f45e4de29c5Jan Engelhardt	 .excl = F_ANY},
6660756e7f8be9242b606f1b5fbcb38f45e4de29c5Jan Engelhardt	{.name = "xor-mark", .id = O_XOR_MARK, .type = XTTYPE_UINT32,
6760756e7f8be9242b606f1b5fbcb38f45e4de29c5Jan Engelhardt	 .excl = F_ANY},
6860756e7f8be9242b606f1b5fbcb38f45e4de29c5Jan Engelhardt	XTOPT_TABLEEND,
69f4b737fb0c52a95a48f2e313ed4cff43db720ad6Jan Engelhardt};
70f4b737fb0c52a95a48f2e313ed4cff43db720ad6Jan Engelhardt
71f4b737fb0c52a95a48f2e313ed4cff43db720ad6Jan Engelhardtstatic void mark_tg_help(void)
72f4b737fb0c52a95a48f2e313ed4cff43db720ad6Jan Engelhardt{
73f4b737fb0c52a95a48f2e313ed4cff43db720ad6Jan Engelhardt	printf(
74f4b737fb0c52a95a48f2e313ed4cff43db720ad6Jan Engelhardt"MARK target options:\n"
75f4b737fb0c52a95a48f2e313ed4cff43db720ad6Jan Engelhardt"  --set-xmark value[/mask]  Clear bits in mask and XOR value into nfmark\n"
76f4b737fb0c52a95a48f2e313ed4cff43db720ad6Jan Engelhardt"  --set-mark value[/mask]   Clear bits in mask and OR value into nfmark\n"
77f4b737fb0c52a95a48f2e313ed4cff43db720ad6Jan Engelhardt"  --and-mark bits           Binary AND the nfmark with bits\n"
78f4b737fb0c52a95a48f2e313ed4cff43db720ad6Jan Engelhardt"  --or-mark bits            Binary OR the nfmark with bits\n"
79f4b737fb0c52a95a48f2e313ed4cff43db720ad6Jan Engelhardt"  --xor-mask bits           Binary XOR the nfmark with bits\n"
80f4b737fb0c52a95a48f2e313ed4cff43db720ad6Jan Engelhardt"\n");
81f4b737fb0c52a95a48f2e313ed4cff43db720ad6Jan Engelhardt}
82f4b737fb0c52a95a48f2e313ed4cff43db720ad6Jan Engelhardt
8360756e7f8be9242b606f1b5fbcb38f45e4de29c5Jan Engelhardtstatic void MARK_parse_v0(struct xt_option_call *cb)
84e6869a8f59d779ff4d5a0984c86d80db7078496Marc Boucher{
8560756e7f8be9242b606f1b5fbcb38f45e4de29c5Jan Engelhardt	struct xt_mark_target_info *markinfo = cb->data;
86e6869a8f59d779ff4d5a0984c86d80db7078496Marc Boucher
8760756e7f8be9242b606f1b5fbcb38f45e4de29c5Jan Engelhardt	xtables_option_parse(cb);
8860756e7f8be9242b606f1b5fbcb38f45e4de29c5Jan Engelhardt	switch (cb->entry->id) {
8960756e7f8be9242b606f1b5fbcb38f45e4de29c5Jan Engelhardt	case O_SET_MARK:
9060756e7f8be9242b606f1b5fbcb38f45e4de29c5Jan Engelhardt		markinfo->mark = cb->val.mark;
91e6869a8f59d779ff4d5a0984c86d80db7078496Marc Boucher		break;
9260756e7f8be9242b606f1b5fbcb38f45e4de29c5Jan Engelhardt	default:
931829ed482efbc8b390cc760d012b3a4450494e1aJan Engelhardt		xtables_error(PARAMETER_PROBLEM,
9460756e7f8be9242b606f1b5fbcb38f45e4de29c5Jan Engelhardt			   "MARK target: kernel too old for --%s",
9560756e7f8be9242b606f1b5fbcb38f45e4de29c5Jan Engelhardt			   cb->entry->name);
96e6869a8f59d779ff4d5a0984c86d80db7078496Marc Boucher	}
97e6869a8f59d779ff4d5a0984c86d80db7078496Marc Boucher}
98e6869a8f59d779ff4d5a0984c86d80db7078496Marc Boucher
9960756e7f8be9242b606f1b5fbcb38f45e4de29c5Jan Engelhardtstatic void MARK_check(struct xt_fcheck_call *cb)
100e6869a8f59d779ff4d5a0984c86d80db7078496Marc Boucher{
10160756e7f8be9242b606f1b5fbcb38f45e4de29c5Jan Engelhardt	if (cb->xflags == 0)
1021829ed482efbc8b390cc760d012b3a4450494e1aJan Engelhardt		xtables_error(PARAMETER_PROBLEM,
1033aef54dce4f9bbe0b466478fd33a1d3131efbbb8Rusty Russell		           "MARK target: Parameter --set/and/or-mark"
1043aef54dce4f9bbe0b466478fd33a1d3131efbbb8Rusty Russell			   " is required");
1053aef54dce4f9bbe0b466478fd33a1d3131efbbb8Rusty Russell}
1063aef54dce4f9bbe0b466478fd33a1d3131efbbb8Rusty Russell
10760756e7f8be9242b606f1b5fbcb38f45e4de29c5Jan Engelhardtstatic void MARK_parse_v1(struct xt_option_call *cb)
1083aef54dce4f9bbe0b466478fd33a1d3131efbbb8Rusty Russell{
10960756e7f8be9242b606f1b5fbcb38f45e4de29c5Jan Engelhardt	struct xt_mark_target_info_v1 *markinfo = cb->data;
1103aef54dce4f9bbe0b466478fd33a1d3131efbbb8Rusty Russell
11160756e7f8be9242b606f1b5fbcb38f45e4de29c5Jan Engelhardt	xtables_option_parse(cb);
11260756e7f8be9242b606f1b5fbcb38f45e4de29c5Jan Engelhardt	switch (cb->entry->id) {
11360756e7f8be9242b606f1b5fbcb38f45e4de29c5Jan Engelhardt	case O_SET_MARK:
1146e22228b00cc485282db16b9637315a60b6dbd10Yasuyuki KOZAKAI	        markinfo->mode = XT_MARK_SET;
1153aef54dce4f9bbe0b466478fd33a1d3131efbbb8Rusty Russell		break;
11660756e7f8be9242b606f1b5fbcb38f45e4de29c5Jan Engelhardt	case O_AND_MARK:
1176e22228b00cc485282db16b9637315a60b6dbd10Yasuyuki KOZAKAI	        markinfo->mode = XT_MARK_AND;
1183aef54dce4f9bbe0b466478fd33a1d3131efbbb8Rusty Russell		break;
11960756e7f8be9242b606f1b5fbcb38f45e4de29c5Jan Engelhardt	case O_OR_MARK:
1206e22228b00cc485282db16b9637315a60b6dbd10Yasuyuki KOZAKAI	        markinfo->mode = XT_MARK_OR;
1213aef54dce4f9bbe0b466478fd33a1d3131efbbb8Rusty Russell		break;
1223aef54dce4f9bbe0b466478fd33a1d3131efbbb8Rusty Russell	}
12360756e7f8be9242b606f1b5fbcb38f45e4de29c5Jan Engelhardt	markinfo->mark = cb->val.u32;
124e6869a8f59d779ff4d5a0984c86d80db7078496Marc Boucher}
125e6869a8f59d779ff4d5a0984c86d80db7078496Marc Boucher
12660756e7f8be9242b606f1b5fbcb38f45e4de29c5Jan Engelhardtstatic void mark_tg_parse(struct xt_option_call *cb)
127f4b737fb0c52a95a48f2e313ed4cff43db720ad6Jan Engelhardt{
12860756e7f8be9242b606f1b5fbcb38f45e4de29c5Jan Engelhardt	struct xt_mark_tginfo2 *info = cb->data;
129f4b737fb0c52a95a48f2e313ed4cff43db720ad6Jan Engelhardt
13060756e7f8be9242b606f1b5fbcb38f45e4de29c5Jan Engelhardt	xtables_option_parse(cb);
13160756e7f8be9242b606f1b5fbcb38f45e4de29c5Jan Engelhardt	switch (cb->entry->id) {
13260756e7f8be9242b606f1b5fbcb38f45e4de29c5Jan Engelhardt	case O_SET_XMARK:
13360756e7f8be9242b606f1b5fbcb38f45e4de29c5Jan Engelhardt		info->mark = cb->val.mark;
13460756e7f8be9242b606f1b5fbcb38f45e4de29c5Jan Engelhardt		info->mask = cb->val.mask;
135f4b737fb0c52a95a48f2e313ed4cff43db720ad6Jan Engelhardt		break;
13660756e7f8be9242b606f1b5fbcb38f45e4de29c5Jan Engelhardt	case O_SET_MARK:
13760756e7f8be9242b606f1b5fbcb38f45e4de29c5Jan Engelhardt		info->mark = cb->val.mark;
13860756e7f8be9242b606f1b5fbcb38f45e4de29c5Jan Engelhardt		info->mask = cb->val.mark | cb->val.mask;
13960756e7f8be9242b606f1b5fbcb38f45e4de29c5Jan Engelhardt		break;
14060756e7f8be9242b606f1b5fbcb38f45e4de29c5Jan Engelhardt	case O_AND_MARK:
141f4b737fb0c52a95a48f2e313ed4cff43db720ad6Jan Engelhardt		info->mark = 0;
14260756e7f8be9242b606f1b5fbcb38f45e4de29c5Jan Engelhardt		info->mask = ~cb->val.u32;
143f4b737fb0c52a95a48f2e313ed4cff43db720ad6Jan Engelhardt		break;
14460756e7f8be9242b606f1b5fbcb38f45e4de29c5Jan Engelhardt	case O_OR_MARK:
14560756e7f8be9242b606f1b5fbcb38f45e4de29c5Jan Engelhardt		info->mark = info->mask = cb->val.u32;
146f4b737fb0c52a95a48f2e313ed4cff43db720ad6Jan Engelhardt		break;
14760756e7f8be9242b606f1b5fbcb38f45e4de29c5Jan Engelhardt	case O_XOR_MARK:
14860756e7f8be9242b606f1b5fbcb38f45e4de29c5Jan Engelhardt		info->mark = cb->val.u32;
149f4b737fb0c52a95a48f2e313ed4cff43db720ad6Jan Engelhardt		info->mask = 0;
150f4b737fb0c52a95a48f2e313ed4cff43db720ad6Jan Engelhardt		break;
151f4b737fb0c52a95a48f2e313ed4cff43db720ad6Jan Engelhardt	}
152f4b737fb0c52a95a48f2e313ed4cff43db720ad6Jan Engelhardt}
153f4b737fb0c52a95a48f2e313ed4cff43db720ad6Jan Engelhardt
15460756e7f8be9242b606f1b5fbcb38f45e4de29c5Jan Engelhardtstatic void mark_tg_check(struct xt_fcheck_call *cb)
155f4b737fb0c52a95a48f2e313ed4cff43db720ad6Jan Engelhardt{
15660756e7f8be9242b606f1b5fbcb38f45e4de29c5Jan Engelhardt	if (cb->xflags == 0)
1571829ed482efbc8b390cc760d012b3a4450494e1aJan Engelhardt		xtables_error(PARAMETER_PROBLEM, "MARK: One of the --set-xmark, "
158f4b737fb0c52a95a48f2e313ed4cff43db720ad6Jan Engelhardt		           "--{and,or,xor,set}-mark options is required");
159f4b737fb0c52a95a48f2e313ed4cff43db720ad6Jan Engelhardt}
160f4b737fb0c52a95a48f2e313ed4cff43db720ad6Jan Engelhardt
161c5617bf84475028dd1663cde076b93f355ce42a7Martin Josefssonstatic void
162c5617bf84475028dd1663cde076b93f355ce42a7Martin Josefssonprint_mark(unsigned long mark)
163e6869a8f59d779ff4d5a0984c86d80db7078496Marc Boucher{
16473866357e4a7a0fdc1b293bf8863fee2bd56da9eJan Engelhardt	printf(" 0x%lx", mark);
165e6869a8f59d779ff4d5a0984c86d80db7078496Marc Boucher}
166e6869a8f59d779ff4d5a0984c86d80db7078496Marc Boucher
167932e648f38ac16b1ea14c1f66f23951388448c5aJan Engelhardtstatic void MARK_print_v0(const void *ip,
168932e648f38ac16b1ea14c1f66f23951388448c5aJan Engelhardt                          const struct xt_entry_target *target, int numeric)
169e6869a8f59d779ff4d5a0984c86d80db7078496Marc Boucher{
1706e22228b00cc485282db16b9637315a60b6dbd10Yasuyuki KOZAKAI	const struct xt_mark_target_info *markinfo =
1716e22228b00cc485282db16b9637315a60b6dbd10Yasuyuki KOZAKAI		(const struct xt_mark_target_info *)target->data;
17273866357e4a7a0fdc1b293bf8863fee2bd56da9eJan Engelhardt	printf(" MARK set");
173c5617bf84475028dd1663cde076b93f355ce42a7Martin Josefsson	print_mark(markinfo->mark);
174e6869a8f59d779ff4d5a0984c86d80db7078496Marc Boucher}
175e6869a8f59d779ff4d5a0984c86d80db7078496Marc Boucher
176932e648f38ac16b1ea14c1f66f23951388448c5aJan Engelhardtstatic void MARK_save_v0(const void *ip, const struct xt_entry_target *target)
177e6869a8f59d779ff4d5a0984c86d80db7078496Marc Boucher{
1786e22228b00cc485282db16b9637315a60b6dbd10Yasuyuki KOZAKAI	const struct xt_mark_target_info *markinfo =
1796e22228b00cc485282db16b9637315a60b6dbd10Yasuyuki KOZAKAI		(const struct xt_mark_target_info *)target->data;
1807e53bf9c2a697abdb6f1385557338423a86612a3Rusty Russell
18173866357e4a7a0fdc1b293bf8863fee2bd56da9eJan Engelhardt	printf(" --set-mark");
182c5617bf84475028dd1663cde076b93f355ce42a7Martin Josefsson	print_mark(markinfo->mark);
183e6869a8f59d779ff4d5a0984c86d80db7078496Marc Boucher}
184e6869a8f59d779ff4d5a0984c86d80db7078496Marc Boucher
185932e648f38ac16b1ea14c1f66f23951388448c5aJan Engelhardtstatic void MARK_print_v1(const void *ip, const struct xt_entry_target *target,
186932e648f38ac16b1ea14c1f66f23951388448c5aJan Engelhardt                          int numeric)
1873aef54dce4f9bbe0b466478fd33a1d3131efbbb8Rusty Russell{
1886e22228b00cc485282db16b9637315a60b6dbd10Yasuyuki KOZAKAI	const struct xt_mark_target_info_v1 *markinfo =
1896e22228b00cc485282db16b9637315a60b6dbd10Yasuyuki KOZAKAI		(const struct xt_mark_target_info_v1 *)target->data;
1903aef54dce4f9bbe0b466478fd33a1d3131efbbb8Rusty Russell
1913aef54dce4f9bbe0b466478fd33a1d3131efbbb8Rusty Russell	switch (markinfo->mode) {
1926e22228b00cc485282db16b9637315a60b6dbd10Yasuyuki KOZAKAI	case XT_MARK_SET:
19373866357e4a7a0fdc1b293bf8863fee2bd56da9eJan Engelhardt		printf(" MARK set");
1943aef54dce4f9bbe0b466478fd33a1d3131efbbb8Rusty Russell		break;
1956e22228b00cc485282db16b9637315a60b6dbd10Yasuyuki KOZAKAI	case XT_MARK_AND:
19673866357e4a7a0fdc1b293bf8863fee2bd56da9eJan Engelhardt		printf(" MARK and");
1973aef54dce4f9bbe0b466478fd33a1d3131efbbb8Rusty Russell		break;
1986e22228b00cc485282db16b9637315a60b6dbd10Yasuyuki KOZAKAI	case XT_MARK_OR:
19973866357e4a7a0fdc1b293bf8863fee2bd56da9eJan Engelhardt		printf(" MARK or");
2003aef54dce4f9bbe0b466478fd33a1d3131efbbb8Rusty Russell		break;
2013aef54dce4f9bbe0b466478fd33a1d3131efbbb8Rusty Russell	}
2023aef54dce4f9bbe0b466478fd33a1d3131efbbb8Rusty Russell	print_mark(markinfo->mark);
2033aef54dce4f9bbe0b466478fd33a1d3131efbbb8Rusty Russell}
2043aef54dce4f9bbe0b466478fd33a1d3131efbbb8Rusty Russell
205f4b737fb0c52a95a48f2e313ed4cff43db720ad6Jan Engelhardtstatic void mark_tg_print(const void *ip, const struct xt_entry_target *target,
206f4b737fb0c52a95a48f2e313ed4cff43db720ad6Jan Engelhardt                          int numeric)
207f4b737fb0c52a95a48f2e313ed4cff43db720ad6Jan Engelhardt{
208f4b737fb0c52a95a48f2e313ed4cff43db720ad6Jan Engelhardt	const struct xt_mark_tginfo2 *info = (const void *)target->data;
209f4b737fb0c52a95a48f2e313ed4cff43db720ad6Jan Engelhardt
210f4b737fb0c52a95a48f2e313ed4cff43db720ad6Jan Engelhardt	if (info->mark == 0)
21173866357e4a7a0fdc1b293bf8863fee2bd56da9eJan Engelhardt		printf(" MARK and 0x%x", (unsigned int)(uint32_t)~info->mask);
212f4b737fb0c52a95a48f2e313ed4cff43db720ad6Jan Engelhardt	else if (info->mark == info->mask)
21373866357e4a7a0fdc1b293bf8863fee2bd56da9eJan Engelhardt		printf(" MARK or 0x%x", info->mark);
214f4b737fb0c52a95a48f2e313ed4cff43db720ad6Jan Engelhardt	else if (info->mask == 0)
21573866357e4a7a0fdc1b293bf8863fee2bd56da9eJan Engelhardt		printf(" MARK xor 0x%x", info->mark);
2163d915e1ac610bce44250b4aea556f4726387388dPatrick McHardy	else if (info->mask == 0xffffffffU)
21773866357e4a7a0fdc1b293bf8863fee2bd56da9eJan Engelhardt		printf(" MARK set 0x%x", info->mark);
218f4b737fb0c52a95a48f2e313ed4cff43db720ad6Jan Engelhardt	else
21973866357e4a7a0fdc1b293bf8863fee2bd56da9eJan Engelhardt		printf(" MARK xset 0x%x/0x%x", info->mark, info->mask);
220f4b737fb0c52a95a48f2e313ed4cff43db720ad6Jan Engelhardt}
221f4b737fb0c52a95a48f2e313ed4cff43db720ad6Jan Engelhardt
222932e648f38ac16b1ea14c1f66f23951388448c5aJan Engelhardtstatic void MARK_save_v1(const void *ip, const struct xt_entry_target *target)
2233aef54dce4f9bbe0b466478fd33a1d3131efbbb8Rusty Russell{
2246e22228b00cc485282db16b9637315a60b6dbd10Yasuyuki KOZAKAI	const struct xt_mark_target_info_v1 *markinfo =
2256e22228b00cc485282db16b9637315a60b6dbd10Yasuyuki KOZAKAI		(const struct xt_mark_target_info_v1 *)target->data;
2263aef54dce4f9bbe0b466478fd33a1d3131efbbb8Rusty Russell
2273aef54dce4f9bbe0b466478fd33a1d3131efbbb8Rusty Russell	switch (markinfo->mode) {
2286e22228b00cc485282db16b9637315a60b6dbd10Yasuyuki KOZAKAI	case XT_MARK_SET:
22973866357e4a7a0fdc1b293bf8863fee2bd56da9eJan Engelhardt		printf(" --set-mark");
2303aef54dce4f9bbe0b466478fd33a1d3131efbbb8Rusty Russell		break;
2316e22228b00cc485282db16b9637315a60b6dbd10Yasuyuki KOZAKAI	case XT_MARK_AND:
23273866357e4a7a0fdc1b293bf8863fee2bd56da9eJan Engelhardt		printf(" --and-mark");
2333aef54dce4f9bbe0b466478fd33a1d3131efbbb8Rusty Russell		break;
2346e22228b00cc485282db16b9637315a60b6dbd10Yasuyuki KOZAKAI	case XT_MARK_OR:
23573866357e4a7a0fdc1b293bf8863fee2bd56da9eJan Engelhardt		printf(" --or-mark");
2363aef54dce4f9bbe0b466478fd33a1d3131efbbb8Rusty Russell		break;
2373aef54dce4f9bbe0b466478fd33a1d3131efbbb8Rusty Russell	}
2383aef54dce4f9bbe0b466478fd33a1d3131efbbb8Rusty Russell	print_mark(markinfo->mark);
2393aef54dce4f9bbe0b466478fd33a1d3131efbbb8Rusty Russell}
2403aef54dce4f9bbe0b466478fd33a1d3131efbbb8Rusty Russell
241f4b737fb0c52a95a48f2e313ed4cff43db720ad6Jan Engelhardtstatic void mark_tg_save(const void *ip, const struct xt_entry_target *target)
242f4b737fb0c52a95a48f2e313ed4cff43db720ad6Jan Engelhardt{
243f4b737fb0c52a95a48f2e313ed4cff43db720ad6Jan Engelhardt	const struct xt_mark_tginfo2 *info = (const void *)target->data;
244f4b737fb0c52a95a48f2e313ed4cff43db720ad6Jan Engelhardt
24573866357e4a7a0fdc1b293bf8863fee2bd56da9eJan Engelhardt	printf(" --set-xmark 0x%x/0x%x", info->mark, info->mask);
246f4b737fb0c52a95a48f2e313ed4cff43db720ad6Jan Engelhardt}
247f4b737fb0c52a95a48f2e313ed4cff43db720ad6Jan Engelhardt
248f2a77520693f0a6dd1df1f87be4b81913961c1f5Jan Engelhardtstatic struct xtables_target mark_tg_reg[] = {
249f2a77520693f0a6dd1df1f87be4b81913961c1f5Jan Engelhardt	{
250f2a77520693f0a6dd1df1f87be4b81913961c1f5Jan Engelhardt		.family        = NFPROTO_UNSPEC,
251f2a77520693f0a6dd1df1f87be4b81913961c1f5Jan Engelhardt		.name          = "MARK",
252f2a77520693f0a6dd1df1f87be4b81913961c1f5Jan Engelhardt		.version       = XTABLES_VERSION,
253f2a77520693f0a6dd1df1f87be4b81913961c1f5Jan Engelhardt		.revision      = 0,
254f2a77520693f0a6dd1df1f87be4b81913961c1f5Jan Engelhardt		.size          = XT_ALIGN(sizeof(struct xt_mark_target_info)),
255f2a77520693f0a6dd1df1f87be4b81913961c1f5Jan Engelhardt		.userspacesize = XT_ALIGN(sizeof(struct xt_mark_target_info)),
256f2a77520693f0a6dd1df1f87be4b81913961c1f5Jan Engelhardt		.help          = MARK_help,
257f2a77520693f0a6dd1df1f87be4b81913961c1f5Jan Engelhardt		.print         = MARK_print_v0,
258f2a77520693f0a6dd1df1f87be4b81913961c1f5Jan Engelhardt		.save          = MARK_save_v0,
25960756e7f8be9242b606f1b5fbcb38f45e4de29c5Jan Engelhardt		.x6_parse      = MARK_parse_v0,
26060756e7f8be9242b606f1b5fbcb38f45e4de29c5Jan Engelhardt		.x6_fcheck     = MARK_check,
26160756e7f8be9242b606f1b5fbcb38f45e4de29c5Jan Engelhardt		.x6_options    = MARK_opts,
262f2a77520693f0a6dd1df1f87be4b81913961c1f5Jan Engelhardt	},
263f2a77520693f0a6dd1df1f87be4b81913961c1f5Jan Engelhardt	{
264f2a77520693f0a6dd1df1f87be4b81913961c1f5Jan Engelhardt		.family        = NFPROTO_IPV4,
265f2a77520693f0a6dd1df1f87be4b81913961c1f5Jan Engelhardt		.name          = "MARK",
266f2a77520693f0a6dd1df1f87be4b81913961c1f5Jan Engelhardt		.version       = XTABLES_VERSION,
267f2a77520693f0a6dd1df1f87be4b81913961c1f5Jan Engelhardt		.revision      = 1,
268f2a77520693f0a6dd1df1f87be4b81913961c1f5Jan Engelhardt		.size          = XT_ALIGN(sizeof(struct xt_mark_target_info_v1)),
269f2a77520693f0a6dd1df1f87be4b81913961c1f5Jan Engelhardt		.userspacesize = XT_ALIGN(sizeof(struct xt_mark_target_info_v1)),
270f2a77520693f0a6dd1df1f87be4b81913961c1f5Jan Engelhardt		.help          = MARK_help,
271f2a77520693f0a6dd1df1f87be4b81913961c1f5Jan Engelhardt		.print         = MARK_print_v1,
272f2a77520693f0a6dd1df1f87be4b81913961c1f5Jan Engelhardt		.save          = MARK_save_v1,
27360756e7f8be9242b606f1b5fbcb38f45e4de29c5Jan Engelhardt		.x6_parse      = MARK_parse_v1,
27460756e7f8be9242b606f1b5fbcb38f45e4de29c5Jan Engelhardt		.x6_fcheck     = MARK_check,
27560756e7f8be9242b606f1b5fbcb38f45e4de29c5Jan Engelhardt		.x6_options    = MARK_opts,
276f2a77520693f0a6dd1df1f87be4b81913961c1f5Jan Engelhardt	},
277f2a77520693f0a6dd1df1f87be4b81913961c1f5Jan Engelhardt	{
278f2a77520693f0a6dd1df1f87be4b81913961c1f5Jan Engelhardt		.version       = XTABLES_VERSION,
279f2a77520693f0a6dd1df1f87be4b81913961c1f5Jan Engelhardt		.name          = "MARK",
280f2a77520693f0a6dd1df1f87be4b81913961c1f5Jan Engelhardt		.revision      = 2,
281f2a77520693f0a6dd1df1f87be4b81913961c1f5Jan Engelhardt		.family        = NFPROTO_UNSPEC,
282f2a77520693f0a6dd1df1f87be4b81913961c1f5Jan Engelhardt		.size          = XT_ALIGN(sizeof(struct xt_mark_tginfo2)),
283f2a77520693f0a6dd1df1f87be4b81913961c1f5Jan Engelhardt		.userspacesize = XT_ALIGN(sizeof(struct xt_mark_tginfo2)),
284f2a77520693f0a6dd1df1f87be4b81913961c1f5Jan Engelhardt		.help          = mark_tg_help,
285f2a77520693f0a6dd1df1f87be4b81913961c1f5Jan Engelhardt		.print         = mark_tg_print,
286f2a77520693f0a6dd1df1f87be4b81913961c1f5Jan Engelhardt		.save          = mark_tg_save,
28760756e7f8be9242b606f1b5fbcb38f45e4de29c5Jan Engelhardt		.x6_parse      = mark_tg_parse,
28860756e7f8be9242b606f1b5fbcb38f45e4de29c5Jan Engelhardt		.x6_fcheck     = mark_tg_check,
28960756e7f8be9242b606f1b5fbcb38f45e4de29c5Jan Engelhardt		.x6_options    = mark_tg_opts,
290f2a77520693f0a6dd1df1f87be4b81913961c1f5Jan Engelhardt	},
291f4b737fb0c52a95a48f2e313ed4cff43db720ad6Jan Engelhardt};
292f4b737fb0c52a95a48f2e313ed4cff43db720ad6Jan Engelhardt
293e6869a8f59d779ff4d5a0984c86d80db7078496Marc Bouchervoid _init(void)
294e6869a8f59d779ff4d5a0984c86d80db7078496Marc Boucher{
295f2a77520693f0a6dd1df1f87be4b81913961c1f5Jan Engelhardt	xtables_register_targets(mark_tg_reg, ARRAY_SIZE(mark_tg_reg));
296e6869a8f59d779ff4d5a0984c86d80db7078496Marc Boucher}
297