Linux TCP state machine is broken?

From: Yogesh Swami
Date: Wed Nov 26 2003 - 13:01:47 EST


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;

-------------------------------------
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/