ref: ea6fea596b67dea542e7a1994b10473228118400
parent: 6946118644bc1d18e99de13b4a93b2026e3560a4
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;
}
--
⑨