|
|
@@ -0,0 +1,120 @@
|
|
|
+diff -uprN linux-2.4.32.reference/include/linux/netfilter_ipv4/ipt_CLASSIFY.h linux-2.4.32/include/linux/netfilter_ipv4/ipt_CLASSIFY.h
|
|
|
+--- linux-2.4.32.reference/include/linux/netfilter_ipv4/ipt_CLASSIFY.h 1970-01-01 01:00:00.000000000 +0100
|
|
|
++++ linux-2.4.32/include/linux/netfilter_ipv4/ipt_CLASSIFY.h 2006-08-17 12:33:08.000000000 +0200
|
|
|
+@@ -0,0 +1,8 @@
|
|
|
++#ifndef _IPT_CLASSIFY_H
|
|
|
++#define _IPT_CLASSIFY_H
|
|
|
++
|
|
|
++struct ipt_classify_target_info {
|
|
|
++ u_int32_t priority;
|
|
|
++};
|
|
|
++
|
|
|
++#endif /*_IPT_CLASSIFY_H */
|
|
|
+diff -uprN linux-2.4.32.reference/net/ipv4/netfilter/Config.in linux-2.4.32/net/ipv4/netfilter/Config.in
|
|
|
+--- linux-2.4.32.reference/net/ipv4/netfilter/Config.in 2006-08-17 12:28:16.000000000 +0200
|
|
|
++++ linux-2.4.32/net/ipv4/netfilter/Config.in 2006-08-17 12:33:08.000000000 +0200
|
|
|
+@@ -172,6 +172,7 @@ if [ "$CONFIG_IP_NF_IPTABLES" != "n" ];
|
|
|
+ dep_tristate ' DSCP target support' CONFIG_IP_NF_TARGET_DSCP $CONFIG_IP_NF_MANGLE
|
|
|
+
|
|
|
+ dep_tristate ' MARK target support' CONFIG_IP_NF_TARGET_MARK $CONFIG_IP_NF_MANGLE
|
|
|
++ dep_tristate ' CLASSIFY target support (EXPERIMENTAL)' CONFIG_IP_NF_TARGET_CLASSIFY $CONFIG_IP_NF_MANGLE
|
|
|
+ dep_tristate ' IMQ target support' CONFIG_IP_NF_TARGET_IMQ $CONFIG_IP_NF_MANGLE
|
|
|
+ fi
|
|
|
+ if [ "$CONFIG_IP_NF_CONNTRACK_MARK" != "n" ]; then
|
|
|
+diff -uprN linux-2.4.32.reference/net/ipv4/netfilter/ipt_CLASSIFY.c linux-2.4.32/net/ipv4/netfilter/ipt_CLASSIFY.c
|
|
|
+--- linux-2.4.32.reference/net/ipv4/netfilter/ipt_CLASSIFY.c 1970-01-01 01:00:00.000000000 +0100
|
|
|
++++ linux-2.4.32/net/ipv4/netfilter/ipt_CLASSIFY.c 2006-08-17 12:33:08.000000000 +0200
|
|
|
+@@ -0,0 +1,82 @@
|
|
|
++/*
|
|
|
++ * This is a module which is used for setting the skb->priority field
|
|
|
++ * of an skb for qdisc classification.
|
|
|
++ */
|
|
|
++
|
|
|
++#include <linux/module.h>
|
|
|
++#include <linux/skbuff.h>
|
|
|
++#include <linux/ip.h>
|
|
|
++#include <net/checksum.h>
|
|
|
++
|
|
|
++#include <linux/netfilter_ipv4/ip_tables.h>
|
|
|
++#include <linux/netfilter_ipv4/ipt_CLASSIFY.h>
|
|
|
++
|
|
|
++MODULE_AUTHOR("Patrick McHardy <[email protected]>");
|
|
|
++MODULE_LICENSE("GPL");
|
|
|
++MODULE_DESCRIPTION("iptables qdisc classification target module");
|
|
|
++
|
|
|
++static unsigned int
|
|
|
++target(struct sk_buff **pskb,
|
|
|
++ unsigned int hooknum,
|
|
|
++ const struct net_device *in,
|
|
|
++ const struct net_device *out,
|
|
|
++ const void *targinfo,
|
|
|
++ void *userinfo)
|
|
|
++{
|
|
|
++ const struct ipt_classify_target_info *clinfo = targinfo;
|
|
|
++
|
|
|
++ if((*pskb)->priority != clinfo->priority) {
|
|
|
++ (*pskb)->priority = clinfo->priority;
|
|
|
++ (*pskb)->nfcache |= NFC_ALTERED;
|
|
|
++ }
|
|
|
++
|
|
|
++ return IPT_CONTINUE;
|
|
|
++}
|
|
|
++
|
|
|
++static int
|
|
|
++checkentry(const char *tablename,
|
|
|
++ const struct ipt_entry *e,
|
|
|
++ void *targinfo,
|
|
|
++ unsigned int targinfosize,
|
|
|
++ unsigned int hook_mask)
|
|
|
++{
|
|
|
++ if (targinfosize != IPT_ALIGN(sizeof(struct ipt_classify_target_info))){
|
|
|
++ printk(KERN_ERR "CLASSIFY: invalid size (%u != %u).\n",
|
|
|
++ targinfosize,
|
|
|
++ IPT_ALIGN(sizeof(struct ipt_classify_target_info)));
|
|
|
++ return 0;
|
|
|
++ }
|
|
|
++
|
|
|
++ if (hook_mask & ~(1 << NF_IP_POST_ROUTING)) {
|
|
|
++ printk(KERN_ERR "CLASSIFY: only valid in POST_ROUTING.\n");
|
|
|
++ return 0;
|
|
|
++ }
|
|
|
++
|
|
|
++ if (strcmp(tablename, "mangle") != 0) {
|
|
|
++ printk(KERN_WARNING "CLASSIFY: can only be called from "
|
|
|
++ "\"mangle\" table, not \"%s\".\n",
|
|
|
++ tablename);
|
|
|
++ return 0;
|
|
|
++ }
|
|
|
++
|
|
|
++ return 1;
|
|
|
++}
|
|
|
++
|
|
|
++static struct ipt_target ipt_classify_reg
|
|
|
++= { { NULL, NULL }, "CLASSIFY", target, checkentry, NULL, THIS_MODULE };
|
|
|
++
|
|
|
++static int __init init(void)
|
|
|
++{
|
|
|
++ if (ipt_register_target(&ipt_classify_reg))
|
|
|
++ return -EINVAL;
|
|
|
++
|
|
|
++ return 0;
|
|
|
++}
|
|
|
++
|
|
|
++static void __exit fini(void)
|
|
|
++{
|
|
|
++ ipt_unregister_target(&ipt_classify_reg);
|
|
|
++}
|
|
|
++
|
|
|
++module_init(init);
|
|
|
++module_exit(fini);
|
|
|
+diff -uprN linux-2.4.32.reference/net/ipv4/netfilter/Makefile linux-2.4.32/net/ipv4/netfilter/Makefile
|
|
|
+--- linux-2.4.32.reference/net/ipv4/netfilter/Makefile 2006-08-17 12:28:16.000000000 +0200
|
|
|
++++ linux-2.4.32/net/ipv4/netfilter/Makefile 2006-08-17 12:33:08.000000000 +0200
|
|
|
+@@ -134,6 +134,7 @@ obj-$(CONFIG_IP_NF_MATCH_LAYER7) += ipt_
|
|
|
+
|
|
|
+ # targets
|
|
|
+ obj-$(CONFIG_IP_NF_TARGET_REJECT) += ipt_REJECT.o
|
|
|
++obj-$(CONFIG_IP_NF_TARGET_CLASSIFY) += ipt_CLASSIFY.o
|
|
|
+ obj-$(CONFIG_IP_NF_TARGET_MIRROR) += ipt_MIRROR.o
|
|
|
+ obj-$(CONFIG_IP_NF_TARGET_TOS) += ipt_TOS.o
|
|
|
+ obj-$(CONFIG_IP_NF_TARGET_ECN) += ipt_ECN.o
|