From 05aeb87282c9ed4cdab5258812a64531c1c39c6d Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Tue, 14 May 2002 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 2002-05-14 --- boot/bootip.c | 2 +- ip/devip.c | 5 +++++ ip/ethermedium.c | 16 +++++++++++++--- ip/ip.h | 2 ++ pc/pci.c | 13 +++++++------ 5 files changed, 28 insertions(+), 10 deletions(-) diff --git a/boot/bootip.c b/boot/bootip.c index c330f8666a13577401a7ddec925175b21cae4b4d..e2f67d9b0476de857819bb6632ca0b845b4ada0d 100644 --- a/boot/bootip.c +++ b/boot/bootip.c @@ -134,7 +134,7 @@ void configil(Method*) { configip(); - setauthaddr("il", 566); + setauthaddr("tcp", 567); } int diff --git a/ip/devip.c b/ip/devip.c index 18b9f338e0e48671254673b148fa4a945be508a2..b3320538d2d81ad9519794156495483c70139048 100644 --- a/ip/devip.c +++ b/ip/devip.c @@ -143,6 +143,7 @@ ip1gen(Chan *c, int i, Dir *dp) case Qndb: p = "ndb"; len = strlen(f->ndb); + q.vers = f->ndbvers; break; case Qiproute: p = "iproute"; @@ -160,6 +161,8 @@ ip1gen(Chan *c, int i, Dir *dp) break; } devdir(c, q, p, len, network, prot, dp); + if(i == Qndb) + dp->mtime = f->ndbmtime; return 1; } @@ -1348,6 +1351,8 @@ ndbwrite(Fs *f, char *a, ulong off, int n) error(Eio); memmove(f->ndb+off, a, n); f->ndb[off+n] = 0; + f->ndbvers++; + f->ndbmtime = seconds(); return n; } diff --git a/ip/ethermedium.c b/ip/ethermedium.c index dcf9493705dd47c560acd43c8fd4dcd52a142731..7eb62ea2ebf95991cd02735580beb9435140eb4c 100644 --- a/ip/ethermedium.c +++ b/ip/ethermedium.c @@ -550,6 +550,16 @@ recvarp(Ipifc *ifc) break; case ARPREPLY: + /* check for machine using my ip address */ + v4tov6(ip, e->spa); + if(iplocalonifc(ifc, ip) || ipproxyifc(er->f, ifc, ip)){ + if(memcmp(e->sha, ifc->mac, sizeof(e->sha)) != 0){ + print("arprep: 0x%E/0x%E also has ip addr %V\n", + e->s, e->sha, e->spa); + break; + } + } + arpenter(er->f, V4, e->spa, e->sha, sizeof(e->sha), 0); break; @@ -558,14 +568,14 @@ recvarp(Ipifc *ifc) if(ifc->lifc == 0) break; - /* check for someone that think's they're me */ + /* check for machine using my ip or ether address */ v4tov6(ip, e->spa); if(iplocalonifc(ifc, ip) || ipproxyifc(er->f, ifc, ip)){ if(memcmp(e->sha, ifc->mac, sizeof(e->sha)) != 0) - print("arp: 0x%E also has ip addr %V\n", e->sha, e->spa); + print("arpreq: 0x%E also has ip addr %V\n", e->sha, e->spa); } else { if(memcmp(e->sha, ifc->mac, sizeof(e->sha)) == 0){ - print("arp: %V also has ether addr %E\n", e->spa, e->sha); + print("arpreq: %V also has ether addr %E\n", e->spa, e->sha); break; } } diff --git a/ip/ip.h b/ip/ip.h index d72b9f2e7964bbb8739eadd665efc93a77e3797c..e4ece284eb906f24aeca093c05248d8d6f83395f 100644 --- a/ip/ip.h +++ b/ip/ip.h @@ -335,6 +335,8 @@ struct Fs Ifclog *ilog; char ndb[1024]; /* an ndb entry for this interface */ + int ndbvers; + long ndbmtime; }; /* one per default router known to host */ diff --git a/pc/pci.c b/pc/pci.c index eecffe97bdfbbfb84c891bb4c6d875e89c3247a5..5ae68e6ba6e414ed64f2c3df2acb9940f1f098ac 100644 --- a/pc/pci.c +++ b/pc/pci.c @@ -669,7 +669,7 @@ pcirouting(void) router_t *r; int size, i, fn, tbdf; Pcidev *sbpci, *pci; - uchar *p, *m, pin, irq; + uchar *p, *m, pin, irq, link; // Search for PCI interrupt routing table in BIOS for(p = (uchar *)KADDR(0xf0000); p < (uchar *)KADDR(0xfffff); p += 16) @@ -723,16 +723,17 @@ pcirouting(void) continue; m = &e->e_maps[(pin - 1) * 3]; - irq = southbridge->get(sbpci, m[0]); + link = m[0]; + irq = southbridge->get(sbpci, link); if(irq == 0 || irq == pci->intl) continue; if(pci->intl != 0 && pci->intl != 0xFF) { - print("pcirouting: BIOS workaround: %T at pin %d irq %d -> %d\n", - tbdf, pin, irq, pci->intl); - southbridge->set(sbpci, m[0], pci->intl); + print("pcirouting: BIOS workaround: %T at pin %d link %d irq %d -> %d\n", + tbdf, pin, link, irq, pci->intl); + southbridge->set(sbpci, link, pci->intl); continue; } - print("pcirouting: %T at pin %d irq %d\n", tbdf, pin, irq); + print("pcirouting: %T at pin %d link %d irq %d\n", tbdf, pin, link, irq); pcicfgw8(pci, PciINTL, irq); pci->intl = irq; }