]> err.no Git - linux-2.6/commitdiff
[IPV6]: Fix reversed local_df test in ip6_fragment
authorHerbert Xu <herbert@gondor.apana.org.au>
Fri, 15 Feb 2008 07:49:37 +0000 (23:49 -0800)
committerDavid S. Miller <davem@davemloft.net>
Fri, 15 Feb 2008 07:49:37 +0000 (23:49 -0800)
I managed to reverse the local_df test when forward-porting this
patch so it actually makes things worse by never fragmenting at
all.

Thanks to David Stevens for testing and reporting this bug.

Bill Fink pointed out that the local_df setting is also the wrong
way around.

Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/ipv6/ip6_output.c

index 4e9a2fe2f12cf4e62cc4b1cc9b9c2e3768252e08..8b67ca07467d48e0bb3e62da1ae19d7a6d5b156e 100644 (file)
@@ -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 (skb->local_df) {
+       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);
@@ -1421,7 +1421,7 @@ int ip6_push_pending_frames(struct sock *sk)
        }
 
        /* Allow local fragmentation. */
-       if (np->pmtudisc >= IPV6_PMTUDISC_DO)
+       if (np->pmtudisc < IPV6_PMTUDISC_DO)
                skb->local_df = 1;
 
        ipv6_addr_copy(final_dst, &fl->fl6_dst);