osaf/libs/core/mbcsv/include/mbcsv_pwe_anc.h |   9 ++++++
 osaf/libs/core/mbcsv/mbcsv_mds.c             |   4 +-
 osaf/libs/core/mbcsv/mbcsv_peer.c            |  39 ++++++++++++++++++++++++++++
 osaf/libs/core/mbcsv/mbcsv_pwe_anc.c         |   9 ------
 4 files changed, 50 insertions(+), 11 deletions(-)


When the mbcsv message peer info messages arrives faster than RED_UP messages,
then the problem described in the ticket will occur.

Postpone/repost the peer messages if RED_UP event does not arrive.

diff --git a/osaf/libs/core/mbcsv/include/mbcsv_pwe_anc.h 
b/osaf/libs/core/mbcsv/include/mbcsv_pwe_anc.h
--- a/osaf/libs/core/mbcsv/include/mbcsv_pwe_anc.h
+++ b/osaf/libs/core/mbcsv/include/mbcsv_pwe_anc.h
@@ -38,6 +38,15 @@
 #include "mbcsv.h"
 
 /*
+ * Peer list used for storing all the peers of this PWE. This is used
+ * for brodcasting the message to all the peers.
+ */
+typedef struct {
+        uint32_t pwe_hdl;               /* Handle supplied by application with 
OPEN call */
+        MBCSV_ANCHOR anchor;
+} MBCSV_PEER_KEY;
+
+/*
  * Prototypes of PWE anchor.
  */
 uint32_t mbcsv_destroy_peer_list(void);
diff --git a/osaf/libs/core/mbcsv/mbcsv_mds.c b/osaf/libs/core/mbcsv/mbcsv_mds.c
--- a/osaf/libs/core/mbcsv/mbcsv_mds.c
+++ b/osaf/libs/core/mbcsv/mbcsv_mds.c
@@ -365,7 +365,7 @@ uint32_t mbcsv_mds_rcv(NCSMDS_CALLBACK_I
                msg->msg_type = MBCSV_EVT_INTERNAL;
 
                if (msg->info.peer_msg.type == MBCSV_EVT_INTERNAL_PEER_DISC) {
-                       send_pri = NCS_IPC_PRIORITY_VERY_HIGH;
+                       send_pri = NCS_IPC_PRIORITY_HIGH;
                } else
                        send_pri = NCS_IPC_PRIORITY_NORMAL;
 
@@ -453,7 +453,7 @@ uint32_t mbcsv_mds_evt(MDS_CALLBACK_SVC_
 
                evt->info.mds_sub_evt.evt_type = svc_info.i_change;
 
-               if (NCSCC_RC_SUCCESS != m_MBCSV_SND_MSG(&mbx, evt, 
NCS_IPC_PRIORITY_HIGH)) {
+               if (NCSCC_RC_SUCCESS != m_MBCSV_SND_MSG(&mbx, evt, 
NCS_IPC_PRIORITY_VERY_HIGH)) {
                        m_MMGR_FREE_MBCSV_EVT(evt);
                        TRACE_LEAVE2("ipc send failed");
                        return NCSCC_RC_FAILURE;
diff --git a/osaf/libs/core/mbcsv/mbcsv_peer.c 
b/osaf/libs/core/mbcsv/mbcsv_peer.c
--- a/osaf/libs/core/mbcsv/mbcsv_peer.c
+++ b/osaf/libs/core/mbcsv/mbcsv_peer.c
@@ -650,6 +650,10 @@ void mbcsv_set_peer_state(CKPT_INST *ckp
 uint32_t mbcsv_process_peer_up_info(MBCSV_EVT *msg, CKPT_INST *ckpt, uint8_t 
peer_up)
 {
        PEER_INST *peer;
+       MBCSV_PEER_KEY key;
+       SYSF_MBX mbx;
+       MBCSV_EVT *evt;
+
        TRACE_ENTER();
 
        /*
@@ -677,6 +681,41 @@ uint32_t mbcsv_process_peer_up_info(MBCS
                }
        }
 
+       if (0 != (mbx = mbcsv_get_mbx(msg->rcvr_peer_key.pwe_hdl, 
msg->rcvr_peer_key.svc_id))) {
+
+               memset(&key, '\0', sizeof(MBCSV_PEER_KEY));
+               key.pwe_hdl = msg->rcvr_peer_key.pwe_hdl;
+               key.anchor = msg->rcvr_peer_key.peer_anchor;
+
+               m_NCS_LOCK(&mbcsv_cb.peer_list_lock, NCS_LOCK_WRITE);
+
+               if (NULL == ncs_patricia_tree_get(&mbcsv_cb.peer_list, (const 
uint8_t *)&key)) {
+
+                       if (NULL == (evt = m_MMGR_ALLOC_MBCSV_EVT)) {
+                               TRACE_LEAVE2("malloc failed");
+                               m_NCS_UNLOCK(&mbcsv_cb.peer_list_lock, 
NCS_LOCK_WRITE);
+                               return NCSCC_RC_FAILURE;
+                       }
+
+                       memset(evt, '\0', sizeof(MBCSV_EVT));
+                       memcpy(evt, msg, sizeof(MBCSV_EVT));
+
+                       TRACE_4("Still RED_UP event not arrived of the peer");
+
+                       /* Again post the event, till RED_UP event arrives */
+                       if (NCSCC_RC_SUCCESS != m_MBCSV_SND_MSG(&mbx, evt, 
NCS_IPC_PRIORITY_HIGH)) {
+                               TRACE_LEAVE2("ipc send failed");
+                               m_NCS_UNLOCK(&mbcsv_cb.peer_list_lock, 
NCS_LOCK_WRITE);
+                               return NCSCC_RC_FAILURE;
+                       }
+
+                       m_NCS_UNLOCK(&mbcsv_cb.peer_list_lock, NCS_LOCK_WRITE);
+                       return NCSCC_RC_SUCCESS;
+               }
+
+               m_NCS_UNLOCK(&mbcsv_cb.peer_list_lock, NCS_LOCK_WRITE);
+       }
+
        if (NULL == (peer = mbcsv_add_new_peer(ckpt, 
msg->rcvr_peer_key.peer_anchor))) {
                TRACE_LEAVE2("failed to add new peer");
                return NCSCC_RC_FAILURE;
diff --git a/osaf/libs/core/mbcsv/mbcsv_pwe_anc.c 
b/osaf/libs/core/mbcsv/mbcsv_pwe_anc.c
--- a/osaf/libs/core/mbcsv/mbcsv_pwe_anc.c
+++ b/osaf/libs/core/mbcsv/mbcsv_pwe_anc.c
@@ -32,15 +32,6 @@
 */
 #include "mbcsv.h"
 
-/*
- * Peer list used for storing all the peers of this PWE. This is used
- * for brodcasting the message to all the peers.
- */
-typedef struct {
-       uint32_t pwe_hdl;               /* Handle supplied by application with 
OPEN call */
-       MBCSV_ANCHOR anchor;
-} MBCSV_PEER_KEY;
-
 typedef struct mbcsv_peer_list {
        NCS_PATRICIA_NODE pat_node;
        MBCSV_PEER_KEY key;

------------------------------------------------------------------------------
_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to