aboutsummaryrefslogtreecommitdiffstats
path: root/tools/remus
diff options
context:
space:
mode:
authorKeir Fraser <keir.fraser@citrix.com>2010-04-15 08:42:08 +0100
committerKeir Fraser <keir.fraser@citrix.com>2010-04-15 08:42:08 +0100
commit04b41ebf20215c854aec09efa024c4e25c36e70a (patch)
treeba60684dc391036439b20ac513886b3a7679082c /tools/remus
parenta96f66af6df4e266311f6895353ada79794cf1e3 (diff)
downloadxen-04b41ebf20215c854aec09efa024c4e25c36e70a.tar.gz
xen-04b41ebf20215c854aec09efa024c4e25c36e70a.tar.bz2
xen-04b41ebf20215c854aec09efa024c4e25c36e70a.zip
Remus: make ebt_imq and sch_queue compatible with pvops
Signed-off-by: Brendan Cully <brendan@cs.ubc.ca>
Diffstat (limited to 'tools/remus')
-rw-r--r--tools/remus/kmod/Makefile3
-rw-r--r--tools/remus/kmod/ebt_imq.c69
-rw-r--r--tools/remus/kmod/ebt_imq.h6
-rw-r--r--tools/remus/kmod/sch_queue.c48
4 files changed, 108 insertions, 18 deletions
diff --git a/tools/remus/kmod/Makefile b/tools/remus/kmod/Makefile
index 46f474aa3a..1b5cb2d83b 100644
--- a/tools/remus/kmod/Makefile
+++ b/tools/remus/kmod/Makefile
@@ -9,6 +9,9 @@ endif
ifeq ($(KERNELS),linux-2.6-xen0)
LINUX_VER=2.6.18-xen0
endif
+ifeq ($(KERNELS),linux-2.6-pvops)
+LINUX_VER=2.6-pvops
+endif
KERNELDIR ?= $(XEN_ROOT)/build-linux-$(LINUX_VER)_$(XEN_TARGET_ARCH)
diff --git a/tools/remus/kmod/ebt_imq.c b/tools/remus/kmod/ebt_imq.c
index 7f8847cb9b..0ba78dd5c1 100644
--- a/tools/remus/kmod/ebt_imq.c
+++ b/tools/remus/kmod/ebt_imq.c
@@ -1,9 +1,19 @@
+#include <linux/version.h>
+#if LINUX_VERSION_CODE == KERNEL_VERSION(2,6,18)
+# define OLDKERNEL
+#endif
+
#include <linux/module.h>
#include <linux/skbuff.h>
+#ifndef OLDKERNEL
+# include <linux/netfilter/x_tables.h>
+#endif
#include <linux/netfilter_bridge/ebtables.h>
#include <linux/netdevice.h>
#include "ebt_imq.h"
+#ifdef OLDKERNEL
+
static int ebt_target_imq(struct sk_buff **pskb, unsigned int hooknr,
const struct net_device *in, const struct net_device *out,
const void *data, unsigned int datalen)
@@ -21,25 +31,66 @@ static int ebt_target_imq_check(const char *tablename, unsigned int hookmask,
return 0;
}
-static struct ebt_target imq_target =
+static struct ebt_target ebt_imq_target =
{
- .name = "imq",
- .target = ebt_target_imq,
+ .name = EBT_IMQ_TARGET,
+ .target = ebt_target_imq,
.check = ebt_target_imq_check,
.me = THIS_MODULE,
};
-static int __init init(void)
+static int __init ebt_imq_init(void)
+{
+ return ebt_register_target(&ebt_imq_target);
+}
+
+static void __exit ebt_imq_fini(void)
+{
+ ebt_unregister_target(&ebt_imq_target);
+}
+
+#else /* OLDKERNEL */
+
+static unsigned int
+ebt_imq_tg(struct sk_buff *skb, const struct xt_target_param *par)
+{
+ const struct ebt_imq_info *info = par->targinfo;
+
+ if (!skb_make_writable(skb, 0))
+ return EBT_DROP;
+
+ skb->imq_flags = info->todev | IMQ_F_ENQUEUE;
+
+ return EBT_CONTINUE;
+}
+
+static bool ebt_imq_tg_check(const struct xt_tgchk_param *par)
+{
+ return true;
+}
+
+static struct xt_target ebt_imq_target __read_mostly = {
+ .name = EBT_IMQ_TARGET,
+ .revision = 0,
+ .family = NFPROTO_BRIDGE,
+ .target = ebt_imq_tg,
+ .checkentry = ebt_imq_tg_check,
+ .targetsize = XT_ALIGN(sizeof(struct ebt_imq_info)),
+ .me = THIS_MODULE,
+};
+
+static int __init ebt_imq_init(void)
{
- return ebt_register_target(&imq_target);
+ return xt_register_target(&ebt_imq_target);
}
-static void __exit fini(void)
+static void __init ebt_imq_fini(void)
{
- ebt_unregister_target(&imq_target);
+ xt_unregister_target(&ebt_imq_target);
}
+#endif /* OLDKERNEL */
-module_init(init);
-module_exit(fini);
+module_init(ebt_imq_init);
+module_exit(ebt_imq_fini);
MODULE_LICENSE("GPL");
diff --git a/tools/remus/kmod/ebt_imq.h b/tools/remus/kmod/ebt_imq.h
index 41627cfcb8..1c2d9ef03c 100644
--- a/tools/remus/kmod/ebt_imq.h
+++ b/tools/remus/kmod/ebt_imq.h
@@ -1,10 +1,14 @@
#ifndef __LINUX_BRIDGE_EBT_IMQ_H
#define __LINUX_BRIDGE_EBT_IMQ_H
-#define IMQ_F_ENQUEUE 0x80
+#ifdef OLDKERNEL
+# define IMQ_F_ENQUEUE 0x80
+#endif
struct ebt_imq_info
{
unsigned int todev;
};
+#define EBT_IMQ_TARGET "imq"
+
#endif
diff --git a/tools/remus/kmod/sch_queue.c b/tools/remus/kmod/sch_queue.c
index 92da4a75cd..bc73c75839 100644
--- a/tools/remus/kmod/sch_queue.c
+++ b/tools/remus/kmod/sch_queue.c
@@ -16,7 +16,14 @@
* So it supports two operations, barrier and release.
*/
-#include <linux/config.h>
+#include <linux/version.h>
+#if LINUX_VERSION_CODE == KERNEL_VERSION(2,6,18)
+# define OLDKERNEL
+#endif
+
+#ifdef OLDKERNEL
+# include <linux/config.h>
+#endif
#include <linux/module.h>
#include <linux/types.h>
#include <linux/kernel.h>
@@ -25,6 +32,17 @@
#include <linux/skbuff.h>
#include <net/pkt_sched.h>
+#ifdef OLDKERNEL
+# define compatnlattr rtattr
+# define compatnllen RTA_PAYLOAD
+# define compatnldata RTA_DATA
+#else
+# include <xen/features.h>
+# define compatnlattr nlattr
+# define compatnllen nla_len
+# define compatnldata nla_data
+#endif
+
/* xenbus directory */
#define FIFO_BUF (10*1024*1024)
@@ -43,6 +61,7 @@ struct tc_queue_qopt {
int action;
};
+#ifdef OLDKERNEL
/* borrowed from drivers/xen/netback/loopback.c */
#ifdef CONFIG_X86
static int is_foreign(unsigned long pfn)
@@ -88,6 +107,12 @@ static int skb_remove_foreign_references(struct sk_buff *skb)
return 1;
}
+#else /* OLDKERNEL */
+static int skb_remove_foreign_references(struct sk_buff *skb)
+{
+ return !skb_linearize(skb);
+}
+#endif /* OLDKERNEL */
static int queue_enqueue(struct sk_buff *skb, struct Qdisc* sch)
{
@@ -112,7 +137,7 @@ static int queue_enqueue(struct sk_buff *skb, struct Qdisc* sch)
/* dequeue doesn't actually dequeue until the release command is
* received. */
-static inline struct sk_buff *queue_dequeue(struct Qdisc* sch)
+static struct sk_buff *queue_dequeue(struct Qdisc* sch)
{
struct queue_sched_data *q = qdisc_priv(sch);
struct sk_buff* peek;
@@ -145,7 +170,7 @@ static inline struct sk_buff *queue_dequeue(struct Qdisc* sch)
return qdisc_dequeue_head(sch);
}
-static int queue_init(struct Qdisc *sch, struct rtattr *opt)
+static int queue_init(struct Qdisc *sch, struct compatnlattr *opt)
{
sch->flags |= TCQ_F_THROTTLED;
@@ -155,7 +180,7 @@ static int queue_init(struct Qdisc *sch, struct rtattr *opt)
/* receives two messages:
* 0: checkpoint queue (set stop to next packet)
* 1: dequeue until stop */
-static int queue_change(struct Qdisc* sch, struct rtattr* opt)
+static int queue_change(struct Qdisc* sch, struct compatnlattr* opt)
{
struct queue_sched_data *q = qdisc_priv(sch);
struct tc_queue_qopt* msg;
@@ -163,10 +188,10 @@ static int queue_change(struct Qdisc* sch, struct rtattr* opt)
struct timeval tv;
*/
- if (!opt || RTA_PAYLOAD(opt) < sizeof(*msg))
+ if (!opt || compatnllen(opt) < sizeof(*msg))
return -EINVAL;
- msg = RTA_DATA(opt);
+ msg = compatnldata(opt);
if (msg->action == TCQ_CHECKPOINT) {
/* reset stop */
@@ -174,7 +199,11 @@ static int queue_change(struct Qdisc* sch, struct rtattr* opt)
} else if (msg->action == TCQ_DEQUEUE) {
/* dequeue */
sch->flags &= ~TCQ_F_THROTTLED;
+#ifdef OLDKERNEL
netif_schedule(sch->dev);
+#else
+ netif_schedule_queue(sch->dev_queue);
+#endif
/*
do_gettimeofday(&tv);
printk("queue release at %lu.%06lu (%d bytes)\n", tv.tv_sec, tv.tv_usec,
@@ -192,8 +221,11 @@ struct Qdisc_ops queue_qdisc_ops = {
.priv_size = sizeof(struct queue_sched_data),
.enqueue = queue_enqueue,
.dequeue = queue_dequeue,
- .init = queue_init,
- .change = queue_change,
+#ifndef OLDKERNEL
+ .peek = qdisc_peek_head,
+#endif
+ .init = queue_init,
+ .change = queue_change,
.owner = THIS_MODULE,
};