Harald Welte | 015dffb | 2000-07-31 23:38:14 +0000 | [diff] [blame] | 1 | /* Shared library add-on to iptables to add ULOG support. |
| 2 | * |
Harald Welte | d3beea3 | 2001-01-31 07:30:19 +0000 | [diff] [blame] | 3 | * (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 Welte | 015dffb | 2000-07-31 23:38:14 +0000 | [diff] [blame] | 7 | * |
| 8 | * This software is released under the terms of GNU GPL |
| 9 | * |
Harald Welte | d3beea3 | 2001-01-31 07:30:19 +0000 | [diff] [blame] | 10 | * libipt_ULOG.c,v 1.7 2001/01/30 11:55:02 laforge Exp |
Harald Welte | 015dffb | 2000-07-31 23:38:14 +0000 | [diff] [blame] | 11 | */ |
Harald Welte | c5bdb40 | 2000-07-31 14:24:57 +0000 | [diff] [blame] | 12 | #include <stdio.h> |
Harald Welte | c5bdb40 | 2000-07-31 14:24:57 +0000 | [diff] [blame] | 13 | #include <string.h> |
Jan Engelhardt | 5d9678a | 2008-11-20 10:15:35 +0100 | [diff] [blame] | 14 | #include <xtables.h> |
Martin Josefsson | 1eb0081 | 2004-05-26 15:58:07 +0000 | [diff] [blame] | 15 | /* For 64bit kernel / 32bit userspace */ |
Jan Engelhardt | a2a7f2b | 2008-09-01 14:20:13 +0200 | [diff] [blame] | 16 | #include <linux/netfilter_ipv4/ipt_ULOG.h> |
Harald Welte | c5bdb40 | 2000-07-31 14:24:57 +0000 | [diff] [blame] | 17 | |
Jan Engelhardt | 1f2474a | 2011-03-08 01:24:26 +0100 | [diff] [blame] | 18 | enum { |
| 19 | O_ULOG_NLGROUP = 0, |
| 20 | O_ULOG_PREFIX, |
| 21 | O_ULOG_CPRANGE, |
| 22 | O_ULOG_QTHR, |
| 23 | }; |
Harald Welte | c5bdb40 | 2000-07-31 14:24:57 +0000 | [diff] [blame] | 24 | |
Jan Engelhardt | 1d5b63d | 2007-10-04 16:29:00 +0000 | [diff] [blame] | 25 | static void ULOG_help(void) |
Harald Welte | c5bdb40 | 2000-07-31 14:24:57 +0000 | [diff] [blame] | 26 | { |
Jan Engelhardt | 8b7c64d | 2008-04-15 11:48:25 +0200 | [diff] [blame] | 27 | printf("ULOG target options:\n" |
Marc Boucher | 4454094 | 2000-09-12 01:39:41 +0000 | [diff] [blame] | 28 | " --ulog-nlgroup nlgroup NETLINK group used for logging\n" |
Harald Welte | 015dffb | 2000-07-31 23:38:14 +0000 | [diff] [blame] | 29 | " --ulog-cprange size Bytes of each packet to be passed\n" |
Harald Welte | d3beea3 | 2001-01-31 07:30:19 +0000 | [diff] [blame] | 30 | " --ulog-qthreshold Threshold of in-kernel queue\n" |
Jan Engelhardt | 8b7c64d | 2008-04-15 11:48:25 +0200 | [diff] [blame] | 31 | " --ulog-prefix prefix Prefix log messages with this prefix.\n"); |
Harald Welte | c5bdb40 | 2000-07-31 14:24:57 +0000 | [diff] [blame] | 32 | } |
| 33 | |
Jan Engelhardt | 1f2474a | 2011-03-08 01:24:26 +0100 | [diff] [blame] | 34 | static 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 Welte | c5bdb40 | 2000-07-31 14:24:57 +0000 | [diff] [blame] | 44 | }; |
| 45 | |
Jan Engelhardt | 1d5b63d | 2007-10-04 16:29:00 +0000 | [diff] [blame] | 46 | static void ULOG_init(struct xt_entry_target *t) |
Harald Welte | c5bdb40 | 2000-07-31 14:24:57 +0000 | [diff] [blame] | 47 | { |
Harald Welte | 015dffb | 2000-07-31 23:38:14 +0000 | [diff] [blame] | 48 | struct ipt_ulog_info *loginfo = (struct ipt_ulog_info *) t->data; |
Harald Welte | c5bdb40 | 2000-07-31 14:24:57 +0000 | [diff] [blame] | 49 | |
| 50 | loginfo->nl_group = ULOG_DEFAULT_NLGROUP; |
Harald Welte | d3beea3 | 2001-01-31 07:30:19 +0000 | [diff] [blame] | 51 | loginfo->qthreshold = ULOG_DEFAULT_QTHRESHOLD; |
Harald Welte | c5bdb40 | 2000-07-31 14:24:57 +0000 | [diff] [blame] | 52 | |
Harald Welte | c5bdb40 | 2000-07-31 14:24:57 +0000 | [diff] [blame] | 53 | } |
| 54 | |
Jan Engelhardt | 1f2474a | 2011-03-08 01:24:26 +0100 | [diff] [blame] | 55 | static void ULOG_parse(struct xt_option_call *cb) |
Harald Welte | c5bdb40 | 2000-07-31 14:24:57 +0000 | [diff] [blame] | 56 | { |
Jan Engelhardt | 1f2474a | 2011-03-08 01:24:26 +0100 | [diff] [blame] | 57 | struct ipt_ulog_info *loginfo = cb->data; |
Harald Welte | c5bdb40 | 2000-07-31 14:24:57 +0000 | [diff] [blame] | 58 | |
Jan Engelhardt | 1f2474a | 2011-03-08 01:24:26 +0100 | [diff] [blame] | 59 | xtables_option_parse(cb); |
| 60 | switch (cb->entry->id) { |
| 61 | case O_ULOG_NLGROUP: |
| 62 | loginfo->nl_group = 1 << (cb->val.u8 - 1); |
Harald Welte | c5bdb40 | 2000-07-31 14:24:57 +0000 | [diff] [blame] | 63 | break; |
Jan Engelhardt | 1f2474a | 2011-03-08 01:24:26 +0100 | [diff] [blame] | 64 | case O_ULOG_PREFIX: |
| 65 | if (strchr(cb->arg, '\n') != NULL) |
Jan Engelhardt | 1829ed4 | 2009-02-21 03:29:44 +0100 | [diff] [blame] | 66 | xtables_error(PARAMETER_PROBLEM, |
Mike Frysinger | ed26b7b | 2006-10-10 06:18:40 +0000 | [diff] [blame] | 67 | "Newlines not allowed in --ulog-prefix"); |
Harald Welte | c5bdb40 | 2000-07-31 14:24:57 +0000 | [diff] [blame] | 68 | break; |
Jan Engelhardt | 1f2474a | 2011-03-08 01:24:26 +0100 | [diff] [blame] | 69 | case O_ULOG_CPRANGE: |
| 70 | loginfo->copy_range = cb->val.u64; |
Harald Welte | 015dffb | 2000-07-31 23:38:14 +0000 | [diff] [blame] | 71 | break; |
Jan Engelhardt | 1f2474a | 2011-03-08 01:24:26 +0100 | [diff] [blame] | 72 | case O_ULOG_QTHR: |
| 73 | loginfo->qthreshold = cb->val.u64; |
Harald Welte | d3beea3 | 2001-01-31 07:30:19 +0000 | [diff] [blame] | 74 | break; |
Harald Welte | c5bdb40 | 2000-07-31 14:24:57 +0000 | [diff] [blame] | 75 | } |
Harald Welte | c5bdb40 | 2000-07-31 14:24:57 +0000 | [diff] [blame] | 76 | } |
| 77 | |
Jan Engelhardt | 1d5b63d | 2007-10-04 16:29:00 +0000 | [diff] [blame] | 78 | static void ULOG_save(const void *ip, const struct xt_entry_target *target) |
Harald Welte | c5bdb40 | 2000-07-31 14:24:57 +0000 | [diff] [blame] | 79 | { |
Harald Welte | 015dffb | 2000-07-31 23:38:14 +0000 | [diff] [blame] | 80 | const struct ipt_ulog_info *loginfo |
| 81 | = (const struct ipt_ulog_info *) target->data; |
Harald Welte | c5bdb40 | 2000-07-31 14:24:57 +0000 | [diff] [blame] | 82 | |
Max Kellermann | a5d0994 | 2008-01-29 13:44:34 +0000 | [diff] [blame] | 83 | if (strcmp(loginfo->prefix, "") != 0) { |
Jan Engelhardt | 7386635 | 2010-12-18 02:04:59 +0100 | [diff] [blame] | 84 | fputs(" --ulog-prefix", stdout); |
Jan Engelhardt | a0baae8 | 2009-01-30 04:32:50 +0100 | [diff] [blame] | 85 | xtables_save_string(loginfo->prefix); |
Max Kellermann | a5d0994 | 2008-01-29 13:44:34 +0000 | [diff] [blame] | 86 | } |
Harald Welte | c5bdb40 | 2000-07-31 14:24:57 +0000 | [diff] [blame] | 87 | |
Jan Engelhardt | 1f2474a | 2011-03-08 01:24:26 +0100 | [diff] [blame] | 88 | if (loginfo->nl_group != ULOG_DEFAULT_NLGROUP) |
| 89 | printf(" --ulog-nlgroup %d", ffs(loginfo->nl_group)); |
Harald Welte | 015dffb | 2000-07-31 23:38:14 +0000 | [diff] [blame] | 90 | if (loginfo->copy_range) |
Jan Engelhardt | 7386635 | 2010-12-18 02:04:59 +0100 | [diff] [blame] | 91 | printf(" --ulog-cprange %u", (unsigned int)loginfo->copy_range); |
Harald Welte | d3beea3 | 2001-01-31 07:30:19 +0000 | [diff] [blame] | 92 | |
| 93 | if (loginfo->qthreshold != ULOG_DEFAULT_QTHRESHOLD) |
Jan Engelhardt | 7386635 | 2010-12-18 02:04:59 +0100 | [diff] [blame] | 94 | printf(" --ulog-qthreshold %u", (unsigned int)loginfo->qthreshold); |
Harald Welte | c5bdb40 | 2000-07-31 14:24:57 +0000 | [diff] [blame] | 95 | } |
| 96 | |
Jan Engelhardt | 1d5b63d | 2007-10-04 16:29:00 +0000 | [diff] [blame] | 97 | static void ULOG_print(const void *ip, const struct xt_entry_target *target, |
| 98 | int numeric) |
Harald Welte | c5bdb40 | 2000-07-31 14:24:57 +0000 | [diff] [blame] | 99 | { |
| 100 | const struct ipt_ulog_info *loginfo |
Harald Welte | 015dffb | 2000-07-31 23:38:14 +0000 | [diff] [blame] | 101 | = (const struct ipt_ulog_info *) target->data; |
Harald Welte | c5bdb40 | 2000-07-31 14:24:57 +0000 | [diff] [blame] | 102 | |
Jan Engelhardt | 7386635 | 2010-12-18 02:04:59 +0100 | [diff] [blame] | 103 | printf(" ULOG "); |
Jan Engelhardt | 1f2474a | 2011-03-08 01:24:26 +0100 | [diff] [blame] | 104 | printf("copy_range %u nlgroup %d", (unsigned int)loginfo->copy_range, |
| 105 | ffs(loginfo->nl_group)); |
Harald Welte | c5bdb40 | 2000-07-31 14:24:57 +0000 | [diff] [blame] | 106 | if (strcmp(loginfo->prefix, "") != 0) |
Jan Engelhardt | 7386635 | 2010-12-18 02:04:59 +0100 | [diff] [blame] | 107 | printf(" prefix \"%s\"", loginfo->prefix); |
| 108 | printf(" queue_threshold %u", (unsigned int)loginfo->qthreshold); |
Harald Welte | c5bdb40 | 2000-07-31 14:24:57 +0000 | [diff] [blame] | 109 | } |
| 110 | |
Jan Engelhardt | 8b7c64d | 2008-04-15 11:48:25 +0200 | [diff] [blame] | 111 | static struct xtables_target ulog_tg_reg = { |
Pablo Neira | 8caee8b | 2004-12-28 13:11:59 +0000 | [diff] [blame] | 112 | .name = "ULOG", |
Jan Engelhardt | 8b7c64d | 2008-04-15 11:48:25 +0200 | [diff] [blame] | 113 | .version = XTABLES_VERSION, |
Jan Engelhardt | 03d9948 | 2008-11-18 12:27:54 +0100 | [diff] [blame] | 114 | .family = NFPROTO_IPV4, |
Jan Engelhardt | 8b7c64d | 2008-04-15 11:48:25 +0200 | [diff] [blame] | 115 | .size = XT_ALIGN(sizeof(struct ipt_ulog_info)), |
| 116 | .userspacesize = XT_ALIGN(sizeof(struct ipt_ulog_info)), |
Jan Engelhardt | 1d5b63d | 2007-10-04 16:29:00 +0000 | [diff] [blame] | 117 | .help = ULOG_help, |
| 118 | .init = ULOG_init, |
Jan Engelhardt | 1d5b63d | 2007-10-04 16:29:00 +0000 | [diff] [blame] | 119 | .print = ULOG_print, |
| 120 | .save = ULOG_save, |
Jan Engelhardt | 1f2474a | 2011-03-08 01:24:26 +0100 | [diff] [blame] | 121 | .x6_parse = ULOG_parse, |
| 122 | .x6_options = ULOG_opts, |
Harald Welte | c5bdb40 | 2000-07-31 14:24:57 +0000 | [diff] [blame] | 123 | }; |
| 124 | |
| 125 | void _init(void) |
| 126 | { |
Jan Engelhardt | 8b7c64d | 2008-04-15 11:48:25 +0200 | [diff] [blame] | 127 | xtables_register_target(&ulog_tg_reg); |
Harald Welte | c5bdb40 | 2000-07-31 14:24:57 +0000 | [diff] [blame] | 128 | } |