diff options
| author | Garrett D'Amore <garrett@damore.org> | 2016-12-12 03:42:26 -0800 |
|---|---|---|
| committer | Garrett D'Amore <garrett@damore.org> | 2016-12-12 03:42:26 -0800 |
| commit | 1adefe3879b211a47a784f477d56a9416ae72254 (patch) | |
| tree | cf017599969fb109d62981cbef56eeeef4d2b108 /src/core/transport.h | |
| parent | 091043a0df9568b18e9bb49b07762b95e3508108 (diff) | |
| download | nng-1adefe3879b211a47a784f477d56a9416ae72254.tar.gz nng-1adefe3879b211a47a784f477d56a9416ae72254.tar.bz2 nng-1adefe3879b211a47a784f477d56a9416ae72254.zip | |
New inproc transport.
Lots of supporting changes.
Diffstat (limited to 'src/core/transport.h')
| -rw-r--r-- | src/core/transport.h | 117 |
1 files changed, 117 insertions, 0 deletions
diff --git a/src/core/transport.h b/src/core/transport.h new file mode 100644 index 00000000..567cc0c5 --- /dev/null +++ b/src/core/transport.h @@ -0,0 +1,117 @@ +/* + * Copyright 2016 Garrett D'Amore <garrett@damore.org> + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom + * the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#ifndef CORE_TRANSPORT_H +#define CORE_TRANSPORT_H + +/* + * Transport implementation details. Transports must implement the + * interfaces in this file. + */ + +struct nni_transport_ops { + /* + * tran_scheme is the transport scheme, such as "tcp" or "inproc". + */ + const char *tran_scheme; + + /* + * tran_ep_ops links our endpoint operations. + */ + const struct nni_endpt_ops *tran_ep_ops; + + /* + * tran_pipe_ops links our pipe operations. + */ + const struct nni_pipe_ops *tran_pipe_ops; +}; + +struct nni_endpt_ops { + /* + * ep_create creates a vanilla endpoint. The value created is + * used for the first argument for all other endpoint functions. + */ + int (*ep_create)(void **, const char *, uint16_t); + + /* + * ep_destroy frees the resources associated with the endpoint. + * The endpoint will already have been closed. + */ + void (*ep_destroy)(void *); + + /* + * ep_dial starts dialing, and creates a new pipe, + * which is returned in the final argument. It can return errors + * NNG_EACCESS, NNG_ECONNREFUSED, NNG_EBADADDR, NNG_ECONNFAILED, + * NNG_ETIMEDOUT, and NNG_EPROTO. + */ + int (*ep_dial)(void *, void **); + + /* + * ep_listen just does the bind() and listen() work, + * reserving the address but not creating any connections. + * It should return NNG_EADDRINUSE if the address is already + * taken. It can also return NNG_EBADADDR for an unsuitable + * address, or NNG_EACCESS for permission problems. + */ + int (*ep_listen)(void *); + + /* + * ep_accept accepts an inbound connection, and creates + * a transport pipe, which is returned in the final argument. + */ + int (*ep_accept)(void *, void **); + + /* + * ep_close stops the endpoint from operating altogether. It does + * not affect pipes that have already been created. + */ + void (*ep_close)(void *); + + /* ep_setopt sets an endpoint (transport-specific) option */ + int (*ep_setopt)(void *, int, const void *, size_t); + + /* ep_getopt gets an endpoint (transport-specific) option */ + int (*ep_getopt)(void *, int, void *, size_t *); +}; + +struct nni_pipe_ops { + /* p_destroy destroys the pipe */ + void (*p_destroy)(void *); + + /* p_send sends the message */ + int (*p_send)(void *, nng_msg_t); + + /* p_recv recvs the message */ + int (*p_recv)(void *, nng_msg_t *); + + /* p_close closes the pipe */ + void (*p_close)(void *); + + /* p_proto returns the peer protocol */ + uint16_t (*p_proto)(void *); + + /* p_getopt gets an pipe (transport-specific) property */ + int (*p_getopt)(void *, int, void *, size_t *); +}; + +#endif /* CORE_TRANSPORT_H */ |
