Add support for container/contained for amf agent. --- src/amf/agent/amf_agent.cc | 73 +++++++++++++++++++++++++++------------------- src/amf/agent/ava_cb.h | 1 + src/amf/agent/ava_hdl.cc | 31 ++++++++++++++++++++ src/amf/agent/ava_mds.cc | 34 ++++++++++++++++++++- src/amf/agent/ava_mds.h | 3 +- src/amf/agent/ava_op.cc | 6 ++++ 6 files changed, 116 insertions(+), 32 deletions(-)
diff --git a/src/amf/agent/amf_agent.cc b/src/amf/agent/amf_agent.cc index 6dbdf9987..1ab1da96c 100644 --- a/src/amf/agent/amf_agent.cc +++ b/src/amf/agent/amf_agent.cc @@ -120,6 +120,8 @@ SaAisErrorT AmfAgent::Initialize(SaAmfHandleT *o_hdl, cb->version.majorVersion = io_ver->majorVersion; cb->version.minorVersion = io_ver->minorVersion; + cb->container = false; + /* get the ptr to the hdl db */ hdl_db = &cb->hdl_db; memset(&osaf_cbks, 0, sizeof(OsafAmfCallbacksT)); @@ -497,8 +499,9 @@ SaAisErrorT AmfAgent::ComponentRegister(SaAmfHandleT hdl, if (cb) ncshm_give_hdl(gl_ava_hdl); /* non-proxied, component Length part of component name should be OK */ - if (!proxy_comp_name && (osaf_extended_name_length(comp_name) != - osaf_extended_name_length(&cb->comp_name))) { + if (!proxy_comp_name && !cb->container && + (osaf_extended_name_length(comp_name) != + osaf_extended_name_length(&cb->comp_name))) { rc = SA_AIS_ERR_INVALID_PARAM; goto done; } @@ -511,9 +514,10 @@ SaAisErrorT AmfAgent::ComponentRegister(SaAmfHandleT hdl, } /* non-proxied component should not forge its name while registering */ - if (!proxy_comp_name && strncmp(osaf_extended_name_borrow(comp_name), - osaf_extended_name_borrow(&cb->comp_name), - osaf_extended_name_length(comp_name))) { + if (!proxy_comp_name && !cb->container && + strncmp(osaf_extended_name_borrow(comp_name), + osaf_extended_name_borrow(&cb->comp_name), + osaf_extended_name_length(comp_name))) { rc = SA_AIS_ERR_BAD_OPERATION; goto done; } @@ -553,7 +557,7 @@ SaAisErrorT AmfAgent::ComponentRegister(SaAmfHandleT hdl, else memset(&pcomp_name, 0, sizeof(SaNameT)); ava_fill_comp_reg_msg(&msg, cb->ava_dest, hdl, *comp_name, pcomp_name, - &cb->version); + &cb->version, &hdl_rec->reg_cbk); rc = static_cast<SaAisErrorT>(ava_mds_send(cb, &msg, &msg_rsp)); if (NCSCC_RC_SUCCESS == rc) { @@ -565,12 +569,6 @@ SaAisErrorT AmfAgent::ComponentRegister(SaAmfHandleT hdl, else if (NCSCC_RC_REQ_TIMOUT == rc) rc = SA_AIS_ERR_TIMEOUT; -/* TODO: msg_resp should include info regarding comp category. - * Then check supplied callbacks (different req depending on comp cat, check - * spec) during init and send SA_AIS_ERR_UNAIVALABLE if not the correct - * callbacks are supplied. - */ - done: /* release cb read lock and return handles */ if (cb) { @@ -2024,10 +2022,11 @@ SaAisErrorT AmfAgent::Response(SaAmfHandleT hdl, SaInvocationT inv, AVA_PEND_CBK_REC *rec = 0; SaAisErrorT rc = SA_AIS_OK; AVSV_NDA_AVA_MSG *msg_rsp = NULL; + SaNameT *comp(0); TRACE_ENTER2("SaAmfHandleT passed is %llx", hdl); - if ((!m_AVA_AMF_RESP_ERR_CODE_IS_VALID(error)) || (!inv)) { + if (!inv) { TRACE_LEAVE2("Incorrect argument specified for SaAisErrorT"); return SA_AIS_ERR_INVALID_PARAM; } @@ -2071,8 +2070,38 @@ SaAisErrorT AmfAgent::Response(SaAmfHandleT hdl, SaInvocationT inv, goto done; } + // B.04.01 accepts any error code + if (ava_B4_ver_used(cb)) { + if (rec->cbk_info->type == AVSV_AMF_PXIED_COMP_INST || + rec->cbk_info->type == AVSV_AMF_CONTAINED_COMP_INST) { + if (!m_AVA_AMF_RESP_ERR_CODE_IS_VALID(error) && + error != SA_AIS_ERR_TRY_AGAIN) { + error = SA_AIS_ERR_FAILED_OPERATION; + } + } else if (!m_AVA_AMF_RESP_ERR_CODE_IS_VALID(error)) + error = SA_AIS_ERR_FAILED_OPERATION; + } else { + if (!m_AVA_AMF_RESP_ERR_CODE_IS_VALID(error)) { + rc = SA_AIS_ERR_INVALID_PARAM; + goto done; + } + } + + comp = &cb->comp_name; + + if (rec->cbk_info->type == AVSV_AMF_CONTAINED_COMP_INST) + comp = &rec->cbk_info->param.contained_inst.comp_name; + else if (rec->cbk_info->type == AVSV_AMF_CONTAINED_COMP_CLEAN) + comp = &rec->cbk_info->param.contained_clean.comp_name; + else if (rec->cbk_info->type == AVSV_AMF_CSI_SET && cb->container) + comp = &rec->cbk_info->param.csi_set.comp_name; + else if (rec->cbk_info->type == AVSV_AMF_CSI_REM && cb->container) + comp = &rec->cbk_info->param.csi_rem.comp_name; + else if (rec->cbk_info->type == AVSV_AMF_COMP_TERM && cb->container) + comp = &rec->cbk_info->param.comp_term.comp_name; + /* populate & send the 'AMF response' message */ - ava_fill_response_msg(&msg, cb->ava_dest, hdl, inv, error, cb->comp_name); + ava_fill_response_msg(&msg, cb->ava_dest, hdl, inv, error, *comp); if (rec->cbk_info->type == AVSV_AMF_COMP_TERM) rc = static_cast<SaAisErrorT>(ava_mds_send(cb, &msg, &msg_rsp)); @@ -2229,22 +2258,6 @@ SaAisErrorT AmfAgent::Initialize_4(SaAmfHandleT *o_hdl, /* get the ptr to the hdl db */ hdl_db = &cb->hdl_db; - /* create the hdl record & store the callbacks */ - - /* TODO: This cast will remove possibilities for container comp callbacks(last - * two in SaAmfCallbacksT_4 struct). But on the other hand they are not - * supported in ava_hdl_cbk_rec_prc, message from avnd.SaAmfCallbacksT should - * be replaced with SaAmfCallbacksT_4 everywhere in ava when SaAmfCallbacksT_4 - * messages are supported from avnd. - */ - if ((reg_cbks != NULL) && - ((reg_cbks->saAmfContainedComponentCleanupCallback != 0) || - (reg_cbks->saAmfContainedComponentInstantiateCallback != 0))) { - TRACE_4("SA_AIS_ERR_NOT_SUPPORTED: unsupported callbacks"); - rc = SA_AIS_ERR_NOT_SUPPORTED; - goto done; - } - memset(&osaf_cbks, 0, sizeof(OsafAmfCallbacksT)); if (reg_cbks != NULL) amf_copy_from_SaAmfCallbacksT_4_to_OsafAmfCallbacksT(&osaf_cbks, reg_cbks); diff --git a/src/amf/agent/ava_cb.h b/src/amf/agent/ava_cb.h index af036d9a8..d1297e759 100644 --- a/src/amf/agent/ava_cb.h +++ b/src/amf/agent/ava_cb.h @@ -43,6 +43,7 @@ typedef struct ava_cb_tag { NCS_LOCK lock; /* CB lock */ uint32_t pend_dis; /* Number of pending dispaches */ uint32_t pend_fin; /* Number of pending agent destroy */ + bool container; /* is this comp a container? */ SaNameT comp_name; /* comp-name */ uint32_t flag; /* flags */ diff --git a/src/amf/agent/ava_hdl.cc b/src/amf/agent/ava_hdl.cc index 08208e73f..ea14aaec6 100644 --- a/src/amf/agent/ava_hdl.cc +++ b/src/amf/agent/ava_hdl.cc @@ -848,6 +848,37 @@ uint32_t ava_hdl_cbk_rec_prc(AVSV_AMF_CBK_INFO *info, } } break; + case AVSV_AMF_CONTAINED_COMP_INST: { + AVSV_AMF_CONTAINED_COMP_INST_PARAM *comp_inst = + &info->param.contained_inst; + if (!ava_sanamet_is_valid(&comp_inst->comp_name)) + rc = SA_AIS_ERR_NAME_TOO_LONG; + if (rc == SA_AIS_OK && + reg_cbk->saAmfContainedComponentInstantiateCallback) { + TRACE("Invoking saAmfContainedComponentInstantiateCallback: contained " + "comp = %s", + osaf_extended_name_borrow(&comp_inst->comp_name)); + reg_cbk->saAmfContainedComponentInstantiateCallback( + info->inv, &comp_inst->comp_name); + } + break; + } + case AVSV_AMF_CONTAINED_COMP_CLEAN: { + AVSV_AMF_CONTAINED_COMP_CLEAN_PARAM *comp_clean = + &info->param.contained_clean; + if (!ava_sanamet_is_valid(&comp_clean->comp_name)) + rc = SA_AIS_ERR_NAME_TOO_LONG; + if (rc == SA_AIS_OK && + reg_cbk->saAmfContainedComponentCleanupCallback) { + TRACE("Invoking saAmfContainedComponentCleanupCallback: contained comp " + "= %s", + osaf_extended_name_borrow(&comp_clean->comp_name)); + reg_cbk->saAmfContainedComponentCleanupCallback( + info->inv, &comp_clean->comp_name); + } + break; + } + default: osafassert(0); break; diff --git a/src/amf/agent/ava_mds.cc b/src/amf/agent/ava_mds.cc index cd139365d..7c9107c2a 100644 --- a/src/amf/agent/ava_mds.cc +++ b/src/amf/agent/ava_mds.cc @@ -932,6 +932,22 @@ uint32_t ava_mds_flat_dec(AVA_CB *cb, MDS_CALLBACK_DEC_FLAT_INFO *dec_info) { case AVSV_AMF_SC_STATUS_CHANGE: { } break; + case AVSV_AMF_CONTAINED_COMP_INST: { + AVSV_AMF_CONTAINED_COMP_INST_PARAM *info = + &msg->info.cbk_info->param.contained_inst; + + if (osaf_is_an_extended_name(&info->comp_name)) + osaf_decode_sanamet(dec_info->io_uba, &info->comp_name); + } break; + + case AVSV_AMF_CONTAINED_COMP_CLEAN: { + AVSV_AMF_CONTAINED_COMP_CLEAN_PARAM *info = + &msg->info.cbk_info->param.contained_clean; + + if (osaf_is_an_extended_name(&info->comp_name)) + osaf_decode_sanamet(dec_info->io_uba, &info->comp_name); + } break; + default: osafassert(0); } /* switch */ @@ -1267,7 +1283,8 @@ void ava_fill_finalize_msg(AVSV_NDA_AVA_MSG *msg, MDS_DEST dst, void ava_fill_comp_reg_msg(AVSV_NDA_AVA_MSG *msg, MDS_DEST dst, SaAmfHandleT hdl, SaNameT comp_name, - SaNameT proxy_comp_name, SaVersionT *version) { + SaNameT proxy_comp_name, SaVersionT *version, + const OsafAmfCallbacksT *callbacks) { msg->type = AVSV_AVA_API_MSG; msg->info.api_info.type = AVSV_AMF_COMP_REG; msg->info.api_info.dest = dst; @@ -1277,6 +1294,21 @@ void ava_fill_comp_reg_msg(AVSV_NDA_AVA_MSG *msg, MDS_DEST dst, osaf_extended_name_alloc(osaf_extended_name_borrow(&proxy_comp_name), &msg->info.api_info.param.reg.proxy_comp_name); msg->info.api_info.param.reg.version = *version; + + if (callbacks->saAmfComponentTerminateCallback) + msg->info.api_info.param.reg.callbacks |= AVSV_AMF_CALLBACK_TERMINATE; + if (callbacks->saAmfCSISetCallback) + msg->info.api_info.param.reg.callbacks |= AVSV_AMF_CALLBACK_CSI_SET; + if (callbacks->saAmfCSIRemoveCallback) + msg->info.api_info.param.reg.callbacks |= AVSV_AMF_CALLBACK_CSI_REMOVE; + if (callbacks->saAmfContainedComponentInstantiateCallback) + msg->info.api_info.param.reg.callbacks |= AVSV_AMF_CALLBACK_CONTAINED_INST; + if (callbacks->saAmfContainedComponentCleanupCallback) + msg->info.api_info.param.reg.callbacks |= AVSV_AMF_CALLBACK_CONTAINED_CLEAN; + if (callbacks->saAmfProxiedComponentInstantiateCallback) + msg->info.api_info.param.reg.callbacks |= AVSV_AMF_CALLBACK_PROXIED_INST; + if (callbacks->saAmfProxiedComponentCleanupCallback) + msg->info.api_info.param.reg.callbacks |= AVSV_AMF_CALLBACK_PROXIED_CLEAN; } void ava_fill_comp_unreg_msg(AVSV_NDA_AVA_MSG *msg, MDS_DEST dst, diff --git a/src/amf/agent/ava_mds.h b/src/amf/agent/ava_mds.h index 8f35f759a..602b3342e 100644 --- a/src/amf/agent/ava_mds.h +++ b/src/amf/agent/ava_mds.h @@ -48,7 +48,8 @@ void ava_fill_finalize_msg(AVSV_NDA_AVA_MSG* msg, MDS_DEST dst, SaAmfHandleT hdl, SaNameT comp_name); void ava_fill_comp_reg_msg(AVSV_NDA_AVA_MSG* msg, MDS_DEST dst, SaAmfHandleT hdl, SaNameT comp_name, - SaNameT proxy_comp_name, SaVersionT* version); + SaNameT proxy_comp_name, SaVersionT* version, + const OsafAmfCallbacksT *); void ava_fill_comp_unreg_msg(AVSV_NDA_AVA_MSG* msg, MDS_DEST dst, SaAmfHandleT hdl, SaNameT comp_name, SaNameT proxy_comp_name); diff --git a/src/amf/agent/ava_op.cc b/src/amf/agent/ava_op.cc index 4e27ae76c..77298f403 100644 --- a/src/amf/agent/ava_op.cc +++ b/src/amf/agent/ava_op.cc @@ -83,6 +83,12 @@ uint32_t ava_avnd_msg_prc(AVA_CB *cb, AVSV_NDA_AVA_MSG *msg) { } } + if (cbk_info->type == AVSV_AMF_CONTAINED_COMP_INST) { + TRACE("contained comp inst callback for %s", + osaf_extended_name_borrow(&cbk_info->param.contained_inst.comp_name)); + cb->container = true; + } + /* retrieve the handle record */ hdl = cbk_info->hdl; -- 2.14.4 ------------------------------------------------------------------------------ Check out the vibrant tech community on one of the world's most engaging tech sites, Slashdot.org! http://sdm.link/slashdot _______________________________________________ Opensaf-devel mailing list Opensaf-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/opensaf-devel