|  | /* | 
|  | * 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); |