osaf/libs/core/include/mds_papi.h        |    4 +-
 osaf/libs/core/include/ncsusrbuf.h       |   17 ++-
 osaf/libs/core/mds/include/mds_core.h    |   25 +++
 osaf/libs/core/mds/include/mds_dt.h      |   25 +++-
 osaf/libs/core/mds/include/mds_dt2c.h    |    1 +
 osaf/libs/core/mds/include/mds_dt_tipc.h |    2 +
 osaf/libs/core/mds/mds_c_api.c           |   20 +++
 osaf/libs/core/mds/mds_c_db.c            |   83 ++++++++++++
 osaf/libs/core/mds/mds_c_sndrcv.c        |    2 +-
 osaf/libs/core/mds/mds_dt_tipc.c         |  206 ++++++++++++++++++++++++++++--
 osaf/libs/core/mds/mds_dt_trans.c        |   18 +-
 11 files changed, 374 insertions(+), 29 deletions(-)


1) MDS fragmentation value changed from 1400 to MDS_DIRECT_BUF_MAXSIZE (65535 
maximum packet size)-(56 MDS header) ,
#defined MDTM_NORMAL_MSG_FRAG_SIZE_MAX MDS_DIRECT_BUF_MAXSIZE .

2) MDS MDS_DIRECT_BUF_MAXSIZE value changed from 8000 to (65535 maximum packet 
size)-(56 MDS header) ,
#defined MDTM_NORMAL_MSG_FRAG_SIZE_MAX (65535 maximum packet size)-(56 MDS 
header)

3) This PAYLOAD_BUF_SIZE value is suppose to be equal to MDS_DIRECT_BUF_MAXSIZE
(65535 maximum packet size)-(56 MDS header) ,but in the previous releases of
Opensaf the value of TIPC inbuf size of MDTM_RECV_BUFFER_SIZE (mds_dt_tipc.c)
TIPC was limited to(8000+MDS header ) , we have in-service Upgrade issue,
so it is not possible to send the new MDS_DIRECT_BUF_MAXSIZE (65535 maximum 
packet size)-(56 MDS header)
value previous Opensaf version nodes , so for the current release it is limited 
to 8000,
possibly adjust this in the future Opensaf releases to MDS_DIRECT_BUF_MAXSIZE.


4) To support in-service MDS TIPC Upgrade issue MDTM_NORMAL_MSG_FRAG_SIZE_MIN
is provide, and this fragment size is used to send to previous version of 
Opensaf Node
while in-service Upgrade.

In the previous releases of Opensaf the value of TIPC inbuf size of
MDTM_RECV_BUFFER_SIZE (mds_dt_tipc.c) TIPC was limited to(8000+MDS header) ,
we have in-service Upgrade issue, so it is not possible to send the new
MDS_DIRECT_BUF_MAXSIZE (65535 maximum packet size)-(56 MDS header)
value previous Opensaf version nodes , so for the current release it is limited 
to 8000,
possibly this will be removed in the future Opensaf releases .

5) To handle in-service Upgrade of fragmentation changes , New node do install 
& subscribe its Node Mds version.
the MDTM_NORMAL_MSG_FRAG_SIZE_MIN fragment size is used to send to previous 
version of Opensaf
Node while in-service Upgrade ,and the old nodes will not publishes so we need 
to fragment to MDTM_NORMAL_MSG_FRAG_SIZE_MIN 
size.mds_mdtm_node_info_install_tipc() & mds_mdtm_node_info_subscribe_tipc()

diff --git a/osaf/libs/core/include/mds_papi.h 
b/osaf/libs/core/include/mds_papi.h
--- a/osaf/libs/core/include/mds_papi.h
+++ b/osaf/libs/core/include/mds_papi.h
@@ -57,6 +57,8 @@ extern "C" {
    1) Basic data type
 \**********************************************************************/
 
+/* The NODE version of MDS */
+#define MDS_NODE_VERSION 1
 /* The version of MDS that this header ships with */
 #define MDS_MAJOR_VERSION 2
 #define MDS_MINOR_VERSION 1
@@ -208,7 +210,7 @@ extern "C" {
 #define NCSMDS_MAX_VDEST    32767
 #define NCSMDS_MAX_SVCS     1023
 
-#define MDS_DIRECT_BUF_MAXSIZE 8000
+#define MDS_DIRECT_BUF_MAXSIZE  (65535 - 56) /*(65535 maximum packet size)-(56 
MDS header)*/
        typedef uint8_t *MDS_DIRECT_BUFF;
 #define m_MDS_ALLOC_DIRECT_BUFF(size) mds_alloc_direct_buff(size)
 #define m_MDS_FREE_DIRECT_BUFF(x) mds_free_direct_buff(x)
diff --git a/osaf/libs/core/include/ncsusrbuf.h 
b/osaf/libs/core/include/ncsusrbuf.h
--- a/osaf/libs/core/include/ncsusrbuf.h
+++ b/osaf/libs/core/include/ncsusrbuf.h
@@ -47,8 +47,23 @@
 #ifdef  __cplusplus
 extern "C" {
 #endif
+       /* This PAYLOAD_BUF_SIZE value is suppose to be equal to 
MDS_DIRECT_BUF_MAXSIZE ,
+          but in the previous releases of Opensaf the value of TIPC  inbuf 
size of
+          MDTM_RECV_BUFFER_SIZE (mds_dt_tipc.c) TIPC was limited to(8000+MDS 
header ) ,
+          we have in-service Upgrade issue, so it is not possible to send the 
new
+          MDS_DIRECT_BUF_MAXSIZE (65535 maximum packet size)-(56 MDS header)
+          value previous Opensaf version nodes ,  so for the current release 
it is limited to 8000,
+          possibly adjust this in the future Opensaf releases to 
MDS_DIRECT_BUF_MAXSIZE.
 
-#define PAYLOAD_BUF_SIZE 1400  /* default size of packet_data bufrs */
+          IMP TCP Note : Their is NO issue with TCP in-service Upgrade  ,The 
value of
+          SO_RCVBUF & SO_SNDBUF of  TCP sockets was set to 64000 ( 
MDS_SND_RCV_SIZE)
+          using setsockopt()  ,the kernel doubles this value ,and this doubled 
value is returned  by
+          getsockopt().
+          Replace PAYLOAD_BUF_SIZE 8000  value with MDS_DIRECT_BUF_MAXSIZE 
(65535 maximum packet size)-(56 MDS header) ,
+          after one cycle of  in-service upgrade (below 4.4.FC Opensaf rpms ) 
#define PAYLOAD_BUF_SIZE  (65535 - 56) 
+       */
+
+#define PAYLOAD_BUF_SIZE 8000
 
 /*****************************************************************************
 
diff --git a/osaf/libs/core/mds/include/mds_core.h 
b/osaf/libs/core/mds/include/mds_core.h
--- a/osaf/libs/core/mds/include/mds_core.h
+++ b/osaf/libs/core/mds/include/mds_core.h
@@ -240,6 +240,19 @@ typedef struct mds_vdest_info {
 
 } MDS_VDEST_INFO;
 
+typedef struct mds_node_info {
+
+       /* Indexing info */
+       NCS_PATRICIA_NODE node;
+
+       /* Node info */
+       NODE_ID node_id;  /* Serves as Node ID. Key for Patricia node */
+       uint16_t node_mds_ver; /* Node MDS version */
+       /* PWE and service list */
+       MDS_PWE_INFO *pwe_list;
+
+} MDS_NODE_INFO;
+
 typedef struct mds_svc_info {
 
        /* Indexing info */
@@ -284,6 +297,7 @@ typedef struct mds_mcm_cb {
        NCS_PATRICIA_TREE subtn_results;
        NCS_PATRICIA_TREE svc_list;     /* Tree of MDS_SVC_INFO information */
        NCS_PATRICIA_TREE vdest_list;   /* Tree of MDS_VDEST_INFO information */
+       NCS_PATRICIA_TREE node_list;   /* Tree of MDS_NODE_INFO information */
 } MDS_MCM_CB;
 
 /* Global MDSCB */
@@ -376,6 +390,11 @@ extern uint32_t mds_vdest_tbl_get_subtn_
 extern uint32_t mds_vdest_tbl_get_vdest_info_cb(MDS_VDEST_ID vdest_id, 
MDS_VDEST_INFO **vdest_info);
 extern uint32_t mds_vdest_tbl_cleanup(void);
 
+/* NODE TABLE Operations */
+extern uint32_t mds_node_tbl_add(NODE_ID node_id, uint16_t node_mds_ver);
+extern uint32_t mds_node_tbl_del(NODE_ID node_id);
+extern uint32_t mds_node_tbl_query(NODE_ID node_id);
+
 /* PWE TABLE Operations */
 
 extern uint32_t mds_pwe_tbl_add(MDS_VDEST_HDL vdest_hdl, PW_ENV_ID pwe_id, 
MDS_PWE_HDL *pwe_hdl);
@@ -512,6 +531,12 @@ extern uint32_t mds_mcm_free_msg_uba_sta
 #define m_MMGR_FREE_VDEST_INFO(p)   m_NCS_MEM_FREE(p, 
NCS_MEM_REGION_TRANSIENT, \
                                     NCS_SERVICE_ID_MDS, MDS_MEM_VDEST_INFO)
 
+#define m_MMGR_ALLOC_NODE_INFO     (MDS_NODE_INFO 
*)m_NCS_MEM_ALLOC(sizeof(MDS_NODE_INFO), \
+               NCS_MEM_REGION_TRANSIENT, NCS_SERVICE_ID_MDS, MDS_MEM_NODE_INFO)
+
+#define m_MMGR_FREE_NODE_INFO(p)   m_NCS_MEM_FREE(p, NCS_MEM_REGION_TRANSIENT, 
\
+               NCS_SERVICE_ID_MDS, MDS_MEM_NODE_INFO) 
+
 #define m_MMGR_ALLOC_PWE_INFO     (MDS_PWE_INFO 
*)m_NCS_MEM_ALLOC(sizeof(MDS_PWE_INFO), \
                                     NCS_MEM_REGION_TRANSIENT, \
                                     NCS_SERVICE_ID_MDS, MDS_MEM_PWE_INFO)
diff --git a/osaf/libs/core/mds/include/mds_dt.h 
b/osaf/libs/core/mds/include/mds_dt.h
--- a/osaf/libs/core/mds/include/mds_dt.h
+++ b/osaf/libs/core/mds/include/mds_dt.h
@@ -109,10 +109,28 @@ typedef struct mdtm_reassembly_queue {
 
 #define MDTM_MAX_DIRECT_BUFF_SIZE  MDTM_MAX_SEGMENT_SIZE
 
-#define MDTM_NORMAL_MSG_FRAG_SIZE   1400
+/* To support in-service Upgrade issue  MDTM_NORMAL_MSG_FRAG_SIZE_MIN
+   is provide, and this fragment size is used to send to previous version of 
Opensaf Node
+   while  in-service Upgrade.
 
-#define MDTM_RECV_BUFFER_SIZE 
((MDS_DIRECT_BUF_MAXSIZE>MDTM_NORMAL_MSG_FRAG_SIZE)? \
-                      
(MDS_DIRECT_BUF_MAXSIZE+SUM_MDS_HDR_PLUS_MDTM_HDR_PLUS_LEN):(MDTM_NORMAL_MSG_FRAG_SIZE+SUM_MDS_HDR_PLUS_MDTM_HDR_PLUS_LEN))
+   In the previous releases of Opensaf the value of TIPC  inbuf size of
+   MDTM_RECV_BUFFER_SIZE (mds_dt_tipc.c) TIPC was limited to(8000+MDS header) ,
+   we have in-service Upgrade issue, so it is not possible to send the new
+   MDS_DIRECT_BUF_MAXSIZE (65535 maximum packet size)-(56 MDS header)
+   value previous Opensaf version nodes ,  so for the current release it is 
limited to 8000,
+   possibly adjust this in the future Opensaf releases to 
MDS_DIRECT_BUF_MAXSIZE.
+
+   IMP TCP Note : Their is NO issue with TCP in-service Upgrade  ,The value of
+   SO_RCVBUF & SO_SNDBUF of  TCP sockets was set to 64000 ( MDS_SND_RCV_SIZE)
+   using setsockopt()  ,the kernel doubles this value ,and this doubled value 
is returned  by
+   getsockopt(). So MDTM_NORMAL_MSG_FRAG_SIZE_MAX size is used to send for
+   for both  previous & current versitions of Opensaf nodes which are using 
MDS TCP as transport*/
+#define MDTM_NORMAL_MSG_FRAG_SIZE_MIN 8000 
+
+#define MDTM_NORMAL_MSG_FRAG_SIZE_MAX MDS_DIRECT_BUF_MAXSIZE 
+
+#define MDTM_RECV_BUFFER_SIZE 
((MDS_DIRECT_BUF_MAXSIZE>MDTM_NORMAL_MSG_FRAG_SIZE_MAX)? \
+               
(MDS_DIRECT_BUF_MAXSIZE+SUM_MDS_HDR_PLUS_MDTM_HDR_PLUS_LEN):(MDTM_NORMAL_MSG_FRAG_SIZE_MAX+SUM_MDS_HDR_PLUS_MDTM_HDR_PLUS_LEN))
 
 /* Prefixes and defines regarding to the MDS_TIPC*/
 
@@ -124,6 +142,7 @@ typedef enum {
        MDS_PCON_INST_TYPE = 0x00030000,
        MDS_NODE_INST_TYPE = 0x00000000,
        MDS_PROCESS_INST_TYPE = 0x00050000,
+       MDS_NODE_INFO_TYPE = 0x00060000,
 } MDS_MDTM_INST_TYPES;
 
 /* Common to TCP and TIPC */
diff --git a/osaf/libs/core/mds/include/mds_dt2c.h 
b/osaf/libs/core/mds/include/mds_dt2c.h
--- a/osaf/libs/core/mds/include/mds_dt2c.h
+++ b/osaf/libs/core/mds/include/mds_dt2c.h
@@ -223,6 +223,7 @@ typedef enum {
        MDS_MEM_HDL_LIST,
        MDS_MEM_CACHED_EVENTS_LIST,
        MDS_MEM_BCAST_BUFF_LIST,
+       MDS_MEM_NODE_INFO,
 } MDS_MEM_SUB_ID;
 
 /* ******************************************** */
diff --git a/osaf/libs/core/mds/include/mds_dt_tipc.h 
b/osaf/libs/core/mds/include/mds_dt_tipc.h
--- a/osaf/libs/core/mds/include/mds_dt_tipc.h
+++ b/osaf/libs/core/mds/include/mds_dt_tipc.h
@@ -92,6 +92,8 @@ extern uint32_t mds_mdtm_vdest_subscribe
 extern uint32_t mds_mdtm_vdest_unsubscribe_tipc(MDS_VDEST_ID vdest_id, 
MDS_SUBTN_REF_VAL subtn_ref_val);
 extern uint32_t mds_mdtm_tx_hdl_register_tipc(MDS_DEST adest);
 extern uint32_t mds_mdtm_tx_hdl_unregister_tipc(MDS_DEST adest);
+extern uint32_t mds_mdtm_node_info_install_tipc();
+extern uint32_t mds_mdtm_node_info_subscribe_tipc(MDS_SUBTN_REF_VAL 
*subtn_ref_val);
 
 extern uint32_t mds_mdtm_send_tipc(MDTM_SEND_REQ *req);
 
diff --git a/osaf/libs/core/mds/mds_c_api.c b/osaf/libs/core/mds/mds_c_api.c
--- a/osaf/libs/core/mds/mds_c_api.c
+++ b/osaf/libs/core/mds/mds_c_api.c
@@ -3782,6 +3782,23 @@ uint32_t mds_mcm_init(void)
                return NCSCC_RC_FAILURE;
        }
 
+       /* NODE  TREE */
+       memset(&pat_tree_params, 0, sizeof(NCS_PATRICIA_PARAMS));
+       pat_tree_params.key_size = sizeof(NODE_ID);
+       if (NCSCC_RC_SUCCESS != 
ncs_patricia_tree_init(&gl_mds_mcm_cb->node_list, &pat_tree_params)) {
+               m_MDS_LOG_ERR("MCM_API : patricia_tree_init: subscription: 
failure, L mds_mcm_init");
+               if (NCSCC_RC_SUCCESS != 
ncs_patricia_tree_destroy(&gl_mds_mcm_cb->svc_list)) {
+                       m_MDS_LOG_ERR("MCM_API : patricia_tree_destroy: service 
:failure, L mds_mcm_init");
+               }
+               if (NCSCC_RC_SUCCESS != 
ncs_patricia_tree_destroy(&gl_mds_mcm_cb->vdest_list)) {
+                       m_MDS_LOG_ERR("MCM_API : patricia_tree_destroy: vdest 
:failure, L mds_mcm_init");
+               }
+               if (NCSCC_RC_SUCCESS != 
ncs_patricia_tree_destroy(&gl_mds_mcm_cb->subtn_results)) {
+                       m_MDS_LOG_ERR("MCM_API : patricia_tree_destroy: 
subtn_results :failure, L mds_mcm_init");
+               }
+               return NCSCC_RC_FAILURE;
+       }
+
        /* Add VDEST for ADEST entry in tree */
        vdest_for_adest_node = m_MMGR_ALLOC_VDEST_INFO;
        memset(vdest_for_adest_node, 0, sizeof(MDS_VDEST_INFO));
@@ -3824,6 +3841,9 @@ uint32_t mds_mcm_destroy(void)
        /* VDEST TREE */
        ncs_patricia_tree_destroy(&gl_mds_mcm_cb->vdest_list);
 
+       /* NODE TREE */
+       ncs_patricia_tree_destroy(&gl_mds_mcm_cb->node_list);
+
        /* Free MCM control block */
        m_MMGR_FREE_MCM_CB(gl_mds_mcm_cb);
 
diff --git a/osaf/libs/core/mds/mds_c_db.c b/osaf/libs/core/mds/mds_c_db.c
--- a/osaf/libs/core/mds/mds_c_db.c
+++ b/osaf/libs/core/mds/mds_c_db.c
@@ -376,6 +376,89 @@ uint32_t mds_vdest_tbl_cleanup(void)
 
 /* ******************************************** */
 /* ******************************************** */
+/*            NODE  TABLE Operations             */
+/* ******************************************** */
+/* ******************************************** */
+/*********************************************************
+  Function NAME: mds_node_tbl_add
+ *********************************************************/
+uint32_t mds_node_tbl_add(NODE_ID node_id, uint16_t node_mds_ver)
+{
+       MDS_NODE_INFO *node_info;
+
+       m_MDS_LOG_DBG("MCM_DB : Entering : mds_node_tbl_add");
+
+       /* Check if node is not already created */
+       if (ncs_patricia_tree_get(&gl_mds_mcm_cb->node_list, (uint8_t 
*)&node_id) != NULL) {
+               m_MDS_LOG_DBG("MCM_DB : Leaving : F : mds_node_tbl_add : VDEST 
already present");
+               return NCSCC_RC_FAILURE;
+       }
+
+
+       node_info = m_MMGR_ALLOC_NODE_INFO;
+       memset(node_info, 0, sizeof(MDS_NODE_INFO));  
+
+       node_info->node_id = node_id;
+       node_info->node_mds_ver = node_mds_ver;
+
+
+       m_MDS_LOG_DBG("node_id=%d node_mds_ver=%d", node_info->node_id, 
node_info->node_mds_ver);
+       node_info->node.key_info = (uint8_t *)&node_info->node_id;
+
+       ncs_patricia_tree_add(&gl_mds_mcm_cb->node_list, (NCS_PATRICIA_NODE 
*)&node_info->node);
+
+       m_MDS_LOG_DBG("MCM_DB : Leaving : S : mds_node_tbl_added node_id : 
%d",node_id);
+       return NCSCC_RC_SUCCESS;
+}
+
+/*********************************************************
+  Function NAME: mds_node_tbl_del
+ *********************************************************/
+uint32_t mds_node_tbl_del(NODE_ID node_id)
+{
+       MDS_NODE_INFO *node_info = NULL;
+
+       m_MDS_LOG_DBG("MCM_DB : Entering : mds_node_tbl_del");
+
+       /* Check if node is already created */
+       node_info = (MDS_NODE_INFO 
*)ncs_patricia_tree_get(&gl_mds_mcm_cb->node_list, (uint8_t *)&node_id);
+       if (node_info == NULL) {
+               m_MDS_LOG_DBG("MCM_DB : Leaving : F : mds_node_tbl_del : 
NODE_ID not present");
+               return NCSCC_RC_FAILURE;
+       } else {
+
+               ncs_patricia_tree_del(&gl_mds_mcm_cb->node_list, 
(NCS_PATRICIA_NODE *)node_info);
+
+               /* Free memory of NODE_INFO */
+               m_MMGR_FREE_NODE_INFO(node_info);
+       }
+       m_MDS_LOG_DBG("MCM_DB : Leaving : S : mds_node_tbl_del");
+       return NCSCC_RC_SUCCESS;
+}
+
+/*********************************************************
+  Function NAME: mds_node_tbl_query
+ *********************************************************/
+uint32_t mds_node_tbl_query(NODE_ID node_id)
+{
+       MDS_NODE_INFO *node_info = NULL;
+
+       m_MDS_LOG_DBG("MCM_DB : Entering : mds_node_tbl_query");
+
+       /* Check if node is already created */
+       node_info = (MDS_NODE_INFO 
*)ncs_patricia_tree_get(&gl_mds_mcm_cb->node_list, (uint8_t *)&node_id);
+       if (node_info == NULL) {
+               m_MDS_LOG_DBG("MCM_DB : Leaving : F : mds_node_tbl_query : 
NODE_ID not present");
+               return NCSCC_RC_FAILURE;
+       } else {
+               m_MDS_LOG_DBG("MCM_DB : Leaving : S : mds_node_tbl_query");
+               return NCSCC_RC_SUCCESS;
+       }
+
+}
+
+/* ******************************************** */
+/* ******************************************** */
 /*            PWE  TABLE Operations             */
 /* ******************************************** */
 /* ******************************************** */
diff --git a/osaf/libs/core/mds/mds_c_sndrcv.c 
b/osaf/libs/core/mds/mds_c_sndrcv.c
--- a/osaf/libs/core/mds/mds_c_sndrcv.c
+++ b/osaf/libs/core/mds/mds_c_sndrcv.c
@@ -34,7 +34,7 @@
        2. Direct send in which the user provides MDS with a flat buffer 
pointer and length 
            of the buffer. Memory will be allocated to the flat buffer by using 
the MDS api
            m_MDS_ALLOC_DIRECT_BUFF(size) (where size is the number of bytes of 
memory to be
-           allocated and is limited to 8000 bytes). As buffer pointer is 
allocated by MDS, in all the
+           allocated and is limited to MDS_DIRECT_BUF_MAXSIZE bytes). As 
buffer pointer is allocated by MDS, in all the
            cases of success and failure of DIRECT sends, memory will be freed 
by the MDS and application
            should not free the memory.
 
diff --git a/osaf/libs/core/mds/mds_dt_tipc.c b/osaf/libs/core/mds/mds_dt_tipc.c
--- a/osaf/libs/core/mds/mds_dt_tipc.c
+++ b/osaf/libs/core/mds/mds_dt_tipc.c
@@ -85,6 +85,8 @@ uint32_t mds_mdtm_vdest_install_tipc(MDS
 uint32_t mds_mdtm_vdest_uninstall_tipc(MDS_VDEST_ID vdest_id);
 uint32_t mds_mdtm_vdest_subscribe_tipc(MDS_VDEST_ID vdest_id, 
MDS_SUBTN_REF_VAL *subtn_ref_val);
 uint32_t mds_mdtm_vdest_unsubscribe_tipc(MDS_VDEST_ID vdest_id, 
MDS_SUBTN_REF_VAL subtn_ref_val);
+uint32_t mds_mdtm_node_info_install_tipc();
+uint32_t mds_mdtm_node_info_subscribe_tipc(MDS_SUBTN_REF_VAL *subtn_ref_val);
 uint32_t mds_mdtm_tx_hdl_register_tipc(MDS_DEST adest);
 uint32_t mds_mdtm_tx_hdl_unregister_tipc(MDS_DEST adest);
 
@@ -128,6 +130,10 @@ static MDS_SUBTN_REF_VAL handle;
 static uint16_t num_subscriptions;
 
 uint32_t mdtm_global_frag_num;
+#define MDTM_MAX_SEND_PKT_SIZE  
(MDTM_NORMAL_MSG_FRAG_SIZE_MAX+SUM_MDS_HDR_PLUS_MDTM_HDR_PLUS_LEN) /* Includes 
the 30 header bytes(2+8+20) */
+static uint32_t msg_frag_size = MDTM_NORMAL_MSG_FRAG_SIZE_MAX;
+static uint32_t max_send_pkt_size = MDTM_MAX_SEND_PKT_SIZE;
+
 /*********************************************************
 
   Function NAME: mdtm_tipc_init
@@ -158,6 +164,7 @@ uint32_t mdtm_tipc_init(NODE_ID nodeid, 
        num_subscriptions = 0;
        handle = 0;
        mdtm_global_frag_num = 0;
+       MDS_SUBTN_REF_VAL subtn_ref_ptr;
 
        /* REASSEMBLY TREE */
        memset(&pat_tree_params, 0, sizeof(pat_tree_params));
@@ -307,6 +314,21 @@ uint32_t mdtm_tipc_init(NODE_ID nodeid, 
         } else {
                 m_MDS_LOG_INFO("MDTM: Successfully set default socket option 
TIPC_IMP = %d", TIPCIMPORTANCE);
         }
+       /* To handle in-service Upgrade of  fragmentation changes  , 
theMDTM_NORMAL_MSG_FRAG_SIZE_MIN
+          fragment size is used to send to previous version of Opensaf Node 
while  in-service Upgrade ,
+          so the only new node do install & subscribe its Node Mds version 
+          ( old nodes will not publishes so we need to fragment to  
MDTM_NORMAL_MSG_FRAG_SIZE_MIN size.
+
+          In the previous releases of Opensaf the value of TIPC  inbuf size of
+          MDTM_RECV_BUFFER_SIZE (mds_dt_tipc.c) TIPC was limited to(8000+MDS 
header)  */
+       if (mds_mdtm_node_info_install_tipc() != NCSCC_RC_SUCCESS) {
+               LOG_ER("MDTM: Can't mds_mdtm_node_info_install_tipc  TIPC_IMP 
err \n");
+               osafassert(0);
+       }
+       if (mds_mdtm_node_info_subscribe_tipc(&subtn_ref_ptr) != 
NCSCC_RC_SUCCESS) {
+               LOG_ER("MDTM: Can't mds_mdtm_node_info_subscribe_tipc  TIPC_IMP 
err \n");
+               osafassert(0);
+       }
 
        return NCSCC_RC_SUCCESS;
 }
@@ -1016,11 +1038,43 @@ static uint32_t mdtm_process_discovery_e
 
                }
                break;
-
-       default:
+       case MDS_NODE_INFO_TYPE:
+               {
+                       /* To handle in-service Upgrade of  fragmentation 
changes ,
+                          theMDTM_NORMAL_MSG_FRAG_SIZE_MIN   fragment size is 
used to send
+                          to previous version of Opensaf Node while  
in-service Upgrade ,
+                          so the only new node publishes its Node Mds version
+                          ( old nodes will not publishes so we need to 
fragment to
+                          MDTM_NORMAL_MSG_FRAG_SIZE_MIN size.
+
+                          In the previous releases of Opensaf the value of 
TIPC  inbuf size of
+                          MDTM_RECV_BUFFER_SIZE (mds_dt_tipc.c) TIPC was 
limited to(8000+MDS header)  */
+       
+                       uint32_t node_status = 0;
+                       NODE_ID node_id = 0;
+                       uint32_t node_ver = 0;
+
+                       node_ver  = (uint32_t)lower;
+
+                       m_MDS_LOG_INFO("MDTM: Received NODE event");
+
+                       node_status = m_MDS_CHECK_TIPC_NODE_ID_RANGE(node);
+
+                       if (NCSCC_RC_SUCCESS == node_status) {
+                               node_id = 
((NODE_ID)(m_MDS_GET_NCS_NODE_ID_FROM_TIPC_NODE_ID(node)));
+
+                       } else {
+                               LOG_ER("MDTM: Dropping  the node event,as the 
TIPC NODE_ID is not in the prescribed range=0x%08x,  Event type=%d",
+                                               node, discovery_event);
+                               return NCSCC_RC_FAILURE;
+                       }
+                       mds_node_tbl_add(node_id,node_ver);
+               }
+               break;
+        default:
                {
                        m_MDS_LOG_ERR
-                           ("MDTM: TIPC EVENT UNSUPPORTED (default). If this 
case comes this should assert as there no other events being processed");
+                               ("MDTM: TIPC EVENT UNSUPPORTED (default). If 
this case comes this should assert as there no other events being processed");
                        return NCSCC_RC_FAILURE;
                }
                break;
@@ -1530,6 +1584,107 @@ uint32_t mds_mdtm_svc_subscribe_tipc(PW_
 }
 
 /*********************************************************
+  Function NAME: mds_mdtm_node_info_install_tipc
+ 
+  DESCRIPTION:
+ 
+  ARGUMENTS:
+ 
+  RETURNS:  1 - NCSCC_RC_SUCCESS
+            2 - NCSCC_RC_FAILURE
+ 
+*********************************************************/
+uint32_t mds_mdtm_node_info_install_tipc()
+{
+       /*
+          STEP 1: Bind to socket BSRSock with Tipc name sequence
+          TIPC Name:
+          <MDS-prefix, MDS_NODE_INFO_TYPE, 0>
+          TIPC Range:
+          <0,ROLE=0,POLICY=0,NODE_VERSION > to
+          <0,ROLE=0,POLICY=0,NODE_VERSION >
+        */
+       struct sockaddr_tipc server_addr;
+       uint32_t server_type = 0, server_inst = 0;
+
+       memset(&server_addr, 0, sizeof(server_addr));
+       server_addr.family = AF_TIPC;
+
+       server_addr.addrtype = TIPC_ADDR_NAMESEQ;
+
+       server_type = server_type | MDS_TIPC_PREFIX | MDS_NODE_INFO_TYPE;
+       server_inst |= MDS_NODE_VERSION;
+
+       server_addr.addr.nameseq.type = server_type;
+       server_addr.addr.nameseq.lower = server_inst;
+       server_addr.addr.nameseq.upper = server_inst;
+       server_addr.scope = TIPC_CLUSTER_SCOPE;
+
+       if (0 != bind(tipc_cb.BSRsock, (struct sockaddr *)&server_addr, 
sizeof(server_addr))) {
+               m_MDS_LOG_ERR("MDTM: MDS-NODE-INFO-INSTALL Failure err :%s\n", 
strerror(errno));
+               return NCSCC_RC_FAILURE;
+       }
+       return NCSCC_RC_SUCCESS;
+}
+
+/*********************************************************
+ 
+  Function NAME: mds_mdtm_node_info_subscribe_tipc 
+ 
+  DESCRIPTION:
+ 
+  ARGUMENTS:
+ 
+  RETURNS:  1 - NCSCC_RC_SUCCESS
+            2 - NCSCC_RC_FAILURE
+ 
+*********************************************************/
+uint32_t mds_mdtm_node_info_subscribe_tipc(MDS_SUBTN_REF_VAL *subtn_ref_val)
+{
+       /*
+          STEP 1: Subscribe to socket DSock with Tipc name sequence
+          TIPC Name:
+          <MDS-prefix, VDEST_INST_TYPE, 0>
+          TIPC Range:
+          <0,ROLE=0,POLICY=0,VDEST_ID > to
+          <0,ROLE=0,POLICY=0,VDEST_ID >
+        */
+
+       uint32_t inst = 0, server_type = 0;
+       struct tipc_subscr subscr;
+
+       if (num_subscriptions > MAX_SUBSCRIPTIONS) {
+               m_MDS_LOG_ERR("MDTM: SYSTEM CRITICAL Crossing =%d 
subscriptions\n", num_subscriptions);
+               if (num_subscriptions > MAX_SUBSCRIPTIONS_RETURN_ERROR) {
+                       m_MDS_LOG_ERR
+                               ("MDTM: SYSTEM has crossed the max =%d 
subscriptions , Returning failure to the user",
+                                MAX_SUBSCRIPTIONS_RETURN_ERROR);
+                       return NCSCC_RC_FAILURE;
+               }
+       }
+
+       server_type = server_type | MDS_TIPC_PREFIX | MDS_NODE_INFO_TYPE;
+       inst |= MDS_NODE_VERSION;
+       memset(&subscr, 0, sizeof(subscr));
+       subscr.seq.type = HTONL(server_type);
+       subscr.seq.lower = HTONL(inst);
+       subscr.seq.upper = HTONL(inst);
+       subscr.timeout = HTONL(FOREVER);
+       subscr.filter = HTONL(TIPC_SUB_PORTS);
+       *subtn_ref_val = 0;
+       *subtn_ref_val = ++handle;
+       *((uint64_t *)subscr.usr_handle) = *subtn_ref_val;
+
+       if (send(tipc_cb.Dsock, &subscr, sizeof(subscr), 0) != sizeof(subscr)) {
+               m_MDS_LOG_ERR("MDTM: MDS-NODE-INFO-SUBSCRIBE Failure\n");
+               return NCSCC_RC_FAILURE;
+       }
+       ++num_subscriptions;
+
+       return NCSCC_RC_SUCCESS;
+}
+
+/*********************************************************
 
   Function NAME: mds_mdtm_node_subscribe_tipc
 
@@ -2034,12 +2189,32 @@ uint32_t mds_mdtm_send_tipc(MDTM_SEND_RE
                        {
                                uint32_t len = 0;
                                len = m_MMGR_LINK_DATA_LEN(usrbuf);     /* 
Getting total len */
-
-                               m_MDS_LOG_INFO("MDTM: User Sending Data 
lenght=%d Fr_svc=%d to_svc=%d\n", len,
-                                              req->src_svc_id, 
req->dest_svc_id);
-
-                               if (len > MDTM_NORMAL_MSG_FRAG_SIZE) {
-                                       /* Packet needs to be fragmented and 
send */
+                               /* To support in-service Upgrade issue  
MDTM_NORMAL_MSG_FRAG_SIZE_MIN
+                                  is provide, and this fragment size is used 
to send to previous version of Opensaf Node
+                                  while  in-service Upgrade.
+
+                                  In the previous releases of Opensaf the 
value of TIPC  inbuf size of
+                                  MDTM_RECV_BUFFER_SIZE (mds_dt_tipc.c) TIPC 
was limited to(8000+MDS header) ,
+                                  we have in-service Upgrade issue, so it is 
not possible to send the new
+                                  MDS_DIRECT_BUF_MAXSIZE (65535 maximum packet 
size)-(56 MDS header)
+                                  value previous Opensaf version nodes ,  so 
for the current release it is limited to 8000,
+                                  possibly adjust this in the future Opensaf 
releases to MDS_DIRECT_BUF_MAXSIZE.
+
+                                  IMP TCP Note : Their is NO issue with TCP 
in-service Upgrade  ,The value of
+                                  SO_RCVBUF & SO_SNDBUF of  TCP sockets was 
set to 64000 ( MDS_SND_RCV_SIZE)
+                                  using setsockopt()  ,the kernel doubles this 
value ,and this doubled value is returned  by
+                                  getsockopt(). So 
MDTM_NORMAL_MSG_FRAG_SIZE_MAX size is used to send for
+                                  for both  previous & current versitions of 
Opensaf nodes which are using MDS TCP as transport*/
+                               if (len > MDTM_NORMAL_MSG_FRAG_SIZE_MIN) {
+                                       if 
(mds_node_tbl_query(m_MDS_GET_NODE_ID_FROM_ADEST(req->adest)) != 
NCSCC_RC_SUCCESS) {
+                                               msg_frag_size = 
MDTM_NORMAL_MSG_FRAG_SIZE_MIN;
+                                               max_send_pkt_size = 
(MDTM_NORMAL_MSG_FRAG_SIZE_MIN+SUM_MDS_HDR_PLUS_MDTM_HDR_PLUS_LEN);
+                                               m_MDS_LOG_DBG("MDTM:Sending  
message TO node_id=%d with msg_frag_size = %d max_send_pkt_size = %d",
+                                                               
m_MDS_GET_NODE_ID_FROM_ADEST(req->adest), msg_frag_size, max_send_pkt_size);
+                                       }
+                               }
+                                        
+                               if (len > msg_frag_size) {
                                        status = mdtm_frag_and_send(req, 
frag_seq_num, tipc_id);
                                        return status;
 
@@ -2155,7 +2330,6 @@ uint32_t mds_mdtm_send_tipc(MDTM_SEND_RE
             2 - NCSCC_RC_FAILURE
 
 *********************************************************/
-#define MDTM_MAX_SEND_PKT_SIZE   
(MDTM_NORMAL_MSG_FRAG_SIZE+SUM_MDS_HDR_PLUS_MDTM_HDR_PLUS_LEN)        /* 
Includes the 30 header bytes(2+8+20) */
 
 #ifdef MDS_CHECKSUM_ENABLE_FLAG
 #define MDTM_FRAG_HDR_PLUS_LEN_2   13
@@ -2187,22 +2361,22 @@ uint32_t mdtm_frag_and_send(MDTM_SEND_RE
 
        len = m_MMGR_LINK_DATA_LEN(usrbuf);     /* Getting total len */
 
-       if (len > (32767 * MDTM_NORMAL_MSG_FRAG_SIZE)) {        /* We have 15 
bits for frag number so 2( pow 15) -1=32767 */
+       if (len > (32767 * MDTM_NORMAL_MSG_FRAG_SIZE_MAX)) {    /* We have 15 
bits for frag number so 2( pow 15) -1=32767 */
                m_MDS_LOG_CRITICAL
                    ("MDTM: App. is trying to send data more than MDTM Can 
fragment and send, Max size is =%d\n",
-                    32767 * MDTM_NORMAL_MSG_FRAG_SIZE);
+                    32767 * MDTM_NORMAL_MSG_FRAG_SIZE_MAX);
                m_MMGR_FREE_BUFR_LIST(usrbuf);
                return NCSCC_RC_FAILURE;
        }
 
        while (len != 0) {
-               if (len > MDTM_NORMAL_MSG_FRAG_SIZE) {
+               if (len > msg_frag_size) {
                        if (i == 1) {
-                               len_buf = MDTM_MAX_SEND_PKT_SIZE;
+                               len_buf = max_send_pkt_size;
                                frag_val = MORE_FRAG_BIT | i;
                        } else {
-                               if ((len + MDTM_FRAG_HDR_PLUS_LEN_2) > 
MDTM_MAX_SEND_PKT_SIZE) {
-                                       len_buf = MDTM_MAX_SEND_PKT_SIZE;
+                               if ((len + MDTM_FRAG_HDR_PLUS_LEN_2) > 
max_send_pkt_size) {
+                                       len_buf = max_send_pkt_size;
                                        frag_val = MORE_FRAG_BIT | i;
                                } else {
                                        len_buf = len + 
MDTM_FRAG_HDR_PLUS_LEN_2;
diff --git a/osaf/libs/core/mds/mds_dt_trans.c 
b/osaf/libs/core/mds/mds_dt_trans.c
--- a/osaf/libs/core/mds/mds_dt_trans.c
+++ b/osaf/libs/core/mds/mds_dt_trans.c
@@ -41,7 +41,7 @@
 
 #define SUM_MDS_HDR_PLUS_MDTM_HDR_PLUS_LEN_TCP ((2 + MDS_SEND_ADDRINFO_TCP + 
MDTM_FRAG_HDR_LEN_TCP + MDS_HDR_LEN_TCP))
 
-#define MDTM_MAX_SEND_PKT_SIZE_TCP   
(MDTM_NORMAL_MSG_FRAG_SIZE+SUM_MDS_HDR_PLUS_MDTM_HDR_PLUS_LEN_TCP)        /* 
Includes the 30 header bytes(2+8+20) */
+#define MDTM_MAX_SEND_PKT_SIZE_TCP   
(MDTM_NORMAL_MSG_FRAG_SIZE_MAX+SUM_MDS_HDR_PLUS_MDTM_HDR_PLUS_LEN_TCP)    /* 
Includes the 30 header bytes(2+8+20) */
 
 uint32_t mdtm_global_frag_num_tcp;
 extern struct pollfd pfd[2];
@@ -363,16 +363,16 @@ static uint32_t mdtm_frag_and_send_tcp(M
 
        len = m_MMGR_LINK_DATA_LEN(usrbuf);     /* Getting total len */
 
-       if (len > (32767 * MDTM_NORMAL_MSG_FRAG_SIZE)) {        /* We have 15 
bits for frag number so 2( pow 15) -1=32767 */
+       if (len > (32767 * MDTM_NORMAL_MSG_FRAG_SIZE_MAX)) {    /* We have 15 
bits for frag number so 2( pow 15) -1=32767 */
                m_MDS_LOG_CRITICAL
                    ("MDTM: App. is trying to send data more than MDTM Can 
fragment and send, Max size is =%d\n",
-                    32767 * MDTM_NORMAL_MSG_FRAG_SIZE);
+                    32767 * MDTM_NORMAL_MSG_FRAG_SIZE_MAX);
                m_MMGR_FREE_BUFR_LIST(usrbuf);
                return NCSCC_RC_FAILURE;
        }
 
        while (len != 0) {
-               if (len > MDTM_NORMAL_MSG_FRAG_SIZE) {
+               if (len > MDTM_NORMAL_MSG_FRAG_SIZE_MAX) {
                        if (i == 1) {
                                len_buf = MDTM_MAX_SEND_PKT_SIZE_TCP;
                                frag_val = MORE_FRAG_BIT | i;
@@ -551,8 +551,12 @@ uint32_t mds_mdtm_send_tcp(MDTM_SEND_REQ
 
                                m_MDS_LOG_INFO("MDTM: User Sending Data 
lenght=%d Fr_svc=%d to_svc=%d\n", len,
                                               req->src_svc_id, 
req->dest_svc_id);
-
-                               if (len > MDTM_NORMAL_MSG_FRAG_SIZE) {
+                               /*Their is NO implication on TCP in-service 
Upgrade  because of
+                                 MDTM_NORMAL_MSG_FRAG_SIZE_MAX (65535 maximum 
packet size)-(56 MDS header)  change ,
+                                 The value of SO_RCVBUF & SO_SNDBUF of  TCP 
sockets was set to 64000 ( MDS_SND_RCV_SIZE)
+                                 using setsockopt()  ,the kernel doubles this 
value ,and this doubled value is returned  by
+                                 getsockopt().*/
+                               if (len > MDTM_NORMAL_MSG_FRAG_SIZE_MAX) {
                                        /* Packet needs to be fragmented and 
send */
                                        status = mdtm_frag_and_send_tcp(req, 
frag_seq_num, id);
                                        return status;
@@ -678,7 +682,7 @@ void mdtm_process_poll_recv_data_tcp(voi
                        /* Receive all incoming data on this socket */
                        
/*******************************************************/
 
-                       recd_bytes = recv(tcp_cb->DBSRsock, tcp_cb->len_buff, 
2, 0);
+                       recd_bytes = recv(tcp_cb->DBSRsock, tcp_cb->len_buff, 
2, MSG_NOSIGNAL);
                        if (0 == recd_bytes) {
                                LOG_ER("MDTM:socket_recv() = %d, conn lost with 
dh server, exiting library err :%s", recd_bytes, strerror(errno));
                                close(tcp_cb->DBSRsock);

------------------------------------------------------------------------------
WatchGuard Dimension instantly turns raw network data into actionable 
security intelligence. It gives you real-time visual feedback on key
security issues and trends.  Skip the complicated setup - simply import
a virtual appliance and go from zero to informed in seconds.
http://pubads.g.doubleclick.net/gampad/clk?id=123612991&iu=/4140/ostg.clktrk
_______________________________________________
Opensaf-devel mailing list
Opensaf-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to