blob: 2b1ae2893a956744005ee8bcd42a514838d7e4d4 [file] [log] [blame]
Jan Rekorajski3ff7df42001-02-15 08:05:09 +00001#include <stdio.h>
Jan Rekorajski3ff7df42001-02-15 08:05:09 +00002#include <string.h>
Jan Rekorajski3ff7df42001-02-15 08:05:09 +00003#include <syslog.h>
Jan Engelhardt5d9678a2008-11-20 10:15:35 +01004#include <xtables.h>
Jan Rekorajski3ff7df42001-02-15 08:05:09 +00005#include <linux/netfilter_ipv6/ip6t_LOG.h>
6
Harald Welte893b6882005-07-10 15:06:21 +00007#ifndef IP6T_LOG_UID /* Old kernel */
8#define IP6T_LOG_UID 0x08
9#undef IP6T_LOG_MASK
10#define IP6T_LOG_MASK 0x0f
11#endif
12
Jan Rekorajski3ff7df42001-02-15 08:05:09 +000013#define LOG_DEFAULT_LEVEL LOG_WARNING
14
Jan Engelhardt0dd344a2011-02-15 12:05:12 +010015enum {
16 O_LOG_LEVEL = 0,
17 O_LOG_PREFIX,
18 O_LOG_TCPSEQ,
19 O_LOG_TCPOPTS,
20 O_LOG_IPOPTS,
21 O_LOG_UID,
22 O_LOG_MAC,
23};
24
Jan Engelhardt4d150eb2007-10-04 16:29:39 +000025static void LOG_help(void)
Jan Rekorajski3ff7df42001-02-15 08:05:09 +000026{
27 printf(
Jan Engelhardt8b7c64d2008-04-15 11:48:25 +020028"LOG target options:\n"
Jan Rekorajski3ff7df42001-02-15 08:05:09 +000029" --log-level level Level of logging (numeric or see syslog.conf)\n"
Jan Engelhardt8b7c64d2008-04-15 11:48:25 +020030" --log-prefix prefix Prefix log messages with this prefix.\n"
31" --log-tcp-sequence Log TCP sequence numbers.\n"
32" --log-tcp-options Log TCP options.\n"
33" --log-ip-options Log IP options.\n"
Patrick McHardy12764782010-06-28 14:51:35 +020034" --log-uid Log UID owning the local socket.\n"
35" --log-macdecode Decode MAC addresses and protocol.\n");
Jan Rekorajski3ff7df42001-02-15 08:05:09 +000036}
37
Jan Engelhardt0dd344a2011-02-15 12:05:12 +010038#define s struct ip6t_log_info
39static const struct xt_option_entry LOG_opts[] = {
40 {.name = "log-level", .id = O_LOG_LEVEL, .type = XTTYPE_SYSLOGLEVEL,
41 .flags = XTOPT_PUT, XTOPT_POINTER(s, level)},
42 {.name = "log-prefix", .id = O_LOG_PREFIX, .type = XTTYPE_STRING,
43 .flags = XTOPT_PUT, XTOPT_POINTER(s, prefix), .min = 1},
44 {.name = "log-tcp-sequence", .id = O_LOG_TCPSEQ, .type = XTTYPE_NONE},
45 {.name = "log-tcp-options", .id = O_LOG_TCPOPTS, .type = XTTYPE_NONE},
46 {.name = "log-ip-options", .id = O_LOG_IPOPTS, .type = XTTYPE_NONE},
47 {.name = "log-uid", .id = O_LOG_UID, .type = XTTYPE_NONE},
48 {.name = "log-macdecode", .id = O_LOG_MAC, .type = XTTYPE_NONE},
49 XTOPT_TABLEEND,
Jan Rekorajski3ff7df42001-02-15 08:05:09 +000050};
Jan Engelhardt0dd344a2011-02-15 12:05:12 +010051#undef s
Jan Rekorajski3ff7df42001-02-15 08:05:09 +000052
Jan Engelhardt4d150eb2007-10-04 16:29:39 +000053static void LOG_init(struct xt_entry_target *t)
Jan Rekorajski3ff7df42001-02-15 08:05:09 +000054{
55 struct ip6t_log_info *loginfo = (struct ip6t_log_info *)t->data;
56
57 loginfo->level = LOG_DEFAULT_LEVEL;
58
Jan Rekorajski3ff7df42001-02-15 08:05:09 +000059}
60
61struct ip6t_log_names {
62 const char *name;
63 unsigned int level;
64};
65
Jan Engelhardt0e2abed2007-10-04 16:25:58 +000066static const struct ip6t_log_names ip6t_log_names[]
Stephane Ouellette2be28ab2003-08-11 19:58:56 +000067= { { .name = "alert", .level = LOG_ALERT },
68 { .name = "crit", .level = LOG_CRIT },
69 { .name = "debug", .level = LOG_DEBUG },
70 { .name = "emerg", .level = LOG_EMERG },
71 { .name = "error", .level = LOG_ERR }, /* DEPRECATED */
72 { .name = "info", .level = LOG_INFO },
73 { .name = "notice", .level = LOG_NOTICE },
74 { .name = "panic", .level = LOG_EMERG }, /* DEPRECATED */
75 { .name = "warning", .level = LOG_WARNING }
Jan Rekorajski3ff7df42001-02-15 08:05:09 +000076};
77
Jan Engelhardt0dd344a2011-02-15 12:05:12 +010078static void LOG_parse(struct xt_option_call *cb)
Jan Rekorajski3ff7df42001-02-15 08:05:09 +000079{
Jan Engelhardt0dd344a2011-02-15 12:05:12 +010080 struct ip6t_log_info *info = cb->data;
Jan Rekorajski3ff7df42001-02-15 08:05:09 +000081
Jan Engelhardt0dd344a2011-02-15 12:05:12 +010082 xtables_option_parse(cb);
83 switch (cb->entry->id) {
84 case O_LOG_PREFIX:
85 if (strchr(cb->arg, '\n') != NULL)
Jan Engelhardt1829ed42009-02-21 03:29:44 +010086 xtables_error(PARAMETER_PROBLEM,
Phil Oester182f3f62005-04-01 07:07:00 +000087 "Newlines not allowed in --log-prefix");
Jan Rekorajski3ff7df42001-02-15 08:05:09 +000088 break;
Jan Engelhardt0dd344a2011-02-15 12:05:12 +010089 case O_LOG_TCPSEQ:
Jan Engelhardt4e98e812011-06-21 17:00:45 +020090 info->logflags |= IP6T_LOG_TCPSEQ;
Jan Rekorajski3ff7df42001-02-15 08:05:09 +000091 break;
Jan Engelhardt0dd344a2011-02-15 12:05:12 +010092 case O_LOG_TCPOPTS:
Jan Engelhardt4e98e812011-06-21 17:00:45 +020093 info->logflags |= IP6T_LOG_TCPOPT;
Jan Rekorajski3ff7df42001-02-15 08:05:09 +000094 break;
Jan Engelhardt0dd344a2011-02-15 12:05:12 +010095 case O_LOG_IPOPTS:
Jan Engelhardt4e98e812011-06-21 17:00:45 +020096 info->logflags |= IP6T_LOG_IPOPT;
Jan Rekorajski3ff7df42001-02-15 08:05:09 +000097 break;
Jan Engelhardt0dd344a2011-02-15 12:05:12 +010098 case O_LOG_UID:
Jan Engelhardt4e98e812011-06-21 17:00:45 +020099 info->logflags |= IP6T_LOG_UID;
Patrick McHardy0c4c91c2005-06-24 02:15:31 +0000100 break;
Jan Engelhardt0dd344a2011-02-15 12:05:12 +0100101 case O_LOG_MAC:
Jan Engelhardt4e98e812011-06-21 17:00:45 +0200102 info->logflags |= IP6T_LOG_MACDECODE;
Patrick McHardy12764782010-06-28 14:51:35 +0200103 break;
Jan Rekorajski3ff7df42001-02-15 08:05:09 +0000104 }
Jan Rekorajski3ff7df42001-02-15 08:05:09 +0000105}
106
Jan Engelhardt4d150eb2007-10-04 16:29:39 +0000107static void LOG_print(const void *ip, const struct xt_entry_target *target,
108 int numeric)
Jan Rekorajski3ff7df42001-02-15 08:05:09 +0000109{
110 const struct ip6t_log_info *loginfo
111 = (const struct ip6t_log_info *)target->data;
112 unsigned int i = 0;
113
Jan Engelhardt73866352010-12-18 02:04:59 +0100114 printf(" LOG");
Jan Rekorajski3ff7df42001-02-15 08:05:09 +0000115 if (numeric)
Jan Engelhardt73866352010-12-18 02:04:59 +0100116 printf(" flags %u level %u",
Jan Rekorajski3ff7df42001-02-15 08:05:09 +0000117 loginfo->logflags, loginfo->level);
118 else {
Jan Engelhardt2c69b552009-04-30 19:32:02 +0200119 for (i = 0; i < ARRAY_SIZE(ip6t_log_names); ++i)
Jan Rekorajski3ff7df42001-02-15 08:05:09 +0000120 if (loginfo->level == ip6t_log_names[i].level) {
Jan Engelhardt73866352010-12-18 02:04:59 +0100121 printf(" level %s", ip6t_log_names[i].name);
Jan Rekorajski3ff7df42001-02-15 08:05:09 +0000122 break;
123 }
Jan Engelhardt2c69b552009-04-30 19:32:02 +0200124 if (i == ARRAY_SIZE(ip6t_log_names))
Jan Engelhardt73866352010-12-18 02:04:59 +0100125 printf(" UNKNOWN level %u", loginfo->level);
Jan Rekorajski3ff7df42001-02-15 08:05:09 +0000126 if (loginfo->logflags & IP6T_LOG_TCPSEQ)
Jan Engelhardt73866352010-12-18 02:04:59 +0100127 printf(" tcp-sequence");
Jan Rekorajski3ff7df42001-02-15 08:05:09 +0000128 if (loginfo->logflags & IP6T_LOG_TCPOPT)
Jan Engelhardt73866352010-12-18 02:04:59 +0100129 printf(" tcp-options");
Jan Rekorajski3ff7df42001-02-15 08:05:09 +0000130 if (loginfo->logflags & IP6T_LOG_IPOPT)
Jan Engelhardt73866352010-12-18 02:04:59 +0100131 printf(" ip-options");
Patrick McHardy0c4c91c2005-06-24 02:15:31 +0000132 if (loginfo->logflags & IP6T_LOG_UID)
Jan Engelhardt73866352010-12-18 02:04:59 +0100133 printf(" uid");
Patrick McHardy12764782010-06-28 14:51:35 +0200134 if (loginfo->logflags & IP6T_LOG_MACDECODE)
Jan Engelhardt73866352010-12-18 02:04:59 +0100135 printf(" macdecode");
Jan Rekorajski3ff7df42001-02-15 08:05:09 +0000136 if (loginfo->logflags & ~(IP6T_LOG_MASK))
Jan Engelhardt73866352010-12-18 02:04:59 +0100137 printf(" unknown-flags");
Jan Rekorajski3ff7df42001-02-15 08:05:09 +0000138 }
139
140 if (strcmp(loginfo->prefix, "") != 0)
Jan Engelhardt73866352010-12-18 02:04:59 +0100141 printf(" prefix \"%s\"", loginfo->prefix);
Jan Rekorajski3ff7df42001-02-15 08:05:09 +0000142}
143
Jan Engelhardt4d150eb2007-10-04 16:29:39 +0000144static void LOG_save(const void *ip, const struct xt_entry_target *target)
Jan Rekorajski3ff7df42001-02-15 08:05:09 +0000145{
146 const struct ip6t_log_info *loginfo
147 = (const struct ip6t_log_info *)target->data;
148
149 if (strcmp(loginfo->prefix, "") != 0)
Jan Engelhardt73866352010-12-18 02:04:59 +0100150 printf(" --log-prefix \"%s\"", loginfo->prefix);
Jan Rekorajski3ff7df42001-02-15 08:05:09 +0000151
Thomas Woerner01cbaa62003-07-14 20:01:29 +0000152 if (loginfo->level != LOG_DEFAULT_LEVEL)
Jan Engelhardt73866352010-12-18 02:04:59 +0100153 printf(" --log-level %d", loginfo->level);
Jan Rekorajski3ff7df42001-02-15 08:05:09 +0000154
155 if (loginfo->logflags & IP6T_LOG_TCPSEQ)
Jan Engelhardt73866352010-12-18 02:04:59 +0100156 printf(" --log-tcp-sequence");
Jan Rekorajski3ff7df42001-02-15 08:05:09 +0000157 if (loginfo->logflags & IP6T_LOG_TCPOPT)
Jan Engelhardt73866352010-12-18 02:04:59 +0100158 printf(" --log-tcp-options");
Jan Rekorajski3ff7df42001-02-15 08:05:09 +0000159 if (loginfo->logflags & IP6T_LOG_IPOPT)
Jan Engelhardt73866352010-12-18 02:04:59 +0100160 printf(" --log-ip-options");
Patrick McHardy0c4c91c2005-06-24 02:15:31 +0000161 if (loginfo->logflags & IP6T_LOG_UID)
Jan Engelhardt73866352010-12-18 02:04:59 +0100162 printf(" --log-uid");
Patrick McHardy12764782010-06-28 14:51:35 +0200163 if (loginfo->logflags & IP6T_LOG_MACDECODE)
Jan Engelhardt73866352010-12-18 02:04:59 +0100164 printf(" --log-macdecode");
Jan Rekorajski3ff7df42001-02-15 08:05:09 +0000165}
166
Jan Engelhardt8b7c64d2008-04-15 11:48:25 +0200167static struct xtables_target log_tg6_reg = {
Jan Engelhardte1df2212011-02-15 12:02:51 +0100168 .name = "LOG",
169 .version = XTABLES_VERSION,
170 .family = NFPROTO_IPV6,
171 .size = XT_ALIGN(sizeof(struct ip6t_log_info)),
172 .userspacesize = XT_ALIGN(sizeof(struct ip6t_log_info)),
173 .help = LOG_help,
174 .init = LOG_init,
Jan Engelhardte1df2212011-02-15 12:02:51 +0100175 .print = LOG_print,
176 .save = LOG_save,
Jan Engelhardt0dd344a2011-02-15 12:05:12 +0100177 .x6_parse = LOG_parse,
178 .x6_options = LOG_opts,
Jan Rekorajski3ff7df42001-02-15 08:05:09 +0000179};
180
181void _init(void)
182{
Jan Engelhardt8b7c64d2008-04-15 11:48:25 +0200183 xtables_register_target(&log_tg6_reg);
Jan Rekorajski3ff7df42001-02-15 08:05:09 +0000184}