From 13e1410f8ad514c7660a9b7edf74e7928c7d6379 Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Thu, 22 Dec 2016 20:25:26 +0100 Subject: [PATCH] MINOR: connection: add a minimal transport layer registration system There are still a lot of #ifdef USE_OPENSSL in the code (still 43 occurences) because we never know if we can directly access ssl_sock or not. This patch attacks the problem differently by providing a way for transport layers to register themselves and for users to retrieve the pointer. Unregistered transport layers will point to NULL so it will be easy to check if SSL is registered or not. The mechanism is very inexpensive as it relies on a two-entries array of pointers, so the performance will not be affected. --- include/proto/connection.h | 16 ++++++++++++++++ include/types/connection.h | 7 +++++++ src/connection.c | 1 + src/raw_sock.c | 7 +++++++ src/ssl_sock.c | 1 + 5 files changed, 32 insertions(+) diff --git a/include/proto/connection.h b/include/proto/connection.h index 6a24dec1e..2380bb811 100644 --- a/include/proto/connection.h +++ b/include/proto/connection.h @@ -30,6 +30,7 @@ #include extern struct pool_head *pool2_connection; +extern struct xprt_ops *registered_xprt[XPRT_ENTRIES]; /* perform minimal intializations, report 0 in case of error, 1 if OK. */ int init_connection(); @@ -633,6 +634,21 @@ static inline const char *conn_get_data_name(const struct connection *conn) return conn->data->name; } +/* registers pointer to transport layer (XPRT_*) */ +static inline void xprt_register(int id, struct xprt_ops *xprt) +{ + if (id >= XPRT_ENTRIES) + return; + registered_xprt[id] = xprt; +} + +/* returns pointer to transport layer (XPRT_*) or NULL if not registered */ +static inline struct xprt_ops *xprt_get(int id) +{ + if (id >= XPRT_ENTRIES) + return NULL; + return registered_xprt[id]; +} #endif /* _PROTO_CONNECTION_H */ diff --git a/include/types/connection.h b/include/types/connection.h index 6da213841..904bef6a6 100644 --- a/include/types/connection.h +++ b/include/types/connection.h @@ -199,6 +199,13 @@ enum { CO_SFL_STREAMER = 0x0002, /* Producer is continuously streaming data */ }; +/* known transport layers (for ease of lookup) */ +enum { + XPRT_RAW = 0, + XPRT_SSL = 1, + XPRT_ENTRIES /* must be last one */ +}; + /* xprt_ops describes transport-layer operations for a connection. They * generally run over a socket-based control layer, but not always. Some * of them are used for data transfer with the upper layer (rcv_*, snd_*) diff --git a/src/connection.c b/src/connection.c index 7a9f3913c..093b8a963 100644 --- a/src/connection.c +++ b/src/connection.c @@ -27,6 +27,7 @@ #endif struct pool_head *pool2_connection; +struct xprt_ops *registered_xprt[XPRT_ENTRIES] = { NULL, }; /* perform minimal intializations, report 0 in case of error, 1 if OK. */ int init_connection() diff --git a/src/raw_sock.c b/src/raw_sock.c index 0883c57a6..78cb8a2a6 100644 --- a/src/raw_sock.c +++ b/src/raw_sock.c @@ -419,6 +419,13 @@ struct xprt_ops raw_sock = { .name = "RAW", }; + +__attribute__((constructor)) +static void __ssl_sock_deinit(void) +{ + xprt_register(XPRT_RAW, &raw_sock); +} + /* * Local variables: * c-indent-level: 8 diff --git a/src/ssl_sock.c b/src/ssl_sock.c index ae821e007..101f7f342 100644 --- a/src/ssl_sock.c +++ b/src/ssl_sock.c @@ -6694,6 +6694,7 @@ static void __ssl_sock_init(void) global.listen_default_ssloptions = BC_SSL_O_NONE; global.connect_default_ssloptions = SRV_SSL_O_NONE; + xprt_register(XPRT_SSL, &ssl_sock); SSL_library_init(); cm = SSL_COMP_get_compression_methods(); sk_SSL_COMP_zero(cm);