X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=datapath%2Flinux%2Fcompat%2Finclude%2Flinux%2Fnetdevice.h;h=ba1fc593ec92be6d73a08b95ba79bfa1a327fc8d;hb=a2b7fd3fa66e1b3eddc4dfc437d7d9eec4670cfb;hp=0c2f2f4c7c799d4658b366c1113ada512823eeac;hpb=6455100f38e9312346f4d58511595f695d813537;p=sliver-openvswitch.git diff --git a/datapath/linux/compat/include/linux/netdevice.h b/datapath/linux/compat/include/linux/netdevice.h index 0c2f2f4c7..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) @@ -77,23 +82,40 @@ extern void unregister_netdevice_many(struct list_head *head); extern void dev_disable_lro(struct net_device *dev); #endif +#define skb_checksum_help rpl_skb_checksum_help #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) -#define skb_checksum_help(skb) skb_checksum_help((skb), 0) +extern int skb_checksum_help(struct sk_buff *skb, int); +#else +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 @@ -154,4 +176,16 @@ 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, + bool tx_path) +{ + return skb_gso_segment(skb, features); +} +#endif #endif