datapath: Check for backported netdev_features_t.
authorJesse Gross <jesse@nicira.com>
Tue, 17 Dec 2013 18:22:40 +0000 (10:22 -0800)
committerJesse Gross <jesse@nicira.com>
Fri, 20 Dec 2013 19:52:30 +0000 (11:52 -0800)
This is apparently used by CentOS 6.5.

Reported-by: Phil Daws <uxbod@splatnix.net>
Reported-by: Edouard Bourguignon <madko@linuxed.net>
Signed-off-by: Jesse Gross <jesse@nicira.com>
acinclude.m4
datapath/linux/compat/include/linux/netdevice.h
datapath/linux/compat/netdevice.c

index 071fe54..cb563c6 100644 (file)
@@ -228,6 +228,7 @@ AC_DEFUN([OVS_CHECK_LINUX_COMPAT], [
   OVS_GREP_IFELSE([$KSRC/include/linux/netdevice.h], [dev_get_by_index_rcu])
   OVS_GREP_IFELSE([$KSRC/include/linux/netdevice.h], [__skb_gso_segment])
   OVS_GREP_IFELSE([$KSRC/include/linux/netdevice.h], [can_checksum_protocol])
+  OVS_GREP_IFELSE([$KSRC/include/linux/netdevice.h], [netdev_features_t])
 
   OVS_GREP_IFELSE([$KSRC/include/linux/rcupdate.h], [rcu_read_lock_held], [],
                   [OVS_GREP_IFELSE([$KSRC/include/linux/rtnetlink.h],
index 908ed86..bb8a4a6 100644 (file)
@@ -73,12 +73,17 @@ static inline struct net_device *dev_get_by_index_rcu(struct net *net, int ifind
 #define NETIF_F_FSO 0
 #endif
 
+#ifndef HAVE_NETDEV_FEATURES_T
+typedef u32 netdev_features_t;
+#endif
+
 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,38)
 #define skb_gso_segment rpl_skb_gso_segment
-struct sk_buff *rpl_skb_gso_segment(struct sk_buff *skb, u32 features);
+struct sk_buff *rpl_skb_gso_segment(struct sk_buff *skb,
+                                    netdev_features_t features);
 
 #define netif_skb_features rpl_netif_skb_features
-u32 rpl_netif_skb_features(struct sk_buff *skb);
+netdev_features_t rpl_netif_skb_features(struct sk_buff *skb);
 
 #define netif_needs_gso rpl_netif_needs_gso
 static inline int rpl_netif_needs_gso(struct sk_buff *skb, int features)
@@ -88,10 +93,6 @@ static inline int rpl_netif_needs_gso(struct sk_buff *skb, int features)
 }
 #endif
 
-#if LINUX_VERSION_CODE < KERNEL_VERSION(3,3,0)
-typedef u32 netdev_features_t;
-#endif
-
 #ifndef HAVE___SKB_GSO_SEGMENT
 static inline struct sk_buff *__skb_gso_segment(struct sk_buff *skb,
                                                netdev_features_t features,
index 248066d..55639cb 100644 (file)
@@ -7,7 +7,7 @@ int nr_bridges = 0;
 
 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,38)
 #ifndef HAVE_CAN_CHECKSUM_PROTOCOL
-static bool can_checksum_protocol(unsigned long features, __be16 protocol)
+static bool can_checksum_protocol(netdev_features_t features, __be16 protocol)
 {
        return  ((features & NETIF_F_GEN_CSUM) ||
                ((features & NETIF_F_V4_CSUM) &&
@@ -35,7 +35,9 @@ static inline int illegal_highdma(struct net_device *dev, struct sk_buff *skb)
        return 0;
 }
 
-static u32 harmonize_features(struct sk_buff *skb, __be16 protocol, u32 features)
+static netdev_features_t harmonize_features(struct sk_buff *skb,
+                                           __be16 protocol,
+                                           netdev_features_t features)
 {
        if (!can_checksum_protocol(features, protocol)) {
                features &= ~NETIF_F_ALL_CSUM;
@@ -47,12 +49,12 @@ static u32 harmonize_features(struct sk_buff *skb, __be16 protocol, u32 features
        return features;
 }
 
-u32 rpl_netif_skb_features(struct sk_buff *skb)
+netdev_features_t rpl_netif_skb_features(struct sk_buff *skb)
 {
        unsigned long vlan_features = skb->dev->vlan_features;
 
        __be16 protocol = skb->protocol;
-       u32 features = skb->dev->features;
+       netdev_features_t features = skb->dev->features;
 
        if (protocol == htons(ETH_P_8021Q)) {
                struct vlan_ethhdr *veh = (struct vlan_ethhdr *)skb->data;
@@ -72,7 +74,8 @@ u32 rpl_netif_skb_features(struct sk_buff *skb)
        }
 }
 
-struct sk_buff *rpl_skb_gso_segment(struct sk_buff *skb, u32 features)
+struct sk_buff *rpl_skb_gso_segment(struct sk_buff *skb,
+                                   netdev_features_t features)
 {
        int vlan_depth = ETH_HLEN;
        __be16 type = skb->protocol;