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:
parent
e1ec7dd460
commit
9b764edf06
2
FAQ
2
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.
|
||||
|
2
NEWS
2
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.
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
|
||||
|
@ -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 \
|
||||
|
@ -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. */
|
||||
|
12
datapath/linux/compat/include/linux/netdev_features.h
Normal file
12
datapath/linux/compat/include/linux/netdev_features.h
Normal 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
|
@ -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
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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)
|
||||
|
@ -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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user