diff options
Diffstat (limited to 'src/core')
| -rw-r--r-- | src/core/transport.c | 15 | ||||
| -rw-r--r-- | src/core/transport.h | 19 |
2 files changed, 33 insertions, 1 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 |
