WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-devel

[Xen-devel] [PATCH 1 of 2] Remus: make ebt_imq and sch_queue compatible

To: xen-devel@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-devel] [PATCH 1 of 2] Remus: make ebt_imq and sch_queue compatible with pvops
From: Brendan Cully <brendan@xxxxxxxxx>
Date: Wed, 14 Apr 2010 14:50:47 -0700
Cc: Jeremy Fitzhardinge <jeremy@xxxxxxxx>
Delivery-date: Wed, 14 Apr 2010 15:01:31 -0700
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
In-reply-to: <patchbomb.1271281846@xxxxxxxxxxxxxxxxx>
List-help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-id: Xen developer discussion <xen-devel.lists.xensource.com>
List-post: <mailto:xen-devel@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
References: <patchbomb.1271281846@xxxxxxxxxxxxxxxxx>
Sender: xen-devel-bounces@xxxxxxxxxxxxxxxxxxx
User-agent: Mercurial-patchbomb/1.5.1+67-217557b26bc7
# HG changeset patch
# User Brendan Cully <brendan@xxxxxxxxx>
# Date 1271123805 25200
# Node ID b0d4c221e926feff21bea0c2f3c852a692782586
# Parent  f28f1ee587c8d3fb8450e5aae9541d785e8914cc
Remus: make ebt_imq and sch_queue compatible with pvops

diff --git a/tools/remus/kmod/Makefile b/tools/remus/kmod/Makefile
--- a/tools/remus/kmod/Makefile
+++ b/tools/remus/kmod/Makefile
@@ -9,6 +9,9 @@
 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
--- 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 @@
   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");
diff --git a/tools/remus/kmod/ebt_imq.h b/tools/remus/kmod/ebt_imq.h
--- 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
--- 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 @@
   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 @@
 
   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 @@
 
 /* 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 @@
   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 @@
 /* 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 @@
   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 @@
   } 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 @@
   .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,
 };
 

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel