src/imm/Makefile.am           |    5 +-
 src/imm/immnd/ImmModel.cc     |   44 ++++++++++++--
 src/imm/immnd/ImmModel.h      |    2 +
 src/imm/immnd/immnd_cb.h      |   18 ++++++
 src/imm/immnd/immnd_db.c      |  125 ++++++++++++++++++++++++++++++++++++++++++
 src/imm/immnd/immnd_evt.c     |   31 ++++++++-
 src/imm/immnd/immnd_init.h    |    7 ++
 src/imm/immnd/immnd_main.c    |   42 +++++++++++++-
 src/imm/immnd/immnd_mds.c     |   30 +++++++++-
 src/nid/nodeinit.conf.payload |    2 +-
 10 files changed, 289 insertions(+), 17 deletions(-)


diff --git a/src/imm/Makefile.am b/src/imm/Makefile.am
--- a/src/imm/Makefile.am
+++ b/src/imm/Makefile.am
@@ -2,6 +2,7 @@
 #
 # (C) Copyright 2016 The OpenSAF Foundation
 # Copyright Ericsson AB 2017 - All Rights Reserved.
+# Copyright (C) 2017, Oracle and/or its affiliates. All rights reserved.
 #
 # This program is distributed in the hope that it will be useful, but
 # WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
@@ -352,6 +353,7 @@ bin_osafimmnd_SOURCES = \
        src/imm/immnd/immnd_main.c \
        src/imm/immnd/immnd_mds.c \
        src/imm/immnd/immnd_proc.c \
+       src/imm/immnd/immnd_clm.c \
        src/imm/immnd/ImmAttrValue.cc \
        src/imm/immnd/ImmSearchOp.cc \
        src/imm/immnd/ImmModel.cc
@@ -359,7 +361,8 @@ bin_osafimmnd_SOURCES = \
 bin_osafimmnd_LDADD = \
        lib/libimm_common.la \
        lib/libSaAmf.la \
-       lib/libopensaf_core.la
+       lib/libopensaf_core.la \
+       lib/libSaClm.la
 
 bin_osafimmpbed_CXXFLAGS = $(AM_CXXFLAGS)
 
diff --git a/src/imm/immnd/ImmModel.cc b/src/imm/immnd/ImmModel.cc
--- a/src/imm/immnd/ImmModel.cc
+++ b/src/imm/immnd/ImmModel.cc
@@ -2,6 +2,7 @@
  *
  * (C) Copyright 2008 The OpenSAF Foundation
  * Copyright Ericsson AB 2009, 2017 - All Rights Reserved.
+ * Copyright (C) 2017, Oracle and/or its affiliates. All rights reserved.
  *
  * This program is distributed in the hope that it will be useful, but
  * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
@@ -671,12 +672,12 @@ immModel_pbePrtoPurgeMutations(IMMND_CB 
     ConnVector::iterator cvi;
     unsigned int ix = 0;
     ImmModel::instance(&cb->immModel)->pbePrtoPurgeMutations(nodeId, cv);
-    *reqArrSize = (SaUint32T) cv.size();
-    if(*reqArrSize) {
-            *reqConnArr = (SaUint32T *) malloc((*reqArrSize)* 
sizeof(SaUint32T));
-             for(cvi = cv.begin(); cvi!= cv.end();++cvi,++ix) {
-                 (*reqConnArr)[ix] = (*cvi);
-             }
+    if(reqArrSize && reqConnArr && cv.size()){
+        *reqArrSize = (SaUint32T) cv.size();
+        *reqConnArr = (SaUint32T *) malloc((*reqArrSize)* sizeof(SaUint32T));
+        for(cvi = cv.begin(); cvi!= cv.end();++cvi,++ix) {
+            (*reqConnArr)[ix] = (*cvi);
+        }
     }
 }
 
@@ -1162,6 +1163,12 @@ immModel_protocol51Allowed(IMMND_CB *cb)
     return ImmModel::instance(&cb->immModel)->protocol51Allowed();
 }
 
+bool
+immModel_protocol52Allowed(IMMND_CB *cb)
+{
+    return ImmModel::instance(&cb->immModel)->protocol52Allowed();
+}
+
 OsafImmAccessControlModeT
 immModel_accessControlMode(IMMND_CB *cb)
 {
@@ -4056,6 +4063,30 @@ ImmModel::protocol51Allowed()
     return noStdFlags & OPENSAF_IMM_FLAG_PRT51_ALLOW;
 }
 
+bool
+ImmModel::protocol52Allowed()
+{
+    //TRACE_ENTER();
+    /* Assume that all nodes are running the same version when loading
+    if (sImmNodeState == IMM_NODE_LOADING) {
+        return true;
+    }*/
+    ObjectMap::iterator oi = sObjectMap.find(immObjectDn);
+    if(oi == sObjectMap.end()) {
+        return false;
+    }
+
+    ObjectInfo* immObject =  oi->second;
+    ImmAttrValueMap::iterator avi =
+       immObject->mAttrValueMap.find(immAttrNostFlags);
+    osafassert(avi != immObject->mAttrValueMap.end());
+    osafassert(!(avi->second->isMultiValued()));
+    ImmAttrValue* valuep = avi->second;
+    unsigned int noStdFlags = valuep->getValue_int();
+
+    //TRACE_LEAVE();
+    return noStdFlags & OPENSAF_IMM_FLAG_PRT52_ALLOW;
+}
 
 bool
 ImmModel::protocol41Allowed()
@@ -5077,6 +5108,7 @@ ImmModel::adminOwnerDelete(SaUint32T own
 
                         noStdFlags |= OPENSAF_IMM_FLAG_PRT51_ALLOW;
                     }
+                    noStdFlags |= OPENSAF_IMM_FLAG_PRT52_ALLOW;
                     valuep->setValue_int(noStdFlags);
                     LOG_NO("%s changed to: 0x%x", immAttrNostFlags.c_str(), 
noStdFlags);
                     /* END Temporary code. */
diff --git a/src/imm/immnd/ImmModel.h b/src/imm/immnd/ImmModel.h
--- a/src/imm/immnd/ImmModel.h
+++ b/src/imm/immnd/ImmModel.h
@@ -1,6 +1,7 @@
 /*      -*- OpenSAF  -*-
  *
  * (C) Copyright 2008 The OpenSAF Foundation
+ * Copyright (C) 2017, Oracle and/or its affiliates. All rights reserved.
  *
  * This program is distributed in the hope that it will be useful, but
  * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
@@ -117,6 +118,7 @@ public:
     bool                protocol47Allowed();
     bool                protocol50Allowed();
     bool                protocol51Allowed();
+    bool                protocol52Allowed();
     bool                oneSafe2PBEAllowed();
     bool                purgeSyncRequest(SaUint32T clientId);
     bool                verifySchemaChange(const std::string& className,
diff --git a/src/imm/immnd/immnd_cb.h b/src/imm/immnd/immnd_cb.h
--- a/src/imm/immnd/immnd_cb.h
+++ b/src/imm/immnd/immnd_cb.h
@@ -1,6 +1,7 @@
 /*      -*- OpenSAF  -*-
  *
  * (C) Copyright 2008 The OpenSAF Foundation
+ * Copyright (C) 2017, Oracle and/or its affiliates. All rights reserved.
  *
  * This program is distributed in the hope that it will be useful, but
  * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
@@ -43,6 +44,11 @@ typedef struct immnd_om_search_node {
        struct immnd_om_search_node *next;
 } IMMND_OM_SEARCH_NODE;
 
+typedef struct immnd_clm_node_list {
+       NCS_PATRICIA_NODE patnode;
+       NCS_NODE_ID node_id;
+} IMMND_CLM_NODE_LIST;
+
 typedef struct immnd_immom_client_node {
        NCS_PATRICIA_NODE patnode;
        SaImmHandleT imm_app_hdl;       /* index for the client tree */
@@ -181,6 +187,11 @@ typedef struct immnd_cb_tag {
        SaSelectionObjectT amf_sel_obj; /* Selection Object for AMF events */
        int nid_started;        /* true if started by NID */
        bool isNodeTypeController; // true node type is controller
+       SaSelectionObjectT clmSelectionObject; /* Selection object to wait for 
clms events*/
+        NCS_SEL_OBJ clm_init_sel_obj; /* Selection object wait for  clms 
intialization*/
+        bool isClmNodeJoined; /* True => If clm joined the cluster*/
+        //bool protocol52Allowed; // True, if protocol52 is allowed.
+       NCS_PATRICIA_TREE immnd_clm_list;       /* IMMND_IMM_CLIENT_NODE - node 
*/
 } IMMND_CB;
 
 /* CB prototypes */
@@ -200,6 +211,13 @@ uint32_t immnd_client_node_tree_init(IMM
 void immnd_client_node_tree_cleanup(IMMND_CB *cb);
 void immnd_client_node_tree_destroy(IMMND_CB *cb);
 
+uint32_t immnd_clm_node_list_init(IMMND_CB *cb);
+void immnd_clm_node_get(IMMND_CB *cb, NODE_ID node, IMMND_CLM_NODE_LIST 
**imm_clm_node);
+uint32_t immnd_clm_node_add(IMMND_CB *cb,  NODE_ID key);
+uint32_t immnd_clm_node_delete(IMMND_CB *cb, IMMND_CLM_NODE_LIST 
*immnd_clm_node);
+void immnd_clm_node_cleanup(IMMND_CB *cb);
+void immnd_clm_node_destroy(IMMND_CB *cb);
+
 /*
   #define m_IMMSV_CONVERT_EXPTIME_TEN_MILLI_SEC(t) \
   SaTimeT now; \
diff --git a/src/imm/immnd/immnd_db.c b/src/imm/immnd/immnd_db.c
--- a/src/imm/immnd/immnd_db.c
+++ b/src/imm/immnd/immnd_db.c
@@ -1,6 +1,7 @@
 /*      -*- OpenSAF  -*-
  *
  * (C) Copyright 2008 The OpenSAF Foundation
+ * Copyright (C) 2017, Oracle and/or its affiliates. All rights reserved.
  *
  * This program is distributed in the hope that it will be useful, but
  * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
@@ -172,6 +173,130 @@ void immnd_client_node_tree_destroy(IMMN
        return;
 }
 
+/****************************************************************************
+  Name          : immnd_clm_node_list_init
+  Description   : This routine is used to initialize the IMMND clm node list 
init
+  Arguments     : cb - pointer to the IMMND Control Block
+  Return Values : NCSCC_RC_SUCCESS/NCSCC_RC_FAILURE
+  Notes         : None
+*****************************************************************************/
+uint32_t immnd_clm_node_list_init(IMMND_CB *cb)
+{
+        NCS_PATRICIA_PARAMS param;
+        memset(&param, 0, sizeof(NCS_PATRICIA_PARAMS));
+
+        param.key_size = sizeof(NODE_ID);
+        if (ncs_patricia_tree_init(&cb->immnd_clm_list, &param) != 
NCSCC_RC_SUCCESS) {
+                return NCSCC_RC_FAILURE;
+        }
+        return NCSCC_RC_SUCCESS;
+}
+
+/****************************************************************************
+ * Name          : immnd_clm_node_get
+ * Description   : Function to get the clm node from the clm list.
+ * Arguments     : IMMND_CB *cb, - IMMND Control Block
+ *               : NODE_ID  - CLM nodeid.
+ * Return Values : IMMND_CLM_NODE_LIST ** immnd_clm_node_list
+ * Notes         : None.
+ *****************************************************************************/
+void immnd_clm_node_get(IMMND_CB *cb, NODE_ID node, IMMND_CLM_NODE_LIST 
**imm_clm_node)
+{
+        *imm_clm_node = (IMMND_CLM_NODE_LIST*)
+            ncs_patricia_tree_get(&cb->immnd_clm_list, (uint8_t *)&node);
+        return;
+}
+
+/****************************************************************************
+  Name          : immnd_clm_node_add
+  Description   : This routine adds the new node to immnd_clm_node_list
+  Arguments     : immnd_tree - IMMND Tree.
+                  NODE_ID -  CLM  Node.
+  Return Values : NCSCC_RC_SUCCESS/NCSCC_RC_FAILURE
+  Notes         : The caller takes the cb lock before calling this function
+*****************************************************************************/
+uint32_t immnd_clm_node_add(IMMND_CB *cb,  NODE_ID key)
+{
+        IMMND_CLM_NODE_LIST *immnd_clm_node = calloc(1, 
sizeof(IMMND_CLM_NODE_LIST));
+        immnd_clm_node->node_id = key;
+        immnd_clm_node->patnode.key_info = (uint8_t *)&immnd_clm_node->node_id;
+
+        if (ncs_patricia_tree_add(&cb->immnd_clm_list, 
&immnd_clm_node->patnode) != NCSCC_RC_SUCCESS) {
+                LOG_ER("IMMND - ncs_patricia_tree_add failed in 
immnd_clm_node_add");
+                free(immnd_clm_node);
+                return NCSCC_RC_FAILURE;
+        }
+
+        return NCSCC_RC_SUCCESS;
+}
+
+/****************************************************************************
+  Name          : immnd_clm_node_delete
+  Description   : This routine deletes the node from immnd_clm_node_list
+  Arguments     : IMMD_CB *cb - IMMD Control Block.
+                : NODE_ID -  CLM  Node.
+  Return Values : None
+*****************************************************************************/
+uint32_t immnd_clm_node_delete(IMMND_CB *cb, IMMND_CLM_NODE_LIST 
*immnd_clm_node)
+{
+        uint32_t rc = NCSCC_RC_SUCCESS;
+
+        /* Remove the Node from the client tree */
+        if (ncs_patricia_tree_del(&cb->immnd_clm_list, (NCS_PATRICIA_NODE 
*)&immnd_clm_node->patnode) != NCSCC_RC_SUCCESS) {
+                LOG_WA("IMMND CLM NODE DELETE FROM PAT TREE FAILED");
+                rc = NCSCC_RC_FAILURE;
+        }
+
+        /* Free the Client Node */
+        if (immnd_clm_node) {
+                free(immnd_clm_node);
+        }
+        return rc;
+}
+
+/****************************************************************************
+  Name          : immnd_clm_node_cleanup
+  Description   : This routine Free all the nodes in clm_node_list.
+  Arguments     : IMMD_CB *cb - IMMD Control Block.
+  Return Values : None
+****************************************************************************/
+void immnd_clm_node_cleanup(IMMND_CB *cb)
+{
+        IMMND_CLM_NODE_LIST *immnd_clm_node;
+        NODE_ID key;
+        memset(&key, 0, sizeof(NODE_ID));
+
+        /* Get the First Node */
+        immnd_clm_node = (IMMND_CLM_NODE_LIST*)
+            ncs_patricia_tree_getnext(&cb->immnd_clm_list, (uint8_t *)&key);
+        while (immnd_clm_node) {
+                key = immnd_clm_node->node_id;
+                immnd_clm_node_delete(cb, immnd_clm_node);
+
+                immnd_clm_node = (IMMND_CLM_NODE_LIST*)
+                    ncs_patricia_tree_getnext(&cb->immnd_clm_list, (uint8_t 
*)&key);
+        }
+
+        return;
+}
+
+/****************************************************************************
+  Name          : immnd_clm_node_destroy
+  Description   : This routine destroys the IMMND clm node list.
+  Arguments     : IMMD_CB *cb - IMMD Control Block.
+  Return Values : None
+*****************************************************************************/
+void immnd_clm_node_destroy(IMMND_CB *cb)
+{
+        /* cleanup the clm list */
+        immnd_clm_node_cleanup(cb);
+
+        /* destroy the tree */
+        ncs_patricia_tree_destroy(&cb->immnd_clm_list);
+
+        return;
+}
+
 /* FEVS MESSAGE QUEUEING */
 
 /*************************************************************************
diff --git a/src/imm/immnd/immnd_evt.c b/src/imm/immnd/immnd_evt.c
--- a/src/imm/immnd/immnd_evt.c
+++ b/src/imm/immnd/immnd_evt.c
@@ -1,6 +1,7 @@
 /*      -*- OpenSAF  -*-
  *
  * (C) Copyright 2008 The OpenSAF Foundation
+ * Copyright (C) 2017, Oracle and/or its affiliates. All rights reserved.
  *
  * This program is distributed in the hope that it will be useful, but
  * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
@@ -786,6 +787,16 @@ static uint32_t immnd_evt_proc_imm_init(
                }
        }
 
+       if (evt->info.initReq.version.minorVersion >= 0x12 &&
+                       evt->info.initReq.version.majorVersion == 0x2 &&
+                       evt->info.initReq.version.releaseCode == 'A') {
+               if ( immModel_protocol52Allowed(cb) && !cb->isClmNodeJoined && 
cb->mIntroduced != 2) {
+                       error = SA_AIS_ERR_UNAVAILABLE;
+                       LOG_ER("CLM node went down prot=%x 
nodeJoined=%x",immModel_protocol52Allowed(cb), cb->isClmNodeJoined);
+                       goto clm_left;
+               }
+       }
+
        cl_node = calloc(1, sizeof(IMMND_IMM_CLIENT_NODE));
        if (cl_node == NULL) {
                LOG_ER("IMMND - Client Alloc Failed");
@@ -835,6 +846,7 @@ static uint32_t immnd_evt_proc_imm_init(
        send_evt.info.imma.info.initRsp.immHandle = cl_node->imm_app_hdl;
        error = SA_AIS_OK;
 
+ clm_left:
  agent_rsp:
        send_evt.type = IMMSV_EVT_TYPE_IMMA;
        send_evt.info.imma.type = IMMA_EVT_ND2A_IMM_INIT_RSP;
@@ -9419,6 +9431,14 @@ static void immnd_evt_proc_finalize_sync
                                
"SA_IMM_KEEP_REPOSITORY":"SA_IMM_INIT_FROM_FILE");
                }
                immnd_adjustEpoch(cb, true);
+               /* If the node is payload give the indication to 
clm_init_sel_obj
+                *  because payload nodes are not subscribing for AVD up
+                */
+               if(!immnd_cb->isNodeTypeController && !cb->clm_hdl){
+                       TRACE_8("clm_init_sel_obj indication is given at 
payload");
+                       ncs_sel_obj_ind(&immnd_cb->clm_init_sel_obj);
+
+                }
 
                /* Sync completed for client => trigger active resurrect. */
                memset(&send_evt, '\0', sizeof(IMMSV_EVT));
@@ -9429,25 +9449,25 @@ static void immnd_evt_proc_finalize_sync
                        prev_hdl = cl_node->imm_app_hdl;
                        if(!(cl_node->mIsResurrect)) {
                                LOG_WA("Found active client id: %llx version:%c 
%u %u, after sync, should not happen",
-                                        cl_node->imm_app_hdl, 
cl_node->version.releaseCode,
-                                       cl_node->version.majorVersion,
-                                       cl_node->version.minorVersion);
+                                               cl_node->imm_app_hdl, 
cl_node->version.releaseCode,
+                                               cl_node->version.majorVersion,
+                                               cl_node->version.minorVersion);
                                immnd_client_node_getnext(cb, prev_hdl, 
&cl_node);
                                continue;
                        }
                        /* Send resurrect message. */
                        if (immnd_mds_msg_send(cb, cl_node->sv_id,
-                                   cl_node->agent_mds_dest, 
&send_evt)!=NCSCC_RC_SUCCESS) 
+                                               cl_node->agent_mds_dest, 
&send_evt)!=NCSCC_RC_SUCCESS) 
                        {
                                LOG_WA("Failed to send active resurrect 
message");
 
                        }
+                       ++count;
                        /* Remove the temporary client node. */
                        immnd_client_node_del(cb, cl_node);
                        memset(cl_node, '\0', sizeof(IMMND_IMM_CLIENT_NODE));
                        free(cl_node);
                        cl_node = NULL;
-                       ++count;
                        immnd_client_node_getnext(cb, 0, &cl_node);
                }
                TRACE_2("Triggered %u active resurrects", count);
@@ -10417,6 +10437,7 @@ static uint32_t immnd_evt_proc_mds_evt(I
                        }
                }
                LOG_NO("IMMD SERVICE IS DOWN, HYDRA IS CONFIGURED => 
UNREGISTERING IMMND form MDS");
+
                immnd_mds_unregister(cb);
                /* Discard local clients ...  */
                immnd_proc_discard_other_nodes(cb); /* Isolate from the rest of 
cluster */
diff --git a/src/imm/immnd/immnd_init.h b/src/imm/immnd/immnd_init.h
--- a/src/imm/immnd/immnd_init.h
+++ b/src/imm/immnd/immnd_init.h
@@ -1,6 +1,7 @@
 /*      -*- OpenSAF  -*-
  *
  * (C) Copyright 2008 The OpenSAF Foundation
+ * Copyright (C) 2017, Oracle and/or its affiliates. All rights reserved.
  *
  * This program is distributed in the hope that it will be useful, but
  * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
@@ -322,6 +323,7 @@ extern "C" {
        bool immModel_protocol46Allowed(IMMND_CB *cb);
        bool immModel_protocol47Allowed(IMMND_CB *cb);
        bool immModel_protocol50Allowed(IMMND_CB *cb);
+       bool immModel_protocol52Allowed(IMMND_CB *cb);
        bool immModel_oneSafe2PBEAllowed(IMMND_CB *cb);
        OsafImmAccessControlModeT immModel_accessControlMode(IMMND_CB *cb);
        const char *immModel_authorizedGroup(IMMND_CB *cb);
@@ -502,4 +504,9 @@ void freeSearchNext(IMMSV_OM_RSP_SEARCH_
 uint32_t immnd_proc_server(uint32_t *timeout);
 /* End : ----  immnd_proc.c  */
 
+/* File : ----  immnd_clm.c */
+uint32_t immnd_clm_node_change(bool left);
+void immnd_init_with_clm();
+/* Ebd : ----  immnd_clm.c */
+
 #endif  // IMM_IMMND_IMMND_INIT_H_
diff --git a/src/imm/immnd/immnd_main.c b/src/imm/immnd/immnd_main.c
--- a/src/imm/immnd/immnd_main.c
+++ b/src/imm/immnd/immnd_main.c
@@ -1,6 +1,7 @@
 /*      -*- OpenSAF  -*-
  *
  * (C) Copyright 2008-2010 The OpenSAF Foundation
+ * Copyright (C) 2017, Oracle and/or its affiliates. All rights reserved.
  *
  * This program is distributed in the hope that it will be useful, but
  * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
@@ -41,6 +42,8 @@
 #define FD_TERM 0
 #define FD_AMF 1
 #define FD_MBX 2
+#define FD_CLM_INIT 3
+#define FD_CLM 4
 
 static IMMND_CB _immnd_cb;
 IMMND_CB *immnd_cb = &_immnd_cb;
@@ -86,6 +89,7 @@ static uint32_t immnd_cb_db_init(IMMND_C
        if (rc == NCSCC_RC_FAILURE)
                LOG_ER("client node tree init failed");
 
+       rc = immnd_clm_node_list_init(cb);
        return (rc);
 }
 
@@ -144,6 +148,8 @@ static uint32_t immnd_initialize(char *p
        immnd_cb->mProgName = progname;
        immnd_cb->mDir = getenv("IMMSV_ROOT_DIRECTORY");
        immnd_cb->mFile = getenv("IMMSV_LOAD_FILE");
+       immnd_cb->clm_hdl = 0;
+       immnd_cb->clmSelectionObject = -1;
        if ((envVar = getenv("IMMSV_NUM_NODES"))) {
                int numNodes = atoi(envVar);
                if(numNodes > 255) {
@@ -224,6 +230,12 @@ static uint32_t immnd_initialize(char *p
                LOG_ER("m_NCS_IPC_ATTACH FAILED");
                goto done;
        }
+       
+       /* Create a selection object for clm intialization*/
+       if ((rc = ncs_sel_obj_create(&immnd_cb->clm_init_sel_obj)) != 
NCSCC_RC_SUCCESS) {
+               LOG_ER("ncs_sel_obj_create failed for clm intialization");
+               goto done;
+       }
 
        if ((rc = immnd_mds_register(immnd_cb)) != NCSCC_RC_SUCCESS) {
                TRACE("immnd_mds_register FAILED %u", rc);
@@ -278,8 +290,8 @@ int main(int argc, char *argv[])
                                   server task when we are very bussy. */
        int maxEvt = 100;
        struct timespec start_time;
-       struct pollfd fds[3];
-       int term_fd;
+       struct pollfd fds[5];
+       int term_fd, nfds=4;;
 
        daemonize(argc, argv);
 
@@ -310,6 +322,8 @@ int main(int argc, char *argv[])
        fds[FD_AMF].events = POLLIN;
        fds[FD_MBX].fd = mbx_fd.rmv_obj;
        fds[FD_MBX].events = POLLIN;
+       fds[FD_CLM_INIT].fd = immnd_cb->clm_init_sel_obj.rmv_obj;
+        fds[FD_CLM_INIT].events = POLLIN;
 
        while (1) {
                /* Watch out for performance bug. Possibly change from 
event-count
@@ -327,7 +341,7 @@ int main(int argc, char *argv[])
                maxEvt = (timeout == 100) ? 50 : 100;
 
                /* Wait for events */
-               int ret = poll(fds, 3, (passed_time_ms < timeout) ? (timeout - 
passed_time_ms) : 0);
+               int ret = poll(fds, nfds, (passed_time_ms < timeout) ? (timeout 
- passed_time_ms) : 0);
 
                if (ret == -1) {
                        if (errno == EINTR)
@@ -377,6 +391,28 @@ int main(int argc, char *argv[])
                                }
                        }
 
+                       if (fds[FD_CLM_INIT].revents & POLLIN && 
!immnd_cb->clm_hdl) {
+                               TRACE("Initalize CLM ");
+                               
ncs_sel_obj_rmv_ind(&immnd_cb->clm_init_sel_obj, true, true);
+                               immnd_init_with_clm();
+                               nfds=5;
+                               fds[FD_CLM].fd = immnd_cb->clmSelectionObject;
+                               fds[FD_CLM].events = POLLIN;
+                       }
+
+                       if (fds[FD_CLM].revents & POLLIN) {
+                               if ((error = saClmDispatch(immnd_cb->clm_hdl, 
SA_DISPATCH_ALL)) != SA_AIS_OK) {
+                                       LOG_ER("saClmDispatch failed: %u", 
error);
+                                       if(error == SA_AIS_ERR_BAD_HANDLE){
+                                               LOG_NO("Re-initializing with 
CLMS");
+                                               
immnd_clm_node_cleanup(immnd_cb);
+                                               immnd_init_with_clm();
+                                       } else {
+                                               break;
+                                       }
+                               }
+                       }
+
                        if (eventCount >= maxEvt) {
                                /* Make some progress on background task, 
                                   even when we are very busy. */
diff --git a/src/imm/immnd/immnd_mds.c b/src/imm/immnd/immnd_mds.c
--- a/src/imm/immnd/immnd_mds.c
+++ b/src/imm/immnd/immnd_mds.c
@@ -1,6 +1,7 @@
 /*      -*- OpenSAF  -*-
  *
  * (C) Copyright 2008 The OpenSAF Foundation
+ * Copyright (C) 2017, Oracle and/or its affiliates. All rights reserved.
  *
  * This program is distributed in the hope that it will be useful, but
  * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
@@ -188,6 +189,23 @@ uint32_t immnd_mds_register(IMMND_CB *cb
                goto error1;
        }
 
+       if(cb->isNodeTypeController){
+
+               /* STEP 6: Subscribe to AVD events in MDS. This will be
+                  used for CLM registration at controllers.*/
+
+               svc_id[0]  = NCSMDS_SVC_ID_AVD;
+               svc_info.i_op = MDS_SUBSCRIBE;
+               svc_info.info.svc_subscribe.i_scope = NCSMDS_SCOPE_INTRANODE;
+               svc_info.info.svc_subscribe.i_num_svcs = 1;
+               svc_info.info.svc_subscribe.i_svc_ids = svc_id;
+
+               if (ncsmds_api(&svc_info) == NCSCC_RC_FAILURE) {
+                       LOG_WA("MDS AVD Subscription Failed");
+                       goto error1;
+               }
+       } 
+
        cb->node_id = m_NCS_GET_NODE_ID;
        TRACE_2("cb->node_id:%x", cb->node_id);
 
@@ -601,7 +619,17 @@ static uint32_t immnd_mds_svc_evt(IMMND_
                priority = NCS_IPC_PRIORITY_VERY_HIGH;
 
                m_NCS_UNLOCK(&cb->immnd_immd_up_lock, NCS_LOCK_WRITE);
-       }
+       } else if (svc_evt->i_svc_id == NCSMDS_SVC_ID_AVD) {
+               if (svc_evt->i_change == NCSMDS_UP) {
+                       TRACE_8("MDS UP dest: %" PRIx64 ", node ID: %x, svc_id: 
%d",
+                                       svc_evt->i_dest, svc_evt->i_node_id, 
svc_evt->i_svc_id);
+                       //Subscribed for only INTRA NODE, only one ADEST will 
come.
+                       if (m_MDS_DEST_IS_AN_ADEST(svc_evt->i_dest) ) {
+                               TRACE_8("AVD ADEST UP");
+                               ncs_sel_obj_ind(&immnd_cb->clm_init_sel_obj);
+                       }
+               }
+       } 
 
        /* IMMA events from other nodes can not happen */
        if ((svc_evt->i_svc_id == NCSMDS_SVC_ID_IMMA_OM) || (svc_evt->i_svc_id 
== NCSMDS_SVC_ID_IMMA_OI))
diff --git a/src/nid/nodeinit.conf.payload b/src/nid/nodeinit.conf.payload
--- a/src/nid/nodeinit.conf.payload
+++ b/src/nid/nodeinit.conf.payload
@@ -54,6 +54,6 @@
 #############################################################################
 
 
xxCLCCLIDIRxx/osaf-transport:TRANSPORT:S:xxCLCCLIDIRxx/osaf-transport:6000:-6:2:1:start:stop
+xxCLCCLIDIRxx/osaf-clmna:CLMNA:S:xxCLCCLIDIRxx/osaf-clmna:4000::9:1:start:stop
 
xxCLCCLIDIRxx/osaf-immnd:IMMND:S:xxCLCCLIDIRxx/osaf-immnd:48000:4:2:1:start:stop
-xxCLCCLIDIRxx/osaf-clmna:CLMNA:S:xxCLCCLIDIRxx/osaf-clmna:4000::9:1:start:stop
 xxCLCCLIDIRxx/osaf-amfnd:AMFND:S:xxCLCCLIDIRxx/osaf-amfnd:99000::0:1:start:stop

------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, SlashDot.org! http://sdm.link/slashdot
_______________________________________________
Opensaf-devel mailing list
Opensaf-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to