panic in TCP Limited Transmit after RTO

Noritoshi Demizu demizu at dd.iij4u.or.jp
Mon Mar 14 04:13:17 PST 2005


> Limited Transmit is supposed to send new data, and, we are out of
> SACK recovery at this point, so I think we can safely ignore any old
> SACK blocks.  Please try this patch.

Now I start understanding what your patch does.

  o When doing Limited Transmit, ignore SACK blocks and send the data
    starting at snt_nxt, even if the data has been SACKed.

  o In Congestion Avoidance phase, ignore SACK blocks and send the data
    starting at snt_nxt, even if the data has been SACKed.

I do not think these are good ideas.

By the way, what would happen with your patch if
  t_maxseg = 1KB,
  snd_cwnd = 20KB,
  ssthresh = 20KB,
  snd_una  = 100KB,
  snd_nxt  = 130KB,
  SACKed bytes below snd_nxt = 10KB, and
  an acceptable ACK is received ?

First, let me brief what has happened until then.
Before snd_nxt reaches 130KB, since TCP was in slow start phase,
SACK blocks were consulted and snd_nxt grew up to 130KB
(= snd_una + snd_cwnd + "SACKed bytes below snd_nxt").

Now, let me think what will happen after then.
After snd_nxt reaches 130KB, since TCP is in congestion avoidance,
SACK blocks will be ignored.  So, the highest sequence number allowed to
be sent is decreased to 120KB (= snd_una + snd_cwnd).  But snd_nxt has
been grown to 130KB.  So, data cannot send until snd_cwnd grows to
30KB, while TCP is in congestion avoidance phase (i.e., snd_cwnd grows
by t_maxseg per RTT).  Retransmission timeout would be resulted.

Hence, I do not think the change below is not a good idea.

> -	if (TCP_DO_SACK(tp) && tp->snd_nxt != tp->snd_max &&
> +	if (TCP_DO_SACK(tp) && (tp->snd_cwnd < tp->snd_ssthresh) &&
>  	    !IN_FASTRECOVERY(tp))

I am sorry if I misunderstand something.

Regards,
Noritoshi Demizu





More information about the Bugs mailing list