~kris/9p

9hist

3e376ca4675af981e063853bd3f1fc088299dce2 — David du Colombier 24 years ago 0676469
Plan 9 from Bell Labs 2002-08-06
1 files changed, 23 insertions(+), 9 deletions(-)

M ip/tcp.c
M ip/tcp.c => ip/tcp.c +23 -9
@@ 1140,7 1140,7 @@ tcpsndsyn(Tcpctl *tcb)
}

void
sndrst(Proto *tcp, uchar *source, uchar *dest, ushort length, Tcp *seg, uchar version)
sndrst(Proto *tcp, uchar *source, uchar *dest, ushort length, Tcp *seg, uchar version, char *reason)
{
	Block *hbp;
	uchar rflags;


@@ 1148,6 1148,8 @@ sndrst(Proto *tcp, uchar *source, uchar *dest, ushort length, Tcp *seg, uchar ve
	Tcp4hdr ph4;
	Tcp6hdr ph6;

	netlog(tcp->f, Logtcp, "sndrst: %s", reason);

	tpriv = tcp->priv;

	if(seg->flags & RST)


@@ 1495,6 1497,12 @@ tcpincoming(Conv *s, Tcp *segp, uchar *src, uchar *dst, uchar version)
	/* find a call in limbo */
	h = hashipa(src, segp->source);
	for(l = &tpriv->lht[h]; (lp = *l) != nil; l = &lp->next){
		netlog(s->p->f, Logtcp, "tcpincoming s %I,%ux/%I,%ux d %I,%ux/%I,%ux v %d/%d",
			src, segp->source, lp->raddr, lp->rport,
			dst, segp->dest, lp->laddr, lp->lport,
			version, lp->version
 		);

		if(lp->lport != segp->dest || lp->rport != segp->source || lp->version != version)
			continue;
		if(ipcmp(lp->laddr, dst) != 0)


@@ 1503,9 1511,11 @@ tcpincoming(Conv *s, Tcp *segp, uchar *src, uchar *dst, uchar version)
			continue;

		/* we're assuming no data with the initial SYN */
		if(segp->seq != lp->irs+1 || segp->ack != lp->iss+1)
		if(segp->seq != lp->irs+1 || segp->ack != lp->iss+1){
			netlog(s->p->f, Logtcp, "tcpincoming s %lux/%lux a %lux %lux",
				segp->seq, lp->irs+1, segp->ack, lp->iss+1);
			lp = nil;
		else{
		} else {
			tpriv->nlimbo--;
			*l = lp->next;
		}


@@ 1904,9 1914,10 @@ tcpiput(Proto *tcp, Ipifc*, Block *bp)
	/* Look for a matching conversation */
	s = iphtlook(&tpriv->ht, source, seg.source, dest, seg.dest);
	if(s == nil){
		netlog(f, Logtcp, "iphtlook failed");
reset:
		qunlock(tcp);
		sndrst(tcp, source, dest, length, &seg, version);
		sndrst(tcp, source, dest, length, &seg, version, "no conversation");
		freeblist(bp);
		return;
	}


@@ 1957,12 1968,13 @@ reset:

	switch(tcb->state) {
	case Closed:
		sndrst(tcp, source, dest, length, &seg, version);
		sndrst(tcp, source, dest, length, &seg, version, "sending to Closed");
		goto raise;
	case Syn_sent:
		if(seg.flags & ACK) {
			if(!seq_within(seg.ack, tcb->iss+1, tcb->snd.nxt)) {
				sndrst(tcp, source, dest, length, &seg, version);
				sndrst(tcp, source, dest, length, &seg, version,
					 "bad seq in Syn_sent");
				goto raise;
			}
		}


@@ 2042,7 2054,7 @@ reset:

	/* Cannot accept so answer with a rst */
	if(length && tcb->state == Closed) {
		sndrst(tcp, source, dest, length, &seg, version);
		sndrst(tcp, source, dest, length, &seg, version, "sending to Closed");
		goto raise;
	}



@@ 2077,7 2089,8 @@ reset:
		switch(tcb->state) {
		case Syn_received:
			if(!seq_within(seg.ack, tcb->snd.una+1, tcb->snd.nxt)){
				sndrst(tcp, source, dest, length, &seg, version);
				sndrst(tcp, source, dest, length, &seg, version,
					"bad seq in Syn_received");
				goto raise;
			}
			update(s, &seg);


@@ 2185,7 2198,8 @@ reset:
				/* no process to read the data, send a reset */
				if(bp != nil)
					freeblist(bp);
				sndrst(tcp, source, dest, length, &seg, version);
				sndrst(tcp, source, dest, length, &seg, version,
					"send to Finwait2");
				qunlock(s);
				poperror();
				return;