git: 9front

Download patch

ref: 6f69539486b8deef8133302afc9ef19d76a7dbcb
parent: 5d33b42ef7a1c697b7684e11d830862d6b3b1f5e
author: cinap_lenrek <cinap_lenrek@felloff.net>
date: Mon Dec 16 14:19:15 EST 2013

devether: remove qfull prints and fix loopback packet handling of etheroq()

dont spam the console with qfull warnings. this makes things worse.

handle loopback packets as stated in the comment. we call etheriq()
with fromwire=1 for loopback packets so etheriq() can pass the packet
on (without copying) or free it. dont inhibit interrupts while calling
etheriq(). etheriq() can safely be called from process and interrupt
context. it is unclear what this was supposed to fix and testing didnt
seem to have any odd effects.

--- a/sys/src/9/bitsy/devether.c
+++ b/sys/src/9/bitsy/devether.c
@@ -414,7 +414,7 @@
 static int
 etheroq(Ether* ether, Block* bp)
 {
-	int len, loopback, s;
+	int len, loopback;
 	Etherpkt *pkt;
 
 	ether->outpackets++;
@@ -431,18 +431,13 @@
 	pkt = (Etherpkt*)bp->rp;
 	len = BLEN(bp);
 	loopback = memcmp(pkt->d, ether->ea, sizeof(pkt->d)) == 0;
-	if(loopback || memcmp(pkt->d, ether->bcast, sizeof(pkt->d)) == 0 || ether->prom){
-		s = splhi();
-		etheriq(ether, bp, 0);
-		splx(s);
-	}
+	if(loopback || memcmp(pkt->d, ether->bcast, sizeof(pkt->d)) == 0 || ether->prom)
+		if(etheriq(ether, bp, loopback) == 0)
+			return len;
 
-	if(!loopback){
-		qbwrite(ether->oq, bp);
+	qbwrite(ether->oq, bp);
+	if(ether->transmit != nil)
 		ether->transmit(ether);
-	} else
-		freeb(bp);
-
 	return len;
 }
 
--- a/sys/src/9/kw/devether.c
+++ b/sys/src/9/kw/devether.c
@@ -213,7 +213,7 @@
 static int
 etheroq(Ether* ether, Block* bp)
 {
-	int len, loopback, s;
+	int len, loopback;
 	Etherpkt *pkt;
 
 	ether->outpackets++;
@@ -230,19 +230,13 @@
 	pkt = (Etherpkt*)bp->rp;
 	len = BLEN(bp);
 	loopback = memcmp(pkt->d, ether->ea, sizeof(pkt->d)) == 0;
-	if(loopback || memcmp(pkt->d, ether->bcast, sizeof(pkt->d)) == 0 || ether->prom){
-		s = splhi();
-		etheriq(ether, bp, 0);
-		splx(s);
-	}
+	if(loopback || memcmp(pkt->d, ether->bcast, sizeof(pkt->d)) == 0 || ether->prom)
+		if(etheriq(ether, bp, loopback) == 0)
+			return len;
 
-	if(!loopback){
-		qbwrite(ether->oq, bp);
-		if(ether->transmit != nil)
-			ether->transmit(ether);
-	} else
-		freeb(bp);
-
+	qbwrite(ether->oq, bp);
+	if(ether->transmit != nil)
+		ether->transmit(ether);
 	return len;
 }
 
--- a/sys/src/9/mtx/devether.c
+++ b/sys/src/9/mtx/devether.c
@@ -204,7 +204,7 @@
 static int
 etheroq(Ether* ether, Block* bp)
 {
-	int len, loopback, s;
+	int len, loopback;
 	Etherpkt *pkt;
 
 	ether->outpackets++;
@@ -221,18 +221,13 @@
 	pkt = (Etherpkt*)bp->rp;
 	len = BLEN(bp);
 	loopback = memcmp(pkt->d, ether->ea, sizeof(pkt->d)) == 0;
-	if(loopback || memcmp(pkt->d, ether->bcast, sizeof(pkt->d)) == 0 || ether->prom){
-		s = splhi();
-		etheriq(ether, bp, 0);
-		splx(s);
-	}
+	if(loopback || memcmp(pkt->d, ether->bcast, sizeof(pkt->d)) == 0 || ether->prom)
+		if(etheriq(ether, bp, loopback) == 0)
+			return len;
 
-	if(!loopback){
-		qbwrite(ether->oq, bp);
+	qbwrite(ether->oq, bp);
+	if(ether->transmit != nil)
 		ether->transmit(ether);
-	} else
-		freeb(bp);
-
 	return len;
 }
 
--- a/sys/src/9/omap/devether.c
+++ b/sys/src/9/omap/devether.c
@@ -211,7 +211,7 @@
 static int
 etheroq(Ether* ether, Block* bp)
 {
-	int len, loopback, s;
+	int len, loopback;
 	Etherpkt *pkt;
 
 	ether->outpackets++;
@@ -228,19 +228,13 @@
 	pkt = (Etherpkt*)bp->rp;
 	len = BLEN(bp);
 	loopback = memcmp(pkt->d, ether->ea, sizeof(pkt->d)) == 0;
-	if(loopback || memcmp(pkt->d, ether->bcast, sizeof(pkt->d)) == 0 || ether->prom){
-		s = splhi();
-		etheriq(ether, bp, 0);
-		splx(s);
-	}
+	if(loopback || memcmp(pkt->d, ether->bcast, sizeof(pkt->d)) == 0 || ether->prom)
+		if(etheriq(ether, bp, loopback) == 0)
+			return len;
 
-	if(!loopback){
-		qbwrite(ether->oq, bp);
-		if(ether->transmit != nil)
-			ether->transmit(ether);
-	} else
-		freeb(bp);
-
+	qbwrite(ether->oq, bp);
+	if(ether->transmit != nil)
+		ether->transmit(ether);
 	return len;
 }
 
--- a/sys/src/9/pc/devether.c
+++ b/sys/src/9/pc/devether.c
@@ -217,7 +217,7 @@
 static int
 etheroq(Ether* ether, Block* bp)
 {
-	int len, loopback, s;
+	int len, loopback;
 	Etherpkt *pkt;
 
 	ether->outpackets++;
@@ -234,21 +234,13 @@
 	pkt = (Etherpkt*)bp->rp;
 	len = BLEN(bp);
 	loopback = memcmp(pkt->d, ether->ea, sizeof(pkt->d)) == 0;
-	if(loopback || memcmp(pkt->d, ether->bcast, sizeof(pkt->d)) == 0 || ether->prom){
-		s = splhi();
-		etheriq(ether, bp, 0);
-		splx(s);
-	}
+	if(loopback || memcmp(pkt->d, ether->bcast, sizeof(pkt->d)) == 0 || ether->prom)
+		if(etheriq(ether, bp, loopback) == 0)
+			return len;
 
-	if(!loopback){
-		if(qfull(ether->oq))
-			print("etheroq: WARNING: ether->oq full!\n");
-		qbwrite(ether->oq, bp);
-		if(ether->transmit != nil)
-			ether->transmit(ether);
-	} else
-		freeb(bp);
-
+	qbwrite(ether->oq, bp);
+	if(ether->transmit != nil)
+		ether->transmit(ether);
 	return len;
 }
 
--- a/sys/src/9/ppc/devether.c
+++ b/sys/src/9/ppc/devether.c
@@ -205,10 +205,11 @@
 static int
 etheroq(Ether* ether, Block* bp)
 {
-	int len, loopback, s;
+	int len, loopback;
 	Etherpkt *pkt;
 
 	ether->outpackets++;
+
 	/*
 	 * Check if the packet has to be placed back onto the input queue,
 	 * i.e. if it's a loopback or broadcast packet or the interface is
@@ -221,18 +222,13 @@
 	pkt = (Etherpkt*)bp->rp;
 	len = BLEN(bp);
 	loopback = memcmp(pkt->d, ether->ea, sizeof(pkt->d)) == 0;
-	if(loopback || memcmp(pkt->d, ether->bcast, sizeof(pkt->d)) == 0 || ether->prom){
-		s = splhi();
-		etheriq(ether, bp, 0);
-		splx(s);
-	}
+	if(loopback || memcmp(pkt->d, ether->bcast, sizeof(pkt->d)) == 0 || ether->prom)
+		if(etheriq(ether, bp, loopback) == 0)
+			return len;
 
-	if(!loopback){
-		qbwrite(ether->oq, bp);
+	qbwrite(ether->oq, bp);
+	if(ether->transmit != nil)
 		ether->transmit(ether);
-	} else
-		freeb(bp);
-
 	return len;
 }
 
--- a/sys/src/9/teg2/devether.c
+++ b/sys/src/9/teg2/devether.c
@@ -209,7 +209,7 @@
 static int
 etheroq(Ether* ether, Block* bp)
 {
-	int len, loopback, s;
+	int len, loopback;
 	Etherpkt *pkt;
 
 	ether->outpackets++;
@@ -226,19 +226,13 @@
 	pkt = (Etherpkt*)bp->rp;
 	len = BLEN(bp);
 	loopback = memcmp(pkt->d, ether->ea, sizeof(pkt->d)) == 0;
-	if(loopback || memcmp(pkt->d, ether->bcast, sizeof(pkt->d)) == 0 || ether->prom){
-		s = splhi();
-		etheriq(ether, bp, 0);
-		splx(s);
-	}
+	if(loopback || memcmp(pkt->d, ether->bcast, sizeof(pkt->d)) == 0 || ether->prom)
+		if(etheriq(ether, bp, loopback) == 0)
+			return len;
 
-	if(!loopback){
-		qbwrite(ether->oq, bp);
-		if(ether->transmit != nil)
-			ether->transmit(ether);
-	} else
-		freeb(bp);
-
+	qbwrite(ether->oq, bp);
+	if(ether->transmit != nil)
+		ether->transmit(ether);
 	return len;
 }
 
--