- Add timeout for MDS_SENDTYPE_SND message.
- Add test cases.
---
 src/mds/apitest/mdstipc.h      |   6 +-
 src/mds/apitest/mdstipc_api.c  | 347 ++++++++++++++++++++++++++++++---
 src/mds/apitest/mdstipc_conf.c |  11 +-
 src/mds/mds_c_sndrcv.c         |  29 ++-
 src/mds/mds_papi.c             |   1 +
 src/mds/mds_papi.h             |   1 +
 6 files changed, 364 insertions(+), 31 deletions(-)

diff --git a/src/mds/apitest/mdstipc.h b/src/mds/apitest/mdstipc.h
index b84c303e6..0cac1f31c 100644
--- a/src/mds/apitest/mdstipc.h
+++ b/src/mds/apitest/mdstipc.h
@@ -229,7 +229,7 @@ uint32_t mds_send_message(MDS_HDL, MDS_SVC_ID, NCSCONTEXT, 
MDS_SVC_ID,
                           MDS_SYNC_SND_CTXT, NCSMDS_SCOPE_TYPE, V_DEST_QA);
 
 /* Non Redundant */
-uint32_t mds_just_send(MDS_HDL, MDS_SVC_ID, MDS_SVC_ID, MDS_DEST,
+uint32_t mds_just_send(MDS_HDL, MDS_SVC_ID, MDS_SVC_ID, MDS_DEST, int64_t,
                        MDS_SEND_PRIORITY_TYPE, TET_MDS_MSG *);
 uint32_t mds_send_get_ack(MDS_HDL, MDS_SVC_ID, MDS_SVC_ID, MDS_DEST, int64_t,
                           MDS_SEND_PRIORITY_TYPE, TET_MDS_MSG *);
@@ -322,6 +322,8 @@ void tet_just_send_tp_11(void);
 void tet_just_send_tp_12(void);
 void tet_just_send_tp_13(void);
 void tet_just_send_tp_14(void);
+void tet_just_send_tp_15(void);
+void tet_just_send_tp_16(void);
 void tet_send_ack_tp_1(void);
 void tet_send_ack_tp_2(void);
 void tet_send_ack_tp_3(void);
@@ -384,6 +386,8 @@ void tet_direct_just_send_tp_12(void);
 void tet_direct_just_send_tp_13(void);
 void tet_direct_just_send_tp_14(void);
 void tet_direct_just_send_tp_15(void);
+void tet_direct_just_send_tp_16(void);
+void tet_direct_just_send_tp_17(void);
 void tet_direct_send_all_tp_1(void);
 void tet_direct_send_all_tp_2(void);
 void tet_direct_send_all_tp_3(void);
diff --git a/src/mds/apitest/mdstipc_api.c b/src/mds/apitest/mdstipc_api.c
index 581ea53f3..9ba5f2423 100644
--- a/src/mds/apitest/mdstipc_api.c
+++ b/src/mds/apitest/mdstipc_api.c
@@ -2874,7 +2874,7 @@ void tet_just_send_tp_1()
                printf("\nAction: Send LOW\n");
                if (mds_just_send(
                        gl_tet_adest.mds_pwe1_hdl, NCSMDS_SVC_ID_EXTERNAL_MIN,
-                       NCSMDS_SVC_ID_EXTERNAL_MIN, gl_tet_vdest[1].vdest,
+                       NCSMDS_SVC_ID_EXTERNAL_MIN, gl_tet_vdest[1].vdest, 0,
                        MDS_SEND_PRIORITY_LOW, mesg) != NCSCC_RC_SUCCESS) {
                        printf("\nFail\n");
                        FAIL = 1;
@@ -2885,7 +2885,7 @@ void tet_just_send_tp_1()
                printf("\nAction: Send MEDIUM\n");
                if (mds_just_send(
                        gl_tet_adest.mds_pwe1_hdl, NCSMDS_SVC_ID_EXTERNAL_MIN,
-                       NCSMDS_SVC_ID_EXTERNAL_MIN, gl_tet_vdest[1].vdest,
+                       NCSMDS_SVC_ID_EXTERNAL_MIN, gl_tet_vdest[1].vdest, 0,
                        MDS_SEND_PRIORITY_MEDIUM, mesg) != NCSCC_RC_SUCCESS) {
                        printf("\nFail\n");
                        FAIL = 1;
@@ -2896,7 +2896,7 @@ void tet_just_send_tp_1()
                printf("\nAction: Send HIGH\n");
                if (mds_just_send(
                        gl_tet_adest.mds_pwe1_hdl, NCSMDS_SVC_ID_EXTERNAL_MIN,
-                       NCSMDS_SVC_ID_EXTERNAL_MIN, gl_tet_vdest[1].vdest,
+                       NCSMDS_SVC_ID_EXTERNAL_MIN, gl_tet_vdest[1].vdest, 0,
                        MDS_SEND_PRIORITY_HIGH, mesg) != NCSCC_RC_SUCCESS) {
                        printf("\nFail\n");
                        FAIL = 1;
@@ -2907,7 +2907,7 @@ void tet_just_send_tp_1()
                printf("\nAction: Send VERY HIGH\n");
                if (mds_just_send(
                        gl_tet_adest.mds_pwe1_hdl, NCSMDS_SVC_ID_EXTERNAL_MIN,
-                       NCSMDS_SVC_ID_EXTERNAL_MIN, gl_tet_vdest[1].vdest,
+                       NCSMDS_SVC_ID_EXTERNAL_MIN, gl_tet_vdest[1].vdest, 0,
                        MDS_SEND_PRIORITY_VERY_HIGH,
                        mesg) != NCSCC_RC_SUCCESS) {
                        printf("\nFail\n");
@@ -2970,10 +2970,12 @@ void tet_just_send_tp_2()
                }
 
                if (mds_just_send(gl_tet_adest.pwe[0].mds_pwe_hdl,
-                                 NCSMDS_SVC_ID_EXTERNAL_MIN,
-                                 NCSMDS_SVC_ID_EXTERNAL_MIN,
-                                 gl_tet_vdest[1].vdest, MDS_SEND_PRIORITY_LOW,
-                                 mesg) == NCSCC_RC_SUCCESS) {
+                                                 NCSMDS_SVC_ID_EXTERNAL_MIN,
+                                                 NCSMDS_SVC_ID_EXTERNAL_MIN,
+                                                 gl_tet_vdest[1].vdest,
+                                                 0,
+                                                 MDS_SEND_PRIORITY_LOW,
+                                                 mesg) == NCSCC_RC_SUCCESS) {
                        printf("\nFail\n");
                        FAIL = 1;
                }
@@ -3033,7 +3035,7 @@ void tet_just_send_tp_3()
 
                if (mds_just_send(
                        (MDS_HDL)(long)NULL, NCSMDS_SVC_ID_EXTERNAL_MIN,
-                       NCSMDS_SVC_ID_EXTERNAL_MIN, gl_tet_vdest[1].vdest,
+                       NCSMDS_SVC_ID_EXTERNAL_MIN, gl_tet_vdest[1].vdest, 0,
                        MDS_SEND_PRIORITY_LOW, mesg) == NCSCC_RC_SUCCESS) {
                        printf("\nFail\n");
                        FAIL = 1;
@@ -3093,7 +3095,7 @@ void tet_just_send_tp_4()
 
                if (mds_just_send(
                        gl_tet_adest.mds_pwe1_hdl, NCSMDS_SVC_ID_EXTERNAL_MIN,
-                       NCSMDS_SVC_ID_EXTERNAL_MIN, 0, MDS_SEND_PRIORITY_LOW,
+                       NCSMDS_SVC_ID_EXTERNAL_MIN, 0, 0, MDS_SEND_PRIORITY_LOW,
                        mesg) == NCSCC_RC_SUCCESS) {
                        printf("\nFail\n");
                        FAIL = 1;
@@ -3152,8 +3154,11 @@ void tet_just_send_tp_5()
                        FAIL = 1;
                }
                if (mds_just_send(gl_tet_adest.mds_pwe1_hdl,
-                                 NCSMDS_SVC_ID_EXTERNAL_MIN, 1800,
-                                 gl_tet_vdest[1].vdest, MDS_SEND_PRIORITY_LOW,
+                                 NCSMDS_SVC_ID_EXTERNAL_MIN,
+                                 1800,
+                                 gl_tet_vdest[1].vdest,
+                                 0,
+                                 MDS_SEND_PRIORITY_LOW,
                                  mesg) == NCSCC_RC_SUCCESS) {
                        printf("\nFail\n");
                        FAIL = 1;
@@ -3217,6 +3222,7 @@ void tet_just_send_tp_6()
                                          NCSMDS_SVC_ID_EXTERNAL_MIN,
                                          NCSMDS_SVC_ID_EXTERNAL_MIN,
                                          gl_tet_vdest[1].vdest,
+                                         0,
                                          MDS_SEND_PRIORITY_LOW,
                                          mesg) != NCSCC_RC_SUCCESS) {
                                printf("\nFail\n");
@@ -3284,7 +3290,7 @@ void tet_just_send_tp_7()
 
                if (mds_just_send(
                        gl_tet_adest.mds_pwe1_hdl, NCSMDS_SVC_ID_EXTERNAL_MIN,
-                       NCSMDS_SVC_ID_INTERNAL_MIN, gl_tet_vdest[1].vdest,
+                       NCSMDS_SVC_ID_INTERNAL_MIN, gl_tet_vdest[1].vdest, 0,
                        MDS_SEND_PRIORITY_LOW, mesg) != NCSCC_RC_SUCCESS) {
                        printf("\nFail\n");
                        FAIL = 1;
@@ -3306,7 +3312,7 @@ void tet_just_send_tp_7()
 
                if (mds_just_send(
                        gl_tet_adest.mds_pwe1_hdl, NCSMDS_SVC_ID_EXTERNAL_MIN,
-                       NCSMDS_SVC_ID_INTERNAL_MIN, gl_tet_vdest[1].vdest,
+                       NCSMDS_SVC_ID_INTERNAL_MIN, gl_tet_vdest[1].vdest, 0,
                        MDS_SEND_PRIORITY_LOW, mesg) != NCSCC_RC_SUCCESS) {
                        printf("\nFail\n");
                        FAIL = 1;
@@ -3376,8 +3382,8 @@ void tet_just_send_tp_8()
 
                if (mds_just_send(
                        gl_tet_adest.mds_pwe1_hdl, NCSMDS_SVC_ID_EXTERNAL_MIN,
-                       NCSMDS_SVC_ID_EXTERNAL_MIN, gl_tet_vdest[1].vdest, 5,
-                       mesg) == NCSCC_RC_SUCCESS) {
+                       NCSMDS_SVC_ID_EXTERNAL_MIN, gl_tet_vdest[1].vdest, 0,
+                       5, mesg) == NCSCC_RC_SUCCESS) {
                        printf("\nFail\n");
                        FAIL = 1;
                }
@@ -3438,7 +3444,7 @@ void tet_just_send_tp_9()
 
                if (mds_just_send(
                        gl_tet_adest.mds_pwe1_hdl, NCSMDS_SVC_ID_EXTERNAL_MIN,
-                       NCSMDS_SVC_ID_EXTERNAL_MIN, gl_tet_vdest[1].vdest,
+                       NCSMDS_SVC_ID_EXTERNAL_MIN, gl_tet_vdest[1].vdest, 0,
                        MDS_SEND_PRIORITY_LOW, NULL) == NCSCC_RC_SUCCESS) {
                        printf("\nFail\n");
                        FAIL = 1;
@@ -3502,7 +3508,7 @@ void tet_just_send_tp_10()
                mesg->send_len = 2 * MSG_SIZE + 2;
                if (mds_just_send(
                        gl_tet_adest.mds_pwe1_hdl, NCSMDS_SVC_ID_EXTERNAL_MIN,
-                       NCSMDS_SVC_ID_EXTERNAL_MIN, gl_tet_vdest[1].vdest,
+                       NCSMDS_SVC_ID_EXTERNAL_MIN, gl_tet_vdest[1].vdest, 0,
                        MDS_SEND_PRIORITY_LOW, mesg) != NCSCC_RC_SUCCESS) {
                        printf("\nFail\n");
                        FAIL = 1;
@@ -3643,7 +3649,7 @@ void tet_just_send_tp_12()
                sleep(2);
                if (mds_just_send(
                        gl_tet_adest.mds_pwe1_hdl, NCSMDS_SVC_ID_EXTERNAL_MIN,
-                       NCSMDS_SVC_ID_EXTERNAL_MIN, gl_tet_vdest[1].vdest,
+                       NCSMDS_SVC_ID_EXTERNAL_MIN, gl_tet_vdest[1].vdest, 0,
                        MDS_SEND_PRIORITY_LOW, mesg) != NCSCC_RC_SUCCESS) {
                        printf("\nFail\n");
                        FAIL = 1;
@@ -3719,7 +3725,7 @@ void tet_just_send_tp_13()
                sleep(2);
                if (mds_just_send(
                        gl_tet_adest.mds_pwe1_hdl, NCSMDS_SVC_ID_EXTERNAL_MIN,
-                       NCSMDS_SVC_ID_EXTERNAL_MIN, gl_tet_vdest[1].vdest,
+                       NCSMDS_SVC_ID_EXTERNAL_MIN, gl_tet_vdest[1].vdest, 0,
                        MDS_SEND_PRIORITY_HIGH, mesg) != NCSCC_RC_SUCCESS) {
                        printf("\nFail\n");
                        FAIL = 1;
@@ -3787,7 +3793,7 @@ void tet_just_send_tp_14()
                gl_COPY_CB_FAIL = 1;
                if (mds_just_send(
                        gl_tet_adest.mds_pwe1_hdl, NCSMDS_SVC_ID_EXTERNAL_MIN,
-                       NCSMDS_SVC_ID_EXTERNAL_MIN, gl_tet_vdest[1].vdest,
+                       NCSMDS_SVC_ID_EXTERNAL_MIN, gl_tet_vdest[1].vdest, 0,
                        MDS_SEND_PRIORITY_LOW, mesg) == NCSCC_RC_SUCCESS) {
                        printf("\nFail\n");
                        FAIL = 1;
@@ -3816,6 +3822,149 @@ void tet_just_send_tp_14()
        test_validate(FAIL, 0);
 }
 
+void tet_just_send_tp_15(void)
+{
+       int FAIL = 0;
+       MDS_SVC_ID svcids[] = {NCSMDS_SVC_ID_EXTERNAL_MIN};
+       MDS_SVC_ID not_installed_svc_id = 500;
+       char tmp[] = " Hi Receiver ";
+       TET_MDS_MSG *mesg;
+
+       gl_vdest_indx = 0;
+       mesg = (TET_MDS_MSG *)malloc(sizeof(TET_MDS_MSG));
+       memset(mesg, 0, sizeof(TET_MDS_MSG));
+       memcpy(mesg->send_data, tmp, sizeof(tmp));
+       mesg->send_len = sizeof(tmp);
+
+       /*start up*/
+       if (tet_initialise_setup(false)) {
+               printf("\nSetup Initialisation has Failed\n");
+               FAIL = 1;
+       } else {
+               printf("\nTest Case 15: Timeout to send a message to service"
+                          " which is not installed with the timeout shorter"
+                          " than the discovery time\n");
+               /*-----------------------------------------------------------*/
+               printf("\nSubscribing the service\n");
+               if (mds_service_subscribe(gl_tet_adest.mds_pwe1_hdl,
+                                         NCSMDS_SVC_ID_EXTERNAL_MIN,
+                                         NCSMDS_SCOPE_NONE,
+                                         1,
+                                         svcids) != NCSCC_RC_SUCCESS) {
+                       printf("\nFail\n");
+                       FAIL = 1;
+               }
+               if (mds_service_retrieve(gl_tet_adest.mds_pwe1_hdl,
+                                        NCSMDS_SVC_ID_EXTERNAL_MIN,
+                                        SA_DISPATCH_ALL)
+                                               != NCSCC_RC_SUCCESS) {
+                       printf("\nFail\n");
+                       FAIL = 1;
+               }
+               printf("\nSending the message\n");
+               if (mds_just_send(gl_tet_adest.mds_pwe1_hdl,
+                                 NCSMDS_SVC_ID_EXTERNAL_MIN,
+                                 not_installed_svc_id,
+                                 gl_tet_vdest[1].vdest,
+                                 100,
+                                 MDS_SEND_PRIORITY_LOW,
+                                 mesg) != NCSCC_RC_REQ_TIMOUT) {
+                       printf("\nFail\n");
+                       FAIL = 1;
+               }
+               printf("\nCancelling the subscription\n");
+               if (mds_service_cancel_subscription(gl_tet_adest.mds_pwe1_hdl,
+                                               NCSMDS_SVC_ID_EXTERNAL_MIN,
+                                               1,
+                                               svcids) != NCSCC_RC_SUCCESS) {
+                       printf("\nFail\n");
+                       FAIL = 1;
+               }
+       }
+
+       /*clean up*/
+       if (tet_cleanup_setup()) {
+               printf("\nSetup Clean Up has Failed\n");
+               FAIL = 1;
+       }
+
+       free(mesg);
+       test_validate(FAIL, 0);
+}
+
+void tet_just_send_tp_16(void)
+{
+       int FAIL = 0;
+       uint32_t rc = NCSCC_RC_SUCCESS;
+       MDS_SVC_ID not_installed_svc_id = 500;
+       MDS_SVC_ID svcids[] = {NCSMDS_SVC_ID_EXTERNAL_MIN};
+       char tmp[] = " Hi Receiver ";
+       TET_MDS_MSG *mesg;
+
+       gl_vdest_indx = 0;
+       mesg = (TET_MDS_MSG *)malloc(sizeof(TET_MDS_MSG));
+       memset(mesg, 0, sizeof(TET_MDS_MSG));
+       memcpy(mesg->send_data, tmp, sizeof(tmp));
+       mesg->send_len = sizeof(tmp);
+
+       /*start up*/
+       if (tet_initialise_setup(false)) {
+               printf("\nSetup Initialisation has Failed\n");
+               FAIL = 1;
+       } else {
+               printf("\nTest Case 16: No able to send a message to service"
+                          " which is not installed with the timeout longer"
+                          " than the discovery time\n");
+               /*-----------------------------------------------------------*/
+               printf("\nSubscribing the service\n");
+               if (mds_service_subscribe(gl_tet_adest.mds_pwe1_hdl,
+                                         NCSMDS_SVC_ID_EXTERNAL_MIN,
+                                         NCSMDS_SCOPE_NONE,
+                                         1,
+                                         svcids)
+                                               != NCSCC_RC_SUCCESS) {
+                       printf("\nFail\n");
+                       FAIL = 1;
+               }
+               if (mds_service_retrieve(gl_tet_adest.mds_pwe1_hdl,
+                                        NCSMDS_SVC_ID_EXTERNAL_MIN,
+                                        SA_DISPATCH_ALL)
+                                               != NCSCC_RC_SUCCESS) {
+                       printf("\nFail\n");
+                       FAIL = 1;
+               }
+               printf("\nSending the message\n");
+               rc = mds_just_send(gl_tet_adest.mds_pwe1_hdl,
+                                   NCSMDS_SVC_ID_EXTERNAL_MIN,
+                                   not_installed_svc_id,
+                                   gl_tet_vdest[1].vdest,
+                                   1000,
+                                   MDS_SEND_PRIORITY_LOW,
+                                   mesg);
+               if (rc != NCSCC_RC_FAILURE) {
+                       printf("\nFail\n");
+                       FAIL = 1;
+               }
+               printf("\nCancelling the subscription\n");
+               if (mds_service_cancel_subscription(gl_tet_adest.mds_pwe1_hdl,
+                                               NCSMDS_SVC_ID_EXTERNAL_MIN,
+                                               1,
+                                               svcids) != NCSCC_RC_SUCCESS) {
+                       printf("\nFail\n");
+                       FAIL = 1;
+               }
+       }
+
+       /*clean up*/
+       if (tet_cleanup_setup()) {
+               printf("\nSetup Clean Up has Failed\n");
+               FAIL = 1;
+       }
+
+       free(mesg);
+       test_validate(FAIL, 0);
+}
+
 bool setup_send_ack_tp()
 {
        int FAIL = 0;
@@ -6242,7 +6391,7 @@ void tet_send_all_tp_1()
        printf("\t Sending the message to no active instance\n");
        if ((mds_just_send(
                 gl_tet_adest.mds_pwe1_hdl, NCSMDS_SVC_ID_EXTERNAL_MIN,
-                NCSMDS_SVC_ID_EXTERNAL_MIN, gl_tet_vdest[1].vdest,
+                NCSMDS_SVC_ID_EXTERNAL_MIN, gl_tet_vdest[1].vdest, 0,
                 MDS_SEND_PRIORITY_LOW, mesg) != MDS_RC_MSG_NO_BUFFERING)) {
                printf("\nFail\n");
                FAIL = 1;
@@ -6409,7 +6558,7 @@ void tet_send_all_tp_2()
        printf("\n Sending the message to no active instance\n");
        if ((mds_just_send(gl_tet_adest.mds_pwe1_hdl,
                           NCSMDS_SVC_ID_EXTERNAL_MIN,
-                          NCSMDS_SVC_ID_EXTERNAL_MIN, gl_tet_vdest[1].vdest,
+                          NCSMDS_SVC_ID_EXTERNAL_MIN, gl_tet_vdest[1].vdest, 0,
                           MDS_SEND_PRIORITY_LOW, mesg) != NCSCC_RC_SUCCESS) &&
            gl_rcvdmsginfo.msg_fmt_ver != 3) {
                printf("\nFail\n");
@@ -8756,6 +8905,141 @@ void tet_direct_just_send_tp_15()
        test_validate(FAIL, 0);
 }
 
+void tet_direct_just_send_tp_16(void)
+{
+       int FAIL = 0;
+       MDS_SVC_ID svcids[] = {NCSMDS_SVC_ID_EXTERNAL_MIN};
+       MDS_SVC_ID not_installed_svc_id = 500;
+       char message[] = "Direct Message";
+
+       /*start up*/
+       if (tet_initialise_setup(false)) {
+               printf("\nSetup Initialisation has Failed\n");
+               FAIL = 1;
+       } else {
+               printf("\nTest Case 16: Timeout to send a message to service"
+                          " which is not installed with the timeout shorter"
+                          " than the discovery time\n");
+               /*----------------------DIRECT SEND--------------------------*/
+               printf("\nSubscribing the service\n");
+               if (mds_service_subscribe(gl_tet_adest.mds_pwe1_hdl,
+                                         NCSMDS_SVC_ID_EXTERNAL_MIN,
+                                         NCSMDS_SCOPE_NONE,
+                                         1,
+                                         svcids) != NCSCC_RC_SUCCESS) {
+                       printf("\nFail\n");
+                       FAIL = 1;
+               }
+               if (mds_service_retrieve(gl_tet_adest.mds_pwe1_hdl,
+                                        NCSMDS_SVC_ID_EXTERNAL_MIN,
+                                        SA_DISPATCH_ALL)
+                                               != NCSCC_RC_SUCCESS) {
+                       printf("\nFail\n");
+                       FAIL = 1;
+               }
+               printf("\nSending the message\n");
+               if (mds_direct_send_message(gl_tet_adest.mds_pwe1_hdl,
+                                           NCSMDS_SVC_ID_EXTERNAL_MIN,
+                                           not_installed_svc_id,
+                                           1,
+                                           MDS_SENDTYPE_SND,
+                                           gl_tet_vdest[1].vdest,
+                                           100,
+                                           MDS_SEND_PRIORITY_LOW,
+                                           message) != NCSCC_RC_REQ_TIMOUT) {
+                       printf("\nFail\n");
+                       FAIL = 1;
+               } else
+                       printf("\nSuccess\n");
+
+               printf("\nCancelling the subscription\n");
+               if (mds_service_cancel_subscription(gl_tet_adest.mds_pwe1_hdl,
+                                                   NCSMDS_SVC_ID_EXTERNAL_MIN,
+                                                   1,
+                                                   svcids)
+                                                       != NCSCC_RC_SUCCESS) {
+                       printf("\nFail\n");
+                       FAIL = 1;
+               }
+       }
+
+       /*-------------------------------------------------------------------*/
+       /*clean up*/
+       if (tet_cleanup_setup()) {
+               printf("\nSetup Clean Up has Failed\n");
+               FAIL = 1;
+       }
+
+       test_validate(FAIL, 0);
+}
+
+void tet_direct_just_send_tp_17(void)
+{
+       int FAIL = 0;
+       MDS_SVC_ID svcids[] = {NCSMDS_SVC_ID_EXTERNAL_MIN};
+       MDS_SVC_ID not_installed_svc_id = 500;
+       char message[] = "Direct Message";
+
+       /*start up*/
+       if (tet_initialise_setup(false)) {
+               printf("\nSetup Initialisation has Failed\n");
+               FAIL = 1;
+       } else {
+               printf("\nTest Case 17: No able to send a message to service"
+                          " which is not installed with the timeout longer"
+                          " than the discovery time\n");
+               /*-------------------------DIRECT SEND-----------------------*/
+               printf("\nSubscribing the service\n");
+               if (mds_service_subscribe(gl_tet_adest.mds_pwe1_hdl,
+                                         NCSMDS_SVC_ID_EXTERNAL_MIN,
+                                         NCSMDS_SCOPE_NONE,
+                                         1,
+                                         svcids)
+                                               != NCSCC_RC_SUCCESS) {
+                       printf("\nFail\n");
+                       FAIL = 1;
+               }
+               if (mds_service_retrieve(gl_tet_adest.mds_pwe1_hdl,
+                                        NCSMDS_SVC_ID_EXTERNAL_MIN,
+                                        SA_DISPATCH_ALL)
+                                               != NCSCC_RC_SUCCESS) {
+                       printf("\nFail\n");
+                       FAIL = 1;
+               }
+               printf("\nSending the message\n");
+               if (mds_direct_send_message(gl_tet_adest.mds_pwe1_hdl,
+                                           NCSMDS_SVC_ID_EXTERNAL_MIN,
+                                           not_installed_svc_id,
+                                           1,
+                                           MDS_SENDTYPE_SND,
+                                           gl_tet_vdest[1].vdest,
+                                           1000,
+                                           MDS_SEND_PRIORITY_LOW,
+                                           message) != NCSCC_RC_FAILURE) {
+                       printf("\nFail\n");
+                       FAIL = 1;
+               } else
+                       printf("\nSuccess\n");
+               printf("\nCancelling the subscription\n");
+               if (mds_service_cancel_subscription(gl_tet_adest.mds_pwe1_hdl,
+                                               NCSMDS_SVC_ID_EXTERNAL_MIN,
+                                               1,
+                                               svcids) != NCSCC_RC_SUCCESS) {
+                       printf("\nFail\n");
+                       FAIL = 1;
+               }
+       }
+
+       /*-------------------------------------------------------------------*/
+       /*clean up*/
+       if (tet_cleanup_setup()) {
+               printf("\nSetup Clean Up has Failed\n");
+               FAIL = 1;
+       }
+
+       test_validate(FAIL, 0);
+}
+
 void tet_direct_send_all_tp_1()
 {
        int FAIL = 0;
@@ -13432,6 +13716,7 @@ void tet_sender(MDS_SVC_ID svc_id, uint32_t msg_num, 
uint32_t msg_size,
                                          svc_id,
                                          to_svcids[j],
                                          gl_tet_adest.svc[0].svcevt[j].dest,
+                                         0,
                                          MDS_SEND_PRIORITY_HIGH,
                                          mesg) != NCSCC_RC_SUCCESS) {
                                printf("\nSender FAIL send message\n");
@@ -14320,6 +14605,14 @@ __attribute__((constructor)) static void 
mdsTipcAPI_constructor(void)
                      "Send a message to Svc EXTMIN on QUIESCED Vdest=200");
        test_case_add(6, tet_just_send_tp_14,
                      "Copy Callback returning Failure: Send Fails");
+       test_case_add(6, tet_just_send_tp_15,
+                                 "Timeout to send a message to service"
+                                 " which is not installed with the timeout"
+                                 " shorter than the discovery time");
+       test_case_add(6, tet_just_send_tp_16,
+                                 "No able to send a message to service"
+                                 " which is not installed with the timeout"
+                                 " longer than the discovery time");
 
        test_suite_add(7, "SEND ACK test cases");
        test_case_add(
@@ -14513,6 +14806,14 @@ __attribute__((constructor)) static void 
mdsTipcAPI_constructor(void)
        test_case_add(
            13, tet_direct_just_send_tp_15,
            "Able to send a message of size =(MDS_DIRECT_BUF_MAXSIZE) to 200");
+       test_case_add(13, tet_direct_just_send_tp_16,
+                                 "Timeout to send a message to service"
+                                 " which is not installed with the timeout"
+                                 " shorter than the discovery time");
+       test_case_add(13, tet_direct_just_send_tp_17,
+                                 "No able to send a message to service"
+                                 " which is not installed with the timeout"
+                                 " longer than the discovery time");
 
        test_suite_add(14, "Direct Send All test cases");
        test_case_add(
diff --git a/src/mds/apitest/mdstipc_conf.c b/src/mds/apitest/mdstipc_conf.c
index e7cdaa1b8..e365207eb 100644
--- a/src/mds/apitest/mdstipc_conf.c
+++ b/src/mds/apitest/mdstipc_conf.c
@@ -993,7 +993,8 @@ uint32_t mds_service_cancel_subscription(MDS_HDL mds_hdl, 
MDS_SVC_ID svc_id,
 /*******************************  SEND WRAPPERS   ***************************/
 
 uint32_t mds_just_send(MDS_HDL mds_hdl, MDS_SVC_ID svc_id, MDS_SVC_ID to_svc,
-                      MDS_DEST to_dest, MDS_SEND_PRIORITY_TYPE priority,
+                      MDS_DEST to_dest, int64_t time_to_wait,
+                      MDS_SEND_PRIORITY_TYPE priority,
                       TET_MDS_MSG *message)
 {
        uint32_t rs;
@@ -1008,6 +1009,7 @@ uint32_t mds_just_send(MDS_HDL mds_hdl, MDS_SVC_ID 
svc_id, MDS_SVC_ID to_svc,
        svc_to_mds_info.info.svc_send.i_sendtype = MDS_SENDTYPE_SND;
 
        svc_to_mds_info.info.svc_send.info.snd.i_to_dest = to_dest;
+       svc_to_mds_info.info.svc_send.info.snd.i_time_to_wait = time_to_wait;
        rs = ncsmds_api(&svc_to_mds_info);
        if (rs == NCSCC_RC_SUCCESS) {
                printf("\nMDS SEND is SUCCESSFULL\n");
@@ -1017,9 +1019,12 @@ uint32_t mds_just_send(MDS_HDL mds_hdl, MDS_SVC_ID 
svc_id, MDS_SVC_ID to_svc,
                        printf(
                            "\nMDS SEND  has failed as there is no active 
instance\n");
                        return MDS_RC_MSG_NO_BUFFERING;
+               } else if (rs == NCSCC_RC_REQ_TIMOUT) {
+                       printf("\nMDS SEND has TIMED OUT\n");
+                       return NCSCC_RC_REQ_TIMOUT;
                } else {
                        printf(
-                           "\nRequest to ncsmds_api: MDS SEND ACK has 
FAILED\n");
+                           "\nRequest to ncsmds_api: MDS SEND has FAILED\n");
                        return NCSCC_RC_FAILURE;
                }
        }
@@ -1354,6 +1359,8 @@ uint32_t mds_direct_send_message(MDS_HDL mds_hdl, 
MDS_SVC_ID svc_id,
        case MDS_SENDTYPE_SND:
                svc_to_mds_info.info.svc_direct_send.info.snd.i_to_dest =
                    to_dest;
+               svc_to_mds_info.info.svc_direct_send.info.snd
+                       .i_time_to_wait = time_to_wait;
                break;
        case MDS_SENDTYPE_SNDACK:
                svc_to_mds_info.info.svc_direct_send.info.sndack.i_to_dest =
diff --git a/src/mds/mds_c_sndrcv.c b/src/mds/mds_c_sndrcv.c
index 557f68a4b..9fb2cf226 100644
--- a/src/mds/mds_c_sndrcv.c
+++ b/src/mds/mds_c_sndrcv.c
@@ -529,6 +529,8 @@ static uint32_t mds_mcm_direct_send(NCSMDS_INFO *info)
        switch (info->info.svc_direct_send.i_sendtype) {
        case MDS_SENDTYPE_SND:
                req.i_sendtype = MDS_SENDTYPE_SND;
+               req.info.snd.i_time_to_wait =
+                       info->info.svc_direct_send.info.snd.i_time_to_wait;
                status = mcm_pvt_normal_svc_snd_direct(
                    info->i_mds_hdl, info->i_svc_id,
                    info->info.svc_direct_send.i_direct_buff,
@@ -778,6 +780,8 @@ static uint32_t mds_mcm_send(NCSMDS_INFO *info)
        switch (info->info.svc_send.i_sendtype) {
        case MDS_SENDTYPE_SND:
                req.i_sendtype = MDS_SENDTYPE_SND;
+               req.info.snd.i_time_to_wait =
+                       info->info.svc_send.info.snd.i_time_to_wait;
                status = mcm_pvt_normal_svc_snd(
                    info->i_mds_hdl, info->i_svc_id, info->info.svc_send.i_msg,
                    info->info.svc_send.info.snd.i_to_dest,
@@ -1139,17 +1143,19 @@ mcm_pvt_normal_snd_process_common(MDS_HDL env_hdl, 
MDS_SVC_ID fr_svc_id,
 
        if (tx_send_hdl == NULL) {
                /* Check in subscriptions whether this exists */
-               if (NCSCC_RC_SUCCESS != mds_mcm_process_disc_queue_checks(
+               status = mds_mcm_process_disc_queue_checks(
                                            svc_cb, dest_svc_id, to_dest, req,
                                            &ret_adest, &timer_running,
-                                           &tx_send_hdl)) {
+                                               &tx_send_hdl);
+               if (status != NCSCC_RC_SUCCESS) {
                        m_MDS_LOG_ERR(
                            "MDS_SND_RCV:No Route Found from svc_id = %s(%d), 
to svc_id = %s(%d) on Adest = <0x%08x, %u> ",
                            get_svc_names(fr_svc_id), fr_svc_id,
                            get_svc_names(to_svc_id), to_svc_id,
                            m_MDS_GET_NODE_ID_FROM_ADEST(to_dest),
                            m_MDS_GET_PROCESS_ID_FROM_ADEST(to_dest));
-                       if (to_msg.msg_type == MSG_DIRECT_BUFF) {
+                       if (to_msg.msg_type == MSG_DIRECT_BUFF
+                               && NCSCC_RC_REQ_TIMOUT != status) {
                                return MDS_INT_RC_DIRECT_SEND_FAIL; /* This is
                                                                       as the
                                                                       direct
@@ -1159,7 +1165,7 @@ mcm_pvt_normal_snd_process_common(MDS_HDL env_hdl, 
MDS_SVC_ID fr_svc_id,
                                                                       location
                                                                     */
                        }
-                       return NCSCC_RC_FAILURE;
+                       return status;
                }
        } else if ((tx_send_hdl != NULL) && (timer_running == true)) {
                /* Route Exists active or timer running */
@@ -1989,6 +1995,10 @@ mds_mcm_process_disc_queue_checks(MDS_SVC_INFO *svc_cb, 
MDS_SVC_ID dest_svc_id,
                            get_svc_names(svc_cb->svc_id), svc_cb->svc_id,
                            get_svc_names(dest_svc_id), dest_svc_id,
                            sub_info->sub_adest_details);
+                       m_MDS_LOG_DBG(
+                               "MDS_SND_RCV :L"
+                               " mds_mcm_process_disc_queue_checks\n");
+                       return NCSCC_RC_REQ_TIMOUT;
                }
 
                m_MDS_LOG_DBG(
@@ -2110,7 +2120,16 @@ static uint32_t 
mds_subtn_tbl_add_disc_queue(MDS_SUBSCRIPTION_INFO *sub_info,
        /* Now wait till the timeout or an subscription result will come */
 
        switch (req->i_sendtype) {
-       case MDS_SENDTYPE_SND:
+       case MDS_SENDTYPE_SND: {
+               m_MDS_LOG_INFO("MDS_SND_RCV: Waiting for timeout\n");
+               if (NCSCC_RC_SUCCESS !=
+                   mds_mcm_time_wait(&add_ptr->sel_obj,
+                                     req->info.snd.i_time_to_wait)) {
+                       m_MDS_LOG_ERR(
+                           "MDS_SND_RCV: timeout or error occured\n");
+                       rc = NCSCC_RC_REQ_TIMOUT;
+               }
+       } break;
        case MDS_SENDTYPE_RSP:
        case MDS_SENDTYPE_RED:
        case MDS_SENDTYPE_RRSP:
diff --git a/src/mds/mds_papi.c b/src/mds/mds_papi.c
index fc0c0e04e..f912a8e2d 100644
--- a/src/mds/mds_papi.c
+++ b/src/mds/mds_papi.c
@@ -102,6 +102,7 @@ const char *get_svc_names(int svc_id)
  *                external service.
  *
  * Return Value:  NCSCC_RC_SUCCESS
+ *                NCSCC_RC_REQ_TIMOUT
  *                NCSCC_RC_FAILURE
  *
  ****************************************************************************/
diff --git a/src/mds/mds_papi.h b/src/mds/mds_papi.h
index 7cd543c9f..71f75bf1f 100644
--- a/src/mds/mds_papi.h
+++ b/src/mds/mds_papi.h
@@ -270,6 +270,7 @@ typedef struct mds_sync_snd_ctxt {
 
 typedef struct mds_sendtype_snd_info {
   MDS_DEST i_to_dest; /* A virtual or absolute destination */
+  int64_t i_time_to_wait; /* Timeout duration in 10ms units */
 } MDS_SENDTYPE_SND_INFO;
 
 typedef struct mds_sendtype_sndrsp_info {
-- 
2.17.1



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

Reply via email to