-static struct rs_peer *
-_pick_peer (struct rs_connection *conn)
-{
- if (!conn->active_peer)
- conn->active_peer = conn->peers;
- return conn->active_peer;
-}
-
-static int
-_init_bev (struct rs_connection *conn, struct rs_peer *peer)
-{
- if (conn->bev)
- return RSE_OK;
-
- switch (conn->type)
- {
- case RS_CONN_TYPE_UDP:
- case RS_CONN_TYPE_TCP:
- conn->bev = bufferevent_socket_new (conn->evb, peer->fd, 0);
- if (!conn->bev)
- return rs_err_conn_push_fl (conn, RSE_EVENT, __FILE__, __LINE__,
- "bufferevent_socket_new");
- break;
-#if defined RS_ENABLE_TLS
- case RS_CONN_TYPE_TLS:
- if (rs_tls_init (conn))
- return -1;
- /* Would be convenient to pass BEV_OPT_CLOSE_ON_FREE but things
- seem to break when be_openssl_ctrl() (in libevent) calls
- SSL_set_bio() after BIO_new_socket() with flag=1. */
- conn->bev =
- bufferevent_openssl_socket_new (conn->evb, peer->fd, conn->tls_ssl,
- BUFFEREVENT_SSL_CONNECTING, 0);
- if (!conn->bev)
- return rs_err_conn_push_fl (conn, RSE_EVENT, __FILE__, __LINE__,
- "bufferevent_openssl_socket_new");
-
- break;
- case RS_CONN_TYPE_DTLS:
- return rs_err_conn_push_fl (conn, RSE_NOSYS, __FILE__, __LINE__,
- "%s: NYI", __func__);
-#endif /* RS_ENABLE_TLS */
- default:
- return rs_err_conn_push_fl (conn, RSE_INTERNAL, __FILE__, __LINE__,
- "%s: unknown connection type: %d", __func__,
- conn->type);
- }
-
- return RSE_OK;
-}
-
-static void
-_do_connect (struct rs_peer *p)
-{
- int err;
-
- err = bufferevent_socket_connect (p->conn->bev, p->addr->ai_addr,
- p->addr->ai_addrlen);
- if (err < 0)
- rs_err_conn_push_fl (p->conn, RSE_EVENT, __FILE__, __LINE__,
- "bufferevent_socket_connect: %s",
- evutil_gai_strerror(err));
- else
- p->is_connecting = 1;
-}
-
-static int
-_conn_open(struct rs_connection *conn, struct rs_packet *pkt)
-{
- struct rs_peer *p;
-
- if (_init_evb (conn))
- return -1;
-
- p = _pick_peer (conn);
- if (!p)
- return rs_err_conn_push_fl (conn, RSE_NOPEER, __FILE__, __LINE__, NULL);
-
- if (_init_socket (conn, p))
- return -1;
-
- if (_init_bev (conn, p))
- return -1;
-
- if (!p->is_connected)
- if (!p->is_connecting)
- _do_connect (p);
-
- return RSE_OK;
-}
-
-static int
-_conn_is_open_p (struct rs_connection *conn)
-{
- return conn->active_peer && conn->active_peer->is_connected;
-}
-