libxt_quota.c revision b65b9fe5096bd49a9ec2f0f6c2f23d274cfc88ee
1e746abb15df34da1729de8d669c95f1b0b9ecb7cHarald Welte/*
2e746abb15df34da1729de8d669c95f1b0b9ecb7cHarald Welte * Shared library add-on to iptables to add quota support
3e746abb15df34da1729de8d669c95f1b0b9ecb7cHarald Welte *
4e746abb15df34da1729de8d669c95f1b0b9ecb7cHarald Welte * Sam Johnston <samj@samj.net>
5e746abb15df34da1729de8d669c95f1b0b9ecb7cHarald Welte */
6e746abb15df34da1729de8d669c95f1b0b9ecb7cHarald Welte#include <stdio.h>
72bcb16047e048afd1457642fa7bc2aefc8d06d9dYasuyuki KOZAKAI#include <xtables.h>
8ae35309923339354b48adac4fa703bd3f5e6dd2bPhil Oester#include <linux/netfilter/xt_quota.h>
9e746abb15df34da1729de8d669c95f1b0b9ecb7cHarald Welte
101e6c1ee1bf2822d5fdf61725148700a410fb8b86Jan Engelhardtenum {
111e6c1ee1bf2822d5fdf61725148700a410fb8b86Jan Engelhardt	O_QUOTA = 0,
121e6c1ee1bf2822d5fdf61725148700a410fb8b86Jan Engelhardt};
131e6c1ee1bf2822d5fdf61725148700a410fb8b86Jan Engelhardt
141e6c1ee1bf2822d5fdf61725148700a410fb8b86Jan Engelhardtstatic const struct xt_option_entry quota_opts[] = {
151e6c1ee1bf2822d5fdf61725148700a410fb8b86Jan Engelhardt	{.name = "quota", .id = O_QUOTA, .type = XTTYPE_UINT64,
161e6c1ee1bf2822d5fdf61725148700a410fb8b86Jan Engelhardt	 .flags = XTOPT_MAND | XTOPT_INVERT},
171e6c1ee1bf2822d5fdf61725148700a410fb8b86Jan Engelhardt	XTOPT_TABLEEND,
18e746abb15df34da1729de8d669c95f1b0b9ecb7cHarald Welte};
19e746abb15df34da1729de8d669c95f1b0b9ecb7cHarald Welte
20181dead3f13befe02769ef479bcbb51801b7fc4eJan Engelhardtstatic void quota_help(void)
21e746abb15df34da1729de8d669c95f1b0b9ecb7cHarald Welte{
228b7c64d6ba156a99008fcd810cba874c73294333Jan Engelhardt	printf("quota match options:\n"
23ce06c99ee107102a7168493b55970b53380ebbb6Jan Engelhardt	       "[!] --quota quota		quota (bytes)\n");
24e746abb15df34da1729de8d669c95f1b0b9ecb7cHarald Welte}
25e746abb15df34da1729de8d669c95f1b0b9ecb7cHarald Welte
26e746abb15df34da1729de8d669c95f1b0b9ecb7cHarald Weltestatic void
27181dead3f13befe02769ef479bcbb51801b7fc4eJan Engelhardtquota_print(const void *ip, const struct xt_entry_match *match, int numeric)
28e746abb15df34da1729de8d669c95f1b0b9ecb7cHarald Welte{
2969f564e3890976461de0016cd81171ff8bfa8353Jan Engelhardt	const struct xt_quota_info *q = (const void *)match->data;
3073866357e4a7a0fdc1b293bf8863fee2bd56da9eJan Engelhardt	printf(" quota: %llu bytes", (unsigned long long)q->quota);
31e746abb15df34da1729de8d669c95f1b0b9ecb7cHarald Welte}
32e746abb15df34da1729de8d669c95f1b0b9ecb7cHarald Welte
33e746abb15df34da1729de8d669c95f1b0b9ecb7cHarald Weltestatic void
34181dead3f13befe02769ef479bcbb51801b7fc4eJan Engelhardtquota_save(const void *ip, const struct xt_entry_match *match)
35e746abb15df34da1729de8d669c95f1b0b9ecb7cHarald Welte{
3669f564e3890976461de0016cd81171ff8bfa8353Jan Engelhardt	const struct xt_quota_info *q = (const void *)match->data;
379c60365e043a430f74115bbfaf58ce0df7585f49Jan Engelhardt
389c60365e043a430f74115bbfaf58ce0df7585f49Jan Engelhardt	if (q->flags & XT_QUOTA_INVERT)
399c60365e043a430f74115bbfaf58ce0df7585f49Jan Engelhardt		printf("! ");
4073866357e4a7a0fdc1b293bf8863fee2bd56da9eJan Engelhardt	printf(" --quota %llu", (unsigned long long) q->quota);
41e746abb15df34da1729de8d669c95f1b0b9ecb7cHarald Welte}
42e746abb15df34da1729de8d669c95f1b0b9ecb7cHarald Welte
431e6c1ee1bf2822d5fdf61725148700a410fb8b86Jan Engelhardtstatic void quota_parse(struct xt_option_call *cb)
44e746abb15df34da1729de8d669c95f1b0b9ecb7cHarald Welte{
451e6c1ee1bf2822d5fdf61725148700a410fb8b86Jan Engelhardt	struct xt_quota_info *info = cb->data;
46e4540fcb86c2d7f4cdf51c49872847a03a11b433Samuel Ortiz
471e6c1ee1bf2822d5fdf61725148700a410fb8b86Jan Engelhardt	xtables_option_parse(cb);
481e6c1ee1bf2822d5fdf61725148700a410fb8b86Jan Engelhardt	if (cb->invert)
491e6c1ee1bf2822d5fdf61725148700a410fb8b86Jan Engelhardt		info->flags |= XT_QUOTA_INVERT;
50b65b9fe5096bd49a9ec2f0f6c2f23d274cfc88eeJP Abgrall	info->quota = cb->val.u64;
518a5270b14908b3173de080a958e50e21e2f046deJan Engelhardt}
528a5270b14908b3173de080a958e50e21e2f046deJan Engelhardt
530ea82bc43e9262cdbb9880ca56bb514db4c77f8ePatrick McHardystatic struct xtables_match quota_match = {
5442979363f3958b4436c6d2503753c182c58e55eaJan Engelhardt	.family		= NFPROTO_UNSPEC,
552bcb16047e048afd1457642fa7bc2aefc8d06d9dYasuyuki KOZAKAI	.name		= "quota",
568b7c64d6ba156a99008fcd810cba874c73294333Jan Engelhardt	.version	= XTABLES_VERSION,
572bcb16047e048afd1457642fa7bc2aefc8d06d9dYasuyuki KOZAKAI	.size		= XT_ALIGN(sizeof (struct xt_quota_info)),
58422342e47c18e70757231f2210b13df8e1f5931cChangli Gao	.userspacesize	= offsetof(struct xt_quota_info, master),
59181dead3f13befe02769ef479bcbb51801b7fc4eJan Engelhardt	.help		= quota_help,
60181dead3f13befe02769ef479bcbb51801b7fc4eJan Engelhardt	.print		= quota_print,
61181dead3f13befe02769ef479bcbb51801b7fc4eJan Engelhardt	.save		= quota_save,
621e6c1ee1bf2822d5fdf61725148700a410fb8b86Jan Engelhardt	.x6_parse	= quota_parse,
631e6c1ee1bf2822d5fdf61725148700a410fb8b86Jan Engelhardt	.x6_options	= quota_opts,
64e746abb15df34da1729de8d669c95f1b0b9ecb7cHarald Welte};
65e746abb15df34da1729de8d669c95f1b0b9ecb7cHarald Welte
66e746abb15df34da1729de8d669c95f1b0b9ecb7cHarald Weltevoid
67e746abb15df34da1729de8d669c95f1b0b9ecb7cHarald Welte_init(void)
68e746abb15df34da1729de8d669c95f1b0b9ecb7cHarald Welte{
69181dead3f13befe02769ef479bcbb51801b7fc4eJan Engelhardt	xtables_register_match(&quota_match);
70e746abb15df34da1729de8d669c95f1b0b9ecb7cHarald Welte}
71