For this patch I would like to see some adjustments to make it possible 
to achieve the goal
of this enhancement, which is to make it possible to remove all usage of 
SaNameT in the IMMND server
at some point, hopefully OpenSAF 5.0.

One "design rule" that I would like to see implemented already in this 
enhancement is to make the
core ImmModel.cc logic free from SaNaNameT already in 4.7. It is already 
free from it in the sense
that it does not use that type directly any more. But it still uses the 
type indirectly by the SaNameT
type being present in the  two immsv_evt_model.h structs that you are 
modifying in this changeset
and the next.

The modification you are making in this changeset and the next is to add 
a new string member to
the end of these structs. There is no technical problem with this as 
such. But we are still stuck with
that type which contains an SaNameT type.

I would instead like to see a new type.
The type to replace is


     typedef struct ImmsvOmAdminOwnerInitialize {
         SaNameT adminOwnerName;
         SaBoolT releaseOwnershipOnFinalize;
     } IMMSV_OM_ADMIN_OWNER_INITIALIZE;

I would like to see the replacement type defined as:

     typedef struct ImmsvOmAdminOwnerInitialize_2 {
         IMMSV_OCTET_STRING stringAdminOwnerName;
         SaBoolT releaseOwnershipOnFinalize;
     } IMMSV_OM_ADMIN_OWNER_INITIALIZE_2;

This means we also need some new struct types for a2nd, nd2d and d2nd.
The first one a2nd can simply replace the old type since it is node local:

typedef struct immsv_a2nd_adminit_req {
     SaImmHandleT client_hdl;    //ND needs for callbacks
     IMMSV_OM_ADMIN_OWNER_INITIALIZE_2 i;
} IMMSV_A2ND_ADMINIT_REQ;

But the other two need to coexists with the old one for now and be 
embedded in the
higher level message union:

typedef struct immsv_nd2d_adminit_req_2 {
     SaImmHandleT client_hdl;
     IMMSV_OM_ADMIN_OWNER_INITIALIZE_2 i;
} IMMSV_ND2D_ADMINIT_REQ_2;

typedef struct immsv_d2nd_adminit_2 {
     SaUint32T globalOwnerId;
     IMMSV_OM_ADMIN_OWNER_INITIALIZE_2 i;
} IMMSV_D2ND_ADMINIT_2;


typedef struct immnd_evt {
     bool dont_free_me;
     bool unused1;/* Conversion NCS_BOOL->bool */
     bool unused2;/* Conversion NCS_BOOL->bool */
     bool unused3;/* Conversion NCS_BOOL->bool */
     SaAisErrorT error;
     IMMND_EVT_TYPE type;
     union {
        ....
         /* IMMD --> IMMND */
         IMMSV_D2ND_CONTROL ctrl;
         IMMSV_D2ND_ADMINIT adminitGlobal;
         IMMSV_D2ND_ADMINIT_2 adminitGlobal_2;
       .....

    } info;
} IMMND_EVT;

and correspondingly for ND2D.


There is a danger with encode_flat.
But encode flat is not used by fevs.
It is used for node local messages A2ND and ND2A but that should not be 
an issue.

The danger is in some non fevs messages that do go IMMND<->IMMD or even 
IMMND<->IMMND.
If they somehow end up encoding flat.
That could turn out to be a problem when upgrading to 5.0 when/if we are 
removing the old types.
It may be that we need to ensure that we dont encode flat any messages 
going IMMND<->IMMD or
IMMND<->IMMND duting such an upgrade.

/AndersBj


On 04/16/2015 09:20 AM, Hung Nguyen wrote:
>   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),


------------------------------------------------------------------------------
One dashboard for servers and applications across Physical-Virtual-Cloud 
Widest out-of-the-box monitoring support with 50+ applications
Performance metrics, stats and reports that give you Actionable Insights
Deep dive visibility with transaction tracing using APM Insight.
http://ad.doubleclick.net/ddm/clk/290420510;117567292;y
_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to