packages: kernel/kernel-imq.config, kernel/kernel-imq.patch, kernel/kernel....

mguevara mguevara at pld-linux.org
Tue Aug 4 18:12:43 CEST 2009


Author: mguevara                     Date: Tue Aug  4 16:12:43 2009 GMT
Module: packages                      Tag: HEAD
---- Log message:
- up to 2.6.30.4-0.2; updated imq patches and enabled imq bcond; cleanup

---- Files affected:
packages/kernel:
   kernel-imq.config (1.2 -> 1.3) , kernel-imq.patch (1.2 -> 1.3) , kernel.spec (1.688 -> 1.689) 

---- Diffs:

================================================================
Index: packages/kernel/kernel-imq.config
diff -u packages/kernel/kernel-imq.config:1.2 packages/kernel/kernel-imq.config:1.3
--- packages/kernel/kernel-imq.config:1.2	Tue Mar 31 14:04:24 2009
+++ packages/kernel/kernel-imq.config	Tue Aug  4 18:12:36 2009
@@ -1,9 +1,7 @@
-CONFIG_IP_NF_TARGET_IMQ=m
-CONFIG_IP6_NF_TARGET_IMQ=m
+CONFIG_NETFILTER_XT_TARGET_IMQ=m
 CONFIG_IMQ=m
 # CONFIG_IMQ_BEHAVIOR_AA is not set
 CONFIG_IMQ_BEHAVIOR_AB=y
 # CONFIG_IMQ_BEHAVIOR_BA is not set
 # CONFIG_IMQ_BEHAVIOR_BB is not set
 CONFIG_IMQ_NUM_DEVS=2
-

================================================================
Index: packages/kernel/kernel-imq.patch
diff -u packages/kernel/kernel-imq.patch:1.2 packages/kernel/kernel-imq.patch:1.3
--- packages/kernel/kernel-imq.patch:1.2	Tue Mar 31 14:04:24 2009
+++ packages/kernel/kernel-imq.patch	Tue Aug  4 18:12:36 2009
@@ -1,6 +1,7 @@
---- linux-2.6.25.7/drivers/net/imq.c	1970-01-01 02:00:00.000000000 +0200
-+++ linux-2.6.25.7.imq/drivers/net/imq.c	2008-06-17 15:03:01.000000000 +0300
-@@ -0,0 +1,474 @@
+diff -uNr --exclude='*~' linux-2.6.29.1/drivers/net/imq.c linux-2.6.29.1-imq/drivers/net/imq.c
+--- linux-2.6.29.1/drivers/net/imq.c	1970-01-01 02:00:00.000000000 +0200
++++ linux-2.6.29.1-imq/drivers/net/imq.c	2009-04-20 23:22:18.935017702 +0300
+@@ -0,0 +1,571 @@
 +/*
 + *             Pseudo-driver for the intermediate queue device.
 + *
@@ -51,10 +52,28 @@
 + *
 + *
 + *             2008/06/17 - 2.6.25 - Changed imq.c to use qdisc_run() instead 
-+ *	       of qdisc_restart() and moved qdisc_run() to tasklet to avoid
++ *             of qdisc_restart() and moved qdisc_run() to tasklet to avoid
 + *             recursive locking. New initialization routines to fix 'rmmod' not
 + *             working anymore. Used code from ifb.c. (Jussi Kivilinna)
-+ *	       
++ *
++ *             2008/08/06 - 2.6.26 - (JK)
++ *              - Replaced tasklet with 'netif_schedule()'.
++ *              - Cleaned up and added comments for imq_nf_queue().
++ *
++ *             2009/04/12
++ *              - Add skb_save_cb/skb_restore_cb helper functions for backuping
++ *                control buffer. This is needed because qdisc-layer on kernels
++ *                2.6.27 and newer overwrite control buffer. (Jussi Kivilinna)
++ *              - Add better locking for IMQ device. Hopefully this will solve
++ *                SMP issues. (Jussi Kivilinna)
++ *              - Port to 2.6.27
++ *              - Port to 2.6.28
++ *              - Port to 2.6.29 + fix rmmod not working
++ *
++ *             2009/04/20 - (Jussi Kivilinna)
++ *              - Use netdevice feature flags to avoid extra packet handling
++ *                by core networking layer and possibly increase performance.
++ *
 + *	       Also, many thanks to pablo Sebastian Greco for making the initial
 + *	       patch and to those who helped the testing.
 + *
@@ -64,8 +83,10 @@
 +#include <linux/module.h>
 +#include <linux/kernel.h>
 +#include <linux/moduleparam.h>
++#include <linux/list.h>
 +#include <linux/skbuff.h>
 +#include <linux/netdevice.h>
++#include <linux/etherdevice.h>
 +#include <linux/rtnetlink.h>
 +#include <linux/if_arp.h>
 +#include <linux/netfilter.h>
@@ -77,11 +98,6 @@
 +#include <net/pkt_sched.h>
 +#include <net/netfilter/nf_queue.h>
 +
-+struct imq_private {
-+	struct tasklet_struct tasklet;
-+	int tasklet_pending;
-+};
-+
 +static nf_hookfn imq_nf_hook;
 +
 +static struct nf_hook_ops imq_ingress_ipv4 = {
@@ -140,8 +156,11 @@
 +static unsigned int numdevs = IMQ_MAX_DEVS;
 +#endif
 +
++static DEFINE_SPINLOCK(imq_nf_queue_lock);
++
 +static struct net_device *imq_devs_cache[IMQ_MAX_DEVS];
 +
++
 +static struct net_device_stats *imq_get_stats(struct net_device *dev)
 +{
 +	return &dev->stats;
@@ -153,12 +172,35 @@
 +	struct nf_queue_entry *entry = skb->nf_queue_entry;
 +
 +	if (entry) {
-+		if (entry->indev)
-+			dev_put(entry->indev);
-+		if (entry->outdev)
-+			dev_put(entry->outdev);
++		nf_queue_entry_release_refs(entry);
 +		kfree(entry);
 +	}
++
++	skb_restore_cb(skb); /* kfree backup */
++}
++
++static void imq_nf_reinject(struct nf_queue_entry *entry, unsigned int verdict)
++{
++	int status;
++
++	if (!entry->next_outfn) {
++		spin_lock_bh(&imq_nf_queue_lock);
++		nf_reinject(entry, verdict);
++		spin_unlock_bh(&imq_nf_queue_lock);
++		return;
++	}
++
++	rcu_read_lock();
++	local_bh_disable();
++	status = entry->next_outfn(entry, entry->next_queuenum);
++	local_bh_enable();
++	if (status < 0) {
++		nf_queue_entry_release_refs(entry);
++		kfree_skb(entry->skb);
++		kfree(entry);
++	}
++
++	rcu_read_unlock();
 +}
 +
 +static int imq_dev_xmit(struct sk_buff *skb, struct net_device *dev)
@@ -169,26 +211,35 @@
 +	skb->imq_flags = 0;
 +	skb->destructor = NULL;
 +
++	skb_restore_cb(skb); /* restore skb->cb */
++
 +	dev->trans_start = jiffies;
-+	nf_reinject(skb->nf_queue_entry, NF_ACCEPT);
++	imq_nf_reinject(skb->nf_queue_entry, NF_ACCEPT);
 +	return 0;
 +}
 +
 +static int imq_nf_queue(struct nf_queue_entry *entry, unsigned queue_num)
 +{
 +	struct net_device *dev;
-+	struct imq_private *priv;
-+	struct sk_buff *skb2 = NULL;
++	struct sk_buff *skb_orig, *skb, *skb_shared;
 +	struct Qdisc *q;
-+	unsigned int index = entry->skb->imq_flags & IMQ_F_IFMASK;
-+	int ret = -1;
-+
-+	if (index > numdevs)
-+		return -1;
++	struct netdev_queue *txq;
++	int users, index;
++	int retval = -EINVAL;
++
++	index = entry->skb->imq_flags & IMQ_F_IFMASK;
++	if (unlikely(index > numdevs - 1)) {
++		if (net_ratelimit())
++			printk(KERN_WARNING
++			       "IMQ: invalid device specified, highest is %u\n",
++			       numdevs - 1);
++		retval = -EINVAL;
++		goto out;
++	}
 +
 +	/* check for imq device by index from cache */
 +	dev = imq_devs_cache[index];
-+	if (!dev) {
++	if (unlikely(!dev)) {
 +		char buf[8];
 +
 +		/* get device by name and cache result */
@@ -197,49 +248,90 @@
 +		if (!dev) {
 +			/* not found ?!*/
 +			BUG();
-+			return -1;
++			retval = -ENODEV;
++			goto out;
 +		}
 +
 +		imq_devs_cache[index] = dev;
++		dev_put(dev);
 +	}
 +
-+	priv = netdev_priv(dev);
-+	if (!(dev->flags & IFF_UP)) {
++	if (unlikely(!(dev->flags & IFF_UP))) {
 +		entry->skb->imq_flags = 0;
-+		nf_reinject(entry, NF_ACCEPT);
-+		return 0;
++		imq_nf_reinject(entry, NF_ACCEPT);
++		retval = 0;
++		goto out;
 +	}
 +	dev->last_rx = jiffies;
 +
-+	if (entry->skb->destructor) {
-+		skb2 = entry->skb;
-+		entry->skb = skb_clone(entry->skb, GFP_ATOMIC);
-+		if (!entry->skb)
-+			return -1;
++	skb = entry->skb;
++	skb_orig = NULL;
++
++	/* skb has owner? => make clone */
++	if (unlikely(skb->destructor)) {
++		skb_orig = skb;
++		skb = skb_clone(skb, GFP_ATOMIC);
++		if (!skb) {
++			retval = -ENOMEM;
++			goto out;
++		}
++		entry->skb = skb;
 +	}
-+	entry->skb->nf_queue_entry = entry;
 +
-+	dev->stats.rx_bytes += entry->skb->len;
++	skb->nf_queue_entry = entry;
++
++	dev->stats.rx_bytes += skb->len;
 +	dev->stats.rx_packets++;
 +
-+	spin_lock_bh(&dev->queue_lock);
-+	q = dev->qdisc;
-+	if (q->enqueue) {
-+		q->enqueue(skb_get(entry->skb), q);
-+		if (skb_shared(entry->skb)) {
-+			entry->skb->destructor = imq_skb_destructor;
-+			kfree_skb(entry->skb);
-+			ret = 0;
-+		}
-+	}
-+	if (!test_and_set_bit(1, &priv->tasklet_pending))
-+		tasklet_schedule(&priv->tasklet);
-+	spin_unlock_bh(&dev->queue_lock);
++	txq = dev_pick_tx(dev, skb);
 +
-+	if (skb2)
-+		kfree_skb(ret ? entry->skb : skb2);
++	q = rcu_dereference(txq->qdisc);
++	if (unlikely(!q->enqueue))
++		goto packet_not_eaten_by_imq_dev;
 +
-+	return ret;
++	spin_lock_bh(qdisc_lock(q));
++
++	users = atomic_read(&skb->users);
++
++	skb_shared = skb_get(skb); /* increase reference count by one */
++	skb_save_cb(skb_shared); /* backup skb->cb, as qdisc layer will
++					overwrite it */
++	qdisc_enqueue_root(skb_shared, q); /* might kfree_skb */
++
++	if (likely(atomic_read(&skb_shared->users) == users + 1)) {
++		kfree_skb(skb_shared); /* decrease reference count by one */
++
++		skb->destructor = &imq_skb_destructor;
++
++		/* cloned? */
++		if (skb_orig)
++			kfree_skb(skb_orig); /* free original */
++
++		spin_unlock_bh(qdisc_lock(q));
++
++		/* schedule qdisc dequeue */
++		__netif_schedule(q);
++
++		retval = 0;
++		goto out;
++	} else {
++		skb_restore_cb(skb_shared); /* restore skb->cb */
++		/* qdisc dropped packet and decreased skb reference count of
++		 * skb, so we don't really want to and try refree as that would
++		 * actually destroy the skb. */
++		spin_unlock_bh(qdisc_lock(q));
++		goto packet_not_eaten_by_imq_dev;
++	}
++
++packet_not_eaten_by_imq_dev:
++	/* cloned? restore original */
++	if (skb_orig) {
++		kfree_skb(skb);
++		entry->skb = skb_orig;
++	}
++	retval = -1;
++out:
++	return retval;
 +}
 +
 +static struct nf_queue_handler nfqh = {
@@ -247,17 +339,6 @@
 +	.outfn = imq_nf_queue,
 +};
 +
-+static void qdisc_run_tasklet(unsigned long arg)
-+{
-+	struct net_device *dev = (struct net_device *)arg;
-+	struct imq_private *priv = netdev_priv(dev);
-+
-+	spin_lock(&dev->queue_lock);
-+	qdisc_run(dev);
-+	clear_bit(1, &priv->tasklet_pending);
-+	spin_unlock(&dev->queue_lock);
-+}
-+
 +static unsigned int imq_nf_hook(unsigned int hook, struct sk_buff *pskb,
 +				const struct net_device *indev,
 +				const struct net_device *outdev,
@@ -271,87 +352,98 @@
 +
 +static int imq_close(struct net_device *dev)
 +{
-+	struct imq_private *priv = netdev_priv(dev);
-+
-+	tasklet_kill(&priv->tasklet);
 +	netif_stop_queue(dev);
-+
 +	return 0;
 +}
 +
 +static int imq_open(struct net_device *dev)
 +{
-+	struct imq_private *priv = netdev_priv(dev);
-+
-+	tasklet_init(&priv->tasklet, qdisc_run_tasklet, (unsigned long)dev);
 +	netif_start_queue(dev);
-+
 +	return 0;
 +}
 +
++static const struct net_device_ops imq_netdev_ops = {
++	.ndo_open		= imq_open,
++	.ndo_stop		= imq_close,
++	.ndo_start_xmit		= imq_dev_xmit,
++	.ndo_get_stats		= imq_get_stats,
++};
++
 +static void imq_setup(struct net_device *dev)
 +{
-+	dev->hard_start_xmit    = imq_dev_xmit;
-+	dev->open		= imq_open;
-+	dev->get_stats		= imq_get_stats;
-+	dev->stop		= imq_close;
++	dev->netdev_ops		= &imq_netdev_ops;
 +	dev->type               = ARPHRD_VOID;
 +	dev->mtu                = 16000;
 +	dev->tx_queue_len       = 11000;
 +	dev->flags              = IFF_NOARP;
++	dev->features           = NETIF_F_SG | NETIF_F_FRAGLIST |
++				  NETIF_F_GSO | NETIF_F_HW_CSUM |
++				  NETIF_F_HIGHDMA;
++}
++
++static int imq_validate(struct nlattr *tb[], struct nlattr *data[])
++{
++	int ret = 0;
++
++	if (tb[IFLA_ADDRESS]) {
++		if (nla_len(tb[IFLA_ADDRESS]) != ETH_ALEN) {
++			ret = -EINVAL;
++			goto end;
++		}
++		if (!is_valid_ether_addr(nla_data(tb[IFLA_ADDRESS]))) {
++			ret = -EADDRNOTAVAIL;
++			goto end;
++		}
++	}
++	return 0;
++end:
++	printk(KERN_WARNING "IMQ: imq_validate failed (%d)\n", ret);
++	return ret;
 +}
 +
 +static struct rtnl_link_ops imq_link_ops __read_mostly = {
 +	.kind		= "imq",
-+	.priv_size	= sizeof(struct imq_private),
++	.priv_size	= 0,
 +	.setup		= imq_setup,
++	.validate	= imq_validate,
 +};
 +
 +static int __init imq_init_hooks(void)
 +{
 +	int err;
 +
-+	err = nf_register_queue_handler(PF_INET, &nfqh);
-+	if (err)
-+		goto err1;
++	nf_register_queue_imq_handler(&nfqh);
 +
 +	err = nf_register_hook(&imq_ingress_ipv4);
 +	if (err)
-+		goto err2;
++		goto err1;
 +
 +	err = nf_register_hook(&imq_egress_ipv4);
 +	if (err)
-+		goto err3;
++		goto err2;
 +
 +#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
-+	err = nf_register_queue_handler(PF_INET6, &nfqh);
-+	if (err)
-+		goto err4;
-+
 +	err = nf_register_hook(&imq_ingress_ipv6);
 +	if (err)
-+		goto err5;
++		goto err3;
 +
 +	err = nf_register_hook(&imq_egress_ipv6);
 +	if (err)
-+		goto err6;
++		goto err4;
 +#endif
 +
 +	return 0;
 +
 +#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
-+err6:
-+	nf_unregister_hook(&imq_ingress_ipv6);
-+err5:
-+	nf_unregister_queue_handler(PF_INET6, &nfqh);
 +err4:
++	nf_unregister_hook(&imq_ingress_ipv6);
++err3:
 +	nf_unregister_hook(&imq_egress_ipv4);
 +#endif
-+err3:
-+	nf_unregister_hook(&imq_ingress_ipv4);
 +err2:
-+	nf_unregister_queue_handler(PF_INET, &nfqh);
++	nf_unregister_hook(&imq_ingress_ipv4);
 +err1:
++	nf_unregister_queue_imq_handler();
 +	return err;
 +}
 +
@@ -360,7 +452,7 @@
 +	struct net_device *dev;
 +	int ret;
 +
-+	dev = alloc_netdev(sizeof(struct imq_private), "imq%d", imq_setup);
++	dev = alloc_netdev(0, "imq%d", imq_setup);
 +	if (!dev)
 +		return -ENOMEM;
 +
@@ -383,7 +475,7 @@
 +{
 +	int err, i;
 +
-+	if (!numdevs || numdevs > IMQ_MAX_DEVS) {
++	if (numdevs < 1 || numdevs > IMQ_MAX_DEVS) {
 +		printk(KERN_ERR "IMQ: numdevs has to be betweed 1 and %u\n",
 +		       IMQ_MAX_DEVS);
 +		return -EINVAL;
@@ -408,6 +500,12 @@
 +{
 +	int err;
 +
++#if defined(CONFIG_IMQ_NUM_DEVS)
++	BUILD_BUG_ON(CONFIG_IMQ_NUM_DEVS > 16);
++	BUILD_BUG_ON(CONFIG_IMQ_NUM_DEVS < 2);
++	BUILD_BUG_ON(CONFIG_IMQ_NUM_DEVS - 1 > IMQ_F_IFMASK);
++#endif
++
 +	err = imq_init_devs();
 +	if (err) {
 +		printk(KERN_ERR "IMQ: Error trying imq_init_devs(net)\n");
@@ -443,11 +541,11 @@
 +#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
 +	nf_unregister_hook(&imq_ingress_ipv6);
 +	nf_unregister_hook(&imq_egress_ipv6);
-+	nf_unregister_queue_handler(PF_INET6, &nfqh);
 +#endif
 +	nf_unregister_hook(&imq_ingress_ipv4);
 +	nf_unregister_hook(&imq_egress_ipv4);
-+	nf_unregister_queue_handler(PF_INET, &nfqh);
++
++	nf_unregister_queue_imq_handler();
 +}
 +
 +static void __exit imq_cleanup_devs(void)
@@ -475,9 +573,10 @@
 +MODULE_LICENSE("GPL");
 +MODULE_ALIAS_RTNL_LINK("imq");
 +
---- linux-2.6.25.7/drivers/net/Kconfig	2008-06-16 23:24:36.000000000 +0300
-+++ linux-2.6.25.7.imq/drivers/net/Kconfig	2008-06-17 15:03:21.000000000 +0300
-@@ -117,6 +117,129 @@
+diff -uNr --exclude='*~' linux-2.6.29.1/drivers/net/Kconfig linux-2.6.29.1-imq/drivers/net/Kconfig
+--- linux-2.6.29.1/drivers/net/Kconfig	2009-04-02 23:55:27.000000000 +0300
++++ linux-2.6.29.1-imq/drivers/net/Kconfig	2009-04-12 22:28:22.372333533 +0300
+@@ -110,6 +110,129 @@
  	  To compile this driver as a module, choose M here: the module
  	  will be called eql.  If unsure, say N.
  
@@ -607,9 +706,10 @@
  config TUN
  	tristate "Universal TUN/TAP device driver support"
  	select CRC32
---- linux-2.6.25.7/drivers/net/Makefile	2008-06-16 23:24:36.000000000 +0300
-+++ linux-2.6.25.7.imq/drivers/net/Makefile	2008-06-17 14:56:58.000000000 +0300
-@@ -143,6 +143,7 @@
+diff -uNr --exclude='*~' linux-2.6.29.1/drivers/net/Makefile linux-2.6.29.1-imq/drivers/net/Makefile
+--- linux-2.6.29.1/drivers/net/Makefile	2009-04-02 23:55:27.000000000 +0300
++++ linux-2.6.29.1-imq/drivers/net/Makefile	2009-04-12 22:28:22.372333533 +0300
+@@ -150,6 +150,7 @@
  obj-$(CONFIG_XEN_NETDEV_FRONTEND) += xen-netfront.o
  
  obj-$(CONFIG_DUMMY) += dummy.o
@@ -617,54 +717,132 @@
  obj-$(CONFIG_IFB) += ifb.o
  obj-$(CONFIG_MACVLAN) += macvlan.o
  obj-$(CONFIG_DE600) += de600.o
---- linux-2.6.25.7/include/linux/imq.h	1970-01-01 02:00:00.000000000 +0200
-+++ linux-2.6.25.7.imq/include/linux/imq.h	2008-06-17 14:56:58.000000000 +0300
-@@ -0,0 +1,9 @@
+diff -uNr --exclude='*~' linux-2.6.29.1/include/linux/imq.h linux-2.6.29.1-imq/include/linux/imq.h
+--- linux-2.6.29.1/include/linux/imq.h	1970-01-01 02:00:00.000000000 +0200
++++ linux-2.6.29.1-imq/include/linux/imq.h	2009-04-12 22:28:22.372333533 +0300
+@@ -0,0 +1,13 @@
 +#ifndef _IMQ_H
 +#define _IMQ_H
 +
-+#define IMQ_MAX_DEVS   16
++/* IFMASK (16 device indexes, 0 to 15) and flag(s) fit in 5 bits */
++#define IMQ_F_BITS	5
 +
-+#define IMQ_F_IFMASK   0x7f
-+#define IMQ_F_ENQUEUE  0x80
++#define IMQ_F_IFMASK	0x0f
++#define IMQ_F_ENQUEUE	0x10
++
++#define IMQ_MAX_DEVS	(IMQ_F_IFMASK + 1)
 +
 +#endif /* _IMQ_H */
---- linux-2.6.25.7/include/linux/netfilter_ipv4/ipt_IMQ.h	1970-01-01 02:00:00.000000000 +0200
-+++ linux-2.6.25.7.imq/include/linux/netfilter_ipv4/ipt_IMQ.h	2008-06-17 14:56:58.000000000 +0300
-@@ -0,0 +1,8 @@
-+#ifndef _IPT_IMQ_H
-+#define _IPT_IMQ_H
 +
-+struct ipt_imq_info {
+diff -uNr --exclude='*~' linux-2.6.29.1/include/linux/netdevice.h linux-2.6.29.1-imq/include/linux/netdevice.h
+--- linux-2.6.29.1/include/linux/netdevice.h	2009-04-02 23:55:27.000000000 +0300
++++ linux-2.6.29.1-imq/include/linux/netdevice.h	2009-04-12 22:28:22.373333509 +0300
+@@ -1071,6 +1071,7 @@
+ extern int		dev_open(struct net_device *dev);
+ extern int		dev_close(struct net_device *dev);
+ extern void		dev_disable_lro(struct net_device *dev);
++extern struct netdev_queue *dev_pick_tx(struct net_device *dev, struct sk_buff *skb);
+ extern int		dev_queue_xmit(struct sk_buff *skb);
+ extern int		register_netdevice(struct net_device *dev);
+ extern void		unregister_netdevice(struct net_device *dev);
+diff -uNr --exclude='*~' linux-2.6.29.1/include/linux/netfilter/xt_IMQ.h linux-2.6.29.1-imq/include/linux/netfilter/xt_IMQ.h
+--- linux-2.6.29.1/include/linux/netfilter/xt_IMQ.h	1970-01-01 02:00:00.000000000 +0200
++++ linux-2.6.29.1-imq/include/linux/netfilter/xt_IMQ.h	2009-04-12 22:28:22.373333509 +0300
+@@ -0,0 +1,9 @@
++#ifndef _XT_IMQ_H
++#define _XT_IMQ_H
++
++struct xt_imq_info {
 +	unsigned int todev;     /* target imq device */
 +};
 +
++#endif /* _XT_IMQ_H */
++
+diff -uNr --exclude='*~' linux-2.6.29.1/include/linux/netfilter_ipv4/ipt_IMQ.h linux-2.6.29.1-imq/include/linux/netfilter_ipv4/ipt_IMQ.h
+--- linux-2.6.29.1/include/linux/netfilter_ipv4/ipt_IMQ.h	1970-01-01 02:00:00.000000000 +0200
++++ linux-2.6.29.1-imq/include/linux/netfilter_ipv4/ipt_IMQ.h	2009-04-12 22:28:22.373333509 +0300
+@@ -0,0 +1,10 @@
++#ifndef _IPT_IMQ_H
++#define _IPT_IMQ_H
++
++/* Backwards compatibility for old userspace */
++#include <linux/netfilter/xt_IMQ.h>
++
++#define ipt_imq_info xt_imq_info
++
 +#endif /* _IPT_IMQ_H */
---- linux-2.6.25.7/include/linux/netfilter_ipv6/ip6t_IMQ.h	1970-01-01 02:00:00.000000000 +0200
-+++ linux-2.6.25.7.imq/include/linux/netfilter_ipv6/ip6t_IMQ.h	2008-06-17 14:56:58.000000000 +0300
-@@ -0,0 +1,8 @@
++
<<Diff was trimmed, longer than 597 lines>>

---- CVS-web:
    http://cvs.pld-linux.org/cgi-bin/cvsweb.cgi/packages/kernel/kernel-imq.config?r1=1.2&r2=1.3&f=u
    http://cvs.pld-linux.org/cgi-bin/cvsweb.cgi/packages/kernel/kernel-imq.patch?r1=1.2&r2=1.3&f=u
    http://cvs.pld-linux.org/cgi-bin/cvsweb.cgi/packages/kernel/kernel.spec?r1=1.688&r2=1.689&f=u



More information about the pld-cvs-commit mailing list