RT-AC56 3.0.0.4.374.37 core
[tomato.git] / release / src-rt-6.x.4708 / linux / linux-2.6.36 / net / netfilter / xt_IMQ.c
blob2340cb451ab61b773a946ecfc1dcaa55330a14c4
1 /*
2 * This target marks packets to be enqueued to an imq device
3 */
4 #include <linux/module.h>
5 #include <linux/skbuff.h>
6 #include <linux/netfilter/x_tables.h>
7 #include <linux/netfilter/xt_IMQ.h>
8 #include <linux/imq.h>
10 static unsigned int imq_target(struct sk_buff *pskb,
11 const struct xt_action_param *par)
13 const struct xt_imq_info *mr = par->targinfo;
15 pskb->imq_flags = (mr->todev & IMQ_F_IFMASK) | IMQ_F_ENQUEUE;
17 return XT_CONTINUE;
20 static int imq_checkentry(const struct xt_tgchk_param *par)
22 struct xt_imq_info *mr = par->targinfo;
24 if (mr->todev > IMQ_MAX_DEVS - 1) {
25 printk(KERN_WARNING
26 "IMQ: invalid device specified, highest is %u\n",
27 IMQ_MAX_DEVS - 1);
28 return -EINVAL;
31 return 0;
34 static struct xt_target xt_imq_reg[] __read_mostly = {
36 .name = "IMQ",
37 .family = AF_INET,
38 .checkentry = imq_checkentry,
39 .target = imq_target,
40 .targetsize = sizeof(struct xt_imq_info),
41 .table = "mangle",
42 .me = THIS_MODULE
45 .name = "IMQ",
46 .family = AF_INET6,
47 .checkentry = imq_checkentry,
48 .target = imq_target,
49 .targetsize = sizeof(struct xt_imq_info),
50 .table = "mangle",
51 .me = THIS_MODULE
55 static int __init imq_init(void)
57 return xt_register_targets(xt_imq_reg, ARRAY_SIZE(xt_imq_reg));
60 static void __exit imq_fini(void)
62 xt_unregister_targets(xt_imq_reg, ARRAY_SIZE(xt_imq_reg));
65 module_init(imq_init);
66 module_exit(imq_fini);
68 MODULE_AUTHOR("http://www.linuximq.net");
69 MODULE_DESCRIPTION("Pseudo-driver for the intermediate queue device. "
70 "See http://www.linuximq.net/ for more information.");
71 MODULE_LICENSE("GPL");
72 MODULE_ALIAS("ipt_IMQ");
73 MODULE_ALIAS("ip6t_IMQ");