diff options
Diffstat (limited to 'net/ipv6/ip6_output.c')
| -rw-r--r-- | net/ipv6/ip6_output.c | 6 | 
1 files changed, 5 insertions, 1 deletions
diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c index 9ac6ca2521c..4e9a2fe2f12 100644 --- a/net/ipv6/ip6_output.c +++ b/net/ipv6/ip6_output.c @@ -621,7 +621,7 @@ static int ip6_fragment(struct sk_buff *skb, int (*output)(struct sk_buff *))  	 * or if the skb it not generated by a local socket.  (This last  	 * check should be redundant, but it's free.)  	 */ -	if (!np || np->pmtudisc >= IPV6_PMTUDISC_DO) { +	if (skb->local_df) {  		skb->dev = skb->dst->dev;  		icmpv6_send(skb, ICMPV6_PKT_TOOBIG, 0, mtu, skb->dev);  		IP6_INC_STATS(ip6_dst_idev(skb->dst), IPSTATS_MIB_FRAGFAILS); @@ -1420,6 +1420,10 @@ int ip6_push_pending_frames(struct sock *sk)  		tmp_skb->sk = NULL;  	} +	/* Allow local fragmentation. */ +	if (np->pmtudisc >= IPV6_PMTUDISC_DO) +		skb->local_df = 1; +  	ipv6_addr_copy(final_dst, &fl->fl6_dst);  	__skb_pull(skb, skb_network_header_len(skb));  	if (opt && opt->opt_flen)  |