libxt_connmark.c revision 69f564e3890976461de0016cd81171ff8bfa8353
1469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte/* Shared library add-on to iptables to add connmark matching support. 2469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte * 3469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte * (C) 2002,2004 MARA Systems AB <http://www.marasystems.com> 4469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte * by Henrik Nordstrom <hno@marasystems.com> 5469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte * 6469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte * Version 1.1 7469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte * 8469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte * This program is free software; you can redistribute it and/or modify 9469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte * it under the terms of the GNU General Public License as published by 10469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte * the Free Software Foundation; either version 2 of the License, or 11469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte * (at your option) any later version. 12469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte * 13469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte * This program is distributed in the hope that it will be useful, 14469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte * but WITHOUT ANY WARRANTY; without even the implied warranty of 15469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte * GNU General Public License for more details. 17469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte * 18469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte * You should have received a copy of the GNU General Public License 19469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte * along with this program; if not, write to the Free Software 20469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 21469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte */ 22469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte#include <stdio.h> 23469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte#include <netdb.h> 24469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte#include <string.h> 25469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte#include <stdlib.h> 26469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte#include <getopt.h> 27469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte 28c57c155312a544482a6b8a3c0f7224b00cfaae20Yasuyuki KOZAKAI#include <xtables.h> 29c57c155312a544482a6b8a3c0f7224b00cfaae20Yasuyuki KOZAKAI#include <linux/netfilter/xt_connmark.h> 30469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte 31a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardtenum { 32a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt F_MARK = 1 << 0, 33a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt}; 34a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt 35a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardtstatic void connmark_mt_help(void) 36469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte{ 37469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte printf( 38a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt"connmark match options:\n" 398b7c64d6ba156a99008fcd810cba874c73294333Jan Engelhardt"[!] --mark value[/mask] Match ctmark value with optional mask\n"); 40469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte} 41469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte 42a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardtstatic const struct option connmark_mt_opts[] = { 43a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt {.name = "mark", .has_arg = true, .val = '1'}, 449ee386a1b6d7704b259460152c959ab0e79e02aaMax Kellermann { .name = NULL } 45469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte}; 46469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte 47a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardtstatic int 48a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardtconnmark_mt_parse(int c, char **argv, int invert, unsigned int *flags, 49a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt const void *entry, struct xt_entry_match **match) 50a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt{ 51a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt struct xt_connmark_mtinfo1 *info = (void *)(*match)->data; 52a80975497968e69b23f56bf15d346c65bec381f2Jan Engelhardt unsigned int mark, mask = UINT32_MAX; 53a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt char *end; 54a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt 55a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt switch (c) { 56a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt case '1': /* --mark */ 57a41545ca7cde43e0ba53260ba74bd9bf74025a68Jan Engelhardt xtables_param_act(XTF_ONLY_ONCE, "connmark", "--mark", *flags & F_MARK); 585f2922cfc0bbfbeb878f5c12e9fb3eb602ae5507Jan Engelhardt if (!xtables_strtoui(optarg, &end, &mark, 0, UINT32_MAX)) 59a41545ca7cde43e0ba53260ba74bd9bf74025a68Jan Engelhardt xtables_param_act(XTF_BAD_VALUE, "connmark", "--mark", optarg); 60a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt if (*end == '/') 615f2922cfc0bbfbeb878f5c12e9fb3eb602ae5507Jan Engelhardt if (!xtables_strtoui(end + 1, &end, &mask, 0, UINT32_MAX)) 62a41545ca7cde43e0ba53260ba74bd9bf74025a68Jan Engelhardt xtables_param_act(XTF_BAD_VALUE, "connmark", "--mark", optarg); 63a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt if (*end != '\0') 64a41545ca7cde43e0ba53260ba74bd9bf74025a68Jan Engelhardt xtables_param_act(XTF_BAD_VALUE, "connmark", "--mark", optarg); 65a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt 66a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt if (invert) 67a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt info->invert = true; 68a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt info->mark = mark; 69a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt info->mask = mask; 70a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt *flags |= F_MARK; 71a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt return true; 72a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt } 73a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt return false; 74a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt} 75a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt 76469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Weltestatic int 77181dead3f13befe02769ef479bcbb51801b7fc4eJan Engelhardtconnmark_parse(int c, char **argv, int invert, unsigned int *flags, 78181dead3f13befe02769ef479bcbb51801b7fc4eJan Engelhardt const void *entry, struct xt_entry_match **match) 79469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte{ 80c57c155312a544482a6b8a3c0f7224b00cfaae20Yasuyuki KOZAKAI struct xt_connmark_info *markinfo = (struct xt_connmark_info *)(*match)->data; 81469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte 82469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte switch (c) { 83469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte char *end; 84469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte case '1': 850f16c725aadaac7e670d632ecbaea3661ff00827Jan Engelhardt xtables_check_inverse(optarg, &invert, &optind, 0); 86469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte 87469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte markinfo->mark = strtoul(optarg, &end, 0); 88469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte markinfo->mask = 0xffffffffUL; 89469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte 90469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte if (*end == '/') 91469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte markinfo->mask = strtoul(end+1, &end, 0); 92469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte 93469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte if (*end != '\0' || end == optarg) 941829ed482efbc8b390cc760d012b3a4450494e1aJan Engelhardt xtables_error(PARAMETER_PROBLEM, "Bad MARK value \"%s\"", optarg); 95469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte if (invert) 96469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte markinfo->invert = 1; 97469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte *flags = 1; 98469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte break; 99469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte 100469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte default: 101469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte return 0; 102469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte } 103469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte return 1; 104469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte} 105469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte 106a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardtstatic void print_mark(unsigned int mark, unsigned int mask) 107469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte{ 108a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt if (mask != 0xffffffffU) 109a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt printf("0x%x/0x%x ", mark, mask); 110469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte else 111a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt printf("0x%x ", mark); 112469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte} 113469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte 114a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardtstatic void connmark_mt_check(unsigned int flags) 115469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte{ 116a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt if (flags == 0) 1171829ed482efbc8b390cc760d012b3a4450494e1aJan Engelhardt xtables_error(PARAMETER_PROBLEM, 118a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt "connmark: The --mark option is required"); 119469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte} 120469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte 121469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Weltestatic void 122181dead3f13befe02769ef479bcbb51801b7fc4eJan Engelhardtconnmark_print(const void *ip, const struct xt_entry_match *match, int numeric) 123469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte{ 12469f564e3890976461de0016cd81171ff8bfa8353Jan Engelhardt const struct xt_connmark_info *info = (const void *)match->data; 125469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte 126469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte printf("CONNMARK match "); 127469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte if (info->invert) 128469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte printf("!"); 129a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt print_mark(info->mark, info->mask); 130a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt} 131a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt 132a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardtstatic void 133a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardtconnmark_mt_print(const void *ip, const struct xt_entry_match *match, int numeric) 134a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt{ 135a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt const struct xt_connmark_mtinfo1 *info = (const void *)match->data; 136a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt 137a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt printf("connmark match "); 138a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt if (info->invert) 139a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt printf("!"); 140a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt print_mark(info->mark, info->mask); 141469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte} 142469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte 143181dead3f13befe02769ef479bcbb51801b7fc4eJan Engelhardtstatic void connmark_save(const void *ip, const struct xt_entry_match *match) 144469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte{ 14569f564e3890976461de0016cd81171ff8bfa8353Jan Engelhardt const struct xt_connmark_info *info = (const void *)match->data; 146469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte 147469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte if (info->invert) 148469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte printf("! "); 149469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte 150469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte printf("--mark "); 151a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt print_mark(info->mark, info->mask); 152a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt} 153a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt 154a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardtstatic void 155a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardtconnmark_mt_save(const void *ip, const struct xt_entry_match *match) 156a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt{ 157a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt const struct xt_connmark_mtinfo1 *info = (const void *)match->data; 158a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt 159a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt if (info->invert) 160a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt printf("! "); 161a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt 162a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt printf("--mark "); 163a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt print_mark(info->mark, info->mask); 164469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte} 165469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte 166a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardtstatic struct xtables_match connmark_mt_reg_v0 = { 16703d99486d8283552705b58dc55b6085dffc38792Jan Engelhardt .family = NFPROTO_IPV4, 168c57c155312a544482a6b8a3c0f7224b00cfaae20Yasuyuki KOZAKAI .name = "connmark", 169a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt .revision = 0, 1708b7c64d6ba156a99008fcd810cba874c73294333Jan Engelhardt .version = XTABLES_VERSION, 171c57c155312a544482a6b8a3c0f7224b00cfaae20Yasuyuki KOZAKAI .size = XT_ALIGN(sizeof(struct xt_connmark_info)), 172c57c155312a544482a6b8a3c0f7224b00cfaae20Yasuyuki KOZAKAI .userspacesize = XT_ALIGN(sizeof(struct xt_connmark_info)), 173a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt .help = connmark_mt_help, 174181dead3f13befe02769ef479bcbb51801b7fc4eJan Engelhardt .parse = connmark_parse, 175a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt .final_check = connmark_mt_check, 176181dead3f13befe02769ef479bcbb51801b7fc4eJan Engelhardt .print = connmark_print, 177181dead3f13befe02769ef479bcbb51801b7fc4eJan Engelhardt .save = connmark_save, 178a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt .extra_opts = connmark_mt_opts, 179c57c155312a544482a6b8a3c0f7224b00cfaae20Yasuyuki KOZAKAI}; 180c57c155312a544482a6b8a3c0f7224b00cfaae20Yasuyuki KOZAKAI 181a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardtstatic struct xtables_match connmark_mt6_reg_v0 = { 18203d99486d8283552705b58dc55b6085dffc38792Jan Engelhardt .family = NFPROTO_IPV6, 183c57c155312a544482a6b8a3c0f7224b00cfaae20Yasuyuki KOZAKAI .name = "connmark", 184a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt .revision = 0, 1858b7c64d6ba156a99008fcd810cba874c73294333Jan Engelhardt .version = XTABLES_VERSION, 186c57c155312a544482a6b8a3c0f7224b00cfaae20Yasuyuki KOZAKAI .size = XT_ALIGN(sizeof(struct xt_connmark_info)), 187c57c155312a544482a6b8a3c0f7224b00cfaae20Yasuyuki KOZAKAI .userspacesize = XT_ALIGN(sizeof(struct xt_connmark_info)), 188a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt .help = connmark_mt_help, 189181dead3f13befe02769ef479bcbb51801b7fc4eJan Engelhardt .parse = connmark_parse, 190a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt .final_check = connmark_mt_check, 191181dead3f13befe02769ef479bcbb51801b7fc4eJan Engelhardt .print = connmark_print, 192181dead3f13befe02769ef479bcbb51801b7fc4eJan Engelhardt .save = connmark_save, 193a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt .extra_opts = connmark_mt_opts, 194a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt}; 195a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt 196a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardtstatic struct xtables_match connmark_mt_reg = { 1978b7c64d6ba156a99008fcd810cba874c73294333Jan Engelhardt .version = XTABLES_VERSION, 198a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt .name = "connmark", 199a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt .revision = 1, 20003d99486d8283552705b58dc55b6085dffc38792Jan Engelhardt .family = NFPROTO_IPV4, 201a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt .size = XT_ALIGN(sizeof(struct xt_connmark_mtinfo1)), 202a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt .userspacesize = XT_ALIGN(sizeof(struct xt_connmark_mtinfo1)), 203a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt .help = connmark_mt_help, 204a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt .parse = connmark_mt_parse, 205a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt .final_check = connmark_mt_check, 206a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt .print = connmark_mt_print, 207a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt .save = connmark_mt_save, 208a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt .extra_opts = connmark_mt_opts, 209a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt}; 210a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt 211a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardtstatic struct xtables_match connmark_mt6_reg = { 2128b7c64d6ba156a99008fcd810cba874c73294333Jan Engelhardt .version = XTABLES_VERSION, 213a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt .name = "connmark", 214a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt .revision = 1, 21503d99486d8283552705b58dc55b6085dffc38792Jan Engelhardt .family = NFPROTO_IPV6, 216a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt .size = XT_ALIGN(sizeof(struct xt_connmark_mtinfo1)), 217a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt .userspacesize = XT_ALIGN(sizeof(struct xt_connmark_mtinfo1)), 218a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt .help = connmark_mt_help, 219a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt .parse = connmark_mt_parse, 220a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt .final_check = connmark_mt_check, 221a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt .print = connmark_mt_print, 222a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt .save = connmark_mt_save, 223a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt .extra_opts = connmark_mt_opts, 224469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte}; 225469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte 226469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Weltevoid _init(void) 227469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte{ 228a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt xtables_register_match(&connmark_mt_reg_v0); 229a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt xtables_register_match(&connmark_mt6_reg_v0); 230a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt xtables_register_match(&connmark_mt_reg); 231a7b0707bd83bac30a92871872dab79ec8cebebbbJan Engelhardt xtables_register_match(&connmark_mt6_reg); 232469d18f66896ef509cac5a2ade494ea38e0c86e2Harald Welte} 233