Blame view
net/netfilter/xt_nfacct.c
2.39 KB
1b402f7eb
|
1 |
// SPDX-License-Identifier: GPL-2.0-or-later |
ceb98d03e
|
2 3 |
/* * (C) 2011 Pablo Neira Ayuso <pablo@netfilter.org> |
50935339c
|
4 |
* (C) 2011 Intra2net AG <https://www.intra2net.com> |
ceb98d03e
|
5 |
*/ |
b26066447
|
6 |
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt |
ceb98d03e
|
7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
#include <linux/module.h> #include <linux/skbuff.h> #include <linux/netfilter/x_tables.h> #include <linux/netfilter/nfnetlink_acct.h> #include <linux/netfilter/xt_nfacct.h> MODULE_AUTHOR("Pablo Neira Ayuso <pablo@netfilter.org>"); MODULE_DESCRIPTION("Xtables: match for the extended accounting infrastructure"); MODULE_LICENSE("GPL"); MODULE_ALIAS("ipt_nfacct"); MODULE_ALIAS("ip6t_nfacct"); static bool nfacct_mt(const struct sk_buff *skb, struct xt_action_param *par) { |
683399edd
|
22 |
int overquota; |
ceb98d03e
|
23 24 25 |
const struct xt_nfacct_match_info *info = par->targinfo; nfnl_acct_update(skb, info->nfacct); |
cceae76ef
|
26 |
overquota = nfnl_acct_overquota(xt_net(par), info->nfacct); |
683399edd
|
27 28 |
return overquota == NFACCT_UNDERQUOTA ? false : true; |
ceb98d03e
|
29 30 31 32 33 34 35 |
} static int nfacct_mt_checkentry(const struct xt_mtchk_param *par) { struct xt_nfacct_match_info *info = par->matchinfo; struct nf_acct *nfacct; |
3499abb24
|
36 |
nfacct = nfnl_acct_find_get(par->net, info->name); |
ceb98d03e
|
37 |
if (nfacct == NULL) { |
b26066447
|
38 39 40 |
pr_info_ratelimited("accounting object `%s' does not exists ", info->name); |
ceb98d03e
|
41 42 43 44 45 46 47 48 49 50 51 52 53 |
return -ENOENT; } info->nfacct = nfacct; return 0; } static void nfacct_mt_destroy(const struct xt_mtdtor_param *par) { const struct xt_nfacct_match_info *info = par->matchinfo; nfnl_acct_put(info->nfacct); } |
89a26cd4b
|
54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 |
static struct xt_match nfacct_mt_reg[] __read_mostly = { { .name = "nfacct", .revision = 0, .family = NFPROTO_UNSPEC, .checkentry = nfacct_mt_checkentry, .match = nfacct_mt, .destroy = nfacct_mt_destroy, .matchsize = sizeof(struct xt_nfacct_match_info), .usersize = offsetof(struct xt_nfacct_match_info, nfacct), .me = THIS_MODULE, }, { .name = "nfacct", .revision = 1, .family = NFPROTO_UNSPEC, .checkentry = nfacct_mt_checkentry, .match = nfacct_mt, .destroy = nfacct_mt_destroy, .matchsize = sizeof(struct xt_nfacct_match_info_v1), .usersize = offsetof(struct xt_nfacct_match_info_v1, nfacct), .me = THIS_MODULE, }, |
ceb98d03e
|
77 78 79 80 |
}; static int __init nfacct_mt_init(void) { |
89a26cd4b
|
81 |
return xt_register_matches(nfacct_mt_reg, ARRAY_SIZE(nfacct_mt_reg)); |
ceb98d03e
|
82 83 84 85 |
} static void __exit nfacct_mt_exit(void) { |
89a26cd4b
|
86 |
xt_unregister_matches(nfacct_mt_reg, ARRAY_SIZE(nfacct_mt_reg)); |
ceb98d03e
|
87 88 89 90 |
} module_init(nfacct_mt_init); module_exit(nfacct_mt_exit); |