From 33b6d81d9f938d7232aa5700ab8fd6c902327b0b Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Mon, 4 Nov 1991 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 1991-11-04 --- port/devip.c | 36 +++++++++++++++++++----------------- port/ipdat.h | 3 +-- port/stil.c | 1 - port/tcpinput.c | 29 +++-------------------------- 4 files changed, 23 insertions(+), 46 deletions(-) diff --git a/port/devip.c b/port/devip.c index 9b13560d11d7f356409c37add85cc9d46fb63d18..030d9a4e1ad26be507c1ff7ef606ce7837ddab97 100644 --- a/port/devip.c +++ b/port/devip.c @@ -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); diff --git a/port/ipdat.h b/port/ipdat.h index bd05dfca2d2913ed57505ccdd7a8b18adcb412f3..1543746dcc108b359146c89020b04723c91106e0 100644 --- a/port/ipdat.h +++ b/port/ipdat.h @@ -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 */ diff --git a/port/stil.c b/port/stil.c index 0bad622ce57412ae1c5b2b5ec0f99b65afccced9..fef2c335d7062f77d9e5ccece722363d8d50f3db 100644 --- a/port/stil.c +++ b/port/stil.c @@ -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); diff --git a/port/tcpinput.c b/port/tcpinput.c index b34fbabf672b3781edbee1d3e4b778d30f94072f..10a1af00f608c0c5b578e389580912b4041aef39 100644 --- a/port/tcpinput.c +++ b/port/tcpinput.c @@ -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); }