X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=blobdiff_plain;f=src%2Frmr%2Fcommon%2Fsrc%2Fwormholes.c;h=a177944682f1763aba867d0a37ff0b5ab3312083;hb=280477fab59b789d924830e1a50dc9d2656915af;hp=d66ecdd5850120b2f3b8679edfe5952e5d78f34c;hpb=4d1f9bf4b14788f957964d93af940e84f8f01601;p=ric-plt%2Flib%2Frmr.git diff --git a/src/rmr/common/src/wormholes.c b/src/rmr/common/src/wormholes.c index d66ecdd..a177944 100644 --- a/src/rmr/common/src/wormholes.c +++ b/src/rmr/common/src/wormholes.c @@ -187,6 +187,7 @@ extern rmr_whid_t rmr_wh_open( void* vctx, char const* target ) { rmr_whid_t whid = -1; // wormhole id is the index into the list wh_mgt_t* whm; // easy reference to wh mgt stuff int i; + route_table_t* rt; // the currently active route table if( (ctx = (uta_ctx_t *) vctx) == NULL || target == NULL || *target == 0 ) { @@ -207,8 +208,10 @@ extern rmr_whid_t rmr_wh_open( void* vctx, char const* target ) { whm = ctx->wormholes; - - if( (ep = rt_ensure_ep( ctx->rtable, target )) == NULL ) { // get pointer to ep if there, create new if not + rt = get_rt( ctx ); // get and raise ref counter + ep = rt_ensure_ep( rt, target ); // get pointer to ep if there, create new if not + release_rt( ctx, rt ); // release use counter + if( ep == NULL ) { rmr_vlog( RMR_VL_ERR, "wormhole_open: ensure ep returned bad: target=(%s)\n", target ); return -1; // ensure sets errno } @@ -297,6 +300,60 @@ extern rmr_mbuf_t* rmr_wh_send_msg( void* vctx, rmr_whid_t whid, rmr_mbuf_t* msg return send2ep( ctx, ep, msg ); // send directly to the endpoint } +/* + Send a message directly to an open wormhole and then block until a response has + been received. The return is the same as for rmr_call(); the received buffer + or nil if no response was received. +*/ +extern rmr_mbuf_t* rmr_wh_call( void* vctx, rmr_whid_t whid, rmr_mbuf_t* msg, int call_id, int max_wait ) { + uta_ctx_t* ctx; + endpoint_t* ep; // enpoint that wormhole ID references + wh_mgt_t *whm; + char* d1; // point at the call-id in the header + + if( (ctx = (uta_ctx_t *) vctx) == NULL || msg == NULL ) { // bad stuff, bail fast + errno = EINVAL; // if msg is null, this is their clue + if( msg != NULL ) { + msg->state = RMR_ERR_BADARG; + errno = EINVAL; // must ensure it's not eagain + } + return msg; + } + + msg->state = RMR_OK; + + if( (whm = ctx->wormholes) == NULL ) { + errno = EINVAL; // no wormholes open + msg->state = RMR_ERR_NOWHOPEN; + return msg; + } + + if( whid < 0 || whid >= whm->nalloc || whm->eps[whid] == NULL ) { + errno = EINVAL; + msg->state = RMR_ERR_WHID; + return msg; + } + + errno = 0; + if( msg->header == NULL ) { + rmr_vlog( RMR_VL_ERR, "rmr_wh_call: message had no header\n" ); + msg->state = RMR_ERR_NOHDR; + errno = EBADMSG; // must ensure it's not eagain + return msg; + } + + ep = whm->eps[whid]; + if( ep != NULL ) { + if( ! ep->open ) { + rmr_wh_open( ctx, ep->name ); + } + return mt_call( vctx, msg, call_id, max_wait, ep ); // use main (internal) call to setup and block + } + + msg->state = RMR_ERR_NOENDPT; + return msg; +} + /* This will "close" a wormhole. We don't actually drop the session as that might be needed by others, but we do pull the ep reference from the list.