]> git.karo-electronics.de Git - mv-sheeva.git/blobdiff - net/ipv4/ip_output.c
ip: take care of last fragment in ip_append_data
[mv-sheeva.git] / net / ipv4 / ip_output.c
index e42762023c27bd405783648f9503f165522e67f3..3551b6dc741905f59528d1eee49e0e9437974225 100644 (file)
@@ -926,16 +926,19 @@ alloc_new_skb:
                            !(rt->dst.dev->features&NETIF_F_SG))
                                alloclen = mtu;
                        else
-                               alloclen = datalen + fragheaderlen;
+                               alloclen = fraglen;
 
                        /* The last fragment gets additional space at tail.
                         * Note, with MSG_MORE we overallocate on fragments,
                         * because we have no idea what fragment will be
                         * the last.
                         */
-                       if (datalen == length + fraggap)
+                       if (datalen == length + fraggap) {
                                alloclen += rt->dst.trailer_len;
-
+                               /* make sure mtu is not reached */
+                               if (datalen > mtu - fragheaderlen - rt->dst.trailer_len)
+                                       datalen -= ALIGN(rt->dst.trailer_len, 8);
+                       }
                        if (transhdrlen) {
                                skb = sock_alloc_send_skb(sk,
                                                alloclen + hh_len + 15,