[ovs-dev] [PATCH] datapath: Don't drop MTU-sized VLAN packets from userspace

Justin Pettit jpettit at nicira.com
Sat Sep 5 01:03:24 UTC 2009

Before transimitting a packet, the datapath checks that the packet
length is not greater than the MTU.  It determines the length based on
the 'protocol' field in the skb.  If 'protocol' is ETH_P_8021Q, it reduces
the packet length as stored in the 'len' field by four bytes, which
is the size of a VLAN tag header.  Unfortunately, packets that arrived
from userspace were not having the 'protocol' field set, which would
cause MTU-sized packets to be dropped.  This commit sets the 'protocol'
field appropriately.

NIC-17 and NIC-26
 datapath/datapath.c |    9 +++++++++
 1 files changed, 9 insertions(+), 0 deletions(-)

diff --git a/datapath/datapath.c b/datapath/datapath.c
index 1460215..215dfdf 100644
--- a/datapath/datapath.c
+++ b/datapath/datapath.c
@@ -1127,6 +1127,7 @@ static int do_execute(struct datapath *dp, const struct odp_execute *executep)
 	struct odp_flow_key key;
 	struct sk_buff *skb;
 	struct sw_flow_actions *actions;
+	struct ethhdr *eth;
 	int err;
 	err = -EFAULT;
@@ -1166,6 +1167,14 @@ static int do_execute(struct datapath *dp, const struct odp_execute *executep)
 		goto error_free_skb;
+	skb_reset_mac_header(skb);
+	eth = eth_hdr(skb);
+	if (ntohs(eth->h_proto) >= 1536)
+		skb->protocol = eth->h_proto;
+	else
+		skb->protocol = htons(ETH_P_802_2);
 	flow_extract(skb, execute.in_port, &key);
 	err = execute_actions(dp, skb, &key, actions->actions,
 			      actions->n_actions, GFP_KERNEL);

More information about the dev mailing list