int sk_open(sock *, struct birdloop *); /* Open socket */
void sk_reloop(sock *, struct birdloop *); /* Move socket to another loop. Both loops must be locked. */
+static inline void sk_close(sock *s) { rfree(&s->r); } /* Explicitly close socket */
int sk_rx_ready(sock *s);
_Bool sk_tx_pending(sock *s);
if (defer)
{
- rfree(c->sock);
+ sk_close(c->sock);
c->sock = NULL;
}
else
err:
sk_log_error(sk, p->p.name);
- rfree(sk);
+ sk_close(sk);
return 0;
}
return;
if (ifa->sk)
- rfree(ifa->sk);
+ sk_close(ifa->sk);
if (ifa->rx)
- rfree(ifa->rx);
+ sk_close(ifa->rx);
rem_node(&ifa->n);
mb_free(ifa);
err:
sk_log_error(sk, p->p.name);
- rfree(sk);
+ sk_close(sk);
return NULL;
}
err:
sk_log_error(sk, p->p.name);
- rfree(sk);
+ sk_close(sk);
return NULL;
}
err:
sk_log_error(sk, p->p.name);
- rfree(sk);
+ sk_close(sk);
return NULL;
}
{
sk_log_error(sk, p->p.name);
log(L_ERR "%s: Cannot open listening socket", p->p.name);
- rfree(sk);
+ sk_close(sk);
UNLOCK_DOMAIN(rtable, bgp_listen_domain);
bgp_initiate_disable(p, BEM_NO_SOCKET);
WALK_LIST_DELSAFE(bs, nxt, bgp_sockets)
if (EMPTY_LIST(bs->requests))
{
- rfree(bs->sk);
+ sk_close(bs->sk);
rem_node(&bs->n);
mb_free(bs);
}
rfree(conn->tx_ev);
conn->tx_ev = NULL;
- rfree(conn->sk);
+ sk_close(conn->sk);
conn->sk = NULL;
mb_free(conn->local_caps);
{
log(L_WARN "BGP: Unexpected connect from unknown address %I%J (port %d)",
sk->daddr, ipa_is_link_local(sk->daddr) ? sk->iface : NULL, sk->dport);
- rfree(sk);
+ sk_close(sk);
return 0;
}
if (!acc)
{
- rfree(sk);
+ sk_close(sk);
goto leave;
}
err:
sk_log_error(sk, p->p.name);
log(L_ERR "%s: Incoming connection aborted", p->p.name);
- rfree(sk);
+ sk_close(sk);
leave:
birdloop_leave(p->p.loop);
err:
sk_log_error(sk, p->p.name);
- rfree(sk);
+ sk_close(sk);
return 0;
}
err:
sk_log_error(sk, p->p.name);
log(L_ERR "%s: Cannot open virtual link socket", p->p.name);
- rfree(sk);
+ sk_close(sk);
}
static void
err:
sk_log_error(sk, ifa->ra->p.name);
- rfree(sk);
+ sk_close(sk);
return 0;
}
err:
sk_log_error(sk, p->p.name);
- rfree(sk);
+ sk_close(sk);
return 0;
}
rem_node(NODE ifa);
- rfree(ifa->sk);
+ sk_close(ifa->sk);
rfree(ifa->lock);
rfree(ifa->timer);
if (tr->sk)
{
- rfree(tr->sk);
+ sk_close(tr->sk);
tr->sk = NULL;
}
}
if (!krt_sock_count)
{
- rfree(krt_sock);
+ sk_close(krt_sock);
krt_sock = NULL;
}
}
{
krt_table_cf[(KRT_CF->sys.table_id)/32][!!(p->af == AF_INET6)] &= ~(1 << ((KRT_CF->sys.table_id)%32));
- rfree(p->sys.sk);
+ sk_close(p->sys.sk);
p->sys.sk = NULL;
krt_buffer_release(&p->p);
/* FIXME: handle it better in rfree() */
close(t->fd);
t->fd = -1;
- rfree(t);
+ sk_close(t);
return 1;
}