From b0efa40525f118c5480ff4f4635eb02cf24800bd Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Tue, 14 Apr 1998 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 1998-04-14 --- ip/ipmux.c | 10 ++++++++-- ip/udp.c | 30 +++++++++++------------------- pc/devastar.c | 15 +++++++++++++-- 3 files changed, 32 insertions(+), 23 deletions(-) diff --git a/ip/ipmux.c b/ip/ipmux.c index 3677b1f6495d309531279a19421bcfc3618867ce..df7edb22c647b89e78f3175c09d2c09bdac8934d 100644 --- a/ip/ipmux.c +++ b/ip/ipmux.c @@ -631,11 +631,15 @@ static void ipmuxkick(Conv *c, int) { Block *bp; + Iphdr *ih; bp = qget(c->wq); if(bp == nil) return; - ipoput(c->p->f, bp, 0, 0); + + ih = (Iphdr*)(bp->rp); + + ipoput(c->p->f, bp, 0, ih->ttl); } static void @@ -717,11 +721,13 @@ yes: c = mux->conv; mux = mux->yes; } + runlock(f); + if(c != nil){ qpass(c->rq, bp); return; } - runlock(f); + nomatch: /* doesn't match any filter, hand it to the specific protocol handler */ ip = (Iphdr*)bp->rp; diff --git a/ip/udp.c b/ip/udp.c index ff8752e97613299e848e7d2aa739740e074ddac8..7ef6a3757c8ad7f316b8e54dc231e24a13694c39 100644 --- a/ip/udp.c +++ b/ip/udp.c @@ -165,15 +165,13 @@ udpkick(Conv *c, int) bp->rp += IPaddrlen; ipmove(laddr, bp->rp); bp->rp += IPaddrlen; + /* pick interface closest to dest */ if(ipforme(f, laddr) != Runi) - findlocalip(f, laddr, raddr); /* pick interface closest to dest */ + findlocalip(f, laddr, raddr); rport = nhgets(bp->rp); - bp->rp += 2; - /* ignore local port number */ - bp->rp += 2; + bp->rp += 2+2; /* Igonore local port */ break; case 4: - /* get user specified addresses */ bp = pullupblock(bp, UDP_USEAD4); if(bp == nil) return; @@ -182,11 +180,9 @@ udpkick(Conv *c, int) v4tov6(laddr, bp->rp); bp->rp += IPv4addrlen; if(ipforme(f, laddr) != Runi) - findlocalip(f, laddr, raddr); /* pick interface closest to dest */ + findlocalip(f, laddr, raddr); rport = nhgets(bp->rp); - bp->rp += 2; - /* ignore local port number */ - bp->rp += 2; + bp->rp += 2+2; break; default: rport = 0; @@ -209,21 +205,17 @@ udpkick(Conv *c, int) uh->frag[1] = 0; hnputs(uh->udpplen, ptcllen); switch(ucb->headers){ + case 4: case 6: v6tov4(uh->udpdst, raddr); hnputs(uh->udpdport, rport); v6tov4(uh->udpsrc, laddr); break; - case 4: - memmove(uh->udpdst, raddr, IPv4addrlen); - hnputs(uh->udpdport, rport); - memmove(uh->udpsrc, laddr, IPv4addrlen); - break; default: v6tov4(uh->udpdst, c->raddr); hnputs(uh->udpdport, c->rport); if(ipcmp(c->laddr, IPnoaddr) == 0) - findlocalip(f, c->laddr, c->raddr); /* pick interface closest to dest */ + findlocalip(f, c->laddr, c->raddr); v6tov4(uh->udpsrc, c->laddr); break; } @@ -290,7 +282,7 @@ udpiput(Proto *udp, uchar *ia, Block *bp) if(*p == nil) { upriv->ustats.udpNoPorts++; - netlog(f, Logudp, "udp: no conv %I.%d -> %I.%d\n", raddr, rport, + netlog(f, Logudp, "udp: no conv %I!%d -> %I!%d\n", raddr, rport, laddr, lport); /* don't complain about broadcasts... */ if(ipforme(f, raddr) == 0){ @@ -334,9 +326,9 @@ udpiput(Proto *udp, uchar *ia, Block *bp) case 4: /* pass the src address */ bp = padblock(bp, UDP_USEAD4); - memmove(bp->rp, raddr, IPv4addrlen); + v6tov4(bp->rp, raddr); if(ipforme(f, laddr) == Runi) - memmove(bp->rp+IPv4addrlen, laddr, IPv4addrlen); + v6tov4(bp->rp+IPv4addrlen, laddr); else memmove(bp->rp+IPv4addrlen, ia, IPv4addrlen); hnputs(bp->rp + 2*IPv4addrlen, rport); @@ -422,7 +414,7 @@ udpstats(Proto *udp, char *buf, int len) Udppriv *upriv; upriv = udp->priv; - return snprint(buf, len, "%d %d %d %d", + return snprint(buf, len, "%d %d %d %d\n", upriv->ustats.udpInDatagrams, upriv->ustats.udpNoPorts, upriv->ustats.udpInErrors, diff --git a/pc/devastar.c b/pc/devastar.c index 3b0f426d1b62459bb4012dccbe46a2b087dc55e9..b41f46ab41469eacfce6795aaab89e3903e347b0 100644 --- a/pc/devastar.c +++ b/pc/devastar.c @@ -348,8 +348,7 @@ astargen(Chan *c, Dirtab *, int , int i, Dir *db) sprint(db->name, "astar%dmem", astar[dev]->id); db->qid.path = QID(dev, 0, Qmem); db->mode = 0660; - db->length1 = astar[dev]->memsize; /* BOTCH */ - db->length2 = astar[dev]->memsize; /* BOTCH */ + db->length = astar[dev]->memsize; break; } sofar++; @@ -569,6 +568,18 @@ astarsetup(Astar *a) static Chan* astarattach(char *spec) { + ulong ctlrno; + char *p; + + ctlrno = 0; + if(spec && *spec){ + ctlrno = strtoul(spec, &p, 0); + if((ctlrno == 0 && p == spec) || *p || (ctlrno >= Maxcard)) + error(Ebadarg); + } + if(astar[ctlrno] == nil) + error(Enodev); + return devattach('G', spec); }