|
@@ -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
|
|
* or if the skb it not generated by a local socket. (This last
|
|
* check should be redundant, but it's free.)
|
|
* check should be redundant, but it's free.)
|
|
*/
|
|
*/
|
|
- if (skb->local_df) {
|
|
|
|
|
|
+ if (!skb->local_df) {
|
|
skb->dev = skb->dst->dev;
|
|
skb->dev = skb->dst->dev;
|
|
icmpv6_send(skb, ICMPV6_PKT_TOOBIG, 0, mtu, skb->dev);
|
|
icmpv6_send(skb, ICMPV6_PKT_TOOBIG, 0, mtu, skb->dev);
|
|
IP6_INC_STATS(ip6_dst_idev(skb->dst), IPSTATS_MIB_FRAGFAILS);
|
|
IP6_INC_STATS(ip6_dst_idev(skb->dst), IPSTATS_MIB_FRAGFAILS);
|
|
@@ -1421,7 +1421,7 @@ int ip6_push_pending_frames(struct sock *sk)
|
|
}
|
|
}
|
|
|
|
|
|
/* Allow local fragmentation. */
|
|
/* Allow local fragmentation. */
|
|
- if (np->pmtudisc >= IPV6_PMTUDISC_DO)
|
|
|
|
|
|
+ if (np->pmtudisc < IPV6_PMTUDISC_DO)
|
|
skb->local_df = 1;
|
|
skb->local_df = 1;
|
|
|
|
|
|
ipv6_addr_copy(final_dst, &fl->fl6_dst);
|
|
ipv6_addr_copy(final_dst, &fl->fl6_dst);
|