The removal of the tcp_send_ack in bad_tcp_sequence turns
out to have been a bad idea (TM). I stupidly forgot that
more than one ACK packet can be lost at a time. (doh)
To avoid retransmission storms with Solaris we probably still
want to make this a delayed ack, but we should probably at
least put an ack in there.
Try changing the code to bad_tcp_sequence() in tcp_input.c
to the following:
static void bad_tcp_sequence(struct sock *sk, struct tcphdr *th, u32 end_seq,
struct device *dev)
{
if (th->rst)
return;
/*
* Send a reset if we get something not ours and we are
* unsynchronized. Note: We don't do anything to our end. We
* are just killing the bogus remote connection then we will
* connect again and it will work (with luck).
*/
if (sk->state==TCP_SYN_SENT || sk->state==TCP_SYN_RECV)
{
tcp_send_reset(sk->saddr,sk->daddr,th,sk->prot,NULL,dev, sk->ip_
tos,sk->ip_ttl);
return;
}
tcp_send_delayed_ack(sk, HZ/2);
}
I've got to go and do some real work right now, so I haven't tested
this yet. If you try it let me know how it works...
-- eric
---------------------------------------------------------------------------
Eric Schenk www: http://www.cs.toronto.edu/~schenk
Department of Computer Science email: schenk@cs.toronto.edu
University of Toronto