git: 9front

Download patch

ref: 065359bd89b8d6ddd9ebdee732f37ec0ae992b59
parent: 8f64c7d58b283eb86f67d6c044704533b4b2f490
parent: ca34634e07d6e7959cba7fb3678a654f15355908
author: cinap_lenrek <cinap_lenrek@felloff.net>
date: Sun Mar 15 15:44:37 EDT 2026

merge

--- a/sys/src/9/port/devether.c
+++ b/sys/src/9/port/devether.c
@@ -30,6 +30,21 @@
 	freeb(b);
 }
 
+static void
+bypass(void *arg, Block *b)
+{
+	Ether *ether;
+	Netfile *f;
+
+	ether = (Ether*)arg;
+	if((f = ether->bypass) == nil){
+		freeb(b);
+		return;
+	}
+	if(qpass(f->in, b) < 0)
+		ether->soverflows++;
+}
+
 Chan*
 etherattach(char* spec)
 {
@@ -276,8 +291,6 @@
 static void
 etheroq(Ether* ether, Block* bp, Netfile **from)
 {
-	Netfile *x;
-
 	if((*from)->bridge == 0)
 		memmove(((Etherpkt*)bp->rp)->s, ether->ea, Eaddrlen);
 
@@ -292,11 +305,6 @@
 		return;
 	if(ether->dmat != nil)
 		dmatproxy(bp, 1, ether->ea, ether->dmat);
-	if((x = ether->bypass) != nil){
-		if(qpass(x->in, bp) < 0)
-			ether->soverflows++;
-		return;
-	}
 	ether->outpackets++;
 	qbwrite(ether->oq, bp);
 }
@@ -314,10 +322,10 @@
 		if(nn >= 0){
 			/* got bypassed? */
 			if(ether->f[NETID(chan->qid.path)]->bypass){
-				/* flush and bypass output queue */
-				qsetbypass(ether->oq, drop);
 				/* ignore mbps and use large input queue size */
 				netifsetlimit(ether, MB);
+				/* bypass output queue */
+				qsetbypass(ether->oq, bypass);
 			}
 			return nn;
 		}
--