Please try this patch, it should be cured now:

--- vanilla/linux/net/ipv4/tcp_output.c Wed Apr 28 09:51:57 1999
+++ linux/net/ipv4/tcp_output.c Sat May  8 22:29:05 1999
@@ -5,7 +5,7 @@
  *
  *             Implementation of the Transmission Control Protocol(TCP).
  *
- * Version:    $Id: tcp_output.c,v 1.107 1999/04/28 16:08:12 davem Exp $
+ * Version:    $Id: tcp_output.c,v 1.108 1999/05/08 21:48:59 davem Exp $
  *
  * Authors:    Ross Biro, <[EMAIL PROTECTED]>
  *             Fred N. van Kempen, <[EMAIL PROTECTED]>
@@ -521,24 +521,39 @@
 void tcp_simple_retransmit(struct sock *sk)
 {
        struct tcp_opt *tp = &(sk->tp_pinfo.af_tcp);
-       struct sk_buff *skb; 
-       unsigned int mss = tcp_current_mss(sk); 
+       struct sk_buff *skb, *old_next_skb;
+       unsigned int mss = tcp_current_mss(sk);
 
        /* Don't muck with the congestion window here. */
        tp->dup_acks = 0;
        tp->high_seq = tp->snd_nxt;
-       tp->retrans_head = NULL; 
+       tp->retrans_head = NULL;
 
        /* Input control flow will see that this was retransmitted
         * and not use it for RTT calculation in the absence of
         * the timestamp option.
         */
-       for (skb = skb_peek(&sk->write_queue);
+       for (old_next_skb = skb = skb_peek(&sk->write_queue);
             ((skb != tp->send_head) &&
              (skb != (struct sk_buff *)&sk->write_queue));
-            skb = skb->next) 
-               if (skb->len > mss)
-                       tcp_retransmit_skb(sk, skb); 
+            skb = skb->next) {
+               int resend_skb = 0;
+
+               /* Our goal is to push out the packets which we
+                * sent already, but are being chopped up now to
+                * account for the PMTU information we have.
+                *
+                * As we resend the queue, packets are fragmented
+                * into two pieces, and when we try to send the
+                * second piece it may be collapsed together with
+                * a subsequent packet, and so on.  -DaveM
+                */
+               if (old_next_skb != skb || skb->len > mss)
+                       resend_skb = 1;
+               old_next_skb = skb->next;
+               if (resend_skb != 0)
+                       tcp_retransmit_skb(sk, skb);
+       }
 }
 
 static __inline__ void update_retrans_head(struct sock *sk)
-
To unsubscribe from this list: send the line "unsubscribe linux-net" in
the body of a message to [EMAIL PROTECTED]

Reply via email to