diff options
| author | Garrett D'Amore <garrett@damore.org> | 2016-12-14 10:55:01 -0800 |
|---|---|---|
| committer | Garrett D'Amore <garrett@damore.org> | 2016-12-14 10:55:01 -0800 |
| commit | 58c24226e1d688a4eb0d5c3e041d0ee12152c045 (patch) | |
| tree | e03e5c5912d7f53edf8663de7393fe07028fd70f /src | |
| parent | e0543fecaeb01ccdf7512004c54cd72b143b67c8 (diff) | |
| download | nng-58c24226e1d688a4eb0d5c3e041d0ee12152c045.tar.gz nng-58c24226e1d688a4eb0d5c3e041d0ee12152c045.tar.bz2 nng-58c24226e1d688a4eb0d5c3e041d0ee12152c045.zip | |
nn_socket_create() implemented.
Diffstat (limited to 'src')
| -rw-r--r-- | src/CMakeLists.txt | 1 | ||||
| -rw-r--r-- | src/core/protocol.c | 79 | ||||
| -rw-r--r-- | src/core/protocol.h | 9 | ||||
| -rw-r--r-- | src/core/socket.c | 20 | ||||
| -rw-r--r-- | src/nng.h | 4 | ||||
| -rw-r--r-- | src/protocol/pair/pair.c | 1 |
6 files changed, 112 insertions, 2 deletions
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 518e54c0..ad9a8a0d 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -37,6 +37,7 @@ set (NNG_SOURCES core/pipe.c core/platform.c core/platform.h + core/protocol.c core/protocol.h core/snprintf.c core/snprintf.h diff --git a/src/core/protocol.c b/src/core/protocol.c new file mode 100644 index 00000000..56c8ecb8 --- /dev/null +++ b/src/core/protocol.c @@ -0,0 +1,79 @@ +/* + * 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. + */ + +#include <string.h> + +#include "core/nng_impl.h" + +/* + * Protocol related stuff - generically. + */ + +/* + * The list of protocols is hardwired. This is reasonably unlikely to + * change, as adding new protocols is not something intended to be done + * outside of the core. + */ +extern struct nni_protocol nni_pair_protocol; + +static struct nni_protocol *protocols[] = { + &nni_pair_protocol, + NULL +}; + +struct nni_protocol * +nni_protocol_find(uint16_t num) +{ + int i; + struct nni_protocol *p; + for (i = 0; (p = protocols[i]) != NULL; i++) { + if (p->proto_self == num) { + break; + } + } + return (p); +} + +const char * +nni_protocol_name(uint16_t num) +{ + struct nni_protocol *p; + + if ((p = nni_protocol_find(num)) == NULL) { + return (NULL); + } + return (p->proto_name); +} + +uint16_t +nni_protocol_number(const char *name) +{ + struct nni_protocol *p; + int i; + + for (i = 0; (p = protocols[i]) != NULL; i++) { + if (strcmp(p->proto_name, name) == 0) { + return (p->proto_self); + } + } + return (NNG_PROTO_NONE); +}
\ No newline at end of file diff --git a/src/core/protocol.h b/src/core/protocol.h index a6000863..d7396456 100644 --- a/src/core/protocol.h +++ b/src/core/protocol.h @@ -47,6 +47,7 @@ struct nni_protocol { */ uint16_t proto_self; /* our 16-bit protocol ID */ uint16_t proto_peer; /* who we peer with (protocol ID) */ + const char *proto_name; /* string version of our name */ /* * Create protocol instance data, which will be stored on the socket. @@ -136,4 +137,12 @@ extern int nni_pipe_send(nng_pipe_t, nng_msg_t); extern uint32_t nni_pipe_id(nng_pipe_t); extern void nni_pipe_close(nng_pipe_t); +/* + * These functions are not used by protocols, but rather by the socket + * core implementation. The lookups can be used by transports as well. + */ +extern struct nni_protocol *nni_protocol_find(uint16_t); +extern const char *nni_protocol_name(uint16_t); +extern uint16_t nni_protocol_number(const char *); + #endif /* CORE_PROTOCOL_H */ diff --git a/src/core/socket.c b/src/core/socket.c index 9c289a94..aeebdf25 100644 --- a/src/core/socket.c +++ b/src/core/socket.c @@ -34,6 +34,7 @@ struct nng_socket { struct nni_protocol s_ops; + void *s_data; /* Protocol private. */ /* options */ /* pipes */ /* endpoints */ @@ -61,7 +62,24 @@ nni_socket_recvq(nng_socket_t s) int nng_socket_create(nng_socket_t *sockp, uint16_t proto) { - return (NNG_EAGAIN); /* XXX: IMPLEMENT ME */ + nng_socket_t sock; + struct nni_protocol *ops; + int rv; + + if ((ops = nni_protocol_find(proto)) == NULL) { + return (NNG_ENOTSUP); + } + if ((sock = nni_alloc(sizeof (*sock))) == NULL) { + return (NNG_ENOMEM); + } + sock->s_ops = *ops; + if ((rv = sock->s_ops.proto_create(&sock->s_data, sock)) != 0) { + nni_free(sock, sizeof (*sock)); + return (rv); + + } + *sockp = sock; + return (0); } int @@ -270,9 +270,11 @@ NNG_DECL int nng_pipe_close(nng_pipe_t); * assigned in the lower 4 bits. * * There are gaps in the list, which are obsolete or unsupported protocols. - * For now we assume that protocol numbers are never more than 16 bits. + * Protocol numbers are never more than 16 bits. Also, there will never be + * a valid protocol numbered 0 (NNG_PROTO_NONE). */ #define NNG_PROTO(major, minor) (((major) * 16) + (minor)) +#define NNG_PROTO_NONE NNG_PROTO(0, 0) #define NNG_PROTO_PAIR NNG_PROTO(1, 0) #define NNG_PROTO_PUB NNG_PROTO(2, 0) #define NNG_PROTO_SUB NNG_PROTO(2, 1) diff --git a/src/protocol/pair/pair.c b/src/protocol/pair/pair.c index 4b00bf87..7313560e 100644 --- a/src/protocol/pair/pair.c +++ b/src/protocol/pair/pair.c @@ -252,6 +252,7 @@ pair_getopt(void *arg, int opt, void *buf, size_t *szp) struct nni_protocol nni_pair_protocol = { NNG_PROTO_PAIR, /* proto_self */ NNG_PROTO_PAIR, /* proto_peer */ + "pair", pair_create, pair_destroy, pair_shutdown, |
