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; }