SSL_set_accept_state(ctx->ssl);
}
else {
- int ssl_err;
struct server *srv = __objt_server(ctx->conn->target);
if (qc_ssl_sess_init(qc, srv->ssl_ctx.ctx, &ctx->ssl, conn, 0) == -1)
goto err;
SSL_set_connect_state(ctx->ssl);
- ssl_err = SSL_do_handshake(ctx->ssl);
- TRACE_PROTO("SSL_do_handshake() called", QUIC_EV_CONN_NEW, qc, &ssl_err);
- if (ssl_err != 1) {
- ssl_err = SSL_get_error(ctx->ssl, ssl_err);
- if (ssl_err == SSL_ERROR_WANT_READ || ssl_err == SSL_ERROR_WANT_WRITE) {
- TRACE_PROTO("SSL handshake in progress", QUIC_EV_CONN_NEW, qc, &ssl_err);
- }
- else {
- TRACE_ERROR("SSL handshake error", QUIC_EV_CONN_NEW, qc, &ssl_err);
- HA_ATOMIC_INC(&qc->prx_counters->hdshk_fail);
- qc_ssl_dump_errors(ctx->conn);
- ERR_clear_error();
- goto err;
- }
- }
-
- /* Wakeup the handshake I/O handler tasklet asap to send data */
- tasklet_wakeup(qc->wait_event.tasklet);
}
ctx->xprt = xprt_get(XPRT_QUIC);
#include <haproxy/buf.h>
#include <haproxy/connection.h>
#include <haproxy/quic_conn.h>
+#include <haproxy/quic_ssl.h>
#include <haproxy/ssl_sock.h>
#include <haproxy/quic_trace.h>
#include <haproxy/trace.h>
struct server *srv = objt_server(conn->target);
qc = qc_new_conn(quic_version_1, ipv4, NULL, NULL, NULL,
NULL, NULL, &srv->addr, 0, srv, conn);
+ if (qc)
+ conn->flags |= CO_FL_SSL_WAIT_HS | CO_FL_WAIT_L6_CONN;
}
if (!qc)
qc->mux_state = QC_MUX_READY;
}
else {
- conn->flags |= CO_FL_SSL_WAIT_HS | CO_FL_WAIT_L6_CONN;
+ /* This has as side effet to create a SSL_SESSION object attached to
+ * the SSL object.
+ */
+ if (!qc_ssl_do_hanshake(qc, ctx))
+ goto out;
}
/* Schedule quic-conn to ensure post handshake frames are emitted. This
* is not done for 0-RTT as xprt->start happens before handshake
* completion.
*/
- if (qc->flags & QUIC_FL_CONN_NEED_POST_HANDSHAKE_FRMS)
+ if (qc_is_back(qc) || (qc->flags & QUIC_FL_CONN_NEED_POST_HANDSHAKE_FRMS))
tasklet_wakeup(qc->wait_event.tasklet);
ret = 1;