From: Daryl T. <Dar...@io...> - 2007-01-30 20:02:02
|
Geoffrey D. Bennett wrote: >> Gotta admit that the logic in that section makes me go a little >> cross-eyed. If the tunnel window size dropped to zero I could see >> it skipping the retransmit without it updating the retry timers, >> but that's just wild speculation on my part. You could patch the >> Control message log message to print the Window size, if it occurs >> often enough. > AFAICT, the tunnel window size (you are talking about > tunnel[t].window, yes?) Yes. > is set when the tunnel is created and never changed. Well, it's set to a default value, then set on reception of rx window avp. I don't know if there is any logic that prevents that message from being processed while a tunnel is already set up (e.g. changes window size after the tuneel is up) - I'm not that au fait with the RFCs. > When you say about skipping the retx without it updating the retry > timers, are you talking about this bit of code: > > // resend pending messages as timeout on reply > if (tunnel[t].retry <= TIME) > { > controlt *c = tunnel[t].controls; > uint8_t w = tunnel[t].window; > tunnel[t].try++; // another try > if (tunnel[t].try > 5) > tunnelkill(t, "Timeout on control message"); // game over > else > while (c && w--) > { > tunnelsend(c->buf, c->length, t); > c = c->next; > } > > t_actions++; > } > > ? Yes. In particular the "while (c && w--)" logic. I take it from your subsequent post that you were getting a window size with a multiple of 256? > In my case, tunnel[t].controls is going to point to the one and only > message that hasn't been acknowledged. tunnel[t].window can't be 0. > So I'm confused. Must be some part of "wild speculation on my part" that was ambiguous ... In response to your patch question, I post them to the tracker as well to ensure they don't get mangled by the mailing list (I've seen references to patches that the archive doesn't seem to preserve). -- Regards, Daryl Tester, IOCANE Pty. Ltd. |