ref: e045eefc7e723e4e3bf036dd98178afebd8da88e
parent: a08ce962812370180d9f40172d350c637c41cfc4
author: cinap_lenrek <cinap_lenrek@felloff.net>
date: Sun Oct 19 09:57:05 EDT 2025
tcp: Avoid backoff counter overflow, reorder fields in Tcpctl
--- a/sys/src/9/ip/tcp.c
+++ b/sys/src/9/ip/tcp.c
@@ -202,8 +202,8 @@
{
Conv *bypass; /* The other when bypassing */
uchar state; /* Connection state */
- uchar type; /* Listening or active connection */
- uchar code; /* Icmp code */
+ uchar flags; /* State flags */
+ uchar flgcnt; /* Number of flags in the send sequence (FIN,SYN) */
struct {
ulong una; /* Unacked data pointer */
ulong nxt; /* Next sequence expected */
@@ -238,9 +238,7 @@
Reseq *reseq; /* Resequencing queue */
int nreseq;
int reseqlen;
- uchar flags; /* State flags */
- uchar flgcnt; /* Number of flags in the send sequence (FIN,SYN) */
- uchar backoff; /* Exponential backoff counter */
+ int backoff; /* Exponential backoff counter */
int backedoff; /* ms we've backed off for rexmits */
Tcptimer timer; /* Activity timer */
Tcptimer acktimer; /* Acknowledge timer */
@@ -1621,7 +1619,7 @@
qsetbypass(new->wq, tcpbypass);
qsetbypass(old->wq, tcpbypass);
- /* stop timers and drump resequencing queue */
+ /* stop timers and dump resequencing queue */
tpriv = (Tcppriv*)new->p->priv;
tcphalt(tpriv, &ntcb->timer);
tcphalt(tpriv, &otcb->timer);
@@ -2689,7 +2687,8 @@
qlock(s);
switch(tcb->state){
default:
- tcb->backoff++;
+ if(tcb->backoff < 8)
+ tcb->backoff++;
if(tcb->state == Syn_sent)
maxback = MAXBACKMS/2;
else
--
⑨