On Fri, Feb 15, 2008 at 2:23 PM, erik quanstrom <[EMAIL PROTECTED]> wrote: > >i'm not sure this is a perfect solution. i just don't have enough >of the plan 9 ip stack loaded into cache to be sure nothing's >been forgotten. but give this patch a whirl. basically, i think >the problem is that inittcpctl() was stepping on timers that might >have been active. these timers need to be shutdown. unfortunately, >tcpclose() and localclose() are too agressive. cleanupconnection() >is a chopped-down version of localclose. > >- erik > > >/n/sources/plan9//sys/src/9/ip/tcp.c:782,787 - tcp.c:782,813 > return mtu; > } > >+ static void >+ cleanupconnection(Conv *s) >+ { >+ Tcpctl *tcb; >+ Reseq *rp,*rp1; >+ Tcppriv *tpriv; >+ >+ tpriv = s->p->priv; >+ tcb = (Tcpctl*)s->ptcl; >+ >+ iphtrem(&tpriv->ht, s); >+ >+ tcphalt(tpriv, &tcb->timer); >+ tcphalt(tpriv, &tcb->rtt_timer); >+ tcphalt(tpriv, &tcb->acktimer); >+ tcphalt(tpriv, &tcb->katimer); >+ >+ /* Flush reassembly queue; nothing more can arrive */ >+ for(rp = tcb->reseq; rp != nil; rp = rp1) { >+ rp1 = rp->next; >+ freeblist(rp->bp); >+ free(rp); >+ } >+ tcb->reseq = nil; >+ } >+ > void > inittcpctl(Conv *s, int mode) > { >/n/sources/plan9//sys/src/9/ip/tcp.c:792,798 - tcp.c:818,827 > > tcb = (Tcpctl*)s->ptcl; > >- memset(tcb, 0, sizeof(Tcpctl)); >+ if(tcb->timer.arg) // c->state != Idle? >+ cleanupconnection(s); >+ else >+ memset(tcb, 0, sizeof(Tcpctl)); > > tcb->ssthresh = 65535; > tcb->srtt = tcp_irtt<<LOGAGAIN; >
works for me. I don't know the internal workings of the plan 9 ip stack so I take the risk of being silly: could be that the bug is not tcp only? iru