Blame view
net/netfilter/xt_quota.c
1.99 KB
09c434b8a treewide: Add SPD... |
1 |
// SPDX-License-Identifier: GPL-2.0-only |
62b774348 [NETFILTER]: x_ta... |
2 3 4 5 6 7 |
/* * netfilter module to enforce network quotas * * Sam Johnston <samj@samj.net> */ #include <linux/skbuff.h> |
5a0e3ad6a include cleanup: ... |
8 |
#include <linux/slab.h> |
62b774348 [NETFILTER]: x_ta... |
9 10 11 12 |
#include <linux/spinlock.h> #include <linux/netfilter/x_tables.h> #include <linux/netfilter/xt_quota.h> |
3a9a231d9 net: Fix files ex... |
13 |
#include <linux/module.h> |
62b774348 [NETFILTER]: x_ta... |
14 |
|
acc738fec netfilter: xtable... |
15 |
struct xt_quota_priv { |
b0c81aa56 netfilter: xt_quo... |
16 17 |
spinlock_t lock; uint64_t quota; |
acc738fec netfilter: xtable... |
18 |
}; |
62b774348 [NETFILTER]: x_ta... |
19 20 |
MODULE_LICENSE("GPL"); MODULE_AUTHOR("Sam Johnston <samj@samj.net>"); |
2ae15b64e [NETFILTER]: Upda... |
21 |
MODULE_DESCRIPTION("Xtables: countdown quota match"); |
b22b9004f [NETFILTER]: xt_q... |
22 23 |
MODULE_ALIAS("ipt_quota"); MODULE_ALIAS("ip6t_quota"); |
62b774348 [NETFILTER]: x_ta... |
24 |
|
1d93a9cba [NETFILTER]: x_ta... |
25 |
static bool |
62fc80510 netfilter: xtable... |
26 |
quota_mt(const struct sk_buff *skb, struct xt_action_param *par) |
62b774348 [NETFILTER]: x_ta... |
27 |
{ |
acc738fec netfilter: xtable... |
28 29 |
struct xt_quota_info *q = (void *)par->matchinfo; struct xt_quota_priv *priv = q->master; |
1d93a9cba [NETFILTER]: x_ta... |
30 |
bool ret = q->flags & XT_QUOTA_INVERT; |
62b774348 [NETFILTER]: x_ta... |
31 |
|
b0c81aa56 netfilter: xt_quo... |
32 |
spin_lock_bh(&priv->lock); |
acc738fec netfilter: xtable... |
33 34 |
if (priv->quota >= skb->len) { priv->quota -= skb->len; |
1d93a9cba [NETFILTER]: x_ta... |
35 |
ret = !ret; |
62b774348 [NETFILTER]: x_ta... |
36 |
} else { |
601e68e10 [NETFILTER]: Fix ... |
37 |
/* we do not allow even small packets from now on */ |
acc738fec netfilter: xtable... |
38 |
priv->quota = 0; |
62b774348 [NETFILTER]: x_ta... |
39 |
} |
b0c81aa56 netfilter: xt_quo... |
40 |
spin_unlock_bh(&priv->lock); |
62b774348 [NETFILTER]: x_ta... |
41 42 43 |
return ret; } |
b0f38452f netfilter: xtable... |
44 |
static int quota_mt_check(const struct xt_mtchk_param *par) |
62b774348 [NETFILTER]: x_ta... |
45 |
{ |
9b4fce7a3 netfilter: xtable... |
46 |
struct xt_quota_info *q = par->matchinfo; |
62b774348 [NETFILTER]: x_ta... |
47 48 |
if (q->flags & ~XT_QUOTA_MASK) |
bd414ee60 netfilter: xtable... |
49 |
return -EINVAL; |
acc738fec netfilter: xtable... |
50 51 52 |
q->master = kmalloc(sizeof(*q->master), GFP_KERNEL); if (q->master == NULL) |
4a5a5c73b netfilter: xtable... |
53 |
return -ENOMEM; |
acc738fec netfilter: xtable... |
54 |
|
b0c81aa56 netfilter: xt_quo... |
55 |
spin_lock_init(&q->master->lock); |
6d62182fe netfilter: xt_quo... |
56 |
q->master->quota = q->quota; |
bd414ee60 netfilter: xtable... |
57 |
return 0; |
62b774348 [NETFILTER]: x_ta... |
58 |
} |
acc738fec netfilter: xtable... |
59 60 61 62 63 64 |
static void quota_mt_destroy(const struct xt_mtdtor_param *par) { const struct xt_quota_info *q = par->matchinfo; kfree(q->master); } |
55b69e910 netfilter: implem... |
65 66 67 68 69 70 |
static struct xt_match quota_mt_reg __read_mostly = { .name = "quota", .revision = 0, .family = NFPROTO_UNSPEC, .match = quota_mt, .checkentry = quota_mt_check, |
acc738fec netfilter: xtable... |
71 |
.destroy = quota_mt_destroy, |
55b69e910 netfilter: implem... |
72 |
.matchsize = sizeof(struct xt_quota_info), |
ec2318904 xtables: extend m... |
73 |
.usersize = offsetof(struct xt_quota_info, master), |
55b69e910 netfilter: implem... |
74 |
.me = THIS_MODULE, |
62b774348 [NETFILTER]: x_ta... |
75 |
}; |
d3c5ee6d5 [NETFILTER]: x_ta... |
76 |
static int __init quota_mt_init(void) |
62b774348 [NETFILTER]: x_ta... |
77 |
{ |
55b69e910 netfilter: implem... |
78 |
return xt_register_match("a_mt_reg); |
62b774348 [NETFILTER]: x_ta... |
79 |
} |
d3c5ee6d5 [NETFILTER]: x_ta... |
80 |
static void __exit quota_mt_exit(void) |
62b774348 [NETFILTER]: x_ta... |
81 |
{ |
55b69e910 netfilter: implem... |
82 |
xt_unregister_match("a_mt_reg); |
62b774348 [NETFILTER]: x_ta... |
83 |
} |
d3c5ee6d5 [NETFILTER]: x_ta... |
84 85 |
module_init(quota_mt_init); module_exit(quota_mt_exit); |