datapath: Support for Linux kernel 3.10
authorPravin B Shelar <pshelar@nicira.com>
Fri, 2 Aug 2013 18:38:51 +0000 (11:38 -0700)
committerPravin B Shelar <pshelar@nicira.com>
Sat, 10 Aug 2013 23:07:48 +0000 (16:07 -0700)
Changes are mostly related API changes in vlan, GRE
restructuring.

Signed-off-by: Pravin B Shelar <pshelar@nicira.com>
Acked-by: Kyle Mestery <kmestery@cisco.com>
Acked-by: Jesse Gross <jesse@nicira.com>
FAQ
NEWS
datapath/actions.c
datapath/datapath.c
datapath/linux/Modules.mk
datapath/linux/compat/include/linux/if_vlan.h
datapath/linux/compat/include/linux/netdev_features.h [new file with mode: 0644]
datapath/linux/compat/include/net/gre.h
datapath/vlan.h
datapath/vport-internal_dev.c
datapath/vport-netdev.c

diff --git a/FAQ b/FAQ
index 810803e..75d9007 100644 (file)
--- a/FAQ
+++ b/FAQ
@@ -148,7 +148,7 @@ A: The following table lists the Linux kernel versions against which the
        1.9.x      2.6.18 to 3.8
        1.10.x     2.6.18 to 3.8
        1.11.x     2.6.18 to 3.8
-       1.12.x     2.6.18 to 3.9
+       1.12.x     2.6.18 to 3.10
 
    Open vSwitch userspace should also work with the Linux kernel module
    built into Linux 3.3 and later.
diff --git a/NEWS b/NEWS
index f9953ab..3f802ad 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -19,7 +19,7 @@ v1.12.0 - xx xxx xxxx
       through database paths (e.g. Private key option with the database name
       should look like "--private-key=db:Open_vSwitch,SSL,private_key").
     - Added ovs-dev.py, a utility script helpful for Open vSwitch developers.
-    - Support for Linux kernels up to 3.9
+    - Support for Linux kernels up to 3.10
     - ovs-ofctl:
       * New "ofp-parse" for printing OpenFlow messages read from a file.
 
index 0a2def6..2c09d57 100644 (file)
@@ -100,7 +100,7 @@ static int pop_vlan(struct sk_buff *skb)
        if (unlikely(err))
                return err;
 
-       __vlan_hwaccel_put_tag(skb, ntohs(tci));
+       __vlan_hwaccel_put_tag(skb, htons(ETH_P_8021Q), ntohs(tci));
        return 0;
 }
 
@@ -112,7 +112,7 @@ static int push_vlan(struct sk_buff *skb, const struct ovs_action_push_vlan *vla
                /* push down current VLAN tag */
                current_tag = vlan_tx_tag_get(skb);
 
-               if (!__vlan_put_tag(skb, current_tag))
+               if (!__vlan_put_tag(skb, skb->vlan_proto, current_tag))
                        return -ENOMEM;
 
                if (get_ip_summed(skb) == OVS_CSUM_COMPLETE)
@@ -120,7 +120,7 @@ static int push_vlan(struct sk_buff *skb, const struct ovs_action_push_vlan *vla
                                        + (2 * ETH_ALEN), VLAN_HLEN, 0));
 
        }
-       __vlan_hwaccel_put_tag(skb, ntohs(vlan->vlan_tci) & ~VLAN_TAG_PRESENT);
+       __vlan_hwaccel_put_tag(skb, vlan->vlan_tpid, ntohs(vlan->vlan_tci) & ~VLAN_TAG_PRESENT);
        return 0;
 }
 
index 190b61b..6b7cbc1 100644 (file)
@@ -63,7 +63,7 @@
 #include "vport-netdev.h"
 
 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,18) || \
-    LINUX_VERSION_CODE >= KERNEL_VERSION(3,10,0)
+    LINUX_VERSION_CODE >= KERNEL_VERSION(3,11,0)
 #error Kernels before 2.6.18 or after 3.9 are not supported by this version of Open vSwitch.
 #endif
 
index edaeabb..5f9c792 100644 (file)
@@ -48,6 +48,7 @@ openvswitch_headers += \
        linux/compat/include/linux/mutex.h \
        linux/compat/include/linux/net.h \
        linux/compat/include/linux/netdevice.h \
+       linux/compat/include/linux/netdev_features.h \
        linux/compat/include/linux/netfilter_bridge.h \
        linux/compat/include/linux/netfilter_ipv4.h \
        linux/compat/include/linux/netlink.h \
index b8b1961..730175b 100644 (file)
@@ -5,6 +5,7 @@
 #include <linux/version.h>
 #include_next <linux/if_vlan.h>
 
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3,10,0)
 /*
  * The behavior of __vlan_put_tag() has changed over time:
  *
@@ -19,8 +20,9 @@
  * to avoid the need to guess whether the version in the kernel tree is
  * acceptable.
  */
-#define __vlan_put_tag rpl_vlan_put_tag
-static inline struct sk_buff *__vlan_put_tag(struct sk_buff *skb, u16 vlan_tci)
+#define __vlan_put_tag(skb, proto, tag)  rpl__vlan_put_tag(skb, tag)
+
+static inline struct sk_buff *rpl__vlan_put_tag(struct sk_buff *skb, u16 vlan_tci)
 {
        struct vlan_ethhdr *veth;
 
@@ -45,6 +47,16 @@ static inline struct sk_buff *__vlan_put_tag(struct sk_buff *skb, u16 vlan_tci)
        return skb;
 }
 
+static inline struct sk_buff *rpl___vlan_hwaccel_put_tag(struct sk_buff *skb,
+                                                    __be16 vlan_proto,
+                                                    u16 vlan_tci)
+{
+       return __vlan_hwaccel_put_tag(skb, vlan_tci);
+}
+
+#define __vlan_hwaccel_put_tag rpl___vlan_hwaccel_put_tag
+
+#endif
 
 /* All of these were introduced in a single commit preceding 2.6.33, so
  * presumably all of them or none of them are present. */
diff --git a/datapath/linux/compat/include/linux/netdev_features.h b/datapath/linux/compat/include/linux/netdev_features.h
new file mode 100644 (file)
index 0000000..0259413
--- /dev/null
@@ -0,0 +1,12 @@
+#ifndef __LINUX_NETDEV_FEATURES_WRAPPER_H
+#define __LINUX_NETDEV_FEATURES_WRAPPER_H
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,3,0)
+#include_next <linux/netdev_features.h>
+#endif
+
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3,10,0)
+#define NETIF_F_HW_VLAN_CTAG_TX NETIF_F_HW_VLAN_TX
+#endif
+
+#endif
index bd0c3d4..5f46aed 100644 (file)
@@ -21,41 +21,13 @@ int gre_del_protocol(const struct gre_protocol *proto, u8 version);
 
 #endif
 
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3,10,0)
 struct gre_base_hdr {
        __be16 flags;
        __be16 protocol;
 };
 #define GRE_HEADER_SECTION 4
 
-#define MAX_GRE_PROTO_PRIORITY 255
-struct gre_cisco_protocol {
-       int (*handler)(struct sk_buff *skb, const struct tnl_ptk_info *tpi);
-       u8 priority;
-};
-
-#define gre_build_header rpl_gre_build_header
-void gre_build_header(struct sk_buff *skb, const struct tnl_ptk_info *tpi,
-                     int hdr_len);
-
-#define gre_handle_offloads rpl_gre_handle_offloads
-struct sk_buff *gre_handle_offloads(struct sk_buff *skb, bool gre_csum);
-
-int gre_cisco_register(struct gre_cisco_protocol *proto);
-int gre_cisco_unregister(struct gre_cisco_protocol *proto);
-
-static inline int ip_gre_calc_hlen(__be16 o_flags)
-{
-       int addend = 4;
-
-       if (o_flags & TUNNEL_CSUM)
-               addend += 4;
-       if (o_flags & TUNNEL_KEY)
-               addend += 4;
-       if (o_flags & TUNNEL_SEQ)
-               addend += 4;
-       return addend;
-}
-
 static inline __be16 gre_flags_to_tnl_flags(__be16 flags)
 {
        __be16 tflags = 0;
@@ -99,4 +71,36 @@ static inline __be16 tnl_flags_to_gre_flags(__be16 tflags)
 
        return flags;
 }
+#endif /* LINUX_VERSION_CODE < KERNEL_VERSION(3,10,0) */
+
+#define MAX_GRE_PROTO_PRIORITY 255
+struct gre_cisco_protocol {
+       int (*handler)(struct sk_buff *skb, const struct tnl_ptk_info *tpi);
+       u8 priority;
+};
+
+int gre_cisco_register(struct gre_cisco_protocol *proto);
+int gre_cisco_unregister(struct gre_cisco_protocol *proto);
+
+#define gre_build_header rpl_gre_build_header
+void gre_build_header(struct sk_buff *skb, const struct tnl_ptk_info *tpi,
+                     int hdr_len);
+
+#define gre_handle_offloads rpl_gre_handle_offloads
+struct sk_buff *gre_handle_offloads(struct sk_buff *skb, bool gre_csum);
+
+static inline int ip_gre_calc_hlen(__be16 o_flags)
+{
+       int addend = 4;
+
+       if (o_flags & TUNNEL_CSUM)
+               addend += 4;
+       if (o_flags & TUNNEL_KEY)
+               addend += 4;
+       if (o_flags & TUNNEL_SEQ)
+               addend += 4;
+       return addend;
+}
+
+
 #endif
index 46d0db3..aee5551 100644 (file)
@@ -89,7 +89,7 @@ static inline int vlan_deaccel_tag(struct sk_buff *skb)
        if (!vlan_tx_tag_present(skb))
                return 0;
 
-       skb = __vlan_put_tag(skb, vlan_tx_tag_get(skb));
+       skb = __vlan_put_tag(skb, skb->vlan_proto, vlan_tx_tag_get(skb));
        if (unlikely(!skb))
                return -ENOMEM;
 
index 9ee1c42..db55ee0 100644 (file)
@@ -22,6 +22,7 @@
 #include <linux/netdevice.h>
 #include <linux/etherdevice.h>
 #include <linux/ethtool.h>
+#include <linux/netdev_features.h>
 #include <linux/skbuff.h>
 #include <linux/version.h>
 
@@ -188,7 +189,7 @@ static void do_setup(struct net_device *netdev)
 
 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27)
        netdev->vlan_features = netdev->features;
-       netdev->features |= NETIF_F_HW_VLAN_TX;
+       netdev->features |= NETIF_F_HW_VLAN_CTAG_TX;
 #endif
 
 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,39)
index 4bc1617..50373b1 100644 (file)
@@ -340,7 +340,7 @@ static int netdev_send(struct vport *vport, struct sk_buff *skb)
                                nskb = skb->next;
                                skb->next = NULL;
 
-                               skb = __vlan_put_tag(skb, vlan_tx_tag_get(skb));
+                               skb = __vlan_put_tag(skb, skb->vlan_proto, vlan_tx_tag_get(skb));
                                if (likely(skb)) {
                                        len += skb->len;
                                        vlan_set_tci(skb, 0);
@@ -354,7 +354,7 @@ static int netdev_send(struct vport *vport, struct sk_buff *skb)
                }
 
 tag:
-               skb = __vlan_put_tag(skb, vlan_tx_tag_get(skb));
+               skb = __vlan_put_tag(skb, skb->vlan_proto, vlan_tx_tag_get(skb));
                if (unlikely(!skb))
                        return 0;
                vlan_set_tci(skb, 0);