diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/core/transport.c | 15 | ||||
| -rw-r--r-- | src/core/transport.h | 19 | ||||
| -rw-r--r-- | src/transport/inproc/inproc.c | 11 | ||||
| -rw-r--r-- | src/transport/ipc/ipc.c | 11 | ||||
| -rw-r--r-- | src/transport/tcp/tcp.c | 11 |
5 files changed, 51 insertions, 16 deletions
diff --git a/src/core/transport.c b/src/core/transport.c index 6f73a6b2..2f373f9a 100644 --- a/src/core/transport.c +++ b/src/core/transport.c @@ -27,6 +27,7 @@ typedef struct nni_transport { static nni_list nni_tran_list; static nni_mtx nni_tran_lk; +static int nni_tran_inited; int nni_tran_register(const nni_tran *tran) @@ -34,6 +35,18 @@ nni_tran_register(const nni_tran *tran) nni_transport *t; int rv; + // Its entirely possible that we are called before any sockets + // are opened. Make sure we are initialized. This has to be + // protected by a guard to prevent infinite recursion, since + // nni_init also winds up calling us. + if (!nni_tran_inited) { + nni_init(); + } + + if (tran->tran_version != NNI_TRANSPORT_VERSION) { + return (NNG_ENOTSUP); + } + nni_mtx_lock(&nni_tran_lk); // Check to see if the transport is already registered... NNI_LIST_FOREACH (&nni_tran_list, t) { @@ -83,6 +96,7 @@ nni_tran_sys_init(void) { int rv; + nni_tran_inited = 1; NNI_LIST_INIT(&nni_tran_list, nni_transport, t_node); nni_mtx_init(&nni_tran_lk); @@ -108,4 +122,5 @@ nni_tran_sys_fini(void) NNI_FREE_STRUCT(t); } nni_mtx_fini(&nni_tran_lk); + nni_tran_inited = 0; } diff --git a/src/core/transport.h b/src/core/transport.h index 11cdcf99..78cb2bbf 100644 --- a/src/core/transport.h +++ b/src/core/transport.h @@ -1,5 +1,6 @@ // -// Copyright 2016 Garrett D'Amore <garrett@damore.org> +// Copyright 2017 Garrett D'Amore <garrett@damore.org> +// Copyright 2017 Capitar IT Group BV <info@capitar.com> // // This software is supplied under the terms of the MIT License, a // copy of which should be located in the distribution where this @@ -14,6 +15,11 @@ // interfaces in this file. struct nni_tran { + // tran_version is the version of the transport ops that this + // transport implements. We only bother to version the main + // ops vector. + uint32_t tran_version; + // tran_scheme is the transport scheme, such as "tcp" or "inproc". const char *tran_scheme; @@ -32,6 +38,17 @@ struct nni_tran { void (*tran_fini)(void); }; +// We quite intentionally use a signature where the upper word is nonzero, +// which ensures that if we get garbage we will reject it. This is more +// likely to mismatch than all zero bytes would. The actual version is +// stored in the lower word; this is not semver -- the numbers are just +// increasing - we doubt it will increase more than a handful of times +// during the life of the project. If we add a new version, please keep +// the old version around -- it may be possible to automatically convert +// older versions in the future. +#define NNI_TRANSPORT_V0 0x54520000 +#define NNI_TRANSPORT_VERSION NNI_TRANSPORT_V0 + // Endpoint operations are called by the socket in a protocol-independent // fashion. The socket makes individual calls, which are expected to block // if appropriate (except for destroy). Endpoints are unable to call back diff --git a/src/transport/inproc/inproc.c b/src/transport/inproc/inproc.c index 08cf99a2..5b443d63 100644 --- a/src/transport/inproc/inproc.c +++ b/src/transport/inproc/inproc.c @@ -522,9 +522,10 @@ static nni_tran_ep nni_inproc_ep_ops = { // This is the inproc transport linkage, and should be the only global // symbol in this entire file. struct nni_tran nni_inproc_tran = { - .tran_scheme = "inproc", - .tran_ep = &nni_inproc_ep_ops, - .tran_pipe = &nni_inproc_pipe_ops, - .tran_init = nni_inproc_init, - .tran_fini = nni_inproc_fini, + .tran_version = NNI_TRANSPORT_VERSION, + .tran_scheme = "inproc", + .tran_ep = &nni_inproc_ep_ops, + .tran_pipe = &nni_inproc_pipe_ops, + .tran_init = nni_inproc_init, + .tran_fini = nni_inproc_fini, }; diff --git a/src/transport/ipc/ipc.c b/src/transport/ipc/ipc.c index 0b0e487f..d421d57a 100644 --- a/src/transport/ipc/ipc.c +++ b/src/transport/ipc/ipc.c @@ -673,9 +673,10 @@ static nni_tran_ep nni_ipc_ep_ops = { // This is the IPC transport linkage, and should be the only global // symbol in this entire file. struct nni_tran nni_ipc_tran = { - .tran_scheme = "ipc", - .tran_ep = &nni_ipc_ep_ops, - .tran_pipe = &nni_ipc_pipe_ops, - .tran_init = nni_ipc_tran_init, - .tran_fini = nni_ipc_tran_fini, + .tran_version = NNI_TRANSPORT_VERSION, + .tran_scheme = "ipc", + .tran_ep = &nni_ipc_ep_ops, + .tran_pipe = &nni_ipc_pipe_ops, + .tran_init = nni_ipc_tran_init, + .tran_fini = nni_ipc_tran_fini, }; diff --git a/src/transport/tcp/tcp.c b/src/transport/tcp/tcp.c index b3136b35..035ced62 100644 --- a/src/transport/tcp/tcp.c +++ b/src/transport/tcp/tcp.c @@ -737,9 +737,10 @@ static nni_tran_ep nni_tcp_ep_ops = { // This is the TCP transport linkage, and should be the only global // symbol in this entire file. struct nni_tran nni_tcp_tran = { - .tran_scheme = "tcp", - .tran_ep = &nni_tcp_ep_ops, - .tran_pipe = &nni_tcp_pipe_ops, - .tran_init = nni_tcp_tran_init, - .tran_fini = nni_tcp_tran_fini, + .tran_version = NNI_TRANSPORT_VERSION, + .tran_scheme = "tcp", + .tran_ep = &nni_tcp_ep_ops, + .tran_pipe = &nni_tcp_pipe_ops, + .tran_init = nni_tcp_tran_init, + .tran_fini = nni_tcp_tran_fini, }; |
