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