blob: e08ae0568bb2272be9e995698ccaf5644bed5fc4 [file] [log] [blame]
Harald Welte015dffb2000-07-31 23:38:14 +00001/* Shared library add-on to iptables to add ULOG support.
2 *
Harald Welted3beea32001-01-31 07:30:19 +00003 * (C) 2000 by Harald Welte <laforge@gnumonks.org>
4 *
5 * multipart netlink support based on ideas by Sebastian Zander
6 * <zander@fokus.gmd.de>
Harald Welte015dffb2000-07-31 23:38:14 +00007 *
8 * This software is released under the terms of GNU GPL
9 *
Harald Welted3beea32001-01-31 07:30:19 +000010 * libipt_ULOG.c,v 1.7 2001/01/30 11:55:02 laforge Exp
Harald Welte015dffb2000-07-31 23:38:14 +000011 */
Harald Weltec5bdb402000-07-31 14:24:57 +000012#include <stdio.h>
Harald Weltec5bdb402000-07-31 14:24:57 +000013#include <string.h>
Jan Engelhardt5d9678a2008-11-20 10:15:35 +010014#include <xtables.h>
Martin Josefsson1eb00812004-05-26 15:58:07 +000015/* For 64bit kernel / 32bit userspace */
Jan Engelhardta2a7f2b2008-09-01 14:20:13 +020016#include <linux/netfilter_ipv4/ipt_ULOG.h>
Harald Weltec5bdb402000-07-31 14:24:57 +000017
Jan Engelhardt1f2474a2011-03-08 01:24:26 +010018enum {
19 O_ULOG_NLGROUP = 0,
20 O_ULOG_PREFIX,
21 O_ULOG_CPRANGE,
22 O_ULOG_QTHR,
23};
Harald Weltec5bdb402000-07-31 14:24:57 +000024
Jan Engelhardt1d5b63d2007-10-04 16:29:00 +000025static void ULOG_help(void)
Harald Weltec5bdb402000-07-31 14:24:57 +000026{
Jan Engelhardt8b7c64d2008-04-15 11:48:25 +020027 printf("ULOG target options:\n"
Marc Boucher44540942000-09-12 01:39:41 +000028 " --ulog-nlgroup nlgroup NETLINK group used for logging\n"
Harald Welte015dffb2000-07-31 23:38:14 +000029 " --ulog-cprange size Bytes of each packet to be passed\n"
Harald Welted3beea32001-01-31 07:30:19 +000030 " --ulog-qthreshold Threshold of in-kernel queue\n"
Jan Engelhardt8b7c64d2008-04-15 11:48:25 +020031 " --ulog-prefix prefix Prefix log messages with this prefix.\n");
Harald Weltec5bdb402000-07-31 14:24:57 +000032}
33
Jan Engelhardt1f2474a2011-03-08 01:24:26 +010034static const struct xt_option_entry ULOG_opts[] = {
35 {.name = "ulog-nlgroup", .id = O_ULOG_NLGROUP, .type = XTTYPE_UINT8,
36 .min = 1, .max = 32},
37 {.name = "ulog-prefix", .id = O_ULOG_PREFIX, .type = XTTYPE_STRING,
38 .flags = XTOPT_PUT, XTOPT_POINTER(struct ipt_ulog_info, prefix),
39 .min = 1},
40 {.name = "ulog-cprange", .id = O_ULOG_CPRANGE, .type = XTTYPE_UINT64,
41 .min = 1, .max = ULOG_MAX_QLEN},
42 {.name = "ulog-qthreshold", .id = O_ULOG_QTHR, .type = XTTYPE_UINT64},
43 XTOPT_TABLEEND,
Harald Weltec5bdb402000-07-31 14:24:57 +000044};
45
Jan Engelhardt1d5b63d2007-10-04 16:29:00 +000046static void ULOG_init(struct xt_entry_target *t)
Harald Weltec5bdb402000-07-31 14:24:57 +000047{
Harald Welte015dffb2000-07-31 23:38:14 +000048 struct ipt_ulog_info *loginfo = (struct ipt_ulog_info *) t->data;
Harald Weltec5bdb402000-07-31 14:24:57 +000049
50 loginfo->nl_group = ULOG_DEFAULT_NLGROUP;
Harald Welted3beea32001-01-31 07:30:19 +000051 loginfo->qthreshold = ULOG_DEFAULT_QTHRESHOLD;
Harald Weltec5bdb402000-07-31 14:24:57 +000052
Harald Weltec5bdb402000-07-31 14:24:57 +000053}
54
Jan Engelhardt1f2474a2011-03-08 01:24:26 +010055static void ULOG_parse(struct xt_option_call *cb)
Harald Weltec5bdb402000-07-31 14:24:57 +000056{
Jan Engelhardt1f2474a2011-03-08 01:24:26 +010057 struct ipt_ulog_info *loginfo = cb->data;
Harald Weltec5bdb402000-07-31 14:24:57 +000058
Jan Engelhardt1f2474a2011-03-08 01:24:26 +010059 xtables_option_parse(cb);
60 switch (cb->entry->id) {
61 case O_ULOG_NLGROUP:
62 loginfo->nl_group = 1 << (cb->val.u8 - 1);
Harald Weltec5bdb402000-07-31 14:24:57 +000063 break;
Jan Engelhardt1f2474a2011-03-08 01:24:26 +010064 case O_ULOG_PREFIX:
65 if (strchr(cb->arg, '\n') != NULL)
Jan Engelhardt1829ed42009-02-21 03:29:44 +010066 xtables_error(PARAMETER_PROBLEM,
Mike Frysingered26b7b2006-10-10 06:18:40 +000067 "Newlines not allowed in --ulog-prefix");
Harald Weltec5bdb402000-07-31 14:24:57 +000068 break;
Jan Engelhardt1f2474a2011-03-08 01:24:26 +010069 case O_ULOG_CPRANGE:
70 loginfo->copy_range = cb->val.u64;
Harald Welte015dffb2000-07-31 23:38:14 +000071 break;
Jan Engelhardt1f2474a2011-03-08 01:24:26 +010072 case O_ULOG_QTHR:
73 loginfo->qthreshold = cb->val.u64;
Harald Welted3beea32001-01-31 07:30:19 +000074 break;
Harald Weltec5bdb402000-07-31 14:24:57 +000075 }
Harald Weltec5bdb402000-07-31 14:24:57 +000076}
77
Jan Engelhardt1d5b63d2007-10-04 16:29:00 +000078static void ULOG_save(const void *ip, const struct xt_entry_target *target)
Harald Weltec5bdb402000-07-31 14:24:57 +000079{
Harald Welte015dffb2000-07-31 23:38:14 +000080 const struct ipt_ulog_info *loginfo
81 = (const struct ipt_ulog_info *) target->data;
Harald Weltec5bdb402000-07-31 14:24:57 +000082
Max Kellermanna5d09942008-01-29 13:44:34 +000083 if (strcmp(loginfo->prefix, "") != 0) {
Jan Engelhardt73866352010-12-18 02:04:59 +010084 fputs(" --ulog-prefix", stdout);
Jan Engelhardta0baae82009-01-30 04:32:50 +010085 xtables_save_string(loginfo->prefix);
Max Kellermanna5d09942008-01-29 13:44:34 +000086 }
Harald Weltec5bdb402000-07-31 14:24:57 +000087
Jan Engelhardt1f2474a2011-03-08 01:24:26 +010088 if (loginfo->nl_group != ULOG_DEFAULT_NLGROUP)
89 printf(" --ulog-nlgroup %d", ffs(loginfo->nl_group));
Harald Welte015dffb2000-07-31 23:38:14 +000090 if (loginfo->copy_range)
Jan Engelhardt73866352010-12-18 02:04:59 +010091 printf(" --ulog-cprange %u", (unsigned int)loginfo->copy_range);
Harald Welted3beea32001-01-31 07:30:19 +000092
93 if (loginfo->qthreshold != ULOG_DEFAULT_QTHRESHOLD)
Jan Engelhardt73866352010-12-18 02:04:59 +010094 printf(" --ulog-qthreshold %u", (unsigned int)loginfo->qthreshold);
Harald Weltec5bdb402000-07-31 14:24:57 +000095}
96
Jan Engelhardt1d5b63d2007-10-04 16:29:00 +000097static void ULOG_print(const void *ip, const struct xt_entry_target *target,
98 int numeric)
Harald Weltec5bdb402000-07-31 14:24:57 +000099{
100 const struct ipt_ulog_info *loginfo
Harald Welte015dffb2000-07-31 23:38:14 +0000101 = (const struct ipt_ulog_info *) target->data;
Harald Weltec5bdb402000-07-31 14:24:57 +0000102
Jan Engelhardt73866352010-12-18 02:04:59 +0100103 printf(" ULOG ");
Jan Engelhardt1f2474a2011-03-08 01:24:26 +0100104 printf("copy_range %u nlgroup %d", (unsigned int)loginfo->copy_range,
105 ffs(loginfo->nl_group));
Harald Weltec5bdb402000-07-31 14:24:57 +0000106 if (strcmp(loginfo->prefix, "") != 0)
Jan Engelhardt73866352010-12-18 02:04:59 +0100107 printf(" prefix \"%s\"", loginfo->prefix);
108 printf(" queue_threshold %u", (unsigned int)loginfo->qthreshold);
Harald Weltec5bdb402000-07-31 14:24:57 +0000109}
110
Jan Engelhardt8b7c64d2008-04-15 11:48:25 +0200111static struct xtables_target ulog_tg_reg = {
Pablo Neira8caee8b2004-12-28 13:11:59 +0000112 .name = "ULOG",
Jan Engelhardt8b7c64d2008-04-15 11:48:25 +0200113 .version = XTABLES_VERSION,
Jan Engelhardt03d99482008-11-18 12:27:54 +0100114 .family = NFPROTO_IPV4,
Jan Engelhardt8b7c64d2008-04-15 11:48:25 +0200115 .size = XT_ALIGN(sizeof(struct ipt_ulog_info)),
116 .userspacesize = XT_ALIGN(sizeof(struct ipt_ulog_info)),
Jan Engelhardt1d5b63d2007-10-04 16:29:00 +0000117 .help = ULOG_help,
118 .init = ULOG_init,
Jan Engelhardt1d5b63d2007-10-04 16:29:00 +0000119 .print = ULOG_print,
120 .save = ULOG_save,
Jan Engelhardt1f2474a2011-03-08 01:24:26 +0100121 .x6_parse = ULOG_parse,
122 .x6_options = ULOG_opts,
Harald Weltec5bdb402000-07-31 14:24:57 +0000123};
124
125void _init(void)
126{
Jan Engelhardt8b7c64d2008-04-15 11:48:25 +0200127 xtables_register_target(&ulog_tg_reg);
Harald Weltec5bdb402000-07-31 14:24:57 +0000128}