|
@@ -0,0 +1,86 @@
|
|
|
+/*
|
|
|
+ * Copyright (c) 2006 Patrick McHardy <kaber@trash.net>
|
|
|
+ *
|
|
|
+ * This program is free software; you can redistribute it and/or modify
|
|
|
+ * it under the terms of the GNU General Public License version 2 as
|
|
|
+ * published by the Free Software Foundation.
|
|
|
+ */
|
|
|
+
|
|
|
+#include <linux/module.h>
|
|
|
+#include <linux/init.h>
|
|
|
+#include <linux/skbuff.h>
|
|
|
+
|
|
|
+#include <linux/netfilter/x_tables.h>
|
|
|
+#include <linux/netfilter/xt_NFLOG.h>
|
|
|
+
|
|
|
+MODULE_AUTHOR("Patrick McHardy <kaber@trash.net>");
|
|
|
+MODULE_DESCRIPTION("x_tables NFLOG target");
|
|
|
+MODULE_LICENSE("GPL");
|
|
|
+MODULE_ALIAS("ipt_NFLOG");
|
|
|
+MODULE_ALIAS("ip6t_NFLOG");
|
|
|
+
|
|
|
+static unsigned int
|
|
|
+nflog_target(struct sk_buff **pskb,
|
|
|
+ const struct net_device *in, const struct net_device *out,
|
|
|
+ unsigned int hooknum, const struct xt_target *target,
|
|
|
+ const void *targinfo)
|
|
|
+{
|
|
|
+ const struct xt_nflog_info *info = targinfo;
|
|
|
+ struct nf_loginfo li;
|
|
|
+
|
|
|
+ li.type = NF_LOG_TYPE_ULOG;
|
|
|
+ li.u.ulog.copy_len = info->len;
|
|
|
+ li.u.ulog.group = info->group;
|
|
|
+ li.u.ulog.qthreshold = info->threshold;
|
|
|
+
|
|
|
+ nf_log_packet(target->family, hooknum, *pskb, in, out, &li,
|
|
|
+ "%s", info->prefix);
|
|
|
+ return XT_CONTINUE;
|
|
|
+}
|
|
|
+
|
|
|
+static int
|
|
|
+nflog_checkentry(const char *tablename, const void *entry,
|
|
|
+ const struct xt_target *target, void *targetinfo,
|
|
|
+ unsigned int hookmask)
|
|
|
+{
|
|
|
+ struct xt_nflog_info *info = targetinfo;
|
|
|
+
|
|
|
+ if (info->flags & ~XT_NFLOG_MASK)
|
|
|
+ return 0;
|
|
|
+ if (info->prefix[sizeof(info->prefix) - 1] != '\0')
|
|
|
+ return 0;
|
|
|
+ return 1;
|
|
|
+}
|
|
|
+
|
|
|
+static struct xt_target xt_nflog_target[] = {
|
|
|
+ {
|
|
|
+ .name = "NFLOG",
|
|
|
+ .family = AF_INET,
|
|
|
+ .checkentry = nflog_checkentry,
|
|
|
+ .target = nflog_target,
|
|
|
+ .targetsize = sizeof(struct xt_nflog_info),
|
|
|
+ .me = THIS_MODULE,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ .name = "NFLOG",
|
|
|
+ .family = AF_INET6,
|
|
|
+ .checkentry = nflog_checkentry,
|
|
|
+ .target = nflog_target,
|
|
|
+ .targetsize = sizeof(struct xt_nflog_info),
|
|
|
+ .me = THIS_MODULE,
|
|
|
+ },
|
|
|
+};
|
|
|
+
|
|
|
+static int __init xt_nflog_init(void)
|
|
|
+{
|
|
|
+ return xt_register_targets(xt_nflog_target,
|
|
|
+ ARRAY_SIZE(xt_nflog_target));
|
|
|
+}
|
|
|
+
|
|
|
+static void __exit xt_nflog_fini(void)
|
|
|
+{
|
|
|
+ xt_unregister_targets(xt_nflog_target, ARRAY_SIZE(xt_nflog_target));
|
|
|
+}
|
|
|
+
|
|
|
+module_init(xt_nflog_init);
|
|
|
+module_exit(xt_nflog_fini);
|