--- zzzz-none-000/linux-2.6.28.10/net/ipv6/ip6_tunnel.c 2009-05-02 18:54:43.000000000 +0000 +++ fusiv-7390-686/linux-2.6.28.10/net/ipv6/ip6_tunnel.c 2012-02-14 14:37:49.000000000 +0000 @@ -849,6 +849,7 @@ struct ip6_tnl *t = netdev_priv(dev); struct net_device_stats *stats = &t->dev->stats; struct ipv6hdr *ipv6h = ipv6_hdr(skb); + struct iphdr *iph = ip_hdr(skb); struct ipv6_tel_txoption opt; struct dst_entry *dst; struct net_device *tdev; @@ -886,7 +887,7 @@ mtu = IPV6_MIN_MTU; if (skb->dst) skb->dst->ops->update_pmtu(skb->dst, mtu); - if (skb->len > mtu) { + if (skb->len > mtu && (iph->frag_off & htons(IP_DF))) { *pmtu = mtu; err = -EMSGSIZE; goto tx_err_dst_release; @@ -931,6 +932,7 @@ ipv6_addr_copy(&ipv6h->daddr, &fl->fl6_dst); nf_reset(skb); pkt_len = skb->len; + skb->local_df =1; err = ip6_local_out(skb); if (net_xmit_eval(err) == 0) { @@ -1327,7 +1329,7 @@ dev->mtu = ETH_DATA_LEN - sizeof (struct ipv6hdr); dev->flags |= IFF_NOARP; dev->addr_len = sizeof(struct in6_addr); - dev->features |= NETIF_F_NETNS_LOCAL; + dev->features |= NETIF_F_NETNS_LOCAL | NETIF_F_DF_RFC2473; }