2003-11-26 18:00:54

by Yogesh Swami

[permalink] [raw]
Subject: Linux TCP state machine is broken?

Hi,

[I'm not subscribed to this mailing list, so please CC
your reply to me]

I have been trying to implement one of the Internet
Drafts in the kernel for experimentation, and while
debugging I reliazed that TCP sender is almost always
in TCP_CA_CWR state. Since Linux doesn't follow the
RFCs, I am not sure if this is what is intended, or if
this is bug.

I think the reason the sender is always in TCP_CA_CWR
and not in TCP_CA_Open is because in the function
"tcp_transmit_skb" (tcp_out.c:190), after sending the
packet to IP-layer, the sender call tcp_enter_cwr() if
the IP layer did not return any non congestion error.
I have put the code fragement at the end of the
e-mail.

I am not clear why a successfuly transmission should
cause the sender to enter CWR (the only other places
when tcp_enter_cwr is called are when there is a ICMP
source quench or when there is ECE bit set for ECN).

If someone could explain this to me, that would be
great.

Thanks
Yogesh


------tcp_output.c; line 279 -------------

err = tp->af_specific->queue_xmit(skb, 0);
if (err <= 0)
return err;


tcp_enter_cwr(tp);


/* NET_XMIT_CN is special. It does not
guarantee,
* that this packet is lost. It tells that
device
* is about to start to drop packets or already
* drops some packets of the same priority and
* invokes us to send less aggressively.
*/
return err == NET_XMIT_CN ? 0 : err;

-------------------------------------


2003-11-26 18:40:14

by John Heffner

[permalink] [raw]
Subject: Re: Linux TCP state machine is broken?

On Wed, 26 Nov 2003, Yogesh Swami wrote:

> I think the reason the sender is always in TCP_CA_CWR
> and not in TCP_CA_Open is because in the function
> "tcp_transmit_skb" (tcp_out.c:190), after sending the
> packet to IP-layer, the sender call tcp_enter_cwr() if
> the IP layer did not return any non congestion error.
> I have put the code fragement at the end of the
> e-mail.
>
> I am not clear why a successfuly transmission should
> cause the sender to enter CWR (the only other places
> when tcp_enter_cwr is called are when there is a ICMP
> source quench or when there is ECE bit set for ECN).
>
> If someone could explain this to me, that would be
> great.

It reaches this point if there *is* congestion explicitly reported by the
interface. It will be in CWR a lot of the time if your local interface is
the bottleneck.

-John