1f233df44196f568075a5d70fc29f31b72b512783Pablo Neira Ayuso/* 2f233df44196f568075a5d70fc29f31b72b512783Pablo Neira Ayuso * (C) 2011 by Pablo Neira Ayuso <pablo@netfilter.org> 3f233df44196f568075a5d70fc29f31b72b512783Pablo Neira Ayuso * (C) 2011 by Intra2Net AG <http://www.intra2net.com> 4f233df44196f568075a5d70fc29f31b72b512783Pablo Neira Ayuso * 5f233df44196f568075a5d70fc29f31b72b512783Pablo Neira Ayuso * This program is free software; you can redistribute it and/or modify 6f233df44196f568075a5d70fc29f31b72b512783Pablo Neira Ayuso * it under the terms of the GNU General Public License version 2 (or 7f233df44196f568075a5d70fc29f31b72b512783Pablo Neira Ayuso * any later at your option) as published by the Free Software Foundation. 8f233df44196f568075a5d70fc29f31b72b512783Pablo Neira Ayuso */ 9f233df44196f568075a5d70fc29f31b72b512783Pablo Neira Ayuso#include <stdbool.h> 10f233df44196f568075a5d70fc29f31b72b512783Pablo Neira Ayuso#include <stdlib.h> 11f233df44196f568075a5d70fc29f31b72b512783Pablo Neira Ayuso#include <stdio.h> 12f233df44196f568075a5d70fc29f31b72b512783Pablo Neira Ayuso#include <string.h> 13f233df44196f568075a5d70fc29f31b72b512783Pablo Neira Ayuso#include <getopt.h> 14f233df44196f568075a5d70fc29f31b72b512783Pablo Neira Ayuso#include <xtables.h> 15f233df44196f568075a5d70fc29f31b72b512783Pablo Neira Ayuso 16f233df44196f568075a5d70fc29f31b72b512783Pablo Neira Ayuso#include <linux/netfilter/x_tables.h> 17f233df44196f568075a5d70fc29f31b72b512783Pablo Neira Ayuso#include <linux/netfilter/xt_nfacct.h> 18f233df44196f568075a5d70fc29f31b72b512783Pablo Neira Ayuso 19f233df44196f568075a5d70fc29f31b72b512783Pablo Neira Ayusoenum { 20f233df44196f568075a5d70fc29f31b72b512783Pablo Neira Ayuso O_NAME = 0, 21f233df44196f568075a5d70fc29f31b72b512783Pablo Neira Ayuso}; 22f233df44196f568075a5d70fc29f31b72b512783Pablo Neira Ayuso 23f233df44196f568075a5d70fc29f31b72b512783Pablo Neira Ayuso#define s struct xt_nfacct_match_info 24f233df44196f568075a5d70fc29f31b72b512783Pablo Neira Ayusostatic const struct xt_option_entry nfacct_opts[] = { 25f233df44196f568075a5d70fc29f31b72b512783Pablo Neira Ayuso {.name = "nfacct-name", .id = O_NAME, .type = XTTYPE_STRING, 26f233df44196f568075a5d70fc29f31b72b512783Pablo Neira Ayuso .min = 1, .flags = XTOPT_MAND|XTOPT_PUT, XTOPT_POINTER(s, name)}, 27f233df44196f568075a5d70fc29f31b72b512783Pablo Neira Ayuso XTOPT_TABLEEND, 28f233df44196f568075a5d70fc29f31b72b512783Pablo Neira Ayuso}; 29f233df44196f568075a5d70fc29f31b72b512783Pablo Neira Ayuso#undef s 30f233df44196f568075a5d70fc29f31b72b512783Pablo Neira Ayuso 31f233df44196f568075a5d70fc29f31b72b512783Pablo Neira Ayusostatic void nfacct_help(void) 32f233df44196f568075a5d70fc29f31b72b512783Pablo Neira Ayuso{ 33f233df44196f568075a5d70fc29f31b72b512783Pablo Neira Ayuso printf("nfacct match options:\n" 34f233df44196f568075a5d70fc29f31b72b512783Pablo Neira Ayuso " --nfacct-name STRING Name of accouting area\n"); 35f233df44196f568075a5d70fc29f31b72b512783Pablo Neira Ayuso} 36f233df44196f568075a5d70fc29f31b72b512783Pablo Neira Ayuso 37f233df44196f568075a5d70fc29f31b72b512783Pablo Neira Ayusostatic void nfacct_parse(struct xt_option_call *cb) 38f233df44196f568075a5d70fc29f31b72b512783Pablo Neira Ayuso{ 39f233df44196f568075a5d70fc29f31b72b512783Pablo Neira Ayuso xtables_option_parse(cb); 40f233df44196f568075a5d70fc29f31b72b512783Pablo Neira Ayuso switch (cb->entry->id) { 41f233df44196f568075a5d70fc29f31b72b512783Pablo Neira Ayuso case O_NAME: 42f233df44196f568075a5d70fc29f31b72b512783Pablo Neira Ayuso if (strchr(cb->arg, '\n') != NULL) 43f233df44196f568075a5d70fc29f31b72b512783Pablo Neira Ayuso xtables_error(PARAMETER_PROBLEM, 44f233df44196f568075a5d70fc29f31b72b512783Pablo Neira Ayuso "Newlines not allowed in --nfacct-name"); 45f233df44196f568075a5d70fc29f31b72b512783Pablo Neira Ayuso break; 46f233df44196f568075a5d70fc29f31b72b512783Pablo Neira Ayuso } 47f233df44196f568075a5d70fc29f31b72b512783Pablo Neira Ayuso} 48f233df44196f568075a5d70fc29f31b72b512783Pablo Neira Ayuso 49f233df44196f568075a5d70fc29f31b72b512783Pablo Neira Ayusostatic void 50f233df44196f568075a5d70fc29f31b72b512783Pablo Neira Ayusonfacct_print_name(const struct xt_nfacct_match_info *info, char *name) 51f233df44196f568075a5d70fc29f31b72b512783Pablo Neira Ayuso{ 52f233df44196f568075a5d70fc29f31b72b512783Pablo Neira Ayuso printf(" %snfacct-name ", name); 53f233df44196f568075a5d70fc29f31b72b512783Pablo Neira Ayuso xtables_save_string(info->name); 54f233df44196f568075a5d70fc29f31b72b512783Pablo Neira Ayuso} 55f233df44196f568075a5d70fc29f31b72b512783Pablo Neira Ayuso 56f233df44196f568075a5d70fc29f31b72b512783Pablo Neira Ayusostatic void nfacct_print(const void *ip, const struct xt_entry_match *match, 57f233df44196f568075a5d70fc29f31b72b512783Pablo Neira Ayuso int numeric) 58f233df44196f568075a5d70fc29f31b72b512783Pablo Neira Ayuso{ 59f233df44196f568075a5d70fc29f31b72b512783Pablo Neira Ayuso const struct xt_nfacct_match_info *info = 60f233df44196f568075a5d70fc29f31b72b512783Pablo Neira Ayuso (struct xt_nfacct_match_info *)match->data; 61f233df44196f568075a5d70fc29f31b72b512783Pablo Neira Ayuso 62f233df44196f568075a5d70fc29f31b72b512783Pablo Neira Ayuso nfacct_print_name(info, ""); 63f233df44196f568075a5d70fc29f31b72b512783Pablo Neira Ayuso} 64f233df44196f568075a5d70fc29f31b72b512783Pablo Neira Ayuso 65f233df44196f568075a5d70fc29f31b72b512783Pablo Neira Ayusostatic void nfacct_save(const void *ip, const struct xt_entry_match *match) 66f233df44196f568075a5d70fc29f31b72b512783Pablo Neira Ayuso{ 67f233df44196f568075a5d70fc29f31b72b512783Pablo Neira Ayuso const struct xt_nfacct_match_info *info = 68f233df44196f568075a5d70fc29f31b72b512783Pablo Neira Ayuso (struct xt_nfacct_match_info *)match->data; 69f233df44196f568075a5d70fc29f31b72b512783Pablo Neira Ayuso 70f233df44196f568075a5d70fc29f31b72b512783Pablo Neira Ayuso nfacct_print_name(info, "--"); 71f233df44196f568075a5d70fc29f31b72b512783Pablo Neira Ayuso} 72f233df44196f568075a5d70fc29f31b72b512783Pablo Neira Ayuso 73f233df44196f568075a5d70fc29f31b72b512783Pablo Neira Ayusostatic struct xtables_match nfacct_match = { 74f233df44196f568075a5d70fc29f31b72b512783Pablo Neira Ayuso .family = NFPROTO_UNSPEC, 75f233df44196f568075a5d70fc29f31b72b512783Pablo Neira Ayuso .name = "nfacct", 76f233df44196f568075a5d70fc29f31b72b512783Pablo Neira Ayuso .version = XTABLES_VERSION, 77f233df44196f568075a5d70fc29f31b72b512783Pablo Neira Ayuso .size = XT_ALIGN(sizeof(struct xt_nfacct_match_info)), 78f233df44196f568075a5d70fc29f31b72b512783Pablo Neira Ayuso .userspacesize = offsetof(struct xt_nfacct_match_info, nfacct), 79f233df44196f568075a5d70fc29f31b72b512783Pablo Neira Ayuso .help = nfacct_help, 80f233df44196f568075a5d70fc29f31b72b512783Pablo Neira Ayuso .x6_parse = nfacct_parse, 81f233df44196f568075a5d70fc29f31b72b512783Pablo Neira Ayuso .print = nfacct_print, 82f233df44196f568075a5d70fc29f31b72b512783Pablo Neira Ayuso .save = nfacct_save, 83f233df44196f568075a5d70fc29f31b72b512783Pablo Neira Ayuso .x6_options = nfacct_opts, 84f233df44196f568075a5d70fc29f31b72b512783Pablo Neira Ayuso}; 85f233df44196f568075a5d70fc29f31b72b512783Pablo Neira Ayuso 86f233df44196f568075a5d70fc29f31b72b512783Pablo Neira Ayusovoid _init(void) 87f233df44196f568075a5d70fc29f31b72b512783Pablo Neira Ayuso{ 88f233df44196f568075a5d70fc29f31b72b512783Pablo Neira Ayuso xtables_register_match(&nfacct_match); 89f233df44196f568075a5d70fc29f31b72b512783Pablo Neira Ayuso} 90