Blame view

net/netfilter/xt_nfacct.c 2.39 KB
1b402f7eb   Thomas Gleixner   treewide: Replace...
1
  // SPDX-License-Identifier: GPL-2.0-or-later
ceb98d03e   Pablo Neira Ayuso   netfilter: xtable...
2
3
  /*
   * (C) 2011 Pablo Neira Ayuso <pablo@netfilter.org>
50935339c   Alexander A. Klimov   netfilter: Replac...
4
   * (C) 2011 Intra2net AG <https://www.intra2net.com>
ceb98d03e   Pablo Neira Ayuso   netfilter: xtable...
5
   */
b26066447   Florian Westphal   netfilter: x_tabl...
6
  #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
ceb98d03e   Pablo Neira Ayuso   netfilter: xtable...
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   Mathieu Poirier   netfilter: nfnetl...
22
  	int overquota;
ceb98d03e   Pablo Neira Ayuso   netfilter: xtable...
23
24
25
  	const struct xt_nfacct_match_info *info = par->targinfo;
  
  	nfnl_acct_update(skb, info->nfacct);
cceae76ef   Taehee Yoo   netfilter: nfnetl...
26
  	overquota = nfnl_acct_overquota(xt_net(par), info->nfacct);
683399edd   Mathieu Poirier   netfilter: nfnetl...
27
28
  
  	return overquota == NFACCT_UNDERQUOTA ? false : true;
ceb98d03e   Pablo Neira Ayuso   netfilter: xtable...
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   Andreas Schultz   netfilter: nfacct...
36
  	nfacct = nfnl_acct_find_get(par->net, info->name);
ceb98d03e   Pablo Neira Ayuso   netfilter: xtable...
37
  	if (nfacct == NULL) {
b26066447   Florian Westphal   netfilter: x_tabl...
38
39
40
  		pr_info_ratelimited("accounting object `%s' does not exists
  ",
  				    info->name);
ceb98d03e   Pablo Neira Ayuso   netfilter: xtable...
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   Juliana Rodrigueiro   netfilter: xt_nfa...
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   Pablo Neira Ayuso   netfilter: xtable...
77
78
79
80
  };
  
  static int __init nfacct_mt_init(void)
  {
89a26cd4b   Juliana Rodrigueiro   netfilter: xt_nfa...
81
  	return xt_register_matches(nfacct_mt_reg, ARRAY_SIZE(nfacct_mt_reg));
ceb98d03e   Pablo Neira Ayuso   netfilter: xtable...
82
83
84
85
  }
  
  static void __exit nfacct_mt_exit(void)
  {
89a26cd4b   Juliana Rodrigueiro   netfilter: xt_nfa...
86
  	xt_unregister_matches(nfacct_mt_reg, ARRAY_SIZE(nfacct_mt_reg));
ceb98d03e   Pablo Neira Ayuso   netfilter: xtable...
87
88
89
90
  }
  
  module_init(nfacct_mt_init);
  module_exit(nfacct_mt_exit);