Jan Engelhardt | f4b737f | 2008-01-20 13:31:13 +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 | 6e22228 | 2007-08-04 08:06:55 +0000 | [diff] [blame] | 3 | #include <xtables.h> |
Yasuyuki KOZAKAI | 6e22228 | 2007-08-04 08:06:55 +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 | /* Version 0 */ |
| 7 | struct xt_mark_target_info { |
| 8 | unsigned long mark; |
| 9 | }; |
| 10 | |
| 11 | /* Version 1 */ |
| 12 | enum { |
| 13 | XT_MARK_SET=0, |
| 14 | XT_MARK_AND, |
| 15 | XT_MARK_OR, |
| 16 | }; |
| 17 | |
| 18 | struct xt_mark_target_info_v1 { |
| 19 | unsigned long mark; |
Jan Engelhardt | 7ac4052 | 2011-01-07 12:34:04 +0100 | [diff] [blame] | 20 | uint8_t mode; |
Jan Engelhardt | 350661a | 2010-01-31 22:42:52 +0100 | [diff] [blame] | 21 | }; |
| 22 | |
Jan Engelhardt | f4b737f | 2008-01-20 13:31:13 +0000 | [diff] [blame] | 23 | enum { |
Jan Engelhardt | 60756e7 | 2011-03-06 15:21:24 +0100 | [diff] [blame] | 24 | O_SET_MARK = 0, |
| 25 | O_AND_MARK, |
| 26 | O_OR_MARK, |
| 27 | O_XOR_MARK, |
| 28 | O_SET_XMARK, |
| 29 | F_SET_MARK = 1 << O_SET_MARK, |
| 30 | F_AND_MARK = 1 << O_AND_MARK, |
| 31 | F_OR_MARK = 1 << O_OR_MARK, |
| 32 | F_XOR_MARK = 1 << O_XOR_MARK, |
| 33 | F_SET_XMARK = 1 << O_SET_XMARK, |
| 34 | F_ANY = F_SET_MARK | F_AND_MARK | F_OR_MARK | |
| 35 | F_XOR_MARK | F_SET_XMARK, |
Jan Engelhardt | f4b737f | 2008-01-20 13:31:13 +0000 | [diff] [blame] | 36 | }; |
| 37 | |
Jan Engelhardt | 932e648 | 2007-10-04 16:27:30 +0000 | [diff] [blame] | 38 | static void MARK_help(void) |
Marc Boucher | e6869a8 | 2000-03-20 06:03:29 +0000 | [diff] [blame] | 39 | { |
| 40 | printf( |
Jan Engelhardt | 8b7c64d | 2008-04-15 11:48:25 +0200 | [diff] [blame] | 41 | "MARK target options:\n" |
Marc Boucher | e6869a8 | 2000-03-20 06:03:29 +0000 | [diff] [blame] | 42 | " --set-mark value Set nfmark value\n" |
Rusty Russell | 3aef54d | 2005-01-03 03:48:40 +0000 | [diff] [blame] | 43 | " --and-mark value Binary AND the nfmark with value\n" |
Jan Engelhardt | 8b7c64d | 2008-04-15 11:48:25 +0200 | [diff] [blame] | 44 | " --or-mark value Binary OR the nfmark with value\n"); |
Marc Boucher | e6869a8 | 2000-03-20 06:03:29 +0000 | [diff] [blame] | 45 | } |
| 46 | |
Jan Engelhardt | 60756e7 | 2011-03-06 15:21:24 +0100 | [diff] [blame] | 47 | static const struct xt_option_entry MARK_opts[] = { |
| 48 | {.name = "set-mark", .id = O_SET_MARK, .type = XTTYPE_UINT32, |
| 49 | .excl = F_ANY}, |
| 50 | {.name = "and-mark", .id = O_AND_MARK, .type = XTTYPE_UINT32, |
| 51 | .excl = F_ANY}, |
| 52 | {.name = "or-mark", .id = O_OR_MARK, .type = XTTYPE_UINT32, |
| 53 | .excl = F_ANY}, |
| 54 | XTOPT_TABLEEND, |
Marc Boucher | e6869a8 | 2000-03-20 06:03:29 +0000 | [diff] [blame] | 55 | }; |
| 56 | |
Jan Engelhardt | 60756e7 | 2011-03-06 15:21:24 +0100 | [diff] [blame] | 57 | static const struct xt_option_entry mark_tg_opts[] = { |
| 58 | {.name = "set-xmark", .id = O_SET_XMARK, .type = XTTYPE_MARKMASK32, |
| 59 | .excl = F_ANY}, |
| 60 | {.name = "set-mark", .id = O_SET_MARK, .type = XTTYPE_MARKMASK32, |
| 61 | .excl = F_ANY}, |
| 62 | {.name = "and-mark", .id = O_AND_MARK, .type = XTTYPE_UINT32, |
| 63 | .excl = F_ANY}, |
| 64 | {.name = "or-mark", .id = O_OR_MARK, .type = XTTYPE_UINT32, |
| 65 | .excl = F_ANY}, |
| 66 | {.name = "xor-mark", .id = O_XOR_MARK, .type = XTTYPE_UINT32, |
| 67 | .excl = F_ANY}, |
| 68 | XTOPT_TABLEEND, |
Jan Engelhardt | f4b737f | 2008-01-20 13:31:13 +0000 | [diff] [blame] | 69 | }; |
| 70 | |
| 71 | static void mark_tg_help(void) |
| 72 | { |
| 73 | printf( |
| 74 | "MARK target options:\n" |
| 75 | " --set-xmark value[/mask] Clear bits in mask and XOR value into nfmark\n" |
| 76 | " --set-mark value[/mask] Clear bits in mask and OR value into nfmark\n" |
| 77 | " --and-mark bits Binary AND the nfmark with bits\n" |
| 78 | " --or-mark bits Binary OR the nfmark with bits\n" |
| 79 | " --xor-mask bits Binary XOR the nfmark with bits\n" |
| 80 | "\n"); |
| 81 | } |
| 82 | |
Jan Engelhardt | 60756e7 | 2011-03-06 15:21:24 +0100 | [diff] [blame] | 83 | static void MARK_parse_v0(struct xt_option_call *cb) |
Marc Boucher | e6869a8 | 2000-03-20 06:03:29 +0000 | [diff] [blame] | 84 | { |
Jan Engelhardt | 60756e7 | 2011-03-06 15:21:24 +0100 | [diff] [blame] | 85 | struct xt_mark_target_info *markinfo = cb->data; |
Marc Boucher | e6869a8 | 2000-03-20 06:03:29 +0000 | [diff] [blame] | 86 | |
Jan Engelhardt | 60756e7 | 2011-03-06 15:21:24 +0100 | [diff] [blame] | 87 | xtables_option_parse(cb); |
| 88 | switch (cb->entry->id) { |
| 89 | case O_SET_MARK: |
| 90 | markinfo->mark = cb->val.mark; |
Marc Boucher | e6869a8 | 2000-03-20 06:03:29 +0000 | [diff] [blame] | 91 | break; |
Jan Engelhardt | 60756e7 | 2011-03-06 15:21:24 +0100 | [diff] [blame] | 92 | default: |
Jan Engelhardt | 1829ed4 | 2009-02-21 03:29:44 +0100 | [diff] [blame] | 93 | xtables_error(PARAMETER_PROBLEM, |
Jan Engelhardt | 60756e7 | 2011-03-06 15:21:24 +0100 | [diff] [blame] | 94 | "MARK target: kernel too old for --%s", |
| 95 | cb->entry->name); |
Marc Boucher | e6869a8 | 2000-03-20 06:03:29 +0000 | [diff] [blame] | 96 | } |
Marc Boucher | e6869a8 | 2000-03-20 06:03:29 +0000 | [diff] [blame] | 97 | } |
| 98 | |
Jan Engelhardt | 60756e7 | 2011-03-06 15:21:24 +0100 | [diff] [blame] | 99 | static void MARK_check(struct xt_fcheck_call *cb) |
Marc Boucher | e6869a8 | 2000-03-20 06:03:29 +0000 | [diff] [blame] | 100 | { |
Jan Engelhardt | 60756e7 | 2011-03-06 15:21:24 +0100 | [diff] [blame] | 101 | if (cb->xflags == 0) |
Jan Engelhardt | 1829ed4 | 2009-02-21 03:29:44 +0100 | [diff] [blame] | 102 | xtables_error(PARAMETER_PROBLEM, |
Rusty Russell | 3aef54d | 2005-01-03 03:48:40 +0000 | [diff] [blame] | 103 | "MARK target: Parameter --set/and/or-mark" |
| 104 | " is required"); |
| 105 | } |
| 106 | |
Jan Engelhardt | 60756e7 | 2011-03-06 15:21:24 +0100 | [diff] [blame] | 107 | static void MARK_parse_v1(struct xt_option_call *cb) |
Rusty Russell | 3aef54d | 2005-01-03 03:48:40 +0000 | [diff] [blame] | 108 | { |
Jan Engelhardt | 60756e7 | 2011-03-06 15:21:24 +0100 | [diff] [blame] | 109 | struct xt_mark_target_info_v1 *markinfo = cb->data; |
Rusty Russell | 3aef54d | 2005-01-03 03:48:40 +0000 | [diff] [blame] | 110 | |
Jan Engelhardt | 60756e7 | 2011-03-06 15:21:24 +0100 | [diff] [blame] | 111 | xtables_option_parse(cb); |
| 112 | switch (cb->entry->id) { |
| 113 | case O_SET_MARK: |
Yasuyuki KOZAKAI | 6e22228 | 2007-08-04 08:06:55 +0000 | [diff] [blame] | 114 | markinfo->mode = XT_MARK_SET; |
Rusty Russell | 3aef54d | 2005-01-03 03:48:40 +0000 | [diff] [blame] | 115 | break; |
Jan Engelhardt | 60756e7 | 2011-03-06 15:21:24 +0100 | [diff] [blame] | 116 | case O_AND_MARK: |
Yasuyuki KOZAKAI | 6e22228 | 2007-08-04 08:06:55 +0000 | [diff] [blame] | 117 | markinfo->mode = XT_MARK_AND; |
Rusty Russell | 3aef54d | 2005-01-03 03:48:40 +0000 | [diff] [blame] | 118 | break; |
Jan Engelhardt | 60756e7 | 2011-03-06 15:21:24 +0100 | [diff] [blame] | 119 | case O_OR_MARK: |
Yasuyuki KOZAKAI | 6e22228 | 2007-08-04 08:06:55 +0000 | [diff] [blame] | 120 | markinfo->mode = XT_MARK_OR; |
Rusty Russell | 3aef54d | 2005-01-03 03:48:40 +0000 | [diff] [blame] | 121 | break; |
Rusty Russell | 3aef54d | 2005-01-03 03:48:40 +0000 | [diff] [blame] | 122 | } |
Jan Engelhardt | 60756e7 | 2011-03-06 15:21:24 +0100 | [diff] [blame] | 123 | markinfo->mark = cb->val.u32; |
Marc Boucher | e6869a8 | 2000-03-20 06:03:29 +0000 | [diff] [blame] | 124 | } |
| 125 | |
Jan Engelhardt | 60756e7 | 2011-03-06 15:21:24 +0100 | [diff] [blame] | 126 | static void mark_tg_parse(struct xt_option_call *cb) |
Jan Engelhardt | f4b737f | 2008-01-20 13:31:13 +0000 | [diff] [blame] | 127 | { |
Jan Engelhardt | 60756e7 | 2011-03-06 15:21:24 +0100 | [diff] [blame] | 128 | struct xt_mark_tginfo2 *info = cb->data; |
Jan Engelhardt | f4b737f | 2008-01-20 13:31:13 +0000 | [diff] [blame] | 129 | |
Jan Engelhardt | 60756e7 | 2011-03-06 15:21:24 +0100 | [diff] [blame] | 130 | xtables_option_parse(cb); |
| 131 | switch (cb->entry->id) { |
| 132 | case O_SET_XMARK: |
| 133 | info->mark = cb->val.mark; |
| 134 | info->mask = cb->val.mask; |
Jan Engelhardt | f4b737f | 2008-01-20 13:31:13 +0000 | [diff] [blame] | 135 | break; |
Jan Engelhardt | 60756e7 | 2011-03-06 15:21:24 +0100 | [diff] [blame] | 136 | case O_SET_MARK: |
| 137 | info->mark = cb->val.mark; |
| 138 | info->mask = cb->val.mark | cb->val.mask; |
| 139 | break; |
| 140 | case O_AND_MARK: |
Jan Engelhardt | f4b737f | 2008-01-20 13:31:13 +0000 | [diff] [blame] | 141 | info->mark = 0; |
Jan Engelhardt | 60756e7 | 2011-03-06 15:21:24 +0100 | [diff] [blame] | 142 | info->mask = ~cb->val.u32; |
Jan Engelhardt | f4b737f | 2008-01-20 13:31:13 +0000 | [diff] [blame] | 143 | break; |
Jan Engelhardt | 60756e7 | 2011-03-06 15:21:24 +0100 | [diff] [blame] | 144 | case O_OR_MARK: |
| 145 | info->mark = info->mask = cb->val.u32; |
Jan Engelhardt | f4b737f | 2008-01-20 13:31:13 +0000 | [diff] [blame] | 146 | break; |
Jan Engelhardt | 60756e7 | 2011-03-06 15:21:24 +0100 | [diff] [blame] | 147 | case O_XOR_MARK: |
| 148 | info->mark = cb->val.u32; |
Jan Engelhardt | f4b737f | 2008-01-20 13:31:13 +0000 | [diff] [blame] | 149 | info->mask = 0; |
| 150 | break; |
Jan Engelhardt | f4b737f | 2008-01-20 13:31:13 +0000 | [diff] [blame] | 151 | } |
Jan Engelhardt | f4b737f | 2008-01-20 13:31:13 +0000 | [diff] [blame] | 152 | } |
| 153 | |
Jan Engelhardt | 60756e7 | 2011-03-06 15:21:24 +0100 | [diff] [blame] | 154 | static void mark_tg_check(struct xt_fcheck_call *cb) |
Jan Engelhardt | f4b737f | 2008-01-20 13:31:13 +0000 | [diff] [blame] | 155 | { |
Jan Engelhardt | 60756e7 | 2011-03-06 15:21:24 +0100 | [diff] [blame] | 156 | if (cb->xflags == 0) |
Jan Engelhardt | 1829ed4 | 2009-02-21 03:29:44 +0100 | [diff] [blame] | 157 | xtables_error(PARAMETER_PROBLEM, "MARK: One of the --set-xmark, " |
Jan Engelhardt | f4b737f | 2008-01-20 13:31:13 +0000 | [diff] [blame] | 158 | "--{and,or,xor,set}-mark options is required"); |
| 159 | } |
| 160 | |
Martin Josefsson | c5617bf | 2004-05-26 21:56:26 +0000 | [diff] [blame] | 161 | static void |
| 162 | print_mark(unsigned long mark) |
Marc Boucher | e6869a8 | 2000-03-20 06:03:29 +0000 | [diff] [blame] | 163 | { |
Jan Engelhardt | 7386635 | 2010-12-18 02:04:59 +0100 | [diff] [blame] | 164 | printf(" 0x%lx", mark); |
Marc Boucher | e6869a8 | 2000-03-20 06:03:29 +0000 | [diff] [blame] | 165 | } |
| 166 | |
Jan Engelhardt | 932e648 | 2007-10-04 16:27:30 +0000 | [diff] [blame] | 167 | static void MARK_print_v0(const void *ip, |
| 168 | const struct xt_entry_target *target, int numeric) |
Marc Boucher | e6869a8 | 2000-03-20 06:03:29 +0000 | [diff] [blame] | 169 | { |
Yasuyuki KOZAKAI | 6e22228 | 2007-08-04 08:06:55 +0000 | [diff] [blame] | 170 | const struct xt_mark_target_info *markinfo = |
| 171 | (const struct xt_mark_target_info *)target->data; |
Jan Engelhardt | 7386635 | 2010-12-18 02:04:59 +0100 | [diff] [blame] | 172 | printf(" MARK set"); |
Martin Josefsson | c5617bf | 2004-05-26 21:56:26 +0000 | [diff] [blame] | 173 | print_mark(markinfo->mark); |
Marc Boucher | e6869a8 | 2000-03-20 06:03:29 +0000 | [diff] [blame] | 174 | } |
| 175 | |
Jan Engelhardt | 932e648 | 2007-10-04 16:27:30 +0000 | [diff] [blame] | 176 | static void MARK_save_v0(const void *ip, const struct xt_entry_target *target) |
Marc Boucher | e6869a8 | 2000-03-20 06:03:29 +0000 | [diff] [blame] | 177 | { |
Yasuyuki KOZAKAI | 6e22228 | 2007-08-04 08:06:55 +0000 | [diff] [blame] | 178 | const struct xt_mark_target_info *markinfo = |
| 179 | (const struct xt_mark_target_info *)target->data; |
Rusty Russell | 7e53bf9 | 2000-03-20 07:03:28 +0000 | [diff] [blame] | 180 | |
Jan Engelhardt | 7386635 | 2010-12-18 02:04:59 +0100 | [diff] [blame] | 181 | printf(" --set-mark"); |
Martin Josefsson | c5617bf | 2004-05-26 21:56:26 +0000 | [diff] [blame] | 182 | print_mark(markinfo->mark); |
Marc Boucher | e6869a8 | 2000-03-20 06:03:29 +0000 | [diff] [blame] | 183 | } |
| 184 | |
Jan Engelhardt | 932e648 | 2007-10-04 16:27:30 +0000 | [diff] [blame] | 185 | static void MARK_print_v1(const void *ip, const struct xt_entry_target *target, |
| 186 | int numeric) |
Rusty Russell | 3aef54d | 2005-01-03 03:48:40 +0000 | [diff] [blame] | 187 | { |
Yasuyuki KOZAKAI | 6e22228 | 2007-08-04 08:06:55 +0000 | [diff] [blame] | 188 | const struct xt_mark_target_info_v1 *markinfo = |
| 189 | (const struct xt_mark_target_info_v1 *)target->data; |
Rusty Russell | 3aef54d | 2005-01-03 03:48:40 +0000 | [diff] [blame] | 190 | |
| 191 | switch (markinfo->mode) { |
Yasuyuki KOZAKAI | 6e22228 | 2007-08-04 08:06:55 +0000 | [diff] [blame] | 192 | case XT_MARK_SET: |
Jan Engelhardt | 7386635 | 2010-12-18 02:04:59 +0100 | [diff] [blame] | 193 | printf(" MARK set"); |
Rusty Russell | 3aef54d | 2005-01-03 03:48:40 +0000 | [diff] [blame] | 194 | break; |
Yasuyuki KOZAKAI | 6e22228 | 2007-08-04 08:06:55 +0000 | [diff] [blame] | 195 | case XT_MARK_AND: |
Jan Engelhardt | 7386635 | 2010-12-18 02:04:59 +0100 | [diff] [blame] | 196 | printf(" MARK and"); |
Rusty Russell | 3aef54d | 2005-01-03 03:48:40 +0000 | [diff] [blame] | 197 | break; |
Yasuyuki KOZAKAI | 6e22228 | 2007-08-04 08:06:55 +0000 | [diff] [blame] | 198 | case XT_MARK_OR: |
Jan Engelhardt | 7386635 | 2010-12-18 02:04:59 +0100 | [diff] [blame] | 199 | printf(" MARK or"); |
Rusty Russell | 3aef54d | 2005-01-03 03:48:40 +0000 | [diff] [blame] | 200 | break; |
| 201 | } |
| 202 | print_mark(markinfo->mark); |
| 203 | } |
| 204 | |
Jan Engelhardt | f4b737f | 2008-01-20 13:31:13 +0000 | [diff] [blame] | 205 | static void mark_tg_print(const void *ip, const struct xt_entry_target *target, |
| 206 | int numeric) |
| 207 | { |
| 208 | const struct xt_mark_tginfo2 *info = (const void *)target->data; |
| 209 | |
| 210 | if (info->mark == 0) |
Jan Engelhardt | 7386635 | 2010-12-18 02:04:59 +0100 | [diff] [blame] | 211 | printf(" MARK and 0x%x", (unsigned int)(uint32_t)~info->mask); |
Jan Engelhardt | f4b737f | 2008-01-20 13:31:13 +0000 | [diff] [blame] | 212 | else if (info->mark == info->mask) |
Jan Engelhardt | 7386635 | 2010-12-18 02:04:59 +0100 | [diff] [blame] | 213 | printf(" MARK or 0x%x", info->mark); |
Jan Engelhardt | f4b737f | 2008-01-20 13:31:13 +0000 | [diff] [blame] | 214 | else if (info->mask == 0) |
Jan Engelhardt | 7386635 | 2010-12-18 02:04:59 +0100 | [diff] [blame] | 215 | printf(" MARK xor 0x%x", info->mark); |
Patrick McHardy | 3d915e1 | 2009-11-04 13:03:50 +0100 | [diff] [blame] | 216 | else if (info->mask == 0xffffffffU) |
Jan Engelhardt | 7386635 | 2010-12-18 02:04:59 +0100 | [diff] [blame] | 217 | printf(" MARK set 0x%x", info->mark); |
Jan Engelhardt | f4b737f | 2008-01-20 13:31:13 +0000 | [diff] [blame] | 218 | else |
Jan Engelhardt | 7386635 | 2010-12-18 02:04:59 +0100 | [diff] [blame] | 219 | printf(" MARK xset 0x%x/0x%x", info->mark, info->mask); |
Jan Engelhardt | f4b737f | 2008-01-20 13:31:13 +0000 | [diff] [blame] | 220 | } |
| 221 | |
Jan Engelhardt | 932e648 | 2007-10-04 16:27:30 +0000 | [diff] [blame] | 222 | static void MARK_save_v1(const void *ip, const struct xt_entry_target *target) |
Rusty Russell | 3aef54d | 2005-01-03 03:48:40 +0000 | [diff] [blame] | 223 | { |
Yasuyuki KOZAKAI | 6e22228 | 2007-08-04 08:06:55 +0000 | [diff] [blame] | 224 | const struct xt_mark_target_info_v1 *markinfo = |
| 225 | (const struct xt_mark_target_info_v1 *)target->data; |
Rusty Russell | 3aef54d | 2005-01-03 03:48:40 +0000 | [diff] [blame] | 226 | |
| 227 | switch (markinfo->mode) { |
Yasuyuki KOZAKAI | 6e22228 | 2007-08-04 08:06:55 +0000 | [diff] [blame] | 228 | case XT_MARK_SET: |
Jan Engelhardt | 7386635 | 2010-12-18 02:04:59 +0100 | [diff] [blame] | 229 | printf(" --set-mark"); |
Rusty Russell | 3aef54d | 2005-01-03 03:48:40 +0000 | [diff] [blame] | 230 | break; |
Yasuyuki KOZAKAI | 6e22228 | 2007-08-04 08:06:55 +0000 | [diff] [blame] | 231 | case XT_MARK_AND: |
Jan Engelhardt | 7386635 | 2010-12-18 02:04:59 +0100 | [diff] [blame] | 232 | printf(" --and-mark"); |
Rusty Russell | 3aef54d | 2005-01-03 03:48:40 +0000 | [diff] [blame] | 233 | break; |
Yasuyuki KOZAKAI | 6e22228 | 2007-08-04 08:06:55 +0000 | [diff] [blame] | 234 | case XT_MARK_OR: |
Jan Engelhardt | 7386635 | 2010-12-18 02:04:59 +0100 | [diff] [blame] | 235 | printf(" --or-mark"); |
Rusty Russell | 3aef54d | 2005-01-03 03:48:40 +0000 | [diff] [blame] | 236 | break; |
| 237 | } |
| 238 | print_mark(markinfo->mark); |
| 239 | } |
| 240 | |
Jan Engelhardt | f4b737f | 2008-01-20 13:31:13 +0000 | [diff] [blame] | 241 | static void mark_tg_save(const void *ip, const struct xt_entry_target *target) |
| 242 | { |
| 243 | const struct xt_mark_tginfo2 *info = (const void *)target->data; |
| 244 | |
Jan Engelhardt | 7386635 | 2010-12-18 02:04:59 +0100 | [diff] [blame] | 245 | printf(" --set-xmark 0x%x/0x%x", info->mark, info->mask); |
Jan Engelhardt | f4b737f | 2008-01-20 13:31:13 +0000 | [diff] [blame] | 246 | } |
| 247 | |
Jan Engelhardt | f2a7752 | 2009-06-25 20:12:12 +0200 | [diff] [blame] | 248 | static struct xtables_target mark_tg_reg[] = { |
| 249 | { |
| 250 | .family = NFPROTO_UNSPEC, |
| 251 | .name = "MARK", |
| 252 | .version = XTABLES_VERSION, |
| 253 | .revision = 0, |
| 254 | .size = XT_ALIGN(sizeof(struct xt_mark_target_info)), |
| 255 | .userspacesize = XT_ALIGN(sizeof(struct xt_mark_target_info)), |
| 256 | .help = MARK_help, |
Jan Engelhardt | f2a7752 | 2009-06-25 20:12:12 +0200 | [diff] [blame] | 257 | .print = MARK_print_v0, |
| 258 | .save = MARK_save_v0, |
Jan Engelhardt | 60756e7 | 2011-03-06 15:21:24 +0100 | [diff] [blame] | 259 | .x6_parse = MARK_parse_v0, |
| 260 | .x6_fcheck = MARK_check, |
| 261 | .x6_options = MARK_opts, |
Jan Engelhardt | f2a7752 | 2009-06-25 20:12:12 +0200 | [diff] [blame] | 262 | }, |
| 263 | { |
| 264 | .family = NFPROTO_IPV4, |
| 265 | .name = "MARK", |
| 266 | .version = XTABLES_VERSION, |
| 267 | .revision = 1, |
| 268 | .size = XT_ALIGN(sizeof(struct xt_mark_target_info_v1)), |
| 269 | .userspacesize = XT_ALIGN(sizeof(struct xt_mark_target_info_v1)), |
| 270 | .help = MARK_help, |
Jan Engelhardt | f2a7752 | 2009-06-25 20:12:12 +0200 | [diff] [blame] | 271 | .print = MARK_print_v1, |
| 272 | .save = MARK_save_v1, |
Jan Engelhardt | 60756e7 | 2011-03-06 15:21:24 +0100 | [diff] [blame] | 273 | .x6_parse = MARK_parse_v1, |
| 274 | .x6_fcheck = MARK_check, |
| 275 | .x6_options = MARK_opts, |
Jan Engelhardt | f2a7752 | 2009-06-25 20:12:12 +0200 | [diff] [blame] | 276 | }, |
| 277 | { |
| 278 | .version = XTABLES_VERSION, |
| 279 | .name = "MARK", |
| 280 | .revision = 2, |
| 281 | .family = NFPROTO_UNSPEC, |
| 282 | .size = XT_ALIGN(sizeof(struct xt_mark_tginfo2)), |
| 283 | .userspacesize = XT_ALIGN(sizeof(struct xt_mark_tginfo2)), |
| 284 | .help = mark_tg_help, |
Jan Engelhardt | f2a7752 | 2009-06-25 20:12:12 +0200 | [diff] [blame] | 285 | .print = mark_tg_print, |
| 286 | .save = mark_tg_save, |
Jan Engelhardt | 60756e7 | 2011-03-06 15:21:24 +0100 | [diff] [blame] | 287 | .x6_parse = mark_tg_parse, |
| 288 | .x6_fcheck = mark_tg_check, |
| 289 | .x6_options = mark_tg_opts, |
Jan Engelhardt | f2a7752 | 2009-06-25 20:12:12 +0200 | [diff] [blame] | 290 | }, |
Jan Engelhardt | f4b737f | 2008-01-20 13:31:13 +0000 | [diff] [blame] | 291 | }; |
| 292 | |
Marc Boucher | e6869a8 | 2000-03-20 06:03:29 +0000 | [diff] [blame] | 293 | void _init(void) |
| 294 | { |
Jan Engelhardt | f2a7752 | 2009-06-25 20:12:12 +0200 | [diff] [blame] | 295 | xtables_register_targets(mark_tg_reg, ARRAY_SIZE(mark_tg_reg)); |
Marc Boucher | e6869a8 | 2000-03-20 06:03:29 +0000 | [diff] [blame] | 296 | } |