(Sending on behalf of Thuan)
---
src/mds/apitest/mdstest.c | 5 +-
src/mds/apitest/mdstipc.h | 6 +-
src/mds/apitest/mdstipc_api.c | 237 +++++++++++++++++++++++++++++++++++++++++
src/mds/apitest/mdstipc_conf.c | 19 ++--
4 files changed, 253 insertions(+), 14 deletions(-)
diff --git a/src/mds/apitest/mdstest.c b/src/mds/apitest/mdstest.c
index bf6e173..a381aad 100644
--- a/src/mds/apitest/mdstest.c
+++ b/src/mds/apitest/mdstest.c
@@ -84,12 +84,13 @@ int main(int argc, char **argv)
return 0;
}
- if (mds_startup() != 0) {
+ if ((suite != 27) && (mds_startup() != 0)) {
printf("Fail to start mds agents\n");
return 1;
}
int rc = test_run(suite, tcase);
- mds_shutdown();
+ if (suite != 27)
+ mds_shutdown();
return rc;
}
diff --git a/src/mds/apitest/mdstipc.h b/src/mds/apitest/mdstipc.h
index 07cf556..2bd44b4 100644
--- a/src/mds/apitest/mdstipc.h
+++ b/src/mds/apitest/mdstipc.h
@@ -20,6 +20,7 @@
#include "base/ncssysf_tsk.h"
#include "base/ncssysf_def.h"
+#include "base/ncsencdec_pub.h"
typedef struct tet_task {
NCS_OS_CB entry;
@@ -163,9 +164,6 @@ int gl_DEC_FLAT_CB_FAIL;
int gl_RECEIVE_CB_FAIL;
int gl_COPY_CB_FAIL;
-uint32_t ncs_encode_16bit(uint8_t **, uint32_t);
-uint16_t ncs_decode_16bit(uint8_t **);
-
uint32_t tet_mds_svc_callback(NCSMDS_CALLBACK_INFO *);
/******************MDS call back routines *********************************/
uint32_t tet_mds_cb_cpy(NCSMDS_CALLBACK_INFO *);
@@ -528,5 +526,7 @@ uint32_t mds_send_get_redack(MDS_HDL mds_hdl, MDS_SVC_ID
svc_id,
uint32_t mds_send_redrsp_getack(MDS_HDL mds_hdl, MDS_SVC_ID svc_id,
int64_t time_to_wait, TET_MDS_MSG *response);
uint32_t tet_sync_point(void);
+int mds_startup(void);
+int mds_shutdown(void);
#endif // MDS_APITEST_MDSTIPC_H_
diff --git a/src/mds/apitest/mdstipc_api.c b/src/mds/apitest/mdstipc_api.c
index b5547e3..8057284 100644
--- a/src/mds/apitest/mdstipc_api.c
+++ b/src/mds/apitest/mdstipc_api.c
@@ -27,6 +27,7 @@
#include "base/ncs_main_papi.h"
#include "mdstipc.h"
#include "base/ncssysf_tmr.h"
+#include "base/osaf_poll.h"
#define MSG_SIZE MDS_DIRECT_BUF_MAXSIZE
static MDS_CLIENT_MSG_FORMAT_VER gl_set_msg_fmt_ver;
@@ -13104,6 +13105,234 @@ void tet_create_default_PWE_VDEST_tp()
test_validate(FAIL, 0);
}
+void tet_sender(char *send_buff, uint32_t buff_len, int msg_count)
+{
+ int live = 100; // sender live max 100s
+ TET_MDS_MSG *mesg;
+ mesg = (TET_MDS_MSG *)malloc(sizeof(TET_MDS_MSG));
+ memset(mesg, 0, sizeof(TET_MDS_MSG));
+
+ printf("\nStarted Sender (pid:%d) svc_id=%d\n",
+ (int)getpid(), NCSMDS_SVC_ID_INTERNAL_MIN);
+ if (adest_get_handle() != NCSCC_RC_SUCCESS) {
+ printf("\n: Sender FAIL to get adest handle\n");
+ exit(1);
+ }
+
+ if (mds_service_install(gl_tet_adest.mds_pwe1_hdl,
+ NCSMDS_SVC_ID_INTERNAL_MIN, 1,
+ NCSMDS_SCOPE_NONE, false, false) !=
NCSCC_RC_SUCCESS) {
+ printf("\nSender FAIL to install the service\n");
+ exit(1);
+ }
+
+ MDS_SVC_ID svcids[] = {NCSMDS_SVC_ID_EXTERNAL_MIN};
+ if (mds_service_subscribe(
+ gl_tet_adest.mds_pwe1_hdl, NCSMDS_SVC_ID_INTERNAL_MIN,
+ NCSMDS_SCOPE_INTRANODE, 1, svcids) != NCSCC_RC_SUCCESS) {
+ printf("\nSender FAIL to subscribe receiver\n");
+ exit(1);
+ }
+
+ while(!gl_tet_adest.svc[0].svcevt[0].dest && live-- > 0) {
+ printf("\nSender is waiting for receiver UP\n");
+ sleep(1);
+ }
+ printf("\nSender got last event=%d of svc_id=%d dest=<%llx>\n",
+ gl_tet_adest.svc[0].svcevt[0].event,
+ gl_tet_adest.svc[0].svcevt[0].svc_id,
+ gl_tet_adest.svc[0].svcevt[0].dest);
+
+ // wait for receiver subscribe sender
+ // otherwise, receiver won't detect loss message
+ sleep(1);
+
+ uint32_t offset = 0;
+ uint32_t msg_len = buff_len / msg_count;
+ for (int i = 1; i <= msg_count; i++) {
+ memcpy(mesg->send_data, &send_buff[offset], msg_len);
+ mesg->send_len = msg_len;
+ if (mds_just_send(gl_tet_adest.mds_pwe1_hdl,
+ NCSMDS_SVC_ID_INTERNAL_MIN,
+ NCSMDS_SVC_ID_EXTERNAL_MIN,
+ gl_tet_adest.svc[0].svcevt[0].dest,
+ MDS_SEND_PRIORITY_HIGH,
+ mesg) != NCSCC_RC_SUCCESS) {
+ printf("\nSender FAIL send message\n");
+ exit(1);
+ } else {
+ printf("\nSender SENT message %d successfully\n", i);
+ }
+ offset += msg_len;
+ }
+ free(mesg);
+ while(live-- > 0) {
+ // Keep sender alive for retransmission
+ sleep(1);
+ }
+}
+
+bool tet_receiver(char *expected_buff, uint32_t buff_len, int msg_count)
+{
+ int ret = 1;
+ printf("\nStarted Receiver (pid:%d) svc_id=%d\n",
+ (int)getpid(), NCSMDS_SVC_ID_EXTERNAL_MIN);
+ if (adest_get_handle() != NCSCC_RC_SUCCESS) {
+ printf("\nReceiver FAIL to get adest handle\n");
+ return ret;
+ }
+
+ sleep(1); //Let sender subscribe before receiver install
+ if (mds_service_install(gl_tet_adest.mds_pwe1_hdl,
+ NCSMDS_SVC_ID_EXTERNAL_MIN, 1,
+ NCSMDS_SCOPE_NONE, true, false) !=
NCSCC_RC_SUCCESS) {
+ printf("\nReceiver FAIL to install the service\n");
+ }
+
+ MDS_SVC_ID svcids[] = {NCSMDS_SVC_ID_INTERNAL_MIN};
+ if (mds_service_subscribe(
+ gl_tet_adest.mds_pwe1_hdl, NCSMDS_SVC_ID_EXTERNAL_MIN,
+ NCSMDS_SCOPE_INTRANODE, 1, svcids) != NCSCC_RC_SUCCESS) {
+ printf("\nReceiver FAIL to subscribe sender\n");
+ exit(1);
+ }
+
+ char *received_buff = malloc(buff_len);
+ memset(received_buff, 0, buff_len);
+ uint32_t offset = 0;
+ struct pollfd sel;
+ int counter = 0;
+ sel.fd = m_GET_FD_FROM_SEL_OBJ(gl_tet_adest.svc[0].sel_obj);
+ sel.events = POLLIN;
+ while(counter < msg_count) {
+ int ret = osaf_poll(&sel, 1, 10000);
+ if (ret > 0) {
+ gl_rcvdmsginfo.msg = NULL;
+ if (mds_service_retrieve(gl_tet_adest.mds_pwe1_hdl,
+ NCSMDS_SVC_ID_EXTERNAL_MIN,
+ SA_DISPATCH_ONE) !=
NCSCC_RC_SUCCESS) {
+ printf("\nReceiver FAIL to retrieve message\n");
+ break;
+ }
+ TET_MDS_MSG *msg = (TET_MDS_MSG*)gl_rcvdmsginfo.msg;
+ if (msg != NULL) {
+ memcpy(&received_buff[offset],msg->recvd_data,
msg->recvd_len);
+ offset += msg->recvd_len;
+ counter++;
+ }
+ } else {
+ printf("\nReceiver got %d messages\n", counter);
+ printf("\nReceiver poll FAIL\n");
+ break;
+ }
+ }
+
+ printf("\nReceiver verify received buffer is same as expected\n");
+ if (offset == buff_len) {
+ if (memcmp(received_buff, expected_buff, buff_len) != 0) {
+ printf("\nReceiver: Received buffer is not as
expected\n");
+ printf("\nReceiver: Dump buffer to /var/log/opensaf/
\n");
+ FILE *fp =
fopen("/var/log/opensaf/mdstest_received_buff","wb");
+ fwrite(received_buff, sizeof(char), buff_len, fp);
+ fclose(fp);
+ fp = fopen("/var/log/opensaf/mdstest_expect_buff","wb");
+ fwrite(expected_buff, sizeof(char), buff_len, fp);
+ fclose(fp);
+ } else {
+ ret = 0;
+ }
+ } else {
+ printf("\nReceiver: Total received length=%d differ expected
%d\n", offset, buff_len);
+ }
+ free(received_buff);
+ printf("\nEnd Receiver (pid:%d) svc_id=%d\n",
+ (int)getpid(), NCSMDS_SVC_ID_EXTERNAL_MIN);
+ return ret;
+}
+
+void tet_overload_tp_1(void)
+{
+ int pid = 0;
+ int FAIL = 0;
+ uint32_t buff_len = 100000000;
+ int msg_count = 2000;
+ int msg_size = buff_len/msg_count;
+ char *buff = malloc(buff_len);
+
+ for (unsigned int i = 0; i < msg_count; i++) {
+ /* to verify received correct order */
+ memset(buff+(i*msg_size), 'X', msg_size);
+ sprintf(buff+(i*msg_size), "%u", i+1);
+ }
+
+ printf("\nTest Case 1: Receiver wait for drop normal message retransmit
and receive all messages in order\n");
+ /*--------------------------------------------------------------------*/
+ pid = fork();
+ if (pid == 0) {
+ /* child as sender */
+ setenv("MDS_TIPC_FCTRL_ENABLED", "1", 1);
+ mds_startup();
+ tet_sender(buff, buff_len, msg_count);
+ mds_shutdown();
+ } else if (pid > 0) {
+ /* parent as receiver */
+ setenv("MDS_TIPC_FCTRL_ENABLED", "1", 1);
+ mds_startup();
+ FAIL = tet_receiver(buff, buff_len, msg_count);
+ printf("\nReceiver finish, kill Sender\n");
+ kill(pid, SIGKILL);
+ mds_shutdown();
+ } else {
+ /* fork() error */
+ printf("\nFAIL to fork()\n");
+ FAIL = 1;
+ }
+
+ free(buff);
+ test_validate(FAIL, 0);
+}
+
+void tet_overload_tp_2(void)
+{
+ int pid = 0;
+ int FAIL = 0;
+ uint32_t buff_len = 100000000;
+ int msg_count = 1000;
+ int msg_size = buff_len/msg_count;
+ char *buff = malloc(buff_len);
+
+ for (unsigned int i = 0; i < msg_count; i++) {
+ /* to verify received correct order */
+ memset(buff+(i*msg_size), 'X', msg_size);
+ sprintf(buff+(i*msg_size), "%u", i+1);
+ }
+
+ printf("\nTest Case 2: Receiver wait for drop fragment message
retransmit and receive all messages in order\n");
+ /*--------------------------------------------------------------------*/
+ pid = fork();
+ if (pid == 0) {
+ /* child as sender */
+ setenv("MDS_TIPC_FCTRL_ENABLED", "1", 1);
+ mds_startup();
+ tet_sender(buff, buff_len, msg_count);
+ mds_shutdown();
+ } else if (pid > 0) {
+ /* parent as receiver */
+ setenv("MDS_TIPC_FCTRL_ENABLED", "1", 1);
+ mds_startup();
+ FAIL = tet_receiver(buff, buff_len, msg_count);
+ kill(pid, SIGKILL);
+ mds_shutdown();
+ } else {
+ /* fork() error */
+ printf("\nFAIL to fork()\n");
+ FAIL = 1;
+ }
+
+ free(buff);
+ test_validate(FAIL, 0);
+}
+
void Print_return_status(uint32_t rs)
{
switch (rs) {
@@ -13821,4 +14050,12 @@ __attribute__((constructor)) static void
mdsTipcAPI_constructor(void)
"create_PWE_upto_MAX_VDEST");
test_case_add(26, tet_create_default_PWE_VDEST_tp,
"create_default_PWE_VDEST");
+
+ test_suite_add(27, "MDS TIPC OVERLOAD Test");
+ test_case_add(
+ 27, tet_overload_tp_1,
+ "Receiver wait for drop normal message retransmit and receive
all messages in order");
+ test_case_add(
+ 27, tet_overload_tp_2,
+ "Receiver wait for drop fragment message retransmit and receive
all messages in order");
}
diff --git a/src/mds/apitest/mdstipc_conf.c b/src/mds/apitest/mdstipc_conf.c
index bf4c1de..4556df5 100644
--- a/src/mds/apitest/mdstipc_conf.c
+++ b/src/mds/apitest/mdstipc_conf.c
@@ -1924,14 +1924,15 @@ uint32_t tet_mds_cb_enc_flat(NCSMDS_CALLBACK_INFO
*mds_to_svc_info)
mds_to_svc_info->info.enc_flat.o_msg_fmt_ver =
mds_to_svc_info->info.enc_flat.i_rem_svc_pvt_ver;
printf(
- "Flat encoding the message sent from Sender svc = %d with
msg_fmt_ver=%d\n",
+ "Flat encoding the message sent (length=%d) from Sender svc = %d
with msg_fmt_ver=%d\n",
+ msg->send_len,
mds_to_svc_info->i_yr_svc_id,
mds_to_svc_info->info.enc_flat.o_msg_fmt_ver);
/* ENCODE length */
- p8 = ncs_enc_reserve_space(mds_to_svc_info->info.enc_flat.io_uba, 2);
- ncs_encode_16bit(&p8, msg->send_len);
- ncs_enc_claim_space(mds_to_svc_info->info.enc_flat.io_uba, 2);
+ p8 = ncs_enc_reserve_space(mds_to_svc_info->info.enc_flat.io_uba,
sizeof(uint32_t));
+ ncs_encode_32bit(&p8, msg->send_len);
+ ncs_enc_claim_space(mds_to_svc_info->info.enc_flat.io_uba,
sizeof(uint32_t));
/* ENCODE data */
ncs_encode_n_octets_in_uba(mds_to_svc_info->info.enc_flat.io_uba,
@@ -1962,9 +1963,9 @@ uint32_t tet_mds_cb_dec_flat(NCSMDS_CALLBACK_INFO
*mds_to_svc_info)
/* DECODE length */
p8 = ncs_dec_flatten_space(mds_to_svc_info->info.dec_flat.io_uba,
- (uint8_t *)&msg->recvd_len, 2);
- msg->recvd_len = ncs_decode_16bit(&p8);
- ncs_dec_skip_space(mds_to_svc_info->info.dec_flat.io_uba, 2);
+ (uint8_t *)&msg->recvd_len,
sizeof(uint32_t));
+ msg->recvd_len = ncs_decode_32bit(&p8);
+ ncs_dec_skip_space(mds_to_svc_info->info.dec_flat.io_uba,
sizeof(uint32_t));
/*Decode data*/
/*msg->recvd_data = (char *) malloc(msg->recvd_len+1);*/
@@ -1974,9 +1975,9 @@ uint32_t tet_mds_cb_dec_flat(NCSMDS_CALLBACK_INFO
*mds_to_svc_info)
msg->recvd_len);
msg->recvd_data[msg->recvd_len] = 0; /* NULL termination for string */
if (mds_to_svc_info->info.dec_flat.i_is_resp)
- printf("\nThis is a RESPONSE");
+ printf("\nThis is a RESPONSE (length=%d)", msg->recvd_len);
else
- printf("\nThis is a MESSAGE");
+ printf("\nThis is a MESSAGE (length=%d)", msg->recvd_len);
return NCSCC_RC_SUCCESS;
}
--
2.7.4
_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel