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
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel