[ovs-dev] [PATCH 2/2] tunneling: Always use skb->len for PMTUD.

Jesse Gross jesse at nicira.com
Fri Feb 4 21:35:47 UTC 2011


Currently IPv4 uses the length of the packet in the IP header
and IPv6 uses actual length of the packet for path MTU discovery.
This changes both to use the length of the packet to be consistent
with each other and the the Linux IP stack and also to match what
actually causes fragmentation.

Signed-off-by: Jesse Gross <jesse at nicira.com>
---
 datapath/tunnel.c |    9 ++++-----
 1 files changed, 4 insertions(+), 5 deletions(-)

diff --git a/datapath/tunnel.c b/datapath/tunnel.c
index 7bf46e0..237e0fb 100644
--- a/datapath/tunnel.c
+++ b/datapath/tunnel.c
@@ -718,6 +718,9 @@ static bool check_mtu(struct sk_buff *skb,
 	bool pmtud = mutable->flags & TNL_F_PMTUD;
 	__be16 frag_off = 0;
 	int mtu = 0;
+	unsigned int packet_length = skb->len - ETH_HLEN
+			- (eth_hdr(skb)->h_proto == htons(ETH_P_8021Q) ?
+							VLAN_HLEN : 0);
 
 	if (pmtud) {
 		frag_off = htons(IP_DF);
@@ -737,7 +740,7 @@ static bool check_mtu(struct sk_buff *skb,
 		if (pmtud && iph->frag_off & htons(IP_DF)) {
 			mtu = max(mtu, IP_MIN_MTU);
 
-			if (ntohs(iph->tot_len) > mtu &&
+			if (packet_length > mtu &&
 			    tnl_frag_needed(vport, mutable, skb, mtu,
 					    OVS_CB(skb)->tun_id))
 				return false;
@@ -745,10 +748,6 @@ static bool check_mtu(struct sk_buff *skb,
 	}
 #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
 	else if (skb->protocol == htons(ETH_P_IPV6)) {
-		unsigned int packet_length = skb->len - ETH_HLEN
-			- (eth_hdr(skb)->h_proto == htons(ETH_P_8021Q) ?
-				VLAN_HLEN : 0);
-
 		/* IPv6 requires PMTUD if the packet is above the minimum MTU. */
 		if (packet_length > IPV6_MIN_MTU)
 			frag_off = htons(IP_DF);
-- 
1.7.1





More information about the dev mailing list