Beispiel #1
0
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;
}
Beispiel #2
0
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;
}
Beispiel #3
0
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");
  }
}