blob: 7f8c995c24094ca00387f8f5e2e01a4fb8ab6f5c [file] [log] [blame]
Jan Engelhardtd95d92f2008-01-20 13:41:22 +00001#include <stdbool.h>
Marc Bouchere6869a82000-03-20 06:03:29 +00002#include <stdio.h>
Yasuyuki KOZAKAI0af771d2007-07-24 06:53:14 +00003#include <xtables.h>
Jan Engelhardtd95d92f2008-01-20 13:41:22 +00004#include <linux/netfilter/xt_mark.h>
Marc Bouchere6869a82000-03-20 06:03:29 +00005
Jan Engelhardt350661a2010-01-31 22:42:52 +01006struct xt_mark_info {
7 unsigned long mark, mask;
Jan Engelhardt7ac40522011-01-07 12:34:04 +01008 uint8_t invert;
Jan Engelhardt350661a2010-01-31 22:42:52 +01009};
10
Jan Engelhardtd95d92f2008-01-20 13:41:22 +000011enum {
Jan Engelhardt60756e72011-03-06 15:21:24 +010012 O_MARK = 0,
Jan Engelhardtd95d92f2008-01-20 13:41:22 +000013};
14
15static void mark_mt_help(void)
Marc Bouchere6869a82000-03-20 06:03:29 +000016{
17 printf(
Jan Engelhardtd95d92f2008-01-20 13:41:22 +000018"mark match options:\n"
Jan Engelhardt8b7c64d2008-04-15 11:48:25 +020019"[!] --mark value[/mask] Match nfmark value with optional mask\n");
Marc Bouchere6869a82000-03-20 06:03:29 +000020}
21
Jan Engelhardt60756e72011-03-06 15:21:24 +010022static const struct xt_option_entry mark_mt_opts[] = {
23 {.name = "mark", .id = O_MARK, .type = XTTYPE_MARKMASK32,
24 .flags = XTOPT_MAND | XTOPT_INVERT},
25 XTOPT_TABLEEND,
Marc Bouchere6869a82000-03-20 06:03:29 +000026};
27
Jan Engelhardt60756e72011-03-06 15:21:24 +010028static void mark_mt_parse(struct xt_option_call *cb)
Jan Engelhardtd95d92f2008-01-20 13:41:22 +000029{
Jan Engelhardt60756e72011-03-06 15:21:24 +010030 struct xt_mark_mtinfo1 *info = cb->data;
Jan Engelhardtd95d92f2008-01-20 13:41:22 +000031
Jan Engelhardt60756e72011-03-06 15:21:24 +010032 xtables_option_parse(cb);
33 if (cb->invert)
34 info->invert = true;
35 info->mark = cb->val.mark;
36 info->mask = cb->val.mask;
Jan Engelhardtd95d92f2008-01-20 13:41:22 +000037}
38
Jan Engelhardt60756e72011-03-06 15:21:24 +010039static void mark_parse(struct xt_option_call *cb)
Marc Bouchere6869a82000-03-20 06:03:29 +000040{
Jan Engelhardt60756e72011-03-06 15:21:24 +010041 struct xt_mark_info *markinfo = cb->data;
Marc Bouchere6869a82000-03-20 06:03:29 +000042
Jan Engelhardt60756e72011-03-06 15:21:24 +010043 xtables_option_parse(cb);
44 if (cb->invert)
45 markinfo->invert = 1;
46 markinfo->mark = cb->val.mark;
47 markinfo->mask = cb->val.mask;
Marc Bouchere6869a82000-03-20 06:03:29 +000048}
49
Jan Engelhardtd95d92f2008-01-20 13:41:22 +000050static void print_mark(unsigned int mark, unsigned int mask)
Marc Bouchere6869a82000-03-20 06:03:29 +000051{
Jan Engelhardtd95d92f2008-01-20 13:41:22 +000052 if (mask != 0xffffffffU)
Jan Engelhardt73866352010-12-18 02:04:59 +010053 printf(" 0x%x/0x%x", mark, mask);
Marc Bouchere6869a82000-03-20 06:03:29 +000054 else
Jan Engelhardt73866352010-12-18 02:04:59 +010055 printf(" 0x%x", mark);
Marc Bouchere6869a82000-03-20 06:03:29 +000056}
57
Jan Engelhardtd95d92f2008-01-20 13:41:22 +000058static void
59mark_mt_print(const void *ip, const struct xt_entry_match *match, int numeric)
60{
61 const struct xt_mark_mtinfo1 *info = (const void *)match->data;
62
Jan Engelhardt73866352010-12-18 02:04:59 +010063 printf(" mark match");
Jan Engelhardtd95d92f2008-01-20 13:41:22 +000064 if (info->invert)
Jan Engelhardt73866352010-12-18 02:04:59 +010065 printf(" !");
Jan Engelhardtd95d92f2008-01-20 13:41:22 +000066 print_mark(info->mark, info->mask);
Marc Bouchere6869a82000-03-20 06:03:29 +000067}
68
Marc Bouchere6869a82000-03-20 06:03:29 +000069static void
Jan Engelhardt181dead2007-10-04 16:27:07 +000070mark_print(const void *ip, const struct xt_entry_match *match, int numeric)
Marc Bouchere6869a82000-03-20 06:03:29 +000071{
Jan Engelhardt69f564e2009-05-26 13:14:06 +020072 const struct xt_mark_info *info = (const void *)match->data;
Harald Welte42479cc2002-09-20 15:25:13 +000073
Jan Engelhardt73866352010-12-18 02:04:59 +010074 printf(" MARK match");
Harald Welte42479cc2002-09-20 15:25:13 +000075
76 if (info->invert)
Jan Engelhardt73866352010-12-18 02:04:59 +010077 printf(" !");
Harald Welte42479cc2002-09-20 15:25:13 +000078
Jan Engelhardtd95d92f2008-01-20 13:41:22 +000079 print_mark(info->mark, info->mask);
80}
81
82static void mark_mt_save(const void *ip, const struct xt_entry_match *match)
83{
84 const struct xt_mark_mtinfo1 *info = (const void *)match->data;
85
86 if (info->invert)
Jan Engelhardt73866352010-12-18 02:04:59 +010087 printf(" !");
Jan Engelhardtd95d92f2008-01-20 13:41:22 +000088
Jan Engelhardt73866352010-12-18 02:04:59 +010089 printf(" --mark");
Jan Engelhardtd95d92f2008-01-20 13:41:22 +000090 print_mark(info->mark, info->mask);
Marc Bouchere6869a82000-03-20 06:03:29 +000091}
92
Marc Bouchere6869a82000-03-20 06:03:29 +000093static void
Jan Engelhardt181dead2007-10-04 16:27:07 +000094mark_save(const void *ip, const struct xt_entry_match *match)
Marc Bouchere6869a82000-03-20 06:03:29 +000095{
Jan Engelhardt69f564e2009-05-26 13:14:06 +020096 const struct xt_mark_info *info = (const void *)match->data;
Harald Welte42479cc2002-09-20 15:25:13 +000097
98 if (info->invert)
Jan Engelhardt73866352010-12-18 02:04:59 +010099 printf(" !");
Harald Welte42479cc2002-09-20 15:25:13 +0000100
Jan Engelhardt73866352010-12-18 02:04:59 +0100101 printf(" --mark");
Jan Engelhardtd95d92f2008-01-20 13:41:22 +0000102 print_mark(info->mark, info->mask);
Marc Bouchere6869a82000-03-20 06:03:29 +0000103}
104
Jan Engelhardtf2a77522009-06-25 20:12:12 +0200105static struct xtables_match mark_mt_reg[] = {
106 {
107 .family = NFPROTO_UNSPEC,
108 .name = "mark",
109 .revision = 0,
110 .version = XTABLES_VERSION,
111 .size = XT_ALIGN(sizeof(struct xt_mark_info)),
112 .userspacesize = XT_ALIGN(sizeof(struct xt_mark_info)),
113 .help = mark_mt_help,
Jan Engelhardtf2a77522009-06-25 20:12:12 +0200114 .print = mark_print,
115 .save = mark_save,
Jan Engelhardt60756e72011-03-06 15:21:24 +0100116 .x6_parse = mark_parse,
117 .x6_options = mark_mt_opts,
Jan Engelhardtf2a77522009-06-25 20:12:12 +0200118 },
119 {
120 .version = XTABLES_VERSION,
121 .name = "mark",
122 .revision = 1,
123 .family = NFPROTO_UNSPEC,
124 .size = XT_ALIGN(sizeof(struct xt_mark_mtinfo1)),
125 .userspacesize = XT_ALIGN(sizeof(struct xt_mark_mtinfo1)),
126 .help = mark_mt_help,
Jan Engelhardtf2a77522009-06-25 20:12:12 +0200127 .print = mark_mt_print,
128 .save = mark_mt_save,
Jan Engelhardt60756e72011-03-06 15:21:24 +0100129 .x6_parse = mark_mt_parse,
130 .x6_options = mark_mt_opts,
Jan Engelhardtf2a77522009-06-25 20:12:12 +0200131 },
Yasuyuki KOZAKAIde9d2442007-07-24 06:55:05 +0000132};
133
Marc Bouchere6869a82000-03-20 06:03:29 +0000134void _init(void)
135{
Jan Engelhardtf2a77522009-06-25 20:12:12 +0200136 xtables_register_matches(mark_mt_reg, ARRAY_SIZE(mark_mt_reg));
Marc Bouchere6869a82000-03-20 06:03:29 +0000137}