static void rudpclose(Conv *c) { Rudpcb *ucb; Reliable *r, *nr; Rudppriv *upriv; upriv = c->p->priv; iphtrem(&upriv->ht, c); /* force out any delayed acks */ ucb = (Rudpcb*)c->ptcl; qlock(&ucb->ql); for(r = ucb->r; r; r = r->next){ if(r->acksent != r->rcvseq) relsendack(c, r, 0); } qunlock(&ucb->ql); qclose(c->rq); qclose(c->wq); qclose(c->eq); ipmove(c->laddr, IPnoaddr); ipmove(c->raddr, IPnoaddr); c->lport = 0; c->rport = 0; ucb->headers = 0; ucb->randdrop = 0; qlock(&ucb->ql); for(r = ucb->r; r; r = nr){ if(r->acksent != r->rcvseq) relsendack(c, r, 0); nr = r->next; relhangup(c, r); relput(r); } ucb->r = 0; qunlock(&ucb->ql); }
static void udpclose(Conv *c) { Udpcb *ucb; Udppriv *upriv; upriv = c->p->priv; iphtrem(&upriv->ht, c); c->state = 0; qclose(c->rq); qclose(c->wq); qclose(c->eq); ipmove(c->laddr, IPnoaddr); ipmove(c->raddr, IPnoaddr); c->lport = 0; c->rport = 0; ucb = (Udpcb*)c->ptcl; ucb->headers = 0; }