diff options
| author | Garrett D'Amore <garrett@damore.org> | 2018-06-12 20:05:34 -0700 |
|---|---|---|
| committer | Garrett D'Amore <garrett@damore.org> | 2018-06-13 18:01:52 -0700 |
| commit | da2aac4a6eb10af88e3938068e24c58aea1832b1 (patch) | |
| tree | fb0676be5426ed1510945b7e7fe3d09eb45333a7 /src/transport/ipc | |
| parent | 61ffae5e3649897776c26799ccaaa35d578ba816 (diff) | |
| download | nng-da2aac4a6eb10af88e3938068e24c58aea1832b1.tar.gz nng-da2aac4a6eb10af88e3938068e24c58aea1832b1.tar.bz2 nng-da2aac4a6eb10af88e3938068e24c58aea1832b1.zip | |
fixes #540 nni_ep_opttype serves no purpose
fixes #538 setopt should have an explicit chkopt routine
fixes #537 Internal TCP API needs better name separation
fixes #524 Option types should be "typed"
This is a rework of the option management code, to make it both clearer
and to prepare for further work to break up endpoints. This reduces
a certain amount of dead or redundant code, and actually saves cycles
when setting options, as some loops were not terminated that should have
been.
Diffstat (limited to 'src/transport/ipc')
| -rw-r--r-- | src/transport/ipc/ipc.c | 451 |
1 files changed, 232 insertions, 219 deletions
diff --git a/src/transport/ipc/ipc.c b/src/transport/ipc/ipc.c index 6191dea6..c5c7032a 100644 --- a/src/transport/ipc/ipc.c +++ b/src/transport/ipc/ipc.c @@ -20,11 +20,11 @@ // 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; +typedef struct ipc_pipe ipc_pipe; +typedef struct ipc_ep ipc_ep; -// nni_ipc_pipe is one end of an IPC connection. -struct nni_ipc_pipe { +// ipc_pipe is one end of an IPC connection. +struct ipc_pipe { nni_plat_ipc_pipe *ipp; uint16_t peer; uint16_t proto; @@ -48,7 +48,7 @@ struct nni_ipc_pipe { nni_mtx mtx; }; -struct nni_ipc_ep { +struct ipc_ep { nni_sockaddr sa; nni_plat_ipc_ep *iep; uint16_t proto; @@ -58,28 +58,28 @@ struct nni_ipc_ep { nni_mtx mtx; }; -static void nni_ipc_pipe_dosend(nni_ipc_pipe *, nni_aio *); -static void nni_ipc_pipe_dorecv(nni_ipc_pipe *); -static void nni_ipc_pipe_send_cb(void *); -static void nni_ipc_pipe_recv_cb(void *); -static void nni_ipc_pipe_nego_cb(void *); -static void nni_ipc_ep_cb(void *); +static void ipc_pipe_dosend(ipc_pipe *, nni_aio *); +static void ipc_pipe_dorecv(ipc_pipe *); +static void ipc_pipe_send_cb(void *); +static void ipc_pipe_recv_cb(void *); +static void ipc_pipe_nego_cb(void *); +static void ipc_ep_cb(void *); static int -nni_ipc_tran_init(void) +ipc_tran_init(void) { return (0); } static void -nni_ipc_tran_fini(void) +ipc_tran_fini(void) { } static void -nni_ipc_pipe_close(void *arg) +ipc_pipe_close(void *arg) { - nni_ipc_pipe *pipe = arg; + ipc_pipe *pipe = arg; nni_aio_close(pipe->rxaio); nni_aio_close(pipe->txaio); @@ -89,9 +89,9 @@ nni_ipc_pipe_close(void *arg) } static void -nni_ipc_pipe_stop(void *arg) +ipc_pipe_stop(void *arg) { - nni_ipc_pipe *pipe = arg; + ipc_pipe *pipe = arg; nni_aio_stop(pipe->rxaio); nni_aio_stop(pipe->txaio); @@ -99,9 +99,9 @@ nni_ipc_pipe_stop(void *arg) } static void -nni_ipc_pipe_fini(void *arg) +ipc_pipe_fini(void *arg) { - nni_ipc_pipe *pipe = arg; + ipc_pipe *pipe = arg; nni_aio_fini(pipe->rxaio); nni_aio_fini(pipe->txaio); @@ -117,19 +117,19 @@ nni_ipc_pipe_fini(void *arg) } static int -nni_ipc_pipe_init(nni_ipc_pipe **pipep, nni_ipc_ep *ep, void *ipp) +ipc_pipe_init(ipc_pipe **pipep, ipc_ep *ep, void *ipp) { - nni_ipc_pipe *p; - int rv; + ipc_pipe *p; + int rv; if ((p = NNI_ALLOC_STRUCT(p)) == NULL) { return (NNG_ENOMEM); } nni_mtx_init(&p->mtx); - if (((rv = nni_aio_init(&p->txaio, nni_ipc_pipe_send_cb, p)) != 0) || - ((rv = nni_aio_init(&p->rxaio, nni_ipc_pipe_recv_cb, p)) != 0) || - ((rv = nni_aio_init(&p->negaio, nni_ipc_pipe_nego_cb, p)) != 0)) { - nni_ipc_pipe_fini(p); + if (((rv = nni_aio_init(&p->txaio, ipc_pipe_send_cb, p)) != 0) || + ((rv = nni_aio_init(&p->rxaio, ipc_pipe_recv_cb, p)) != 0) || + ((rv = nni_aio_init(&p->negaio, ipc_pipe_nego_cb, p)) != 0)) { + ipc_pipe_fini(p); return (rv); } nni_aio_list_init(&p->sendq); @@ -146,9 +146,9 @@ nni_ipc_pipe_init(nni_ipc_pipe **pipep, nni_ipc_ep *ep, void *ipp) } static void -nni_ipc_cancel_start(nni_aio *aio, int rv) +ipc_cancel_start(nni_aio *aio, int rv) { - nni_ipc_pipe *pipe = nni_aio_get_prov_data(aio); + ipc_pipe *pipe = nni_aio_get_prov_data(aio); nni_mtx_lock(&pipe->mtx); if (pipe->user_negaio != aio) { @@ -163,11 +163,11 @@ nni_ipc_cancel_start(nni_aio *aio, int rv) } static void -nni_ipc_pipe_nego_cb(void *arg) +ipc_pipe_nego_cb(void *arg) { - nni_ipc_pipe *pipe = arg; - nni_aio * aio = pipe->negaio; - int rv; + ipc_pipe *pipe = arg; + nni_aio * aio = pipe->negaio; + int rv; nni_mtx_lock(&pipe->mtx); if ((rv = nni_aio_result(aio)) != 0) { @@ -220,14 +220,14 @@ done: } static void -nni_ipc_pipe_send_cb(void *arg) +ipc_pipe_send_cb(void *arg) { - nni_ipc_pipe *pipe = arg; - nni_aio * aio; - nni_aio * txaio = pipe->txaio; - nni_msg * msg; - int rv; - size_t n; + ipc_pipe *pipe = arg; + nni_aio * aio; + nni_aio * txaio = pipe->txaio; + nni_msg * msg; + int rv; + size_t n; nni_mtx_lock(&pipe->mtx); aio = nni_list_first(&pipe->sendq); @@ -255,7 +255,7 @@ nni_ipc_pipe_send_cb(void *arg) nni_aio_list_remove(aio); if (!nni_list_empty(&pipe->sendq)) { // schedule next send - nni_ipc_pipe_dosend(pipe, nni_list_first(&pipe->sendq)); + ipc_pipe_dosend(pipe, nni_list_first(&pipe->sendq)); } nni_mtx_unlock(&pipe->mtx); @@ -267,14 +267,14 @@ nni_ipc_pipe_send_cb(void *arg) } static void -nni_ipc_pipe_recv_cb(void *arg) +ipc_pipe_recv_cb(void *arg) { - nni_ipc_pipe *pipe = arg; - nni_aio * aio; - int rv; - size_t n; - nni_msg * msg; - nni_aio * rxaio = pipe->rxaio; + ipc_pipe *pipe = arg; + nni_aio * aio; + int rv; + size_t n; + nni_msg * msg; + nni_aio * rxaio = pipe->rxaio; nni_mtx_lock(&pipe->mtx); aio = nni_list_first(&pipe->recvq); @@ -346,7 +346,7 @@ nni_ipc_pipe_recv_cb(void *arg) msg = pipe->rxmsg; pipe->rxmsg = NULL; if (!nni_list_empty(&pipe->recvq)) { - nni_ipc_pipe_dorecv(pipe); + ipc_pipe_dorecv(pipe); } nni_mtx_unlock(&pipe->mtx); @@ -367,9 +367,9 @@ recv_error: } static void -nni_ipc_cancel_tx(nni_aio *aio, int rv) +ipc_cancel_tx(nni_aio *aio, int rv) { - nni_ipc_pipe *pipe = nni_aio_get_prov_data(aio); + ipc_pipe *pipe = nni_aio_get_prov_data(aio); nni_mtx_lock(&pipe->mtx); if (!nni_aio_list_active(aio)) { @@ -390,7 +390,7 @@ nni_ipc_cancel_tx(nni_aio *aio, int rv) } static void -nni_ipc_pipe_dosend(nni_ipc_pipe *pipe, nni_aio *aio) +ipc_pipe_dosend(ipc_pipe *pipe, nni_aio *aio) { nni_aio *txaio; nni_msg *msg; @@ -425,31 +425,31 @@ nni_ipc_pipe_dosend(nni_ipc_pipe *pipe, nni_aio *aio) } static void -nni_ipc_pipe_send(void *arg, nni_aio *aio) +ipc_pipe_send(void *arg, nni_aio *aio) { - nni_ipc_pipe *pipe = arg; - int rv; + ipc_pipe *pipe = arg; + int rv; if (nni_aio_begin(aio) != 0) { return; } nni_mtx_lock(&pipe->mtx); - if ((rv = nni_aio_schedule(aio, nni_ipc_cancel_tx, pipe)) != 0) { + if ((rv = nni_aio_schedule(aio, ipc_cancel_tx, pipe)) != 0) { nni_mtx_unlock(&pipe->mtx); nni_aio_finish_error(aio, rv); return; } nni_list_append(&pipe->sendq, aio); if (nni_list_first(&pipe->sendq) == aio) { - nni_ipc_pipe_dosend(pipe, aio); + ipc_pipe_dosend(pipe, aio); } nni_mtx_unlock(&pipe->mtx); } static void -nni_ipc_cancel_rx(nni_aio *aio, int rv) +ipc_cancel_rx(nni_aio *aio, int rv) { - nni_ipc_pipe *pipe = nni_aio_get_prov_data(aio); + ipc_pipe *pipe = nni_aio_get_prov_data(aio); nni_mtx_lock(&pipe->mtx); if (!nni_aio_list_active(aio)) { @@ -470,7 +470,7 @@ nni_ipc_cancel_rx(nni_aio *aio, int rv) } static void -nni_ipc_pipe_dorecv(nni_ipc_pipe *pipe) +ipc_pipe_dorecv(ipc_pipe *pipe) { nni_aio *rxaio; nni_iov iov; @@ -486,17 +486,17 @@ nni_ipc_pipe_dorecv(nni_ipc_pipe *pipe) } static void -nni_ipc_pipe_recv(void *arg, nni_aio *aio) +ipc_pipe_recv(void *arg, nni_aio *aio) { - nni_ipc_pipe *pipe = arg; - int rv; + ipc_pipe *pipe = arg; + int rv; if (nni_aio_begin(aio) != 0) { return; } nni_mtx_lock(&pipe->mtx); - if ((rv = nni_aio_schedule(aio, nni_ipc_cancel_rx, pipe)) != 0) { + if ((rv = nni_aio_schedule(aio, ipc_cancel_rx, pipe)) != 0) { nni_mtx_unlock(&pipe->mtx); nni_aio_finish_error(aio, rv); return; @@ -504,24 +504,24 @@ nni_ipc_pipe_recv(void *arg, nni_aio *aio) nni_list_append(&pipe->recvq, aio); if (nni_list_first(&pipe->recvq) == aio) { - nni_ipc_pipe_dorecv(pipe); + ipc_pipe_dorecv(pipe); } nni_mtx_unlock(&pipe->mtx); } static void -nni_ipc_pipe_start(void *arg, nni_aio *aio) +ipc_pipe_start(void *arg, nni_aio *aio) { - nni_ipc_pipe *pipe = arg; - nni_aio * negaio; - nni_iov iov; - int rv; + ipc_pipe *pipe = arg; + nni_aio * negaio; + nni_iov iov; + int rv; if (nni_aio_begin(aio) != 0) { return; } nni_mtx_lock(&pipe->mtx); - if ((rv = nni_aio_schedule(aio, nni_ipc_cancel_start, pipe)) != 0) { + if ((rv = nni_aio_schedule(aio, ipc_cancel_start, pipe)) != 0) { nni_mtx_unlock(&pipe->mtx); nni_aio_finish_error(aio, rv); return; @@ -547,72 +547,72 @@ nni_ipc_pipe_start(void *arg, nni_aio *aio) } static uint16_t -nni_ipc_pipe_peer(void *arg) +ipc_pipe_peer(void *arg) { - nni_ipc_pipe *pipe = arg; + ipc_pipe *pipe = arg; return (pipe->peer); } static int -nni_ipc_pipe_get_addr(void *arg, void *buf, size_t *szp, int typ) +ipc_pipe_get_addr(void *arg, void *buf, size_t *szp, nni_opt_type t) { - nni_ipc_pipe *p = arg; - return (nni_copyout_sockaddr(&p->sa, buf, szp, typ)); + ipc_pipe *p = arg; + return (nni_copyout_sockaddr(&p->sa, buf, szp, t)); } static int -nni_ipc_pipe_get_peer_uid(void *arg, void *buf, size_t *szp, int typ) +ipc_pipe_get_peer_uid(void *arg, void *buf, size_t *szp, nni_opt_type t) { - nni_ipc_pipe *p = arg; - uint64_t id; - int rv; + ipc_pipe *p = arg; + uint64_t id; + int rv; if ((rv = nni_plat_ipc_pipe_get_peer_uid(p->ipp, &id)) != 0) { return (rv); } - return (nni_copyout_u64(id, buf, szp, typ)); + return (nni_copyout_u64(id, buf, szp, t)); } static int -nni_ipc_pipe_get_peer_gid(void *arg, void *buf, size_t *szp, int typ) +ipc_pipe_get_peer_gid(void *arg, void *buf, size_t *szp, nni_opt_type t) { - nni_ipc_pipe *p = arg; - uint64_t id; - int rv; + ipc_pipe *p = arg; + uint64_t id; + int rv; if ((rv = nni_plat_ipc_pipe_get_peer_gid(p->ipp, &id)) != 0) { return (rv); } - return (nni_copyout_u64(id, buf, szp, typ)); + return (nni_copyout_u64(id, buf, szp, t)); } static int -nni_ipc_pipe_get_peer_pid(void *arg, void *buf, size_t *szp, int typ) +ipc_pipe_get_peer_pid(void *arg, void *buf, size_t *szp, nni_opt_type t) { - nni_ipc_pipe *p = arg; - uint64_t id; - int rv; + ipc_pipe *p = arg; + uint64_t id; + int rv; if ((rv = nni_plat_ipc_pipe_get_peer_pid(p->ipp, &id)) != 0) { return (rv); } - return (nni_copyout_u64(id, buf, szp, typ)); + return (nni_copyout_u64(id, buf, szp, t)); } static int -nni_ipc_pipe_get_peer_zoneid(void *arg, void *buf, size_t *szp, int typ) +ipc_pipe_get_peer_zoneid(void *arg, void *buf, size_t *szp, nni_opt_type t) { - nni_ipc_pipe *p = arg; - uint64_t id; - int rv; + ipc_pipe *p = arg; + uint64_t id; + int rv; if ((rv = nni_plat_ipc_pipe_get_peer_zoneid(p->ipp, &id)) != 0) { return (rv); } - return (nni_copyout_u64(id, buf, szp, typ)); + return (nni_copyout_u64(id, buf, szp, t)); } static void -nni_ipc_ep_fini(void *arg) +ipc_ep_fini(void *arg) { - nni_ipc_ep *ep = arg; + ipc_ep *ep = arg; nni_aio_stop(ep->aio); nni_plat_ipc_ep_fini(ep->iep); @@ -622,11 +622,11 @@ nni_ipc_ep_fini(void *arg) } static int -nni_ipc_ep_init(void **epp, nni_url *url, nni_sock *sock, int mode) +ipc_ep_init(void **epp, nni_url *url, nni_sock *sock, int mode) { - nni_ipc_ep *ep; - int rv; - size_t sz; + ipc_ep *ep; + int rv; + size_t sz; if ((ep = NNI_ALLOC_STRUCT(ep)) == NULL) { return (NNG_ENOMEM); @@ -637,17 +637,17 @@ nni_ipc_ep_init(void **epp, nni_url *url, nni_sock *sock, int mode) ep->sa.s_ipc.sa_family = NNG_AF_IPC; if (nni_strlcpy(ep->sa.s_ipc.sa_path, url->u_path, sz) >= sz) { - nni_ipc_ep_fini(ep); + ipc_ep_fini(ep); return (NNG_EADDRINVAL); } if ((rv = nni_plat_ipc_ep_init(&ep->iep, &ep->sa, mode)) != 0) { - nni_ipc_ep_fini(ep); + ipc_ep_fini(ep); return (rv); } - if ((rv = nni_aio_init(&ep->aio, nni_ipc_ep_cb, ep)) != 0) { - nni_ipc_ep_fini(ep); + if ((rv = nni_aio_init(&ep->aio, ipc_ep_cb, ep)) != 0) { + ipc_ep_fini(ep); return (rv); } ep->proto = nni_sock_proto_id(sock); @@ -657,9 +657,9 @@ nni_ipc_ep_init(void **epp, nni_url *url, nni_sock *sock, int mode) } static void -nni_ipc_ep_close(void *arg) +ipc_ep_close(void *arg) { - nni_ipc_ep *ep = arg; + ipc_ep *ep = arg; nni_aio_close(ep->aio); @@ -669,10 +669,10 @@ nni_ipc_ep_close(void *arg) } static int -nni_ipc_ep_bind(void *arg) +ipc_ep_bind(void *arg) { - nni_ipc_ep *ep = arg; - int rv; + ipc_ep *ep = arg; + int rv; nni_mtx_lock(&ep->mtx); rv = nni_plat_ipc_ep_listen(ep->iep); @@ -681,11 +681,11 @@ nni_ipc_ep_bind(void *arg) } static void -nni_ipc_ep_finish(nni_ipc_ep *ep) +ipc_ep_finish(ipc_ep *ep) { - nni_aio * aio; - int rv; - nni_ipc_pipe *pipe = NULL; + nni_aio * aio; + int rv; + ipc_pipe *pipe = NULL; if ((rv = nni_aio_result(ep->aio)) != 0) { goto done; @@ -694,7 +694,7 @@ nni_ipc_ep_finish(nni_ipc_ep *ep) // Attempt to allocate the parent pipe. If this fails we'll // drop the connection (ENOMEM probably). - rv = nni_ipc_pipe_init(&pipe, ep, nni_aio_get_output(ep->aio, 0)); + rv = ipc_pipe_init(&pipe, ep, nni_aio_get_output(ep->aio, 0)); done: aio = ep->user_aio; @@ -708,7 +708,7 @@ done: } if (pipe != NULL) { - nni_ipc_pipe_fini(pipe); + ipc_pipe_fini(pipe); } if (aio != NULL) { NNI_ASSERT(rv != 0); @@ -717,19 +717,19 @@ done: } static void -nni_ipc_ep_cb(void *arg) +ipc_ep_cb(void *arg) { - nni_ipc_ep *ep = arg; + ipc_ep *ep = arg; nni_mtx_lock(&ep->mtx); - nni_ipc_ep_finish(ep); + ipc_ep_finish(ep); nni_mtx_unlock(&ep->mtx); } static void -nni_ipc_cancel_ep(nni_aio *aio, int rv) +ipc_cancel_ep(nni_aio *aio, int rv) { - nni_ipc_ep *ep = nni_aio_get_prov_data(aio); + ipc_ep *ep = nni_aio_get_prov_data(aio); NNI_ASSERT(rv != 0); nni_mtx_lock(&ep->mtx); @@ -745,10 +745,10 @@ nni_ipc_cancel_ep(nni_aio *aio, int rv) } static void -nni_ipc_ep_accept(void *arg, nni_aio *aio) +ipc_ep_accept(void *arg, nni_aio *aio) { - nni_ipc_ep *ep = arg; - int rv; + ipc_ep *ep = arg; + int rv; if (nni_aio_begin(aio) != 0) { return; @@ -756,7 +756,7 @@ nni_ipc_ep_accept(void *arg, nni_aio *aio) nni_mtx_lock(&ep->mtx); NNI_ASSERT(ep->user_aio == NULL); - if ((rv = nni_aio_schedule(aio, nni_ipc_cancel_ep, ep)) != 0) { + if ((rv = nni_aio_schedule(aio, ipc_cancel_ep, ep)) != 0) { nni_mtx_unlock(&ep->mtx); nni_aio_finish_error(aio, rv); return; @@ -768,10 +768,10 @@ nni_ipc_ep_accept(void *arg, nni_aio *aio) } static void -nni_ipc_ep_connect(void *arg, nni_aio *aio) +ipc_ep_connect(void *arg, nni_aio *aio) { - nni_ipc_ep *ep = arg; - int rv; + ipc_ep *ep = arg; + int rv; if (nni_aio_begin(aio) != 0) { return; @@ -779,7 +779,7 @@ nni_ipc_ep_connect(void *arg, nni_aio *aio) nni_mtx_lock(&ep->mtx); NNI_ASSERT(ep->user_aio == NULL); - if ((rv = nni_aio_schedule(aio, nni_ipc_cancel_ep, ep)) != 0) { + if ((rv = nni_aio_schedule(aio, ipc_cancel_ep, ep)) != 0) { nni_mtx_unlock(&ep->mtx); nni_aio_finish_error(aio, rv); return; @@ -791,14 +791,13 @@ nni_ipc_ep_connect(void *arg, nni_aio *aio) } static int -nni_ipc_ep_setopt_recvmaxsz(void *arg, const void *data, size_t sz, int typ) +ipc_ep_set_recvmaxsz(void *arg, const void *data, size_t sz, nni_opt_type t) { - nni_ipc_ep *ep = arg; - size_t val; - int rv; + ipc_ep *ep = arg; + size_t val; + int rv; - rv = nni_copyin_size(&val, data, sz, 0, NNI_MAXSZ, typ); - if ((rv == 0) && (ep != NULL)) { + if ((rv = nni_copyin_size(&val, data, sz, 0, NNI_MAXSZ, t)) == 0) { nni_mtx_lock(&ep->mtx); ep->rcvmax = val; nni_mtx_unlock(&ep->mtx); @@ -807,30 +806,35 @@ nni_ipc_ep_setopt_recvmaxsz(void *arg, const void *data, size_t sz, int typ) } static int -nni_ipc_ep_getopt_recvmaxsz(void *arg, void *data, size_t *szp, int typ) +ipc_ep_chk_recvmaxsz(const void *data, size_t sz, nni_opt_type t) { - nni_ipc_ep *ep = arg; - return (nni_copyout_size(ep->rcvmax, data, szp, typ)); + return (nni_copyin_size(NULL, data, sz, 0, NNI_MAXSZ, t)); } static int -nni_ipc_ep_get_addr(void *arg, void *data, size_t *szp, int typ) +ipc_ep_get_recvmaxsz(void *arg, void *data, size_t *szp, nni_opt_type t) { - nni_ipc_ep *ep = arg; - return (nni_copyout_sockaddr(&ep->sa, data, szp, typ)); + ipc_ep *ep = arg; + return (nni_copyout_size(ep->rcvmax, data, szp, t)); } static int -nni_ipc_ep_setopt_permissions(void *arg, const void *data, size_t sz, int typ) +ipc_ep_get_addr(void *arg, void *data, size_t *szp, nni_opt_type t) { - nni_ipc_ep *ep = arg; - int val; - int rv; + ipc_ep *ep = arg; + return (nni_copyout_sockaddr(&ep->sa, data, szp, t)); +} + +static int +ipc_ep_set_perms(void *arg, const void *data, size_t sz, nni_opt_type t) +{ + ipc_ep *ep = arg; + int val; + int rv; // Probably we could further limit this -- most systems don't have // meaningful chmod beyond the lower 9 bits. - rv = nni_copyin_int(&val, data, sz, 0, 0x7FFFFFFF, typ); - if ((rv == 0) && (ep != NULL)) { + if ((rv = nni_copyin_int(&val, data, sz, 0, 0x7FFFFFFF, t)) == 0) { nni_mtx_lock(&ep->mtx); rv = nni_plat_ipc_ep_set_permissions(ep->iep, val); nni_mtx_unlock(&ep->mtx); @@ -839,123 +843,132 @@ nni_ipc_ep_setopt_permissions(void *arg, const void *data, size_t sz, int typ) } static int -nni_ipc_ep_setopt_security_desc( - void *arg, const void *data, size_t sz, int typ) +ipc_ep_chk_perms(const void *data, size_t sz, nni_opt_type t) { - nni_ipc_ep *ep = arg; - void * ptr; - int rv; + return (nni_copyin_int(NULL, data, sz, 0, 0x7FFFFFFF, t)); +} - if ((rv = nni_copyin_ptr((void **) &ptr, data, sz, typ)) != 0) { - return (rv); - } +static int +ipc_ep_set_sec_desc(void *arg, const void *data, size_t sz, nni_opt_type t) +{ + ipc_ep *ep = arg; + void * ptr; + int rv; - if (ep == NULL) { - return (0); + if ((rv = nni_copyin_ptr(&ptr, data, sz, t)) == 0) { + rv = nni_plat_ipc_ep_set_security_descriptor(ep->iep, ptr); } - return (nni_plat_ipc_ep_set_security_descriptor(ep->iep, ptr)); + return (rv); +} + +static int +ipc_ep_chk_sec_desc(const void *data, size_t sz, nni_opt_type t) +{ + return (nni_copyin_ptr(NULL, data, sz, t)); } -static nni_tran_pipe_option nni_ipc_pipe_options[] = { +static nni_tran_option ipc_pipe_options[] = { { - .po_name = NNG_OPT_REMADDR, - .po_type = NNI_TYPE_SOCKADDR, - .po_getopt = nni_ipc_pipe_get_addr, + .o_name = NNG_OPT_REMADDR, + .o_type = NNI_TYPE_SOCKADDR, + .o_get = ipc_pipe_get_addr, }, { - .po_name = NNG_OPT_LOCADDR, - .po_type = NNI_TYPE_SOCKADDR, - .po_getopt = nni_ipc_pipe_get_addr, + .o_name = NNG_OPT_LOCADDR, + .o_type = NNI_TYPE_SOCKADDR, + .o_get = ipc_pipe_get_addr, }, { - .po_name = NNG_OPT_IPC_PEER_UID, - .po_type = NNI_TYPE_UINT64, - .po_getopt = nni_ipc_pipe_get_peer_uid, + .o_name = NNG_OPT_IPC_PEER_UID, + .o_type = NNI_TYPE_UINT64, + .o_get = ipc_pipe_get_peer_uid, }, { - .po_name = NNG_OPT_IPC_PEER_GID, - .po_type = NNI_TYPE_UINT64, - .po_getopt = nni_ipc_pipe_get_peer_gid, + .o_name = NNG_OPT_IPC_PEER_GID, + .o_type = NNI_TYPE_UINT64, + .o_get = ipc_pipe_get_peer_gid, }, { - .po_name = NNG_OPT_IPC_PEER_PID, - .po_type = NNI_TYPE_UINT64, - .po_getopt = nni_ipc_pipe_get_peer_pid, + .o_name = NNG_OPT_IPC_PEER_PID, + .o_type = NNI_TYPE_UINT64, + .o_get = ipc_pipe_get_peer_pid, }, { - .po_name = NNG_OPT_IPC_PEER_ZONEID, - .po_type = NNI_TYPE_UINT64, - .po_getopt = nni_ipc_pipe_get_peer_zoneid, + .o_name = NNG_OPT_IPC_PEER_ZONEID, + .o_type = NNI_TYPE_UINT64, + .o_get = ipc_pipe_get_peer_zoneid, }, // terminate list { - .po_name = NULL, + .o_name = NULL, }, }; -static nni_tran_pipe_ops nni_ipc_pipe_ops = { - .p_fini = nni_ipc_pipe_fini, - .p_start = nni_ipc_pipe_start, - .p_stop = nni_ipc_pipe_stop, - .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_pipe_ops ipc_pipe_ops = { + .p_fini = ipc_pipe_fini, + .p_start = ipc_pipe_start, + .p_stop = ipc_pipe_stop, + .p_send = ipc_pipe_send, + .p_recv = ipc_pipe_recv, + .p_close = ipc_pipe_close, + .p_peer = ipc_pipe_peer, + .p_options = ipc_pipe_options, }; -static nni_tran_ep_option nni_ipc_ep_options[] = { +static nni_tran_option ipc_ep_options[] = { { - .eo_name = NNG_OPT_RECVMAXSZ, - .eo_type = NNI_TYPE_SIZE, - .eo_getopt = nni_ipc_ep_getopt_recvmaxsz, - .eo_setopt = nni_ipc_ep_setopt_recvmaxsz, + .o_name = NNG_OPT_RECVMAXSZ, + .o_type = NNI_TYPE_SIZE, + .o_get = ipc_ep_get_recvmaxsz, + .o_set = ipc_ep_set_recvmaxsz, + .o_chk = ipc_ep_chk_recvmaxsz, }, { - .eo_name = NNG_OPT_LOCADDR, - .eo_type = NNI_TYPE_SOCKADDR, - .eo_getopt = nni_ipc_ep_get_addr, - .eo_setopt = NULL, + .o_name = NNG_OPT_LOCADDR, + .o_type = NNI_TYPE_SOCKADDR, + .o_get = ipc_ep_get_addr, }, { - .eo_name = NNG_OPT_IPC_SECURITY_DESCRIPTOR, - .eo_type = NNI_TYPE_POINTER, - .eo_getopt = NULL, - .eo_setopt = nni_ipc_ep_setopt_security_desc, + .o_name = NNG_OPT_IPC_SECURITY_DESCRIPTOR, + .o_type = NNI_TYPE_POINTER, + .o_get = NULL, + .o_set = ipc_ep_set_sec_desc, + .o_chk = ipc_ep_chk_sec_desc, }, { - .eo_name = NNG_OPT_IPC_PERMISSIONS, - .eo_type = NNI_TYPE_INT32, - .eo_getopt = NULL, - .eo_setopt = nni_ipc_ep_setopt_permissions, + .o_name = NNG_OPT_IPC_PERMISSIONS, + .o_type = NNI_TYPE_INT32, + .o_get = NULL, + .o_set = ipc_ep_set_perms, + .o_chk = ipc_ep_chk_perms, }, // terminate list { - .eo_name = NULL, + .o_name = NULL, }, }; -static nni_tran_ep_ops nni_ipc_ep_ops = { - .ep_init = nni_ipc_ep_init, - .ep_fini = nni_ipc_ep_fini, - .ep_connect = nni_ipc_ep_connect, - .ep_bind = nni_ipc_ep_bind, - .ep_accept = nni_ipc_ep_accept, - .ep_close = nni_ipc_ep_close, - .ep_options = nni_ipc_ep_options, +static nni_tran_ep_ops ipc_ep_ops = { + .ep_init = ipc_ep_init, + .ep_fini = ipc_ep_fini, + .ep_connect = ipc_ep_connect, + .ep_bind = ipc_ep_bind, + .ep_accept = ipc_ep_accept, + .ep_close = ipc_ep_close, + .ep_options = ipc_ep_options, }; -static nni_tran nni_ipc_tran = { +static nni_tran ipc_tran = { .tran_version = NNI_TRANSPORT_VERSION, .tran_scheme = "ipc", - .tran_ep = &nni_ipc_ep_ops, - .tran_pipe = &nni_ipc_pipe_ops, - .tran_init = nni_ipc_tran_init, - .tran_fini = nni_ipc_tran_fini, + .tran_ep = &ipc_ep_ops, + .tran_pipe = &ipc_pipe_ops, + .tran_init = ipc_tran_init, + .tran_fini = ipc_tran_fini, }; int nng_ipc_register(void) { - return (nni_tran_register(&nni_ipc_tran)); + return (nni_tran_register(&ipc_tran)); } |
