static int session_connected(session_context *sc) { int ret = 0; acquire_peername(sc); log_info("(%s:%d) Client connected", sc->client_ip_str, sc->client_port); if (connect_to_backend(sc) != 0) { session_report_error(ret, sc, "session_connected due to backend connect failed"); } mbedtls_ssl_set_bio(&sc->ssl, &sc->backend_fd, mbedtls_net_send, mbedtls_net_recv, 0); return ret == 0 ? 0 : 1; }
struct epoll_event_handler* create_client_socket_handler(int client_socket_fd, int epoll_fd, char* backend_addr, char* backend_port_str) { make_socket_non_blocking(client_socket_fd); struct client_socket_event_data* closure = malloc(sizeof(struct client_socket_event_data)); struct epoll_event_handler* result = malloc(sizeof(struct epoll_event_handler)); result->fd = client_socket_fd; result->handle = handle_client_socket_event; result->closure = closure; closure->backend_handler = connect_to_backend(result, epoll_fd, backend_addr, backend_port_str); return result; }
static void session_step_handshake(EV_P_ ev_io *w, int revents, session_context *sc) { int ret = mbedtls_ssl_handshake(&sc->ssl); char error[128] = {0}; (void)w; (void)revents; switch (ret) { case MBEDTLS_ERR_SSL_WANT_READ: case MBEDTLS_ERR_SSL_WANT_WRITE: case MBEDTLS_ERR_NET_RECV_FAILED: mbedtls_strerror(ret, error, 128); log_debug("mbedtls handshake return %s", error); session_mark_activity(EV_A_ sc); return; case 0: log_debug("(%s:%d) DTLS handshake done", sc->options->backend_host, sc->options->backend_port); session_mark_activity(EV_A_ sc); #if 0 if (connect_to_backend(EV_A_ sc) != 0) { return session_deferred_free_after_error(sc, ret, "session_step_send_backend"); } #endif sc->step = GOLDY_SESSION_STEP_OPERATIONAL; session_enable_client_rxtx(EV_A_ sc); return; case MBEDTLS_ERR_SSL_HELLO_VERIFY_REQUIRED: log_debug("(%s:%d) DTLS handshake requested hello verification", sc->options->backend_host, sc->options->backend_port); session_deferred_free(sc, "hello verification"); return; default: mbedtls_strerror(ret, error, 128); log_debug("unknow mbedtls error %s", error); return session_deferred_free_after_error(sc, ret, "session_cb - ssl handshake"); } }