The first change is to not propagate the IP DF bit from the inner
packet to the outer packet. Large TCP packets can get segmented
first which will set the DF bit. However these segmented packets
might still be too large after the GRE header is added, requiring
fragmentation.
The second change is to raise the MTU of the GRE tunnel device.
This prevents packets from being dropped in the datapath before
they can be fragmented. Since the datapath is layer 2 it does not
do any fragmentation and drops any packets that are too large.
Both of these are temporary workarounds that need to be addressed
more carefully in the future.
Bug #2379
if (skb_dst(skb))
skb_dst(skb)->ops->update_pmtu(skb_dst(skb), mtu);
+ /* XXX: Temporarily allow fragmentation since DF doesn't
+ * do the right thing with bridging. */
+/*
if (skb->protocol == htons(ETH_P_IP)) {
df |= (old_iph->frag_off&htons(IP_DF));
}
}
#endif
-
+*/
if (tunnel->err_count > 0) {
if (time_before(jiffies,
tunnel->err_time + IPTUNNEL_ERR_TIMEO)) {
if (mtu < 68)
mtu = 68;
+ /* XXX: Set MTU to the maximum possible value. If we are bridged to a
+ * device with a larger MTU then packets will be dropped. */
+ mtu = 65482;
+
return mtu;
}