diff options
author | Pravin B Shelar <pshelar@nicira.com> | 2013-08-02 11:38:51 -0700 |
---|---|---|
committer | Pravin B Shelar <pshelar@nicira.com> | 2013-08-10 16:07:48 -0700 |
commit | 9b764edf063160f3428b85cc0a1bb52bd3f51061 (patch) | |
tree | 6374d7eb0cda261ed00c40db0ec9c2fa1a2f62c9 /datapath | |
parent | e1ec7dd4608876283038c417065c4f9978255fa3 (diff) | |
download | openvswitch-9b764edf063160f3428b85cc0a1bb52bd3f51061.tar.gz |
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>
Diffstat (limited to 'datapath')
-rw-r--r-- | datapath/actions.c | 6 | ||||
-rw-r--r-- | datapath/datapath.c | 2 | ||||
-rw-r--r-- | datapath/linux/Modules.mk | 1 | ||||
-rw-r--r-- | datapath/linux/compat/include/linux/if_vlan.h | 16 | ||||
-rw-r--r-- | datapath/linux/compat/include/linux/netdev_features.h | 12 | ||||
-rw-r--r-- | datapath/linux/compat/include/net/gre.h | 62 | ||||
-rw-r--r-- | datapath/vlan.h | 2 | ||||
-rw-r--r-- | datapath/vport-internal_dev.c | 3 | ||||
-rw-r--r-- | datapath/vport-netdev.c | 4 |
9 files changed, 69 insertions, 39 deletions
diff --git a/datapath/actions.c b/datapath/actions.c index 0a2def677..2c09d57a8 100644 --- a/datapath/actions.c +++ b/datapath/actions.c @@ -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; } diff --git a/datapath/datapath.c b/datapath/datapath.c index 190b61b9e..6b7cbc1cb 100644 --- a/datapath/datapath.c +++ b/datapath/datapath.c @@ -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 diff --git a/datapath/linux/Modules.mk b/datapath/linux/Modules.mk index edaeabbd9..5f9c79239 100644 --- a/datapath/linux/Modules.mk +++ b/datapath/linux/Modules.mk @@ -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 \ diff --git a/datapath/linux/compat/include/linux/if_vlan.h b/datapath/linux/compat/include/linux/if_vlan.h index b8b1961f7..730175be5 100644 --- a/datapath/linux/compat/include/linux/if_vlan.h +++ b/datapath/linux/compat/include/linux/if_vlan.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. */ diff --git a/datapath/linux/compat/include/linux/netdev_features.h b/datapath/linux/compat/include/linux/netdev_features.h new file mode 100644 index 000000000..0259413d9 --- /dev/null +++ b/datapath/linux/compat/include/linux/netdev_features.h @@ -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 diff --git a/datapath/linux/compat/include/net/gre.h b/datapath/linux/compat/include/net/gre.h index bd0c3d42c..5f46aed68 100644 --- a/datapath/linux/compat/include/net/gre.h +++ b/datapath/linux/compat/include/net/gre.h @@ -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 diff --git a/datapath/vlan.h b/datapath/vlan.h index 46d0db356..aee555144 100644 --- a/datapath/vlan.h +++ b/datapath/vlan.h @@ -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; diff --git a/datapath/vport-internal_dev.c b/datapath/vport-internal_dev.c index 9ee1c42ed..db55ee0e5 100644 --- a/datapath/vport-internal_dev.c +++ b/datapath/vport-internal_dev.c @@ -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) diff --git a/datapath/vport-netdev.c b/datapath/vport-netdev.c index 4bc16175c..50373b1ab 100644 --- a/datapath/vport-netdev.c +++ b/datapath/vport-netdev.c @@ -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); |