M ip/ip.h => ip/ip.h +2 -1
@@ 390,13 390,14 @@ enum
Logilmsg= 1<<8,
Loggre= 1<<9,
Logppp= 1<<10,
- Logtcpmsg= 1<<11,
+ Logtcprxmt= 1<<11,
Logigmp= 1<<12,
Logudpmsg= 1<<13,
Logipmsg= 1<<14,
Logrudp= 1<<15,
Logrudpmsg= 1<<16,
Logesp= 1<<17,
+ Logtcpwin= 1<<18,
};
void netloginit(Fs*);
M ip/netlog.c => ip/netlog.c +2 -1
@@ 46,7 46,8 @@ static Netlogflag flags[] =
{ "compress", Logcompress, },
{ "ilmsg", Logil|Logilmsg, },
{ "gre", Loggre, },
- { "tcpmsg", Logtcp|Logtcpmsg, },
+ { "tcpwin", Logtcp|Logtcpwin, },
+ { "tcprxmt", Logtcp|Logtcprxmt, },
{ "udpmsg", Logudp|Logudpmsg, },
{ "ipmsg", Logip|Logipmsg, },
{ "esp", Logesp, },
M ip/tcp.c => ip/tcp.c +11 -12
@@ 576,7 576,7 @@ static void
tcpcreate(Conv *c)
{
c->rq = qopen(QMAX, Qcoalesce, tcpacktimer, c);
- c->wq = qopen(2*QMAX, Qkick, tcpkick, c);
+ c->wq = qopen(4*QMAX, Qkick, tcpkick, c);
}
static void
@@ 1662,7 1662,7 @@ update(Conv *s, Tcp *seg)
&& seg->wnd == tcb->snd.wnd) {
/* this is a pure ack w/o window update */
- netlog(s->p->f, Logtcpmsg, "dupack %lud ack %lud sndwnd %d advwin %d\n",
+ netlog(s->p->f, Logtcprxmt, "dupack %lud ack %lud sndwnd %d advwin %d\n",
tcb->snd.dupacks, seg->ack, tcb->snd.wnd, seg->wnd);
if(++tcb->snd.dupacks == TCPREXMTTHRESH) {
@@ 1672,7 1672,7 @@ update(Conv *s, Tcp *seg)
*/
tcb->snd.recovery = 1;
tcb->snd.rxt = tcb->snd.nxt;
- netlog(s->p->f, Logtcpmsg, "fast rxt %lud, nxt %lud\n", tcb->snd.una, tcb->snd.nxt);
+ netlog(s->p->f, Logtcprxmt, "fast rxt %lud, nxt %lud\n", tcb->snd.una, tcb->snd.nxt);
tcprxmit(s);
} else {
/* do reno tcp here. */
@@ 2303,7 2303,7 @@ tcpoutput(Conv *s)
if(sent != 0) {
if((tcb->flags&FORCE) == 0)
break;
- tcb->snd.ptr = tcb->snd.una;
+// tcb->snd.ptr = tcb->snd.una;
}
usable = 1;
}
@@ 2443,11 2443,7 @@ tcpoutput(Conv *s)
tpriv->stats[OutSegs]++;
if(tcb->kacounter > 0)
tcpgo(tpriv, &tcb->katimer);
- qunlock(s);
- if(waserror()){
- qlock(s);
- nexterror();
- }
+
switch(version){
case V4:
ipoput4(f, hbp, 0, s->ttl, s->tos);
@@ 2458,8 2454,11 @@ tcpoutput(Conv *s)
default:
panic("tcpoutput2: version %d", version);
}
- qlock(s);
- poperror();
+ if((msgs%4) == 1){
+ qunlock(s);
+ sched();
+ qlock(s);
+ }
}
}
@@ 2641,8 2640,8 @@ tcptimeout(void *arg)
localclose(s, Etimedout);
break;
}
+ netlog(s->p->f, Logtcprxmt, "timeout rexmit 0x%lux %d/%d\n", tcb->snd.una, tcb->timer.start, NOW);
tcpsettimer(tcb);
- netlog(s->p->f, Logtcp, "timeout rexmit 0x%lux\n", tcb->snd.una);
tcprxmit(s);
tpriv->stats[RetransTimeouts]++;
tcb->snd.dupacks = 0;
M port/qio.c => port/qio.c +3 -1
@@ 1124,6 1124,8 @@ qnotfull(void *a)
return q->len < q->limit || (q->state & Qclosed);
}
+ulong noblockcnt;
+
/*
* add a block to a queue obeying flow control
*/
@@ 1156,6 1158,7 @@ qbwrite(Queue *q, Block *b)
if(q->noblock){
iunlock(q);
freeb(b);
+ noblockcnt += n;
qunlock(&q->wlock);
poperror();
return n;
@@ 1448,7 1451,6 @@ qsetlimit(Queue *q, int limit)
void
qnoblock(Queue *q, int onoff)
{
-print("nonblocking %d\n", onoff);
q->noblock = onoff;
}