M port/devcons.c => port/devcons.c +8 -5
@@ 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'<buf[0])
+ if(strncmp(buf, "start", 5) == 0){
+ kickpager(); /* start a pager if not already started */
+ break;
+ }
+ if(conf.cntrlp && strcmp(u->p->user, eve) != 0)
+ error(Eperm);
+ if(buf[0]<'0' || '9'<buf[0])
error(Ebadarg);
fd = strtoul(buf, 0, 0);
swc = fdtochan(fd, -1, 1);
setswapchan(swc);
- return n;
+ break;
default:
print("conswrite: %d\n", c->qid.path);
M port/ipdat.h => port/ipdat.h +1 -4
@@ 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;
};
M port/segment.c => port/segment.c +6 -0
@@ 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);
}
M port/stil.c => port/stil.c +1 -1
@@ 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;
M port/tcpinput.c => port/tcpinput.c +19 -26
@@ 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;