~kris/9p

9hist

c03433fc0d689ef2a854cd6110172a93bf4e91b5 — David du Colombier 34 years ago 99e17d2
Plan 9 from Bell Labs 1992-03-10
5 files changed, 35 insertions(+), 36 deletions(-)

M port/devcons.c
M port/ipdat.h
M port/segment.c
M port/stil.c
M port/tcpinput.c
M port/devcons.c => port/devcons.c +8 -5
@@ 847,19 847,22 @@ conswrite(Chan *c, void *va, long n, ulong offset)
		break;

	case Qswap:
		kickpager();		/* start a pager if not already started */
		if(conf.cntrlp && strcmp(u->p->user, eve) != 0)
			error(Eperm);
		if(n >= sizeof buf)
			error(Egreg);
		memmove(buf, va, n);	/* so we can NUL-terminate */
		buf[n] = 0;
		if(buf[0]<'0' && '9'<buf[0])
		if(strncmp(buf, "start", 5) == 0){
			kickpager();		/* start a pager if not already started */
			break;
		}
		if(conf.cntrlp && strcmp(u->p->user, eve) != 0)
			error(Eperm);
		if(buf[0]<'0' || '9'<buf[0])
			error(Ebadarg);
		fd = strtoul(buf, 0, 0);
		swc = fdtochan(fd, -1, 1);
		setswapchan(swc);
		return n;
		break;

	default:
		print("conswrite: %d\n", c->qid.path);

M port/ipdat.h => port/ipdat.h +1 -4
@@ 245,6 245,7 @@ struct Tctl
	int	srtt;			/* Shortened round trip */
	int	mdev;			/* Mean deviation of round trip */
};

struct Tcpctl
{
	QLock;


@@ 342,8 343,6 @@ struct Ipconv
#define Nreseq		64

#define	set_timer(t,x)	(((t)->start) = (x)/MSPTICK)
#define	dur_timer(t)	((t)->start)
#define	read_timer(t)	((t)->count)
#define	run_timer(t)	((t)->state == TIMER_RUN)

enum					/* Tcp connection states */


@@ 376,8 375,6 @@ struct Ipifc
	int		minmtu;			/* Minumum tranfer unit */
	int		hsize;			/* Media header size */	
	ulong		chkerrs;		/* checksum errors */
	ulong		tx;
	ulong		rx;
	Lock;	
};


M port/segment.c => port/segment.c +6 -0
@@ 272,6 272,9 @@ imagereclaim(void)
	if(!canqlock(&ireclaim))	/* Somebody is already cleaning the page cache */
		return;

	if(conf.cntrlp)
	print("ireclaim %lud\n", TK2MS(MACHP(0)->ticks));

	for(;;) {
		lock(&palloc);
		for(p = palloc.head; p; p = p->next)


@@ 290,6 293,9 @@ imagereclaim(void)
		unlockpage(p);
	}

	if(conf.cntrlp)
	print("ireclaim done %lud\n", TK2MS(MACHP(0)->ticks));

	qunlock(&ireclaim);
}


M port/stil.c => port/stil.c +1 -1
@@ 764,7 764,7 @@ ilstart(Ipconv *ipc, int type, int window)
	if(ic->state != Ilclosed)
		return;

	ic->timeout = 0;
	Starttimer(ic);
	ic->unacked = 0;
	ic->outoforder = 0;
	ic->slowtime = Slowtime;

M port/tcpinput.c => port/tcpinput.c +19 -26
@@ 199,7 199,8 @@ process:
		goto done;
	}

	if(seg.seq != tcb->rcv.nxt && (length != 0 || (seg.flags & (SYN|FIN)) )) {
	if(seg.seq != tcb->rcv.nxt)
	if(length != 0 || (seg.flags & (SYN|FIN))) {
		add_reseq(tcb, tos, &seg, bp, length);
		tcb->flags |= FORCE;
		goto output;


@@ 254,7 255,7 @@ process:
			break;
		case Closing:
			update(s, &seg);
			if(tcb->sndcnt == 0){
			if(tcb->sndcnt == 0) {
				setstate(s, Time_wait);
				tcb->timer.start = MSL2 * (1000 / MSPTICK);
				start_timer(&tcb->timer);


@@ 271,17 272,21 @@ process:
			start_timer(&tcb->timer);
		}

		if ((seg.flags&URG) && seg.up) {
			if (seq_gt(seg.up + seg.seq, tcb->rcv.up)) {
		if((seg.flags&URG) && seg.up) {
			if(seq_gt(seg.up + seg.seq, tcb->rcv.up)) {
				tcb->rcv.up = seg.up + seg.seq;
				copyupb(&bp, 0, seg.up);
			}
		} 
		else if (seq_gt(tcb->rcv.nxt, tcb->rcv.up))
		else if(seq_gt(tcb->rcv.nxt, tcb->rcv.up))
			tcb->rcv.up = tcb->rcv.nxt;

		if(length != 0){
		if(length != 0) {
			switch(tcb->state){
			default:
				/* Ignore segment text */
				freeb(bp);
				break;
			case Syn_received:
			case Established:
			case Finwait1:


@@ 298,13 303,9 @@ process:
	
				start_timer(&tcb->acktimer);

				if (tcb->max_snd <= tcb->rcv.nxt-tcb->last_ack)
				if(tcb->max_snd <= tcb->rcv.nxt-tcb->last_ack)
					tcb->flags |= FORCE;
				break;
			default:
				/* Ignore segment text */
				freeb(bp);
				break;
			}
		}



@@ 414,18 415,13 @@ reset(Ipaddr source, Ipaddr dest, char tos, ushort length, Tcp *seg)
	seg->source = tmp;

	rflags = RST;

	/* convince the other end that this reset is in band */
	if(seg->flags & ACK) {
		/* This reset is being sent to clear a half-open connection.
		 * Set the sequence number of the RST to the incoming ACK
		 * so it will be acceptable.
		 */
		seg->seq = seg->ack;
		seg->ack = 0;
	}
	else {
		/* We're rejecting a connect request (SYN) from LISTEN state
		 * so we have to "acknowledge" their SYN.
		 */
		rflags |= ACK;
		seg->ack = seg->seq;
		seg->seq = 0;


@@ 532,10 528,7 @@ update(Ipconv *s, Tcp *seg)
	if(seq_lt(tcb->snd.ptr, tcb->snd.una))
		tcb->snd.ptr = tcb->snd.una;

	/* Clear the retransmission flag since the oldest
	 * unacknowledged segment (the only one that is ever retransmitted)
	 * has now been acked.
	 */
	/* All data is acked now */
	tcb->flags &= ~RETRAN;
	tcb->backoff = 0;
}


@@ 558,7 551,7 @@ proc_syn(Ipconv *s, char tos, Tcp *seg)
	if(PREC(tos) > PREC(tcb->tos))
		tcb->tos = tos;

	tcb->rcv.up = tcb->rcv.nxt = seg->seq + 1;	/* p 68 */
	tcb->rcv.up = tcb->rcv.nxt = seg->seq + 1;
	tcb->snd.wl1 = tcb->irs = seg->seq;
	tcb->snd.wnd = seg->wnd;



@@ 648,8 641,9 @@ int
trim(Tcpctl *tcb, Tcp *seg, Block **bp, ushort *length)
{
	Block *nbp;
	long dupcnt,excess;
	ushort len;		/* Segment length including flags */
	long dupcnt;
	long excess;
	ushort len;
	char accept;

	accept = 0;


@@ 659,7 653,6 @@ trim(Tcpctl *tcb, Tcp *seg, Block **bp, ushort *length)
	if(seg->flags & FIN)
		len++;

	/* Acceptability tests */
	if(tcb->rcv.wnd == 0) {
		if(seg->seq == tcb->rcv.nxt && len == 0)
			return 0;