Hi Hung, I over looked imma_oi_ccb_record, the idea was to avoid increasing library memory, if the apply/abort is not called. I agree that it can be done from OI side also. will re-publish the patch.
Thanks, Neel. On 2016/11/23 02:58 PM, Hung Nguyen wrote: > Hi Neel, > > 'struct imma_oi_ccb_record' is already defined in imma_cb.h > It's used to store information of a specific CCB. > > By using imma_oi_ccb_record to store admoName/ObjectName, > we can avoid new message and also don't have to change anything in IMMND > server. > > > BR, > Hung Nguyen - DEK Technologies > > -------------------------------------------------------------------------------- > From: Neelakanta [email protected] > Sent: Wednesday, November 23, 2016 3:56PM > To: Hung Nguyen, Zoran Milinkovic > [email protected],[email protected] > Cc: Opensaf-devel > [email protected] > Subject: Re: [PATCH 1 of 1] imm:allow augumentCcbInit with ROF as false in > completed callback[#1956] > > > Hi Hung, > > Multiple adminowners are allowed for each immhandle > Multiple ccbhandles(IDs) allowed for each adminownerhandle > > If we need to store in the OI cb , then we have to book-keep ccbids > and there corresponding ccb operation object name > > Instead I chose to read from IMMND , as AccessorGet or new message > will have to get admin owner from IMMND. > > Thanks, > Neel. > > On 2016/11/23 01:47 PM, Hung Nguyen wrote: >> Hi Neel, >> >> I think we can fix this ticket without new message type. >> >> Before the CcbCompleted callback, the OI always gets one or more >> CcbCreate/Modify/Delete callbacks. >> We can use those callbacks to get admo name. >> >> We add more members to 'struct imma_oi_ccb_record' >> SaStringT firstObjectName; >> SaStringT adminOwnerName; >> >> >> CcbCreate callback: >> We can get the admo name right away >> by reading 'SaImmAttrAdminOwnerName' attribute from >> 'evt->info.objCreate.attrValues' >> Then store the admo name in imma_oi_ccb_record.adminOwnerName. >> >> >> CcbModify/Delete callback: >> We can't get the admo name right away. >> We have to store the object name in imma_oi_ccb_record.firstObjectName. >> This only needs to be done once, no need to overwrite 'firstObjectName' in >> later callbacks. >> We only need one object name of the CCB. >> >> >> Now when we need to get admo name in CcbCompleted callback, >> we have to fetch the imma_oi_ccb_record of that ccb. >> If the ccb_record already has adminOwnerName, we can use it right away. >> If the ccb_record only has firstObjectName, use saImmOmAccessorGet_2 to >> retrieve the admo name. >> >> >> BR, >> Hung Nguyen - DEK Technologies >> >> -------------------------------------------------------------------------------- >> From: Neelakanta [email protected] >> Sent: Friday, November 18, 2016 9:54PM >> To: Zoran Milinkovic, Hung Nguyen >> [email protected],[email protected] >> Cc: Opensaf-devel >> [email protected] >> Subject: [PATCH 1 of 1] imm:allow augumentCcbInit with ROF as false in >> completed callback[#1956] >> >> >> osaf/libs/agents/saf/imma/imma_oi_api.c | 156 >> +++++++++++++++++++++++++--- >> osaf/libs/common/immsv/immsv_evt.c | 49 ++++++-- >> osaf/libs/common/immsv/include/immsv_evt.h | 2 + >> osaf/services/saf/immsv/immnd/ImmModel.cc | 39 +++++++ >> osaf/services/saf/immsv/immnd/ImmModel.hh | 3 + >> osaf/services/saf/immsv/immnd/immnd_evt.c | 65 ++++++++++++ >> osaf/services/saf/immsv/immnd/immnd_init.h | 3 + >> 7 files changed, 284 insertions(+), 33 deletions(-) >> >> >> with saImmOmCcbObjectRead, completed callback is also allowed to call >> saImmOiAugmentCcbInitialize. >> When ROF is false the augumentInit will get new adminowner with same name >> as old adminowner name with ROF as true. >> >> Since, object name is not set for completed callback, a new event from OI to >> IMMND is required to get adminownername from ccbID >> The patch inroduces new event by sending ccbID and response of the event >> will be the adminname of the corresponding ccbId. >> >> 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 >> @@ -3617,6 +3617,97 @@ getAdmoName(SaImmHandleT privateOmHandle >> } >> >> >> /**************************************************************************** >> + Name : immsv_oi_augment_ccb_get_admo_name >> + >> + Description : The function gets adminoperation name from the CcbID. >> + For the saImmOiAugmentCcbInitialize when the ROF flag is false >> + for the original adminOperation name(#1956). >> + >> + Arguments : privateOmHandle - IMM OM handle >> + ccbId - The ccbId from the completed callback . >> + admoNameOut - The AdminOperation name of the ccbId >> + timeout - synchronous timeout >> + >> + Return Values : SA_AIS_OK >> + SA_AIS_ERR_BAD_HANDLE >> + >> +******************************************************************************/ >> + >> +SaAisErrorT immsv_oi_augment_ccb_get_admo_name( >> + SaImmHandleT privateOmHandle, >> + SaUint32T ccbId, >> + SaStringT *admoNameOut, >> + SaTimeT timeout) >> + >> +{ >> + SaAisErrorT rc = SA_AIS_OK; >> + IMMA_CB *cb = &imma_cb; >> + uint32_t proc_rc; >> + IMMSV_EVT evt; >> + IMMSV_EVT *out_evt = NULL; >> + SaStringT * admtmp; >> + TRACE_ENTER(); >> + >> + memset(&evt, 0, sizeof(IMMSV_EVT)); >> + evt.type = IMMSV_EVT_TYPE_IMMND; >> + evt.info.immnd.type = IMMND_EVT_A2ND_OI_AUG_CCB_GET_ADMO; >> + evt.info.immnd.info.ccbId = ccbId; >> + >> + proc_rc = imma_mds_msg_sync_send(cb->imma_mds_hdl, &cb->immnd_mds_dest, >> &evt, &out_evt, timeout); >> + switch(proc_rc) { >> + case NCSCC_RC_SUCCESS: >> + break; >> + >> + case NCSCC_RC_REQ_TIMOUT: >> + rc = imma_proc_check_stale(cb, privateOmHandle, >> SA_AIS_ERR_TIMEOUT); >> + goto mds_send_fail; >> + >> + default: >> + rc = SA_AIS_ERR_LIBRARY; >> + TRACE_4("ERR_LIBRARY: MDS returned unexpected error >> code %u", proc_rc); >> + goto mds_send_fail; >> + } >> + >> + if(out_evt) { >> + osafassert(out_evt->type == IMMSV_EVT_TYPE_IMMA); >> + if (out_evt->info.imma.type == IMMA_EVT_ND2A_IMM_ERROR) { >> + rc = out_evt->info.imma.info.errRsp.error; >> + osafassert(rc && (rc != SA_AIS_OK)); >> + free(out_evt); /*BUGFIX (leak) 090506 */ >> + out_evt = NULL; >> + goto mds_send_fail; >> + } >> + >> + osafassert(out_evt->info.imma.type == >> IMMND_EVT_A2ND_OI_AUG_CCB_GET_ADMO_RSP); >> + IMMSV_ATTR_VALUES_LIST *p; >> + >> + osafassert(out_evt->info.imma.info.searchNextRsp); >> + p = out_evt->info.imma.info.searchNextRsp->attrValuesList; >> + IMMSV_ATTR_VALUES *q = &(p->n); >> + osafassert(!(strncmp(q->attrName.buf, >> "SaImmAttrAdminOwnerName", strlen("SaImmAttrAdminOwnerName")))); >> + osafassert(q->attrValuesNumber == 1); >> + admtmp = (SaStringT *) imma_copyAttrValue3(q->attrValueType, >> &(q->attrValue)); >> + *admoNameOut = *admtmp; >> + TRACE("The admin operation Name %s ", *admoNameOut); >> + >> + if(out_evt) { >> + if(out_evt->info.imma.info.searchNextRsp) { >> + >> if(out_evt->info.imma.info.searchNextRsp->attrValuesList) { >> + >> immsv_free_attrvalues_list(out_evt->info.imma.info.searchNextRsp->attrValuesList); >> + } >> + free(out_evt->info.imma.info.searchNextRsp); >> + out_evt->info.imma.info.searchNextRsp = NULL; >> + } >> + free(out_evt); >> + } >> + } >> + >> + mds_send_fail: >> + TRACE_LEAVE(); >> + return rc; >> +} >> + >> +/**************************************************************************** >> Name : saImmOiAugmentCcbInitialize >> >> Description : Allows the OI implementers to augment ops to a ccb >> related >> @@ -3850,32 +3941,57 @@ SaAisErrorT saImmOiAugmentCcbInitialize( >> TRACE("AugCcbinit: Admo has ReleaseOnFinalize FALSE " >> "=> init separate admo => must fetch admo-name >> first"); >> osafassert(locked == false); >> - SaNameT admName;/* Used to get admo string name copied >> to stack.*/ >> - >> - rc = getAdmoName(privateOmHandle, cbi, &admName); >> - if(rc != SA_AIS_OK) { >> - TRACE("ERR_TRY_AGAIN: failed to obtain >> SaImmAttrAdminOwnerName %u", rc); >> - if(rc != SA_AIS_ERR_TRY_AGAIN) { >> - rc = SA_AIS_ERR_TRY_AGAIN; >> + if(cbi->type == IMMA_CALLBACK_OI_CCB_COMPLETED){ >> + SaStringT admOwnerStr; >> + rc = >> immsv_oi_augment_ccb_get_admo_name(privateOmHandle, cbi->ccbID, >> &admOwnerStr, cl_node->syncr_timeout); >> + if(rc != SA_AIS_OK) { >> + TRACE("ERR_TRY_AGAIN: failed to obtain >> SaImmAttrAdminOwnerName %u", rc); >> + if(rc != SA_AIS_ERR_TRY_AGAIN) { >> + rc = SA_AIS_ERR_TRY_AGAIN; >> + } >> + if(admOwnerStr) >> + free(admOwnerStr); >> + goto done; >> + } >> + rc = >> immsv_om_admo_handle_initialize(privateOmHandle, (const >> SaImmAdminOwnerNameT)admOwnerStr, &privateAoHandle); >> + if(rc != SA_AIS_OK) { >> + TRACE("ERR_TRY_AGAIN: failed to obtain >> internal admo handle rc:%u", rc); >> + if(rc != SA_AIS_ERR_TRY_AGAIN) { >> + rc = SA_AIS_ERR_TRY_AGAIN; >> + } >> + if(admOwnerStr) >> + free(admOwnerStr); >> + goto done; >> + } >> + if(admOwnerStr) >> + free(admOwnerStr); >> + } else { >> + SaNameT admName;/* Used to get admo string name >> copied to stack.*/ >> + rc = getAdmoName(privateOmHandle, cbi, >> &admName); >> + if(rc != SA_AIS_OK) { >> + TRACE("ERR_TRY_AGAIN: failed to obtain >> SaImmAttrAdminOwnerName %u", rc); >> + if(rc != SA_AIS_ERR_TRY_AGAIN) { >> + rc = SA_AIS_ERR_TRY_AGAIN; >> + } >> + osaf_extended_name_free(&admName); >> + goto done; >> + } >> + TRACE("Obtaned AdminOwnerName:%s", >> osaf_extended_name_borrow(&admName)); >> + /* Allocate private admowner with >> ReleaseOnFinalize as TRUE */ >> + osafassert(immsv_om_admo_handle_initialize); >> + rc = >> immsv_om_admo_handle_initialize(privateOmHandle, >> + (SaImmAdminOwnerNameT) >> osaf_extended_name_borrow(&admName), &privateAoHandle); >> + >> + if(rc != SA_AIS_OK) { >> + TRACE("ERR_TRY_AGAIN: failed to obtain >> internal admo handle rc:%u", rc); >> + if(rc != SA_AIS_ERR_TRY_AGAIN) { >> + rc = SA_AIS_ERR_TRY_AGAIN; >> } >> osaf_extended_name_free(&admName); >> goto done; >> - } >> - TRACE("Obtaned AdminOwnerName:%s", >> osaf_extended_name_borrow(&admName)); >> - /* Allocate private admowner with ReleaseOnFinalize as >> TRUE */ >> - osafassert(immsv_om_admo_handle_initialize); >> - rc = immsv_om_admo_handle_initialize(privateOmHandle, >> - (SaImmAdminOwnerNameT) >> osaf_extended_name_borrow(&admName), &privateAoHandle); >> - >> - if(rc != SA_AIS_OK) { >> - TRACE("ERR_TRY_AGAIN: failed to obtain internal >> admo handle rc:%u", rc); >> - if(rc != SA_AIS_ERR_TRY_AGAIN) { >> - rc = SA_AIS_ERR_TRY_AGAIN; >> } >> osaf_extended_name_free(&admName); >> - goto done; >> } >> - osaf_extended_name_free(&admName); >> } >> } else {TRACE("AugCcbinit: Admo has ROF == TRUE");} >> >> 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 >> @@ -177,6 +177,7 @@ static const char *immnd_evt_names[] = { >> "IMMND_EVT_A2ND_OBJ_CREATE_2", /* saImmOmCcbObjectCreate_o3 */ >> "IMMND_EVT_A2ND_OI_OBJ_CREATE_2", /* saImmOiRtObjectCreate_o3 */ >> "IMMND_EVT_A2ND_OBJ_SAFE_READ", /* saImmOmCcbObjectRead */ >> + "IMMND_EVT_A2ND_OI_AUG_CCB_GET_ADMO", /* To get Admin owner name for >> corresponding ccbID */ >> "undefined (high)" >> }; >> >> @@ -1332,19 +1333,22 @@ static uint32_t immsv_evt_enc_sublevels( >> } >> } >> } else if ((i_evt->info.imma.type == >> IMMA_EVT_ND2A_SEARCHNEXT_RSP) || >> - (i_evt->info.imma.type == >> IMMA_EVT_ND2A_ACCESSOR_GET_RSP)) { >> + (i_evt->info.imma.type == >> IMMA_EVT_ND2A_ACCESSOR_GET_RSP) || >> + (i_evt->info.imma.type == >> IMMND_EVT_A2ND_OI_AUG_CCB_GET_ADMO_RSP)) { >> uint8_t *p8; >> int depth = 0; >> /*Encode searchNext response */ >> IMMSV_OM_RSP_SEARCH_NEXT *sn = >> i_evt->info.imma.info.searchNextRsp; >> osafassert(sn); >> >> - IMMSV_OCTET_STRING *os = &(sn->objectName); >> - IMMSV_RSRV_SPACE_ASSERT(p8, o_ub, 4); >> - ncs_encode_32bit(&p8, os->size); >> - ncs_enc_claim_space(o_ub, 4); >> - if(!immsv_evt_enc_inline_text(__LINE__, o_ub, os)) { >> - return NCSCC_RC_OUT_OF_MEM; >> + if(i_evt->info.imma.type != >> IMMND_EVT_A2ND_OI_AUG_CCB_GET_ADMO_RSP){ >> + IMMSV_OCTET_STRING *os = &(sn->objectName); >> + IMMSV_RSRV_SPACE_ASSERT(p8, o_ub, 4); >> + ncs_encode_32bit(&p8, os->size); >> + ncs_enc_claim_space(o_ub, 4); >> + if(!immsv_evt_enc_inline_text(__LINE__, o_ub, >> os)) { >> + return NCSCC_RC_OUT_OF_MEM; >> + } >> } >> >> IMMSV_RSRV_SPACE_ASSERT(p8, o_ub, 1); >> @@ -2013,7 +2017,8 @@ static uint32_t immsv_evt_dec_sublevels( >> } >> } >> } else if ((o_evt->info.imma.type == >> IMMA_EVT_ND2A_SEARCHNEXT_RSP) || >> - (o_evt->info.imma.type == >> IMMA_EVT_ND2A_ACCESSOR_GET_RSP)) { >> + (o_evt->info.imma.type == >> IMMA_EVT_ND2A_ACCESSOR_GET_RSP) || >> + (o_evt->info.imma.type == >> IMMND_EVT_A2ND_OI_AUG_CCB_GET_ADMO_RSP)) { >> uint8_t *p8; >> uint8_t c8; >> uint8_t local_data[8]; >> @@ -2022,11 +2027,13 @@ static uint32_t immsv_evt_dec_sublevels( >> o_evt->info.imma.info.searchNextRsp = calloc(1, >> sizeof(IMMSV_OM_RSP_SEARCH_NEXT)); >> >> /* Decode object name */ >> - IMMSV_OCTET_STRING *os = >> &(o_evt->info.imma.info.searchNextRsp->objectName); >> - IMMSV_FLTN_SPACE_ASSERT(p8, local_data, i_ub, 4); >> - os->size = ncs_decode_32bit(&p8); >> - ncs_dec_skip_space(i_ub, 4); >> - immsv_evt_dec_inline_string(i_ub, os); >> + if(o_evt->info.imma.type != >> IMMND_EVT_A2ND_OI_AUG_CCB_GET_ADMO_RSP){ >> + IMMSV_OCTET_STRING *os = >> &(o_evt->info.imma.info.searchNextRsp->objectName); >> + IMMSV_FLTN_SPACE_ASSERT(p8, local_data, i_ub, >> 4); >> + os->size = ncs_decode_32bit(&p8); >> + ncs_dec_skip_space(i_ub, 4); >> + immsv_evt_dec_inline_string(i_ub, os); >> + } >> >> IMMSV_FLTN_SPACE_ASSERT(p8, local_data, i_ub, 1); >> c8 = ncs_decode_8bit(&p8); >> @@ -2657,6 +2664,7 @@ static uint32_t immsv_evt_enc_toplevel(I >> >> case IMMA_EVT_ND2A_SEARCHNEXT_RSP: //Response from for >> SearchNext >> case IMMA_EVT_ND2A_ACCESSOR_GET_RSP: //Response from for >> AccessorGet >> + case IMMND_EVT_A2ND_OI_AUG_CCB_GET_ADMO_RSP: //Response to get >> Admin name from ccbID >> /*Totaly encoded in sublevel. */ >> break; >> >> @@ -3424,6 +3432,14 @@ static uint32_t immsv_evt_enc_toplevel(I >> >> break; >> >> + case IMMND_EVT_A2ND_OI_AUG_CCB_GET_ADMO: >> + >> + IMMSV_RSRV_SPACE_ASSERT(p8, o_ub, 4); >> + ncs_encode_32bit(&p8, immndevt->info.ccbId); >> + ncs_enc_claim_space(o_ub, 4); >> + >> + break; >> + >> case IMMND_EVT_A2ND_IMM_ADMOP: /* Syncronous AdminOp */ >> case IMMND_EVT_A2ND_IMM_ADMOP_ASYNC: /* Asyncronous AdminOp >> */ >> IMMSV_RSRV_SPACE_ASSERT(p8, o_ub, 4); >> @@ -4048,6 +4064,7 @@ static uint32_t immsv_evt_dec_toplevel(N >> >> case IMMA_EVT_ND2A_SEARCHNEXT_RSP: //Response from for >> SearchNext >> case IMMA_EVT_ND2A_ACCESSOR_GET_RSP: //Response from for >> AccessorGet >> + case IMMND_EVT_A2ND_OI_AUG_CCB_GET_ADMO_RSP: //Response to get >> Admin name from ccbID >> /*Totaly decoded in sublevel. */ >> break; >> >> @@ -4845,6 +4862,12 @@ static uint32_t immsv_evt_dec_toplevel(N >> immndevt->info.ccbId = ncs_decode_32bit(&p8); >> ncs_dec_skip_space(i_ub, 4); >> break; >> + >> + case IMMND_EVT_A2ND_OI_AUG_CCB_GET_ADMO: /* Get Admin >> owner name for corresponding ccbID */ >> + IMMSV_FLTN_SPACE_ASSERT(p8, local_data, i_ub, 4); >> + immndevt->info.ccbId = ncs_decode_32bit(&p8); >> + ncs_dec_skip_space(i_ub, 4); >> + break; >> >> case IMMND_EVT_A2ND_IMM_ADMOP: /* Syncronous AdminOp */ >> case IMMND_EVT_A2ND_IMM_ADMOP_ASYNC: /* Asyncronous AdminOp >> */ >> 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 >> @@ -93,6 +93,7 @@ typedef enum imma_evt_type { >> IMMA_EVT_ND2A_OI_OBJ_CREATE_LONG_UC = 31, /*OBJ CREATE UP-CALL >> with long DN. */ >> IMMA_EVT_ND2A_OI_OBJ_MODIFY_LONG_UC = 32, /*OBJ MODIFY UP-CALL >> with long DN. */ >> IMMA_EVT_ND2A_OI_OBJ_DELETE_LONG_UC = 33, /*OBJ DELETE UP-CALL >> with long DN. */ >> + IMMND_EVT_A2ND_OI_AUG_CCB_GET_ADMO_RSP = 34, /* Response for augumet >> ccb get admin owner name from ccbid*/ >> >> IMMA_EVT_MAX >> } IMMA_EVT_TYPE; >> @@ -215,6 +216,7 @@ typedef enum immnd_evt_type { >> IMMND_EVT_A2ND_OI_OBJ_CREATE_2 = 99, /* saImmOiRtObjectCreate_o3 */ >> >> IMMND_EVT_A2ND_OBJ_SAFE_READ = 100, /* saImmOmCcbObjectRead */ >> + IMMND_EVT_A2ND_OI_AUG_CCB_GET_ADMO = 101, /* Get Admin owner name from >> CCbID */ >> >> IMMND_EVT_MAX >> } IMMND_EVT_TYPE; >> 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 >> @@ -2380,6 +2380,14 @@ immModel_fetchRtUpdate(IMMND_CB *cb, >> fetchRtUpdate(syncReq, rtModReq, syncFevsBase)?SA_TRUE:SA_FALSE; >> } >> >> +SaAisErrorT immModel_getAdminOwnerFromCcbId(IMMND_CB *cb, >> + SaUint32T ccbId, SaStringT *admOwnNameptr) >> +{ >> + >> + return ImmModel::instance(&cb->immModel)-> >> + getAdminOwnerFromCcbId(ccbId, admOwnNameptr); >> + >> +} >> >> SaAisErrorT >> immModel_resourceDisplay(IMMND_CB *cb, >> @@ -13179,6 +13187,37 @@ ImmModel::updateImmObject2(const ImmsvOm >> } >> >> SaAisErrorT >> +ImmModel::getAdminOwnerFromCcbId(const SaUint32T ccbId, SaStringT >> *admOwnNameptr) >> +{ >> + SaAisErrorT err = SA_AIS_OK; >> + CcbVector::iterator i; >> + AdminOwnerVector::iterator j = sOwnerVector.end(); >> + SaUint32T ownerId; >> + TRACE_ENTER(); >> + >> + i = std::find_if(sCcbVector.begin(), sCcbVector.end(), CcbIdIs(ccbId)); >> + if (i == sCcbVector.end()) { >> + LOG_NO("ERR_BAD_HANDLE: CCB %u does not exist", ccbId); >> + err = SA_AIS_ERR_BAD_HANDLE; >> + } else { >> + ownerId = (*i)->mAdminOwnerId; >> + j = std::find_if(sOwnerVector.begin(), sOwnerVector.end(), >> IdIs(ownerId)); >> + if((*i)->mAdminOwnerId && (j == sOwnerVector.end())) { >> + LOG_NO("ERR_BAD_HANDLE: admin owner %u does not exist", >> (*i)->mAdminOwnerId); >> + err = SA_AIS_ERR_BAD_HANDLE; >> + } else { >> + TRACE_5(" admin owner '%s'", (*j)->mAdminOwnerName.c_str()); >> + *admOwnNameptr = (char *) >> malloc((*j)->mAdminOwnerName.length()+1); >> + strcpy( *admOwnNameptr, (*j)->mAdminOwnerName.c_str()); >> + } >> + TRACE("Owner id %d", ownerId); >> + } >> + >> + TRACE_LEAVE(); >> + return err; >> +} >> + >> +SaAisErrorT >> ImmModel::resourceDisplay(const struct ImmsvAdminOperationParam *reqparams, >> struct ImmsvAdminOperationParam **rparams, >> SaUint64T searchcount) >> { >> diff --git a/osaf/services/saf/immsv/immnd/ImmModel.hh >> b/osaf/services/saf/immsv/immnd/ImmModel.hh >> --- a/osaf/services/saf/immsv/immnd/ImmModel.hh >> +++ b/osaf/services/saf/immsv/immnd/ImmModel.hh >> @@ -492,6 +492,9 @@ public: >> const struct >> ImmsvAdminOperationParam *reqparams, >> struct ImmsvAdminOperationParam >> **rparams, >> SaUint64T searchcount); >> + SaAisErrorT getAdminOwnerFromCcbId( >> + SaUint32T ccbId, >> + SaStringT *admOwnNameptr); >> >> void setScAbsenceAllowed(SaUint32T scAbsenceAllowed); >> >> 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 >> @@ -225,6 +225,7 @@ static void immnd_evt_ccb_abort(IMMND_CB >> SaUint32T * clArrSize, SaUint32T *nodeId); >> >> static uint32_t immnd_evt_proc_reset(IMMND_CB *cb, IMMND_EVT *evt, >> IMMSV_SEND_INFO *sinfo); >> +static uint32_t immnd_evt_aug_ccb_get_admo(IMMND_CB *cb, IMMND_EVT *evt, >> IMMSV_SEND_INFO *sinfo); >> >> #if 0 /* Only for debug */ >> static void printImmValue(SaImmValueTypeT t, IMMSV_EDU_ATTR_VAL *v) >> @@ -631,6 +632,10 @@ void immnd_process_evt(void) >> rc = immnd_evt_proc_admop_rsp(cb, &evt->info.immnd, >> &evt->sinfo, SA_TRUE, SA_TRUE); >> break; >> >> + case IMMND_EVT_A2ND_OI_AUG_CCB_GET_ADMO: >> + rc = immnd_evt_aug_ccb_get_admo(cb, &evt->info.immnd, >> &evt->sinfo); >> + break; >> + >> case IMMND_EVT_ND2ND_ADMOP_RSP: >> case IMMND_EVT_ND2ND_ADMOP_RSP_2: >> rc = immnd_evt_proc_admop_rsp(cb, &evt->info.immnd, >> &evt->sinfo, SA_FALSE, SA_FALSE); >> @@ -4445,6 +4450,66 @@ static void immnd_evt_sync_fevs_base(IMM >> >> } >> >> +/***************************************************************************** >> + * Name : immnd_evt_aug_ccb_get_admo >> + * >> + * Description : Function to get adminoperation name from the CcbID. >> + * When saImmOiAugmentCcbInitialize is called from completed >> + callback. >> + * >> + * Arguments : IMMND_CB *cb - IMMND CB pointer >> + * IMMSV_EVT *evt - Received Event structure >> + * >> + * Return Values : NCSCC_RC_SUCCESS/Error. >> + * >> + >> *****************************************************************************/ >> + >> + >> +static uint32_t immnd_evt_aug_ccb_get_admo(IMMND_CB *cb, IMMND_EVT *evt, >> IMMSV_SEND_INFO *sinfo) >> +{ >> + IMMSV_EVT send_evt; >> + SaAisErrorT err = SA_AIS_OK; >> + uint32_t rc = NCSCC_RC_SUCCESS; >> + SaStringT admOwnName = NULL; >> + TRACE_ENTER(); >> + >> + err = immModel_getAdminOwnerFromCcbId(cb, evt->info.ccbId, &admOwnName); >> + memset(&send_evt, '\0', sizeof(IMMSV_EVT)); >> + >> + if (err == SA_AIS_OK && admOwnName) { >> + IMMSV_OM_RSP_SEARCH_NEXT * rsp = (IMMSV_OM_RSP_SEARCH_NEXT*) >> calloc(1, sizeof(IMMSV_OM_RSP_SEARCH_NEXT)); >> + /* The objectName is not sent by response, only the adminowner >> information is sent as attribute*/ >> + >> + rsp->attrValuesList = (IMMSV_ATTR_VALUES_LIST *) calloc(1, >> sizeof(IMMSV_ATTR_VALUES_LIST)); >> + IMMSV_ATTR_VALUES* attr = &(rsp->attrValuesList->n); >> + >> + attr->attrName.size = (SaUint32T) >> strlen("SaImmAttrAdminOwnerName")+1; >> + attr->attrName.buf = strdup("SaImmAttrAdminOwnerName"); >> + attr->attrValueType = SA_IMM_ATTR_SASTRINGT; >> + attr->attrValuesNumber =1; >> + attr->attrValue.val.x.size=(SaUint32T) strlen(admOwnName)+1; >> + attr->attrValue.val.x.buf = (char *) >> malloc(attr->attrValue.val.x.size); >> + memcpy(attr->attrValue.val.x.buf, admOwnName, >> attr->attrValue.val.x.size); >> + TRACE("The AdminOwner Name is %s ", attr->attrValue.val.x.buf); >> + >> + send_evt.type = IMMSV_EVT_TYPE_IMMA; >> + send_evt.info.imma.type = >> IMMND_EVT_A2ND_OI_AUG_CCB_GET_ADMO_RSP; >> + send_evt.info.imma.info.searchNextRsp = rsp; >> + } else { >> + send_evt.info.imma.type = IMMA_EVT_ND2A_IMM_ERROR; >> + send_evt.info.imma.info.errRsp.error = err; >> + send_evt.info.imma.info.errRsp.errStrings = NULL; >> + } >> + >> + rc = immnd_mds_send_rsp(cb, sinfo, &send_evt); >> + if (rc != NCSCC_RC_SUCCESS) { >> + LOG_WA("Failed to send response to agent/client over MDS >> rc:%u", rc); >> + } >> + if(admOwnName) >> + free(admOwnName); >> + return rc; >> +} >> + >> static void immnd_evt_safe_read_lock(IMMND_CB *cb, IMMND_EVT *evt, >> SaBoolT originatedAtThisNd, SaImmHandleT clnt_hdl, MDS_DEST >> reply_dest) >> { >> diff --git a/osaf/services/saf/immsv/immnd/immnd_init.h >> b/osaf/services/saf/immsv/immnd/immnd_init.h >> --- a/osaf/services/saf/immsv/immnd/immnd_init.h >> +++ b/osaf/services/saf/immsv/immnd/immnd_init.h >> @@ -446,6 +446,9 @@ extern "C" { >> const struct ImmsvAdminOperationParam *reqparams, >> struct ImmsvAdminOperationParam **rparams); >> >> + SaAisErrorT immModel_getAdminOwnerFromCcbId(IMMND_CB *cb, >> + SaUint32T ccbId, SaStringT *admOwnNameptr); >> + >> void >> immModel_setCcbErrorString(IMMND_CB *cb, >> SaUint32T ccbId, >> > > ------------------------------------------------------------------------------ _______________________________________________ Opensaf-devel mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/opensaf-devel
