diff options
author | zhenwei pi <pizhenwei@bytedance.com> | 2022-07-27 10:46:31 +0800 |
---|---|---|
committer | zhenwei pi <pizhenwei@bytedance.com> | 2022-08-22 15:11:44 +0800 |
commit | 1234e3a5628260658adfe9065cb58ec5c1cb5ebe (patch) | |
tree | 98275a38f8d2938d7438c422371c758f28645d9a /src/tls.c | |
parent | c4c02f80365e5f7a82efa6a4d4f247503f54a5d8 (diff) | |
download | redis-1234e3a5628260658adfe9065cb58ec5c1cb5ebe.tar.gz |
Fully abstract connection type
Abstract common interface of connection type, so Redis can hide the
implementation and uplayer only calls connection API without macro.
uplayer
|
connection layer
/ \
socket TLS
Currently, for both socket and TLS, all the methods of connection type
are declared as static functions.
It's possible to build TLS(even socket) as a shared library, and Redis
loads it dynamically in the next step.
Also add helper function connTypeOfCluster() and
connTypeOfReplication() to simplify the code:
link->conn = server.tls_cluster ? connCreateTLS() : connCreateSocket();
-> link->conn = connCreate(connTypeOfCluster());
Signed-off-by: zhenwei pi <pizhenwei@bytedance.com>
Diffstat (limited to 'src/tls.c')
-rw-r--r-- | src/tls.c | 38 |
1 files changed, 14 insertions, 24 deletions
@@ -56,8 +56,6 @@ #define REDIS_TLS_PROTO_DEFAULT (REDIS_TLS_PROTO_TLSv1_2) #endif -extern ConnectionType CT_Socket; - static SSL_CTX *redis_tls_ctx = NULL; static SSL_CTX *redis_tls_client_ctx = NULL; @@ -421,7 +419,7 @@ error: #define TLSCONN_DEBUG(fmt, ...) #endif -ConnectionType CT_TLS; +static ConnectionType CT_TLS; /* Normal socket connections have a simple events/handler correlation. * @@ -466,7 +464,7 @@ static connection *createTLSConnection(int client_side) { return (connection *) conn; } -connection *connCreateTLS(void) { +static connection *connCreateTLS(void) { return createTLSConnection(1); } @@ -487,7 +485,8 @@ static void updateTLSError(tls_connection *conn) { * Callers should use connGetState() and verify the created connection * is not in an error state. */ -connection *connCreateAcceptedTLS(int fd, int require_auth) { +static connection *connCreateAcceptedTLS(int fd, void *priv) { + int require_auth = *(int *)priv; tls_connection *conn = (tls_connection *) createTLSConnection(0); conn->c.fd = fd; conn->c.state = CONN_STATE_ACCEPTING; @@ -550,7 +549,7 @@ static int handleSSLReturnCode(tls_connection *conn, int ret_value, WantIOType * return 0; } -void registerSSLEvent(tls_connection *conn, WantIOType want) { +static void registerSSLEvent(tls_connection *conn, WantIOType want) { int mask = aeGetFileEvents(server.el, conn->c.fd); switch (want) { @@ -570,7 +569,7 @@ void registerSSLEvent(tls_connection *conn, WantIOType want) { } } -void updateSSLEvent(tls_connection *conn) { +static void updateSSLEvent(tls_connection *conn) { int mask = aeGetFileEvents(server.el, conn->c.fd); int need_read = conn->c.read_handler || (conn->flags & TLS_CONN_FLAG_WRITE_WANT_READ); int need_write = conn->c.write_handler || (conn->flags & TLS_CONN_FLAG_READ_WANT_WRITE); @@ -744,7 +743,7 @@ static void connTLSClose(connection *conn_) { conn->pending_list_node = NULL; } - CT_Socket.close(conn_); + connectionByType(CONN_TYPE_SOCKET)->close(conn_); } static int connTLSAccept(connection *_conn, ConnectionCallbackFunc accept_handler) { @@ -783,7 +782,7 @@ static int connTLSConnect(connection *conn_, const char *addr, int port, const c ERR_clear_error(); /* Initiate Socket connection first */ - if (CT_Socket.connect(conn_, addr, port, src_addr, connect_handler) == C_ERR) return C_ERR; + if (connectionByType(CONN_TYPE_SOCKET)->connect(conn_, addr, port, src_addr, connect_handler) == C_ERR) return C_ERR; /* Return now, once the socket is connected we'll initiate * TLS connection from the event handler. @@ -911,7 +910,7 @@ static const char *connTLSGetLastError(connection *conn_) { return NULL; } -int connTLSSetWriteHandler(connection *conn, ConnectionCallbackFunc func, int barrier) { +static int connTLSSetWriteHandler(connection *conn, ConnectionCallbackFunc func, int barrier) { conn->write_handler = func; if (barrier) conn->flags |= CONN_FLAG_WRITE_BARRIER; @@ -921,7 +920,7 @@ int connTLSSetWriteHandler(connection *conn, ConnectionCallbackFunc func, int ba return C_OK; } -int connTLSSetReadHandler(connection *conn, ConnectionCallbackFunc func) { +static int connTLSSetReadHandler(connection *conn, ConnectionCallbackFunc func) { conn->read_handler = func; updateSSLEvent((tls_connection *) conn); return C_OK; @@ -946,7 +945,7 @@ static int connTLSBlockingConnect(connection *conn_, const char *addr, int port, if (conn->c.state != CONN_STATE_NONE) return C_ERR; /* Initiate socket blocking connect first */ - if (CT_Socket.blocking_connect(conn_, addr, port, timeout) == C_ERR) return C_ERR; + if (connectionByType(CONN_TYPE_SOCKET)->blocking_connect(conn_, addr, port, timeout) == C_ERR) return C_ERR; /* Initiate TLS connection now. We set up a send/recv timeout on the socket, * which means the specified timeout will not be enforced accurately. */ @@ -1072,7 +1071,7 @@ static void *tlsGetClientCtx(void) { return redis_tls_client_ctx; } -ConnectionType CT_TLS = { +static ConnectionType CT_TLS = { /* connection type */ .get_type = connTLSGetType, @@ -1086,6 +1085,8 @@ ConnectionType CT_TLS = { .addr = connTLSAddr, /* create/close connection */ + .conn_create = connCreateTLS, + .conn_create_accepted = connCreateAcceptedTLS, .close = connTLSClose, /* connect & accept */ @@ -1126,15 +1127,4 @@ int RedisRegisterConnectionTypeTLS() return C_ERR; } -connection *connCreateTLS(void) { - return NULL; -} - -connection *connCreateAcceptedTLS(int fd, int require_auth) { - UNUSED(fd); - UNUSED(require_auth); - - return NULL; -} - #endif |