~kris/9p

9hist

7053e4af7b88cf2db6ef9346a4b5968ab16e5418 — David du Colombier 25 years ago 8e823fe
Plan 9 from Bell Labs 2001-05-30
6 files changed, 59 insertions(+), 48 deletions(-)

M bitsy/devuda1341.c
M ip/tcp.c
M ip/udp.c
M port/cache.c
M port/chan.c
M port/devloopback.c
M bitsy/devuda1341.c => bitsy/devuda1341.c +2 -2
@@ 115,8 115,8 @@ enum
	Vinvert,
	Nvol,

	Bufsize		= 4* 1024,	/* 46 ms each */
	Nbuf			= 10,			/* 1.5 seconds total */
	Bufsize		= 4* 1024,	/* 23 ms each */
	Nbuf			= 10,			/* 230 ms total */

	Speed		= 44100,
	Ncmd		= 50,			/* max volume command words */

M ip/tcp.c => ip/tcp.c +23 -15
@@ 20,7 20,7 @@ enum
	TimerON		= 1,
	TimerDONE	= 2,
	MAX_TIME 	= (1<<20),	/* Forever */
	TCP_ACK		= 50,		/* Timed ack sequence in ms */
	TCP_ACK		= 200,		/* Timed ack sequence in ms */

	URG		= 0x20,		/* Data marked urgent */
	ACK		= 0x10,		/* Acknowledge is valid */


@@ 270,6 270,7 @@ void	tcpacktimer(void*);
void	tcpkeepalive(void*);
void	tcpsetkacounter(Tcpctl*);
void    tcprxmit(Conv*);
void	tcpsettimer(Tcpctl*);

void
tcpsetstate(Conv *s, uchar newstate)


@@ 1206,6 1207,7 @@ update(Conv *s, Tcp *seg)
				if(tcb->mdev <= 0)
					tcb->mdev = 1;
			}
			tcpsettimer(tcb);
		}
	}



@@ 1637,7 1639,6 @@ raise:
void
tcpoutput(Conv *s)
{
	int x;
	Tcp seg;
	int msgs;
	Tcpctl *tcb;


@@ 1787,19 1788,6 @@ tcpoutput(Conv *s)
		 * expect acknowledges
		 */
		if(ssize != 0){
			/* round trip depenency */
			x = backoff(tcb->backoff) *
			    (tcb->mdev + (tcb->srtt>>LOGAGAIN) + MSPTICK) / MSPTICK;

			/* take into account delayed ack */
			if(sent <= 2*tcb->mss)
				x += TCP_ACK/MSPTICK;

			/* sanity check */
			if(x > (10000/MSPTICK))
				x = 10000/MSPTICK;
			tcb->timer.start = x;

			if(tcb->timer.state != TimerON)
				tcpgo(tpriv, &tcb->timer);



@@ 1991,6 1979,7 @@ tcptimeout(void *arg)
			localclose(s, Etimedout);
			break;
		}
		tcpsettimer(tcb);
		netlog(s->p->f, Logtcp, "timeout rexmit 0x%lux\n", tcb->snd.una);
		tcprxmit(s);
		tpriv->stats[RetransTimeouts]++;


@@ 2288,6 2277,25 @@ tcpgc(Proto *tcp)
}

void
tcpsettimer(Tcpctl *tcb)
{
	int x;

	/* round trip depenency */
	x = backoff(tcb->backoff) *
	    (tcb->mdev + (tcb->srtt>>LOGAGAIN) + MSPTICK) / MSPTICK;

	/* take into account delayed ack */
	if((tcb->snd.ptr - tcb->snd.una) <= 2*tcb->mss)
		x += TCP_ACK/MSPTICK;

	/* sanity check */
	if(x > (10000/MSPTICK))
		x = 10000/MSPTICK;
	tcb->timer.start = x;
}

void
tcpinit(Fs *fs)
{
	Proto *tcp;

M ip/udp.c => ip/udp.c +0 -2
@@ 142,8 142,6 @@ udpclose(Conv *c)

	ucb = (Udpcb*)c->ptcl;
	ucb->headers = 0;

	qunlock(c);
}

void

M port/cache.c => port/cache.c +4 -4
@@ 111,10 111,10 @@ cinit(void)
	m = cache.head;

	/* a better algorithm would be nice */
	if(conf.npage*BY2PG > 200*MB)
		maxcache = 10*MAXCACHE;
	if(conf.npage*BY2PG > 400*MB)
		maxcache = 50*MAXCACHE;
//	if(conf.npage*BY2PG > 200*MB)
//		maxcache = 10*MAXCACHE;
//	if(conf.npage*BY2PG > 400*MB)
//		maxcache = 50*MAXCACHE;

	for(i = 0; i < NFILE-1; i++) {
		m->next = m+1;

M port/chan.c => port/chan.c +2 -1
@@ 802,8 802,9 @@ if(chandebug) print("\ttry chan: qid %.8llux devchar %C dev %lud ->\n", c->qid.p
		if(dotdot) {
			assert(wq->nqid == 1);
			assert(wq->clone != nil);
if(chandebug) print("undo.");
if(chandebug) print("undo wq->clone->name %s cname %s...", wq->clone->name->s, cname->s);
			nc = undomount(wq->clone, cname);
if(chandebug) print("undidmount nc %s...", nc->name->s);
			n = 1;
		} else {
			nc = nil;

M port/devloopback.c => port/devloopback.c +28 -24
@@ 92,9 92,9 @@ static Loop	loopbacks[Nloopbacks];

static uvlong	fasthz;

#define TYPE(x) 	((x)&0xff)
#define ID(x) 		(((x)&~CHDIR)>>8)
#define QID(x,y) 	(((x)<<8)|(y))
#define TYPE(x) 	(((ulong)(x))&0xff)
#define ID(x) 		(((ulong)(x))>>8)
#define QID(x,y) 	((((ulong)(x))<<8)|((ulong)(y)))

#define NS2FASTHZ(t)	((fasthz*(t))/1000000000);



@@ 179,7 179,7 @@ loopbackattach(char *spec)
	poperror();
	qunlock(lb);

	c->qid = (Qid){CHDIR|QID(0, Qtopdir), 0};
	mkqid(&c->qid, QID(0, Qtopdir), 0, QTDIR);
	c->aux = lb;
	c->dev = dev;
	return c;


@@ 201,24 201,26 @@ loopbackclone(Chan *c, Chan *nc)
}

static int
loopbackgen(Chan *c, Dirtab*, int, int i, Dir *dp)
loopbackgen(Chan *c, char*, Dirtab*, int, int i, Dir *dp)
{
	Loop *lb;
	Dirtab *tab;
	char buf[NAMELEN];
	int len, type;
	Qid qid;

	type = TYPE(c->qid.path);
	if(i == DEVDOTDOT){
		switch(type){
		case Qtopdir:
		case Qloopdir:
			snprint(buf, sizeof(buf), "#X%ld", c->dev);
			devdir(c, (Qid){CHDIR|QID(0, Qtopdir), 0}, buf, 0, eve, 0555, dp);
			snprint(up->genbuf, sizeof(up->genbuf), "#X%ld", c->dev);
			mkqid(&qid, QID(0, Qtopdir), 0, QTDIR);
			devdir(c, qid, up->genbuf, 0, eve, 0555, dp);
			break;
		case Qportdir:
			snprint(buf, sizeof(buf), "loopback%ld", c->dev);
			devdir(c, (Qid){CHDIR|QID(0, Qloopdir), 0}, buf, 0, eve, 0555, dp);
			snprint(up->genbuf, sizeof(up->genbuf), "loopback%ld", c->dev);
			mkqid(&qid, QID(0, Qloopdir), 0, QTDIR);
			devdir(c, qid, up->genbuf, 0, eve, 0555, dp);
			break;
		default:
			panic("loopbackgen %lux", c->qid.path);


@@ 230,24 232,27 @@ loopbackgen(Chan *c, Dirtab*, int, int i, Dir *dp)
	case Qtopdir:
		if(i != 0)
			return -1;
		snprint(buf, sizeof(buf), "loopback%ld", c->dev);
		devdir(c, (Qid){QID(0, Qloopdir) | CHDIR, 0}, buf, 0, eve, 0555, dp);
		snprint(up->genbuf, sizeof(up->genbuf), "loopback%ld", c->dev);
		mkqid(&qid, QID(0, Qloopdir), 0, QTDIR);
		devdir(c, qid, up->genbuf, 0, eve, 0555, dp);
		return 1;
	case Qloopdir:
		if(i >= 2)
			return -1;
		snprint(buf, sizeof(buf), "%d", i);
		devdir(c, (Qid){QID(i, QID(0, Qportdir)) | CHDIR, 0}, buf, 0, eve, 0555, dp);
		snprint(up->genbuf, sizeof(up->genbuf), "%d", i);
		mkqid(&qid, QID(i, QID(0, Qportdir)), 0, QTDIR);
		devdir(c, qid, up->genbuf, 0, eve, 0555, dp);
		return 1;
	case Qportdir:
		if(i >= nelem(loopportdir))
			return -1;
		tab = &loopportdir[i];
		devdir(c, (Qid){QID(ID(c->qid.path), tab->qid.path), 0}, tab->name, tab->length, eve, tab->perm, dp);
		mkqid(&qid, QID(ID(c->qid.path), tab->qid.path), 0, QTDIR);
		devdir(c, qid, tab->name, tab->length, eve, tab->perm, dp);
		return 1;
	default:
		/* non directory entries end up here; must be in lowest level */
		if(c->qid.path & CHDIR)
		if(c->qid.type & QTDIR)
			panic("loopbackgen: unexpected directory");	
		if(i != 0)
			return -1;


@@ 265,16 270,16 @@ loopbackgen(Chan *c, Dirtab*, int, int i, Dir *dp)
}


static int
loopbackwalk(Chan *c, char *name)
static Walkqid*
loopbackwalk(Chan *c, Chan *nc, char **name, int nname)
{
	return devwalk(c, name, nil, 0, loopbackgen);
	return devwalk(c, nc, name, nname, nil, 0, loopbackgen);
}

static void
loopbackstat(Chan *c, char *db)
static int
loopbackstat(Chan *c, uchar *db, int n)
{
	devstat(c, db, nil, 0, loopbackgen);
	return devstat(c, db, n, nil, 0, loopbackgen);
}

/*


@@ 285,7 290,7 @@ loopbackopen(Chan *c, int omode)
{
	Loop *lb;

	if(c->qid.path & CHDIR){
	if(c->qid.type & QTDIR){
		if(omode != OREAD)
			error(Ebadarg);
		c->mode = omode;


@@ 745,7 750,6 @@ Dev loopbackdevtab = {
	devreset,
	loopbackinit,
	loopbackattach,
	loopbackclone,
	loopbackwalk,
	loopbackstat,
	loopbackopen,