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