5 #include <linux/netfilter_ipv4/ipt_LOG.h>
7 #define LOG_DEFAULT_LEVEL LOG_WARNING
9 #ifndef IPT_LOG_UID /* Old kernel */
10 #define IPT_LOG_UID 0x08 /* Log UID owning local socket */
12 #define IPT_LOG_MASK 0x0f
25 static void LOG_help(void)
28 "LOG target options:\n"
29 " --log-level level Level of logging (numeric or see syslog.conf)\n"
30 " --log-prefix prefix Prefix log messages with this prefix.\n\n"
31 " --log-tcp-sequence Log TCP sequence numbers.\n\n"
32 " --log-tcp-options Log TCP options.\n\n"
33 " --log-ip-options Log IP options.\n\n"
34 " --log-uid Log UID owning the local socket.\n\n"
35 " --log-macdecode Decode MAC addresses and protocol.\n\n");
38 #define s struct ipt_log_info
39 static 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},
53 static void LOG_init(struct xt_entry_target *t)
55 struct ipt_log_info *loginfo = (struct ipt_log_info *)t->data;
57 loginfo->level = LOG_DEFAULT_LEVEL;
61 struct ipt_log_names {
66 static const struct ipt_log_names ipt_log_names[]
67 = { { .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 }
78 static void LOG_parse(struct xt_option_call *cb)
80 struct ipt_log_info *info = cb->data;
82 xtables_option_parse(cb);
83 switch (cb->entry->id) {
85 if (strchr(cb->arg, '\n') != NULL)
86 xtables_error(PARAMETER_PROBLEM,
87 "Newlines not allowed in --log-prefix");
90 info->logflags |= IPT_LOG_TCPSEQ;
93 info->logflags |= IPT_LOG_TCPOPT;
96 info->logflags |= IPT_LOG_IPOPT;
99 info->logflags |= IPT_LOG_UID;
102 info->logflags |= IPT_LOG_MACDECODE;
107 static void LOG_print(const void *ip, const struct xt_entry_target *target,
110 const struct ipt_log_info *loginfo
111 = (const struct ipt_log_info *)target->data;
116 printf(" flags %u level %u",
117 loginfo->logflags, loginfo->level);
119 for (i = 0; i < ARRAY_SIZE(ipt_log_names); ++i)
120 if (loginfo->level == ipt_log_names[i].level) {
121 printf(" level %s", ipt_log_names[i].name);
124 if (i == ARRAY_SIZE(ipt_log_names))
125 printf(" UNKNOWN level %u", loginfo->level);
126 if (loginfo->logflags & IPT_LOG_TCPSEQ)
127 printf(" tcp-sequence");
128 if (loginfo->logflags & IPT_LOG_TCPOPT)
129 printf(" tcp-options");
130 if (loginfo->logflags & IPT_LOG_IPOPT)
131 printf(" ip-options");
132 if (loginfo->logflags & IPT_LOG_UID)
134 if (loginfo->logflags & IPT_LOG_MACDECODE)
135 printf(" macdecode");
136 if (loginfo->logflags & ~(IPT_LOG_MASK))
137 printf(" unknown-flags");
140 if (strcmp(loginfo->prefix, "") != 0)
141 printf(" prefix \"%s\"", loginfo->prefix);
144 static void LOG_save(const void *ip, const struct xt_entry_target *target)
146 const struct ipt_log_info *loginfo
147 = (const struct ipt_log_info *)target->data;
149 if (strcmp(loginfo->prefix, "") != 0) {
150 printf(" --log-prefix");
151 xtables_save_string(loginfo->prefix);
154 if (loginfo->level != LOG_DEFAULT_LEVEL)
155 printf(" --log-level %d", loginfo->level);
157 if (loginfo->logflags & IPT_LOG_TCPSEQ)
158 printf(" --log-tcp-sequence");
159 if (loginfo->logflags & IPT_LOG_TCPOPT)
160 printf(" --log-tcp-options");
161 if (loginfo->logflags & IPT_LOG_IPOPT)
162 printf(" --log-ip-options");
163 if (loginfo->logflags & IPT_LOG_UID)
164 printf(" --log-uid");
165 if (loginfo->logflags & IPT_LOG_MACDECODE)
166 printf(" --log-macdecode");
169 static struct xtables_target log_tg_reg = {
171 .version = XTABLES_VERSION,
172 .family = NFPROTO_IPV4,
173 .size = XT_ALIGN(sizeof(struct ipt_log_info)),
174 .userspacesize = XT_ALIGN(sizeof(struct ipt_log_info)),
179 .x6_parse = LOG_parse,
180 .x6_options = LOG_opts,
185 xtables_register_target(&log_tg_reg);