datapath: Disable large receive offload.
[sliver-openvswitch.git] / datapath / linux-2.6 / compat-2.6 / dev-openvswitch.c
diff --git a/datapath/linux-2.6/compat-2.6/dev-openvswitch.c b/datapath/linux-2.6/compat-2.6/dev-openvswitch.c
new file mode 100644 (file)
index 0000000..7be33f6
--- /dev/null
@@ -0,0 +1,35 @@
+#include <linux/version.h>
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,27)
+
+#include <linux/netdevice.h>
+
+#ifndef NETIF_F_LRO
+void dev_disable_lro(struct net_device *dev) { }
+#else
+
+#include <linux/ethtool.h>
+
+/**
+ *     dev_disable_lro - disable Large Receive Offload on a device
+ *     @dev: device
+ *
+ *     Disable Large Receive Offload (LRO) on a net device.  Must be
+ *     called under RTNL.  This is needed if received packets may be
+ *     forwarded to another interface.
+ */
+void dev_disable_lro(struct net_device *dev)
+{
+       if (dev->ethtool_ops && dev->ethtool_ops->get_flags &&
+           dev->ethtool_ops->set_flags) {
+               u32 flags = dev->ethtool_ops->get_flags(dev);
+               if (flags & ETH_FLAG_LRO) {
+                       flags &= ~ETH_FLAG_LRO;
+                       dev->ethtool_ops->set_flags(dev, flags);
+               }
+       }
+       WARN_ON(dev->features & NETIF_F_LRO);
+}
+
+#endif /* NETIF_F_LRO */
+
+#endif /* kernel < 2.6.27 */