osaf/libs/agents/saf/imma/imma_oi_api.c | 18 ++-
osaf/libs/agents/saf/imma/imma_proc.c | 20 ++-
osaf/libs/common/immsv/immsv_evt.c | 82 +++++++++++-
osaf/libs/common/immsv/include/immsv_evt.h | 4 +
osaf/libs/common/immsv/include/immsv_evt_model.h | 5 +-
osaf/services/saf/immsv/immnd/ImmModel.cc | 4 +-
osaf/services/saf/immsv/immnd/immnd_evt.c | 143
++++++++++++++++++++++-
7 files changed, 257 insertions(+), 19 deletions(-)
Replace SaNameT with IMMSV_OCTET_STRING.
Introduce new message types: IMMND_EVT_A2ND_CCB_OBJ_DELETE_RSP_3,
IMMND_EVT_A2ND_CCB_OBJ_DELETE_RSP_4, IMMND_EVT_A2ND_OI_CCB_AUG_INIT_2.
Add encoding/decoding for new message types.
SaNameT is converted to IMMSV_OCTET_STRING when decoding old-typed messages.
New-typed messages are only forwarded to IMMD when protocol46 is enabled.
When protocol46 is disabled, the messages are converted to the old type
before forwarding to IMMD, this is done in immnd_fevs_local_checks().
diff --git a/osaf/libs/agents/saf/imma/imma_oi_api.c
b/osaf/libs/agents/saf/imma/imma_oi_api.c
--- a/osaf/libs/agents/saf/imma/imma_oi_api.c
+++ b/osaf/libs/agents/saf/imma/imma_oi_api.c
@@ -3621,6 +3621,7 @@ SaAisErrorT saImmOiAugmentCcbInitialize(
SaVersionT version = {'A', 2, 11};
SaUint32T adminOwnerId = 0;
SaUint32T ccbId = 0;
+ IMMSV_OCTET_STRING *objectName = NULL;
TRACE_ENTER();
@@ -3740,11 +3741,18 @@ SaAisErrorT saImmOiAugmentCcbInitialize(
/* populate the EVT structure */
memset(&init_evt, 0, sizeof(IMMSV_EVT));
init_evt.type = IMMSV_EVT_TYPE_IMMND;
- init_evt.info.immnd.type = IMMND_EVT_A2ND_OI_CCB_AUG_INIT;
+ init_evt.info.immnd.type = IMMND_EVT_A2ND_OI_CCB_AUG_INIT_2;
init_evt.info.immnd.info.ccbUpcallRsp.ccbId = ccbId;
init_evt.info.immnd.info.ccbUpcallRsp.implId = cbi->implId;
init_evt.info.immnd.info.ccbUpcallRsp.inv = cbi->inv;
- init_evt.info.immnd.info.ccbUpcallRsp.name = cbi->name;
+
+ objectName = &init_evt.info.immnd.info.ccbUpcallRsp.name.octetString;
+ size_t length = osaf_extended_name_length(&cbi->name);
+ objectName->buf = (char*) malloc((length + 1) * sizeof(char));
+ osafassert(objectName->buf);
+ memcpy(objectName->buf, osaf_extended_name_borrow(&cbi->name), length);
+ objectName->buf[length] = '\0';
+ objectName->size = length + 1;
/* Note that we register using the new OM handle as client for the
aug-ccb */
rc = imma_evt_fake_evs(cb, &init_evt, &out_evt,
cl_node->syncr_timeout,
@@ -3870,6 +3878,12 @@ SaAisErrorT saImmOiAugmentCcbInitialize(
out_evt = NULL;
}
+ if (objectName && objectName->buf) {
+ free(objectName->buf);
+ objectName->buf = NULL;
+ objectName->size = 0;
+ }
+
lock_fail:
TRACE_LEAVE();
return rc;
diff --git a/osaf/libs/agents/saf/imma/imma_proc.c
b/osaf/libs/agents/saf/imma/imma_proc.c
--- a/osaf/libs/agents/saf/imma/imma_proc.c
+++ b/osaf/libs/agents/saf/imma/imma_proc.c
@@ -2613,12 +2613,22 @@ static bool imma_process_callback_info(I
SaImmHandleT privateAugOmHandle = 0LL;
memset(&ccbObjDelRpl, 0, sizeof(IMMSV_EVT));
ccbObjDelRpl.type = IMMSV_EVT_TYPE_IMMND;
- ccbObjDelRpl.info.immnd.type =
IMMND_EVT_A2ND_CCB_OBJ_DELETE_RSP;
+ ccbObjDelRpl.info.immnd.type =
IMMND_EVT_A2ND_CCB_OBJ_DELETE_RSP_3;
ccbObjDelRpl.info.immnd.info.ccbUpcallRsp.result = localEr;
ccbObjDelRpl.info.immnd.info.ccbUpcallRsp.oi_client_hdl =
callback->lcl_imm_hdl;
ccbObjDelRpl.info.immnd.info.ccbUpcallRsp.ccbId = callback->ccbID;
ccbObjDelRpl.info.immnd.info.ccbUpcallRsp.inv =
callback->inv;
- osaf_extended_name_lend(osaf_extended_name_borrow(&(callback->name)),
&(ccbObjDelRpl.info.immnd.info.ccbUpcallRsp.name));
+
+ IMMSV_OCTET_STRING *objectName =
&ccbObjDelRpl.info.immnd.info.ccbUpcallRsp.name.octetString;
+ size_t length =
osaf_extended_name_length(&callback->name);
+ objectName->buf = (char*) malloc((length + 1) *
sizeof(char));
+ if (!objectName->buf) { /* Just log error and drop
this reply. */
+ LOG_ER("Failed to allocate memory, drop this
reply");
+ break;
+ }
+ memcpy(objectName->buf,
osaf_extended_name_borrow(&callback->name), length);
+ objectName->buf[length] = '\0';
+ objectName->size = length + 1;
osafassert(m_NCS_LOCK(&cb->cb_lock,
NCS_LOCK_WRITE) == NCSCC_RC_SUCCESS);
locked = true;
@@ -2628,7 +2638,7 @@ static bool imma_process_callback_info(I
if (localEr != SA_AIS_OK) {
if(errorStr) {
- ccbObjDelRpl.info.immnd.type =
IMMND_EVT_A2ND_CCB_OBJ_DELETE_RSP_2;
+ ccbObjDelRpl.info.immnd.type =
IMMND_EVT_A2ND_CCB_OBJ_DELETE_RSP_4;
ccbObjDelRpl.info.immnd.info.ccbUpcallRsp.errorString.size =
strlen(errorStr) + 1;
ccbObjDelRpl.info.immnd.info.ccbUpcallRsp.errorString.buf = errorStr;
@@ -2666,6 +2676,10 @@ static bool imma_process_callback_info(I
/*Cant do anything but log error and drop this
reply. */
TRACE_3("CcbObjectDeleteCallback: send reply
to IMMND failed");
}
+
+ free(objectName->buf);
+ objectName->buf = NULL;
+ objectName->size = 0;
} else {
/* callback->inv == 0 means PBE (CCB or PRTO) or
applier upcall, no reply. */
osafassert(cl_node->isPbe || cl_node->isApplier);
diff --git a/osaf/libs/common/immsv/immsv_evt.c
b/osaf/libs/common/immsv/immsv_evt.c
--- a/osaf/libs/common/immsv/immsv_evt.c
+++ b/osaf/libs/common/immsv/immsv_evt.c
@@ -183,6 +183,9 @@ static const char *immnd_evt_names[] = {
"IMMND_EVT_D2ND_ADMINIT_2", /* Admin Owner init reply */
"IMMND_EVT_A2ND_OBJ_CREATE_2", /* saImmOmCcbObjectCreate_o3 */
"IMMND_EVT_A2ND_OI_OBJ_CREATE_2", /* saImmOiRtObjectCreate_o3 */
+ "IMMND_EVT_A2ND_CCB_OBJ_DELETE_RSP_3", /*CcbObjDelete local Reply */
+ "IMMND_EVT_A2ND_CCB_OBJ_DELETE_RSP_4", /*CcbObjDelete local Reply */
+ "IMMND_EVT_A2ND_OI_CCB_AUG_INIT_2",
"undefined (high)"
};
@@ -1999,6 +2002,19 @@ static uint32_t immsv_evt_enc_sublevels(
if(!immsv_evt_enc_inline_text(__LINE__, o_ub, os)) {
return NCSCC_RC_OUT_OF_MEM;
}
+ } else if ((i_evt->info.immnd.type ==
IMMND_EVT_A2ND_CCB_OBJ_DELETE_RSP_3) ||
+ (i_evt->info.immnd.type ==
IMMND_EVT_A2ND_CCB_OBJ_DELETE_RSP_4) ||
+ (i_evt->info.immnd.type == IMMND_EVT_A2ND_OI_CCB_AUG_INIT_2)) {
+ IMMSV_OCTET_STRING *os =
&(i_evt->info.immnd.info.ccbUpcallRsp.name.octetString);
+ if (!immsv_evt_enc_inline_text(__LINE__, o_ub, os)) {
+ return NCSCC_RC_OUT_OF_MEM;
+ }
+ if (i_evt->info.immnd.type ==
IMMND_EVT_A2ND_CCB_OBJ_DELETE_RSP_4) {
+ os = &(i_evt->info.immnd.info.ccbUpcallRsp.errorString);
+ if (!immsv_evt_enc_inline_text(__LINE__, o_ub, os)) {
+ return NCSCC_RC_OUT_OF_MEM;
+ }
+ }
} else if (i_evt->info.immnd.type == IMMND_EVT_A2ND_IMM_ADMINIT) {
IMMSV_OCTET_STRING *os =
&(i_evt->info.immnd.info.adminitReq.i.adminOwnerName.octetString);
if (strlen(os->buf) >= IMMSV_MAX_ADMO_NAME_LENGTH) {
@@ -2532,6 +2548,15 @@ static uint32_t immsv_evt_dec_sublevels(
IMMSV_OCTET_STRING *os =
&(o_evt->info.immnd.info.ccbUpcallRsp.errorString);
immsv_evt_dec_inline_string(i_ub, os);
+ } else if ((o_evt->info.immnd.type ==
IMMND_EVT_A2ND_CCB_OBJ_DELETE_RSP_3) ||
+ (o_evt->info.immnd.type ==
IMMND_EVT_A2ND_CCB_OBJ_DELETE_RSP_4) ||
+ (o_evt->info.immnd.type == IMMND_EVT_A2ND_OI_CCB_AUG_INIT_2)) {
+ IMMSV_OCTET_STRING *os =
&(o_evt->info.immnd.info.ccbUpcallRsp.name.octetString);
+ immsv_evt_dec_inline_string(i_ub, os);
+ if (o_evt->info.immnd.type ==
IMMND_EVT_A2ND_CCB_OBJ_DELETE_RSP_4) {
+ os = &(o_evt->info.immnd.info.ccbUpcallRsp.errorString);
+ immsv_evt_dec_inline_string(i_ub, os);
+ }
} else if (o_evt->info.immnd.type == IMMND_EVT_A2ND_IMM_ADMINIT) {
IMMSV_OCTET_STRING *os =
&(o_evt->info.immnd.info.adminitReq.i.adminOwnerName.octetString);
immsv_evt_dec_inline_string(i_ub, os);
@@ -2620,6 +2645,16 @@ uint32_t immsv_evt_dec_flat(NCS_UBAID *i
buf[length] = '\0';
o_evt->info.immnd.info.adminitGlobal.i.adminOwnerName.octetString.size =
length + 1;
o_evt->info.immnd.info.adminitGlobal.i.adminOwnerName.octetString.buf = buf;
+ } else if ((o_evt->info.immnd.type ==
IMMND_EVT_A2ND_CCB_OBJ_DELETE_RSP) ||
+ (o_evt->info.immnd.type ==
IMMND_EVT_A2ND_CCB_OBJ_DELETE_RSP_2) ||
+ (o_evt->info.immnd.type == IMMND_EVT_A2ND_OI_CCB_AUG_INIT)) {
+ size_t length =
osaf_extended_name_length(&o_evt->info.immnd.info.ccbUpcallRsp.name.saName);
+ char* buf = (char*) malloc((length + 1) * sizeof(char));
+ osafassert(buf);
+ memcpy(buf,
osaf_extended_name_borrow(&o_evt->info.immnd.info.ccbUpcallRsp.name.saName),
length);
+ buf[length] = '\0';
+ o_evt->info.immnd.info.ccbUpcallRsp.name.octetString.size = length + 1;
+ o_evt->info.immnd.info.ccbUpcallRsp.name.octetString.buf = buf;
}
} else if (o_evt->type == IMMSV_EVT_TYPE_IMMD) {
if (o_evt->info.immd.type == IMMD_EVT_ND2D_ADMINIT_REQ) {
@@ -3640,6 +3675,9 @@ static uint32_t immsv_evt_enc_toplevel(I
case IMMND_EVT_A2ND_PBE_PRTO_DELETES_COMPLETED_RSP:/*Pbe PRTO
deletes done */
case IMMND_EVT_A2ND_PBE_PRT_ATTR_UPDATE_RSP:/* Pbe OI rt attr
update response*/
case IMMND_EVT_A2ND_OI_CCB_AUG_INIT:/*OI augments CCB inside
ccb upcall. #1963 */
+ case IMMND_EVT_A2ND_CCB_OBJ_DELETE_RSP_3: /*CcbObjDelete local
Reply */
+ case IMMND_EVT_A2ND_CCB_OBJ_DELETE_RSP_4: /*CcbObjDelete local
Reply */
+ case IMMND_EVT_A2ND_OI_CCB_AUG_INIT_2: /*OI augments CCB
inside ccb upcall */
{
IMMSV_RSRV_SPACE_ASSERT(p8, o_ub, 8);
ncs_encode_64bit(&p8,
immndevt->info.ccbUpcallRsp.oi_client_hdl);
@@ -3662,13 +3700,13 @@ static uint32_t immsv_evt_enc_toplevel(I
ncs_enc_claim_space(o_ub, 4);
IMMSV_RSRV_SPACE_ASSERT(p8, o_ub, 2);
- const char* value =
osaf_extended_name_borrow(&immndevt->info.ccbUpcallRsp.name);
+ const char* value =
osaf_extended_name_borrow(&immndevt->info.ccbUpcallRsp.name.saName);
size_t length = strlen(value);
osafassert(length <= 0xffff);
ncs_encode_16bit(&p8, length);
ncs_enc_claim_space(o_ub, 2);
- /* name.value is top level because type is SaNameT */
+ /* name.saName.value is top level because type is SaNameT */
if((immndevt->type == IMMND_EVT_A2ND_CCB_OBJ_DELETE_RSP) ||
(immndevt->type == IMMND_EVT_A2ND_CCB_OBJ_DELETE_RSP_2) ||
(immndevt->type == IMMND_EVT_A2ND_OI_CCB_AUG_INIT)) {
@@ -3684,10 +3722,20 @@ static uint32_t immsv_evt_enc_toplevel(I
}
}
+ if ((immndevt->type == IMMND_EVT_A2ND_CCB_OBJ_DELETE_RSP_3) ||
+ (immndevt->type == IMMND_EVT_A2ND_CCB_OBJ_DELETE_RSP_4) ||
+ (immndevt->type == IMMND_EVT_A2ND_OI_CCB_AUG_INIT_2)) {
+ IMMSV_RSRV_SPACE_ASSERT(p8, o_ub, 4);
+ ncs_encode_32bit(&p8,
immndevt->info.ccbUpcallRsp.name.octetString.size);
+ ncs_enc_claim_space(o_ub, 4);
+ /* immndevt->info.ccbUpcallRsp.name.octetString.buf
encoded by sublevel */
+ }
+
if((immndevt->type == IMMND_EVT_A2ND_CCB_COMPLETED_RSP_2) ||
(immndevt->type == IMMND_EVT_A2ND_CCB_OBJ_CREATE_RSP_2) ||
(immndevt->type == IMMND_EVT_A2ND_CCB_OBJ_DELETE_RSP_2) ||
- (immndevt->type == IMMND_EVT_A2ND_CCB_OBJ_MODIFY_RSP_2)) {
+ (immndevt->type == IMMND_EVT_A2ND_CCB_OBJ_MODIFY_RSP_2) ||
+ (immndevt->type == IMMND_EVT_A2ND_CCB_OBJ_DELETE_RSP_4)) {
IMMSV_RSRV_SPACE_ASSERT(p8, o_ub, 4);
ncs_encode_32bit(&p8,
immndevt->info.ccbUpcallRsp.errorString.size);
ncs_enc_claim_space(o_ub, 4);
@@ -5045,6 +5093,9 @@ static uint32_t immsv_evt_dec_toplevel(N
case IMMND_EVT_A2ND_PBE_PRTO_DELETES_COMPLETED_RSP:/*Pbe PRTO
deletes done */
case IMMND_EVT_A2ND_PBE_PRT_ATTR_UPDATE_RSP:/* Pbe OI rt attr
update response*/
case IMMND_EVT_A2ND_OI_CCB_AUG_INIT:/*OI augments CCB inside
ccb upcall. #1963 */
+ case IMMND_EVT_A2ND_CCB_OBJ_DELETE_RSP_3: /*CcbObjDelete local
Reply */
+ case IMMND_EVT_A2ND_CCB_OBJ_DELETE_RSP_4: /*CcbObjDelete local
Reply */
+ case IMMND_EVT_A2ND_OI_CCB_AUG_INIT_2: /*OI augments CCB
inside ccb upcall */
{
IMMSV_FLTN_SPACE_ASSERT(p8, local_data, i_ub, 8);
immndevt->info.ccbUpcallRsp.oi_client_hdl =
ncs_decode_64bit(&p8);
@@ -5070,13 +5121,13 @@ static uint32_t immsv_evt_dec_toplevel(N
size_t length = ncs_decode_16bit(&p8);
ncs_dec_skip_space(i_ub, 2);
- osaf_extended_name_clear(&immndevt->info.ccbUpcallRsp.name);
if((immndevt->type == IMMND_EVT_A2ND_CCB_OBJ_DELETE_RSP) ||
(immndevt->type == IMMND_EVT_A2ND_CCB_OBJ_DELETE_RSP_2) ||
(immndevt->type == IMMND_EVT_A2ND_OI_CCB_AUG_INIT)) {
- /* name.value is top level because type is SaNameT */
+ /* name.saName.value is top level because type is
SaNameT */
+ /* length can be zero when there's no parent name */
+ char* value = (char*) malloc(length + 1);
if (length) {
- char* value = (char*) malloc(length + 1);
if (value == NULL ||
ncs_decode_n_octets_from_uba(i_ub,
(uint8_t*) value,
length) !=
@@ -5086,15 +5137,28 @@ static uint32_t immsv_evt_dec_toplevel(N
rc = NCSCC_RC_FAILURE;
break;
}
- value[length] = '\0';
- osaf_extended_name_steal(value,
&immndevt->info.ccbUpcallRsp.name);
}
+ value[length] = '\0';
+
+ /* Convert to new type */
+ immndevt->info.ccbUpcallRsp.name.octetString.size = length + 1;
+ immndevt->info.ccbUpcallRsp.name.octetString.buf = value;
+ }
+
+ if ((immndevt->type == IMMND_EVT_A2ND_CCB_OBJ_DELETE_RSP_3) ||
+ (immndevt->type == IMMND_EVT_A2ND_CCB_OBJ_DELETE_RSP_4) ||
+ (immndevt->type == IMMND_EVT_A2ND_OI_CCB_AUG_INIT_2)) {
+ IMMSV_FLTN_SPACE_ASSERT(p8, local_data, i_ub, 4);
+ immndevt->info.ccbUpcallRsp.name.octetString.size = ncs_decode_32bit(&p8);
+ ncs_dec_skip_space(i_ub, 4);
+ /* immndevt->info.ccbUpcallRsp.name.octetString.buf
decoded by sublevel */
}
if((immndevt->type == IMMND_EVT_A2ND_CCB_COMPLETED_RSP_2) ||
(immndevt->type == IMMND_EVT_A2ND_CCB_OBJ_CREATE_RSP_2) ||
(immndevt->type == IMMND_EVT_A2ND_CCB_OBJ_DELETE_RSP_2) ||
- (immndevt->type == IMMND_EVT_A2ND_CCB_OBJ_MODIFY_RSP_2)) {
+ (immndevt->type == IMMND_EVT_A2ND_CCB_OBJ_MODIFY_RSP_2) ||
+ (immndevt->type == IMMND_EVT_A2ND_CCB_OBJ_DELETE_RSP_4)) {
IMMSV_FLTN_SPACE_ASSERT(p8, local_data, i_ub, 4);
immndevt->info.ccbUpcallRsp.errorString.size =
ncs_decode_32bit(&p8);
ncs_dec_skip_space(i_ub, 4);
diff --git a/osaf/libs/common/immsv/include/immsv_evt.h
b/osaf/libs/common/immsv/include/immsv_evt.h
--- a/osaf/libs/common/immsv/include/immsv_evt.h
+++ b/osaf/libs/common/immsv/include/immsv_evt.h
@@ -216,6 +216,10 @@ typedef enum immnd_evt_type {
IMMND_EVT_A2ND_OBJ_CREATE_2 = 99, /* saImmOmCcbObjectCreate_o3 */
IMMND_EVT_A2ND_OI_OBJ_CREATE_2 = 100, /*
saImmOiRtObjectCreate_o3 */
+ IMMND_EVT_A2ND_CCB_OBJ_DELETE_RSP_3 = 101, /*CcbObjDelete local
Reply */
+ IMMND_EVT_A2ND_CCB_OBJ_DELETE_RSP_4 = 102, /*CcbObjDelete local
Reply */
+ IMMND_EVT_A2ND_OI_CCB_AUG_INIT_2 = 103, /* Init of OI augmented ccb
handle */
+
IMMND_EVT_MAX
} IMMND_EVT_TYPE;
/* Make sure the string array in immsv_evt.c matches the
IMMND_EVT_TYPE enum. */
diff --git a/osaf/libs/common/immsv/include/immsv_evt_model.h
b/osaf/libs/common/immsv/include/immsv_evt_model.h
--- a/osaf/libs/common/immsv/include/immsv_evt_model.h
+++ b/osaf/libs/common/immsv/include/immsv_evt_model.h
@@ -288,7 +288,10 @@ extern "C" {
SaUint32T implId;
SaUint32T inv;
SaAisErrorT result;
- SaNameT name;
+ union {
+ SaNameT saName;
+ IMMSV_OCTET_STRING octetString;
+ } name;
IMMSV_OCTET_STRING errorString;
} IMMSV_OI_CCB_UPCALL_RSP;
diff --git a/osaf/services/saf/immsv/immnd/ImmModel.cc
b/osaf/services/saf/immsv/immnd/ImmModel.cc
--- a/osaf/services/saf/immsv/immnd/ImmModel.cc
+++ b/osaf/services/saf/immsv/immnd/ImmModel.cc
@@ -5959,7 +5959,7 @@ ImmModel::ccbAugmentInit(immsv_oi_ccb_up
TRACE_ENTER();
/*Note: objectName is parent-name for the create case! */
- std::string objectName(osaf_extended_name_borrow(&rsp->name));
+ std::string objectName(rsp->name.octetString.buf);
osafassert(nameCheck(objectName)||nameToInternal(objectName));
i = std::find_if(sCcbVector.begin(), sCcbVector.end(),
CcbIdIs(ccbId));
@@ -9611,7 +9611,7 @@ ImmModel::ccbObjDelContinuation(immsv_oi
SaUint32T* reqConn, bool* augDelete)
{
TRACE_ENTER();
- std::string objectName(osaf_extended_name_borrow(&rsp->name));
+ std::string objectName(rsp->name.octetString.buf);
SaUint32T ccbId = rsp->ccbId;
CcbInfo* ccb = 0;
diff --git a/osaf/services/saf/immsv/immnd/immnd_evt.c
b/osaf/services/saf/immsv/immnd/immnd_evt.c
--- a/osaf/services/saf/immsv/immnd/immnd_evt.c
+++ b/osaf/services/saf/immsv/immnd/immnd_evt.c
@@ -470,7 +470,6 @@ uint32_t immnd_evt_destroy(IMMSV_EVT *ev
immsv_evt_free_name_list(evt->info.immnd.info.admReq.objectNames);
evt->info.immnd.info.admReq.objectNames = NULL;
} else if ((evt->info.immnd.type ==
IMMND_EVT_A2ND_CCB_OBJ_CREATE_RSP_2) ||
- (evt->info.immnd.type == IMMND_EVT_A2ND_CCB_OBJ_DELETE_RSP_2) ||
(evt->info.immnd.type ==
IMMND_EVT_A2ND_CCB_OBJ_MODIFY_RSP_2) ||
(evt->info.immnd.type == IMMND_EVT_A2ND_CCB_COMPLETED_RSP_2)) {
free(evt->info.immnd.info.ccbUpcallRsp.errorString.buf);
@@ -485,6 +484,21 @@ uint32_t immnd_evt_destroy(IMMSV_EVT *ev
free(evt->info.immnd.info.adminitGlobal.i.adminOwnerName.octetString.buf);
evt->info.immnd.info.adminitGlobal.i.adminOwnerName.octetString.buf = NULL;
evt->info.immnd.info.adminitGlobal.i.adminOwnerName.octetString.size = 0;
+ } else if ((evt->info.immnd.type ==
IMMND_EVT_A2ND_CCB_OBJ_DELETE_RSP) ||
+ (evt->info.immnd.type ==
IMMND_EVT_A2ND_CCB_OBJ_DELETE_RSP_2) ||
+ (evt->info.immnd.type ==
IMMND_EVT_A2ND_CCB_OBJ_DELETE_RSP_3) ||
+ (evt->info.immnd.type ==
IMMND_EVT_A2ND_CCB_OBJ_DELETE_RSP_4) ||
+ (evt->info.immnd.type == IMMND_EVT_A2ND_OI_CCB_AUG_INIT) ||
+ (evt->info.immnd.type == IMMND_EVT_A2ND_OI_CCB_AUG_INIT_2)) {
+ free(evt->info.immnd.info.ccbUpcallRsp.name.octetString.buf);
+ evt->info.immnd.info.ccbUpcallRsp.name.octetString.buf = NULL;
+ evt->info.immnd.info.ccbUpcallRsp.name.octetString.size = 0;
+ if ((evt->info.immnd.type ==
IMMND_EVT_A2ND_CCB_OBJ_DELETE_RSP_4) ||
+ (evt->info.immnd.type ==
IMMND_EVT_A2ND_CCB_OBJ_DELETE_RSP_2)) {
+ free(evt->info.immnd.info.ccbUpcallRsp.errorString.buf);
+ evt->info.immnd.info.ccbUpcallRsp.errorString.buf = NULL;
+ evt->info.immnd.info.ccbUpcallRsp.errorString.size = 0;
+ }
}
if (onheap) {
@@ -3208,8 +3222,67 @@ static SaAisErrorT immnd_fevs_local_chec
case IMMND_EVT_A2ND_OBJ_CREATE:
case IMMND_EVT_A2ND_OBJ_DELETE:
case IMMND_EVT_A2ND_CCB_FINALIZE:
+ case IMMND_EVT_A2ND_AUG_ADMO:
+ if(immModel_pbeNotWritable(cb)) {
+ error = SA_AIS_ERR_TRY_AGAIN;
+ }
+ break;
+
+ case IMMND_EVT_A2ND_OI_CCB_AUG_INIT_2:
+ if (!immModel_protocol46Allowed(cb)) {
+ TRACE("IMMND_EVT_A2ND_OI_CCB_AUG_INIT_2 with protocol46
disabled");
+ IMMSV_EVT augInitEvt;
+ uint32_t rc = 0;
+ NCS_UBAID ubaid;
+ ubaid.start = NULL;
+ int32_t size = 0;
+ char *tmpData = NULL;
+ char* data = NULL;
+
+ /* Convert from A2ND_OI_CCB_AUG_INIT_2 to
A2ND_OI_CCB_AUG_INIT */
+ memset(&augInitEvt, 0, sizeof(IMMSV_EVT));
+ augInitEvt.type = IMMSV_EVT_TYPE_IMMND;
+ augInitEvt.info.immnd.type = IMMND_EVT_A2ND_OI_CCB_AUG_INIT;
+ augInitEvt.info.immnd.info.ccbUpcallRsp.ccbId =
frwrd_evt.info.immnd.info.ccbUpcallRsp.ccbId;
+ augInitEvt.info.immnd.info.ccbUpcallRsp.implId =
frwrd_evt.info.immnd.info.ccbUpcallRsp.implId;
+ augInitEvt.info.immnd.info.ccbUpcallRsp.inv =
frwrd_evt.info.immnd.info.ccbUpcallRsp.inv;
+
osaf_extended_name_lend(frwrd_evt.info.immnd.info.ccbUpcallRsp.name.octetString.buf,
+ &augInitEvt.info.immnd.info.ccbUpcallRsp.name.saName);
+
+ /* Encode the message */
+ rc = ncs_enc_init_space(&ubaid);
+ if (rc != NCSCC_RC_SUCCESS) {
+ TRACE_2("ERR_LIBRARY: Failed init ubaid");
+ error = SA_AIS_ERR_LIBRARY;
+ break;
+ }
+ rc = immsv_evt_enc(&augInitEvt, &ubaid);
+ if (rc != NCSCC_RC_SUCCESS) {
+ TRACE_2("ERR_LIBRARY: Failed to pre-pack");
+ error = SA_AIS_ERR_LIBRARY;
+ break;
+ }
+
+ /* Free memory allocated for A2ND_OI_CCB_AUG_INIT_2 */
+ free(fevsReq->msg.buf);
+ fevsReq->msg.buf = NULL;
+
+ /* Allocate memory to store new message */
+ size = ubaid.ttl;
+ tmpData = malloc(size);
+ osafassert(tmpData);
+ data = m_MMGR_DATA_AT_START(ubaid.start, size, tmpData);
+ fevsReq->msg.size = size;
+ fevsReq->msg.buf = malloc(size);
+ osafassert(fevsReq->msg.buf);
+ memcpy(fevsReq->msg.buf, data, size);
+
+ free(tmpData);
+ tmpData = NULL;
+ if (ubaid.start) m_MMGR_FREE_BUFR_LIST(ubaid.start);
+ }
+ /* intentional fall through */
case IMMND_EVT_A2ND_OI_CCB_AUG_INIT:
- case IMMND_EVT_A2ND_AUG_ADMO:
if(immModel_pbeNotWritable(cb)) {
error = SA_AIS_ERR_TRY_AGAIN;
}
@@ -3517,6 +3590,69 @@ static SaAisErrorT immnd_fevs_local_chec
}
break;
+ case IMMND_EVT_A2ND_CCB_OBJ_DELETE_RSP_3:
+ case IMMND_EVT_A2ND_CCB_OBJ_DELETE_RSP_4:
+ if (!immModel_protocol46Allowed(cb)) {
+ TRACE("A2ND_CCB_OBJ_DELETE_RSP_3/A2ND_CCB_OBJ_DELETE_RSP_4 with
protocol46 disabled");
+ IMMSV_EVT ccbObjDelRpl;
+ uint32_t rc = 0;
+ NCS_UBAID ubaid;
+ ubaid.start = NULL;
+ int32_t size = 0;
+ char *tmpData = NULL;
+ char* data = NULL;
+
+ /* Convert from
A2ND_CCB_OBJ_DELETE_RSP_3/A2ND_CCB_OBJ_DELETE_RSP_4
+ * to A2ND_CCB_OBJ_DELETE_RSP/A2ND_CCB_OBJ_DELETE_RSP_2 */
+ memset(&ccbObjDelRpl, 0, sizeof(IMMSV_EVT));
+ ccbObjDelRpl.type = IMMSV_EVT_TYPE_IMMND;
+ ccbObjDelRpl.info.immnd.type =
IMMND_EVT_A2ND_CCB_OBJ_DELETE_RSP;
+ ccbObjDelRpl.info.immnd.info.ccbUpcallRsp.result =
frwrd_evt.info.immnd.info.ccbUpcallRsp.result;
+ ccbObjDelRpl.info.immnd.info.ccbUpcallRsp.oi_client_hdl =
frwrd_evt.info.immnd.info.ccbUpcallRsp.oi_client_hdl;
+ ccbObjDelRpl.info.immnd.info.ccbUpcallRsp.ccbId =
frwrd_evt.info.immnd.info.ccbUpcallRsp.ccbId;
+ ccbObjDelRpl.info.immnd.info.ccbUpcallRsp.inv =
frwrd_evt.info.immnd.info.ccbUpcallRsp.inv;
+
osaf_extended_name_lend(frwrd_evt.info.immnd.info.ccbUpcallRsp.name.octetString.buf,
+ &ccbObjDelRpl.info.immnd.info.ccbUpcallRsp.name.saName);
+
+ if (frwrd_evt.info.immnd.type ==
IMMND_EVT_A2ND_CCB_OBJ_DELETE_RSP_4) {
+ ccbObjDelRpl.info.immnd.type =
IMMND_EVT_A2ND_CCB_OBJ_DELETE_RSP_2;
+ ccbObjDelRpl.info.immnd.info.ccbUpcallRsp.errorString.size =
frwrd_evt.info.immnd.info.ccbUpcallRsp.errorString.size;
+ ccbObjDelRpl.info.immnd.info.ccbUpcallRsp.errorString.buf =
frwrd_evt.info.immnd.info.ccbUpcallRsp.errorString.buf;
+ }
+
+ /* Encode new message */
+ rc = ncs_enc_init_space(&ubaid);
+ if (rc != NCSCC_RC_SUCCESS) {
+ TRACE_2("ERR_LIBRARY: Failed init ubaid");
+ error = SA_AIS_ERR_LIBRARY;
+ break;
+ }
+ rc = immsv_evt_enc(&ccbObjDelRpl, &ubaid);
+ if (rc != NCSCC_RC_SUCCESS) {
+ TRACE_2("ERR_LIBRARY: Failed to pre-pack");
+ error = SA_AIS_ERR_LIBRARY;
+ break;
+ }
+
+ /* Free memory allocated for
A2ND_CCB_OBJ_DELETE_RSP_3/A2ND_CCB_OBJ_DELETE_RSP_4 */
+ free(fevsReq->msg.buf);
+ fevsReq->msg.buf = NULL;
+
+ /* Allocate memory to store new message */
+ size = ubaid.ttl;
+ tmpData = malloc(size);
+ osafassert(tmpData);
+ data = m_MMGR_DATA_AT_START(ubaid.start, size, tmpData);
+ fevsReq->msg.size = size;
+ fevsReq->msg.buf = malloc(size);
+ osafassert(fevsReq->msg.buf);
+ memcpy(fevsReq->msg.buf, data, size);
+
+ free(tmpData);
+ tmpData = NULL;
+ if (ubaid.start) m_MMGR_FREE_BUFR_LIST(ubaid.start);
+ }
+ /* intentional fall through */
case IMMND_EVT_A2ND_CCB_COMPLETED_RSP:
case IMMND_EVT_A2ND_CCB_COMPLETED_RSP_2:
case IMMND_EVT_A2ND_PBE_PRTO_DELETES_COMPLETED_RSP:
@@ -7973,6 +8109,7 @@ immnd_evt_proc_fevs_dispatch(IMMND_CB *c
break;
case IMMND_EVT_A2ND_OI_CCB_AUG_INIT:
+ case IMMND_EVT_A2ND_OI_CCB_AUG_INIT_2:
immnd_evt_ccb_augment_init(cb, &frwrd_evt.info.immnd,
originatedAtThisNd, clnt_hdl, reply_dest);
break;
@@ -8046,6 +8183,8 @@ immnd_evt_proc_fevs_dispatch(IMMND_CB *c
case IMMND_EVT_A2ND_CCB_OBJ_DELETE_RSP:
case IMMND_EVT_A2ND_CCB_OBJ_DELETE_RSP_2:
+ case IMMND_EVT_A2ND_CCB_OBJ_DELETE_RSP_3:
+ case IMMND_EVT_A2ND_CCB_OBJ_DELETE_RSP_4:
immnd_evt_proc_ccb_obj_delete_rsp(cb, &frwrd_evt.info.immnd,
originatedAtThisNd, clnt_hdl, reply_dest);
break;
------------------------------------------------------------------------------
Dive into the World of Parallel Programming The Go Parallel Website, sponsored
by Intel and developed in partnership with Slashdot Media, is your hub for all
things parallel software development, from weekly thought leadership blogs to
news, videos, case studies, tutorials and more. Take a look and join the
conversation now. http://goparallel.sourceforge.net/
_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel