In article <[EMAIL PROTECTED]>,
"David S. Miller" <[EMAIL PROTECTED]> writes:
> + 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);
> + }
I cannot understand how this could make a difference. tcp_simple_retransmit()
is only a optimization to resend the packet quickly without waiting for the
timeout. But it doesn't remove packets from the write queue, thus if it
fails for some reason the retransmit timer should resend them always.
When the retransmit timer doesn't send the second fragment it means it isn't
properly inserted into the list.
I also tried to reproduce the problem on my i386 boxes, but no luck, thus
I guessed some 64bit or compiler problem on alpha - e.g. that the list
insertion in tcp_fragment for the new segment fails somehow (that would
explain it).
-Andi
-
To unsubscribe from this list: send the line "unsubscribe linux-net" in
the body of a message to [EMAIL PROTECTED]