2
0
mirror of https://github.com/openvswitch/ovs synced 2025-08-22 01:51:26 +00:00

datapath: Support for Linux kernel 3.10

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>
This commit is contained in:
Pravin B Shelar 2013-08-02 11:38:51 -07:00
parent e1ec7dd460
commit 9b764edf06
11 changed files with 71 additions and 41 deletions

2
FAQ
View File

@ -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.

2
NEWS
View File

@ -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.

View 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;
}

View 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

View 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 \

View 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. */

View File

@ -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

View 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

View 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;

View 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)

View 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);