From 3e376ca4675af981e063853bd3f1fc088299dce2 Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Tue, 6 Aug 2002 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 2002-08-06 --- ip/tcp.c | 32 +++++++++++++++++++++++--------- 1 file changed, 23 insertions(+), 9 deletions(-) diff --git a/ip/tcp.c b/ip/tcp.c index a7bf835d696cffcba03b9c0edfae54c47cdf033f..7604292df38a0c090b98d583185ffd218cf4cc0b 100644 --- a/ip/tcp.c +++ b/ip/tcp.c @@ -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;