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);