mirror of
https://github.com/openvswitch/ovs
synced 2025-10-21 14:49:41 +00:00
LRO can play fast and loose with the packets that it merges, which isn't very polite when you are bridging packets for other operating systems. This disables LRO on any underlying devices that are added to the datapath, which is the same as what the bridge does. Note that this does not disable GRO, which has a more strict set of rules about what is merged and is therefore safe for bridging. Both are typically done in software anyways.
81 lines
2.1 KiB
C
81 lines
2.1 KiB
C
#ifndef __LINUX_NETDEVICE_WRAPPER_H
|
|
#define __LINUX_NETDEVICE_WRAPPER_H 1
|
|
|
|
#include_next <linux/netdevice.h>
|
|
|
|
struct net;
|
|
|
|
#include <linux/version.h>
|
|
/* 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;
|
|
#endif
|
|
}
|
|
|
|
static inline
|
|
void dev_net_set(struct net_device *dev, const struct net *net)
|
|
{
|
|
#ifdef CONFIG_NET_NS
|
|
dev->nd_dev = net;
|
|
#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,24)
|
|
#define proc_net init_net.proc_net
|
|
#endif
|
|
|
|
#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,32)
|
|
typedef int netdev_tx_t;
|
|
#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)
|
|
#endif
|
|
|
|
#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20)
|
|
#define net_xmit_eval(e) ((e) == NET_XMIT_CN? 0 : (e))
|
|
#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);
|
|
#endif
|
|
|
|
#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,27)
|
|
extern void dev_disable_lro(struct net_device *dev);
|
|
#endif
|
|
|
|
#endif
|