aboutsummaryrefslogtreecommitdiff
path: root/src/transport
diff options
context:
space:
mode:
Diffstat (limited to 'src/transport')
-rw-r--r--src/transport/inproc/inproc.c51
-rw-r--r--src/transport/ipc/ipc.c124
-rw-r--r--src/transport/tcp/tcp.c124
-rw-r--r--src/transport/zerotier/zerotier.c364
4 files changed, 353 insertions, 310 deletions
diff --git a/src/transport/inproc/inproc.c b/src/transport/inproc/inproc.c
index e3cc5143..3f013f92 100644
--- a/src/transport/inproc/inproc.c
+++ b/src/transport/inproc/inproc.c
@@ -177,25 +177,15 @@ nni_inproc_pipe_peer(void *arg)
}
static int
-nni_inproc_pipe_getopt(void *arg, int option, void *buf, size_t *szp)
+nni_inproc_pipe_get_addr(void *arg, void *buf, size_t *szp)
{
-#if 0
- nni_inproc_pipe *pipe = arg;
+ nni_inproc_pipe *p = arg;
+ nni_sockaddr sa;
- switch (option) {
- case NNG_OPT_LOCALADDR:
- case NNG_OPT_REMOTEADDR:
- len = strlen(pipe->addr) + 1;
- if (len > *szp) {
- (void) memcpy(buf, pipe->addr, *szp);
- } else {
- (void) memcpy(buf, pipe->addr, len);
- }
- *szp = len;
- return (0);
- }
-#endif
- return (NNG_ENOTSUP);
+ sa.s_un.s_inproc.sa_family = NNG_AF_INPROC;
+ nni_strlcpy(sa.s_un.s_inproc.sa_path, p->addr,
+ sizeof(sa.s_un.s_inproc.sa_path));
+ return (nni_getopt_sockaddr(&sa, buf, szp));
}
static int
@@ -442,13 +432,25 @@ nni_inproc_ep_accept(void *arg, nni_aio *aio)
nni_mtx_unlock(&nni_inproc.mx);
}
+static nni_tran_pipe_option nni_inproc_pipe_options[] = {
+ { NNG_OPT_LOCADDR, nni_inproc_pipe_get_addr },
+ { NNG_OPT_REMADDR, nni_inproc_pipe_get_addr },
+ // terminate list
+ { NULL, NULL },
+};
+
static nni_tran_pipe nni_inproc_pipe_ops = {
- .p_fini = nni_inproc_pipe_fini,
- .p_send = nni_inproc_pipe_send,
- .p_recv = nni_inproc_pipe_recv,
- .p_close = nni_inproc_pipe_close,
- .p_peer = nni_inproc_pipe_peer,
- .p_getopt = nni_inproc_pipe_getopt,
+ .p_fini = nni_inproc_pipe_fini,
+ .p_send = nni_inproc_pipe_send,
+ .p_recv = nni_inproc_pipe_recv,
+ .p_close = nni_inproc_pipe_close,
+ .p_peer = nni_inproc_pipe_peer,
+ .p_options = nni_inproc_pipe_options,
+};
+
+static nni_tran_ep_option nni_inproc_ep_options[] = {
+ // terminate list
+ { NULL, NULL, NULL },
};
static nni_tran_ep nni_inproc_ep_ops = {
@@ -458,8 +460,7 @@ static nni_tran_ep nni_inproc_ep_ops = {
.ep_bind = nni_inproc_ep_bind,
.ep_accept = nni_inproc_ep_accept,
.ep_close = nni_inproc_ep_close,
- .ep_setopt = NULL,
- .ep_getopt = NULL,
+ .ep_options = nni_inproc_ep_options,
};
// This is the inproc transport linkage, and should be the only global
diff --git a/src/transport/ipc/ipc.c b/src/transport/ipc/ipc.c
index b65adfee..afe8afa8 100644
--- a/src/transport/ipc/ipc.c
+++ b/src/transport/ipc/ipc.c
@@ -16,14 +16,14 @@
// IPC transport. Platform specific IPC operations must be
// supplied as well. Normally the IPC is UNIX domain sockets or
-// Windows named pipes. Other platforms could use other mechanisms.
+// Windows named pipes. Other platforms could use other mechanisms,
+// but all implementations on the platform must use the same mechanism.
typedef struct nni_ipc_pipe nni_ipc_pipe;
typedef struct nni_ipc_ep nni_ipc_ep;
// nni_ipc_pipe is one end of an IPC connection.
struct nni_ipc_pipe {
- const char * addr;
nni_plat_ipc_pipe *ipp;
uint16_t peer;
uint16_t proto;
@@ -48,7 +48,7 @@ struct nni_ipc_pipe {
};
struct nni_ipc_ep {
- char addr[NNG_MAXADDRLEN + 1];
+ nni_sockaddr sa;
nni_plat_ipc_ep *iep;
uint16_t proto;
size_t rcvmax;
@@ -63,15 +63,6 @@ static void nni_ipc_pipe_nego_cb(void *);
static void nni_ipc_ep_cb(void *);
static int
-nni_ipc_tran_chkopt(int o, const void *data, size_t sz)
-{
- if (o == nng_optid_recvmaxsz) {
- return (nni_chkopt_size(data, sz, 0, NNI_MAXSZ));
- }
- return (NNG_ENOTSUP);
-}
-
-static int
nni_ipc_tran_init(void)
{
return (0);
@@ -132,10 +123,8 @@ nni_ipc_pipe_init(nni_ipc_pipe **pipep, nni_ipc_ep *ep, void *ipp)
p->proto = ep->proto;
p->rcvmax = ep->rcvmax;
p->ipp = ipp;
- p->addr = ep->addr;
p->sa.s_un.s_path.sa_family = NNG_AF_IPC;
- nni_strlcpy(p->sa.s_un.s_path.sa_path, p->addr + strlen("ipc://"),
- sizeof(p->sa.s_un.s_path.sa_path));
+ p->sa = ep->sa;
*pipep = p;
return (0);
@@ -463,22 +452,10 @@ nni_ipc_pipe_peer(void *arg)
}
static int
-nni_ipc_pipe_getopt(void *arg, int option, void *buf, size_t *szp)
+nni_ipc_pipe_get_addr(void *arg, void *buf, size_t *szp)
{
-
- nni_ipc_pipe *pipe = arg;
- size_t len;
- int rv;
-
- if ((option == nng_optid_locaddr) || (option == nng_optid_remaddr)) {
- rv = nni_getopt_sockaddr(&pipe->sa, buf, szp);
- } else if (option == nng_optid_recvmaxsz) {
- rv = nni_getopt_size(pipe->rcvmax, &buf, szp);
-
- } else {
- rv = NNG_ENOTSUP;
- }
- return (rv);
+ nni_ipc_pipe *p = arg;
+ return (nni_getopt_sockaddr(&p->sa, buf, szp));
}
static void
@@ -496,33 +473,28 @@ nni_ipc_ep_fini(void *arg)
static int
nni_ipc_ep_init(void **epp, const char *url, nni_sock *sock, int mode)
{
- nni_ipc_ep * ep;
- int rv;
- nni_sockaddr sa;
- size_t sz;
+ nni_ipc_ep *ep;
+ int rv;
+ size_t sz;
if (strncmp(url, "ipc://", strlen("ipc://")) != 0) {
return (NNG_EADDRINVAL);
}
url += strlen("ipc://");
- sz = sizeof(sa.s_un.s_path.sa_path);
- sa.s_un.s_path.sa_family = NNG_AF_IPC;
-
- if (nni_strlcpy(sa.s_un.s_path.sa_path, url, sz) >= sz) {
- return (NNG_EADDRINVAL);
- }
-
if ((ep = NNI_ALLOC_STRUCT(ep)) == NULL) {
return (NNG_ENOMEM);
}
- if (nni_strlcpy(ep->addr, url, sizeof(ep->addr)) >= sizeof(ep->addr)) {
+ sz = sizeof(ep->sa.s_un.s_path.sa_path);
+ ep->sa.s_un.s_path.sa_family = NNG_AF_IPC;
+
+ if (nni_strlcpy(ep->sa.s_un.s_path.sa_path, url, sz) >= sz) {
NNI_FREE_STRUCT(ep);
return (NNG_EADDRINVAL);
}
- if ((rv = nni_plat_ipc_ep_init(&ep->iep, &sa, mode)) != 0) {
+ if ((rv = nni_plat_ipc_ep_init(&ep->iep, &ep->sa, mode)) != 0) {
NNI_FREE_STRUCT(ep);
return (rv);
}
@@ -666,41 +638,60 @@ nni_ipc_ep_connect(void *arg, nni_aio *aio)
}
static int
-nni_ipc_ep_setopt(void *arg, int opt, const void *v, size_t sz)
+nni_ipc_ep_setopt_recvmaxsz(void *arg, const void *data, size_t sz)
{
- int rv = NNG_ENOTSUP;
nni_ipc_ep *ep = arg;
- if (opt == nng_optid_recvmaxsz) {
- nni_mtx_lock(&ep->mtx);
- rv = nni_setopt_size(&ep->rcvmax, v, sz, 0, NNI_MAXSZ);
- nni_mtx_unlock(&ep->mtx);
+ if (ep == NULL) {
+ return (nni_chkopt_size(data, sz, 0, NNI_MAXSZ));
}
- return (rv);
+ return (nni_setopt_size(&ep->rcvmax, data, sz, 0, NNI_MAXSZ));
}
static int
-nni_ipc_ep_getopt(void *arg, int opt, void *v, size_t *szp)
+nni_ipc_ep_getopt_recvmaxsz(void *arg, void *data, size_t *szp)
{
- int rv = NNG_ENOTSUP;
nni_ipc_ep *ep = arg;
+ return (nni_getopt_size(ep->rcvmax, data, szp));
+}
- if (opt == nng_optid_recvmaxsz) {
- nni_mtx_lock(&ep->mtx);
- rv = nni_getopt_size(ep->rcvmax, v, szp);
- nni_mtx_unlock(&ep->mtx);
- }
- return (rv);
+static int
+nni_ipc_ep_get_addr(void *arg, void *data, size_t *szp)
+{
+ nni_ipc_ep *ep = arg;
+ return (nni_getopt_sockaddr(&ep->sa, data, szp));
}
+static nni_tran_pipe_option nni_ipc_pipe_options[] = {
+ { NNG_OPT_REMADDR, nni_ipc_pipe_get_addr },
+ { NNG_OPT_LOCADDR, nni_ipc_pipe_get_addr },
+ // terminate list
+ { NULL, NULL },
+};
+
static nni_tran_pipe nni_ipc_pipe_ops = {
- .p_fini = nni_ipc_pipe_fini,
- .p_start = nni_ipc_pipe_start,
- .p_send = nni_ipc_pipe_send,
- .p_recv = nni_ipc_pipe_recv,
- .p_close = nni_ipc_pipe_close,
- .p_peer = nni_ipc_pipe_peer,
- .p_getopt = nni_ipc_pipe_getopt,
+ .p_fini = nni_ipc_pipe_fini,
+ .p_start = nni_ipc_pipe_start,
+ .p_send = nni_ipc_pipe_send,
+ .p_recv = nni_ipc_pipe_recv,
+ .p_close = nni_ipc_pipe_close,
+ .p_peer = nni_ipc_pipe_peer,
+ .p_options = nni_ipc_pipe_options,
+};
+
+static nni_tran_ep_option nni_ipc_ep_options[] = {
+ {
+ .eo_name = NNG_OPT_RECVMAXSZ,
+ .eo_getopt = nni_ipc_ep_getopt_recvmaxsz,
+ .eo_setopt = nni_ipc_ep_setopt_recvmaxsz,
+ },
+ {
+ .eo_name = NNG_OPT_LOCADDR,
+ .eo_getopt = nni_ipc_ep_get_addr,
+ .eo_setopt = NULL,
+ },
+ // terminate list
+ { NULL, NULL, NULL },
};
static nni_tran_ep nni_ipc_ep_ops = {
@@ -710,8 +701,7 @@ static nni_tran_ep nni_ipc_ep_ops = {
.ep_bind = nni_ipc_ep_bind,
.ep_accept = nni_ipc_ep_accept,
.ep_close = nni_ipc_ep_close,
- .ep_setopt = nni_ipc_ep_setopt,
- .ep_getopt = nni_ipc_ep_getopt,
+ .ep_options = nni_ipc_ep_options,
};
// This is the IPC transport linkage, and should be the only global
diff --git a/src/transport/tcp/tcp.c b/src/transport/tcp/tcp.c
index 587c1af9..413d8fa5 100644
--- a/src/transport/tcp/tcp.c
+++ b/src/transport/tcp/tcp.c
@@ -63,18 +63,6 @@ static void nni_tcp_pipe_nego_cb(void *);
static void nni_tcp_ep_cb(void *arg);
static int
-nni_tcp_tran_chkopt(int o, const void *data, size_t sz)
-{
- if (o == nng_optid_recvmaxsz) {
- return (nni_chkopt_size(data, sz, 0, NNI_MAXSZ));
- }
- if (o == nng_optid_linger) {
- return (nni_chkopt_usec(data, sz));
- }
- return (NNG_ENOTSUP);
-}
-
-static int
nni_tcp_tran_init(void)
{
return (0);
@@ -419,29 +407,6 @@ nni_tcp_pipe_peer(void *arg)
}
static int
-nni_tcp_pipe_getopt(void *arg, int option, void *buf, size_t *szp)
-{
-#if 0
- nni_inproc_pipe *pipe = arg;
- size_t len;
-
- switch (option) {
- case NNG_OPT_LOCALADDR:
- case NNG_OPT_REMOTEADDR:
- len = strlen(pipe->addr) + 1;
- if (len > *szp) {
- (void) memcpy(buf, pipe->addr, *szp);
- } else {
- (void) memcpy(buf, pipe->addr, len);
- }
- *szp = len;
- return (0);
- }
-#endif
- return (NNG_ENOTSUP);
-}
-
-static int
nni_tcp_parse_pair(char *pair, char **hostp, char **servp)
{
char *host, *serv, *end;
@@ -786,52 +751,71 @@ nni_tcp_ep_connect(void *arg, nni_aio *aio)
}
static int
-nni_tcp_ep_setopt(void *arg, int opt, const void *v, size_t sz)
+nni_tcp_ep_setopt_recvmaxsz(void *arg, const void *v, size_t sz)
{
- int rv = NNG_ENOTSUP;
nni_tcp_ep *ep = arg;
-
- if (opt == nng_optid_recvmaxsz) {
- nni_mtx_lock(&ep->mtx);
- rv = nni_setopt_size(&ep->rcvmax, v, sz, 0, NNI_MAXSZ);
- nni_mtx_unlock(&ep->mtx);
-
- } else if (opt == nng_optid_linger) {
- nni_mtx_lock(&ep->mtx);
- rv = nni_setopt_usec(&ep->linger, v, sz);
- nni_mtx_unlock(&ep->mtx);
+ if (ep == NULL) {
+ return (nni_chkopt_size(v, sz, 0, NNI_MAXSZ));
}
- return (rv);
+ return (nni_setopt_size(&ep->rcvmax, v, sz, 0, NNI_MAXSZ));
}
static int
-nni_tcp_ep_getopt(void *arg, int opt, void *v, size_t *szp)
+nni_tcp_ep_getopt_recvmaxsz(void *arg, void *v, size_t *szp)
{
- int rv = NNG_ENOTSUP;
nni_tcp_ep *ep = arg;
+ return (nni_getopt_size(ep->rcvmax, v, szp));
+}
- if (opt == nng_optid_recvmaxsz) {
- nni_mtx_lock(&ep->mtx);
- rv = nni_getopt_size(ep->rcvmax, v, szp);
- nni_mtx_unlock(&ep->mtx);
-
- } else if (opt == nng_optid_linger) {
- nni_mtx_lock(&ep->mtx);
- rv = nni_getopt_usec(ep->linger, v, szp);
- nni_mtx_unlock(&ep->mtx);
+static int
+nni_tcp_ep_setopt_linger(void *arg, const void *v, size_t sz)
+{
+ nni_tcp_ep *ep = arg;
+ if (ep == NULL) {
+ return (nni_chkopt_usec(v, sz));
}
- // XXX: add address properties
- return (rv);
+ return (nni_setopt_usec(&ep->linger, v, sz));
}
+static int
+nni_tcp_ep_getopt_linger(void *arg, void *v, size_t *szp)
+{
+ nni_tcp_ep *ep = arg;
+ return (nni_getopt_usec(ep->linger, v, szp));
+}
+
+static nni_tran_pipe_option nni_tcp_pipe_options[] = {
+#if 0
+ { NNG_OPT_LOCADDR, nni_tcp_pipe_get_locaddr },
+ { NNG_OPT_REMADDR, nni_tcp_pipe_get_remaddr },
+#endif
+ // terminate list
+ { NULL, NULL }
+};
+
static nni_tran_pipe nni_tcp_pipe_ops = {
- .p_fini = nni_tcp_pipe_fini,
- .p_start = nni_tcp_pipe_start,
- .p_send = nni_tcp_pipe_send,
- .p_recv = nni_tcp_pipe_recv,
- .p_close = nni_tcp_pipe_close,
- .p_peer = nni_tcp_pipe_peer,
- .p_getopt = nni_tcp_pipe_getopt,
+ .p_fini = nni_tcp_pipe_fini,
+ .p_start = nni_tcp_pipe_start,
+ .p_send = nni_tcp_pipe_send,
+ .p_recv = nni_tcp_pipe_recv,
+ .p_close = nni_tcp_pipe_close,
+ .p_peer = nni_tcp_pipe_peer,
+ .p_options = nni_tcp_pipe_options,
+};
+
+static nni_tran_ep_option nni_tcp_ep_options[] = {
+ {
+ .eo_name = NNG_OPT_RECVMAXSZ,
+ .eo_getopt = nni_tcp_ep_getopt_recvmaxsz,
+ .eo_setopt = nni_tcp_ep_setopt_recvmaxsz,
+ },
+ {
+ .eo_name = NNG_OPT_LINGER,
+ .eo_getopt = nni_tcp_ep_getopt_linger,
+ .eo_setopt = nni_tcp_ep_setopt_linger,
+ },
+ // terminate list
+ { NULL, NULL, NULL },
};
static nni_tran_ep nni_tcp_ep_ops = {
@@ -841,8 +825,7 @@ static nni_tran_ep nni_tcp_ep_ops = {
.ep_bind = nni_tcp_ep_bind,
.ep_accept = nni_tcp_ep_accept,
.ep_close = nni_tcp_ep_close,
- .ep_setopt = nni_tcp_ep_setopt,
- .ep_getopt = nni_tcp_ep_getopt,
+ .ep_options = nni_tcp_ep_options,
};
// This is the TCP transport linkage, and should be the only global
@@ -852,7 +835,6 @@ struct nni_tran nni_tcp_tran = {
.tran_scheme = "tcp",
.tran_ep = &nni_tcp_ep_ops,
.tran_pipe = &nni_tcp_pipe_ops,
- .tran_chkopt = nni_tcp_tran_chkopt,
.tran_init = nni_tcp_tran_init,
.tran_fini = nni_tcp_tran_fini,
};
diff --git a/src/transport/zerotier/zerotier.c b/src/transport/zerotier/zerotier.c
index 40af6e54..9182ec1f 100644
--- a/src/transport/zerotier/zerotier.c
+++ b/src/transport/zerotier/zerotier.c
@@ -22,26 +22,32 @@
#include <ZeroTierOne.h>
-const char *nng_opt_zt_home = "zt:home";
-const char *nng_opt_zt_nwid = "zt:nwid";
-const char *nng_opt_zt_node = "zt:node";
-const char *nng_opt_zt_status = "zt:status";
-const char *nng_opt_zt_network_name = "zt:network-name";
-const char *nng_opt_zt_local_port = "zt:local-port";
-const char *nng_opt_zt_ping_time = "zt:ping-time";
-const char *nng_opt_zt_ping_count = "zt:ping-count";
-
-int nng_optid_zt_home = -1;
-int nng_optid_zt_nwid = -1;
-int nng_optid_zt_node = -1;
-int nng_optid_zt_status = -1;
-int nng_optid_zt_network_name = -1;
-int nng_optid_zt_ping_time = -1;
-int nng_optid_zt_ping_count = -1;
-int nng_optid_zt_local_port = -1;
+#define NNG_ZT_OPT_HOME "zt:home"
+#define NNG_ZT_OPT_NWID "zt:nwid"
+#define NNG_ZT_OPT_NODE "zt:node"
+#define NNG_ZT_OPT_STATUS "zt:status"
+#define NNG_ZT_OPT_NETWORK_NAME "zt:network-name"
+#define NNG_ZT_OPT_PING_TIME "zt:ping-time"
+#define NNG_ZT_OPT_PING_COUNT "zt:ping-count"
+
+const char *nng_opt_zt_home = NNG_ZT_OPT_HOME;
+const char *nng_opt_zt_nwid = NNG_ZT_OPT_NWID;
+const char *nng_opt_zt_node = NNG_ZT_OPT_NODE;
+const char *nng_opt_zt_status = NNG_ZT_OPT_STATUS;
+const char *nng_opt_zt_network_name = NNG_ZT_OPT_NETWORK_NAME;
+const char *nng_opt_zt_ping_time = NNG_ZT_OPT_PING_TIME;
+const char *nng_opt_zt_ping_count = NNG_ZT_OPT_PING_COUNT;
+
+int zt_optid_home = -1;
+int zt_optid_nwid = -1;
+int zt_optid_node = -1;
+int zt_optid_status = -1;
+int zt_optid_network_name = -1;
+int zt_optid_ping_time = -1;
+int zt_optid_ping_count = -1;
// These values are supplied to help folks checking status. They are the
-// return values from nng_optid_zt_status.
+// return values from zt_optid_status.
int nng_zt_status_configuring = ZT_NETWORK_STATUS_REQUESTING_CONFIGURATION;
int nng_zt_status_ok = ZT_NETWORK_STATUS_OK;
int nng_zt_status_denied = ZT_NETWORK_STATUS_ACCESS_DENIED;
@@ -1597,51 +1603,23 @@ done:
}
static int
-zt_chkopt(int opt, const void *dat, size_t sz)
-{
- if (opt == nng_optid_recvmaxsz) {
- // We cannot deal with message sizes larger
- // than 64k.
- return (nni_chkopt_size(dat, sz, 0, 0xffffffffU));
- }
- if (opt == nng_optid_zt_home) {
- size_t l = nni_strnlen(dat, sz);
- if ((l >= sz) || (l >= NNG_MAXADDRLEN)) {
- return (NNG_EINVAL);
- }
- // XXX: should we apply additional security
- // checks? home path is not null terminated
- return (0);
- }
- if (opt == nng_optid_zt_ping_count) {
- return (nni_chkopt_int(dat, sz, 0, 1000000));
- }
- if (opt == nng_optid_zt_ping_time) {
- return (nni_chkopt_usec(dat, sz));
- }
- return (NNG_ENOTSUP);
-}
-
-static int
zt_tran_init(void)
{
int rv;
- if (((rv = nni_option_register(nng_opt_zt_home, &nng_optid_zt_home)) !=
+ if (((rv = nni_option_register(nng_opt_zt_home, &zt_optid_home)) !=
0) ||
- ((rv = nni_option_register(nng_opt_zt_node, &nng_optid_zt_node)) !=
+ ((rv = nni_option_register(nng_opt_zt_node, &zt_optid_node)) !=
0) ||
- ((rv = nni_option_register(nng_opt_zt_nwid, &nng_optid_zt_nwid)) !=
+ ((rv = nni_option_register(nng_opt_zt_nwid, &zt_optid_nwid)) !=
+ 0) ||
+ ((rv = nni_option_register(nng_opt_zt_status, &zt_optid_status)) !=
0) ||
((rv = nni_option_register(
- nng_opt_zt_status, &nng_optid_zt_status)) != 0) ||
- ((rv = nni_option_register(nng_opt_zt_network_name,
- &nng_optid_zt_network_name)) != 0) ||
- ((rv = nni_option_register(
- nng_opt_zt_local_port, &nng_optid_zt_local_port)) != 0) ||
+ nng_opt_zt_network_name, &zt_optid_network_name)) != 0) ||
((rv = nni_option_register(
- nng_opt_zt_ping_count, &nng_optid_zt_ping_count)) != 0) ||
+ nng_opt_zt_ping_count, &zt_optid_ping_count)) != 0) ||
((rv = nni_option_register(
- nng_opt_zt_ping_time, &nng_optid_zt_ping_time)) != 0)) {
+ nng_opt_zt_ping_time, &zt_optid_ping_time)) != 0)) {
return (rv);
}
nni_mtx_init(&zt_lk);
@@ -1652,11 +1630,11 @@ zt_tran_init(void)
static void
zt_tran_fini(void)
{
- nng_optid_zt_home = -1;
- nng_optid_zt_nwid = -1;
- nng_optid_zt_node = -1;
- nng_optid_zt_ping_count = -1;
- nng_optid_zt_ping_time = -1;
+ zt_optid_home = -1;
+ zt_optid_nwid = -1;
+ zt_optid_node = -1;
+ zt_optid_ping_count = -1;
+ zt_optid_ping_time = -1;
zt_node *ztn;
nni_mtx_lock(&zt_lk);
@@ -2014,25 +1992,31 @@ zt_getopt_network_name(zt_node *ztn, uint64_t nwid, void *buf, size_t *szp)
}
static int
-zt_pipe_getopt(void *arg, int option, void *buf, size_t *szp)
+zt_pipe_get_recvmaxsz(void *arg, void *buf, size_t *szp)
{
zt_pipe *p = arg;
- int rv;
+ return (nni_getopt_size(p->zp_rcvmax, buf, szp));
+}
- if (option == nng_optid_recvmaxsz) {
- rv = nni_getopt_size(p->zp_rcvmax, buf, szp);
- } else if (option == nng_optid_zt_nwid) {
- rv = nni_getopt_u64(p->zp_nwid, buf, szp);
- } else if (option == nng_optid_zt_node) {
- rv = nni_getopt_u64(p->zp_laddr >> 24, buf, szp);
- } else if (option == nng_optid_zt_status) {
- rv = zt_getopt_status(p->zp_ztn, p->zp_nwid, buf, szp);
- } else if (option == nng_optid_zt_network_name) {
- rv = zt_getopt_network_name(p->zp_ztn, p->zp_nwid, buf, szp);
- } else {
- rv = NNG_ENOTSUP;
- }
- return (rv);
+static int
+zt_pipe_get_nwid(void *arg, void *buf, size_t *szp)
+{
+ zt_pipe *p = arg;
+ return (nni_getopt_u64(p->zp_nwid, buf, szp));
+}
+
+static int
+zt_pipe_get_node(void *arg, void *buf, size_t *szp)
+{
+ zt_pipe *p = arg;
+ return (nni_getopt_u64(p->zp_laddr >> 24, buf, szp));
+}
+
+static int
+zt_pipe_get_status(void *arg, void *buf, size_t *szp)
+{
+ zt_pipe *p = arg;
+ return (zt_getopt_status(p->zp_ztn, p->zp_nwid, buf, szp));
}
static void
@@ -2553,96 +2537,184 @@ zt_ep_connect(void *arg, nni_aio *aio)
}
static int
-zt_ep_setopt(void *arg, int opt, const void *data, size_t size)
+zt_ep_setopt_recvmaxsz(void *arg, const void *data, size_t sz)
{
zt_ep *ep = arg;
- int i;
- int rv = NNG_ENOTSUP;
- if (opt == nng_optid_recvmaxsz) {
- nni_mtx_lock(&zt_lk);
- rv = nni_setopt_size(
- &ep->ze_rcvmax, data, size, 0, 0xffffffffu);
- nni_mtx_unlock(&zt_lk);
- } else if (opt == nng_optid_zt_home) {
- // XXX: check to make sure not started...
- i = nni_strnlen((const char *) data, size);
- if ((i >= size) || (i >= NNG_MAXADDRLEN)) {
- return (NNG_EINVAL);
- }
+ if (ep == NULL) {
+ return (nni_chkopt_size(data, sz, 0, 0xffffffffu));
+ }
+ return (nni_setopt_size(&ep->ze_rcvmax, data, sz, 0, 0xffffffffu));
+}
+
+static int
+zt_ep_getopt_recvmaxsz(void *arg, void *data, size_t *szp)
+{
+ zt_ep *ep = arg;
+ return (nni_getopt_size(ep->ze_rcvmax, data, szp));
+}
+
+static int
+zt_ep_setopt_home(void *arg, const void *data, size_t sz)
+{
+ int len;
+ int rv;
+ zt_ep *ep = arg;
+
+ len = nni_strnlen(data, sz);
+ if ((len >= sz) || (len >= NNG_MAXADDRLEN)) {
+ return (NNG_EINVAL);
+ }
+ if (ep != NULL) {
nni_mtx_lock(&zt_lk);
nni_strlcpy(ep->ze_home, data, sizeof(ep->ze_home));
- rv = zt_node_find(ep);
- if (rv != 0) {
+ if ((rv = zt_node_find(ep)) != 0) {
ep->ze_ztn = NULL;
}
nni_mtx_unlock(&zt_lk);
+ } else {
rv = 0;
- } else if (opt == nng_optid_zt_ping_count) {
- nni_mtx_lock(&zt_lk);
- rv =
- nni_setopt_int(&ep->ze_ping_count, data, size, 0, 1000000);
- nni_mtx_unlock(&zt_lk);
- } else if (opt == nng_optid_zt_ping_time) {
- nni_mtx_lock(&zt_lk);
- rv = nni_setopt_usec(&ep->ze_ping_time, data, size);
- nni_mtx_unlock(&zt_lk);
}
return (rv);
}
static int
-zt_ep_getopt(void *arg, int opt, void *data, size_t *szp)
+zt_ep_getopt_home(void *arg, void *data, size_t *szp)
{
zt_ep *ep = arg;
- int rv = NNG_ENOTSUP;
+ return (nni_getopt_str(ep->ze_home, data, szp));
+}
- if (opt == nng_optid_recvmaxsz) {
- nni_mtx_lock(&zt_lk);
- rv = nni_getopt_size(ep->ze_rcvmax, data, szp);
- nni_mtx_unlock(&zt_lk);
- } else if (opt == nng_optid_zt_home) {
- nni_mtx_lock(&zt_lk);
- rv = nni_getopt_str(ep->ze_home, data, szp);
- nni_mtx_unlock(&zt_lk);
- } else if (opt == nng_optid_zt_node) {
- nni_mtx_lock(&zt_lk);
- rv = nni_getopt_u64(ep->ze_ztn->zn_self, data, szp);
- nni_mtx_unlock(&zt_lk);
- } else if (opt == nng_optid_zt_nwid) {
- nni_mtx_lock(&zt_lk);
- rv = nni_getopt_u64(ep->ze_nwid, data, szp);
- nni_mtx_unlock(&zt_lk);
- } else if (opt == nng_optid_zt_ping_count) {
- nni_mtx_lock(&zt_lk);
- rv = nni_getopt_int(ep->ze_ping_count, data, szp);
- nni_mtx_unlock(&zt_lk);
- } else if (opt == nng_optid_zt_ping_time) {
- nni_mtx_lock(&zt_lk);
- rv = nni_getopt_usec(ep->ze_ping_time, data, szp);
- nni_mtx_unlock(&zt_lk);
- } else if (opt == nng_optid_zt_local_port) {
- nni_mtx_lock(&zt_lk);
- rv = nni_getopt_int(
- (int) (ep->ze_laddr & zt_port_mask), data, szp);
- nni_mtx_unlock(&zt_lk);
- } else if (opt == nng_optid_zt_network_name) {
- rv =
- zt_getopt_network_name(ep->ze_ztn, ep->ze_nwid, data, szp);
- } else if (opt == nng_optid_zt_status) {
- rv = zt_getopt_status(ep->ze_ztn, ep->ze_nwid, data, szp);
+static int
+zt_ep_getopt_node(void *arg, void *data, size_t *szp)
+{
+ zt_ep *ep = arg;
+ return (nni_getopt_u64(ep->ze_ztn->zn_self, data, szp));
+}
+
+static int
+zt_ep_getopt_nwid(void *arg, void *data, size_t *szp)
+{
+ zt_ep *ep = arg;
+ return (nni_getopt_u64(ep->ze_nwid, data, szp));
+}
+
+static int
+zt_ep_getopt_network_name(void *arg, void *buf, size_t *szp)
+{
+ zt_ep *ep = arg;
+ return (zt_getopt_network_name(ep->ze_ztn, ep->ze_nwid, buf, szp));
+}
+
+static int
+zt_ep_getopt_status(void *arg, void *buf, size_t *szp)
+{
+ zt_ep *ep = arg;
+ return (zt_getopt_status(ep->ze_ztn, ep->ze_nwid, buf, szp));
+}
+
+static int
+zt_ep_setopt_ping_time(void *arg, const void *data, size_t sz)
+{
+ zt_ep *ep = arg;
+ if (ep == NULL) {
+ return (nni_chkopt_usec(data, sz));
}
- return (rv);
+ return (nni_setopt_usec(&ep->ze_ping_time, data, sz));
+}
+
+static int
+zt_ep_getopt_ping_time(void *arg, void *data, size_t *szp)
+{
+ zt_ep *ep = arg;
+ return (nni_getopt_usec(ep->ze_ping_time, data, szp));
+}
+
+static int
+zt_ep_setopt_ping_count(void *arg, const void *data, size_t sz)
+{
+ zt_ep *ep = arg;
+ if (ep == NULL) {
+ return (nni_chkopt_int(data, sz, 0, 1000000));
+ }
+ return (nni_setopt_int(&ep->ze_ping_count, data, sz, 0, 1000000));
+}
+
+static int
+zt_ep_getopt_ping_count(void *arg, void *data, size_t *szp)
+{
+ zt_ep *ep = arg;
+ return (nni_getopt_int(ep->ze_ping_count, data, szp));
}
+static nni_tran_pipe_option zt_pipe_options[] = {
+#if 0
+ { NNG_OPT_RECVMAXSZ, zt_pipe_getopt_recvmaxsz },
+ { NNG_ZT_OPT_NWID, zt_pipe_getopt_nwid },
+ { NNG_ZT_OPT_NODE, zt_pipe_getopt_node },
+ { NNG_ZT_OPT_STATUS, zt_pipe_getopt_status },
+ { NNG_ZT_OPT_NETWORK_NAME, zt_pipe_getopt_network_name },
+#endif
+#if 0
+ { NNG_OPT_LOCADDR, zt_pipe_get_locaddr },
+ { NNG_OPT_REMADDR, zt_pipe_get_remaddr }
+#endif
+ // terminate list
+ { NULL, NULL },
+};
static nni_tran_pipe zt_pipe_ops = {
- .p_fini = zt_pipe_fini,
- .p_start = zt_pipe_start,
- .p_send = zt_pipe_send,
- .p_recv = zt_pipe_recv,
- .p_close = zt_pipe_close,
- .p_peer = zt_pipe_peer,
- .p_getopt = zt_pipe_getopt,
+ .p_fini = zt_pipe_fini,
+ .p_start = zt_pipe_start,
+ .p_send = zt_pipe_send,
+ .p_recv = zt_pipe_recv,
+ .p_close = zt_pipe_close,
+ .p_peer = zt_pipe_peer,
+ .p_options = zt_pipe_options,
+};
+
+static nni_tran_ep_option zt_ep_options[] = {
+ {
+ .eo_name = NNG_OPT_RECVMAXSZ,
+ .eo_getopt = zt_ep_getopt_recvmaxsz,
+ .eo_setopt = zt_ep_setopt_recvmaxsz,
+ },
+ {
+ .eo_name = NNG_ZT_OPT_HOME,
+ .eo_getopt = zt_ep_getopt_home,
+ .eo_setopt = zt_ep_setopt_home,
+ },
+ {
+ .eo_name = NNG_ZT_OPT_NODE,
+ .eo_getopt = zt_ep_getopt_node,
+ .eo_setopt = NULL,
+ },
+ {
+ .eo_name = NNG_ZT_OPT_NWID,
+ .eo_getopt = zt_ep_getopt_nwid,
+ .eo_setopt = NULL,
+ },
+ {
+ .eo_name = NNG_ZT_OPT_STATUS,
+ .eo_getopt = zt_ep_getopt_status,
+ .eo_setopt = NULL,
+ },
+ {
+ .eo_name = NNG_ZT_OPT_NETWORK_NAME,
+ .eo_getopt = zt_ep_getopt_network_name,
+ .eo_setopt = NULL,
+ },
+ {
+ .eo_name = NNG_ZT_OPT_PING_TIME,
+ .eo_getopt = zt_ep_getopt_ping_time,
+ .eo_setopt = zt_ep_setopt_ping_time,
+ },
+ {
+ .eo_name = NNG_ZT_OPT_PING_COUNT,
+ .eo_getopt = zt_ep_getopt_ping_count,
+ .eo_setopt = zt_ep_setopt_ping_count,
+ },
+ // terminate list
+ { NULL, NULL, NULL },
};
static nni_tran_ep zt_ep_ops = {
@@ -2652,8 +2724,7 @@ static nni_tran_ep zt_ep_ops = {
.ep_bind = zt_ep_bind,
.ep_accept = zt_ep_accept,
.ep_close = zt_ep_close,
- .ep_setopt = zt_ep_setopt,
- .ep_getopt = zt_ep_getopt,
+ .ep_options = zt_ep_options,
};
// This is the ZeroTier transport linkage, and should be the
@@ -2663,7 +2734,6 @@ static struct nni_tran zt_tran = {
.tran_scheme = "zt",
.tran_ep = &zt_ep_ops,
.tran_pipe = &zt_pipe_ops,
- .tran_chkopt = zt_chkopt,
.tran_init = zt_tran_init,
.tran_fini = zt_tran_fini,
};