mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 10:11:27 +01:00
Remus: make ebt_imq and sch_queue compatible with pvops
Signed-off-by: Brendan Cully <brendan@cs.ubc.ca>
This commit is contained in:
1 parent
a96f66af6d
commit
04b41ebf20
4 files changed
+108
-18
No files matched your search
@@ -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)
|
||||
|
||||
|
||||
@@ -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(&imq_target);
|
||||
return ebt_register_target(&ebt_imq_target);
|
||||
}
|
||||
|
||||
static void __exit fini(void)
|
||||
static void __exit ebt_imq_fini(void)
|
||||
{
|
||||
ebt_unregister_target(&imq_target);
|
||||
ebt_unregister_target(&ebt_imq_target);
|
||||
}
|
||||
|
||||
#else /* OLDKERNEL */
|
||||
|
||||
module_init(init);
|
||||
module_exit(fini);
|
||||
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 xt_register_target(&ebt_imq_target);
|
||||
}
|
||||
|
||||
static void __init ebt_imq_fini(void)
|
||||
{
|
||||
xt_unregister_target(&ebt_imq_target);
|
||||
}
|
||||
|
||||
#endif /* OLDKERNEL */
|
||||
|
||||
module_init(ebt_imq_init);
|
||||
module_exit(ebt_imq_fini);
|
||||
MODULE_LICENSE("GPL");
|
||||
@@ -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
|
||||
@@ -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,
|
||||
};
|
||||
|
||||
|
||||