]> git.kernelconcepts.de Git - karo-tx-linux.git/blobdiff - net/ipv4/ip_output.c
Merge remote-tracking branch 'ipsec/master'
[karo-tx-linux.git] / net / ipv4 / ip_output.c
index 50e29737b584624b6d338630622e87634961612e..4233cbe47052d83d856908185945635433b8613c 100644 (file)
@@ -533,6 +533,11 @@ int ip_do_fragment(struct net *net, struct sock *sk, struct sk_buff *skb,
 
        dev = rt->dst.dev;
 
+       /* for offloaded checksums cleanup checksum before fragmentation */
+       if (skb->ip_summed == CHECKSUM_PARTIAL &&
+           (err = skb_checksum_help(skb)))
+               goto fail;
+
        /*
         *      Point into the IP datagram header.
         */
@@ -657,9 +662,6 @@ slow_path_clean:
        }
 
 slow_path:
-       /* for offloaded checksums cleanup checksum before fragmentation */
-       if ((skb->ip_summed == CHECKSUM_PARTIAL) && skb_checksum_help(skb))
-               goto fail;
        iph = ip_hdr(skb);
 
        left = skb->len - hlen;         /* Space per frame */
@@ -911,6 +913,7 @@ static int __ip_append_data(struct sock *sk,
        if (transhdrlen &&
            length + fragheaderlen <= mtu &&
            rt->dst.dev->features & NETIF_F_V4_CSUM &&
+           !(flags & MSG_MORE) &&
            !exthdrlen)
                csummode = CHECKSUM_PARTIAL;