~kris/9p

9hist

33b6d81d9f938d7232aa5700ab8fd6c902327b0b — David du Colombier 34 years ago 79da173
Plan 9 from Bell Labs 1991-11-04
4 files changed, 23 insertions(+), 46 deletions(-)

M port/devip.c
M port/ipdat.h
M port/stil.c
M port/tcpinput.c
M port/devip.c => port/devip.c +19 -17
@@ 388,7 388,7 @@ ipwrite(Chan *c, char *a, long n, ulong offset)
		qunlock(&ipalloc);

	}
	else if(strcmp(field[0], "announce") == 0 || strcmp(field[0], "reserve") == 0) {
	else if(strcmp(field[0], "announce") == 0) {
		if((cp->stproto == &tcpinfo && cp->tcpctl.state != CLOSED) ||
		   (cp->stproto == &ilinfo && cp->ilctl.state != Ilclosed))
				error(Edevbusy);


@@ 404,7 404,6 @@ ipwrite(Chan *c, char *a, long n, ulong offset)
			error(Einuse);
		}
		cp->psrc = port;
		cp->ptype = *field[0];
		qunlock(&ipalloc);
	}
	else if(strcmp(field[0], "backlog") == 0) {


@@ 489,7 488,12 @@ udpstoput(Queue *q, Block *bp)
{
	Ipconv *ipc;
	Udphdr *uh;
	int	dlen, ptcllen, newlen;
	int dlen, ptcllen, newlen;

	if(bp->type == M_CTL) {
		PUTNEXT(q, bp);
		return;
	}

	/* Prepend udp header to packet and pass on to ip layer */
	ipc = (Ipconv *)(q->ptr);


@@ 545,10 549,12 @@ udpstclose(Queue *q)

	ipc = (Ipconv *)(q->ptr);

	/* If the port was bound rather than reserved, clear the allocation */
	qlock(ipc);
	if(--ipc->ref == 0 && ipc->ptype == 'b')
	if(--ipc->ref == 0) {
		ipc->psrc = 0;
		ipc->pdst = 0;
		ipc->dst = 0;
	}
	qunlock(ipc);

	closeipifc(ipc->ipinterface);


@@ 583,12 589,17 @@ tcpstoput(Queue *q, Block *bp)
{
	Ipconv *s;
	Tcpctl *tcb; 
	int len, errnum, oob = 0;
	int len, errnum;

	s = (Ipconv *)(q->ptr);
	len = blen(bp);
	tcb = &s->tcpctl;

	if(bp->type == M_CTL) {
		PUTNEXT(q, bp);
		return;
	}

	if(s->psrc == 0)
		error(Enoport);



@@ 607,17 618,8 @@ tcpstoput(Queue *q, Block *bp)
	case ESTABLISHED:
	case CLOSE_WAIT:
		qlock(tcb);
		if(oob == 0) {
			appendb(&tcb->sndq, bp);
			tcb->sndcnt += len;
		}
		else {
			if(tcb->snd.up == tcb->snd.una)
				tcb->snd.up = tcb->snd.ptr;
			appendb(&tcb->sndoobq, bp);
			tcb->sndoobcnt += len;
		}

		appendb(&tcb->sndq, bp);
		tcb->sndcnt += len;
		tcprcvwin(s);
		tcp_output(s);
		qunlock(tcb);

M port/ipdat.h => port/ipdat.h +1 -2
@@ 258,7 258,7 @@ struct Reseq
	char	tos;
};

/* An ip interface used for UDP/TCP/ARP/ICMP */
/* An ip interface used for UDP/TCP/IL */
struct Ipconv
{
	QLock;				/* Ref count lock */


@@ 267,7 267,6 @@ struct Ipconv
	Ipaddr	dst;			/* Destination from connect */
	Port	psrc;			/* Source port */
	Port	pdst;			/* Destination port */
	char	ptype;			/* Port type */

	Ipifc	*ipinterface;		/* Ip protocol interface */
	Queue	*readq;			/* Pointer to upstream read q */

M port/stil.c => port/stil.c +0 -1
@@ 277,7 277,6 @@ ilprocess(Ipconv *s, Ilhdr *h, Block *bp)
	Block *nb;
	Ilcb *ic;
	Ilhdr *oh;
	int sendack = 0;
	ulong id, ack, oid, dlen;

	id = nhgetl(h->ilid);

M port/tcpinput.c => port/tcpinput.c +3 -26
@@ 57,14 57,11 @@ tcp_input(Ipconv *ipc, Block *bp)
			print("tcpin: allocb failure.");
			return;
		}
		DPRINT("tcpin: Duplicate packet %lux\n", bp);
	}

	h->Unused = 0;
	hnputs(h->tcplen, length - (TCP_IPLEN+TCP_PHDRSIZE));

	if(ptcl_csum(bp, TCP_EHSIZE+TCP_IPLEN, length - TCP_IPLEN)) {
		DPRINT("tcpin: Bad checksum.\n");
		freeb(bp);
		return;
	}


@@ 74,21 71,12 @@ tcp_input(Ipconv *ipc, Block *bp)

	/* Adjust the data length */
	length -= (hdrlen+TCP_IPLEN+TCP_PHDRSIZE);
	
	DPRINT("tcpin: lport = %d, rport = %d hdrlen %d",
		seg.dest, seg.source, hdrlen);
	DPRINT(" flags = 0x%lux, seqo = %d, seqi = %d len %d\n", 
		seg.flags, seg.seq, seg.ack, length);

	/* Trim the packet down to just the data */
	bp = btrim(bp, hdrlen+TCP_PKT, length);
	if(bp == 0)
		return;

	s = ip_conn(ipc, seg.dest, seg.source, source, IP_TCPPROTO);
	if (s == 0) {
		LPRINT("tcpin: look for listen on %d\n", seg.dest);

		if((seg.flags & SYN) == 0)
			goto clear;



@@ 105,7 93,6 @@ tcp_input(Ipconv *ipc, Block *bp)
					goto clear;

				s->curlog++;
				LPRINT("tcpin: cloning socket\n");
				new->psrc = seg.dest;
				new->pdst = seg.source;
				new->dst = source;


@@ 115,18 102,16 @@ tcp_input(Ipconv *ipc, Block *bp)
				new->tcpctl.timer.state = TIMER_STOP;
				new->tcpctl.acktimer.arg = new;
				new->tcpctl.acktimer.state = TIMER_STOP;

				new->newcon = 1;
				new->ipinterface = s->ipinterface;

				s->ipinterface->ref++;
				wakeup(&s->listenr);

				s = new;
				goto process;
			}
		}
	clear:
		LPRINT("tcpin: call cleared\n");
		freeb(bp);   
		reset(source, dest, tos, length, &seg);
		return;


@@ 219,8 204,7 @@ process:
		goto done;
	}

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


@@ 301,9 285,6 @@ process:
		else if (seq_gt(tcb->rcv.nxt, tcb->rcv.up))
			tcb->rcv.up = tcb->rcv.nxt;

		DPRINT("tcpin: Append pkt len=%d state=%s\n", 
			length, tcpstate[tcb->state]);

		if(length != 0){
			switch(tcb->state){
			case SYN_RECEIVED:


@@ 366,8 347,7 @@ process:
				break;
			}
		}
		while(tcb->reseq != 0 &&
		      seq_ge(tcb->rcv.nxt, tcb->reseq->seg.seq)){
		while(tcb->reseq != 0 && seq_ge(tcb->rcv.nxt, tcb->reseq->seg.seq)) {
			get_reseq(tcb, &tos, &seg, &bp, &length);
			if(trim(tcb, &seg, &bp, &length) == 0)
				goto gotone;


@@ 467,9 447,6 @@ reset(Ipaddr source, Ipaddr dest, char tos, ushort length, Tcp *seg)
	if((hbp = htontcp(seg, 0, &ph)) == 0)
		return;

	DPRINT("Reset: seq = %lux ack = %d flags = %lux\n",
	       seg->seq, seg->ack, seg->flags);

	PUTNEXT(Ipoutput, hbp);
}