[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[ns] sack1 tcp bug: pipe_ being set incorrectly
Ethan Blanton and I believe we have identified a bug in the one-way
ns SACK code. Specifically, we are looking at this portion of
Sack1TcpAgent::dupack_action():
sack_action:
recover_ = maxseq_;
last_cwnd_action_ = CWND_ACTION_DUPACK;
pipe_ = int(cwnd_) - NUMDUPACKS;
slowdown(CLOSE_SSTHRESH_HALF|CLOSE_CWND_HALF);
reset_rtx_timer(1,0);
fastrecov_ = TRUE;
scb_.MarkRetran(highest_ack_+1);
output(last_ack_ + 1, TCP_REASON_DUPACK); // from top
/*
* If dynamically adjusting NUMDUPACKS, record information
* at this point.
*/
return;
We believe the "pipe_ = ..." line above should be changed to:
pipe_ = maxseq_ - highest_ack_ - NUMDUPACKS;
as it appears elsewhere in the same function. Making the pipe_
depend on cwnd_ does not account for the fact that cwnd_ can grow
much larger than the maximum (advertised) TCP window. In this case,
pipe_ becomes much larger than the number of segments that are
actually outstanding which can prevent the sender from transmitting
new segments during recovery.
allman
---
http://roland.grc.nasa.gov/~mallman/