osaf/libs/agents/saf/imma/imma_om_api.c | 8 +-
osaf/libs/common/immsv/immsv_evt.c | 265 ++++++++++++----------
osaf/libs/common/immsv/include/immsv_evt.h | 4 +
osaf/libs/common/immsv/include/immsv_evt_model.h | 1 +
osaf/services/saf/immsv/immd/immd_evt.c | 19 +-
osaf/services/saf/immsv/immnd/ImmModel.cc | 13 +-
osaf/services/saf/immsv/immnd/immnd_evt.c | 27 ++-
7 files changed, 205 insertions(+), 132 deletions(-)
Define new message types: IMMD_EVT_ND2D_ADMINIT_REQ_2 and
IMMND_EVT_D2ND_ADMINIT_2.
IMMND_EVT_A2ND_IMM_ADMINIT messages are only sent in scope of a node so no need
to define a new message type.
Add new member 'stringAdminOwnerName' to IMMSV_OM_ADMIN_OWNER_INITIALIZE.
'stringAdminOwnerName' is used in IMMND_EVT_A2ND_IMM_ADMINIT and new message
types.
IMMND will use IMMD_EVT_ND2D_ADMINIT_REQ_2 messages if protocol47 is enabled
and IMMD_EVT_ND2D_ADMINIT_REQ messages if protocol47 is disabled.
When receiving an IMMD_EVT_ND2D_ADMINIT_REQ message, IMMD will broadcast an
IMMND_EVT_D2ND_ADMINIT message.
When receiving an IMMD_EVT_ND2D_ADMINIT_REQ_2 message, IMMD will broadcast an
IMMND_EVT_D2ND_ADMINIT_2 message.
ImmModel now has to handle both old and new messages.
The message type is detected by checking if 'name' member of
IMMSV_OM_ADMIN_OWNER_INITIALIZE is empty or not.
diff --git a/osaf/libs/agents/saf/imma/imma_om_api.c
b/osaf/libs/agents/saf/imma/imma_om_api.c
--- a/osaf/libs/agents/saf/imma/imma_om_api.c
+++ b/osaf/libs/agents/saf/imma/imma_om_api.c
@@ -1012,8 +1012,8 @@ SaAisErrorT saImmOmAdminOwnerInitialize(
evt.type = IMMSV_EVT_TYPE_IMMND;
evt.info.immnd.type = IMMND_EVT_A2ND_IMM_ADMINIT;
evt.info.immnd.info.adminitReq.client_hdl = immHandle;
- osaf_extended_name_alloc(adminOwnerName,
- &evt.info.immnd.info.adminitReq.i.adminOwnerName);
+ evt.info.immnd.info.adminitReq.i.stringAdminOwnerName.size =
strlen(adminOwnerName) + 1;
+ evt.info.immnd.info.adminitReq.i.stringAdminOwnerName.buf =
adminOwnerName;
if (releaseOwnershipOnFinalize) {
evt.info.immnd.info.adminitReq.i.releaseOwnershipOnFinalize =
true;
/* Release on finalize can not be undone in case of IMMND crash.
@@ -8707,8 +8707,8 @@ static SaBoolT imma_re_initialize_admin_
evt.type = IMMSV_EVT_TYPE_IMMND;
evt.info.immnd.type = IMMND_EVT_A2ND_IMM_ADMINIT;
evt.info.immnd.info.adminitReq.client_hdl = immHandle;
- osaf_extended_name_alloc(adm_found_node->mAdminOwnerName,
- &evt.info.immnd.info.adminitReq.i.adminOwnerName);
+ evt.info.immnd.info.adminitReq.i.stringAdminOwnerName.size =
strlen(adm_found_node->mAdminOwnerName) + 1;
+ evt.info.immnd.info.adminitReq.i.stringAdminOwnerName.buf =
adm_found_node->mAdminOwnerName;
evt.info.immnd.info.adminitReq.i.releaseOwnershipOnFinalize = false;
temp_hdl = adm_found_node->admin_owner_hdl;
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
@@ -68,6 +68,7 @@ static const char *immd_evt_names[] = {
"IMMD_EVT_ND2D_LOADING_COMPLETED",
"IMMD_EVT_ND2D_2PBE_PRELOAD",
"IMMD_EVT_ND2D_IMPLSET_REQ_2",
+ "IMMD_EVT_ND2D_ADMINIT_REQ_2",
"undefined (high)"
};
@@ -181,6 +182,7 @@ static const char *immnd_evt_names[] = {
"IMMND_EVT_D2ND_IMPLSET_RSP_2", /* Implementer set reply from D with
impl id */
"IMMND_EVT_A2ND_OBJ_CREATE_2", /* saImmOmCcbObjectCreate_o3 */
"IMMND_EVT_A2ND_OI_OBJ_CREATE_2", /* saImmOiRtObjectCreate_o3 */
+ "IMMND_EVT_D2ND_ADMINIT_2", /* Admin Owner init reply */
"undefined (high)"
};
@@ -1565,7 +1567,11 @@ 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.immd.type ==
IMMD_EVT_ND2D_ADMINIT_REQ_2) {
+ IMMSV_OCTET_STRING *os =
&(i_evt->info.immd.info.admown_init.i.stringAdminOwnerName);
+ if(!immsv_evt_enc_inline_text(__LINE__, o_ub, os)) {
+ return NCSCC_RC_OUT_OF_MEM;
+ }
}
} else if (i_evt->type == IMMSV_EVT_TYPE_IMMND) {
if ((i_evt->info.immnd.type == IMMND_EVT_A2ND_IMM_FEVS) ||
@@ -1989,6 +1995,16 @@ 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_IMM_ADMINIT) {
+ IMMSV_OCTET_STRING *os =
&(i_evt->info.immnd.info.adminitReq.i.stringAdminOwnerName);
+ 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_D2ND_ADMINIT_2) {
+ IMMSV_OCTET_STRING *os =
&(i_evt->info.immnd.info.adminitGlobal.i.stringAdminOwnerName);
+ if(!immsv_evt_enc_inline_text(__LINE__, o_ub, os)) {
+ return NCSCC_RC_OUT_OF_MEM;
+ }
}
}
@@ -2190,6 +2206,9 @@ static uint32_t immsv_evt_dec_sublevels(
os = &(o_evt->info.immd.info.ctrl_msg.pbeFile);
immsv_evt_dec_inline_string(i_ub, os);
+ } else if (o_evt->info.immd.type ==
IMMD_EVT_ND2D_ADMINIT_REQ_2) {
+ IMMSV_OCTET_STRING *os =
&(o_evt->info.immd.info.admown_init.i.stringAdminOwnerName);
+ immsv_evt_dec_inline_string(i_ub, os);
}
} else if (o_evt->type == IMMSV_EVT_TYPE_IMMND) {
if ((o_evt->info.immnd.type == IMMND_EVT_A2ND_IMM_FEVS) ||
@@ -2497,6 +2516,12 @@ 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_IMM_ADMINIT) {
+ IMMSV_OCTET_STRING *os =
&(o_evt->info.immnd.info.adminitReq.i.stringAdminOwnerName);
+ immsv_evt_dec_inline_string(i_ub, os);
+ } else if (o_evt->info.immnd.type == IMMND_EVT_D2ND_ADMINIT_2) {
+ IMMSV_OCTET_STRING *os =
&(o_evt->info.immnd.info.adminitGlobal.i.stringAdminOwnerName);
+ immsv_evt_dec_inline_string(i_ub, os);
}
}
return NCSCC_RC_SUCCESS;
@@ -2933,31 +2958,39 @@ static uint32_t immsv_evt_enc_toplevel(I
break;
case IMMD_EVT_ND2D_ADMINIT_REQ: /* AdminOwnerInitialize */
+ case IMMD_EVT_ND2D_ADMINIT_REQ_2: /* AdminOwnerInitialize
*/
{
IMMSV_RSRV_SPACE_ASSERT(p8, o_ub, 8);
ncs_encode_64bit(&p8,
immdevt->info.admown_init.client_hdl);
ncs_enc_claim_space(o_ub, 8);
- IMMSV_RSRV_SPACE_ASSERT(p8, o_ub, 2);
- const char* value =
osaf_extended_name_borrow(&immdevt->info.admown_init.i.adminOwnerName);
- size_t length = strlen(value);
- if(length >= IMMSV_MAX_ADMO_NAME_LENGTH) {
- // With this check we don't need to check for
extended names
- LOG_WA("Admin owner name is too long (max. 255
characters)");
- rc = NCSCC_RC_FAILURE;
- break;
- }
- ncs_encode_16bit(&p8, length);
- ncs_enc_claim_space(o_ub, 2);
-
- /* adminOwnerName.value is top level because type is
SaNameT */
- if(ncs_encode_n_octets_in_uba(o_ub,
- (uint8_t*) value,
- length)
- != NCSCC_RC_SUCCESS) {
- LOG_WA("Failure inside
ncs_encode_n_octets_in_uba");
- rc = NCSCC_RC_FAILURE;
- break;
+ if (immdevt->type == IMMD_EVT_ND2D_ADMINIT_REQ) {
+ IMMSV_RSRV_SPACE_ASSERT(p8, o_ub, 2);
+ const char* value =
osaf_extended_name_borrow(&immdevt->info.admown_init.i.adminOwnerName);
+ size_t length = strlen(value);
+ if(length >= IMMSV_MAX_ADMO_NAME_LENGTH) {
+ // With this check we don't need to
check for extended names
+ LOG_WA("Admin owner name is too long
(max. 255 characters)");
+ rc = NCSCC_RC_FAILURE;
+ break;
+ }
+ ncs_encode_16bit(&p8, length);
+ ncs_enc_claim_space(o_ub, 2);
+
+ /* adminOwnerName.value is top level because
type is SaNameT */
+ if(ncs_encode_n_octets_in_uba(o_ub,
+ (uint8_t*) value,
+ length)
+ != NCSCC_RC_SUCCESS) {
+ LOG_WA("Failure inside
ncs_encode_n_octets_in_uba");
+ rc = NCSCC_RC_FAILURE;
+ break;
+ }
+ } else if (immdevt->type ==
IMMD_EVT_ND2D_ADMINIT_REQ_2) {
+ IMMSV_RSRV_SPACE_ASSERT(p8, o_ub, 4);
+ ncs_encode_32bit(&p8,
immdevt->info.admown_init.i.stringAdminOwnerName.size);
+ ncs_enc_claim_space(o_ub, 4);
+ /*
immdevt->info.admown_init.i.stringAdminOwnerName.buf encoded by sublevel */
}
IMMSV_RSRV_SPACE_ASSERT(p8, o_ub, 1);
@@ -3153,27 +3186,10 @@ static uint32_t immsv_evt_enc_toplevel(I
ncs_encode_64bit(&p8,
immndevt->info.adminitReq.client_hdl);
ncs_enc_claim_space(o_ub, 8);
- IMMSV_RSRV_SPACE_ASSERT(p8, o_ub, 2);
- const char* value =
osaf_extended_name_borrow(&immndevt->info.adminitReq.i.adminOwnerName);
- size_t length = strlen(value);
- if(length >= IMMSV_MAX_ADMO_NAME_LENGTH) {
- // With this check we don't need to check for
extended names
- LOG_WA("Admin owner name is too long (max. 255
characters)");
- rc = NCSCC_RC_FAILURE;
- break;
- }
- ncs_encode_16bit(&p8, length);
- ncs_enc_claim_space(o_ub, 2);
-
- /* adminOwnerName.value is top level because type is
SaNameT */
- if(ncs_encode_n_octets_in_uba(o_ub,
- (uint8_t*) value,
- length)
- != NCSCC_RC_SUCCESS) {
- LOG_WA("Failure inside
ncs_encode_n_octets_in_uba");
- rc = NCSCC_RC_FAILURE;
- break;
- }
+ IMMSV_RSRV_SPACE_ASSERT(p8, o_ub, 4);
+ ncs_encode_32bit(&p8,
immndevt->info.adminitReq.i.stringAdminOwnerName.size);
+ ncs_enc_claim_space(o_ub, 4);
+ /* immndevt->info.adminitReq.i.stringAdminOwnerName.buf
encoded by sublevel */
IMMSV_RSRV_SPACE_ASSERT(p8, o_ub, 1);
ncs_encode_8bit(&p8,
immndevt->info.adminitReq.i.releaseOwnershipOnFinalize);
@@ -3805,30 +3821,38 @@ static uint32_t immsv_evt_enc_toplevel(I
break;
case IMMND_EVT_D2ND_ADMINIT: /* Admin Owner init reply */
+ case IMMND_EVT_D2ND_ADMINIT_2: /* Admin Owner init reply */
IMMSV_RSRV_SPACE_ASSERT(p8, o_ub, 4);
ncs_encode_32bit(&p8,
immndevt->info.adminitGlobal.globalOwnerId);
ncs_enc_claim_space(o_ub, 4);
- IMMSV_RSRV_SPACE_ASSERT(p8, o_ub, 2);
- const char* value =
osaf_extended_name_borrow(&immndevt->info.adminitGlobal.i.adminOwnerName);
- size_t length = strlen(value);
- if(length >= IMMSV_MAX_ADMO_NAME_LENGTH) {
- // With this check we don't need to check for
extended names
- LOG_WA("Admin owner name is too long (max. 255
characters)");
- rc = NCSCC_RC_FAILURE;
- break;
- }
- ncs_encode_16bit(&p8, length);
- ncs_enc_claim_space(o_ub, 2);
-
- /* adminOwnerName.value is top level because type is
SaNameT */
- if(ncs_encode_n_octets_in_uba(o_ub,
- (uint8_t*) value,
- length)
- != NCSCC_RC_SUCCESS) {
- LOG_WA("Failure inside
ncs_encode_n_octets_in_uba");
- rc = NCSCC_RC_FAILURE;
- break;
+ if (immndevt->type == IMMND_EVT_D2ND_ADMINIT) {
+ IMMSV_RSRV_SPACE_ASSERT(p8, o_ub, 2);
+ const char* value =
osaf_extended_name_borrow(&immndevt->info.adminitGlobal.i.adminOwnerName);
+ size_t length = strlen(value);
+ if(length >= IMMSV_MAX_ADMO_NAME_LENGTH) {
+ // With this check we don't need to
check for extended names
+ LOG_WA("Admin owner name is too long
(max. 255 characters)");
+ rc = NCSCC_RC_FAILURE;
+ break;
+ }
+ ncs_encode_16bit(&p8, length);
+ ncs_enc_claim_space(o_ub, 2);
+
+ /* adminOwnerName.value is top level because
type is SaNameT */
+ if(ncs_encode_n_octets_in_uba(o_ub,
+ (uint8_t*) value,
+ length)
+ != NCSCC_RC_SUCCESS) {
+ LOG_WA("Failure inside
ncs_encode_n_octets_in_uba");
+ rc = NCSCC_RC_FAILURE;
+ break;
+ }
+ } else if (immndevt->type == IMMND_EVT_D2ND_ADMINIT_2) {
+ IMMSV_RSRV_SPACE_ASSERT(p8, o_ub, 4);
+ ncs_encode_32bit(&p8,
immndevt->info.adminitGlobal.i.stringAdminOwnerName.size);
+ ncs_enc_claim_space(o_ub, 4);
+ /*
immndevt->info.adminitGlobal.i.stringAdminOwnerName.buf encoded by sublevel */
}
IMMSV_RSRV_SPACE_ASSERT(p8, o_ub, 1);
@@ -4320,34 +4344,42 @@ static uint32_t immsv_evt_dec_toplevel(N
break;
case IMMD_EVT_ND2D_ADMINIT_REQ: /* AdminOwnerInitialize */
+ case IMMD_EVT_ND2D_ADMINIT_REQ_2: /* AdminOwnerInitialize
*/
{
IMMSV_FLTN_SPACE_ASSERT(p8, local_data, i_ub, 8);
immdevt->info.admown_init.client_hdl =
ncs_decode_64bit(&p8);
ncs_dec_skip_space(i_ub, 8);
- IMMSV_FLTN_SPACE_ASSERT(p8, local_data, i_ub, 2);
- size_t length = ncs_decode_16bit(&p8);
- ncs_dec_skip_space(i_ub, 2);
- if(length >= IMMSV_MAX_ADMO_NAME_LENGTH) {
- LOG_WA("Admin owner name is too long (max. 255
characters)");
- rc = NCSCC_RC_FAILURE;
- break;
+ if (immdevt->type == IMMD_EVT_ND2D_ADMINIT_REQ) {
+ IMMSV_FLTN_SPACE_ASSERT(p8, local_data, i_ub,
2);
+ size_t length = ncs_decode_16bit(&p8);
+ ncs_dec_skip_space(i_ub, 2);
+ if(length >= IMMSV_MAX_ADMO_NAME_LENGTH) {
+ LOG_WA("Admin owner name is too long
(max. 255 characters)");
+ rc = NCSCC_RC_FAILURE;
+ break;
+ }
+
+ /* adminOwnerName.value is top level because
type is SaNameT */
+ char* value = (char*) malloc(length + 1);
+ if (value == NULL ||
ncs_decode_n_octets_from_uba(i_ub,
+ (uint8_t*) value,
+ length) !=
+
NCSCC_RC_SUCCESS) {
+ free(value);
+ LOG_WA("Failure inside
ncs_decode_n_octets_from_uba");
+ rc = NCSCC_RC_FAILURE;
+ break;
+ }
+ value[length] = '\0';
+ osaf_extended_name_steal(value,
&immdevt->info.admown_init.i.adminOwnerName);
+ } else if (immdevt->type ==
IMMD_EVT_ND2D_ADMINIT_REQ_2) {
+ IMMSV_FLTN_SPACE_ASSERT(p8, local_data, i_ub,
4);
+
immdevt->info.admown_init.i.stringAdminOwnerName.size = ncs_decode_32bit(&p8);
+ ncs_dec_skip_space(i_ub, 4);
+ /*
immdevt->info.admown_init.i.stringAdminOwnerName.buf decoded by sublevel */
}
- /* adminOwnerName.value is top level because type is
SaNameT */
- char* value = (char*) malloc(length + 1);
- if (value == NULL || ncs_decode_n_octets_from_uba(i_ub,
- (uint8_t*) value,
- length) !=
- NCSCC_RC_SUCCESS) {
- free(value);
- LOG_WA("Failure inside
ncs_decode_n_octets_from_uba");
- rc = NCSCC_RC_FAILURE;
- break;
- }
- value[length] = '\0';
- osaf_extended_name_steal(value,
&immdevt->info.admown_init.i.adminOwnerName);
-
IMMSV_FLTN_SPACE_ASSERT(p8, local_data, i_ub, 1);
immdevt->info.admown_init.i.releaseOwnershipOnFinalize
= ncs_decode_8bit(&p8);
ncs_dec_skip_space(i_ub, 1);
@@ -4544,28 +4576,10 @@ static uint32_t immsv_evt_dec_toplevel(N
immndevt->info.adminitReq.client_hdl =
ncs_decode_64bit(&p8);
ncs_dec_skip_space(i_ub, 8);
- IMMSV_FLTN_SPACE_ASSERT(p8, local_data, i_ub, 2);
- size_t length = ncs_decode_16bit(&p8);
- ncs_dec_skip_space(i_ub, 2);
- if(length >= IMMSV_MAX_ADMO_NAME_LENGTH) {
- LOG_WA("Admin owner name is too long (max. 255
characters)");
- rc = NCSCC_RC_FAILURE;
- break;
- }
-
- /* adminOwnerName.value is top level because type is
SaNameT */
- char* value = (char*) malloc(length + 1);
- if (value == NULL || ncs_decode_n_octets_from_uba(i_ub,
- (uint8_t*) value,
- length) !=
- NCSCC_RC_SUCCESS) {
- free(value);
- LOG_WA("Failure inside
ncs_decode_n_octets_from_uba");
- rc = NCSCC_RC_FAILURE;
- break;
- }
- value[length] = '\0';
- osaf_extended_name_steal(value,
&immndevt->info.adminitReq.i.adminOwnerName);
+ IMMSV_FLTN_SPACE_ASSERT(p8, local_data, i_ub, 4);
+ immndevt->info.adminitReq.i.stringAdminOwnerName.size =
ncs_decode_32bit(&p8);
+ ncs_dec_skip_space(i_ub, 4);
+ /* immndevt->info.adminitReq.i.stringAdminOwnerName.buf
decoded by sublevel */
IMMSV_FLTN_SPACE_ASSERT(p8, local_data, i_ub, 1);
immndevt->info.adminitReq.i.releaseOwnershipOnFinalize
= ncs_decode_8bit(&p8);
@@ -5251,28 +5265,37 @@ static uint32_t immsv_evt_dec_toplevel(N
break;
case IMMND_EVT_D2ND_ADMINIT: /* Admin Owner init reply */
+ case IMMND_EVT_D2ND_ADMINIT_2: /* Admin Owner init reply */
{
IMMSV_FLTN_SPACE_ASSERT(p8, local_data, i_ub, 4);
immndevt->info.adminitGlobal.globalOwnerId =
ncs_decode_32bit(&p8);
ncs_dec_skip_space(i_ub, 4);
- IMMSV_FLTN_SPACE_ASSERT(p8, local_data, i_ub, 2);
- size_t length = ncs_decode_16bit(&p8);
- ncs_dec_skip_space(i_ub, 2);
-
- /* adminOwnerName.value is top level because type is
SaNameT */
- char* value = (char*) malloc(length + 1);
- if (value == NULL || ncs_decode_n_octets_from_uba(i_ub,
- (uint8_t*) value,
- length) !=
- NCSCC_RC_SUCCESS) {
- free(value);
- LOG_ER("Failure inside
ncs_decode_n_octets_from_uba");
- rc = NCSCC_RC_FAILURE;
- break;
+
osaf_extended_name_clear(&immndevt->info.adminitGlobal.i.adminOwnerName);
+ if (immndevt->type == IMMND_EVT_D2ND_ADMINIT) {
+ IMMSV_FLTN_SPACE_ASSERT(p8, local_data, i_ub,
2);
+ size_t length = ncs_decode_16bit(&p8);
+ ncs_dec_skip_space(i_ub, 2);
+
+ /* adminOwnerName.value is top level because
type is SaNameT */
+ char* value = (char*) malloc(length + 1);
+ if (value == NULL ||
ncs_decode_n_octets_from_uba(i_ub,
+ (uint8_t*) value,
+ length) !=
+
NCSCC_RC_SUCCESS) {
+ free(value);
+ LOG_ER("Failure inside
ncs_decode_n_octets_from_uba");
+ rc = NCSCC_RC_FAILURE;
+ break;
+ }
+ value[length] = '\0';
+ osaf_extended_name_steal(value,
&immndevt->info.adminitGlobal.i.adminOwnerName);
+ } else if (immndevt->type == IMMND_EVT_D2ND_ADMINIT_2) {
+ IMMSV_FLTN_SPACE_ASSERT(p8, local_data, i_ub,
4);
+
immndevt->info.adminitGlobal.i.stringAdminOwnerName.size =
ncs_decode_32bit(&p8);
+ ncs_dec_skip_space(i_ub, 4);
+ /*
immndevt->info.adminitGlobal.i.stringAdminOwnerName.buf decoded by sublevel */
}
- value[length] = '\0';
- osaf_extended_name_steal(value,
&immndevt->info.adminitGlobal.i.adminOwnerName);
IMMSV_FLTN_SPACE_ASSERT(p8, local_data, i_ub, 1);
immndevt->info.adminitGlobal.i.releaseOwnershipOnFinalize =
ncs_decode_8bit(&p8);
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
@@ -214,6 +214,8 @@ typedef enum immnd_evt_type {
IMMND_EVT_A2ND_OBJ_CREATE_2 = 98, /* saImmOmCcbObjectCreate_o3 */
IMMND_EVT_A2ND_OI_OBJ_CREATE_2 = 99, /* saImmOiRtObjectCreate_o3 */
+ IMMND_EVT_D2ND_ADMINIT_2 = 100, /* Admin Owner init reply */
+
IMMND_EVT_MAX
} IMMND_EVT_TYPE;
/* Make sure the string array in immsv_evt.c matches the IMMND_EVT_TYPE enum.
*/
@@ -261,6 +263,8 @@ typedef enum immd_evt_type {
IMMD_EVT_ND2D_IMPLSET_REQ_2 = 27, /* OiImplementerSet */
+ IMMD_EVT_ND2D_ADMINIT_REQ_2 = 28, /* AdminOwnerInitialize */
+
IMMD_EVT_MAX
} IMMD_EVT_TYPE;
/* Make sure the string array in immsv_evt.c matches the IMMD_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
@@ -136,6 +136,7 @@ extern "C" {
typedef struct ImmsvOmAdminOwnerInitialize {
SaNameT adminOwnerName;
SaBoolT releaseOwnershipOnFinalize;
+ IMMSV_OCTET_STRING stringAdminOwnerName;
} IMMSV_OM_ADMIN_OWNER_INITIALIZE;
typedef struct ImmsvOmCcbInitialize {
diff --git a/osaf/services/saf/immsv/immd/immd_evt.c
b/osaf/services/saf/immsv/immd/immd_evt.c
--- a/osaf/services/saf/immsv/immd/immd_evt.c
+++ b/osaf/services/saf/immsv/immd/immd_evt.c
@@ -131,6 +131,7 @@ void immd_process_evt(void)
rc = immd_evt_proc_immnd_announce_dump(cb, &evt->info.immd,
&evt->sinfo);
break;
case IMMD_EVT_ND2D_ADMINIT_REQ:
+ case IMMD_EVT_ND2D_ADMINIT_REQ_2:
rc = immd_evt_proc_adminit_req(cb, &evt->info.immd,
&evt->sinfo);
break;
case IMMD_EVT_ND2D_IMPLSET_REQ:
@@ -1628,7 +1629,11 @@ static uint32_t immd_evt_proc_adminit_re
uba.start = NULL;
TRACE_ENTER();
- TRACE_5("Admin owner name:%s",
osaf_extended_name_borrow(&adminit_req->i.adminOwnerName));
+ if (evt->type == IMMD_EVT_ND2D_ADMINIT_REQ) {
+ TRACE_5("Admin owner name:%s",
osaf_extended_name_borrow(&adminit_req->i.adminOwnerName));
+ } else if (evt->type == IMMD_EVT_ND2D_ADMINIT_REQ_2) {
+ TRACE_5("Admin owner name:%s",
adminit_req->i.stringAdminOwnerName.buf);
+ }
globalId = ++(cb->admo_id_count);
if (cb->admo_id_count == 0xffffffff) {
@@ -1661,7 +1666,11 @@ static uint32_t immd_evt_proc_adminit_re
memset(&fevs_evt, 0, sizeof(IMMSV_EVT));
fevs_evt.type = IMMSV_EVT_TYPE_IMMND;
- fevs_evt.info.immnd.type = IMMND_EVT_D2ND_ADMINIT;
+ if (evt->type == IMMD_EVT_ND2D_ADMINIT_REQ) {
+ fevs_evt.info.immnd.type = IMMND_EVT_D2ND_ADMINIT;
+ } else if (evt->type == IMMD_EVT_ND2D_ADMINIT_REQ_2) {
+ fevs_evt.info.immnd.type = IMMND_EVT_D2ND_ADMINIT_2;
+ }
fevs_evt.info.immnd.info.adminitGlobal.globalOwnerId = globalId;
fevs_evt.info.immnd.info.adminitGlobal.i = adminit_req->i;
@@ -1706,6 +1715,12 @@ static uint32_t immd_evt_proc_adminit_re
m_MMGR_FREE_BUFR_LIST(uba.start);
}
+ if (evt->type == IMMD_EVT_ND2D_ADMINIT_REQ_2) {
+ free(adminit_req->i.stringAdminOwnerName.buf);
+ adminit_req->i.stringAdminOwnerName.buf = NULL;
+ adminit_req->i.stringAdminOwnerName.size = 0;
+ }
+
TRACE_LEAVE();
return proc_rc;
}
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
@@ -4352,13 +4352,22 @@ ImmModel::adminOwnerCreate(const ImmsvOm
unsigned int nodeId)
{
SaAisErrorT err = SA_AIS_OK;
+ std::string admin_name;
TRACE_ENTER();
if(immNotWritable()) {
TRACE_LEAVE();
return SA_AIS_ERR_TRY_AGAIN;
}
- if (strcmp("IMMLOADER", osaf_extended_name_borrow(&req->adminOwnerName))
== 0) {
+ if (osaf_is_extended_name_empty(&req->adminOwnerName)) {
+ /* This must be IMMND_EVT_D2ND_ADMINIT_2 */
+ const IMMSV_OCTET_STRING *os = &req->stringAdminOwnerName;
+ admin_name = std::string((const char*) os->buf, strnlen((const char*)
os->buf, (size_t) os->size));
+ } else {
+ admin_name =
std::string(osaf_extended_name_borrow(&req->adminOwnerName));
+ }
+
+ if (strcmp("IMMLOADER", admin_name.c_str()) == 0) {
if(sImmNodeState != IMM_NODE_LOADING) {
LOG_NO("ERR_INVALID_PARAM: Admin Owner 'IMMLOADER' only allowed
for loading");
TRACE_LEAVE();
@@ -4370,7 +4379,7 @@ ImmModel::adminOwnerCreate(const ImmsvOm
info->mId = ownerId;
-
info->mAdminOwnerName.append(osaf_extended_name_borrow(&req->adminOwnerName));
+ info->mAdminOwnerName.append(admin_name);
if(info->mAdminOwnerName.empty() || !nameCheck(info->mAdminOwnerName)) {
LOG_NO("ERR_INVALID_PARAM: Not a valid Admin Owner Name");
delete info;
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
@@ -476,6 +476,14 @@ uint32_t immnd_evt_destroy(IMMSV_EVT *ev
free(evt->info.immnd.info.ccbUpcallRsp.errorString.buf);
evt->info.immnd.info.ccbUpcallRsp.errorString.buf = NULL;
evt->info.immnd.info.ccbUpcallRsp.errorString.size = 0;
+ } else if (evt->info.immnd.type == IMMND_EVT_A2ND_IMM_ADMINIT) {
+
free(evt->info.immnd.info.adminitReq.i.stringAdminOwnerName.buf);
+ evt->info.immnd.info.adminitReq.i.stringAdminOwnerName.buf =
NULL;
+ evt->info.immnd.info.adminitReq.i.stringAdminOwnerName.size = 0;
+ } else if (evt->info.immnd.type == IMMND_EVT_D2ND_ADMINIT_2) {
+
free(evt->info.immnd.info.adminitGlobal.i.stringAdminOwnerName.buf);
+ evt->info.immnd.info.adminitGlobal.i.stringAdminOwnerName.buf =
NULL;
+ evt->info.immnd.info.adminitGlobal.i.stringAdminOwnerName.size
= 0;
}
if (onheap) {
@@ -2334,11 +2342,17 @@ static uint32_t immnd_evt_proc_admowner_
}
send_evt.type = IMMSV_EVT_TYPE_IMMD;
- send_evt.info.immd.type = IMMD_EVT_ND2D_ADMINIT_REQ;
+ if (immModel_protocol47Allowed(cb)) {
+ send_evt.info.immd.type = IMMD_EVT_ND2D_ADMINIT_REQ_2;
+ send_evt.info.immd.info.admown_init.i = evt->info.adminitReq.i;
+ } else {
+ send_evt.info.immd.type = IMMD_EVT_ND2D_ADMINIT_REQ;
+
osaf_extended_name_lend(evt->info.adminitReq.i.stringAdminOwnerName.buf,
+ &send_evt.info.immd.info.admown_init.i.adminOwnerName);
+
send_evt.info.immd.info.admown_init.i.releaseOwnershipOnFinalize =
evt->info.adminitReq.i.releaseOwnershipOnFinalize;
+ }
send_evt.info.immd.info.admown_init.client_hdl =
evt->info.adminitReq.client_hdl;
- send_evt.info.immd.info.admown_init.i = evt->info.adminitReq.i;
-
/* send the request to the IMMD, reply comes back over fevs. */
rc = immnd_mds_msg_send(cb, NCSMDS_SVC_ID_IMMD, cb->immd_mdest_id,
&send_evt);
@@ -3294,6 +3308,11 @@ static SaAisErrorT immnd_fevs_local_chec
error = SA_AIS_ERR_LIBRARY;
break;
+ case IMMND_EVT_D2ND_ADMINIT_2:
+ LOG_WA("ERR_LIBRARY: IMMND_EVT_D2ND_ADMINIT_2 can not arrive
from client lib");
+ error = SA_AIS_ERR_LIBRARY;
+ break;
+
case IMMND_EVT_D2ND_IMPLSET_RSP:
LOG_WA("ERR_LIBRARY: IMMND_EVT_D2ND_IMPLSET_RSP can not arrive
from client lib");
error = SA_AIS_ERR_LIBRARY;
@@ -7930,6 +7949,7 @@ immnd_evt_proc_fevs_dispatch(IMMND_CB *c
break;
case IMMND_EVT_D2ND_ADMINIT:
+ case IMMND_EVT_D2ND_ADMINIT_2:
immnd_evt_proc_adminit_rsp(cb, &frwrd_evt.info.immnd,
originatedAtThisNd, clnt_hdl, reply_dest);
break;
@@ -8877,6 +8897,7 @@ static void immnd_evt_proc_adminit_rsp(I
SaUint32T conn;
osafassert(evt);
+ osafassert((evt->type != IMMND_EVT_D2ND_ADMINIT_2) ||
immModel_protocol47Allowed(cb));
conn = m_IMMSV_UNPACK_HANDLE_HIGH(clnt_hdl);
nodeId = m_IMMSV_UNPACK_HANDLE_LOW(clnt_hdl);
err = immModel_adminOwnerCreate(cb, &(evt->info.adminitGlobal.i),
------------------------------------------------------------------------------
BPM Camp - Free Virtual Workshop May 6th at 10am PDT/1PM EDT
Develop your own process in accordance with the BPMN 2 standard
Learn Process modeling best practices with Bonita BPM through live exercises
http://www.bonitasoft.com/be-part-of-it/events/bpm-camp-virtual- event?utm_
source=Sourceforge_BPM_Camp_5_6_15&utm_medium=email&utm_campaign=VA_SF
_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel