30 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
31 #include <linux/module.h>
32 #include <linux/slab.h>
34 #include <linux/socket.h>
36 #include <linux/kernel.h>
38 #include <linux/netlink.h>
39 #include <linux/netdevice.h>
40 #include <linux/netfilter/x_tables.h>
41 #include <linux/netfilter_bridge/ebtables.h>
45 #include "../br_private.h"
50 "(defaults to 4096)");
52 static unsigned int flushtimeout = 10;
54 MODULE_PARM_DESC(flushtimeout,
"buffer flush timeout (hundredths ofa second) "
66 static struct sock *ebtulognl;
69 static void ulog_send(
unsigned int nlgroup)
73 if (timer_pending(&ub->
timer))
91 static void ulog_timer(
unsigned long data)
93 spin_lock_bh(&ulog_buffers[data].lock);
94 if (ulog_buffers[data].
skb)
96 spin_unlock_bh(&ulog_buffers[data].lock);
99 static struct sk_buff *ulog_alloc_skb(
unsigned int size)
104 n =
max(size, nlbufsiz);
112 pr_debug(
"cannot even allocate buffer of size %ub\n",
120 static void ebt_ulog_packet(
unsigned int hooknr,
const struct sk_buff *skb,
125 size_t size, copy_len;
132 if ((uloginfo->
cprange == 0) ||
139 if (size > nlbufsiz) {
140 pr_debug(
"Size %Zd needed, but nlbufsiz=%d\n", size, nlbufsiz);
147 if (!(ub->
skb = ulog_alloc_skb(size)))
149 }
else if (size > skb_tailroom(ub->
skb)) {
152 if (!(ub->
skb = ulog_alloc_skb(size)))
156 nlh = nlmsg_put(ub->
skb, 0, ub->
qlen, 0,
165 pm = nlmsg_data(nlh);
170 pm->
stamp = ktime_to_timeval(kt);
172 ub->
skb->tstamp = kt;
186 strcpy(pm->
indev, br_port_get_rcu(in)->br->dev->name);
196 strcpy(pm->
outdev, br_port_get_rcu(out)->br->dev->name);
210 else if (!timer_pending(&ub->
timer)) {
216 spin_unlock_bh(lock);
231 loginfo.prefix[0] =
'\0';
233 loginfo.nlgroup = li->
u.
ulog.group;
234 loginfo.cprange = li->
u.
ulog.copy_len;
235 loginfo.qthreshold = li->
u.
ulog.qthreshold;
236 strlcpy(loginfo.prefix, prefix,
sizeof(loginfo.prefix));
239 ebt_ulog_packet(hooknum, skb, in, out, &loginfo, prefix);
269 .target = ebt_ulog_tg,
270 .checkentry = ebt_ulog_tg_check,
275 static struct nf_logger ebt_ulog_logger __read_mostly = {
277 .logfn = &ebt_log_packet,
281 static int __init ebt_ulog_init(
void)
289 if (nlbufsiz >= 128*1024) {
290 pr_warning(
"Netlink buffer has to be <= 128kB,"
291 " please try a smaller nlbufsiz parameter.\n");
313 static void __exit ebt_ulog_fini(
void)
321 ub = &ulog_buffers[
i];
322 if (timer_pending(&ub->
timer))
324 spin_lock_bh(&ub->
lock);
329 spin_unlock_bh(&ub->
lock);