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