From 480c62ab69f5591c135358fd687b21279183bb0c Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Fri, 20 Mar 1992 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 1992-03-20 --- boot/boot.c | 1 + gnot/main.c | 2 +- pc/main.c | 2 ++ port/chan.c | 16 +++++++++---- port/devarp.c | 8 ++++--- port/devboot.c | 4 ++++ port/devcons.c | 3 --- port/devip.c | 1 - port/devlance.c | 5 +--- port/devmnt.c | 56 +++++++++++++++++++++++++++---------------- port/ipdat.h | 2 +- port/portfns.h | 1 + port/stfcall.c | 62 ++++++++++++++++++++++++++---------------------- port/tcpinput.c | 55 ++++-------------------------------------- port/tcpoutput.c | 15 ++---------- power/trap.c | 3 +-- 16 files changed, 105 insertions(+), 131 deletions(-) diff --git a/boot/boot.c b/boot/boot.c index b1be81dcd72a5cfef312423e127b101a942eacb1..0eaf79371d743f771b1955ecf835e7f889eb692c 100644 --- a/boot/boot.c +++ b/boot/boot.c @@ -89,6 +89,7 @@ main(int argc, char *argv[]) if(mount(fd, "/", MAFTER|MCREATE, "", "") < 0) fatal("mount"); close(fd); + newkernel(); /* * if a local file server exists and it's not the diff --git a/gnot/main.c b/gnot/main.c index 4658ddaa7abba732d8f5c4863f25d18da9e4b09a..67c686db06f5634e75ba09909ea77285944f9712 100644 --- a/gnot/main.c +++ b/gnot/main.c @@ -269,7 +269,7 @@ banksize(int base) { ulong va; - if(&end > (int *)((KZERO|1024L*1024L)-BY2PG)) + if(end > (char *)((KZERO|1024L*1024L)-BY2PG)) return 0; va = UZERO; /* user page 1 is free to play with */ putmmu(va, PTEVALID|(base+0)*1024L*1024L/BY2PG, 0); diff --git a/pc/main.c b/pc/main.c index 2a059336f2a057d0a0aeb63cb7dd95a200b2665d..def1ea1bab5876803996c642e927d7a1b92dc19b 100644 --- a/pc/main.c +++ b/pc/main.c @@ -34,10 +34,12 @@ main(void) chaninit(); alarminit(); bigcursor(); +print("chandevreset\n"); chandevreset(); streaminit(); swapinit(); pageinit(); +print("userinit\n"); userinit(); schedinit(); diff --git a/port/chan.c b/port/chan.c index 3f787ccc9bec58e7865ef20fa98718ba16df6f00..8c3844d66096fabb9126d0fa29ece1f13611dd3a 100644 --- a/port/chan.c +++ b/port/chan.c @@ -101,6 +101,16 @@ newchan(void) } } +void +chanfree(Chan *c) +{ + c->flag = CFREE; + lock(&chanalloc); + c->next = chanalloc.free; + chanalloc.free = c; + unlock(&chanalloc); +} + void close(Chan *c) { @@ -112,11 +122,7 @@ close(Chan *c) (*devtab[c->type].close)(c); poperror(); } - c->flag = CFREE; - lock(&chanalloc); - c->next = chanalloc.free; - chanalloc.free = c; - unlock(&chanalloc); + chanfree(c); } } diff --git a/port/devarp.c b/port/devarp.c index 8b72de81781c8dbbebcc24e645ac8d185cde3821..307c96c7e1db786893e8fa72858bd65e5b45d318 100644 --- a/port/devarp.c +++ b/port/devarp.c @@ -263,19 +263,23 @@ arpwrite(Chan *c, char *a, long n, ulong offset) if(strncmp(field[0], "flush", 5) == 0) arpflush(); - else if(strcmp(field[0], "delete") == 0) { + else + if(strcmp(field[0], "delete") == 0) { if(m != 2) error(Ebadarg); if(arpdelete(field[1]) < 0) error(Enetaddr); } + break; + case arpdataqid: if(n != sizeof(Arpentry)) error(Emsgsize); memmove(&entry, a, sizeof(Arpentry)); arpenter(&entry, ARP_TEMP); break; + default: error(Ebadusefd); } @@ -286,8 +290,6 @@ arpwrite(Chan *c, char *a, long n, ulong offset) void arpopn(Queue *q, Stream *s) { - if(Myip[Myself]) - error(Einuse); USED(q, s); } diff --git a/port/devboot.c b/port/devboot.c index 9db9a3f80226d925105c21abadfba905e0fbd954..9902f8117b12d4e35e746b4c48ae51bde8510926 100644 --- a/port/devboot.c +++ b/port/devboot.c @@ -62,12 +62,14 @@ bootopen(Chan *c, int omode) void bootcreate(Chan *c, char *name, int omode, ulong perm) { + USED(c); error(Eperm); } void bootclose(Chan *c) { + USED(c); } long @@ -111,11 +113,13 @@ bootwrite(Chan *c, void *buf, long n, ulong offset) void bootremove(Chan *c) { + USED(c); error(Eperm); } void bootwstat(Chan *c, char *dp) { + USED(c); error(Eperm); } diff --git a/port/devcons.c b/port/devcons.c index d74bb771b819625b910aafe7349a4f43b3198464..405e5c65aa2509809b9541ec4899900de42f8aec 100644 --- a/port/devcons.c +++ b/port/devcons.c @@ -240,9 +240,6 @@ echo(Rune r, char *buf, int n) case 'r': exit(); break; - case 't': - tcpdump(); - break; } }else if(r == 0x14){ ctrlt++; diff --git a/port/devip.c b/port/devip.c index f7b397ab24b1568b81da8d8e133fcab5734b5f1b..8ab322898a20266876c4eada1eeaa3341565f931 100644 --- a/port/devip.c +++ b/port/devip.c @@ -530,7 +530,6 @@ tcpstoput(Queue *q, Block *bp) case Close_wait: qlock(tcb); tcb->sndcnt += blen(bp); - print("q %d\n", blen(bp)); if(tcb->sndq == 0) tcb->sndq = bp; else { diff --git a/port/devlance.c b/port/devlance.c index ef77b39e57ab42a9caf3a5c463b7033deb47d8d6..b2964e8da33f42c82d9976b7f069dc55f57fea53 100644 --- a/port/devlance.c +++ b/port/devlance.c @@ -285,7 +285,7 @@ lanceoput(Queue *q, Block *bp ) if(streamparse("connect", bp)){ if(e->type == -1) l.all--; - e->type = strtol((char *)bp->rptr, 0, 0); + e->type = strtol((char *)bp->rptr, 0, 0); if(e->type == -1) l.all++; } else if(streamparse("promiscuous", bp)) { @@ -442,9 +442,6 @@ lancestart(int mode, int dolock) Lancemem *lm = LANCEMEM; Msg *m; -if(mode == PROM) - print("setting promiscuous mode\n"); - /* * wait till both receiver and transmitter are * quiescent diff --git a/port/devmnt.c b/port/devmnt.c index cd2bf764a3b4400c2a40fc31a8b202f312f84ac0..31d073b736be6d15b8a492a7d8770c9bc5da90e3 100644 --- a/port/devmnt.c +++ b/port/devmnt.c @@ -68,6 +68,7 @@ void mntgate(Mnt*); void mntrpcread(Mnt*, Mntrpc*); void mntdoclunk(Mnt *, Mntrpc *); void mntauth(Mnt *, Mntrpc *, char *, ushort); +void mntpntfree(Mnt*); enum { @@ -126,6 +127,7 @@ mntattach(char *muxattach) Mnt *m, *e; Stream *s; Qinfo *qi; + Chan *c; struct bogus{ Chan *chan; char *spec; @@ -137,7 +139,7 @@ mntattach(char *muxattach) for(m = mntalloc.mntarena; m < e; m++) { if(m->c == bogus.chan && m->id) { lock(m); - if(m->ref > 0 && m->id && m->c == bogus.chan) { + if(m->id && m->ref > 0 && m->c == bogus.chan) { m->ref++; unlock(m); return mattach(m, bogus.spec, bogus.serv); @@ -162,18 +164,6 @@ mntattach(char *muxattach) m->c->flag |= CMSG; m->blocksize = MAXFDATA; - /* If we have a stream based protocol (TCP/IP) we push fcall to block - * up P9 protocol messages into single deliminted blocks - */ - s = m->c->stream; - qi = qinfofind("fcall"); - if(s) - if(s->procq->next) - if(s->procq->next->info->nodelim) { - if(qi == 0) - error(Ebadctl); - pushq(s, qi); - } switch(devchar[m->c->type]) { default: @@ -186,7 +176,27 @@ mntattach(char *muxattach) incref(m->c); unlock(m); - return mattach(m, bogus.spec, bogus.serv); + if(waserror()) { + close(m->c); + mntpntfree(m); + nexterror(); + } + + /* If we have a stream based protocol (TCP/IP) we push fcall to block + * up P9 protocol messages into single deliminted blocks + */ + s = m->c->stream; + qi = qinfofind("fcall"); + if(s) + if(s->procq->next) + if(s->procq->next->info->nodelim) { + if(qi == 0) + error(Ebadctl); + pushq(s, qi); + } + c = mattach(m, bogus.spec, bogus.serv); + poperror(); + return c; } Chan * @@ -204,7 +214,8 @@ mattach(Mnt *m, char *spec, char *serv) if(waserror()){ mntfree(r); - close(c); + /* Close must not be called since it will call mnt recursively */ + chanfree(c); nexterror(); } @@ -212,7 +223,6 @@ mattach(Mnt *m, char *spec, char *serv) if(*serv) mntauth(m, r, serv, c->fid); - r->request.type = Tattach; r->request.fid = c->fid; memmove(r->request.uname, u->p->user, NAMELEN); @@ -439,13 +449,19 @@ mntdoclunk(Mnt *m, Mntrpc *r) } m->id = 0; close(m->c); - lock(&mntalloc); - m->list = mntalloc.mntfree; - mntalloc.mntfree = m; - unlock(&mntalloc); + mntpntfree(m); } } +void +mntpntfree(Mnt *m) +{ + lock(&mntalloc); + m->list = mntalloc.mntfree; + mntalloc.mntfree = m; + unlock(&mntalloc); +} + void mntclose(Chan *c) { diff --git a/port/ipdat.h b/port/ipdat.h index f131f20f7248ee573256c4f15707ad9e187171d8..d9a1c22182d9111bbbfaf54e178271a8cb2b67a4 100644 --- a/port/ipdat.h +++ b/port/ipdat.h @@ -318,7 +318,7 @@ struct Ipconv #define MSS_LENGTH 4 #define MSL2 10 -#define MSPTICK 200 +#define MSPTICK 100 #define DEF_MSS 1024 #define DEF_RTT 1000 diff --git a/port/portfns.h b/port/portfns.h index a5bd7ba800cc2b9082c58f44e41801a0a854e27e..5ff73307e0841bc194553cbe858ad002ea896c75 100644 --- a/port/portfns.h +++ b/port/portfns.h @@ -16,6 +16,7 @@ int canputc(void*); int canqlock(QLock*); void chandevinit(void); void chandevreset(void); +void chanfree(Chan*); void chaninit(void); void checkalarms(void); void clock(Ureg*); diff --git a/port/stfcall.c b/port/stfcall.c index a765bef950af5338ea498dc4edd2160f18903024..c7e176c9c65c61342893e05e0af5aa866424283e 100644 --- a/port/stfcall.c +++ b/port/stfcall.c @@ -109,7 +109,6 @@ upstream(Queue *q, ulong len) for(bp = bl; bp->next; bp = bp->next) ; bp->flags |= S_DELIM; -if(bl->rptr[0] == 73) print("fcall Rclunk %d\n", blen(bl)); PUTNEXT(q, bl); } @@ -131,34 +130,41 @@ fcalliput(Queue *q, Block *bp) bp->flags &= ~S_DELIM; putq(q, bp); - bp = q->first; - switch(bp->rptr[0]) { /* This is the type */ - default: - len = msglen[bp->rptr[0]]; - if(len == 0) - error(Emountrpc); - if(q->len >= len) + for(;;) { + bp = q->first; + if(bp == 0) + return; + switch(bp->rptr[0]) { /* This is the type */ + default: + len = msglen[bp->rptr[0]]; + if(len == 0) + error(Emountrpc); + if(q->len < len) + return; + upstream(q, len); + continue; - return; - case Twrite: /* Fmt: TGGFFOOOOOOOOCC */ - len = Twritehdr; /* T = type, G = tag, F = fid */ - off = Twritecnt; /* O = offset, C = count */ - break; - case Rread: /* Fmt: TGGFFCC */ - len = Rreadhdr; - off = Rreadcnt; - break; - } - - if(q->len < len) - return; - - pullup(q->first, len); - bp = q->first; - need = len+bp->rptr[off]+(bp->rptr[off+1]<<8); - if(q->len < need) - return; + case Twrite: /* Fmt: TGGFFOOOOOOOOCC */ + len = Twritehdr; /* T = type, G = tag, F = fid */ + off = Twritecnt; /* O = offset, C = count */ + break; - upstream(q, need); + case Rread: /* Fmt: TGGFFCC */ + len = Rreadhdr; + off = Rreadcnt; + break; + } + + if(q->len < len) + return; + + pullup(q->first, len); + bp = q->first; + need = len+bp->rptr[off]+(bp->rptr[off+1]<<8); + if(q->len < need) + return; + + upstream(q, need); + } } diff --git a/port/tcpinput.c b/port/tcpinput.c index 73917c6ab505a3381090bec4ec4de4acbb3518a7..d128a48338caf4137a51ad0718780f7803641b59 100644 --- a/port/tcpinput.c +++ b/port/tcpinput.c @@ -42,9 +42,6 @@ tcp_input(Ipconv *ipc, Block *bp) Ipaddr source, dest; char tos; ushort length; - Block *f; - - DPRINT("tcp_input.\n"); h = (Tcphdr *)(bp->rptr); dest = nhgetl(h->tcpdst); @@ -300,13 +297,6 @@ process: tcb->rcvcnt += blen(bp); if(bp) if(s->readq) { - print("bl %d ty %d\n", blen(bp), bp->rptr[0]); - for(f = bp; bp->next; f = f->next) - ; - if((f->flags&S_DELIM) == 0) { - print("No delim upstream rcp"); - f->flags |= S_DELIM; - } PUTNEXT(s->readq, bp); bp = 0; } @@ -467,21 +457,22 @@ update(Ipconv *s, Tcp *seg) if(run_timer(&tcb->rtt_timer)) if(seq_ge(seg->ack, tcb->rttseq)) { stop_timer(&tcb->rtt_timer); - - if(!(tcb->flags & RETRAN)) { + if((tcb->flags&RETRAN) == 0) { rtt = tcb->rtt_timer.start - tcb->rtt_timer.count; rtt *= MSPTICK; if(rtt > tcb->srtt && (tcb->state == Syn_sent || tcb->state == Syn_received)) tcb->srtt = rtt; else { - abserr = (rtt > tcb->srtt) ? rtt - tcb->srtt : tcb->srtt - rtt; + if(rtt > tcb->srtt) + abserr = rtt - tcb->srtt; + else + abserr = tcb->srtt - rtt; tcb->srtt = ((AGAIN-1)*tcb->srtt + rtt) / AGAIN; tcb->mdev = ((DGAIN-1)*tcb->mdev + abserr) / DGAIN; DPRINT("tcpout: rtt %d, srtt %d, mdev %d\n", rtt, tcb->srtt, tcb->mdev); } - tcb->backoff = 0; } } @@ -989,39 +980,3 @@ ntohtcp(Tcp *tcph, Block **bpp) } return hdrlen; } - -void -tcpdumpconv(Ipconv *c) -{ - if(c->tcpctl.state == Closed) - return; - - print("%s %d -> %d.%d.%d.%d/%d snd %d recv %d una %d nxt %d ptr %d wnd %d\n", - tcpstate[c->tcpctl.state], - c->psrc, - fmtaddr(c->dst), - c->pdst, - c->tcpctl.sndcnt, - c->tcpctl.rcvcnt, - c->tcpctl.snd.una, - c->tcpctl.snd.nxt, - c->tcpctl.snd.ptr, - c->tcpctl.snd.wnd); -} - -void -tcpdump(void) -{ - Ipifc *ep, *ifp; - Ipconv *cp, *ecp; - extern Ipifc *ipifc; - - ep = &ipifc[conf.ipif]; - for(ifp = ipifc; ifp < ep; ifp++) - if(strcmp(ifp->name, "TCP") == 0) { - ecp = &ifp->connections[conf.ip]; - for(cp = ifp->connections; cp < ecp; cp++) - tcpdumpconv(cp); - break; - } -} diff --git a/port/tcpoutput.c b/port/tcpoutput.c index 9a2da98e3b19719c7dc692136cc3c357469e727f..32d7d98834d0f555bd56d0fe33bf92c3e1e9ec24 100644 --- a/port/tcpoutput.c +++ b/port/tcpoutput.c @@ -63,7 +63,7 @@ tcp_output(Ipconv *s) DPRINT("tcp_out: ssize = %lux\n", ssize); if(ssize == 0) - if((tcb->flags & FORCE) == 0) + if((tcb->flags&FORCE) == 0) break; /* Stop ack timer if one will be piggy backed on data */ @@ -105,7 +105,7 @@ tcp_output(Ipconv *s) seg.flags |= FIN; dsize--; } - print("dupb: %d\n", dbp->rptr[0]); + DPRINT("dupb: %d\n", dbp->rptr[0]); } if(sent+dsize == qlen) @@ -154,7 +154,6 @@ tcp_output(Ipconv *s) tcb->rttseq = tcb->snd.ptr; } } - print("snd: %d %x\n", blen(hbp), seg.seq); PUTNEXT(Ipoutput, hbp); } } @@ -164,7 +163,6 @@ tcprxmit(Ipconv *s) { Tcpctl *tcb; - print("tcp! rexmit\n"); tcb = &s->tcpctl; qlock(tcb); tcb->flags |= RETRAN|FORCE; @@ -189,12 +187,9 @@ tcp_timeout(void *arg) s = (Ipconv *)arg; tcb = &s->tcpctl; - print("Timer %lux state = %d\n", s, tcb->state); - switch(tcb->state){ default: tcb->backoff++; - DPRINT("tcp_timeout: retransmit %d %x\n", tcb->backoff, s); if (tcb->backoff >= MAXBACKOFF) close_self(s, Etimedout); else @@ -204,12 +199,6 @@ tcp_timeout(void *arg) case Time_wait: close_self(s, 0); break; - - case Established: - if(tcb->backoff < MAXBACKOFF) - tcb->backoff++; - tcprxmit(s); - break; } } diff --git a/power/trap.c b/power/trap.c index 1d3b51d25f2a25d16b404a48f259c74e8a6c89bb..fb096be06fb17b1c09b1acdc4459807cb9f9c090 100644 --- a/power/trap.c +++ b/power/trap.c @@ -342,8 +342,7 @@ dumpstack(void) v = *(ulong*)l; if(KTZERO < v && v < (ulong)&etext){ print("%lux=%lux\n", l, v); - prflush(); - delay(250); + delay(100); } } }