~kris/9p

9hist

480c62ab69f5591c135358fd687b21279183bb0c — David du Colombier 34 years ago 8952780
Plan 9 from Bell Labs 1992-03-20
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);
			}
		}
}