[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)
execute.length))
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);
--
1.5.5
More information about the dev
mailing list