osaf/services/saf/avsv/avd/avd_su.c             |    4 +-
 osaf/services/saf/avsv/avnd/Makefile.am         |    1 +
 osaf/services/saf/avsv/avnd/avnd.c              |    4 +
 osaf/services/saf/avsv/avnd/avnd_compdb.c       |    2 +-
 osaf/services/saf/avsv/avnd/avnd_imm.c          |  608 ++++++++++++++++++++++++
 osaf/services/saf/avsv/avnd/avnd_proc.c         |   14 +-
 osaf/services/saf/avsv/avnd/avnd_sudb.c         |   12 +-
 osaf/services/saf/avsv/avnd/include/avnd.h      |    1 +
 osaf/services/saf/avsv/avnd/include/avnd_cb.h   |    2 +
 osaf/services/saf/avsv/avnd/include/avnd_comp.h |    2 +
 osaf/services/saf/immsv/immnd/immnd_evt.c       |    2 +
 11 files changed, 645 insertions(+), 7 deletions(-)


diff --git a/osaf/services/saf/avsv/avd/avd_su.c 
b/osaf/services/saf/avsv/avd/avd_su.c
--- a/osaf/services/saf/avsv/avd/avd_su.c
+++ b/osaf/services/saf/avsv/avd/avd_su.c
@@ -639,13 +639,13 @@ static void su_add_to_model(AVD_SU *su)
                    (node->node_state == AVD_AVND_STATE_NO_CONFIG) ||
                    (node->node_state == AVD_AVND_STATE_NCS_INIT)) {
 
-                       if (avd_snd_su_msg(avd_cb, su) != NCSCC_RC_SUCCESS) {
+                       /*if (avd_snd_su_msg(avd_cb, su) != NCSCC_RC_SUCCESS) {
                                avd_node_remove_su(su);
                                avd_sg_remove_su(su);
 
                                LOG_ER("%s: avd_snd_su_msg failed %s", 
__FUNCTION__, su->name.value);
                                goto done;
-                       }
+                       }*/
 
                        avd_su_oper_state_set(su, SA_AMF_OPERATIONAL_ENABLED);
                } else
diff --git a/osaf/services/saf/avsv/avnd/Makefile.am 
b/osaf/services/saf/avsv/avnd/Makefile.am
--- a/osaf/services/saf/avsv/avnd/Makefile.am
+++ b/osaf/services/saf/avsv/avnd/Makefile.am
@@ -66,6 +66,7 @@ osafamfnd_SOURCES = \
        avnd_verify.c \
        avnd_avnd.c \
        avnd_proxy.c \
+       avnd_imm.c \
        avnd_proxydb.c
 
 osafamfnd_LDADD = \
diff --git a/osaf/services/saf/avsv/avnd/avnd.c 
b/osaf/services/saf/avsv/avnd/avnd.c
--- a/osaf/services/saf/avsv/avnd/avnd.c
+++ b/osaf/services/saf/avsv/avnd/avnd.c
@@ -150,6 +150,10 @@ uint32_t avnd_create(void)
                goto done;
        }
 
+        if (avnd_imm_init(cb) != SA_AIS_OK) {
+                LOG_ER("avnd_imm_init FAILED");
+                goto done;
+        }
 done:
        /* if failed, perform the cleanup */
        if (NCSCC_RC_SUCCESS != rc)
diff --git a/osaf/services/saf/avsv/avnd/avnd_compdb.c 
b/osaf/services/saf/avsv/avnd/avnd_compdb.c
--- a/osaf/services/saf/avsv/avnd/avnd_compdb.c
+++ b/osaf/services/saf/avsv/avnd/avnd_compdb.c
@@ -1583,7 +1583,7 @@ void avnd_comp_delete(AVND_COMP *comp)
  * 
  * @return AVND_COMP*
  */
-static AVND_COMP *avnd_comp_create(const SaNameT *comp_name, const 
SaImmAttrValuesT_2 **attributes, AVND_SU *su)
+AVND_COMP *avnd_comp_create(const SaNameT *comp_name, const SaImmAttrValuesT_2 
**attributes, AVND_SU *su)
 {
        int rc = -1;
        AVND_COMP *comp;
diff --git a/osaf/services/saf/avsv/avnd/avnd_imm.c 
b/osaf/services/saf/avsv/avnd/avnd_imm.c
new file mode 100644
--- /dev/null
+++ b/osaf/services/saf/avsv/avnd/avnd_imm.c
@@ -0,0 +1,608 @@
+/*      -*- OpenSAF  -*-
+ *
+ * (C) Copyright 2008 The OpenSAF Foundation
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. This file and program are licensed
+ * under the GNU Lesser General Public License Version 2.1, February 1999.
+ * The complete license can be accessed from the following location:
+ * http://opensource.org/licenses/lgpl-license.php
+ * See the Copying file included with the OpenSAF distribution for full
+ * licensing terms.
+ *
+ * Author(s): Emerson Network Power
+ *
+ */
+
+/*****************************************************************************
+  FUNCTIONS INCLUDED in this module:
+  
+******************************************************************************
+*/
+
+/*
+ * Module Inclusion Control...
+ */
+
+#include <logtrace.h>
+#include <immutil.h>
+
+#include "avnd.h"
+
+/* ========================================================================
+ *   DATA DECLARATIONS
+ * ========================================================================
+ */
+extern void comp_ccb_apply_cb(CcbUtilOperationData_t *opdata);
+typedef enum {
+       AVND_SA_AMF_CLASS_INVALID = 0,
+       AVND_SA_AMF_COMP = 1,
+       AVND_SA_AMF_CLASS_MAX
+} AVND_AMF_SUBS_CLASS_ID;
+
+typedef void (*AvndImmOiCcbApplyCallbackT) (CcbUtilOperationData_t *opdata);
+typedef SaAisErrorT (*AvndImmOiCcbCompletedCallbackT) (CcbUtilOperationData_t 
*opdata);
+
+typedef struct avnd_ccb_apply_ordered_list {
+        AvndImmOiCcbApplyCallbackT ccb_apply_cb;
+        CcbUtilOperationData_t *opdata;
+        AVND_AMF_SUBS_CLASS_ID class_type;
+        struct avnd_ccb_apply_ordered_list *next_ccb_to_apply;
+} AvndCcbApplyOrderedListT;
+
+static const SaImmOiImplementerNameT implementerName =
+        (SaImmOiImplementerNameT)"safAmfService";
+static SaVersionT immVersion = { 'A', 2, 11 };
+
+/* This string array must match the AVND_AMF_SUBS_CLASS_ID enum */
+static char *avnd_class_names[] = {
+       "Invalid",
+       "SaAmfComp"
+};
+
+static void ccb_abort_cb(SaImmOiHandleT immoi_handle, SaImmOiCcbIdT ccb_id);
+static void ccb_apply_cb(SaImmOiHandleT immoi_handle, SaImmOiCcbIdT ccb_id);
+static SaAisErrorT ccb_completed_cb(SaImmOiHandleT immoi_handle, SaImmOiCcbIdT 
ccb_id);
+static SaAisErrorT comp_ccb_completed_cb(CcbUtilOperationData_t *opdata);
+
+static SaAisErrorT ccb_object_create_cb(SaImmOiHandleT immoi_handle,
+        SaImmOiCcbIdT ccb_id, const SaImmClassNameT class_name,
+        const SaNameT *parent_name, const SaImmAttrValuesT_2 **attr);
+static SaAisErrorT ccb_object_modify_cb(SaImmOiHandleT immoi_handle,
+        SaImmOiCcbIdT ccb_id, const SaNameT *object_name,
+        const SaImmAttrModificationT_2 **attr_mods);
+static SaAisErrorT ccb_object_delete_cb(SaImmOiHandleT immoi_handle,
+        SaImmOiCcbIdT ccb_id, const SaNameT *object_name);
+
+static const SaImmOiCallbacksT_2 avnd_callbacks = {
+        .saImmOiAdminOperationCallback = NULL,
+        .saImmOiCcbAbortCallback = ccb_abort_cb,
+        .saImmOiCcbApplyCallback = ccb_apply_cb,
+        .saImmOiCcbCompletedCallback = ccb_completed_cb,
+        .saImmOiCcbObjectCreateCallback = ccb_object_create_cb,
+        .saImmOiCcbObjectDeleteCallback = ccb_object_delete_cb,
+        .saImmOiCcbObjectModifyCallback = ccb_object_modify_cb,
+        .saImmOiRtAttrUpdateCallback = NULL
+};
+
+static AvndImmOiCcbCompletedCallbackT 
ccb_completed_callback[AVND_SA_AMF_CLASS_MAX];
+static AvndImmOiCcbApplyCallbackT ccb_apply_callback[AVND_SA_AMF_CLASS_MAX];
+
+static AvndCcbApplyOrderedListT *ccb_apply_list;
+
+
+static AVND_AMF_SUBS_CLASS_ID class_name_to_class_type(const SaImmClassNameT 
className)
+{
+        int i;
+
+        for (i = 0; i < AVND_SA_AMF_CLASS_MAX; i++) {
+                if (strcmp(className, avnd_class_names[i]) == 0)
+                        return i;
+        }
+
+        osafassert(0);
+        return AVND_SA_AMF_CLASS_MAX;
+}
+
+void avnd_class_impl_set(const SaImmClassNameT className,
+        SaImmOiRtAttrUpdateCallbackT rtattr_cb, 
SaImmOiAdminOperationCallbackT_2 adminop_cb,
+        AvndImmOiCcbCompletedCallbackT ccb_compl_cb, 
AvndImmOiCcbApplyCallbackT ccb_apply_cb)
+{
+        AVND_AMF_SUBS_CLASS_ID type = class_name_to_class_type(className);
+
+        ccb_completed_callback[type] = ccb_compl_cb;
+        ccb_apply_callback[type] = ccb_apply_cb;
+}
+
+/*****************************************************************************
+ * @brief               This function becomes applier and sets the applier name
+ *                      for all AMF objects
+ *
+ * @param[in]           Nothing
+ *
+ * @return              SA_AIS_OK or error
+ *
+ **************************************************************************/
+SaAisErrorT avnd_imm_applier_set(void)
+{
+        SaAisErrorT rc = SA_AIS_OK;
+        uint32_t i;
+        char applier_name[SA_MAX_NAME_LENGTH] = {0};
+
+        TRACE_ENTER();
+        snprintf(applier_name, SA_MAX_NAME_LENGTH, "@safAmfService%x", 
ncs_get_node_id());
+
+        if ((rc = immutil_saImmOiImplementerSet(avnd_cb->immOiHandle, 
applier_name)) != SA_AIS_OK) {
+                LOG_ER("saImmOiImplementerSet failed %u", rc);
+                return rc;
+        }
+
+        for (i = 0; i < AVND_SA_AMF_CLASS_MAX - 1; i++) {
+                rc = immutil_saImmOiClassImplementerSet(avnd_cb->immOiHandle, 
avnd_class_names[i+1]);
+               LOG_ER("Impl Set Failed for %s, returned %d",   
avnd_class_names[i+1], rc);
+                if(rc != SA_AIS_OK) {
+                        LOG_ER("Impl Set Failed for %s, returned %d",   
avnd_class_names[i+1], rc);
+                        break;
+                }
+        }
+
+        TRACE_LEAVE2("%u", rc);
+        return rc;
+}
+
+/*****************************************************************************
+ * Function: avnd_imm_init
+ *
+ * Purpose: This function Initialize the OI interface and get a selection
+ *          object.
+ *
+ * Input: cb  - AVND control block
+ *
+ * Returns: Void pointer.
+ *
+ * NOTES: None.
+ *
+ **************************************************************************/
+
+SaAisErrorT avnd_imm_init(AVND_CB *cb)
+{
+        SaAisErrorT error = SA_AIS_OK;
+        TRACE_ENTER();
+
+        if ((error = immutil_saImmOiInitialize_2(&cb->immOiHandle, 
&avnd_callbacks, &immVersion)) != SA_AIS_OK) {
+                LOG_ER("saImmOiInitialize failed %u", error);
+                goto done;
+        }
+
+        if ((error = immutil_saImmOiSelectionObjectGet(cb->immOiHandle, 
&cb->imm_sel_obj)) != SA_AIS_OK) {
+                LOG_ER("saImmOiSelectionObjectGet failed %u", error);
+                goto done;
+        }
+       avnd_class_impl_set("SaAmfComp", NULL, NULL,
+                       comp_ccb_completed_cb, comp_ccb_apply_cb);
+       avnd_imm_applier_set();
+        TRACE("Successfully initialized IMM");
+
+done:
+        TRACE_LEAVE();
+        return error;
+}
+
+/*****************************************************************************
+ * Function: avnd_class_type_find
+ *
+ * Purpose: This function returns class enum corresponding to Object name.
+ *
+ * Input: cb  - Object Name, Class type.
+ *
+ * Returns: OK/Error.
+ *
+ * NOTES: None.
+ *
+ **************************************************************************/
+static AVND_AMF_SUBS_CLASS_ID object_name_to_class_type(const SaNameT 
*obj_name)
+{
+       AVND_AMF_SUBS_CLASS_ID class_type = AVND_SA_AMF_CLASS_MAX;
+
+       if (strncmp((char *)&obj_name->value, "safComp=", 8) == 0) {
+               class_type = AVND_SA_AMF_COMP;
+       }
+
+       return class_type;
+}
+
+/*****************************************************************************
+ * Function: ccb_completed_cb
+ *
+ * Purpose: This function handles completed callback for the corresponding
+ *          CCB operation.
+ *
+ * Input: cb  - Oi Handle and Ccb Id.
+ *
+ * Returns: Ok/Error.
+ *
+ * NOTES: None.
+ *
+ **************************************************************************/
+static SaAisErrorT ccb_completed_cb(SaImmOiHandleT immoi_handle,
+        SaImmOiCcbIdT ccb_id)
+{
+        SaAisErrorT rc = SA_AIS_OK;
+        CcbUtilOperationData_t *opdata = NULL;
+        AVND_AMF_SUBS_CLASS_ID type;
+
+        TRACE_ENTER2("CCB ID %llu", ccb_id);
+
+        /* "check that the sequence of change requests contained in the CCB is
+           valid and that no errors will be generated when these changes
+           are applied." */
+
+       while ((opdata = ccbutil_getNextCcbOp(ccb_id, opdata)) != NULL) {
+               type = object_name_to_class_type(&opdata->objectName);
+               rc = ccb_completed_callback[type](opdata);
+
+               /* Get out at first error */
+                if (rc != SA_AIS_OK)
+                        break;
+        }
+
+        TRACE_LEAVE2("%u", rc);
+        return rc;
+}
+
+/*****************************************************************************
+ * Function: ccb_object_create_cb
+ *
+ * Purpose: This function handles object create callback for all config 
classes.
+ *          Its purpose is to memorize the request until the completed 
callback.
+ *
+ * Input: cb  - Oi Handle, Ccb Id, Class Name, Parent Name, Attributes.
+ *
+ * Returns: Ok/Error.
+ *
+ * NOTES: None.
+ *
+ **************************************************************************/
+static SaAisErrorT ccb_object_create_cb(SaImmOiHandleT immoi_handle,
+        SaImmOiCcbIdT ccb_id, const SaImmClassNameT class_name,
+        const SaNameT *parent_name, const SaImmAttrValuesT_2 **attr)
+{
+        SaAisErrorT rc = SA_AIS_OK;
+        CcbUtilCcbData_t *ccb_util_ccb_data;
+        CcbUtilOperationData_t *operation;
+        int i = 0;
+        const SaImmAttrValuesT_2 *attrValue;
+        AVND_AMF_SUBS_CLASS_ID id_from_class_name, id_from_dn;
+
+        TRACE_ENTER2("CCB ID %llu, class %s, parent '%s'", ccb_id, class_name, 
parent_name->value);
+
+        if ((ccb_util_ccb_data = ccbutil_getCcbData(ccb_id)) == NULL) {
+                LOG_ER("Failed to get CCB object for %llu", ccb_id);
+                rc = SA_AIS_ERR_NO_MEMORY;
+                goto done;
+        }
+
+        operation = ccbutil_ccbAddCreateOperation(ccb_util_ccb_data, 
class_name, parent_name, attr);
+
+        if (operation == NULL) {
+                LOG_ER("Failed to get CCB operation object for %llu", ccb_id);
+                rc = SA_AIS_ERR_NO_MEMORY;
+                goto done;
+        }
+
+        /* Find the RDN attribute and store the object DN */
+        while ((attrValue = attr[i++]) != NULL) {
+                if (!strncmp(attrValue->attrName, "saf", 3)) {
+                        if (attrValue->attrValueType == SA_IMM_ATTR_SASTRINGT) 
{
+                                SaStringT rdnVal = *((SaStringT 
*)attrValue->attrValues[0]);
+                                if ((parent_name != NULL) && 
(parent_name->length > 0)) {
+                                        operation->objectName.length = 
sprintf((char *)operation->objectName.value,
+                                                "%s,%s", rdnVal, 
parent_name->value);
+                                } else {
+                                        operation->objectName.length = 
sprintf((char *)operation->objectName.value,
+                                                "%s", rdnVal);
+                                }
+                        } else {
+                                SaNameT *rdnVal = ((SaNameT 
*)attrValue->attrValues[0]);
+                                operation->objectName.length = sprintf((char 
*)operation->objectName.value,
+                                        "%s,%s", rdnVal->value, 
parent_name->value);
+                        }
+
+                        TRACE("%s(%u)", operation->objectName.value, 
operation->objectName.length);
+                }
+        }
+
+        if (operation->objectName.length == 0) {
+                LOG_ER("Malformed DN %llu", ccb_id);
+                rc = SA_AIS_ERR_INVALID_PARAM;
+        }
+
+        /* Verify that DN is valid for class */
+        id_from_class_name = class_name_to_class_type(class_name);
+        id_from_dn = object_name_to_class_type(&operation->objectName);
+        if (id_from_class_name != id_from_dn) {
+                LOG_ER("Illegal DN '%s' for class '%s'", 
operation->objectName.value, class_name);
+                rc = SA_AIS_ERR_INVALID_PARAM;
+        }
+
+done:
+        return rc;
+}
+
+/*****************************************************************************
+ * Function: ccb_abort_cb
+ *
+ * Purpose: This function handles abort callback for the corresponding
+ *          CCB operation.
+ *
+ * Input: cb  - Oi Handle and Ccb Id.
+ *
+ * Returns: None.
+ *
+ * NOTES: None.
+ *
+ **************************************************************************/
+static void ccb_abort_cb(SaImmOiHandleT immoi_handle, SaImmOiCcbIdT ccb_id)
+{
+        CcbUtilCcbData_t *ccb_util_ccb_data;
+
+        TRACE_ENTER2("CCB ID %llu", ccb_id);
+
+        /* Return CCB container memory */
+        ccb_util_ccb_data = ccbutil_findCcbData(ccb_id);
+        osafassert(ccb_util_ccb_data);
+        ccbutil_deleteCcbData(ccb_util_ccb_data);
+
+        TRACE_LEAVE();
+}
+
+/*****************************************************************************
+ * Function: ccb_insert_ordered_list
+ *
+ * Purpose: This function sorts the Ccb apply callbacks for the correponding
+ *          CCB operation in order of dependency/heirarchy
+ *
+ * Input: ccb_apply_cb - apply callback for specific object
+ *        opdata - Ccb Operation data
+ *
+ * Returns: None.
+ *
+ * NOTES: None.
+ *
+ **************************************************************************/
+static void ccb_insert_ordered_list(AvndImmOiCcbApplyCallbackT ccb_apply_cb,
+               CcbUtilOperationData_t *opdata, AVND_AMF_SUBS_CLASS_ID type)
+{
+        AvndCcbApplyOrderedListT *temp = NULL;
+        AvndCcbApplyOrderedListT *prev = NULL;
+        AvndCcbApplyOrderedListT *next = NULL;
+
+        /* allocate memory */
+
+        temp = malloc(sizeof(AvndCcbApplyOrderedListT));
+
+        temp->ccb_apply_cb = ccb_apply_cb;
+        temp->opdata = opdata;
+        temp->class_type = type;
+        temp->next_ccb_to_apply = NULL;
+
+        /* ccbs are sorted in top-down order in create/modify operations and
+         * sorted in bottom-up order for delete operation. All the ccbs are
+         * appended to a single list in the order of create operations first
+         * then modify operations and lastly delete operations
+         */
+
+        switch (opdata->operationType) {
+        case CCBUTIL_CREATE:
+                next = ccb_apply_list;
+                while (next != NULL) {
+                        if((next->opdata->operationType != CCBUTIL_CREATE) ||
+                                        (next->class_type > temp->class_type))
+                                break;
+                        prev = next;
+                        next = next->next_ccb_to_apply;
+                }
+                /* insert the ccb */
+                if (prev != NULL)
+                        prev->next_ccb_to_apply = temp;
+                else
+                        ccb_apply_list = temp;
+
+                temp->next_ccb_to_apply = next;
+                break;
+
+        case CCBUTIL_MODIFY:
+                next = ccb_apply_list;
+
+                /* traverse to the end of all the create CCBs */
+                while (next && next->opdata->operationType == CCBUTIL_CREATE) {
+                        prev = next;
+                        next = next->next_ccb_to_apply;
+                }
+
+                while (next != NULL) {
+                        if((next->opdata->operationType != CCBUTIL_MODIFY) ||
+                                        (next->class_type > temp->class_type))
+                                break;
+                        prev = next;
+                        next = next->next_ccb_to_apply;
+                }
+                /* insert the ccb */
+                if (prev != NULL)
+                        prev->next_ccb_to_apply = temp;
+                else
+                        ccb_apply_list = temp;
+
+                temp->next_ccb_to_apply = next;
+                break;
+
+        case CCBUTIL_DELETE:
+                next = ccb_apply_list;
+
+                /* traverse to the end of all the create CCBs */
+                while (next && next->opdata->operationType == CCBUTIL_CREATE) {
+                        prev = next;
+                        next = next->next_ccb_to_apply;
+                }
+
+                /* traverse to the end of all the modify CCBs */
+                while (next && next->opdata->operationType == CCBUTIL_MODIFY) {
+                        prev = next;
+                        next = next->next_ccb_to_apply;
+                }
+                /* insert the ccb */
+                if (prev != NULL)
+                        prev->next_ccb_to_apply = temp;
+                else
+                        ccb_apply_list = temp;
+
+                temp->next_ccb_to_apply = next;
+                break;
+
+        default:
+                osafassert(0);
+                        break;
+        }
+}
+
+/*****************************************************************************
+ * Function: ccb_apply_cb
+ *
+ * Purpose: This function handles apply callback for the correponding
+ *          CCB operation.
+ *
+ * Input: cb  - Oi Handle and Ccb Id.
+ *
+ * Returns: None.
+ *
+ * NOTES: None.
+ *
+ **************************************************************************/
+static void ccb_apply_cb(SaImmOiHandleT immoi_handle, SaImmOiCcbIdT ccb_id)
+{
+        CcbUtilCcbData_t *ccb_util_ccb_data;
+        CcbUtilOperationData_t *opdata = NULL;
+        AVND_AMF_SUBS_CLASS_ID type;
+        AvndCcbApplyOrderedListT *next = NULL;
+        AvndCcbApplyOrderedListT *temp = NULL;
+
+        TRACE_ENTER2("CCB ID %llu", ccb_id);
+
+        while ((opdata = ccbutil_getNextCcbOp(ccb_id, opdata)) != NULL) {
+                type = object_name_to_class_type(&opdata->objectName);
+                /* Base types will not have an apply callback, skip empty ones 
*/
+                if (ccb_apply_callback[type] != NULL) {
+                        /* insert the apply callback into the sorted list
+                         * to be applied later, after all the ccb apply
+                         * callback are sorted as required by the internal
+                         * AMFD's information model
+                         */
+                       ccb_insert_ordered_list(ccb_apply_callback[type], 
opdata, type);
+
+                       switch (opdata->operationType) {
+                               case CCBUTIL_CREATE:
+                                       LOG_NO("CCB %llu Created %s", ccb_id, 
opdata->objectName.value);
+                                       break;
+                               case CCBUTIL_MODIFY:
+                                       LOG_NO("CCB %llu Modified %s", ccb_id, 
opdata->objectName.value);
+                                       break;
+                               case CCBUTIL_DELETE:
+                                       LOG_NO("CCB %llu Deleted %s", ccb_id, 
opdata->objectName.value);
+                                       break;
+                               default:
+                                       osafassert(0);
+                       }
+               }
+       }
+
+        /* First pass: apply all the CCBs in the sorted order */
+        next = ccb_apply_list;
+        while (next != NULL) {
+                next->ccb_apply_cb(next->opdata);
+                temp = next;
+                next = next->next_ccb_to_apply;
+        }
+
+        /* Second pass: free allocated memory */
+        next = ccb_apply_list;
+        while (next != NULL) {
+                temp = next;
+                next = next->next_ccb_to_apply;
+                free(temp);
+        }
+
+        ccb_apply_list = NULL;
+
+        /* Return CCB container memory */
+        ccb_util_ccb_data = ccbutil_findCcbData(ccb_id);
+        osafassert(ccb_util_ccb_data);
+        ccbutil_deleteCcbData(ccb_util_ccb_data);
+        TRACE_LEAVE();
+}
+
+void comp_create_dyn(const SaNameT *comp_name, const SaImmAttrValuesT_2 
**attributes)
+{
+        AVSV_SU_INFO_MSG info;
+        AVND_SU *su;
+        uint32_t rc = NCSCC_RC_SUCCESS;
+        TRACE_ENTER();
+
+        memset(&info, 0, sizeof(AVSV_SU_INFO_MSG));
+        avsv_sanamet_init(comp_name, &info.name, "safSu");
+
+        /* get the su */
+        su = m_AVND_SUDB_REC_GET(avnd_cb->sudb, info.name);
+        if (!su) {
+                TRACE("SU'%s', not found in DB",info.name.value);
+                su = avnd_sudb_rec_add(avnd_cb, &info, &rc);
+        }
+
+        avnd_comp_create(comp_name, attributes, su);
+}
+
+void comp_ccb_apply_cb(CcbUtilOperationData_t *opdata)
+{
+
+        TRACE_ENTER2("CCB ID %llu, '%s'", opdata->ccbId, 
opdata->objectName.value);
+
+        switch (opdata->operationType) {
+        case CCBUTIL_CREATE:
+                comp_create_dyn(&opdata->objectName, 
opdata->param.create.attrValues);
+                break;
+        default:
+                osafassert(0);
+                break;
+        }
+
+        TRACE_LEAVE();
+}
+
+static SaAisErrorT comp_ccb_completed_cb(CcbUtilOperationData_t *opdata)
+{
+        SaAisErrorT rc = SA_AIS_OK;
+       TRACE_ENTER2("CCB ID %llu, '%s'", opdata->ccbId, 
opdata->objectName.value);
+        TRACE_LEAVE2("%u", rc);
+        return rc;
+}
+
+static SaAisErrorT ccb_object_delete_cb(SaImmOiHandleT immoi_handle,
+        SaImmOiCcbIdT ccb_id, const SaNameT *object_name)
+{
+       TRACE_ENTER2("CCB ID %llu, %s, %llu", ccb_id, object_name->value, 
immoi_handle);
+
+
+        return SA_AIS_OK;
+}
+
+
+static SaAisErrorT ccb_object_modify_cb(SaImmOiHandleT immoi_handle,
+        SaImmOiCcbIdT ccb_id, const SaNameT *object_name,
+        const SaImmAttrModificationT_2 **attr_mods)
+{
+
+        TRACE_ENTER2("CCB ID %llu, %s", ccb_id, object_name->value);
+
+        return SA_AIS_OK;
+}
+
diff --git a/osaf/services/saf/avsv/avnd/avnd_proc.c 
b/osaf/services/saf/avsv/avnd/avnd_proc.c
--- a/osaf/services/saf/avsv/avnd/avnd_proc.c
+++ b/osaf/services/saf/avsv/avnd/avnd_proc.c
@@ -51,6 +51,7 @@
 #define FD_TERM  1
 #define FD_CLM   2 
 #define FD_MBCSV 3
+#define FD_IMM 4
 
 static NCS_SEL_OBJ term_sel_obj; /* Selection object for TERM signal events */
 
@@ -158,8 +159,8 @@ static void sigterm_handler(int sig)
 void avnd_main_process(void)
 {
        NCS_SEL_OBJ mbx_fd;
-       struct pollfd fds[4];
-       nfds_t nfds = 3;
+       struct pollfd fds[5];
+       nfds_t nfds = 5;
        AVND_EVT *evt;
 
        TRACE_ENTER();
@@ -187,8 +188,12 @@ void avnd_main_process(void)
 
        fds[FD_CLM].fd = avnd_cb->clm_sel_obj;
        fds[FD_CLM].events = POLLIN;
+
+       fds[FD_IMM].fd = avnd_cb->imm_sel_obj;
+       fds[FD_IMM].events = POLLIN;
          
 #if FIXME
+       TRACE_ENTER2("Hello");
        if (avnd_cb->type == AVSV_AVND_CARD_SYS_CON) {
                fds[FD_MBCSV].fd = avnd_cb->avnd_mbcsv_sel_obj;
                fds[FD_MBCSV].events = POLLIN;
@@ -224,6 +229,11 @@ void avnd_main_process(void)
                        avnd_sigterm_handler();
                }
 
+               if (fds[FD_IMM].revents & POLLIN) {
+                       TRACE("IMM event");
+                       saImmOiDispatch(avnd_cb->immOiHandle, SA_DISPATCH_ALL);
+               }
+
 #if FIXME
                if ((avnd_cb->type == AVSV_AVND_CARD_SYS_CON) &&
                    (fds[FD_MBCSV].revents & POLLIN)) {
diff --git a/osaf/services/saf/avsv/avnd/avnd_sudb.c 
b/osaf/services/saf/avsv/avnd/avnd_sudb.c
--- a/osaf/services/saf/avsv/avnd/avnd_sudb.c
+++ b/osaf/services/saf/avsv/avnd/avnd_sudb.c
@@ -119,9 +119,17 @@ AVND_SU *avnd_sudb_rec_add(AVND_CB *cb, 
        AVND_SU *su = 0;
        TRACE_ENTER2("SU'%s'", info->name.value);
        /* verify if this su is already present in the db */
-       if (0 != m_AVND_SUDB_REC_GET(cb->sudb, info->name)) {
+       if (su != m_AVND_SUDB_REC_GET(cb->sudb, info->name)) {
                *rc = AVND_ERR_DUP_SU;
-               goto err;
+               /* update error recovery escalation parameters */
+               su->comp_restart_prob = info->comp_restart_prob;
+               su->comp_restart_max = info->comp_restart_max;
+               su->su_restart_prob = info->su_restart_prob;
+               su->su_restart_max = info->su_restart_max;
+               /* update the NCS flag */
+               su->is_ncs = info->is_ncs;
+               su->su_is_external = info->su_is_external;
+               return su;
        }
 
        /* a fresh su... */
diff --git a/osaf/services/saf/avsv/avnd/include/avnd.h 
b/osaf/services/saf/avsv/avnd/include/avnd.h
--- a/osaf/services/saf/avsv/avnd/include/avnd.h
+++ b/osaf/services/saf/avsv/avnd/include/avnd.h
@@ -34,6 +34,7 @@
 #define AVND_H
 
 #include <saImmOm.h>
+#include <saImmOi.h>
 
 #include "avsv.h"
 #include "ncs_main_papi.h"
diff --git a/osaf/services/saf/avsv/avnd/include/avnd_cb.h 
b/osaf/services/saf/avsv/avnd/include/avnd_cb.h
--- a/osaf/services/saf/avsv/avnd/include/avnd_cb.h
+++ b/osaf/services/saf/avsv/avnd/include/avnd_cb.h
@@ -130,6 +130,8 @@ typedef struct avnd_cb_tag {
        SaBoolT first_time_up;
        bool reboot_in_progress;
        AVND_SU *failed_su;
+       SaImmOiHandleT immOiHandle;
+       SaSelectionObjectT imm_sel_obj; /*Selection object to wait for IMM 
events */
 } AVND_CB;
 
 #define AVND_CB_NULL ((AVND_CB *)0)
diff --git a/osaf/services/saf/avsv/avnd/include/avnd_comp.h 
b/osaf/services/saf/avsv/avnd/include/avnd_comp.h
--- a/osaf/services/saf/avsv/avnd/include/avnd_comp.h
+++ b/osaf/services/saf/avsv/avnd/include/avnd_comp.h
@@ -879,6 +879,8 @@ extern unsigned int avnd_comp_config_get
 extern int avnd_comp_config_reinit(AVND_COMP *comp);
 extern void avnd_comp_delete(AVND_COMP *comp);
 extern void avnd_comp_pres_state_set(AVND_COMP *comp, SaAmfPresenceStateT 
newstate);
+extern SaAisErrorT avnd_imm_init(struct avnd_cb_tag *cb);
+struct avnd_comp_tag *avnd_comp_create(const SaNameT *comp_name, const 
SaImmAttrValuesT_2 **attributes, struct avnd_su_tag *su);
 
 /**
  * Initiate restart of a component.
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
@@ -4664,6 +4664,8 @@ static void immnd_evt_proc_object_create
                                                   oi_cl_node->agent_mds_dest,
                                                   &send_evt) != 
NCSCC_RC_SUCCESS) {
                                        LOG_WA("Create upcall for applier 
failed");
+                               }else{
+                                       LOG_WA("Sending call to applier:");
                                }
                        }
 

------------------------------------------------------------------------------
Learn the latest--Visual Studio 2012, SharePoint 2013, SQL 2012, more!
Discover the easy way to master current and previous Microsoft technologies
and advance your career. Get an incredible 1,500+ hours of step-by-step
tutorial videos with LearnDevNow. Subscribe today and save!
http://pubads.g.doubleclick.net/gampad/clk?id=58040911&iu=/4140/ostg.clktrk
_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to