1baf7b1e11282127e068d149825cccec002091d61Patrick McHardy/*
2baf7b1e11282127e068d149825cccec002091d61Patrick McHardy * Copyright (c) 2006 Patrick McHardy <kaber@trash.net>
3baf7b1e11282127e068d149825cccec002091d61Patrick McHardy *
4baf7b1e11282127e068d149825cccec002091d61Patrick McHardy * This program is free software; you can redistribute it and/or modify
5baf7b1e11282127e068d149825cccec002091d61Patrick McHardy * it under the terms of the GNU General Public License version 2 as
6baf7b1e11282127e068d149825cccec002091d61Patrick McHardy * published by the Free Software Foundation.
7baf7b1e11282127e068d149825cccec002091d61Patrick McHardy */
8baf7b1e11282127e068d149825cccec002091d61Patrick McHardy
9baf7b1e11282127e068d149825cccec002091d61Patrick McHardy#include <linux/module.h>
10baf7b1e11282127e068d149825cccec002091d61Patrick McHardy#include <linux/init.h>
11baf7b1e11282127e068d149825cccec002091d61Patrick McHardy#include <linux/skbuff.h>
12baf7b1e11282127e068d149825cccec002091d61Patrick McHardy
13baf7b1e11282127e068d149825cccec002091d61Patrick McHardy#include <linux/netfilter/x_tables.h>
14baf7b1e11282127e068d149825cccec002091d61Patrick McHardy#include <linux/netfilter/xt_NFLOG.h>
15f01ffbd6e7d001ccf9168b33507958a51ce0ffcfPatrick McHardy#include <net/netfilter/nf_log.h>
165f7340eff8f68f41b7e5c7ad47ec4cd1ea1afb40Eric Leblond#include <net/netfilter/nfnetlink_log.h>
17baf7b1e11282127e068d149825cccec002091d61Patrick McHardy
18baf7b1e11282127e068d149825cccec002091d61Patrick McHardyMODULE_AUTHOR("Patrick McHardy <kaber@trash.net>");
192ae15b64e6a1608c840c60df38e8e5eef7b2b8c3Jan EngelhardtMODULE_DESCRIPTION("Xtables: packet logging to netlink using NFLOG");
20baf7b1e11282127e068d149825cccec002091d61Patrick McHardyMODULE_LICENSE("GPL");
21baf7b1e11282127e068d149825cccec002091d61Patrick McHardyMODULE_ALIAS("ipt_NFLOG");
22baf7b1e11282127e068d149825cccec002091d61Patrick McHardyMODULE_ALIAS("ip6t_NFLOG");
23baf7b1e11282127e068d149825cccec002091d61Patrick McHardy
24baf7b1e11282127e068d149825cccec002091d61Patrick McHardystatic unsigned int
254b560b447df83368df44bd3712c0c39b1d79ba04Jan Engelhardtnflog_tg(struct sk_buff *skb, const struct xt_action_param *par)
26baf7b1e11282127e068d149825cccec002091d61Patrick McHardy{
277eb3558655aaa87a3e71a0c065dfaddda521fa6dJan Engelhardt	const struct xt_nflog_info *info = par->targinfo;
28baf7b1e11282127e068d149825cccec002091d61Patrick McHardy	struct nf_loginfo li;
298cdb46da06ea94543a3b2e53e3e92736421d1093Hans Schillstrom	struct net *net = dev_net(par->in ? par->in : par->out);
30baf7b1e11282127e068d149825cccec002091d61Patrick McHardy
31baf7b1e11282127e068d149825cccec002091d61Patrick McHardy	li.type		     = NF_LOG_TYPE_ULOG;
32baf7b1e11282127e068d149825cccec002091d61Patrick McHardy	li.u.ulog.copy_len   = info->len;
33baf7b1e11282127e068d149825cccec002091d61Patrick McHardy	li.u.ulog.group	     = info->group;
34baf7b1e11282127e068d149825cccec002091d61Patrick McHardy	li.u.ulog.qthreshold = info->threshold;
35baf7b1e11282127e068d149825cccec002091d61Patrick McHardy
368cdb46da06ea94543a3b2e53e3e92736421d1093Hans Schillstrom	nfulnl_log_packet(net, par->family, par->hooknum, skb, par->in,
375f7340eff8f68f41b7e5c7ad47ec4cd1ea1afb40Eric Leblond			  par->out, &li, info->prefix);
38baf7b1e11282127e068d149825cccec002091d61Patrick McHardy	return XT_CONTINUE;
39baf7b1e11282127e068d149825cccec002091d61Patrick McHardy}
40baf7b1e11282127e068d149825cccec002091d61Patrick McHardy
41135367b8f6a18507af6b9a6910a14b5699415309Jan Engelhardtstatic int nflog_tg_check(const struct xt_tgchk_param *par)
42baf7b1e11282127e068d149825cccec002091d61Patrick McHardy{
43af5d6dc200eb0fcc6fbd3df1ab4d8969004cb37fJan Engelhardt	const struct xt_nflog_info *info = par->targinfo;
44baf7b1e11282127e068d149825cccec002091d61Patrick McHardy
45baf7b1e11282127e068d149825cccec002091d61Patrick McHardy	if (info->flags & ~XT_NFLOG_MASK)
46d6b00a5345ce4e86e8b00a88bb84a2c0c1f69ddcJan Engelhardt		return -EINVAL;
47baf7b1e11282127e068d149825cccec002091d61Patrick McHardy	if (info->prefix[sizeof(info->prefix) - 1] != '\0')
48d6b00a5345ce4e86e8b00a88bb84a2c0c1f69ddcJan Engelhardt		return -EINVAL;
49d6b00a5345ce4e86e8b00a88bb84a2c0c1f69ddcJan Engelhardt	return 0;
50baf7b1e11282127e068d149825cccec002091d61Patrick McHardy}
51baf7b1e11282127e068d149825cccec002091d61Patrick McHardy
5292f3b2b1bc968caaabee8cd78bee75ab7c4af74eJan Engelhardtstatic struct xt_target nflog_tg_reg __read_mostly = {
5392f3b2b1bc968caaabee8cd78bee75ab7c4af74eJan Engelhardt	.name       = "NFLOG",
5492f3b2b1bc968caaabee8cd78bee75ab7c4af74eJan Engelhardt	.revision   = 0,
5592f3b2b1bc968caaabee8cd78bee75ab7c4af74eJan Engelhardt	.family     = NFPROTO_UNSPEC,
5692f3b2b1bc968caaabee8cd78bee75ab7c4af74eJan Engelhardt	.checkentry = nflog_tg_check,
5792f3b2b1bc968caaabee8cd78bee75ab7c4af74eJan Engelhardt	.target     = nflog_tg,
5892f3b2b1bc968caaabee8cd78bee75ab7c4af74eJan Engelhardt	.targetsize = sizeof(struct xt_nflog_info),
5992f3b2b1bc968caaabee8cd78bee75ab7c4af74eJan Engelhardt	.me         = THIS_MODULE,
60baf7b1e11282127e068d149825cccec002091d61Patrick McHardy};
61baf7b1e11282127e068d149825cccec002091d61Patrick McHardy
62d3c5ee6d545b5372fd525ebe16988a5b6efeceb0Jan Engelhardtstatic int __init nflog_tg_init(void)
63baf7b1e11282127e068d149825cccec002091d61Patrick McHardy{
6492f3b2b1bc968caaabee8cd78bee75ab7c4af74eJan Engelhardt	return xt_register_target(&nflog_tg_reg);
65baf7b1e11282127e068d149825cccec002091d61Patrick McHardy}
66baf7b1e11282127e068d149825cccec002091d61Patrick McHardy
67d3c5ee6d545b5372fd525ebe16988a5b6efeceb0Jan Engelhardtstatic void __exit nflog_tg_exit(void)
68baf7b1e11282127e068d149825cccec002091d61Patrick McHardy{
6992f3b2b1bc968caaabee8cd78bee75ab7c4af74eJan Engelhardt	xt_unregister_target(&nflog_tg_reg);
70baf7b1e11282127e068d149825cccec002091d61Patrick McHardy}
71baf7b1e11282127e068d149825cccec002091d61Patrick McHardy
72d3c5ee6d545b5372fd525ebe16988a5b6efeceb0Jan Engelhardtmodule_init(nflog_tg_init);
73d3c5ee6d545b5372fd525ebe16988a5b6efeceb0Jan Engelhardtmodule_exit(nflog_tg_exit);
74