Re: [TEST FIX] Re: SSH Hangs in 2.5.59 and 2.5.55 but not 2.4.x, through Cisco PIX

David S. Miller
2003-01-28T18:39:13Z

From: kuznet@ms2.inr.ac.ru
Date: Tue, 28 Jan 2003 17:09:09 +0300 (MSK)

We apparently have segment of zero length in queue. :-)

Well, that chunk cannot be responsible for this directly, I am afraid
we somewhat arrived to attempt to retransmit already acked segment.

Hmmm, it is one of few places where sequence numbers of already
sent packet are mangled. :-)

Good set of debug checks would be the following:

--- net/ipv4/tcp_output.c.~1~ Mon Jan 27 14:46:33 2003
+++ net/ipv4/tcp_output.c Tue Jan 28 10:47:08 2003
@@ -441,6 +441,9 @@
TCP_SKB_CB(buff)->end_seq = TCP_SKB_CB(skb)->end_seq;
TCP_SKB_CB(skb)->end_seq = TCP_SKB_CB(buff)->seq;

+ BUG_TRAP(TCP_SKB_CB(buff)->seq != TCP_SKB_CB(buff)->end_seq);
+ BUG_TRAP(TCP_SKB_CB(skb)->seq != TCP_SKB_CB(skb)->end_seq);
+
/* PSH and FIN should only be set in the second packet. */
flags = TCP_SKB_CB(skb)->flags;
TCP_SKB_CB(skb)->flags = flags & ~(TCPCB_FLAG_FIN|TCPCB_FLAG_PSH);
@@ -524,6 +527,7 @@
}

TCP_SKB_CB(skb)->seq += len;
+ BUG_TRAP(TCP_SKB_CB(skb)->seq != TCP_SKB_CB(skb)->end_seq);
skb->ip_summed = CHECKSUM_HW;
return 0;
}
@@ -796,6 +800,7 @@

/* Update sequence range on original skb. */
TCP_SKB_CB(skb)->end_seq = TCP_SKB_CB(next_skb)->end_seq;
+ BUG_TRAP(TCP_SKB_CB(skb)->seq != TCP_SKB_CB(skb)->end_seq);

/* Merge over control information. */
flags |= TCP_SKB_CB(next_skb)->flags; /* This moves PSH/FIN etc. over */