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("a_match); 110181dead3f13befe02769ef479bcbb51801b7fc4eJan Engelhardt xtables_register_match("a_match6); 111e746abb15df34da1729de8d669c95f1b0b9ecb7cHarald Welte} 112