X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=datapath%2Flinux%2Fcompat%2Finclude%2Flinux%2Fnetdevice.h;h=ba1fc593ec92be6d73a08b95ba79bfa1a327fc8d;hb=a2b7fd3fa66e1b3eddc4dfc437d7d9eec4670cfb;hp=b051baf53ce411b8f9da09d0f413721d39f69901;hpb=752378e1cd1f133a8366fbacec3b281a45ff8268;p=sliver-openvswitch.git diff --git a/datapath/linux/compat/include/linux/netdevice.h b/datapath/linux/compat/include/linux/netdevice.h index b051baf53..ba1fc593e 100644 --- a/datapath/linux/compat/include/linux/netdevice.h +++ b/datapath/linux/compat/include/linux/netdevice.h @@ -20,6 +20,11 @@ struct net; #define to_net_dev(class) container_of(class, struct net_device, NETDEV_DEV_MEMBER) #endif +#ifdef HAVE_RHEL_OVS_HOOK +extern struct sk_buff *(*openvswitch_handle_frame_hook)(struct sk_buff *skb); +extern int nr_bridges; +#endif + #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,26) static inline struct net *dev_net(const struct net_device *dev) @@ -84,19 +89,33 @@ extern int skb_checksum_help(struct sk_buff *skb, int); extern int skb_checksum_help(struct sk_buff *skb); #endif -#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,36) +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,36) || \ + defined HAVE_RHEL_OVS_HOOK static inline int netdev_rx_handler_register(struct net_device *dev, void *rx_handler, void *rx_handler_data) { +#ifdef HAVE_RHEL_OVS_HOOK + rcu_assign_pointer(dev->ax25_ptr, rx_handler_data); + nr_bridges++; + rcu_assign_pointer(openvswitch_handle_frame_hook, rx_handler_data); +#else if (dev->br_port) return -EBUSY; rcu_assign_pointer(dev->br_port, rx_handler_data); +#endif return 0; } static inline void netdev_rx_handler_unregister(struct net_device *dev) { +#ifdef HAVE_RHEL_OVS_HOOK + rcu_assign_pointer(dev->ax25_ptr, NULL); + + if (--nr_bridges <= 0) + rcu_assign_pointer(openvswitch_handle_frame_hook, NULL); +#else rcu_assign_pointer(dev->br_port, NULL); +#endif } #endif @@ -142,17 +161,13 @@ static inline struct net_device *dev_get_by_index_rcu(struct net *net, int ifind #define NETIF_F_V6_CSUM (NETIF_F_GEN_CSUM | NETIF_F_IPV6_CSUM) #endif -#ifndef HAVE_SKB_GSO_SEGMENT +#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); -#endif -#ifndef HAVE_NETIF_SKB_FEATURES #define netif_skb_features rpl_netif_skb_features u32 rpl_netif_skb_features(struct sk_buff *skb); -#endif -#ifndef HAVE_NETIF_NEEDS_GSO #define netif_needs_gso rpl_netif_needs_gso static inline int rpl_netif_needs_gso(struct sk_buff *skb, int features) {