libxt_quota.c revision 181dead3f13befe02769ef479bcbb51801b7fc4e
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 */
6ae35309923339354b48adac4fa703bd3f5e6dd2bPhil Oester#include <stddef.h>
7e746abb15df34da1729de8d669c95f1b0b9ecb7cHarald Welte#include <stdio.h>
8e746abb15df34da1729de8d669c95f1b0b9ecb7cHarald Welte#include <stdlib.h>
9e746abb15df34da1729de8d669c95f1b0b9ecb7cHarald Welte#include <getopt.h>
102bcb16047e048afd1457642fa7bc2aefc8d06d9dYasuyuki KOZAKAI#include <xtables.h>
11e746abb15df34da1729de8d669c95f1b0b9ecb7cHarald Welte
12ae35309923339354b48adac4fa703bd3f5e6dd2bPhil Oester#include <linux/netfilter/xt_quota.h>
13e746abb15df34da1729de8d669c95f1b0b9ecb7cHarald Welte
14181dead3f13befe02769ef479bcbb51801b7fc4eJan Engelhardtstatic const struct option quota_opts[] = {
15500f483fff529dcd88ec96b9d5054be6cd6363a0Patrick McHardy        {"quota", 1, NULL, '1'},
16500f483fff529dcd88ec96b9d5054be6cd6363a0Patrick McHardy        { }
17e746abb15df34da1729de8d669c95f1b0b9ecb7cHarald Welte};
18e746abb15df34da1729de8d669c95f1b0b9ecb7cHarald Welte
19e746abb15df34da1729de8d669c95f1b0b9ecb7cHarald Welte/* print usage */
20181dead3f13befe02769ef479bcbb51801b7fc4eJan Engelhardtstatic void quota_help(void)
21e746abb15df34da1729de8d669c95f1b0b9ecb7cHarald Welte{
22e746abb15df34da1729de8d669c95f1b0b9ecb7cHarald Welte        printf("quota options:\n"
23e746abb15df34da1729de8d669c95f1b0b9ecb7cHarald Welte               " --quota quota			quota (bytes)\n" "\n");
24e746abb15df34da1729de8d669c95f1b0b9ecb7cHarald Welte}
25e746abb15df34da1729de8d669c95f1b0b9ecb7cHarald Welte
26e746abb15df34da1729de8d669c95f1b0b9ecb7cHarald Welte/* print matchinfo */
27e746abb15df34da1729de8d669c95f1b0b9ecb7cHarald Weltestatic void
28181dead3f13befe02769ef479bcbb51801b7fc4eJan Engelhardtquota_print(const void *ip, const struct xt_entry_match *match, int numeric)
29e746abb15df34da1729de8d669c95f1b0b9ecb7cHarald Welte{
30ae35309923339354b48adac4fa703bd3f5e6dd2bPhil Oester        struct xt_quota_info *q = (struct xt_quota_info *) match->data;
31e746abb15df34da1729de8d669c95f1b0b9ecb7cHarald Welte        printf("quota: %llu bytes", (unsigned long long) q->quota);
32e746abb15df34da1729de8d669c95f1b0b9ecb7cHarald Welte}
33e746abb15df34da1729de8d669c95f1b0b9ecb7cHarald Welte
34e746abb15df34da1729de8d669c95f1b0b9ecb7cHarald Welte/* save matchinfo */
35e746abb15df34da1729de8d669c95f1b0b9ecb7cHarald Weltestatic void
36181dead3f13befe02769ef479bcbb51801b7fc4eJan Engelhardtquota_save(const void *ip, const struct xt_entry_match *match)
37e746abb15df34da1729de8d669c95f1b0b9ecb7cHarald Welte{
38ae35309923339354b48adac4fa703bd3f5e6dd2bPhil Oester        struct xt_quota_info *q = (struct xt_quota_info *) match->data;
39e746abb15df34da1729de8d669c95f1b0b9ecb7cHarald Welte        printf("--quota %llu ", (unsigned long long) q->quota);
40e746abb15df34da1729de8d669c95f1b0b9ecb7cHarald Welte}
41e746abb15df34da1729de8d669c95f1b0b9ecb7cHarald Welte
42e746abb15df34da1729de8d669c95f1b0b9ecb7cHarald Welte/* parse quota option */
43e746abb15df34da1729de8d669c95f1b0b9ecb7cHarald Weltestatic int
44e746abb15df34da1729de8d669c95f1b0b9ecb7cHarald Welteparse_quota(const char *s, u_int64_t * quota)
45e746abb15df34da1729de8d669c95f1b0b9ecb7cHarald Welte{
46e746abb15df34da1729de8d669c95f1b0b9ecb7cHarald Welte        *quota = strtoull(s, (char **) NULL, 10);
47e746abb15df34da1729de8d669c95f1b0b9ecb7cHarald Welte
482bcb16047e048afd1457642fa7bc2aefc8d06d9dYasuyuki KOZAKAI#ifdef DEBUG_XT_QUOTA
49e746abb15df34da1729de8d669c95f1b0b9ecb7cHarald Welte        printf("Quota: %llu\n", *quota);
50e746abb15df34da1729de8d669c95f1b0b9ecb7cHarald Welte#endif
51e746abb15df34da1729de8d669c95f1b0b9ecb7cHarald Welte
52e746abb15df34da1729de8d669c95f1b0b9ecb7cHarald Welte        if (*quota == -1)
53e746abb15df34da1729de8d669c95f1b0b9ecb7cHarald Welte                exit_error(PARAMETER_PROBLEM, "quota invalid: '%s'\n", s);
54e746abb15df34da1729de8d669c95f1b0b9ecb7cHarald Welte        else
55e746abb15df34da1729de8d669c95f1b0b9ecb7cHarald Welte                return 1;
56e746abb15df34da1729de8d669c95f1b0b9ecb7cHarald Welte}
57e746abb15df34da1729de8d669c95f1b0b9ecb7cHarald Welte
58e746abb15df34da1729de8d669c95f1b0b9ecb7cHarald Welte/* parse all options, returning true if we found any for us */
59e746abb15df34da1729de8d669c95f1b0b9ecb7cHarald Weltestatic int
60181dead3f13befe02769ef479bcbb51801b7fc4eJan Engelhardtquota_parse(int c, char **argv, int invert, unsigned int *flags,
61181dead3f13befe02769ef479bcbb51801b7fc4eJan Engelhardt            const void *entry, struct xt_entry_match **match)
62e746abb15df34da1729de8d669c95f1b0b9ecb7cHarald Welte{
63ae35309923339354b48adac4fa703bd3f5e6dd2bPhil Oester        struct xt_quota_info *info = (struct xt_quota_info *) (*match)->data;
64e746abb15df34da1729de8d669c95f1b0b9ecb7cHarald Welte
65e746abb15df34da1729de8d669c95f1b0b9ecb7cHarald Welte        switch (c) {
66e746abb15df34da1729de8d669c95f1b0b9ecb7cHarald Welte        case '1':
67b77f1dafb9f35752bb9685323bcacb32a0e6ddc5Harald Welte                if (check_inverse(optarg, &invert, NULL, 0))
68e746abb15df34da1729de8d669c95f1b0b9ecb7cHarald Welte                        exit_error(PARAMETER_PROBLEM, "quota: unexpected '!'");
69e746abb15df34da1729de8d669c95f1b0b9ecb7cHarald Welte                if (!parse_quota(optarg, &info->quota))
70e746abb15df34da1729de8d669c95f1b0b9ecb7cHarald Welte                        exit_error(PARAMETER_PROBLEM,
71e746abb15df34da1729de8d669c95f1b0b9ecb7cHarald Welte                                   "bad quota: '%s'", optarg);
72e746abb15df34da1729de8d669c95f1b0b9ecb7cHarald Welte                break;
73e746abb15df34da1729de8d669c95f1b0b9ecb7cHarald Welte
74e746abb15df34da1729de8d669c95f1b0b9ecb7cHarald Welte        default:
75e746abb15df34da1729de8d669c95f1b0b9ecb7cHarald Welte                return 0;
76e746abb15df34da1729de8d669c95f1b0b9ecb7cHarald Welte        }
77e746abb15df34da1729de8d669c95f1b0b9ecb7cHarald Welte        return 1;
78e746abb15df34da1729de8d669c95f1b0b9ecb7cHarald Welte}
79e746abb15df34da1729de8d669c95f1b0b9ecb7cHarald Welte
80181dead3f13befe02769ef479bcbb51801b7fc4eJan Engelhardtstruct xtables_match quota_match = {
812bcb16047e048afd1457642fa7bc2aefc8d06d9dYasuyuki KOZAKAI	.family		= AF_INET,
828caee8b9e34fed4562fcff553197c161fc9d9979Pablo Neira	.name		= "quota",
838caee8b9e34fed4562fcff553197c161fc9d9979Pablo Neira	.version	= IPTABLES_VERSION,
842bcb16047e048afd1457642fa7bc2aefc8d06d9dYasuyuki KOZAKAI	.size		= XT_ALIGN(sizeof (struct xt_quota_info)),
852bcb16047e048afd1457642fa7bc2aefc8d06d9dYasuyuki KOZAKAI	.userspacesize	= offsetof(struct xt_quota_info, quota),
86181dead3f13befe02769ef479bcbb51801b7fc4eJan Engelhardt	.help		= quota_help,
87181dead3f13befe02769ef479bcbb51801b7fc4eJan Engelhardt	.parse		= quota_parse,
88181dead3f13befe02769ef479bcbb51801b7fc4eJan Engelhardt	.print		= quota_print,
89181dead3f13befe02769ef479bcbb51801b7fc4eJan Engelhardt	.save		= quota_save,
90181dead3f13befe02769ef479bcbb51801b7fc4eJan Engelhardt	.extra_opts	= quota_opts,
912bcb16047e048afd1457642fa7bc2aefc8d06d9dYasuyuki KOZAKAI};
922bcb16047e048afd1457642fa7bc2aefc8d06d9dYasuyuki KOZAKAI
93181dead3f13befe02769ef479bcbb51801b7fc4eJan Engelhardtstruct xtables_match quota_match6 = {
942bcb16047e048afd1457642fa7bc2aefc8d06d9dYasuyuki KOZAKAI	.family		= AF_INET6,
952bcb16047e048afd1457642fa7bc2aefc8d06d9dYasuyuki KOZAKAI	.name		= "quota",
962bcb16047e048afd1457642fa7bc2aefc8d06d9dYasuyuki KOZAKAI	.version	= IPTABLES_VERSION,
972bcb16047e048afd1457642fa7bc2aefc8d06d9dYasuyuki KOZAKAI	.size		= XT_ALIGN(sizeof (struct xt_quota_info)),
98ae35309923339354b48adac4fa703bd3f5e6dd2bPhil Oester	.userspacesize	= offsetof(struct xt_quota_info, quota),
99181dead3f13befe02769ef479bcbb51801b7fc4eJan Engelhardt	.help		= quota_help,
100181dead3f13befe02769ef479bcbb51801b7fc4eJan Engelhardt	.parse		= quota_parse,
101181dead3f13befe02769ef479bcbb51801b7fc4eJan Engelhardt	.print		= quota_print,
102181dead3f13befe02769ef479bcbb51801b7fc4eJan Engelhardt	.save		= quota_save,
103181dead3f13befe02769ef479bcbb51801b7fc4eJan Engelhardt	.extra_opts	= quota_opts,
104e746abb15df34da1729de8d669c95f1b0b9ecb7cHarald Welte};
105e746abb15df34da1729de8d669c95f1b0b9ecb7cHarald Welte
106e746abb15df34da1729de8d669c95f1b0b9ecb7cHarald Weltevoid
107e746abb15df34da1729de8d669c95f1b0b9ecb7cHarald Welte_init(void)
108e746abb15df34da1729de8d669c95f1b0b9ecb7cHarald Welte{
109181dead3f13befe02769ef479bcbb51801b7fc4eJan Engelhardt	xtables_register_match(&quota_match);
110181dead3f13befe02769ef479bcbb51801b7fc4eJan Engelhardt	xtables_register_match(&quota_match6);
111e746abb15df34da1729de8d669c95f1b0b9ecb7cHarald Welte}
112