M ip/devip.c => ip/devip.c +2 -2
@@ 988,7 988,7 @@ ipwrite(Chan* ch, void *v, long n, vlong off)
error(Eperm);
qwrite(c->wq, a, n);
- x->kick(c, n);
+ x->kick(c);
break;
case Qarp:
return arpwrite(f, a, n);
@@ 1081,7 1081,7 @@ ipbwrite(Chan* ch, Block* bp, ulong offset)
bp = concatblock(bp);
n = BLEN(bp);
qbwrite(c->wq, bp);
- x->kick(c, n);
+ x->kick(c);
return n;
default:
return devbwrite(ch, bp, offset);
M ip/esp.c => ip/esp.c +1 -1
@@ 220,7 220,7 @@ espclose(Conv *c)
}
void
-espkick(Conv *c, int)
+espkick(Conv *c)
{
Esphdr *eh;
Esptail *et;
M ip/gre.c => ip/gre.c +1 -3
@@ 119,14 119,12 @@ greclose(Conv *c)
int drop;
static void
-grekick(Conv *c, int l)
+grekick(Conv *c)
{
GREhdr *ghp;
Block *bp;
uchar laddr[IPaddrlen], raddr[IPaddrlen];
- USED(l);
-
bp = qget(c->wq);
if(bp == nil)
return;
M ip/icmp.c => ip/icmp.c +1 -2
@@ 148,13 148,12 @@ icmpclose(Conv *c)
}
static void
-icmpkick(Conv *c, int l)
+icmpkick(Conv *c)
{
Icmp *p;
Block *bp;
Icmppriv *ipriv;
- USED(l);
bp = qget(c->wq);
if(bp == nil)
return;
M ip/il.c => ip/il.c +1 -4
@@ 335,7 335,7 @@ ilclose(Conv *c)
}
void
-ilkick(Conv *c, int l)
+ilkick(Conv *c)
{
Ilhdr *ih;
Ilcb *ic;
@@ 345,9 345,6 @@ ilkick(Conv *c, int l)
Fs *f;
Ilpriv *priv;
-
- USED(l);
-
f = c->p->f;
priv = c->p->priv;
ic = (Ilcb*)c->ptcl;
M ip/ip.h => ip/ip.h +1 -1
@@ 235,7 235,7 @@ struct Proto
int x; /* protocol index */
int ipproto; /* ip protocol type */
- void (*kick)(Conv*, int);
+ void (*kick)(Conv*);
char* (*connect)(Conv*, char**, int);
char* (*announce)(Conv*, char**, int);
char* (*bind)(Conv*, char**, int);
M ip/ipifc.c => ip/ipifc.c +1 -1
@@ 257,7 257,7 @@ ipifcinuse(Conv *c)
* called when a process writes to an interface's 'data'
*/
static void
-ipifckick(Conv *c, int)
+ipifckick(Conv *c)
{
Block *bp;
Ipifc *ifc;
M ip/ipmux.c => ip/ipmux.c +1 -1
@@ 626,7 626,7 @@ ipmuxclose(Conv *c)
* the stack
*/
static void
-ipmuxkick(Conv *c, int)
+ipmuxkick(Conv *c)
{
Block *bp;
Iphdr *ih;
M ip/rudp.c => ip/rudp.c +1 -1
@@ 333,7 333,7 @@ flow(void *v)
}
void
-rudpkick(Conv *c, int)
+rudpkick(Conv *c)
{
Udphdr *uh;
ushort rport;
M ip/tcp.c => ip/tcp.c +15 -16
@@ 176,7 176,6 @@ struct Tcpctl
uchar backoff; /* Exponential backoff counter */
int backedoff; /* ms we've backed off for rexmits */
uchar flags; /* State flags */
- ulong sndcnt; /* Amount of data in send queue */
Reseq *reseq; /* Resequencing queue */
Timer timer; /* Activity timer */
Timer acktimer; /* Acknowledge timer */
@@ 189,6 188,7 @@ struct Tcpctl
uint sndsyntime; /* time syn sent */
ulong time; /* time Finwait2 or Syn_received was sent */
int nochecksum; /* non-zero means don't send checksums */
+ int flgcnt; /* 1 when we're waiting for a SYN/FIN ACK */
Tcphdr protohdr; /* prototype header */
};
@@ 393,13 393,13 @@ tcpclose(Conv *c)
break;
case Syn_received:
case Established:
- tcb->sndcnt++;
+ tcb->flgcnt++;
tcb->snd.nxt++;
tcpsetstate(c, Finwait1);
tcpoutput(c);
break;
case Close_wait:
- tcb->sndcnt++;
+ tcb->flgcnt++;
tcb->snd.nxt++;
tcpsetstate(c, Last_ack);
tcpoutput(c);
@@ 408,7 408,7 @@ tcpclose(Conv *c)
}
void
-tcpkick(Conv *s, int len)
+tcpkick(Conv *s)
{
Tcpctl *tcb;
@@ 433,7 433,6 @@ tcpkick(Conv *s, int len)
/*
* Push data
*/
- tcb->sndcnt += len;
tcprcvwin(s);
tcpoutput(s);
break;
@@ 888,7 887,7 @@ tcpsndsyn(Tcpctl *tcb)
tcb->snd.una = tcb->iss;
tcb->snd.ptr = tcb->rttseq;
tcb->snd.nxt = tcb->rttseq;
- tcb->sndcnt++;
+ tcb->flgcnt++;
tcb->flags |= FORCE;
tcb->sndsyntime = msec;
}
@@ 1150,7 1149,7 @@ update(Conv *s, Tcp *seg)
if((tcb->flags & SYNACK) == 0) {
tcb->flags |= SYNACK;
acked--;
- tcb->sndcnt--;
+ tcb->flgcnt--;
goto done;
}
@@ 1200,9 1199,9 @@ update(Conv *s, Tcp *seg)
}
done:
- qdiscard(s->wq, acked);
+ if(qdiscard(s->wq, acked) < acked)
+ tcb->flgcnt--;
- tcb->sndcnt -= acked;
tcb->snd.una = seg->ack;
if(seq_gt(seg->ack, tcb->snd.urg))
tcb->snd.urg = seg->ack;
@@ 1380,7 1379,7 @@ reset:
if(tcptrim(tcb, &seg, &bp, &length) == -1) {
netlog(f, Logtcp, "tcp len < 0, %lux\n", seg.seq);
update(s, &seg);
- if(tcb->sndcnt == 0 && tcb->state == Closing) {
+ if(qlen(s->wq)+tcb->flgcnt == 0 && tcb->state == Closing) {
tcphalt(tpriv, &tcb->rtt_timer);
tcphalt(tpriv, &tcb->acktimer);
tcphalt(tpriv, &tcb->katimer);
@@ 1445,7 1444,7 @@ reset:
break;
case Finwait1:
update(s, &seg);
- if(tcb->sndcnt == 0){
+ if(qlen(s->wq)+tcb->flgcnt == 0){
tcphalt(tpriv, &tcb->rtt_timer);
tcphalt(tpriv, &tcb->acktimer);
tcpsetkacounter(tcb);
@@ 1460,7 1459,7 @@ reset:
break;
case Closing:
update(s, &seg);
- if(tcb->sndcnt == 0) {
+ if(qlen(s->wq)+tcb->flgcnt == 0) {
tcphalt(tpriv, &tcb->rtt_timer);
tcphalt(tpriv, &tcb->acktimer);
tcphalt(tpriv, &tcb->katimer);
@@ 1471,7 1470,7 @@ reset:
break;
case Last_ack:
update(s, &seg);
- if(tcb->sndcnt == 0) {
+ if(qlen(s->wq)+tcb->flgcnt == 0) {
localclose(s, nil);
goto raise;
}
@@ 1560,7 1559,7 @@ reset:
break;
case Finwait1:
tcb->rcv.nxt++;
- if(tcb->sndcnt == 0) {
+ if(qlen(s->wq)+tcb->flgcnt == 0) {
tcphalt(tpriv, &tcb->rtt_timer);
tcphalt(tpriv, &tcb->acktimer);
tcphalt(tpriv, &tcb->katimer);
@@ 1616,7 1615,7 @@ raise:
qunlock(s);
poperror();
freeblist(bp);
- tcpkick(s, 0);
+ tcpkick(s);
}
/*
@@ 1656,7 1655,7 @@ tcpoutput(Conv *s)
tcb->flags |= FORCE;
}
- sndcnt = tcb->sndcnt;
+ sndcnt = qlen(s->wq)+tcb->flgcnt;
sent = tcb->snd.ptr - tcb->snd.una;
/* Don't send anything else until our SYN has been acked */
M ip/udp.c => ip/udp.c +1 -1
@@ 147,7 147,7 @@ udpclose(Conv *c)
}
void
-udpkick(Conv *c, int)
+udpkick(Conv *c)
{
Udphdr *uh;
ushort rport;
M port/portfns.h => port/portfns.h +1 -1
@@ 233,7 233,7 @@ int qcanread(Queue*);
void qclose(Queue*);
int qconsume(Queue*, void*, int);
Block* qcopy(Queue*, int, ulong);
-void qdiscard(Queue*, int);
+int qdiscard(Queue*, int);
void qflush(Queue*);
void qfree(Queue*);
int qfull(Queue*);
M port/qio.c => port/qio.c +3 -1
@@ 406,7 406,7 @@ qget(Queue *q)
/*
* throw away the next 'len' bytes in the queue
*/
-void
+int
qdiscard(Queue *q, int len)
{
Block *b;
@@ 443,6 443,8 @@ qdiscard(Queue *q, int len)
if(dowakeup)
wakeup(&q->wr);
+
+ return sofar;
}
/*