git: 9front

Download patch

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
--