From 99987584cdfd3c4d52432346b407818547e9e157 Mon Sep 17 00:00:00 2001 From: laforge Date: Mon, 31 Jul 2000 09:08:10 +0000 Subject: Initial revision --- kernel/ipt_ULOG.c | 138 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 138 insertions(+) create mode 100644 kernel/ipt_ULOG.c (limited to 'kernel/ipt_ULOG.c') diff --git a/kernel/ipt_ULOG.c b/kernel/ipt_ULOG.c new file mode 100644 index 0000000..06a3578 --- /dev/null +++ b/kernel/ipt_ULOG.c @@ -0,0 +1,138 @@ +/* + * netfilter module for userspace packet logging daemons + * + * (C) 2000 by Harald Welte + * + * Released under the terms of the GPL + * + * $Id$ + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define NETLINK_NFLOG 25 +#define ULOG_NL_EVENT 111 + +#if 1 +#define DEBUGP printk +#else +#define DEBUGP(format, args ...) +#endif + +struct sock *nflognl; + +static void nflog_rcv(struct sock *sk, int len) +{ + printk("nflog_rcv: did receive netlink message ?!?\n"); +} + +static unsigned int ipt_ulog_target( + struct sk_buff **pskb, + unsigned int hooknum, + const struct net_device *in, + const struct net_device *out, + const void *targinfo, + void *userinfo) +{ + ulog_packet_msg_t *pm; + size_t size; + struct sk_buff *nlskb; + unsigned char *old_tail; + struct nlmsghdr *nlh; + struct ipt_ulog_info *loginfo = (struct ipt_ulog_info *)targinfo; + + /* calculate the size of the skb needed */ + + size = NLMSG_SPACE(sizeof(*pm) + (*pskb)->len); + nlskb = alloc_skb(size, GFP_ATOMIC); + if (!nlskb) + goto nlmsg_failure; + + old_tail = nlskb->tail; + nlh = NLMSG_PUT(nlskb, 0, 0, ULOG_NL_EVENT, size - sizeof(*nlh)); + pm = NLMSG_DATA(nlh); + + /* copy hook, prefix, timestamp, payload, etc. */ + + pm->data_len = (*pskb)->len; + pm->timestamp_sec = (*pskb)->stamp.tv_sec; + pm->timestamp_usec = (*pskb)->stamp.tv_usec; + pm->mark = (*pskb)->nfmark; + pm->hook = hooknum; + if (loginfo->prefix) + strcpy(pm->prefix, loginfo->prefix); + + if (in && !out) + { + if ((*pskb)->dev && (*pskb)->dev->hard_header_len > 0 + && (*pskb)->dev->hard_header_len <= ULOG_MAC_LEN) + { + memcpy(pm->mac, (*pskb)->mac.raw, (*pskb)->dev->hard_header_len); + pm->mac_len = (*pskb)->dev->hard_header_len; + } + + } +/* + if (in) strcpy(pm->indev_name, in->name); + else pm->indev_name[0] = '\0'; +*/ + if ((*pskb)->len) + memcpy(pm->payload, (*pskb)->data, (*pskb)->len); + nlh->nlmsg_len = nlskb->tail - old_tail; + NETLINK_CB(nlskb).dst_groups = loginfo->nl_group; + DEBUGP("ipt_ULOG: going to throw out a packet to netlink groupmask %u\n", loginfo->nl_group); + netlink_broadcast(nflognl, nlskb, 0, loginfo->nl_group, GFP_ATOMIC); + + return IPT_CONTINUE; + +nlmsg_failure: + if (nlskb) + kfree(nlskb); + printk("ipt_ULOG: Error building netlink message\n"); + return IPT_CONTINUE; + +} + +static int ipt_ulog_checkentry( + const char *tablename, + const struct ipt_entry *e, + void *targinfo, + unsigned int targinfosize, + unsigned int hookmask) +{ + return 1; +} + + +static struct ipt_target ipt_ulog_reg = + { { NULL, NULL }, "ULOG", ipt_ulog_target, ipt_ulog_checkentry, NULL, + THIS_MODULE }; + +static int __init init(void) +{ + DEBUGP("ipt_ULOG: init module\n"); + nflognl = netlink_kernel_create(NETLINK_NFLOG, nflog_rcv); + if (ipt_register_target(&ipt_ulog_reg)) + return -EINVAL; + + return 0; +} + +static void __exit fini(void) +{ + DEBUGP("ipt_ULOG: cleanup_module\n"); + ipt_unregister_target(&ipt_ulog_reg); +} + +module_init(init); +module_exit(fini); -- cgit v1.2.3