shithub: front

Download patch

ref: 511cd4dc31b14ba392858a523bb3a4cbf37044e8
parent: 09b5619466b8c1f27dcf5fc742de9a6b2734c025
author: cinap_lenrek <cinap_lenrek@felloff.net>
date: Fri Jan 10 17:50:24 EST 2025

devether: handle input queue size for bypass mode

when the interface is bypassed, use a fixed large
receive queue (1MB) and ignore speed/link state
changes.

also, zap the mac table when the link state changes.

--- a/sys/src/9/port/devether.c
+++ b/sys/src/9/port/devether.c
@@ -21,6 +21,9 @@
 
 static void dmatproxy(Block*, int, uchar*, DMAT*);
 
+static int etheroqsize(Ether*);
+static int etheriqsize(Ether*);
+
 Chan*
 etherattach(char* spec)
 {
@@ -88,10 +91,17 @@
 etherclose(Chan* chan)
 {
 	Ether *ether = etherxx[chan->dev];
+	Netfile *f;
 
-	if(NETTYPE(chan->qid.path) == Ndataqid && ether->f[NETID(chan->qid.path)]->bridge)
-		memset(ether->mactab, 0, sizeof(ether->mactab));
-
+	if(NETTYPE(chan->qid.path) == Ndataqid){
+		f = ether->f[NETID(chan->qid.path)];
+		if(f->bridge || f->bypass)
+			memset(ether->mactab, 0, sizeof(ether->mactab));
+		if(f->bypass){
+			qsetlimit(ether->oq, etheroqsize(ether));
+			netifsetlimit(ether, etheriqsize(ether));
+		}
+	}
 	netifclose(ether, chan);
 }
 
@@ -295,8 +305,14 @@
 
 	if(NETTYPE(chan->qid.path) != Ndataqid) {
 		nn = netifwrite(ether, chan, buf, n);
-		if(nn >= 0)
+		if(nn >= 0){
+			/* ignore mbps and use large input queue size when bypassed */
+			if(ether->f[NETID(chan->qid.path)]->bypass){
+				qflush(ether->oq);
+				netifsetlimit(ether, MB);
+			}
 			return nn;
+		}
 		cb = parsecmd(buf, n);
 		if(cb->f[0] && strcmp(cb->f[0], "nonblocking") == 0){
 			if(cb->nf <= 1)
@@ -380,7 +396,7 @@
 }
 
 static int
-etherqueuesize(Ether *ether)
+etheroqsize(Ether *ether)
 {
 	int b, q;
 
@@ -392,6 +408,12 @@
 	return q;
 }
 
+static int
+etheriqsize(Ether *ether)
+{
+	return etheroqsize(ether) * 2;
+}
+
 static Ether*
 etherprobe(int cardno, int ctlrno, char *conf)
 {
@@ -445,7 +467,7 @@
 	print("#l%d: %s: %dMbps port 0x%lluX irq %d ea %E\n",
 		ctlrno, ether->type, ether->mbps, (uvlong)ether->port, ether->irq, ether->ea);
 
-	q = etherqueuesize(ether);
+	q = etheroqsize(ether);
 	if(ether->oq == nil){
 		ether->oq = qopen(q, Qmsg, 0, 0);
 		if(ether->oq == nil)
@@ -453,7 +475,7 @@
 	} else {
 		qsetlimit(ether->oq, q);
 	}
-	netifinit(ether, ether->name, Ntypes, q*2);
+	netifinit(ether, ether->name, Ntypes, etheriqsize(ether));
 	ether->alen = Eaddrlen;
 	memmove(ether->addr, ether->ea, Eaddrlen);
 	memset(ether->bcast, 0xFF, Eaddrlen);
@@ -464,17 +486,13 @@
 void
 ethersetspeed(Ether *ether, int mbps)
 {
-	int q;
-
 	if(ether->mbps == mbps)
 		return;
 	ether->mbps = mbps;
-
-	if(mbps <= 0 || ether->f == nil || ether->oq == nil)
+	if(mbps <= 0 || ether->f == nil || ether->oq == nil || ether->bypass)
 		return;
-	q = etherqueuesize(ether);
-	qsetlimit(ether->oq, q);
-	netifsetlimit(ether, q*2);
+	qsetlimit(ether->oq, etheroqsize(ether));
+	netifsetlimit(ether, etheriqsize(ether));
 }
 
 void
@@ -484,10 +502,9 @@
 	if(!!ether->link == link)
 		return;
 	ether->link = link;
-
-	if(ether->f == nil)
+	if(ether->f == nil || ether->bypass)
 		return;
-
+	memset(ether->mactab, 0, sizeof(ether->mactab));
 	if(link)
 		print("#l%d: %s: link up: %dMbps\n",
 			ether->ctlrno, ether->type, ether->mbps);
--- a/sys/src/9/port/netif.c
+++ b/sys/src/9/port/netif.c
@@ -39,14 +39,16 @@
 	int i;
 
 	qlock(nif);
-	nif->limit = limit;
-	for(i = 0; i < nif->nfile; i++){
-		f = nif->f[i];
-		if(f == nil)
-			continue;
-		qlock(f);
-		qsetlimit(f->in, nif->limit);
-		qunlock(f);
+	if(nif->limit != limit){
+		nif->limit = limit;
+		for(i = 0; i < nif->nfile; i++){
+			f = nif->f[i];
+			if(f == nil)
+				continue;
+			qlock(f);
+			qsetlimit(f->in, nif->limit);
+			qunlock(f);
+		}
 	}
 	qunlock(nif);
 }
--