summaryrefslogtreecommitdiff
path: root/datapath
diff options
context:
space:
mode:
authorJustin Pettit <jpettit@nicira.com>2011-08-26 23:34:40 -0700
committerJustin Pettit <jpettit@nicira.com>2011-08-28 21:30:58 -0700
commit24b019f808211a95078efd916064af0975ca5733 (patch)
tree7797ea073ddd2e98b328f9b7996726e8ad028652 /datapath
parente47bd51a7b2ae66b00c19cc86f7dcb1eeb4ad105 (diff)
downloadopenvswitch-24b019f808211a95078efd916064af0975ca5733.tar.gz
datapath: Disable LRO from userspace instead of the kernel.
Whenever a port is added to the datapath, LRO is automatically disabled. In the future, we may want to enable LRO in some circumstances, so have userspace disable LRO through the ethtool ioctls. As part of this change, the MTU and LRO checks are moved to netdev-vport's send(), which is where they're actually needed. Feature #6810 Signed-off-by: Justin Pettit <jpettit@nicira.com> Acked-by: Jesse Gross <jesse@nicira.com>
Diffstat (limited to 'datapath')
-rw-r--r--datapath/vport-netdev.c32
-rw-r--r--datapath/vport.c30
2 files changed, 31 insertions, 31 deletions
diff --git a/datapath/vport-netdev.c b/datapath/vport-netdev.c
index f1e9b09d0..d1e61bbdf 100644
--- a/datapath/vport-netdev.c
+++ b/datapath/vport-netdev.c
@@ -6,6 +6,8 @@
* kernel, by Linus Torvalds and others.
*/
+#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
+
#include <linux/if_arp.h>
#include <linux/if_bridge.h>
#include <linux/if_vlan.h>
@@ -158,7 +160,9 @@ static struct vport *netdev_create(const struct vport_parms *parms)
goto error_put;
dev_set_promiscuity(netdev_vport->dev, 1);
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24)
dev_disable_lro(netdev_vport->dev);
+#endif
netdev_vport->dev->priv_flags |= IFF_OVS_DATAPATH;
return vport;
@@ -281,8 +285,6 @@ static void netdev_port_receive(struct vport *vport, struct sk_buff *skb)
if (unlikely(!skb))
return;
- skb_warn_if_lro(skb);
-
skb_push(skb, ETH_HLEN);
if (unlikely(compute_ip_summed(skb, false))) {
@@ -294,6 +296,16 @@ static void netdev_port_receive(struct vport *vport, struct sk_buff *skb)
vport_receive(vport, skb);
}
+static inline unsigned packet_length(const struct sk_buff *skb)
+{
+ unsigned length = skb->len - ETH_HLEN;
+
+ if (skb->protocol == htons(ETH_P_8021Q))
+ length -= VLAN_HLEN;
+
+ return length;
+}
+
static bool dev_supports_vlan_tx(struct net_device *dev)
{
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)
@@ -310,8 +322,19 @@ static bool dev_supports_vlan_tx(struct net_device *dev)
static int netdev_send(struct vport *vport, struct sk_buff *skb)
{
struct netdev_vport *netdev_vport = netdev_vport_priv(vport);
+ int mtu = netdev_vport->dev->mtu;
int len;
+ if (unlikely(packet_length(skb) > mtu && !skb_is_gso(skb))) {
+ if (net_ratelimit())
+ pr_warn("%s: dropped over-mtu packet: %d > %d\n",
+ dp_name(vport->dp), packet_length(skb), mtu);
+ goto error;
+ }
+
+ if (unlikely(skb_warn_if_lro(skb)))
+ goto error;
+
skb->dev = netdev_vport->dev;
forward_ip_summed(skb, true);
@@ -379,6 +402,11 @@ tag:
dev_queue_xmit(skb);
return len;
+
+error:
+ kfree_skb(skb);
+ vport_record_error(vport, VPORT_E_TX_DROPPED);
+ return 0;
}
/* Returns null if this device is not attached to a datapath. */
diff --git a/datapath/vport.c b/datapath/vport.c
index 487d75241..2b5a0b4ed 100644
--- a/datapath/vport.c
+++ b/datapath/vport.c
@@ -6,8 +6,6 @@
* kernel, by Linus Torvalds and others.
*/
-#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
-
#include <linux/dcache.h>
#include <linux/etherdevice.h>
#include <linux/if.h>
@@ -687,16 +685,6 @@ void vport_receive(struct vport *vport, struct sk_buff *skb)
dp_process_received_packet(vport, skb);
}
-static inline unsigned packet_length(const struct sk_buff *skb)
-{
- unsigned length = skb->len - ETH_HLEN;
-
- if (skb->protocol == htons(ETH_P_8021Q))
- length -= VLAN_HLEN;
-
- return length;
-}
-
/**
* vport_send - send a packet on a device
*
@@ -708,18 +696,7 @@ static inline unsigned packet_length(const struct sk_buff *skb)
*/
int vport_send(struct vport *vport, struct sk_buff *skb)
{
- int mtu;
- int sent;
-
- mtu = vport_get_mtu(vport);
- if (mtu && unlikely(packet_length(skb) > mtu && !skb_is_gso(skb))) {
- if (net_ratelimit())
- pr_warn("%s: dropped over-mtu packet: %d > %d\n",
- dp_name(vport->dp), packet_length(skb), mtu);
- goto error;
- }
-
- sent = vport->ops->send(vport, skb);
+ int sent = vport->ops->send(vport, skb);
if (vport->ops->flags & VPORT_F_GEN_STATS && sent > 0) {
struct vport_percpu_stats *stats;
@@ -736,11 +713,6 @@ int vport_send(struct vport *vport, struct sk_buff *skb)
}
return sent;
-
-error:
- kfree_skb(skb);
- vport_record_error(vport, VPORT_E_TX_DROPPED);
- return 0;
}
/**