From c03433fc0d689ef2a854cd6110172a93bf4e91b5 Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Tue, 10 Mar 1992 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 1992-03-10 --- port/devcons.c | 13 ++++++++----- port/ipdat.h | 5 +---- port/segment.c | 6 ++++++ port/stil.c | 2 +- port/tcpinput.c | 45 +++++++++++++++++++-------------------------- 5 files changed, 35 insertions(+), 36 deletions(-) diff --git a/port/devcons.c b/port/devcons.c index 62865cb3ac360047e10512fd1e90843e5b6dc632..aa9e43e67340c3387a607d0657579407851a1c4b 100644 --- a/port/devcons.c +++ b/port/devcons.c @@ -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'p->user, eve) != 0) + error(Eperm); + if(buf[0]<'0' || '9'qid.path); diff --git a/port/ipdat.h b/port/ipdat.h index 9dc01f2b6184f87de3681c48e4d9b952a24ddad6..56f4e08d6a8485da0724f16f8de033464e478c76 100644 --- a/port/ipdat.h +++ b/port/ipdat.h @@ -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; }; diff --git a/port/segment.c b/port/segment.c index 6c25f5d92ca43f41b34bb9b8b3153efd94ee21e0..40687d5d3b301e6b813941b459ede0478fe5c337 100644 --- a/port/segment.c +++ b/port/segment.c @@ -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); } diff --git a/port/stil.c b/port/stil.c index 1031dd903f49d61e2dfdb1b099f6c7be30ac779e..84beaa53e9a6eec4f728f57e01f01b95a1ec9594 100644 --- a/port/stil.c +++ b/port/stil.c @@ -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; diff --git a/port/tcpinput.c b/port/tcpinput.c index c55bb05f5726847eade3eb7bf8b67117fcf3a100..d190ba3f888547f76e94137d233e406a99d9714d 100644 --- a/port/tcpinput.c +++ b/port/tcpinput.c @@ -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;