Hi All,

Please provide comment by EOD, I planning to push  [PATCH 1 of 3] &   
[PATCH 2 of 3] by tomorrow.
and planning to attache  [PATCH 3 of 3] to #851 ticket for future use.

-AVM
On 8/7/2014 2:05 PM, mahesh.va...@oracle.com wrote:
>   osaf/libs/core/mds/include/mds_core.h |    4 +
>   osaf/libs/core/mds/mds_c_api.c        |   19 ++++-
>   osaf/libs/core/mds/mds_c_sndrcv.c     |  117 
> +++++++++++++++++++++------------
>   osaf/libs/core/mds/mds_dt_tipc.c      |   69 ++++++++++++++++++-
>   osaf/libs/core/mds/mds_main.c         |    2 +-
>   5 files changed, 159 insertions(+), 52 deletions(-)
>
>
> Brief note on Multicast Enhancement Ticket:
> ------------------------------------------------------------------------------------
> Currently Opensaf Broadcast message was implemented as multiple
> unicasts (that means Broadcast message was reaching N nodes
> in T-1 to T-N time based on the number of nodes) ,after the
> ticket #851 changes , the Opensaf Broadcast message will be utilizing
> TIPC Multicast , that means message may reach T-1 time irrelevant
> of number of nodes in the cluster.
>
> This Enhancement of TIPC multicast make sure  or  receives
> broadcast message at same instant of Time . So this enhancement provides
> an improvement of  node cluster or node cluster should take same
> bring up time ,and it also eliminate timing issue that were facing because 
> multiple
> unicasts.
>
> But it also improves load time and sync time because of reduced
> unnecessary load to the sending process.
>
> Code changes :
> ------------------------------------------------------------------------------------
> - The Code changes are only effects to MDS TIPC transport , NO Changes
>    in MDS TCP transport .This change are with in-service upgrade support.
>
> - Now the MDS TIPC transport sendto() for SENDTYPE BCAST & RBCAST
>    addrtype is TIPC_ADDR_MCAST.
>
> - A single multicast message can accommodate max of
>    MDS_DIRECT_BUF_MAXSIZE (2^16).
>
> - MDS_SVC_INFO structure has a new variable  ,
>    which maintains count of previous Opensaf version subscribers count for 
> this service.
>
>    a subscribe/unsubscribe of previous Opensaf version service for this 
> service.
>
> - If the  count is ZERO means all are nodes in the
>    cluster has new version Opensaf
>
> - If the  count is grater than ZERO means nodes in
>    the cluster has both old and new version Opensaf.
>
> - If the  count is ZERO the SENDTYPE BCAST &
>    RBCAST messages will be sent as TIPC Multicast and this is at service 
> level.
>
> - If the  count is grater than ZERO SENDTYPE BCAST
>    & RBCAST messages will be sent as previous multiple unicasts and this is 
> at service level.
>
> Opensaf Services Code Tuning :
> ------------------------------------------------------------------------------------
> While adopting new Multicast messaging I came across following Opensaf
> integration issue in very complex test cases ,in n normal conditions/use case
> these issue may not occur.
>
> But I have created ticket for all of the so these tickets required to
> be fixed to Multicast to work with out any issues even in complex conditions.
>
>      1. https://sourceforge.net/p/opensaf/tickets/952/
>      2. https://sourceforge.net/p/opensaf/tickets/953/
>      3. https://sourceforge.net/p/opensaf/tickets/954/
>      4. https://sourceforge.net/p/opensaf/tickets/955/
>      5. https://sourceforge.net/p/opensaf/tickets/946/
>
> 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
> @@ -184,6 +184,10 @@ typedef struct mds_subscription_info {
>       bool tmr_flag;  /* Flag = Y/N */
>       tmr_t discovery_tmr;    /* Timer Cb */
>       MDS_AWAIT_DISC_QUEUE *await_disc_queue; /* Msg + Svc_hdl */
> +     /*Previous version subscriptions count
> +       this is Mcast or Bcast differentiators if conut is ZERO mcast else
> +       count is grater than ZERO bcast (multi-unicast) */    
> +     uint32_t prev_ver_sub_count;
>   
>   } MDS_SUBSCRIPTION_INFO;
>   
> 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
> @@ -2686,7 +2686,7 @@ else (entry exists)
>                       status = mds_mcm_user_event_callback(local_svc_hdl, 
> pwe_id, svc_id,
>                                                            role, vdest_id, 
> adest,
>                                                            NCSMDS_DOWN,
> -                                                          svc_sub_part_ver, 
> MDS_SVC_ARCHWORD_TYPE_UNSPECIFIED);
> +                                                          svc_sub_part_ver, 
> archword_type);
>   
>                       if (status != NCSCC_RC_SUCCESS) {
>                               /* Callback failure */
> @@ -2785,7 +2785,7 @@ else (entry exists)
>                                                       {
>                                                               /* No other 
> adest exists for this svc_id, Call user callback DOWN */
>                                                               status = 
> mds_mcm_user_event_callback(local_svc_hdl, pwe_id, svc_id, role, vdest_id, 0,
> -                                                                             
> NCSMDS_DOWN, svc_sub_part_ver, MDS_SVC_ARCHWORD_TYPE_UNSPECIFIED);
> +                                                                             
> NCSMDS_DOWN, svc_sub_part_ver, archword_type);
>                                                       }
>                                               }
>                                       } else {        /* vdest_policy == 
> NCS_VDEST_TYPE_N_WAY_ROUND_ROBIN */
> @@ -3280,7 +3280,20 @@ uint32_t mds_mcm_user_event_callback(MDS
>                             svc_id);
>               return NCSCC_RC_FAILURE;
>       }
> -
> +     /* if previous MDS version subscriptions  increment or decrement count 
> on NCSMDS_UP/DOWN event ,
> +        this is Mcast or Bcast differentiators if conut is ZERO mcast else 
> count is grater than ZERO bcast (multi-unicast) */
> +     if ((archword_type & 0x7) < 1) {
> +             if (event_type == NCSMDS_UP) {
> +                     local_svc_info->subtn_info->prev_ver_sub_count++;
> +                     m_MDS_LOG_DBG("MDTM: NCSMDS_UP for SVC id :%d, archword 
> :%d ,prev_ver_sub_count %u",
> +                                     svc_id, archword_type, 
> local_svc_info->subtn_info->prev_ver_sub_count);
> +             } else if (event_type == NCSMDS_DOWN) {
> +                     if (local_svc_info->subtn_info->prev_ver_sub_count > 0) 
>                 
> +                             
> local_svc_info->subtn_info->prev_ver_sub_count--;
> +                     m_MDS_LOG_DBG("MDTM: NCSMDS_DOWN for SVC id :%d, 
> archword :%d ,prev_ver_sub_count %u",
> +                                     svc_id, archword_type, 
> local_svc_info->subtn_info->prev_ver_sub_count);
> +             }
> +     }
>       /* Get Subtn info */
>       mds_subtn_tbl_get(local_svc_hdl, svc_id, &local_subtn_info);
>       /* If this function returns failure, then its invalid state. Handling 
> required */
> 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
> @@ -46,9 +46,10 @@
>   #include "ncssysf_mem.h"
>   #include "osaf_utility.h"
>   #include "osaf_poll.h"
> +#include "mds_dt.h"
>   
>   uint32_t mds_mcm_global_exchange_id = 0;
> -
> +extern char *tipc_or_tcp;
>   #define SUCCESS 0
>   #define FAILURE 1
>   
> @@ -1344,34 +1345,36 @@ static uint32_t mcm_msg_encode_full_or_f
>       MDTM_SEND_REQ msg_send;
>       MDS_BCAST_BUFF_LIST *bcast_ptr = NULL;
>       MDS_SUBSCRIPTION_RESULTS_INFO *lcl_subtn_res = NULL;
> -
>       memset(&msg_send, 0, sizeof(msg_send));
>   
> -     m_MDS_LOG_DBG("MDS_SND_RCV : Entering 
> mcm_msg_encode_full_or_flat_and_send\n");
> -
> -     /* The following is for the bcast case, where once enc or enc_flat 
> callback is called, those callbacks
> -        shallnot be called again.  */
> -     if ((snd_type == MDS_SENDTYPE_BCAST) || (snd_type == 
> MDS_SENDTYPE_RBCAST)) {
> -             if (to == DESTINATION_ON_NODE) {
> -                     if (NCSCC_RC_SUCCESS ==
> -                         (mds_mcm_search_bcast_list
> -                          (to_msg, BCAST_ENC_FLAT, 
> to_msg->rem_svc_sub_part_ver, to_msg->rem_svc_arch_word,
> -                           &bcast_ptr, 1))) {
> -                             msg_send.msg.encoding = MDS_ENC_TYPE_FLAT;
> -                             msg_send.msg.data.fullenc_uba.start = 
> m_MMGR_DITTO_BUFR(bcast_ptr->bcast_enc_flat);
> -                             msg_send.msg_fmt_ver = bcast_ptr->msg_fmt_ver;
> -                             goto BY_PASS;
> -                     }
> -             } else if (to == DESTINATION_OFF_NODE) {
> -                     if (NCSCC_RC_SUCCESS ==
> -                         (mds_mcm_search_bcast_list
> -                          (to_msg, BCAST_ENC, to_msg->rem_svc_sub_part_ver, 
> to_msg->rem_svc_arch_word, &bcast_ptr,
> -                           1))) {
> -                             msg_send.msg.encoding = MDS_ENC_TYPE_FULL;
> -                             msg_send.msg.data.fullenc_uba.start = 
> m_MMGR_DITTO_BUFR(bcast_ptr->bcast_enc);
> -                             msg_send.msg_fmt_ver = bcast_ptr->msg_fmt_ver;
> -                             msg_send.msg_arch_word = 
> bcast_ptr->rem_svc_arch_word;
> -                             goto BY_PASS;
> +     m_MDS_LOG_DBG("MDS_SND_RCV : Entering 
> mcm_msg_encode_full_or_flat_and_send prev_ver_sub_count :%d \n",
> +                     svc_cb->subtn_info->prev_ver_sub_count);
> +
> +     if ((svc_cb->subtn_info->prev_ver_sub_count > 0) || 
> (strcmp(tipc_or_tcp, "TCP") == 0)) {
> +             /* The following is for the bcast case, where once enc or 
> enc_flat callback is called, those callbacks
> +                shallnot be called again.  */
> +             if ((snd_type == MDS_SENDTYPE_BCAST) || (snd_type == 
> MDS_SENDTYPE_RBCAST)) {
> +                     if (to == DESTINATION_ON_NODE) {
> +                             if (NCSCC_RC_SUCCESS ==
> +                                             (mds_mcm_search_bcast_list
> +                                              (to_msg, BCAST_ENC_FLAT, 
> to_msg->rem_svc_sub_part_ver, to_msg->rem_svc_arch_word,
> +                                               &bcast_ptr, 1))) {
> +                                     msg_send.msg.encoding = 
> MDS_ENC_TYPE_FLAT;
> +                                     msg_send.msg.data.fullenc_uba.start = 
> m_MMGR_DITTO_BUFR(bcast_ptr->bcast_enc_flat);
> +                                     msg_send.msg_fmt_ver = 
> bcast_ptr->msg_fmt_ver;
> +                                     goto BY_PASS;
> +                             }
> +                     } else if (to == DESTINATION_OFF_NODE) {
> +                             if (NCSCC_RC_SUCCESS ==
> +                                             (mds_mcm_search_bcast_list
> +                                              (to_msg, BCAST_ENC, 
> to_msg->rem_svc_sub_part_ver, to_msg->rem_svc_arch_word, &bcast_ptr,
> +                                               1))) {
> +                                     msg_send.msg.encoding = 
> MDS_ENC_TYPE_FULL;
> +                                     msg_send.msg.data.fullenc_uba.start = 
> m_MMGR_DITTO_BUFR(bcast_ptr->bcast_enc);
> +                                     msg_send.msg_fmt_ver = 
> bcast_ptr->msg_fmt_ver;
> +                                     msg_send.msg_arch_word = 
> bcast_ptr->rem_svc_arch_word;
> +                                     goto BY_PASS;
> +                             }
>                       }
>               }
>       }
> @@ -1437,12 +1440,14 @@ static uint32_t mcm_msg_encode_full_or_f
>                       m_MDS_LOG_DBG("MDS_SND_RCV : Leaving 
> mcm_msg_encode_full_or_flat_and_send\n");
>                       return NCSCC_RC_FAILURE;
>               } else if ((snd_type == MDS_SENDTYPE_BCAST) || (snd_type == 
> MDS_SENDTYPE_RBCAST)) {
> -                     if (NCSCC_RC_FAILURE ==
> -                         mds_mcm_add_bcast_list(to_msg, BCAST_ENC, 
> msg_send.msg.data.fullenc_uba.start,
> -                                                
> to_msg->rem_svc_sub_part_ver, cbinfo.info.enc.o_msg_fmt_ver,
> -                                                to_msg->rem_svc_arch_word)) {
> -                             m_MDS_LOG_ERR("MDS_C_SNDRCV: Addition to bcast 
> list failed in enc case");
> -                             return NCSCC_RC_FAILURE;
> +                     if ((svc_cb->subtn_info->prev_ver_sub_count > 0) || 
> (strcmp(tipc_or_tcp, "TCP") == 0)) {
> +                             if (NCSCC_RC_FAILURE ==
> +                                             mds_mcm_add_bcast_list(to_msg, 
> BCAST_ENC, msg_send.msg.data.fullenc_uba.start,
> +                                                     
> to_msg->rem_svc_sub_part_ver, cbinfo.info.enc.o_msg_fmt_ver,
> +                                                     
> to_msg->rem_svc_arch_word)) {
> +                                     m_MDS_LOG_ERR("MDS_C_SNDRCV: Addition 
> to bcast list failed in enc case");
> +                                     return NCSCC_RC_FAILURE;
> +                             }
>                       }
>               }
>       } else {
> @@ -1452,12 +1457,14 @@ static uint32_t mcm_msg_encode_full_or_f
>                       m_MDS_LOG_DBG("MDS_SND_RCV : Leaving 
> mcm_msg_encode_full_or_flat_and_send\n");
>                       return NCSCC_RC_FAILURE;
>               } else if ((snd_type == MDS_SENDTYPE_BCAST) || (snd_type == 
> MDS_SENDTYPE_RBCAST)) {
> -                     if (NCSCC_RC_FAILURE ==
> -                         mds_mcm_add_bcast_list(to_msg, BCAST_ENC_FLAT, 
> msg_send.msg.data.flat_uba.start,
> -                                                
> to_msg->rem_svc_sub_part_ver, cbinfo.info.enc_flat.o_msg_fmt_ver,
> -                                                to_msg->rem_svc_arch_word)) {
> -                             m_MDS_LOG_ERR("MDS_C_SNDRCV: Addition to bcast 
> list failed in enc_flat case");
> -                             return NCSCC_RC_FAILURE;
> +                     if ((svc_cb->subtn_info->prev_ver_sub_count > 0) || 
> (strcmp(tipc_or_tcp, "TCP") == 0)) {
> +                             if (NCSCC_RC_FAILURE ==
> +                                             mds_mcm_add_bcast_list(to_msg, 
> BCAST_ENC_FLAT, msg_send.msg.data.flat_uba.start,
> +                                                     
> to_msg->rem_svc_sub_part_ver, cbinfo.info.enc_flat.o_msg_fmt_ver,
> +                                                     
> to_msg->rem_svc_arch_word)) {
> +                                     m_MDS_LOG_ERR("MDS_C_SNDRCV: Addition 
> to bcast list failed in enc_flat case");
> +                                     return NCSCC_RC_FAILURE;
> +                             }
>                       }
>               }
>       }
> @@ -1470,6 +1477,8 @@ static uint32_t mcm_msg_encode_full_or_f
>       /* Get the destination sub res table entry and fill the send cnt */
>       mds_get_subtn_res_tbl_by_adest(svc_cb->svc_hdl, to_svc_id,
>                       dest_vdest_id, adest, &lcl_subtn_res);
> +                     
> +
>       msg_send.svc_seq_num = lcl_subtn_res->msg_snd_cnt++;
>       msg_send.src_svc_id = svc_cb->svc_id;
>       msg_send.src_pwe_id = m_MDS_GET_PWE_ID_FROM_SVC_HDL(svc_cb->svc_hdl);
> @@ -1483,7 +1492,16 @@ static uint32_t mcm_msg_encode_full_or_f
>       msg_send.dest_pwe_id = m_MDS_GET_PWE_ID_FROM_SVC_HDL(svc_cb->svc_hdl);
>       msg_send.dest_vdest_id = dest_vdest_id;
>       msg_send.src_svc_sub_part_ver = svc_cb->svc_sub_part_ver;
> -     msg_send.msg_arch_word = to_msg->rem_svc_arch_word;
> +
> +     if ((((svc_cb->subtn_info->prev_ver_sub_count > 0))
> +                             && (snd_type == MDS_SENDTYPE_BCAST || snd_type 
> == MDS_SENDTYPE_RBCAST))
> +                     && (strcmp(tipc_or_tcp, "TIPC") == 0)){
> +             /* Mark as Previous version arch_word */
> +             msg_send.msg_arch_word = ((to_msg->rem_svc_arch_word) & 0x8);
> +     } else {
> +             msg_send.msg_arch_word = to_msg->rem_svc_arch_word;
> +     }
> +
>       if (msg_send.msg.encoding == MDS_ENC_TYPE_FULL) {
>               if (NULL == bcast_ptr) {
>                       msg_send.msg_fmt_ver = cbinfo.info.enc.o_msg_fmt_ver;
> @@ -3742,6 +3760,8 @@ static uint32_t mcm_pvt_process_svc_bcas
>       MDS_SUBSCRIPTION_INFO *sub_info = NULL; /* Subscription info */
>       MDS_SUBSCRIPTION_RESULTS_INFO *info_result = NULL;
>       uint8_t to;
> +     uint32_t status = 0;
> +
>   
>       if (to_msg.msg_type == MSG_NCSCONTEXT) {
>               if (to_msg.data.msg == NULL) {
> @@ -3794,6 +3814,8 @@ static uint32_t mcm_pvt_process_svc_bcas
>               }
>       }
>   
> +
> +
>       /* Get each destination and send */
>       while (1) {
>               if (flag == 0) {
> @@ -3851,8 +3873,19 @@ static uint32_t mcm_pvt_process_svc_bcas
>                       }
>               }
>   
> -             mds_mcm_send_msg_enc(to, svc_cb, &to_msg, to_svc_id, 
> info_result->key.vdest_id,
> -                                  req, 0, info_result->key.adest, pri);
> +             status = mds_mcm_send_msg_enc(to, svc_cb, &to_msg, to_svc_id, 
> info_result->key.vdest_id,
> +                             req, 0, info_result->key.adest, pri);
> +             if ((svc_cb->subtn_info->prev_ver_sub_count == 0) && 
> (strcmp(tipc_or_tcp, "TIPC") == 0)) {
> +                     m_MDS_LOG_DBG("MDTM: Break while(1) prev_ver_sub_count: 
> %d  SVCid =%d  data.len: %d ",
> +                                     svc_cb->subtn_info->prev_ver_sub_count,
> +                                     
> m_MDS_GET_SVC_ID_FROM_SVC_HDL(svc_cb->svc_hdl), to_msg.data.info.len);  
> +                     if (status == NCSCC_RC_SUCCESS) {
> +                             /* Break after one successful Mcast message */
> +                             break;
> +                     }
> +                     else
> +                             m_MDS_LOG_ERR("MDTM:Continue while(1) status = 
> mds_mcm_send_msg_enc = NCSCC_RC_FAILURE");
> +             }
>       }                       /* While Loop */
>   
>   #if 1
> 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
> @@ -38,6 +38,7 @@
>   #include <unistd.h>
>   #include <fcntl.h>
>   #include "mds_dt_tipc.h"
> +#include "mds_dt_tcp_disc.h"
>   #include "mds_core.h"
>   #include "osaf_utility.h"
>   
> @@ -92,6 +93,7 @@ uint32_t mds_mdtm_send_tipc(MDTM_SEND_RE
>   
>   /* Tipc actual send, can be made as Macro even*/
>   static uint32_t mdtm_sendto(uint8_t *buffer, uint16_t buff_len, struct 
> tipc_portid tipc_id);
> +static uint32_t mdtm_mcast_sendto(void *buffer, size_t size, const 
> MDTM_SEND_REQ *req);
>   
>   uint32_t mdtm_frag_and_send(MDTM_SEND_REQ *req, uint32_t seq_num, struct 
> tipc_portid id, int frag_size);
>   
> @@ -2035,7 +2037,11 @@ uint32_t mds_mdtm_send_tipc(MDTM_SEND_RE
>                                       frag_size = MDTM_NORMAL_MSG_FRAG_SIZE;
>                               }
>   
> -                             if (len > frag_size) {
> +                             if ((len > frag_size) && (version == 0)) {
> +                                     /* Packet needs to be fragmented and 
> send */
> +                                     return mdtm_frag_and_send(req, 
> frag_seq_num, tipc_id, frag_size);
> +                             } else if ((len > frag_size) && (version > 0) 
> && (req->snd_type != MDS_SENDTYPE_RBCAST) &&
> +                                             (req->snd_type != 
> MDS_SENDTYPE_BCAST)) {
>                                       /* Packet needs to be fragmented and 
> send */
>                                       return mdtm_frag_and_send(req, 
> frag_seq_num, tipc_id, frag_size);
>                               } else {
> @@ -2066,11 +2072,28 @@ uint32_t mds_mdtm_send_tipc(MDTM_SEND_RE
>                                           ("MDTM:Sending message with Service 
> Seqno=%d, TO Dest_Tipc_id=<0x%08x:%u> ",
>                                            req->svc_seq_num, tipc_id.node, 
> tipc_id.ref);
>   
> -                                     if (NCSCC_RC_SUCCESS !=
> -                                         mdtm_sendto(body, (len + 
> SUM_MDS_HDR_PLUS_MDTM_HDR_PLUS_LEN), tipc_id)) {
> -                                             m_MDS_LOG_ERR("MDTM: Unable to 
> send the msg thru TIPC\n");
> -                                             m_MMGR_FREE_BUFR_LIST(usrbuf);
> -                                             return NCSCC_RC_FAILURE;
> +                                     len += 
> SUM_MDS_HDR_PLUS_MDTM_HDR_PLUS_LEN;
> +                                     if (((req->snd_type == 
> MDS_SENDTYPE_RBCAST) || (req->snd_type == MDS_SENDTYPE_BCAST)) &&
> +                                                     (version > 0)) {
> +                                             m_MDS_LOG_DBG("MDTM: User 
> Sending Multicast Data lenght=%d Fr_svc=%d to_svc=%d\n", len,
> +                                                             
> req->src_svc_id, req->dest_svc_id);
> +                                             if ( len > 
> MDS_DIRECT_BUF_MAXSIZE) {
> +                                                     
> m_MMGR_FREE_BUFR_LIST(usrbuf);
> +                                                     LOG_NO("MDTM: Not 
> possible to send size:%d TIPC multicast to svc_id: %d", len, 
> req->dest_svc_id);
> +                                                     return NCSCC_RC_FAILURE;
> +                                             }
> +                                             if (NCSCC_RC_SUCCESS != 
> mdtm_mcast_sendto(body, len, req)) {
> +                                                     m_MDS_LOG_ERR("MDTM: 
> Failed to send message Data lenght=%d Fr_svc=%d to_svc=%d err :%s",
> +                                                                     
> strerror(errno),len, req->src_svc_id, req->dest_svc_id);
> +                                                     
> m_MMGR_FREE_BUFR_LIST(usrbuf);
> +                                                     return NCSCC_RC_FAILURE;
> +                                             }
> +                                     } else {
> +                                             if (NCSCC_RC_SUCCESS != 
> mdtm_sendto(body, len, tipc_id)) {
> +                                                     m_MDS_LOG_ERR("MDTM: 
> Unable to send the msg thru TIPC\n");
> +                                                     
> m_MMGR_FREE_BUFR_LIST(usrbuf);
> +                                                     return NCSCC_RC_FAILURE;
> +                                             }
>                                       }
>                                       m_MMGR_FREE_BUFR_LIST(usrbuf);
>                                       return NCSCC_RC_SUCCESS;
> @@ -2347,6 +2370,40 @@ static uint32_t mdtm_sendto(uint8_t *buf
>       }
>   }
>   
> +/*********************************************************
> +
> +  Function NAME: mdtm_mcast_sendto
> +
> +  DESCRIPTION:
> +
> +  ARGUMENTS:
> +
> +  RETURNS:  1 - NCSCC_RC_SUCCESS
> +            2 - NCSCC_RC_FAILURE
> +
> +*********************************************************/
> +static uint32_t mdtm_mcast_sendto(void *buffer, size_t size, const 
> MDTM_SEND_REQ *req)
> +{
> +     struct sockaddr_tipc server_addr;
> +     memset(&server_addr, 0, sizeof(server_addr));
> +     server_addr.family = AF_TIPC;
> +     server_addr.addrtype = TIPC_ADDR_MCAST;
> +     server_addr.addr.nameseq.type = MDS_TIPC_PREFIX | MDS_SVC_INST_TYPE |
> +             (req->dest_pwe_id << MDS_EVENT_SHIFT_FOR_PWE) | 
> req->dest_svc_id;
> +     /*This can be scope-down to dest_svc_id  server_inst TBD*/
> +     server_addr.addr.nameseq.lower = HTONL(MDS_MDTM_LOWER_INSTANCE);
> +     /*This can be scope-down to dest_svc_id  server_inst TBD*/
> +     server_addr.addr.nameseq.upper = HTONL(MDS_MDTM_UPPER_INSTANCE);
> +
> +     int send_len = sendto(tipc_cb.BSRsock, buffer, size, 0,
> +                     (struct sockaddr *)&server_addr, sizeof(server_addr));
> +     if (send_len == size) {
> +             m_MDS_LOG_INFO("MDTM: Successfully sent message");
> +             return NCSCC_RC_SUCCESS;
> +     } else {
> +             return NCSCC_RC_FAILURE;
> +     }
> +}
>   
> /****************************************************************************
>    *
>    * Function Name: mdtm_add_mds_hdr
> diff --git a/osaf/libs/core/mds/mds_main.c b/osaf/libs/core/mds/mds_main.c
> --- a/osaf/libs/core/mds/mds_main.c
> +++ b/osaf/libs/core/mds/mds_main.c
> @@ -53,6 +53,7 @@
>   
>   extern uint32_t mds_socket_domain;
>   void mds_init_transport(void);
> +char *tipc_or_tcp = NULL;
>   
>   /* MDS Control Block */
>   MDS_MCM_CB *gl_mds_mcm_cb = NULL;
> @@ -362,7 +363,6 @@ uint32_t mds_lib_req(NCS_LIB_REQ_INFO *r
>   void mds_init_transport(void)
>   {
>   #ifdef ENABLE_TIPC_TRANSPORT
> -     char *tipc_or_tcp = NULL;
>       int rc;
>       struct stat sockStat;
>   
>
> ------------------------------------------------------------------------------
> Infragistics Professional
> Build stunning WinForms apps today!
> Reboot your WinForms applications with our WinForms controls.
> Build a bridge from your legacy apps to the future.
> http://pubads.g.doubleclick.net/gampad/clk?id=153845071&iu=/4140/ostg.clktrk
> _______________________________________________
> Opensaf-devel mailing list
> Opensaf-devel@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/opensaf-devel


------------------------------------------------------------------------------
_______________________________________________
Opensaf-devel mailing list
Opensaf-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to