blob: e54e57730012de72a1467c1cb16f96edd9492b02 [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001/*
2 * This is a module which is used for setting the skb->priority field
3 * of an skb for qdisc classification.
4 */
5
6/* (C) 2001-2002 Patrick McHardy <kaber@trash.net>
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License version 2 as
10 * published by the Free Software Foundation.
11 */
12
13#include <linux/module.h>
14#include <linux/skbuff.h>
15#include <linux/ip.h>
16#include <net/checksum.h>
17
Harald Welte2e4e6a12006-01-12 13:30:04 -080018#include <linux/netfilter/x_tables.h>
19#include <linux/netfilter/xt_CLASSIFY.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070020
21MODULE_AUTHOR("Patrick McHardy <kaber@trash.net>");
22MODULE_LICENSE("GPL");
23MODULE_DESCRIPTION("iptables qdisc classification target module");
Harald Welte2e4e6a12006-01-12 13:30:04 -080024MODULE_ALIAS("ipt_CLASSIFY");
Linus Torvalds1da177e2005-04-16 15:20:36 -070025
26static unsigned int
27target(struct sk_buff **pskb,
28 const struct net_device *in,
29 const struct net_device *out,
30 unsigned int hooknum,
Patrick McHardyc4986732006-03-20 18:02:56 -080031 const struct xt_target *target,
Linus Torvalds1da177e2005-04-16 15:20:36 -070032 const void *targinfo,
33 void *userinfo)
34{
Harald Welte2e4e6a12006-01-12 13:30:04 -080035 const struct xt_classify_target_info *clinfo = targinfo;
Linus Torvalds1da177e2005-04-16 15:20:36 -070036
Harald Welte2e4e6a12006-01-12 13:30:04 -080037 if ((*pskb)->priority != clinfo->priority)
Linus Torvalds1da177e2005-04-16 15:20:36 -070038 (*pskb)->priority = clinfo->priority;
Linus Torvalds1da177e2005-04-16 15:20:36 -070039
Harald Welte2e4e6a12006-01-12 13:30:04 -080040 return XT_CONTINUE;
Linus Torvalds1da177e2005-04-16 15:20:36 -070041}
42
Harald Welte2e4e6a12006-01-12 13:30:04 -080043static struct xt_target classify_reg = {
44 .name = "CLASSIFY",
45 .target = target,
Patrick McHardy5d04bff2006-03-20 18:01:58 -080046 .targetsize = sizeof(struct xt_classify_target_info),
47 .table = "mangle",
48 .hooks = (1 << NF_IP_LOCAL_OUT) | (1 << NF_IP_FORWARD) |
49 (1 << NF_IP_POST_ROUTING),
Pablo Neira Ayusoa45049c2006-03-22 13:55:40 -080050 .family = AF_INET,
Harald Welte2e4e6a12006-01-12 13:30:04 -080051 .me = THIS_MODULE,
52};
53static struct xt_target classify6_reg = {
Linus Torvalds1da177e2005-04-16 15:20:36 -070054 .name = "CLASSIFY",
55 .target = target,
Patrick McHardy5d04bff2006-03-20 18:01:58 -080056 .targetsize = sizeof(struct xt_classify_target_info),
57 .table = "mangle",
58 .hooks = (1 << NF_IP_LOCAL_OUT) | (1 << NF_IP_FORWARD) |
59 (1 << NF_IP_POST_ROUTING),
Pablo Neira Ayusoa45049c2006-03-22 13:55:40 -080060 .family = AF_INET6,
Linus Torvalds1da177e2005-04-16 15:20:36 -070061 .me = THIS_MODULE,
62};
63
Harald Welte2e4e6a12006-01-12 13:30:04 -080064
Andrew Morton65b4b4e2006-03-28 16:37:06 -080065static int __init xt_classify_init(void)
Linus Torvalds1da177e2005-04-16 15:20:36 -070066{
Harald Welte2e4e6a12006-01-12 13:30:04 -080067 int ret;
68
Pablo Neira Ayusoa45049c2006-03-22 13:55:40 -080069 ret = xt_register_target(&classify_reg);
Harald Welte2e4e6a12006-01-12 13:30:04 -080070 if (ret)
71 return ret;
72
Pablo Neira Ayusoa45049c2006-03-22 13:55:40 -080073 ret = xt_register_target(&classify6_reg);
Harald Welte2e4e6a12006-01-12 13:30:04 -080074 if (ret)
Pablo Neira Ayusoa45049c2006-03-22 13:55:40 -080075 xt_unregister_target(&classify_reg);
Harald Welte2e4e6a12006-01-12 13:30:04 -080076
77 return ret;
Linus Torvalds1da177e2005-04-16 15:20:36 -070078}
79
Andrew Morton65b4b4e2006-03-28 16:37:06 -080080static void __exit xt_classify_fini(void)
Linus Torvalds1da177e2005-04-16 15:20:36 -070081{
Pablo Neira Ayusoa45049c2006-03-22 13:55:40 -080082 xt_unregister_target(&classify_reg);
83 xt_unregister_target(&classify6_reg);
Linus Torvalds1da177e2005-04-16 15:20:36 -070084}
85
Andrew Morton65b4b4e2006-03-28 16:37:06 -080086module_init(xt_classify_init);
87module_exit(xt_classify_fini);