~kris/9p

9hist

4ab17bda7b8be961e15296746a1f0bc3edda0ee5 — David du Colombier 36 years ago e47e366
Plan 9 from Bell Labs 1990-03-20
5 files changed, 80 insertions(+), 66 deletions(-)

M gnot/dat.h
M gnot/devincon.c
M gnot/main.c
M gnot/screen.c
M gnot/sturp.c
M gnot/dat.h => gnot/dat.h +1 -1
@@ 432,7 432,7 @@ enum {
	Sdataqid = Shighqid,
	Sctlqid = Sdataqid-1,
	Slowqid = Sctlqid,
	Streamhi= (32*1024),	/* stream high water mark */
	Streamhi= (8*1024),	/* stream high water mark */
};

#define	PRINTSIZE	256

M gnot/devincon.c => gnot/devincon.c +59 -40
@@ 7,6 7,7 @@
#include	"devtab.h"

#include	"io.h"
#include	"ureg.h"

typedef struct Incon	Incon;
typedef struct Device	Device;


@@ 22,7 23,8 @@ enum {
	Minstation=	2,	/* lowest station # to poll */
	Maxstation=	15,	/* highest station # to poll */
	Nincon=		1,	/* number of incons */
	Nin=		32,	/* size of raw input buffer */
	Nin=		16,	/* Blocks in the input ring */
	Bsize=		128,	/* size of an input ring block */
};

/*


@@ 522,9 524,7 @@ inconoput(Queue *q, Block *bp)
			n = 16;
		size = n;
		dev->cdata = chan;
		DPRINT("CH|%uo->\n", chan);
		while(n--){
			DPRINT("->%uo\n", *bp->rptr);
			*(uchar *)&dev->data_cntl = *bp->rptr++;
		}



@@ 554,13 554,13 @@ inconoput(Queue *q, Block *bp)
	if(ctl){
		if(size >= 16){
			dev->cdata = 0;
			DPRINT("CH|%uo->\n", chan);
			MICROSECOND;
			dev->cdata = chan;
			MICROSECOND;
		}
		DPRINT("CTL|%uo->\n", ctl);
		dev->cdata = ctl;
		MICROSECOND;
	}
	MICROSECOND;
	dev->cdata = 0;

	qunlock(&ip->xmit);


@@ 596,7 596,7 @@ inconkproc(void *arg)
	 *  create a number of blocks for input
	 */
	for(i = 0; i < Nin; i++){
		bp = ip->inb[i] = allocb(128);
		bp = ip->inb[i] = allocb(Bsize);
		bp->wptr += 3;
	}



@@ 622,7 622,7 @@ inconkproc(void *arg)
		 */
		while(ip->ri != ip->wi){
			PUTNEXT(ip->rq, ip->inb[ip->ri]);
			bp = ip->inb[ip->ri] = allocb(128);
			bp = ip->inb[ip->ri] = allocb(Bsize);
			bp->wptr += 3;
			ip->ri = (ip->ri+1)%Nin;
		}


@@ 639,10 639,13 @@ droppacket(Device *dev)
	int i;
	int c;

	for(i = 0; i < 17; i++){
		c = dev->data_cntl;
		if(c==0)
			break;
	screenputc('!');
	while(!(dev->status & RCV_EMPTY)){
		for(i = 0; i < 17; i++){
			c = dev->data_cntl;
			if(c==0)
				break;
		}
	}
}



@@ 655,16 658,19 @@ static Block *
nextin(Incon *ip, unsigned int c)
{
	Block *bp = ip->inb[ip->wi];
	int next;

	next = (ip->wi+1)%Nin;
	if(next == ip->ri){
		bp->wptr = bp->base+3;
		droppacket(ip->dev);
		return 0;
	}
	bp->base[0] = ip->chan;
	bp->base[1] = ip->chan>>8;
	bp->base[2] = c;
	ip->wi = (ip->wi + 1) % Nin;
	ip->wi = next;

	if(((ip->wi+1)%Nin) == ip->ri){
		droppacket(ip->dev);
		return 0;
	}
	return ip->inb[ip->wi];
}



@@ 678,26 684,28 @@ rdpackets(Incon *ip)
	Block *bp;
	unsigned int c;
	Device *dev;
	uchar *p;
	int first = ip->wi;

	dev = ip->dev;
	bp = ip->inb[ip->wi];
	if(bp==0){
		droppacket(ip->dev);
		goto done;
	}
	p = bp->wptr;
	while(!(dev->status & RCV_EMPTY)){
		bp = ip->inb[ip->wi];
		if(((ip->wi+1)%Nin) == ip->ri || bp==0){
			c = dev->data_cntl;
			droppacket(dev);
			continue;
		}

		/*
		 *  get channel number
		 */
		c = (dev->data_cntl)>>8;
		DPRINT("<-CH|%uo\n", c);
		if(ip->chan != c){
			if(bp->wptr - bp->rptr > 3){
			if(p - bp->rptr > 3){
				bp->wptr = p;
				bp = nextin(ip, 0);
				if(bp == 0)
					continue;
					goto done;
				p = bp->wptr;
			}
			ip->chan = c;
		}


@@ 710,28 718,39 @@ rdpackets(Incon *ip)
				/*
				 *  data byte, put in local buffer
				 */
				c = *bp->wptr++ = c>>8;
				DPRINT("<-%uo\n", c);
				if(bp->wptr >= bp->lim){
					bp = nextin(ip, 0);
					if(bp == 0)
						continue;
				}
				*p++ = c>>8;
			} else if (c>>=8) {
				/*
				 *  control byte ends block
				 */
				DPRINT("<-CTL|%uo\n", c);
				bp->wptr = p;
				bp = nextin(ip, c);
				if(bp == 0)
					continue;
					goto done;
				p = bp->wptr;
			} else {
				/* end of packet */
				break;
			}
		}
	}
	wakeup(&ip->kr);

		/*
		 *  pass a block on if it doesn't have room for one more
		 *  packet.  this way we don't have to check per byte.
		 */
		if(p + 16 > bp->lim){
			bp->wptr = p;
			bp = nextin(ip, 0);
			if(bp == 0)
				goto done;
			p = bp->wptr;
		}
	}	
	bp->wptr = p;

done:
	if(first != ip->wi)/**/
		wakeup(&ip->kr);
}

/*


@@ 754,11 773,11 @@ inconintr(Ureg *ur)
	/* check for exceptional conditions */
	if(status&(OVERFLOW|CRC_ERROR)){
		if(status&OVERFLOW){
			print("incon overflow\n");
			screenputc('^');
			ip->overflow++;
		}
		if(status&CRC_ERROR){
			print("incon crc error\n");
			screenputc('+');
			ip->crc++;
		}
	}

M gnot/main.c => gnot/main.c +5 -6
@@ 23,7 23,6 @@ void unloadboot(void);
void
main(void)
{
	Lock l;
	unloadboot();
	machinit();
	mmuinit();


@@ 69,12 68,12 @@ mmuinit(void)
	for(l=0; l<4*1024*1024; l+=BY2PG)
		putmmu(l, INVALIDPTE);
	/*
	 * Two meg of usable memory
	 * Four meg of usable memory, with top 256K for screen
	 */
	for(i=1,l=KTZERO; i<2*1024*1024/BY2PG; l+=BY2PG,i++)
	for(i=1,l=KTZERO; i<(4*1024*1024-256*1024)/BY2PG; l+=BY2PG,i++)
		putkmmu(l, PPN(l)|PTEVALID|PTEKERNEL);
	/*
	 * Screen at two meg
	 * Screen at top of memory
	 */
	for(i=0,d=DISPLAYRAM; i<256*1024/BY2PG; d+=BY2PG,l+=BY2PG,i++)
		putkmmu(l, PPN(d)|PTEVALID|PTEKERNEL);


@@ 234,9 233,9 @@ confinit(void)
	conf.nmach = 1;
	if(conf.nmach > MAXMACH)
		panic("confinit");
	conf.nproc = 15;
	conf.nproc = 32;
	conf.npgrp = 15;
	conf.npage = (2*1024*1024)/BY2PG;
	conf.npage = (4*1024*1024-256*1024)/BY2PG;
	conf.npte = 500;
	conf.nmod = 50;
	conf.nalarm = 1000;

M gnot/screen.c => gnot/screen.c +1 -1
@@ 18,7 18,7 @@ struct{

Bitmap	screen =
{
	(ulong*)(2*1024*1024|KZERO),	/* BUG */
	(ulong*)((4*1024*1024-256*1024)|KZERO),	/* BUG */
	0,
	64,
	0,

M gnot/sturp.c => gnot/sturp.c +14 -18
@@ 123,8 123,6 @@ urpopen(Queue *q, Stream *s)
	int i;
	char name[128];

	DPRINT("urpopen\n");

	/*
	 *  find a free urp structure
	 */


@@ 200,13 198,11 @@ urpclose(Queue *q)
		i = 7;
	rcvack(up, ECHO+i);
	qunlock(&up->xmit);
	DPRINT("urpclose(%ux)\n", up);

	/*
	 *  kill off the kernel process
	 */
	wakeup(&up->rq->r);
	DPRINT("urpclosed(%ux)\n", up);
}

/*


@@ 381,7 377,7 @@ urpiput(Queue *q, Block *bp)
	case 0:
		break;
	case ENQ:
		print("rENQ %uo %uo\n", up->lastecho, ACK+up->iseq);
		DPRINT("rENQ %uo %uo\n", up->lastecho, ACK+up->iseq);
		urpstat.enqsr++;
		sendctl(up, up->lastecho);
		sendctl(up, ACK+up->iseq);


@@ 422,7 418,7 @@ urpiput(Queue *q, Block *bp)

	case REJ+0: case REJ+1: case REJ+2: case REJ+3:
	case REJ+4: case REJ+5: case REJ+6: case REJ+7:
		print("rREJ\n");
		DPRINT("rREJ\n");
		rcvack(up, ctl);
		break;
	


@@ 445,20 441,24 @@ urpiput(Queue *q, Block *bp)
		if(up->trx != 3){
			urpstat.rjtrs++;
			flushinput(up);
			print("sREJ1 %d\n", up->iseq);
			sendctl(up, up->lastecho = REJ+up->iseq);
			DPRINT("sREJ1 %d\n", up->iseq);
			if((up->lastecho&~7)==ECHO)
				sendctl(up, up->lastecho = REJ+up->iseq);/**/
			break;
		} else if(q->len != up->trbuf[1] + (up->trbuf[2]<<8)){
			urpstat.rjpks++;
			DPRINT("sREJ2 %d %d %d\n", up->iseq, q->len,
				up->trbuf[1] + (up->trbuf[2]<<8));
			flushinput(up);
			print("sREJ2 %d\n", up->iseq);
			sendctl(up, up->lastecho = REJ+up->iseq);
			if((up->lastecho&~7)==ECHO)
				sendctl(up, up->lastecho = REJ+up->iseq);/**/
			break;
		} else if(i != ((up->iseq+1)&Nmask)) {
			urpstat.rjseq++;
			flushinput(up);
			print("sREJ3 %d %d\n", i, up->iseq);
			sendctl(up, up->lastecho = REJ+up->iseq);
			DPRINT("sREJ3 %d %d\n", i, up->iseq);
			if((up->lastecho&~7)==ECHO)
				sendctl(up, up->lastecho = REJ+up->iseq);/**/
			break;
		}



@@ 481,8 481,7 @@ urpiput(Queue *q, Block *bp)
		 *  acknowledge receipt
		 */
		if(q->next->len < Streamhi){
			sendctl(up, ECHO+i);
			up->lastecho = ECHO+i;
			sendctl(up, up->lastecho = ECHO+i);
			wakeup(&up->rq->r);
		}
		up->iseq = i;


@@ 510,7 509,6 @@ urpctloput(Urp *up, Queue *q, Block *bp)
				outwin = strtoul(fields[0], 0, 0);
			}
/*			initinput(up, inwin); */
			DPRINT("initoutput %d\n", outwin);
			initoutput(up, outwin);
			freeb(bp);
			return;


@@ 596,7 594,7 @@ output(Urp *up)
	 *  if a retransmit time has elapsed since a transmit, send an ENQ
	 */
	if(up->unechoed != up->next && NOW > up->timer){
		print("sENQ\n");
		DPRINT("sENQ\n");
		up->timer = NOW + MSrexmit;
		up->state &= ~REJECTING;
		sendctl(up, ENQ);


@@ 826,7 824,6 @@ urpkproc(void *arg)
	Urp *up;

	up = (Urp *)arg;
	DPRINT("urpkproc started\n");

	for(;;){
		if(up->state & (HUNGUP|CLOSING)){


@@ 840,7 837,6 @@ urpkproc(void *arg)
		output(up);
		tsleep(&up->rq->r, todo, up, MSrexmit/2);
	}
	DPRINT("urpkproc exiting %ux\n", up);
	up->kstarted = 0;
	up->state = 0;
}