diff options
Diffstat (limited to 'src/core')
| -rw-r--r-- | src/core/protocol.c | 79 | ||||
| -rw-r--r-- | src/core/protocol.h | 9 | ||||
| -rw-r--r-- | src/core/socket.c | 20 |
3 files changed, 107 insertions, 1 deletions
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 |
