Jan Engelhardt | d95d92f | 2008-01-20 13:41:22 +0000 | [diff] [blame] | 1 | #include <stdbool.h> |
Marc Boucher | e6869a8 | 2000-03-20 06:03:29 +0000 | [diff] [blame] | 2 | #include <stdio.h> |
Yasuyuki KOZAKAI | 0af771d | 2007-07-24 06:53:14 +0000 | [diff] [blame] | 3 | #include <xtables.h> |
Jan Engelhardt | d95d92f | 2008-01-20 13:41:22 +0000 | [diff] [blame] | 4 | #include <linux/netfilter/xt_mark.h> |
Marc Boucher | e6869a8 | 2000-03-20 06:03:29 +0000 | [diff] [blame] | 5 | |
Jan Engelhardt | 350661a | 2010-01-31 22:42:52 +0100 | [diff] [blame] | 6 | struct xt_mark_info { |
| 7 | unsigned long mark, mask; |
Jan Engelhardt | 7ac4052 | 2011-01-07 12:34:04 +0100 | [diff] [blame] | 8 | uint8_t invert; |
Jan Engelhardt | 350661a | 2010-01-31 22:42:52 +0100 | [diff] [blame] | 9 | }; |
| 10 | |
Jan Engelhardt | d95d92f | 2008-01-20 13:41:22 +0000 | [diff] [blame] | 11 | enum { |
Jan Engelhardt | 60756e7 | 2011-03-06 15:21:24 +0100 | [diff] [blame] | 12 | O_MARK = 0, |
Jan Engelhardt | d95d92f | 2008-01-20 13:41:22 +0000 | [diff] [blame] | 13 | }; |
| 14 | |
| 15 | static void mark_mt_help(void) |
Marc Boucher | e6869a8 | 2000-03-20 06:03:29 +0000 | [diff] [blame] | 16 | { |
| 17 | printf( |
Jan Engelhardt | d95d92f | 2008-01-20 13:41:22 +0000 | [diff] [blame] | 18 | "mark match options:\n" |
Jan Engelhardt | 8b7c64d | 2008-04-15 11:48:25 +0200 | [diff] [blame] | 19 | "[!] --mark value[/mask] Match nfmark value with optional mask\n"); |
Marc Boucher | e6869a8 | 2000-03-20 06:03:29 +0000 | [diff] [blame] | 20 | } |
| 21 | |
Jan Engelhardt | 60756e7 | 2011-03-06 15:21:24 +0100 | [diff] [blame] | 22 | static 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 Boucher | e6869a8 | 2000-03-20 06:03:29 +0000 | [diff] [blame] | 26 | }; |
| 27 | |
Jan Engelhardt | 60756e7 | 2011-03-06 15:21:24 +0100 | [diff] [blame] | 28 | static void mark_mt_parse(struct xt_option_call *cb) |
Jan Engelhardt | d95d92f | 2008-01-20 13:41:22 +0000 | [diff] [blame] | 29 | { |
Jan Engelhardt | 60756e7 | 2011-03-06 15:21:24 +0100 | [diff] [blame] | 30 | struct xt_mark_mtinfo1 *info = cb->data; |
Jan Engelhardt | d95d92f | 2008-01-20 13:41:22 +0000 | [diff] [blame] | 31 | |
Jan Engelhardt | 60756e7 | 2011-03-06 15:21:24 +0100 | [diff] [blame] | 32 | 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 Engelhardt | d95d92f | 2008-01-20 13:41:22 +0000 | [diff] [blame] | 37 | } |
| 38 | |
Jan Engelhardt | 60756e7 | 2011-03-06 15:21:24 +0100 | [diff] [blame] | 39 | static void mark_parse(struct xt_option_call *cb) |
Marc Boucher | e6869a8 | 2000-03-20 06:03:29 +0000 | [diff] [blame] | 40 | { |
Jan Engelhardt | 60756e7 | 2011-03-06 15:21:24 +0100 | [diff] [blame] | 41 | struct xt_mark_info *markinfo = cb->data; |
Marc Boucher | e6869a8 | 2000-03-20 06:03:29 +0000 | [diff] [blame] | 42 | |
Jan Engelhardt | 60756e7 | 2011-03-06 15:21:24 +0100 | [diff] [blame] | 43 | 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 Boucher | e6869a8 | 2000-03-20 06:03:29 +0000 | [diff] [blame] | 48 | } |
| 49 | |
Jan Engelhardt | d95d92f | 2008-01-20 13:41:22 +0000 | [diff] [blame] | 50 | static void print_mark(unsigned int mark, unsigned int mask) |
Marc Boucher | e6869a8 | 2000-03-20 06:03:29 +0000 | [diff] [blame] | 51 | { |
Jan Engelhardt | d95d92f | 2008-01-20 13:41:22 +0000 | [diff] [blame] | 52 | if (mask != 0xffffffffU) |
Jan Engelhardt | 7386635 | 2010-12-18 02:04:59 +0100 | [diff] [blame] | 53 | printf(" 0x%x/0x%x", mark, mask); |
Marc Boucher | e6869a8 | 2000-03-20 06:03:29 +0000 | [diff] [blame] | 54 | else |
Jan Engelhardt | 7386635 | 2010-12-18 02:04:59 +0100 | [diff] [blame] | 55 | printf(" 0x%x", mark); |
Marc Boucher | e6869a8 | 2000-03-20 06:03:29 +0000 | [diff] [blame] | 56 | } |
| 57 | |
Jan Engelhardt | d95d92f | 2008-01-20 13:41:22 +0000 | [diff] [blame] | 58 | static void |
| 59 | mark_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 Engelhardt | 7386635 | 2010-12-18 02:04:59 +0100 | [diff] [blame] | 63 | printf(" mark match"); |
Jan Engelhardt | d95d92f | 2008-01-20 13:41:22 +0000 | [diff] [blame] | 64 | if (info->invert) |
Jan Engelhardt | 7386635 | 2010-12-18 02:04:59 +0100 | [diff] [blame] | 65 | printf(" !"); |
Jan Engelhardt | d95d92f | 2008-01-20 13:41:22 +0000 | [diff] [blame] | 66 | print_mark(info->mark, info->mask); |
Marc Boucher | e6869a8 | 2000-03-20 06:03:29 +0000 | [diff] [blame] | 67 | } |
| 68 | |
Marc Boucher | e6869a8 | 2000-03-20 06:03:29 +0000 | [diff] [blame] | 69 | static void |
Jan Engelhardt | 181dead | 2007-10-04 16:27:07 +0000 | [diff] [blame] | 70 | mark_print(const void *ip, const struct xt_entry_match *match, int numeric) |
Marc Boucher | e6869a8 | 2000-03-20 06:03:29 +0000 | [diff] [blame] | 71 | { |
Jan Engelhardt | 69f564e | 2009-05-26 13:14:06 +0200 | [diff] [blame] | 72 | const struct xt_mark_info *info = (const void *)match->data; |
Harald Welte | 42479cc | 2002-09-20 15:25:13 +0000 | [diff] [blame] | 73 | |
Jan Engelhardt | 7386635 | 2010-12-18 02:04:59 +0100 | [diff] [blame] | 74 | printf(" MARK match"); |
Harald Welte | 42479cc | 2002-09-20 15:25:13 +0000 | [diff] [blame] | 75 | |
| 76 | if (info->invert) |
Jan Engelhardt | 7386635 | 2010-12-18 02:04:59 +0100 | [diff] [blame] | 77 | printf(" !"); |
Harald Welte | 42479cc | 2002-09-20 15:25:13 +0000 | [diff] [blame] | 78 | |
Jan Engelhardt | d95d92f | 2008-01-20 13:41:22 +0000 | [diff] [blame] | 79 | print_mark(info->mark, info->mask); |
| 80 | } |
| 81 | |
| 82 | static 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 Engelhardt | 7386635 | 2010-12-18 02:04:59 +0100 | [diff] [blame] | 87 | printf(" !"); |
Jan Engelhardt | d95d92f | 2008-01-20 13:41:22 +0000 | [diff] [blame] | 88 | |
Jan Engelhardt | 7386635 | 2010-12-18 02:04:59 +0100 | [diff] [blame] | 89 | printf(" --mark"); |
Jan Engelhardt | d95d92f | 2008-01-20 13:41:22 +0000 | [diff] [blame] | 90 | print_mark(info->mark, info->mask); |
Marc Boucher | e6869a8 | 2000-03-20 06:03:29 +0000 | [diff] [blame] | 91 | } |
| 92 | |
Marc Boucher | e6869a8 | 2000-03-20 06:03:29 +0000 | [diff] [blame] | 93 | static void |
Jan Engelhardt | 181dead | 2007-10-04 16:27:07 +0000 | [diff] [blame] | 94 | mark_save(const void *ip, const struct xt_entry_match *match) |
Marc Boucher | e6869a8 | 2000-03-20 06:03:29 +0000 | [diff] [blame] | 95 | { |
Jan Engelhardt | 69f564e | 2009-05-26 13:14:06 +0200 | [diff] [blame] | 96 | const struct xt_mark_info *info = (const void *)match->data; |
Harald Welte | 42479cc | 2002-09-20 15:25:13 +0000 | [diff] [blame] | 97 | |
| 98 | if (info->invert) |
Jan Engelhardt | 7386635 | 2010-12-18 02:04:59 +0100 | [diff] [blame] | 99 | printf(" !"); |
Harald Welte | 42479cc | 2002-09-20 15:25:13 +0000 | [diff] [blame] | 100 | |
Jan Engelhardt | 7386635 | 2010-12-18 02:04:59 +0100 | [diff] [blame] | 101 | printf(" --mark"); |
Jan Engelhardt | d95d92f | 2008-01-20 13:41:22 +0000 | [diff] [blame] | 102 | print_mark(info->mark, info->mask); |
Marc Boucher | e6869a8 | 2000-03-20 06:03:29 +0000 | [diff] [blame] | 103 | } |
| 104 | |
Jan Engelhardt | f2a7752 | 2009-06-25 20:12:12 +0200 | [diff] [blame] | 105 | static 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 Engelhardt | f2a7752 | 2009-06-25 20:12:12 +0200 | [diff] [blame] | 114 | .print = mark_print, |
| 115 | .save = mark_save, |
Jan Engelhardt | 60756e7 | 2011-03-06 15:21:24 +0100 | [diff] [blame] | 116 | .x6_parse = mark_parse, |
| 117 | .x6_options = mark_mt_opts, |
Jan Engelhardt | f2a7752 | 2009-06-25 20:12:12 +0200 | [diff] [blame] | 118 | }, |
| 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 Engelhardt | f2a7752 | 2009-06-25 20:12:12 +0200 | [diff] [blame] | 127 | .print = mark_mt_print, |
| 128 | .save = mark_mt_save, |
Jan Engelhardt | 60756e7 | 2011-03-06 15:21:24 +0100 | [diff] [blame] | 129 | .x6_parse = mark_mt_parse, |
| 130 | .x6_options = mark_mt_opts, |
Jan Engelhardt | f2a7752 | 2009-06-25 20:12:12 +0200 | [diff] [blame] | 131 | }, |
Yasuyuki KOZAKAI | de9d244 | 2007-07-24 06:55:05 +0000 | [diff] [blame] | 132 | }; |
| 133 | |
Marc Boucher | e6869a8 | 2000-03-20 06:03:29 +0000 | [diff] [blame] | 134 | void _init(void) |
| 135 | { |
Jan Engelhardt | f2a7752 | 2009-06-25 20:12:12 +0200 | [diff] [blame] | 136 | xtables_register_matches(mark_mt_reg, ARRAY_SIZE(mark_mt_reg)); |
Marc Boucher | e6869a8 | 2000-03-20 06:03:29 +0000 | [diff] [blame] | 137 | } |