]> git.lizzy.rs Git - plan9front.git/commitdiff
devether: mux bridges, portable netconsole
authorcinap_lenrek <cinap_lenrek@felloff.net>
Sun, 18 Feb 2018 18:56:01 +0000 (19:56 +0100)
committercinap_lenrek <cinap_lenrek@felloff.net>
Sun, 18 Feb 2018 18:56:01 +0000 (19:56 +0100)
39 files changed:
sys/src/9/kw/ether1116.c
sys/src/9/mtx/ether2114x.c
sys/src/9/omap/ether9221.c
sys/src/9/pc/ether2114x.c
sys/src/9/pc/ether79c970.c
sys/src/9/pc/ether8139.c
sys/src/9/pc/ether8169.c
sys/src/9/pc/ether82543gc.c
sys/src/9/pc/ether82557.c
sys/src/9/pc/ether82563.c
sys/src/9/pc/ether82598.c
sys/src/9/pc/ether83815.c
sys/src/9/pc/ether8390.c
sys/src/9/pc/etherbcm.c
sys/src/9/pc/etherdp83820.c
sys/src/9/pc/etherelnk3.c
sys/src/9/pc/etherga620.c
sys/src/9/pc/etherigbe.c
sys/src/9/pc/etherm10g.c
sys/src/9/pc/ethersmc.c
sys/src/9/pc/ethervgbe.c
sys/src/9/pc/ethervirtio.c
sys/src/9/pc/ethervt6102.c
sys/src/9/pc/ethervt6105m.c
sys/src/9/pc/etheryuk.c
sys/src/9/pc/fns.h
sys/src/9/pc/main.c
sys/src/9/pc/wavelan.c
sys/src/9/pc64/fns.h
sys/src/9/pc64/main.c
sys/src/9/port/devether.c
sys/src/9/port/etherif.h
sys/src/9/port/wifi.c
sys/src/9/ppc/etherfcc.c
sys/src/9/ppc/ethersaturn.c
sys/src/9/sgi/etherseeq.c
sys/src/9/teg2/ether8169.c
sys/src/9/xen/etherxen.c
sys/src/9/zynq/etherzynq.c

index 9987593f05c0accc409918833b81e30046d69c17..c5d14c933260bc0ea7159e167068d2419d4bd3f0 100644 (file)
@@ -643,7 +643,7 @@ receive(Ether *ether)
                 * in memory (mv-s104860-u0 ยง8.3.4.1)
                 */
                b->rp += 2;
-               etheriq(ether, b, 1);
+               etheriq(ether, b);
                etheractive(ether);
                if (i % (Nrx / 2) == 0) {
                        rxreplenish(ctlr);
index a02c0eb52691f4df942dd10fdf043b4c93ca611d..8906b3499cec69e83c8c8c5920a84090b528efd9 100644 (file)
@@ -468,7 +468,7 @@ interrupt(Ureg*, void* arg)
                                else if(bp = iallocb(Rbsz)){
                                        len = ((des->status & Fl)>>16)-4;
                                        des->bp->wp = des->bp->rp+len;
-                                       etheriq(ether, des->bp, 1);
+                                       etheriq(ether, des->bp);
                                        des->bp = bp;
                                        des->addr = PCIWADDR(bp->rp);
                                }
index 36ac8785b14b94ec11d19b19187f947ec3d2d940..bc092cc21ea40088a11f815f0ed2af1922ca624e 100644 (file)
@@ -642,7 +642,7 @@ smcreceive(Ether *edev)
 
                        /* and push the Block upstream */
                        if (ctlr->inited)
-                               etheriq(edev, bp, 1);
+                               etheriq(edev, bp);
                        else
                                freeb(bp);
 
index 6c4cdee9f593ccc6e4ca6aebce46e884ef07b368..57d426952ef700d791340b999a9b26524ee9dac1 100644 (file)
@@ -477,7 +477,7 @@ interrupt(Ureg*, void* arg)
                                else if(bp = iallocb(Rbsz)){
                                        len = ((des->status & Fl)>>16)-4;
                                        des->bp->wp = des->bp->rp+len;
-                                       etheriq(ether, des->bp, 1);
+                                       etheriq(ether, des->bp);
                                        des->bp = bp;
                                        des->addr = PCIWADDR(bp->rp);
                                }
index 21c35e23b8dc94a402f8ba9a601ed4acb6df8150..2d14ead90e3c65d75cfa8bf93a2e8185922e015d 100644 (file)
@@ -424,7 +424,7 @@ intrloop:
                                if(bb != nil){
                                        len = (dre->md2 & 0x0FFF)-4;
                                        bb->wp = bb->rp+len;
-                                       etheriq(ether, bb, 1);
+                                       etheriq(ether, bb);
                                }
                                dre->addr = PADDR(bp->rp);
                        }
index 588caea54693475678b362aa47b183323bb26b64..d62028ee0aa881f8ca4d6d3aaef3750cdb31673b 100644 (file)
@@ -583,7 +583,7 @@ rtl8139receive(Ether* edev)
                                bp->wp += length;
                        }
                        bp->wp -= 4;
-                       etheriq(edev, bp, 1);
+                       etheriq(edev, bp);
                }
 
                capr = ROUNDUP(capr, 4);
index 0fe6bc578d3312491ac9fcc89d557258a0aff72a..42068c5a06492afc47c9860318f531ce68fb12f3 100644 (file)
@@ -970,7 +970,7 @@ rtl8169receive(Ether* edev)
                                bp->flag |= Bipck;
                                break;
                        }
-                       etheriq(edev, bp, 1);
+                       etheriq(edev, bp);
                }else{
                        if(!(control & Res))
                                ctlr->frag++;
index 9d974aeea51fa630ca245215226ac4131b84af1a..4465d434a4ac7692e30f3a94203d1fadbeb78a46 100644 (file)
@@ -851,7 +851,7 @@ gc82543recv(Ether* edev, int icr)
                        ctlr->rb[rdh] = nil;
                        bp->wp += rdesc->length;
                        bp->next = nil;
-                       etheriq(edev, bp, 1);
+                       etheriq(edev, bp);
                }
 
                if(ctlr->rb[rdh] != nil){
index aaebd1916ee79df3b4facc79a7fc6fd8fde966c2..20a9bb7afd8132cb01af7b3e9a829f412b3f083a 100644 (file)
@@ -655,7 +655,7 @@ receive(Ether* ether)
                                bp = xbp;
                        }
                        if(pbp != nil)
-                               etheriq(ether, pbp, 1);
+                               etheriq(ether, pbp);
                }
                else{
                        rfd->count = 0;
index d792897fbf6afbf505ea0476621f4b1d0430354d..1fa71c6f600f06cb0f10cafd23d1d7d8b8951895 100644 (file)
@@ -1062,7 +1062,7 @@ i82563rproc(void *arg)
                                        bp->checksum = rd->checksum;
                                        bp->flag |= Bpktck;
                                }
-                               etheriq(edev, bp, 1);
+                               etheriq(edev, bp);
                        } else
                                freeb(bp);
                        ctlr->rb[rdh] = nil;
index 65c1d7fc6a43444e818a23e75543998ce1c58d5b..9a456fe7cb19c9b756740366571a74e653b60ffa 100644 (file)
@@ -584,7 +584,7 @@ loop1:
                b->checksum = r->cksum;
        }
 //     r->status = 0;
-       etheriq(e, b, 1);
+       etheriq(e, b);
        c->rdfree--;
        rdh = Next(rdh, m);
        goto loop1;                     /* UGH */
index 6d54d668a0a80bb97e2b4909674e8508ae7b29fe..5b7534ce70880cc0611d7c304f94b2a65aeeb38c 100644 (file)
@@ -545,7 +545,7 @@ interrupt(Ureg*, void* arg)
                                                freeb(des->bp);
                                        }else{
                                                des->bp->wp = des->bp->rp+len;
-                                               etheriq(ether, des->bp, 1);
+                                               etheriq(ether, des->bp);
                                        }
                                        des->bp = bp;
                                        des->addr = PADDR(bp->rp);
index 2df1e37e0a828a95476bdd6e5768cfd5b44640c8..16fa975f2a7489e2b8e8a7faf1145ac6f4fdd791 100644 (file)
@@ -439,7 +439,7 @@ receive(Ether* ether)
                        /*
                         * Copy the packet to whoever wants it.
                         */
-                       etheriq(ether, bp, 1);
+                       etheriq(ether, bp);
                }
 
                /*
index edb6b417e09524b17d6f342624c9a97fd58b0019..ab030f7dcd8ef7d73640c43b420e2c7b38e75c59 100644 (file)
@@ -414,7 +414,7 @@ bcmreceive(Ether *edev)
                if(pkt[3] & FrameError) {
                        freeb(bp); /* dump erroneous packets */ 
                } else {
-                       etheriq(edev, bp, 1);
+                       etheriq(edev, bp);
                }
        }
 }
index 3d1fb34574909c9ee8944dffe1faedf4cd86f6d6..8945ff459589dd1fa58a31d4a7e11551cc48d621 100644 (file)
@@ -839,7 +839,7 @@ dp83820interrupt(Ureg*, void* arg)
                                        bp = desc->bp;
                                        desc->bp = nil;
                                        bp->wp += cmdsts & SizeMASK;
-                                       etheriq(edev, bp, 1);
+                                       etheriq(edev, bp);
                                }
                                else if(0 && !(cmdsts & Ok)){
                                        iprint("dp83820: rx %8.8uX:", cmdsts);
index 46cd99269eb8b296158977b2df470bad437ed499..b71dd61adbb3eb454a743afa1a00a88a7eece0ac 100644 (file)
@@ -834,7 +834,7 @@ receive905(Ether* ether)
                else if(bp = iallocb(sizeof(Etherpkt)+4)){
                        len = pd->control & rxBytes;
                        pd->bp->wp = pd->bp->rp+len;
-                       etheriq(ether, pd->bp, 1);
+                       etheriq(ether, pd->bp);
                        pd->bp = bp;
                        pd->addr = PADDR(bp->rp);
                        coherence();
@@ -944,7 +944,7 @@ receive(Ether* ether)
                if(ctlr->busmaster == 1)
                        ctlr->rbp->wp = startdma(ether, PADDR(bp->rp));
 
-               etheriq(ether, ctlr->rbp, 1);
+               etheriq(ether, ctlr->rbp);
                ctlr->rbp = bp;
        }
 }
index bda3b9c28b41c8b80f4c2fbc3ab1498bde6c5213..372cc44cecdcfb4069520d46355e2805aa403d67 100644 (file)
@@ -626,7 +626,7 @@ ga620receive(Ether* edev)
                if(!(rbd->flags & Ferror) && len != 0){
                        bp = rbd->opaque;
                        bp->wp = bp->rp+len;
-                       etheriq(edev, bp, 1);
+                       etheriq(edev, bp);
                }
                else
                        freeb(rbd->opaque);
index bd7738d10521f70671795a4e625f6ec81fe9d218..f1bbceb0aa237e7e7b3867358e3e441e8fb608ea 100644 (file)
@@ -1142,7 +1142,7 @@ igberproc(void* arg)
                                        bp->checksum = rd->checksum;
                                        bp->flag |= Bpktck;
                                }
-                               etheriq(edev, bp, 1);
+                               etheriq(edev, bp);
                        }
                        else if(ctlr->rb[rdh] != nil){
                                freeb(ctlr->rb[rdh]);
index e4ddffb7c4e3f22dd17741a9dfee57ea86fa030c..fe55f3bc943aa5f419b958e9507abf38221db171 100644 (file)
@@ -1087,7 +1087,7 @@ m10rx(void *v)
                replenish(&c->bg);
                sleep(&c->rxrendez, rxcansleep, c);
                while(b = nextblock(c))
-                       etheriq(e, b, 1);
+                       etheriq(e, b);
        }
 }
 
index 627632a9a20279cb80d81b186f7b5a4a5b671cd2..1241c605ac76320a506d79f3d28f0c6449969f29 100644 (file)
@@ -405,7 +405,7 @@ receive(Ether* ether)
                bp->wp++;
        }
          
-       etheriq(ether, bp, 1);
+       etheriq(ether, bp);
        ether->inpackets++;
        outs(port + MmuCmd, McRelease);
 }
index 9932653993e8012b2c65f2c582bd697aaea439e1..61e9902335d4fcec7fcdb9ec4dd6059a7e1fd612 100644 (file)
@@ -531,7 +531,7 @@ vgberxeof(Ether* edev)
                        /* plant new block, might fail if out of memory */
                        if(vgbenewrx(ctlr, i) == 0){
                                block->wp = block->rp + length;
-                               etheriq(edev, block, 1);
+                               etheriq(edev, block);
                                continue;
                        }
                }
index c3463fa207e6a9ac50a6560c1cf8d009c5b17fe5..99241f28e84ff2ef77ce12cc6b4c678d37bf0d16 100644 (file)
@@ -325,7 +325,7 @@ rxproc(void *v)
                        blocks[i] = nil;
 
                        b->wp = b->rp + u->len - VheaderSize;
-                       etheriq(edev, b, 1);
+                       etheriq(edev, b);
                        q->lastused++;
                }
        }
index 30862c3ca68529cb322f953f49c4096f6da0a3d3..ef419636822a814ce03a9731a66a1647289465ec 100644 (file)
@@ -720,7 +720,7 @@ vt6102receive(Ether* edev)
                else if(bp = iallocb(Rdbsz+3)){
                        len = ((ds->status & LengthMASK)>>LengthSHIFT)-4;
                        ds->bp->wp = ds->bp->rp+len;
-                       etheriq(edev, ds->bp, 1);
+                       etheriq(edev, ds->bp);
                        bp->rp = (uchar*)ROUNDUP((ulong)bp->rp, 4);
                        ds->addr = PCIWADDR(bp->rp);
                        ds->bp = bp;
index 19ee569e9b8dfaabd4e08ae28c3752f6bb6df47d..10c047d5db9c11b063a3f56e994cf35159e7c145 100644 (file)
@@ -865,7 +865,7 @@ vt6105Mreceive(Ether* edev)
                        }
                        len = ((ds->status & LengthMASK)>>LengthSHIFT)-4;
                        ds->bp->wp = ds->bp->rp+len;
-                       etheriq(edev, ds->bp, 1);
+                       etheriq(edev, ds->bp);
                        bp->rp = (uchar*)ROUNDUP((ulong)bp->rp, 4);
                        ds->addr = PCIWADDR(bp->rp);
                        ds->bp = bp;
index edfbfbd8cc558423ed1d8576d052ca6ed337cb9a..f4c9dff9240fbc50511e225479e21f82792c67b6 100644 (file)
@@ -1430,7 +1430,7 @@ rx(Ether *e, uint l, uint x, uint flag)
        }else{
                b->wp += l;
                b->flag |= flag;
-               etheriq(e, b, 1);
+               etheriq(e, b);
        }
        unstarve(&c->rxmit);
 }
index 467cb2684f6a231937d180dd5e40a418130fc656..c96d4c3d7a6b9920a10e698439cf3688f96d3b76 100644 (file)
@@ -113,7 +113,6 @@ char*       mtrr(uvlong, uvlong, char *);
 void   mtrrclock(void);
 int    mtrrprint(char *, long);
 void   mtrrsync(void);
-void   netconsole(void);
 uchar  nvramread(int);
 void   nvramwrite(int, uchar);
 void   outb(int, int);
index fa4d9be9da23cde9498554f85f3a6e700c6ece44..3ef3d773e2228f8a100fde7713765cd1ddde3731 100644 (file)
@@ -60,7 +60,6 @@ main(void)
        }else
                links();
        chandevreset();
-       netconsole();
        pageinit();
        userinit();
        schedinit();
index abd616c0709de011271c54d4293a957a7c8203b0..e2df7acd08f3e02910807b631707d64cb05356c6 100644 (file)
@@ -452,7 +452,7 @@ w_rxdone(Ether* ether)
        }
 
        ctlr->nrx++;
-       etheriq(ether,bp,1);
+       etheriq(ether, bp);
        ctlr->signal = ((ctlr->signal*15)+((f.qinfo>>8) & 0xFF))/16;
        ctlr->noise = ((ctlr->noise*15)+(f.qinfo & 0xFF))/16;
        return;
index f785a328a47c5d660892df293a07ebc9c72ed29f..cc7c66a2d7fe92d79bf2fd5cf4ca795a13e803b4 100644 (file)
@@ -111,7 +111,6 @@ char*       mtrr(uvlong, uvlong, char *);
 void   mtrrclock(void);
 int    mtrrprint(char *, long);
 void   mtrrsync(void);
-void   netconsole(void);
 void   noteret(void);
 uchar  nvramread(int);
 void   nvramwrite(int, uchar);
index c6580c63df3c880f7eeed44971da9a29c13482b8..175f809bc18831bc346b5d1ea2b11715839cfcf3 100644 (file)
@@ -329,7 +329,6 @@ main()
        }else
                links();
        chandevreset();
-       netconsole();
        preallocpages();
        pageinit();
        userinit();
index 46fb55aed08689e3c406fb1a0c676dc6155a1a2c..766242e016c2f32aff45463493667031656e339c 100644 (file)
@@ -11,6 +11,7 @@
 #include "../port/etherif.h"
 
 extern int eipfmt(Fmt*);
+extern ushort ipcsum(uchar *);
 
 static Ether *etherxx[MaxEther];
 
@@ -70,7 +71,12 @@ ethercreate(Chan*, char*, int, ulong)
 static void
 etherclose(Chan* chan)
 {
-       netifclose(etherxx[chan->dev], chan);
+       Ether *ether = etherxx[chan->dev];
+
+       if(NETTYPE(chan->qid.path) == Ndataqid && ether->f[NETID(chan->qid.path)]->bridge)
+               memset(ether->mactab, 0, sizeof(ether->mactab));
+
+       netifclose(ether, chan);
 }
 
 static long
@@ -109,152 +115,154 @@ etherwstat(Chan* chan, uchar* dp, int n)
 static void
 etherrtrace(Netfile* f, Etherpkt* pkt, int len)
 {
-       int i, n;
        Block *bp;
 
        if(qwindow(f->in) <= 0)
                return;
-       if(len > 58)
-               n = 58;
-       else
-               n = len;
        bp = iallocb(64);
        if(bp == nil)
                return;
-       memmove(bp->wp, pkt->d, n);
-       i = TK2MS(MACHP(0)->ticks);
-       bp->wp[58] = len>>8;
-       bp->wp[59] = len;
-       bp->wp[60] = i>>24;
-       bp->wp[61] = i>>16;
-       bp->wp[62] = i>>8;
-       bp->wp[63] = i;
+       memmove(bp->wp, pkt, len < 64 ? len : 64);
+       if(f->type != -2){
+               u32int ms = TK2MS(MACHP(0)->ticks);
+               bp->wp[58] = len>>8;
+               bp->wp[59] = len;
+               bp->wp[60] = ms>>24;
+               bp->wp[61] = ms>>16;
+               bp->wp[62] = ms>>8;
+               bp->wp[63] = ms;
+       }
        bp->wp += 64;
        qpass(f->in, bp);
 }
 
-Block*
-etheriq(Ether* ether, Block* bp, int fromwire)
+static Macent*
+macent(Ether *ether, uchar *ea)
 {
-       Etherpkt *pkt;
-       ushort type;
-       int len, multi, tome, fromme;
-       Netfile **ep, *f, **fp, *fx;
-       Block *xbp;
+       u32int h = (ea[0] | ea[1]<<8 | ea[2]<<16 | ea[3]<<24) ^ (ea[4] | ea[5]<<8);
+       return &ether->mactab[h % nelem(ether->mactab)];
+}
 
-       ether->inpackets++;
+/*
+ * Multiplex the packet to all the connections which want it.
+ * If the packet is not to be used subsequently (tome || from == nil),
+ * attempt to simply pass it into one of the connections, thereby
+ * saving a copy of the data (usual case hopefully).
+ */
+static Block*
+ethermux(Ether *ether, Block *bp, Netfile **from)
+{
+       Block *xbp;
+       Etherpkt *pkt;
+       Netfile *f, *x, **fp;
+       int len, multi, tome, port, type, dispose;
 
-       pkt = (Etherpkt*)bp->rp;
        len = BLEN(bp);
-       type = (pkt->type[0]<<8)|pkt->type[1];
-       fx = 0;
-       ep = &ether->f[Ntypes];
-
-       multi = pkt->d[0] & 1;
-       /* check for valid multicast addresses */
-       if(multi && memcmp(pkt->d, ether->bcast, sizeof(pkt->d)) != 0 && ether->prom == 0){
-               if(!activemulti(ether, pkt->d, sizeof(pkt->d))){
-                       if(fromwire){
-                               freeb(bp);
-                               bp = 0;
-                       }
+       if(len < ETHERHDRSIZE)
+               goto Drop;
+       pkt = (Etherpkt*)bp->rp;
+       if(!(multi = pkt->d[0] & 1)){
+               tome = memcmp(pkt->d, ether->ea, Eaddrlen) == 0;
+               if(!tome && from != nil && ether->prom == 0)
                        return bp;
-               }
+       } else {
+               tome = 0;
+               if(from == nil && ether->prom == 0
+               && memcmp(pkt->d, ether->bcast, Eaddrlen) != 0
+               && !activemulti(ether, pkt->d, Eaddrlen))
+                       goto Drop;
        }
 
-       /* is it for me? */
-       tome = memcmp(pkt->d, ether->ea, sizeof(pkt->d)) == 0;
-       fromme = memcmp(pkt->s, ether->ea, sizeof(pkt->s)) == 0;
-
-       /*
-        * Multiplex the packet to all the connections which want it.
-        * If the packet is not to be used subsequently (fromwire != 0),
-        * attempt to simply pass it into one of the connections, thereby
-        * saving a copy of the data (usual case hopefully).
-        */
-       for(fp = ether->f; fp < ep; fp++){
-               if(f = *fp)
-               if(f->type == type || f->type < 0)
-               if(tome || multi || f->prom){
-                       /* Don't want to hear loopback or bridged packets */
-                       if(f->bridge && (tome || !fromwire && !fromme))
-                               continue;
-                       if(!f->headersonly){
-                               if(fromwire && fx == 0)
-                                       fx = f;
-                               else if(xbp = iallocb(len)){
-                                       memmove(xbp->wp, pkt, len);
-                                       xbp->wp += len;
-                                       xbp->flag = bp->flag;
-                                       if(qpass(f->in, xbp) < 0) {
-                                               // print("soverflow for f->in\n");
-                                               ether->soverflows++;
-                                       }
-                               }
-                               else {
-                                       // print("soverflow iallocb\n");
-                                       ether->soverflows++;
-                               }
-                       }
-                       else
-                               etherrtrace(f, pkt, len);
+       port = -1;
+       if(ether->prom){
+               if((from == nil || (*from)->bridge) && (pkt->s[0] & 1) == 0){
+                       Macent *t = macent(ether, pkt->s);
+                       t->port = from == nil ? 0 : 1+(from - ether->f);
+                       memmove(t->ea, pkt->s, Eaddrlen);
+               }
+               if(!tome && !multi){
+                       Macent *t = macent(ether, pkt->d);
+                       if(memcmp(t->ea, pkt->d, Eaddrlen) == 0)
+                               port = t->port;
                }
        }
 
-       if(fx){
-               if(qpass(fx->in, bp) < 0) {
-                       // print("soverflow for fx->in\n");
-                       ether->soverflows++;
+       x = nil;
+       type = (pkt->type[0]<<8)|pkt->type[1];
+       dispose = tome || from == nil || port > 0;
+
+       for(fp = ether->f; fp < &ether->f[Ntypes]; fp++){
+               if((f = *fp) == nil)
+                       continue;
+               if(f->type != type && f->type >= 0)
+                       continue;
+               if(!tome && !multi && !f->prom)
+                       continue;
+               if(f->bridge){
+                       if(tome || fp == from)
+                               continue;
+                       if(port >= 0 && port != 1+(fp - ether->f))
+                               continue;
+               }
+               if(f->headersonly || f->type == -2){
+                       etherrtrace(f, pkt, len);
+                       continue;
                }
-               return 0;
+               if(dispose && x == nil)
+                       x = f;
+               else if((xbp = iallocb(len)) != nil){
+                       memmove(xbp->wp, pkt, len);
+                       xbp->wp += len;
+                       xbp->flag = bp->flag;
+                       if(qpass(f->in, xbp) < 0)
+                               ether->soverflows++;
+               } else
+                       ether->soverflows++;
        }
-       if(fromwire){
-               freeb(bp);
-               return 0;
+       if(x != nil){
+               if(qpass(x->in, bp) < 0)
+                       ether->soverflows++;
+               return nil;
        }
 
+       if(dispose){
+Drop:          freeb(bp);
+               return nil;
+       }
        return bp;
 }
 
-static int
-etheroq(Ether* ether, Block* bp)
+void
+etheriq(Ether* ether, Block* bp)
 {
-       int len, loopback;
-       Etherpkt *pkt;
+       ether->inpackets++;
+       ethermux(ether, bp, nil);
+}
 
-       ether->outpackets++;
+static void
+etheroq(Ether* ether, Block* bp, Netfile **from)
+{
+       if((*from)->bridge == 0)
+               memmove(((Etherpkt*)bp->rp)->s, ether->ea, Eaddrlen);
 
-       /*
-        * 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
-        * in promiscuous mode.
-        * If it's a loopback packet indicate to etheriq that the data isn't
-        * needed and return, etheriq will pass-on or free the block.
-        * To enable bridging to work, only packets that were originated
-        * by this interface are fed back.
-        */
-       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)
-               if(etheriq(ether, bp, loopback) == 0)
-                       return len;
+       bp = ethermux(ether, bp, from);
+       if(bp == nil)
+               return;
 
+       ether->outpackets++;
        qbwrite(ether->oq, bp);
        if(ether->transmit != nil)
                ether->transmit(ether);
-       return len;
 }
 
 static long
 etherwrite(Chan* chan, void* buf, long n, vlong)
 {
-       Ether *ether;
+       Ether *ether = etherxx[chan->dev];
        Block *bp;
        int nn, onoff;
        Cmdbuf *cb;
 
-       ether = etherxx[chan->dev];
        if(NETTYPE(chan->qid.path) != Ndataqid) {
                nn = netifwrite(ether, chan, buf, n);
                if(nn >= 0)
@@ -287,21 +295,19 @@ etherwrite(Chan* chan, void* buf, long n, vlong)
                nexterror();
        }
        memmove(bp->rp, buf, n);
-       if(!ether->f[NETID(chan->qid.path)]->bridge)
-               memmove(bp->rp+Eaddrlen, ether->ea, Eaddrlen);
        poperror();
        bp->wp += n;
 
-       return etheroq(ether, bp);
+       etheroq(ether, bp, &ether->f[NETID(chan->qid.path)]);
+       return n;
 }
 
 static long
 etherbwrite(Chan* chan, Block* bp, ulong)
 {
        Ether *ether;
-       long n;
+       long n = BLEN(bp);
 
-       n = BLEN(bp);
        if(NETTYPE(chan->qid.path) != Ndataqid){
                if(waserror()) {
                        freeb(bp);
@@ -312,8 +318,8 @@ etherbwrite(Chan* chan, Block* bp, ulong)
                freeb(bp);
                return n;
        }
-       ether = etherxx[chan->dev];
 
+       ether = etherxx[chan->dev];
        if(n > ether->maxmtu){
                freeb(bp);
                error(Etoobig);
@@ -322,8 +328,8 @@ etherbwrite(Chan* chan, Block* bp, ulong)
                freeb(bp);
                error(Etoosmall);
        }
-
-       return etheroq(ether, bp);
+       etheroq(ether, bp, &ether->f[NETID(chan->qid.path)]);
+       return n;
 }
 
 static struct {
@@ -422,6 +428,8 @@ etherprobe(int cardno, int ctlrno)
        return ether;
 }
 
+static void netconsole(int);
+
 static void
 etherreset(void)
 {
@@ -436,22 +444,23 @@ etherreset(void)
                etherxx[ctlrno] = ether;
        }
 
-       if(getconf("*noetherprobe"))
-               return;
-
-       cardno = ctlrno = 0;
-       while(cards[cardno].type != nil && ctlrno < MaxEther){
-               if(etherxx[ctlrno] != nil){
+       if(getconf("*noetherprobe") == nil){
+               cardno = ctlrno = 0;
+               while(cards[cardno].type != nil && ctlrno < MaxEther){
+                       if(etherxx[ctlrno] != nil){
+                               ctlrno++;
+                               continue;
+                       }
+                       if((ether = etherprobe(cardno, ctlrno)) == nil){
+                               cardno++;
+                               continue;
+                       }
+                       etherxx[ctlrno] = ether;
                        ctlrno++;
-                       continue;
-               }
-               if((ether = etherprobe(cardno, ctlrno)) == nil){
-                       cardno++;
-                       continue;
                }
-               etherxx[ctlrno] = ether;
-               ctlrno++;
        }
+
+       netconsole(1);
 }
 
 static void
@@ -460,6 +469,8 @@ ethershutdown(void)
        Ether *ether;
        int i;
 
+       netconsole(0);
+
        for(i = 0; i < MaxEther; i++){
                ether = etherxx[i];
                if(ether == nil)
@@ -524,9 +535,7 @@ struct Netconsole {
 };
 static Netconsole *netcons;
 
-extern ushort ipcsum(uchar *);
-
-void
+static void
 netconsputc(Uart *, int c)
 {
        char *p;
@@ -556,13 +565,11 @@ netconsputc(Uart *, int c)
                netcons->ether->transmit(netcons->ether);
 }
 
-PhysUart netconsphys = {
-       .putc = netconsputc,
-};
-Uart netconsuart = { .phys = &netconsphys };
+static PhysUart netconsphys = { .putc = netconsputc };
+static Uart netconsuart = { .phys = &netconsphys };
 
-void
-netconsole(void)
+static void
+netconsole(int on)
 {
        char *p;
        char *r;
@@ -572,8 +579,15 @@ netconsole(void)
        u64int dstmac;
        Netconsole *nc;
 
+       if(!on){
+               if(consuart == &netconsuart)
+                       consuart = nil;
+               return;
+       }
+
        if((p = getconf("console")) == nil || strncmp(p, "net ", 4) != 0)
                return;
+
        p += 4;
        for(i = 0; i < 4; i++){
                srcip[i] = strtol(p, &r, 0);
index f722b910828daeb6bef8b9f55a49b7234bdb827f..d846eb5827eacbd6d7f662260a16ab91204df0e5 100644 (file)
@@ -3,6 +3,13 @@ enum {
        Ntypes          = 8,
 };
 
+typedef struct Macent Macent;
+struct Macent
+{
+       uchar   ea[Eaddrlen];
+       ushort  port;
+};
+
 typedef struct Ether Ether;
 struct Ether {
        ISAConf;                        /* hardware info */
@@ -11,7 +18,6 @@ struct Ether {
        int     ctlrno;
        int     minmtu;
        int     maxmtu;
-       uchar   ea[Eaddrlen];
 
        void    (*attach)(Ether*);      /* filled in by reset routine */
        void    (*detach)(Ether*);
@@ -25,9 +31,12 @@ struct Ether {
        Queue*  oq;
 
        Netif;
+
+       uchar   ea[Eaddrlen];
+       Macent  mactab[127];            /* for bridge */
 };
 
-extern Block* etheriq(Ether*, Block*, int);
+extern void etheriq(Ether*, Block*);
 extern void addethercard(char*, int(*)(Ether*));
 extern ulong ethercrc(uchar*, int);
 extern int parseether(uchar*, char*);
index cd70b2ad471fbb09cb36906c2bc33085d4247866..67fa5fc46dec489b47fe201192efbf8c86e0d16d 100644 (file)
@@ -139,7 +139,7 @@ wifiiq(Wifi *wifi, Block *b)
 
                dmatproxy(b, 0, wifi->ether->ea, &wifi->dmat);
 
-               etheriq(wifi->ether, b, 1);
+               etheriq(wifi->ether, b);
                return;
        }
 drop:
index ca254bf45263614a110839bd469375288427aede..9628db16d80785450fa7b9a004efe0d399bc9cc6 100644 (file)
@@ -367,7 +367,7 @@ interrupt(Ureg*, void *arg)
                                dczap(b->rp, len);
                                if(nb = iallocb(Bufsize)){
                                        b->wp += len;
-                                       etheriq(ether, b, 1);
+                                       etheriq(ether, b);
                                        b = nb;
                                        b->rp = (uchar*)(((ulong)b->rp + CACHELINESZ-1) & ~(CACHELINESZ-1));
                                        b->wp = b->rp;
index a439b4215612b5f18f8fe89dd69b1d4af89cb065..9c9a6a966d619ffa19fb72a6adb7fd5b2d93f1ab 100644 (file)
@@ -176,7 +176,7 @@ interrupt(Ureg*, void*arg)
                                memmove(b->wp, pkt, len+sizeof(ushort));
                                b->rp += sizeof(ushort);
                                b->wp = b->rp + len;
-                               etheriq(ether, b, 1);
+                               etheriq(ether, b);
                        }else
                                ether->soverflows++;
                        rx=*ersr&Ersr_rxfpmask;
index 52d77b17f0e63c8ba754f2ce0f81b242f3b1af7a..701dcb09a86709a5d1f58bf3c42f6c0458b8b417 100644 (file)
@@ -250,7 +250,7 @@ rxproc(void *arg)
                        b = allocb(n);
                        b->wp += n;
                        memmove(b->rp, p->base+2, n);
-                       etheriq(edev, b, 1);
+                       etheriq(edev, b);
                }
                p->addr = PADDR(p->base);
                p->count = Ioc|Empty|Rbsize;
index 1af17840b37d29fb38326744aac9e992d0012f01..bd04f15f3da172db2b45727de87c73d2b72dca2f 100644 (file)
@@ -828,7 +828,7 @@ qpkt(Ether *edev, int rdh, ulong control)
 
        allcache->invse(bp->rp, len);   /* clear any stale cached packet */
        ckrderrs(ctlr, bp, control);
-       etheriq(edev, bp, 1);
+       etheriq(edev, bp);
 
        if(Debug > 1)
                iprint("R%d ", len);
index 62d5e5de55d1718e60f4c0a410a592fdaf37972a..8d3fc4c26d7797533271956dd393b3851683fbb3 100644 (file)
@@ -248,7 +248,7 @@ vifrecvdone(Ether *ether, netif_rx_response_t *rr)
        bp->list = 0;
        if (rr->flags & NETRXF_data_validated)
                bp->flag |= Btcpck|Budpck;
-       etheriq(ether, bp, 1);
+       etheriq(ether, bp);
        return 0;
 }
 
index 0a7465c87e79274f8a445f5863f088085737b75b..709dad0b7f470401ac57433676c1a7a0f4f375b5 100644 (file)
@@ -235,7 +235,7 @@ ethrx(Ether *edev)
                bp->wp = bp->rp + (r[1] & 0x1fff);
                invaldse(bp->rp, bp->wp);
                inval2pa(PADDR(bp->rp), PADDR(bp->wp));
-               etheriq(edev, bp, 1);
+               etheriq(edev, bp);
                c->rxconsi = (c->rxconsi + 1) & (RXRING - 1);
                replenish(c);
        }