M boot/boot.c => boot/boot.c +1 -0
@@ 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
M gnot/main.c => gnot/main.c +1 -1
@@ 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);
M pc/main.c => pc/main.c +2 -0
@@ 34,10 34,12 @@ main(void)
chaninit();
alarminit();
bigcursor();
+print("chandevreset\n");
chandevreset();
streaminit();
swapinit();
pageinit();
+print("userinit\n");
userinit();
schedinit();
M port/chan.c => port/chan.c +11 -5
@@ 102,6 102,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)
{
if(c->flag & CFREE)
@@ 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);
}
}
M port/devarp.c => port/devarp.c +5 -3
@@ 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);
}
M port/devboot.c => port/devboot.c +4 -0
@@ 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);
}
M port/devcons.c => port/devcons.c +0 -3
@@ 240,9 240,6 @@ echo(Rune r, char *buf, int n)
case 'r':
exit();
break;
- case 't':
- tcpdump();
- break;
}
}else if(r == 0x14){
ctrlt++;
M port/devip.c => port/devip.c +0 -1
@@ 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 {
M port/devlance.c => port/devlance.c +1 -4
@@ 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
M port/devmnt.c => port/devmnt.c +36 -20
@@ 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,14 449,20 @@ 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)
{
mntclunk(c, Tclunk);
M port/ipdat.h => port/ipdat.h +1 -1
@@ 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
M port/portfns.h => port/portfns.h +1 -0
@@ 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*);
M port/stfcall.c => port/stfcall.c +34 -28
@@ 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);
+ }
}
M port/tcpinput.c => port/tcpinput.c +5 -50
@@ 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;
- }
-}
M port/tcpoutput.c => port/tcpoutput.c +2 -13
@@ 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;
}
}
M power/trap.c => power/trap.c +1 -2
@@ 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);
}
}
}