From ea6fea596b67dea542e7a1994b10473228118400 Mon Sep 17 00:00:00 2001 From: cinap_lenrek Date: Mon, 16 Dec 2013 19:19:15 +0100 Subject: [PATCH] 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. --- sys/src/9/bitsy/devether.c | 17 ++++++----------- sys/src/9/kw/devether.c | 20 +++++++------------- sys/src/9/mtx/devether.c | 17 ++++++----------- sys/src/9/omap/devether.c | 20 +++++++------------- sys/src/9/pc/devether.c | 22 +++++++--------------- sys/src/9/ppc/devether.c | 18 +++++++----------- sys/src/9/teg2/devether.c | 20 +++++++------------- 7 files changed, 47 insertions(+), 87 deletions(-) diff --git a/sys/src/9/bitsy/devether.c b/sys/src/9/bitsy/devether.c index 457c09e22..fe117f8a6 100644 --- a/sys/src/9/bitsy/devether.c +++ b/sys/src/9/bitsy/devether.c @@ -414,7 +414,7 @@ etheriq(Ether* ether, Block* bp, int fromwire) static int etheroq(Ether* ether, Block* bp) { - int len, loopback, s; + int len, loopback; Etherpkt *pkt; ether->outpackets++; @@ -431,18 +431,13 @@ etheroq(Ether* ether, Block* bp) 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; } diff --git a/sys/src/9/kw/devether.c b/sys/src/9/kw/devether.c index 63d06f62c..df59c22b1 100644 --- a/sys/src/9/kw/devether.c +++ b/sys/src/9/kw/devether.c @@ -213,7 +213,7 @@ etheriq(Ether* ether, Block* bp, int fromwire) static int etheroq(Ether* ether, Block* bp) { - int len, loopback, s; + int len, loopback; Etherpkt *pkt; ether->outpackets++; @@ -230,19 +230,13 @@ etheroq(Ether* ether, Block* bp) 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){ - qbwrite(ether->oq, bp); - if(ether->transmit != nil) - ether->transmit(ether); - } else - freeb(bp); + if(loopback || memcmp(pkt->d, ether->bcast, sizeof(pkt->d)) == 0 || ether->prom) + if(etheriq(ether, bp, loopback) == 0) + return len; + qbwrite(ether->oq, bp); + if(ether->transmit != nil) + ether->transmit(ether); return len; } diff --git a/sys/src/9/mtx/devether.c b/sys/src/9/mtx/devether.c index 8a5457954..51c63857d 100644 --- a/sys/src/9/mtx/devether.c +++ b/sys/src/9/mtx/devether.c @@ -204,7 +204,7 @@ etheriq(Ether* ether, Block* bp, int fromwire) static int etheroq(Ether* ether, Block* bp) { - int len, loopback, s; + int len, loopback; Etherpkt *pkt; ether->outpackets++; @@ -221,18 +221,13 @@ etheroq(Ether* ether, Block* bp) 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; } diff --git a/sys/src/9/omap/devether.c b/sys/src/9/omap/devether.c index 0fd506792..de03504d9 100644 --- a/sys/src/9/omap/devether.c +++ b/sys/src/9/omap/devether.c @@ -211,7 +211,7 @@ etheriq(Ether* ether, Block* bp, int fromwire) static int etheroq(Ether* ether, Block* bp) { - int len, loopback, s; + int len, loopback; Etherpkt *pkt; ether->outpackets++; @@ -228,19 +228,13 @@ etheroq(Ether* ether, Block* bp) 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){ - qbwrite(ether->oq, bp); - if(ether->transmit != nil) - ether->transmit(ether); - } else - freeb(bp); + if(loopback || memcmp(pkt->d, ether->bcast, sizeof(pkt->d)) == 0 || ether->prom) + if(etheriq(ether, bp, loopback) == 0) + return len; + qbwrite(ether->oq, bp); + if(ether->transmit != nil) + ether->transmit(ether); return len; } diff --git a/sys/src/9/pc/devether.c b/sys/src/9/pc/devether.c index 91d1c8574..3fe9d9645 100644 --- a/sys/src/9/pc/devether.c +++ b/sys/src/9/pc/devether.c @@ -217,7 +217,7 @@ etheriq(Ether* ether, Block* bp, int fromwire) static int etheroq(Ether* ether, Block* bp) { - int len, loopback, s; + int len, loopback; Etherpkt *pkt; ether->outpackets++; @@ -234,21 +234,13 @@ etheroq(Ether* ether, Block* bp) 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){ - 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); + if(loopback || memcmp(pkt->d, ether->bcast, sizeof(pkt->d)) == 0 || ether->prom) + if(etheriq(ether, bp, loopback) == 0) + return len; + qbwrite(ether->oq, bp); + if(ether->transmit != nil) + ether->transmit(ether); return len; } diff --git a/sys/src/9/ppc/devether.c b/sys/src/9/ppc/devether.c index 2f8553932..112a581b4 100644 --- a/sys/src/9/ppc/devether.c +++ b/sys/src/9/ppc/devether.c @@ -205,10 +205,11 @@ etheriq(Ether* ether, Block* bp, int fromwire) 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 @@ etheroq(Ether* ether, Block* bp) 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; } diff --git a/sys/src/9/teg2/devether.c b/sys/src/9/teg2/devether.c index 04bce26a9..eb0ae1b21 100644 --- a/sys/src/9/teg2/devether.c +++ b/sys/src/9/teg2/devether.c @@ -209,7 +209,7 @@ etheriq(Ether* ether, Block* bp, int fromwire) static int etheroq(Ether* ether, Block* bp) { - int len, loopback, s; + int len, loopback; Etherpkt *pkt; ether->outpackets++; @@ -226,19 +226,13 @@ etheroq(Ether* ether, Block* bp) 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){ - qbwrite(ether->oq, bp); - if(ether->transmit != nil) - ether->transmit(ether); - } else - freeb(bp); + if(loopback || memcmp(pkt->d, ether->bcast, sizeof(pkt->d)) == 0 || ether->prom) + if(etheriq(ether, bp, loopback) == 0) + return len; + qbwrite(ether->oq, bp); + if(ether->transmit != nil) + ether->transmit(ether); return len; }