Skip to content

Commit 22e0f96

Browse files
lxinchucklever
authored andcommitted
tlshd: receive new session ticket msg after completing quic handshake
The latest update to the QUIC module changed to use NEW_SESSION_TICKET event or SESSION_TICKET socket option to receive new session ticket msg after handshake to avoid blocking the app data receiving before getting the new session ticket msg in the previous recvmsg() way. So delete the callback tlshd_quic_client_ticket_recv() and introduce tlshd_quic_recv_session_ticket() called after handshake is completed. In this function, it will try for conn->recv_ticket (from kernel) secs in a loop to get the ticket msg via SESSION_TICKET socket option and pass the session data back to kernel after processing the msg. Signed-off-by: Xin Long <[email protected]>
1 parent 3fa2c5e commit 22e0f96

File tree

2 files changed

+52
-33
lines changed

2 files changed

+52
-33
lines changed

src/tlshd/client.c

Lines changed: 0 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -455,33 +455,6 @@ static int tlshd_quic_client_x509_verify_function(gnutls_session_t session)
455455
return tlshd_client_x509_verify_function(session, conn->parms);
456456
}
457457

458-
static int tlshd_quic_client_ticket_recv(gnutls_session_t session, unsigned int htype,
459-
unsigned int when, unsigned int incoming,
460-
const gnutls_datum_t *msg)
461-
{
462-
struct tlshd_quic_conn *conn = gnutls_session_get_ptr(session);
463-
int ret, sockfd = conn->parms->sockfd;
464-
gnutls_datum_t ticket;
465-
466-
if (htype != GNUTLS_HANDSHAKE_NEW_SESSION_TICKET)
467-
return 0;
468-
469-
conn->completed = 1;
470-
ret = gnutls_session_get_data2(session, &ticket);
471-
if (ret) {
472-
tlshd_log_gnutls_error(ret);
473-
return ret;
474-
}
475-
476-
ret = setsockopt(sockfd, SOL_QUIC, QUIC_SOCKOPT_SESSION_TICKET, ticket.data, ticket.size);
477-
if (ret) {
478-
tlshd_log_error("socket setsockopt session ticket error %d %u", errno, ticket.size);
479-
return -1;
480-
}
481-
tlshd_log_debug(" Ticket recv: %u %u %u", when, incoming, msg->size);
482-
return 0;
483-
}
484-
485458
#define TLSHD_QUIC_NO_CERT_AUTH 3
486459

487460
static int tlshd_quic_client_set_x509_session(struct tlshd_quic_conn *conn)
@@ -525,8 +498,6 @@ static int tlshd_quic_client_set_x509_session(struct tlshd_quic_conn *conn)
525498
GNUTLS_ENABLE_EARLY_DATA | GNUTLS_NO_END_OF_EARLY_DATA);
526499
if (ret)
527500
goto err_cred;
528-
gnutls_handshake_set_hook_function(session, GNUTLS_HANDSHAKE_ANY,
529-
GNUTLS_HOOK_POST, tlshd_quic_client_ticket_recv);
530501
gnutls_session_set_ptr(session, conn);
531502
if (conn->ticket_len) {
532503
ret = gnutls_session_set_data(session, conn->ticket, conn->ticket_len);
@@ -585,8 +556,6 @@ static int tlshd_quic_client_set_psk_session(struct tlshd_quic_conn *conn)
585556
ret = gnutls_init(&session, GNUTLS_CLIENT);
586557
if (ret)
587558
goto err_cred;
588-
gnutls_handshake_set_hook_function(session, GNUTLS_HANDSHAKE_ANY,
589-
GNUTLS_HOOK_POST, tlshd_quic_client_ticket_recv);
590559
gnutls_session_set_ptr(session, conn);
591560
ret = gnutls_credentials_set(session, GNUTLS_CRD_PSK, cred);
592561
if (ret)

src/tlshd/quic.c

Lines changed: 52 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
#include <linux/tls.h>
2424
#include <keyutils.h>
2525
#include <stdbool.h>
26+
#include <unistd.h>
2627
#include <glib.h>
2728

2829
#include "config.h"
@@ -139,8 +140,7 @@ static int quic_secret_func(gnutls_session_t session, gnutls_record_encryption_l
139140
return ret;
140141
}
141142
}
142-
if (!conn->recv_ticket)
143-
conn->completed = 1;
143+
conn->completed = 1;
144144
}
145145
}
146146
tlshd_log_debug(" Secret func: %u %u %u", secret.level, !!tx_secret, !!rx_secret);
@@ -502,6 +502,54 @@ static int tlshd_quic_session_configure(struct tlshd_quic_conn *conn)
502502
GNUTLS_EXT_FLAG_TLS | GNUTLS_EXT_FLAG_CLIENT_HELLO | GNUTLS_EXT_FLAG_EE);
503503
}
504504

505+
static void tlshd_quic_recv_session_ticket(struct tlshd_quic_conn *conn)
506+
{
507+
gnutls_session_t session = conn->session;
508+
int i, ret, sockfd = conn->parms->sockfd;
509+
unsigned int len;
510+
size_t size;
511+
512+
if (conn->is_serv || !conn->recv_ticket)
513+
return;
514+
515+
for (i = 0; i < 10 * conn->recv_ticket; i++) { /* wait and try for conn->recv_ticket secs */
516+
len = sizeof(conn->ticket);
517+
ret = getsockopt(sockfd, SOL_QUIC, QUIC_SOCKOPT_SESSION_TICKET, conn->ticket, &len);
518+
if (ret) {
519+
tlshd_log_error("socket getsockopt session ticket error %d", errno);
520+
conn->errcode = errno;
521+
return;
522+
}
523+
if (len)
524+
break;
525+
usleep(100000);
526+
}
527+
if (i == 10 * conn->recv_ticket)
528+
return;
529+
530+
/* process new session ticket msg and get the generated session data */
531+
ret = quic_handshake_crypto_data(conn, QUIC_CRYPTO_APP, conn->ticket, len);
532+
if (ret) {
533+
conn->errcode = -ret;
534+
return;
535+
}
536+
size = sizeof(conn->ticket);
537+
ret = gnutls_session_get_data(session, conn->ticket, &size);
538+
if (ret) {
539+
tlshd_log_gnutls_error(ret);
540+
conn->errcode = -ret;
541+
return;
542+
}
543+
544+
/* set it back to kernel for session resumption of next connection */
545+
len = size;
546+
ret = setsockopt(sockfd, SOL_QUIC, QUIC_SOCKOPT_SESSION_TICKET, conn->ticket, len);
547+
if (ret) {
548+
tlshd_log_error("socket setsockopt session ticket error %d %u", errno, len);
549+
conn->errcode = errno;
550+
}
551+
}
552+
505553
/**
506554
* tlshd_quic_start_handshake - Drive the handshake interaction
507555
* @conn: QUIC handshake context
@@ -582,5 +630,7 @@ void tlshd_quic_start_handshake(struct tlshd_quic_conn *conn)
582630
msg = conn->send_list;
583631
}
584632
}
633+
634+
tlshd_quic_recv_session_ticket(conn);
585635
}
586636
#endif

0 commit comments

Comments
 (0)