X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=datapath%2Flinux%2Fcompat%2Finclude%2Flinux%2Fnetdevice.h;h=d726390ef482941ddc70ced2dcefe3563e4540d4;hb=e2f3178f0582eda302bdc5629189b6a56d9fbcdd;hp=04ebd89a77e33b45c6e32382bc0ef020f57a45cb;hpb=22bcc0e70becd88bf895c44885d63704affe4284;p=sliver-openvswitch.git diff --git a/datapath/linux/compat/include/linux/netdevice.h b/datapath/linux/compat/include/linux/netdevice.h index 04ebd89a7..d726390ef 100644 --- a/datapath/linux/compat/include/linux/netdevice.h +++ b/datapath/linux/compat/include/linux/netdevice.h @@ -2,143 +2,140 @@ #define __LINUX_NETDEVICE_WRAPPER_H 1 #include_next +#include struct net; #include -/* Before 2.6.21, struct net_device has a "struct class_device" member named - * class_dev. Beginning with 2.6.21, struct net_device instead has a "struct - * device" member named dev. Otherwise the usage of these members is pretty - * much the same. */ -#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,21) -#define NETDEV_DEV_MEMBER class_dev -#else -#define NETDEV_DEV_MEMBER dev -#endif #ifndef to_net_dev #define to_net_dev(class) container_of(class, struct net_device, NETDEV_DEV_MEMBER) #endif -#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,26) -static inline -struct net *dev_net(const struct net_device *dev) -{ -#ifdef CONFIG_NET_NS - return dev->nd_net; -#elif LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,25) - return &init_net; -#else - return NULL; +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,33) +extern void unregister_netdevice_queue(struct net_device *dev, + struct list_head *head); +extern void unregister_netdevice_many(struct list_head *head); #endif -} -static inline -void dev_net_set(struct net_device *dev, const struct net *net) -{ -#ifdef CONFIG_NET_NS - dev->nd_dev = net; +#ifndef HAVE_DEV_DISABLE_LRO +extern void dev_disable_lro(struct net_device *dev); #endif -} -#endif /* linux kernel < 2.6.26 */ -#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24) -#define NETIF_F_NETNS_LOCAL 0 -#endif +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,36) || \ + defined HAVE_RHEL_OVS_HOOK -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24) -#define proc_net init_net.proc_net -#endif +#ifdef HAVE_RHEL_OVS_HOOK +typedef struct sk_buff *(openvswitch_handle_frame_hook_t)(struct sk_buff *skb); +extern openvswitch_handle_frame_hook_t *openvswitch_handle_frame_hook; -#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,32) -typedef int netdev_tx_t; +int netdev_rx_handler_register(struct net_device *dev, + openvswitch_handle_frame_hook_t *hook, + void *rx_handler_data); +#else + +int netdev_rx_handler_register(struct net_device *dev, + struct sk_buff *(*netdev_hook)(struct net_bridge_port *p, + struct sk_buff *skb), + void *rx_handler_data); #endif -#ifndef for_each_netdev -/* Linux before 2.6.22 didn't have for_each_netdev at all. */ -#define for_each_netdev(net, d) for (d = dev_base; d; d = d->next) -#elif LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24) -/* Linux 2.6.24 added a network namespace pointer to the macro. */ -#undef for_each_netdev -#define for_each_netdev(net,d) list_for_each_entry(d, &dev_base_head, dev_list) +void netdev_rx_handler_unregister(struct net_device *dev); #endif -#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20) -#define net_xmit_eval(e) ((e) == NET_XMIT_CN? 0 : (e)) +#ifndef HAVE_DEV_GET_BY_INDEX_RCU +static inline struct net_device *dev_get_by_index_rcu(struct net *net, int ifindex) +{ + struct net_device *dev; + + read_lock(&dev_base_lock); + dev = __dev_get_by_index(net, ifindex); + read_unlock(&dev_base_lock); + + return dev; +} #endif -#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,33) -extern void unregister_netdevice_queue(struct net_device *dev, - struct list_head *head); -extern void unregister_netdevice_many(struct list_head *head); +#ifndef NETIF_F_FSO +#define NETIF_F_FSO 0 #endif -#ifndef HAVE_DEV_DISABLE_LRO -extern void dev_disable_lro(struct net_device *dev); +#ifndef HAVE_NETDEV_FEATURES_T +typedef u32 netdev_features_t; #endif -/* Linux 2.6.28 introduced dev_get_stats(): - * const struct net_device_stats *dev_get_stats(struct net_device *dev); - * - * Linux 2.6.36 changed dev_get_stats() to: - * struct rtnl_link_stats64 *dev_get_stats(struct net_device *dev, - * struct rtnl_link_stats64 *storage); - */ -#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,36) -#define dev_get_stats(dev, storage) rpl_dev_get_stats(dev, storage) -struct rtnl_link_stats64 *dev_get_stats(struct net_device *dev, - struct rtnl_link_stats64 *storage); +#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, + netdev_features_t features); + +#define netif_skb_features rpl_netif_skb_features +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) +{ + return skb_is_gso(skb) && (!skb_gso_ok(skb, features) || + unlikely(skb->ip_summed != CHECKSUM_PARTIAL)); +} #endif -#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) -#define skb_checksum_help(skb) skb_checksum_help((skb), 0) +#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 -#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,36) -static inline int netdev_rx_handler_register(struct net_device *dev, - void *rx_handler, - void *rx_handler_data) +#if LINUX_VERSION_CODE < KERNEL_VERSION(3,9,0) + +/* XEN dom0 networking assumes dev->master is bond device + * and it tries to access bond private structure from dev->master + * ptr on receive path. This causes panic. Therefore it is better + * not to backport this API. + **/ +static inline int netdev_master_upper_dev_link(struct net_device *dev, + struct net_device *upper_dev) { - if (dev->br_port) - return -EBUSY; - rcu_assign_pointer(dev->br_port, rx_handler_data); return 0; } -static inline void netdev_rx_handler_unregister(struct net_device *dev) + +static inline void netdev_upper_dev_unlink(struct net_device *dev, + struct net_device *upper_dev) { - rcu_assign_pointer(dev->br_port, NULL); } -#endif -#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) -#undef SET_ETHTOOL_OPS -#define SET_ETHTOOL_OPS(netdev, ops) \ - ( (netdev)->ethtool_ops = (struct ethtool_ops *)(ops) ) +static inline struct net_device *netdev_master_upper_dev_get(struct net_device *dev) +{ + return NULL; +} #endif -#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24) -#define dev_get_by_name(net, name) dev_get_by_name(name) -#define dev_get_by_index(net, ifindex) dev_get_by_index(ifindex) -#define __dev_get_by_name(net, name) __dev_get_by_name(name) -#define __dev_get_by_index(net, ifindex) __dev_get_by_index(ifindex) -#define dev_get_by_index_rcu(net, ifindex) dev_get_by_index_rcu(ifindex) +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,37) +#define dev_queue_xmit rpl_dev_queue_xmit +int dev_queue_xmit(struct sk_buff *skb); #endif -#ifndef HAVE_DEV_GET_BY_INDEX_RCU -static inline struct net_device *dev_get_by_index_rcu(struct net *net, int ifindex) +#if LINUX_VERSION_CODE < KERNEL_VERSION(3,11,0) +static inline struct net_device *netdev_notifier_info_to_dev(void *info) { - struct net_device *dev; - - read_lock(&dev_base_lock); - dev = __dev_get_by_index(net, ifindex); - read_unlock(&dev_base_lock); - - return dev; + return info; } #endif -#ifndef NETIF_F_FSO -#define NETIF_F_FSO 0 +#ifndef HAVE_PCPU_SW_NETSTATS + +#include + +struct pcpu_sw_netstats { + u64 rx_packets; + u64 rx_bytes; + u64 tx_packets; + u64 tx_bytes; + struct u64_stats_sync syncp; +}; #endif #endif