From 9300d76a8efc6c79be7f70192ec859d2441afc6f Mon Sep 17 00:00:00 2001 From: Shilpa Seshadri Date: Fri, 23 Jul 2021 11:23:39 +0530 Subject: [PATCH 001/137] Add callback handler for initial connection status change event --- CHANGELOG.md | 1 + src/connection.c | 20 ++++++++++++++++++++ src/connection.h | 12 ++++++++++++ 3 files changed, 33 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index b59cc57..7d442ca 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. ## [Unreleased] - Add additional HTTP headers for call to Themis from Convey +- Add callback handler for initial cloud connection status change event ## [1.1.4] - on connect retry, requery jwt only if it failed before diff --git a/src/connection.c b/src/connection.c index c679870..6d3b51f 100644 --- a/src/connection.c +++ b/src/connection.c @@ -62,6 +62,8 @@ enum { /* File Scoped Variables */ /*----------------------------------------------------------------------------*/ +parodusOnConnStatusChangeHandler on_conn_status_change; + parodusOnPingStatusChangeHandler on_ping_status_change; pthread_mutex_t backoff_delay_mut=PTHREAD_MUTEX_INITIALIZER; @@ -752,6 +754,13 @@ int createNopollConnection(noPollCtx *ctx, server_list_t *server_list) } /* if we failed to connect, don't reuse the redirect server */ free_server (&conn_ctx.server_list->redirect); + + /* On initial connect failure, invoke conn status change event as "fail" */ + if(NULL != on_conn_status_change && init) + { + on_conn_status_change("failed"); + } + #ifdef FEATURE_DNS_QUERY /* if we don't already have a valid jwt, look up server information */ if (server_is_null (&conn_ctx.server_list->jwt)) @@ -776,6 +785,12 @@ int createNopollConnection(noPollCtx *ctx, server_list_t *server_list) get_parodus_cfg()->cloud_status = CLOUD_STATUS_ONLINE; ParodusInfo("cloud_status set as %s after successful connection\n", get_parodus_cfg()->cloud_status); + /* On initial connect success, invoke conn status change event as "success" */ + if(NULL != on_conn_status_change && init) + { + on_conn_status_change("success"); + } + // Invoke the ping status change event callback as "received" ping if(NULL != on_ping_status_change) { @@ -934,3 +949,8 @@ void registerParodusOnPingStatusChangeHandler(parodusOnPingStatusChangeHandler c on_ping_status_change = callback_func; } +void registerParodusOnConnStatusChangeHandler(parodusOnConnStatusChangeHandler callback_func) +{ + on_conn_status_change = callback_func; +} + diff --git a/src/connection.h b/src/connection.h index d750829..adff9c2 100644 --- a/src/connection.h +++ b/src/connection.h @@ -37,6 +37,15 @@ extern "C" { #define SHUTDOWN_REASON_SYSTEM_RESTART "system_restarting" #define SHUTDOWN_REASON_SIGTERM "SIGTERM" +/** +* parodusOnConnStatusChangeHandler - Function pointer +* Used to define callback function to do additional processing +* when websocket cloud connection status change event +* i.e. "cloud-conn-status" as "fail" or "success" +*/ +typedef void (*parodusOnConnStatusChangeHandler) (char * status); +extern parodusOnConnStatusChangeHandler on_conn_status_change; + /** * parodusOnPingStatusChangeHandler - Function pointer * Used to define callback function to do additional processing @@ -79,6 +88,9 @@ void set_cloud_disconnect_time(int disconnTime); void start_conn_in_progress (unsigned long start_time); void stop_conn_in_progress (void); +// To Register parodusOnConnStatusChangeHandler Callback function +void registerParodusOnConnStatusChangeHandler(parodusOnConnStatusChangeHandler on_conn_status_change); + // To Register parodusOnPingStatusChangeHandler Callback function void registerParodusOnPingStatusChangeHandler(parodusOnPingStatusChangeHandler on_ping_status_change); From 671fc5be594d938a0129efc61e8dea316fbe3de1 Mon Sep 17 00:00:00 2001 From: Shilpa Seshadri Date: Tue, 17 Aug 2021 23:38:58 +0530 Subject: [PATCH 002/137] To fix brackets in conn event check --- src/connection.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/connection.c b/src/connection.c index 6d3b51f..1bd5ac3 100644 --- a/src/connection.c +++ b/src/connection.c @@ -756,7 +756,7 @@ int createNopollConnection(noPollCtx *ctx, server_list_t *server_list) free_server (&conn_ctx.server_list->redirect); /* On initial connect failure, invoke conn status change event as "fail" */ - if(NULL != on_conn_status_change && init) + if((NULL != on_conn_status_change) && init) { on_conn_status_change("failed"); } @@ -786,7 +786,7 @@ int createNopollConnection(noPollCtx *ctx, server_list_t *server_list) ParodusInfo("cloud_status set as %s after successful connection\n", get_parodus_cfg()->cloud_status); /* On initial connect success, invoke conn status change event as "success" */ - if(NULL != on_conn_status_change && init) + if((NULL != on_conn_status_change) && init) { on_conn_status_change("success"); } From d901efd10c4072b32af4ff744c9ed58fb675c37a Mon Sep 17 00:00:00 2001 From: Shilpa Seshadri Date: Tue, 24 Aug 2021 23:39:17 +0530 Subject: [PATCH 003/137] Invoke conn status change event only one time on failure --- src/connection.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/connection.c b/src/connection.c index 1bd5ac3..b87551a 100644 --- a/src/connection.c +++ b/src/connection.c @@ -719,6 +719,7 @@ int createNopollConnection(noPollCtx *ctx, server_list_t *server_list) struct timespec connect_time,*connectTimePtr; connectTimePtr = &connect_time; backoff_timer_t backoff_timer; + static int init_conn_failure=1; if(ctx == NULL) { return nopoll_false; @@ -755,10 +756,11 @@ int createNopollConnection(noPollCtx *ctx, server_list_t *server_list) /* if we failed to connect, don't reuse the redirect server */ free_server (&conn_ctx.server_list->redirect); - /* On initial connect failure, invoke conn status change event as "fail" */ - if((NULL != on_conn_status_change) && init) + /* On initial connect failure, invoke conn status change event as "failed" only 1 time*/ + if((NULL != on_conn_status_change) && init && init_conn_failure) { on_conn_status_change("failed"); + init_conn_failure=0; } #ifdef FEATURE_DNS_QUERY From e693c09ca323679d8882562a8118453decb48ef6 Mon Sep 17 00:00:00 2001 From: Sadhyama Vengilat Date: Fri, 27 Aug 2021 23:10:18 +0530 Subject: [PATCH 004/137] Fix Parodus connection stuck on interface up down received together --- src/conn_interface.c | 3 ++- src/connection.c | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/conn_interface.c b/src/conn_interface.c index 3456267..edb49d9 100644 --- a/src/conn_interface.c +++ b/src/conn_interface.c @@ -195,7 +195,8 @@ void createSocketConnection(void (* initKeypress)()) } createNopollConnection(ctx, &server_list); } - } while(!get_close_retry() && !g_shutdown); + //process exit only when g_shutdown is true. + } while(!g_shutdown); pthread_mutex_lock (get_global_svc_mut()); pthread_cond_signal (get_global_svc_con()); diff --git a/src/connection.c b/src/connection.c index b87551a..e51e7dc 100644 --- a/src/connection.c +++ b/src/connection.c @@ -699,7 +699,8 @@ int wait_while_interface_down() if (rtn != 0) ParodusError ("Error on pthread_cond_wait (%d) in wait_while_interface_down\n", rtn); - if ((rtn != 0) || g_shutdown) { + if (g_shutdown) { + ParodusInfo("Received g_shutdown during interface down wait, returning\n"); return -1; } } From d2d1590329006ddd00f5f79f587f4b2fedb36d68 Mon Sep 17 00:00:00 2001 From: Sadhyama Vengilat Date: Tue, 31 Aug 2021 19:04:26 +0530 Subject: [PATCH 005/137] Fix unit tests on conn_interface --- CHANGELOG.md | 1 + src/conn_interface.c | 2 +- tests/test_conn_interface.c | 9 +++++---- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7d442ca..3fe1478 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. ## [Unreleased] - Add additional HTTP headers for call to Themis from Convey - Add callback handler for initial cloud connection status change event +- Fix Parodus connection stuck on interface up down received together ## [1.1.4] - on connect retry, requery jwt only if it failed before diff --git a/src/conn_interface.c b/src/conn_interface.c index edb49d9..3a86ac8 100644 --- a/src/conn_interface.c +++ b/src/conn_interface.c @@ -196,7 +196,7 @@ void createSocketConnection(void (* initKeypress)()) createNopollConnection(ctx, &server_list); } //process exit only when g_shutdown is true. - } while(!g_shutdown); + } while(FOREVER() && !g_shutdown); pthread_mutex_lock (get_global_svc_mut()); pthread_cond_signal (get_global_svc_con()); diff --git a/tests/test_conn_interface.c b/tests/test_conn_interface.c index 5433e7c..465bfc5 100644 --- a/tests/test_conn_interface.c +++ b/tests/test_conn_interface.c @@ -44,7 +44,7 @@ pthread_mutex_t svc_mut=PTHREAD_MUTEX_INITIALIZER; pthread_cond_t svc_con=PTHREAD_COND_INITIALIZER; int numLoops; parodusOnPingStatusChangeHandler on_ping_status_change; - + /*----------------------------------------------------------------------------*/ /* Mocks */ /*----------------------------------------------------------------------------*/ @@ -335,6 +335,7 @@ void test_createSocketConnection() void test_createSocketConnection1() { + numLoops =0; noPollCtx *ctx; ParodusCfg cfg; memset(&cfg,0, sizeof(ParodusCfg)); @@ -364,11 +365,11 @@ void test_createSocketConnection1() expect_function_call(nopoll_ctx_unref); expect_function_call(nopoll_cleanup_library); createSocketConnection(NULL); - } void test_PingMissIntervalTime() { + numLoops = 6; noPollCtx *ctx; ParodusCfg cfg; memset(&cfg,0,sizeof(ParodusCfg)); @@ -386,7 +387,6 @@ void test_PingMissIntervalTime() //Max ping timeout is 6 sec cfg.webpa_ping_timeout = 6; set_parodus_cfg(&cfg); - reset_close_retry(); expect_function_call(nopoll_thread_handlers); @@ -422,11 +422,11 @@ void test_PingMissIntervalTime() expect_function_call(nopoll_ctx_unref); expect_function_call(nopoll_cleanup_library); createSocketConnection(NULL); - } void err_createSocketConnection() { + numLoops =0; set_close_retry(); reset_heartBeatTimer(); expect_function_call(nopoll_thread_handlers); @@ -459,6 +459,7 @@ void err_createSocketConnection() void test_createSocketConnection_cloud_disconn() { + numLoops =0; ParodusCfg cfg; memset(&cfg,0,sizeof(ParodusCfg)); cfg.cloud_disconnect = strdup("XPC"); From c78625f35a62d149d7902fb8275b3d2dea5aac34 Mon Sep 17 00:00:00 2001 From: Shilpa Seshadri Date: Wed, 22 Sep 2021 12:53:53 +0530 Subject: [PATCH 006/137] Update to use nopoll version 1.0.3 --- CHANGELOG.md | 1 + CMakeLists.txt | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3fe1478..6a09012 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. - Add additional HTTP headers for call to Themis from Convey - Add callback handler for initial cloud connection status change event - Fix Parodus connection stuck on interface up down received together +- Update to use nopoll version 1.0.3 ## [1.1.4] - on connect retry, requery jwt only if it failed before diff --git a/CMakeLists.txt b/CMakeLists.txt index 6c526e9..5daf4a0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -86,7 +86,7 @@ add_dependencies(libtrower-base64 trower-base64) ExternalProject_Add(nopoll PREFIX ${PREFIX_DIR}/nopoll GIT_REPOSITORY https://github.com/Comcast/nopoll.git - GIT_TAG "1.0.2" + GIT_TAG "1.0.3" CONFIGURE_COMMAND COMMAND /autogen.sh --prefix=${PREFIX} --includedir=${INCLUDE_DIR} --libdir=${LIBRARY_DIR} From c98e2e2fb8be6c1c3c753170ec0dafa43876f3bd Mon Sep 17 00:00:00 2001 From: Shilpa Seshadri Date: Tue, 14 Sep 2021 19:22:56 +0530 Subject: [PATCH 007/137] Listener for webconfig upstream events --- src/CMakeLists.txt | 2 +- src/conn_interface.c | 1 + src/upstream.h | 1 + src/upstream_rbus.c | 87 ++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 90 insertions(+), 1 deletion(-) create mode 100644 src/upstream_rbus.c diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index aa3f66c..d430aea 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -14,7 +14,7 @@ set(SOURCES main.c mutex.c networking.c nopoll_helpers.c heartBeat.c nopoll_handlers.c ParodusInternal.c string_helpers.c time.c config.c conn_interface.c connection.c spin_thread.c client_list.c service_alive.c - upstream.c downstream.c thread_tasks.c partners_check.c token.c event_handler.c + upstream.c upstream_rbus.c downstream.c thread_tasks.c partners_check.c token.c event_handler.c crud_interface.c crud_tasks.c crud_internal.c close_retry.c auth_token.c privilege.c) if (ENABLE_SESHAT) diff --git a/src/conn_interface.c b/src/conn_interface.c index 3456267..ab088da 100644 --- a/src/conn_interface.c +++ b/src/conn_interface.c @@ -112,6 +112,7 @@ void createSocketConnection(void (* initKeypress)()) UpStreamMsgQ = NULL; StartThread(handle_upstream, &upstream_tid); StartThread(processUpstreamMessage, &upstream_msg_tid); + registerRBUSlistener(); ParodusMsgQ = NULL; StartThread(messageHandlerTask, &downstream_tid); StartThread(serviceAliveTask, &svc_alive_tid); diff --git a/src/upstream.h b/src/upstream.h index adf222e..df245c3 100644 --- a/src/upstream.h +++ b/src/upstream.h @@ -47,6 +47,7 @@ typedef struct UpStreamMsg__ void packMetaData(); void *handle_upstream(); void *processUpstreamMessage(); +void registerRBUSlistener(); int getDeviceId(char **device_id, size_t *device_id_len); void sendUpstreamMsgToServer(void **resp_bytes, size_t resp_size); void getServiceNameAndSendResponse(wrp_msg_t *msg, void **msg_bytes, size_t msg_size); diff --git a/src/upstream_rbus.c b/src/upstream_rbus.c new file mode 100644 index 0000000..69d19d0 --- /dev/null +++ b/src/upstream_rbus.c @@ -0,0 +1,87 @@ +/* + * upstream_rbus.c + * + * Created on: 09-Sep-2021 + * Author: infyuser + */ +#include +#include +#include "upstream.h" +#include "ParodusInternal.h" +#include "partners_check.h" + +void processWebconfigUpstreamMessage(rbusHandle_t handle, rbusMessage_t* msg, void * userData); + +/* API to register RBUS listener to receive messages from webconfig */ +void registerRBUSlistener() +{ + rbusError_t err; + rbusHandle_t rbus_Handle; + + err = rbus_open(&rbus_Handle, "parodus"); + if (err) + { + ParodusError("rbus_open:%s\n", rbusError_ToString(err)); + return; + } + ParodusInfo("B4 rbusMessage_AddListener\n"); + rbusMessage_AddListener(rbus_Handle, "webconfig.upstream", &processWebconfigUpstreamMessage, NULL); + ParodusInfo("After rbusMessage_AddListener\n"); +} + +void processWebconfigUpstreamMessage(rbusHandle_t handle, rbusMessage_t* msg, void * userData) +{ + int rv=-1; + wrp_msg_t *event_msg; + void *bytes; + + rv = wrp_to_struct( msg->data, msg->length, WRP_BYTES, &event_msg ); + if(rv > 0) + { + ParodusInfo(" Received upstream event data: dest '%s'\n", event_msg->u.event.dest); + partners_t *partnersList = NULL; + int j = 0; + + int ret = validate_partner_id(event_msg, &partnersList); + if(ret == 1) + { + wrp_msg_t *eventMsg = (wrp_msg_t *) malloc(sizeof(wrp_msg_t)); + eventMsg->msg_type = event_msg->msg_type; + eventMsg->u.event.content_type=event_msg->u.event.content_type; + eventMsg->u.event.source=event_msg->u.event.source; + eventMsg->u.event.dest=event_msg->u.event.dest; + eventMsg->u.event.payload=event_msg->u.event.payload; + eventMsg->u.event.payload_size=event_msg->u.event.payload_size; + eventMsg->u.event.headers=event_msg->u.event.headers; + eventMsg->u.event.metadata=event_msg->u.event.metadata; + eventMsg->u.event.partner_ids = partnersList; + + int size = wrp_struct_to( eventMsg, WRP_BYTES, &bytes ); + if(size > 0) + { + sendUpstreamMsgToServer(&bytes, size); + } + free(eventMsg); + free(bytes); + bytes = NULL; + } + else + { + sendUpstreamMsgToServer((void **)(&msg->data), msg->length); + } + if(partnersList != NULL) + { + for(j=0; j<(int)partnersList->count; j++) + { + if(NULL != partnersList->partner_ids[j]) + { + free(partnersList->partner_ids[j]); + } + } + free(partnersList); + } + partnersList = NULL; + } +} + + From c30d5a33622ef624063f2a22237af72c3d7de7d1 Mon Sep 17 00:00:00 2001 From: Sreedevi V Date: Thu, 23 Sep 2021 22:08:19 +0530 Subject: [PATCH 008/137] Listener for webconfig upstream events when bin distro is on --- CMakeLists.txt | 4 ++++ src/CMakeLists.txt | 5 ++++- src/conn_interface.c | 2 ++ 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 6c526e9..4dc4376 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -200,6 +200,10 @@ include_directories(${INCLUDE_DIR}/libseshat) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DENABLE_SESHAT ") endif (ENABLE_SESHAT) +if (ENABLE_WEBCFGBIN) +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DENABLE_WEBCFGBIN ") +endif (ENABLE_WEBCFGBIN) + # libcjwt external dependency #------------------------------------------------------------------------------- ExternalProject_Add(cjwt diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index d430aea..0c87c19 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -14,7 +14,7 @@ set(SOURCES main.c mutex.c networking.c nopoll_helpers.c heartBeat.c nopoll_handlers.c ParodusInternal.c string_helpers.c time.c config.c conn_interface.c connection.c spin_thread.c client_list.c service_alive.c - upstream.c upstream_rbus.c downstream.c thread_tasks.c partners_check.c token.c event_handler.c + upstream.c downstream.c thread_tasks.c partners_check.c token.c event_handler.c crud_interface.c crud_tasks.c crud_internal.c close_retry.c auth_token.c privilege.c) if (ENABLE_SESHAT) @@ -23,6 +23,9 @@ else() set(SOURCES ${SOURCES} seshat_interface_stub.c) endif (ENABLE_SESHAT) +if (ENABLE_WEBCFGBIN) +set(SOURCES ${SOURCES} upstream_rbus.c) +endif (ENABLE_WEBCFGBIN) add_executable(parodus ${SOURCES}) diff --git a/src/conn_interface.c b/src/conn_interface.c index ab088da..09794ac 100644 --- a/src/conn_interface.c +++ b/src/conn_interface.c @@ -112,7 +112,9 @@ void createSocketConnection(void (* initKeypress)()) UpStreamMsgQ = NULL; StartThread(handle_upstream, &upstream_tid); StartThread(processUpstreamMessage, &upstream_msg_tid); + #ifdef ENABLE_WEBCFGBIN registerRBUSlistener(); + #endif ParodusMsgQ = NULL; StartThread(messageHandlerTask, &downstream_tid); StartThread(serviceAliveTask, &svc_alive_tid); From d0e6c5bd75476bf3bb1fbf2b1d5b77ddf0e51ec2 Mon Sep 17 00:00:00 2001 From: Sreedevi V Date: Wed, 29 Sep 2021 16:18:38 +0530 Subject: [PATCH 009/137] Move webcfgbin distro flage to outside of BUILD_YOCTO check. --- CMakeLists.txt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index a81615f..b9528fb 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -200,10 +200,6 @@ include_directories(${INCLUDE_DIR}/libseshat) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DENABLE_SESHAT ") endif (ENABLE_SESHAT) -if (ENABLE_WEBCFGBIN) -set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DENABLE_WEBCFGBIN ") -endif (ENABLE_WEBCFGBIN) - # libcjwt external dependency #------------------------------------------------------------------------------- ExternalProject_Add(cjwt @@ -257,6 +253,10 @@ if (FEATURE_DNS_QUERY) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DFEATURE_DNS_QUERY ") endif (FEATURE_DNS_QUERY) +if (ENABLE_WEBCFGBIN) +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DENABLE_WEBCFGBIN ") +endif (ENABLE_WEBCFGBIN) + link_directories ( ${LIBRARY_DIR} ${COMMON_LIBRARY_DIR} ${LIBRARY_DIR64} ) add_subdirectory(src) if (BUILD_TESTING) From 5562d7ec48a156e7b90446228b780dffbf4dd52e Mon Sep 17 00:00:00 2001 From: knair410 Date: Mon, 6 Sep 2021 21:44:13 +0530 Subject: [PATCH 010/137] Use monotonic clock for heartBeat timer calculation. --- src/conn_interface.c | 14 +++++++++----- src/time.c | 2 +- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/src/conn_interface.c b/src/conn_interface.c index 3a86ac8..d84a3cd 100644 --- a/src/conn_interface.c +++ b/src/conn_interface.c @@ -77,6 +77,7 @@ void createSocketConnection(void (* initKeypress)()) server_list_t server_list; bool seshat_registered = false; int create_conn_rtn = 0; + int nopoll_returnvalue = 0; unsigned int webpa_ping_timeout_ms = 1000 * get_parodus_cfg()->webpa_ping_timeout; unsigned int heartBeatTimer = 0; struct timespec start_svc_alive_timer; @@ -131,14 +132,17 @@ void createSocketConnection(void (* initKeypress)()) struct timespec start, stop, diff; int time_taken_ms; - clock_gettime(CLOCK_REALTIME, &start); - nopoll_loop_wait(ctx, 5000000); - clock_gettime(CLOCK_REALTIME, &stop); + clock_gettime(CLOCK_MONOTONIC, &start); + nopoll_returnvalue = nopoll_loop_wait(ctx, 5000000); + clock_gettime(CLOCK_MONOTONIC, &stop); timespec_diff(&start, &stop, &diff); time_taken_ms = diff.tv_sec * 1000 + (diff.tv_nsec / 1000000); - - // ParodusInfo("nopoll_loop_wait() time %d msec\n", time_taken_ms); + if(time_taken_ms/1000 != 5) + { + ParodusInfo("nopoll_loop_wait value %d,nopoll_loop_wait() time %d msec\n",nopoll_returnvalue, time_taken_ms); + } + ParodusPrint("webpa_ping_timeout_ms %d msec\n", webpa_ping_timeout_ms); heartBeatTimer = get_heartBeatTimer(); if(heartBeatTimer >= webpa_ping_timeout_ms) { diff --git a/src/time.c b/src/time.c index 0c81356..ab1362e 100644 --- a/src/time.c +++ b/src/time.c @@ -34,7 +34,7 @@ uint64_t getCurrentTimeInMicroSeconds(struct timespec *timer) ParodusPrint("timer->tv_sec : %lu\n",timer->tv_sec); ParodusPrint("timer->tv_nsec : %lu\n",timer->tv_nsec); systime = (uint64_t)timer->tv_sec * 1000000L + timer->tv_nsec/ 1000; - return systime; + return systime; } long timeValDiff(struct timespec *starttime, struct timespec *finishtime) From 233a167cb4fc2df415b6fca9dbb87438b60d7764 Mon Sep 17 00:00:00 2001 From: Shilpa Seshadri Date: Tue, 26 Oct 2021 00:30:35 +0530 Subject: [PATCH 011/137] Use rbus subscribe API instead of addListener API --- src/conn_interface.c | 2 +- src/upstream_rbus.c | 40 +++++++++++++++++++++++++++++----------- 2 files changed, 30 insertions(+), 12 deletions(-) diff --git a/src/conn_interface.c b/src/conn_interface.c index ff868fe..be67af7 100644 --- a/src/conn_interface.c +++ b/src/conn_interface.c @@ -113,7 +113,7 @@ void createSocketConnection(void (* initKeypress)()) StartThread(handle_upstream, &upstream_tid); StartThread(processUpstreamMessage, &upstream_msg_tid); #ifdef ENABLE_WEBCFGBIN - registerRBUSlistener(); + subscribeRBUSevent(); #endif ParodusMsgQ = NULL; StartThread(messageHandlerTask, &downstream_tid); diff --git a/src/upstream_rbus.c b/src/upstream_rbus.c index 69d19d0..a3cf009 100644 --- a/src/upstream_rbus.c +++ b/src/upstream_rbus.c @@ -10,32 +10,47 @@ #include "ParodusInternal.h" #include "partners_check.h" -void processWebconfigUpstreamMessage(rbusHandle_t handle, rbusMessage_t* msg, void * userData); +#define WEBCFG_UPSTREAM_EVENT "Webconfig.Upstream" + +void processWebconfigUpstreamEvent(rbusHandle_t handle, rbusEvent_t const* event, rbusEventSubscription_t* subscription); + +void subscribeAsyncHandler( rbusHandle_t handle, rbusEventSubscription_t* subscription, rbusError_t error); /* API to register RBUS listener to receive messages from webconfig */ -void registerRBUSlistener() +void subscribeRBUSevent() { rbusError_t err; + int rc = RBUS_ERROR_SUCCESS; rbusHandle_t rbus_Handle; err = rbus_open(&rbus_Handle, "parodus"); if (err) { - ParodusError("rbus_open:%s\n", rbusError_ToString(err)); + ParodusError("rbus_open failed :%s\n", rbusError_ToString(err)); return; } - ParodusInfo("B4 rbusMessage_AddListener\n"); - rbusMessage_AddListener(rbus_Handle, "webconfig.upstream", &processWebconfigUpstreamMessage, NULL); - ParodusInfo("After rbusMessage_AddListener\n"); + rc = rbusEvent_SubscribeAsync(rbus_Handle,WEBCFG_UPSTREAM_EVENT,processWebconfigUpstreamEvent,subscribeAsyncHandler,"parodus",10*60); + if(rc != RBUS_ERROR_SUCCESS) + ParodusError("rbusEvent_Subscribe failed: %d, %s\n", rc, rbusError_ToString(rc)); + else + ParodusInfo("rbusEvent_Subscribe was successful\n"); } -void processWebconfigUpstreamMessage(rbusHandle_t handle, rbusMessage_t* msg, void * userData) +void processWebconfigUpstreamEvent(rbusHandle_t handle, rbusEvent_t const* event, rbusEventSubscription_t* subscription) { - int rv=-1; + (void)handle; + (void)subscription; + + int rv=-1; wrp_msg_t *event_msg; void *bytes; + int len; + rbusValue_t value = NULL; - rv = wrp_to_struct( msg->data, msg->length, WRP_BYTES, &event_msg ); + value = rbusObject_GetValue(event->data, "value"); + bytes = rbusValue_GetBytes(value, &len); + + rv = wrp_to_struct( bytes, len, WRP_BYTES, &event_msg ); if(rv > 0) { ParodusInfo(" Received upstream event data: dest '%s'\n", event_msg->u.event.dest); @@ -67,7 +82,7 @@ void processWebconfigUpstreamMessage(rbusHandle_t handle, rbusMessage_t* msg, vo } else { - sendUpstreamMsgToServer((void **)(&msg->data), msg->length); + sendUpstreamMsgToServer((void **)(&bytes), len); } if(partnersList != NULL) { @@ -84,4 +99,7 @@ void processWebconfigUpstreamMessage(rbusHandle_t handle, rbusMessage_t* msg, vo } } - +void subscribeAsyncHandler( rbusHandle_t handle, rbusEventSubscription_t* subscription, rbusError_t error) +{ + ParodusInfo("subscribeAsyncHandler event %s, error %d - %s\n",subscription->eventName, error, rbusError_ToString(error)); +} From c02b141f7c7b8320a655c481e4b23c470e1adc6c Mon Sep 17 00:00:00 2001 From: Shilpa Seshadri Date: Tue, 30 Nov 2021 19:55:40 +0530 Subject: [PATCH 012/137] Fixed license in new c file --- src/upstream_rbus.c | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/upstream_rbus.c b/src/upstream_rbus.c index a3cf009..7f6d4b6 100644 --- a/src/upstream_rbus.c +++ b/src/upstream_rbus.c @@ -1,9 +1,27 @@ -/* - * upstream_rbus.c +/** + * Copyright 2021 Comcast Cable Communications Management, LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. * - * Created on: 09-Sep-2021 - * Author: infyuser */ +/** + * @file upstream_rbus.c + * + * @description This is used for parodus-RBUS communication + * to send notification events upstream to cloud. + * + */ + #include #include #include "upstream.h" From 48722ffa7cd42fb314b06cdabd858e1b0d637d8f Mon Sep 17 00:00:00 2001 From: Sadhyama Vengilat Date: Mon, 6 Dec 2021 19:51:46 +0530 Subject: [PATCH 013/137] Fix parodus PC build issues when webconfig bin is ON --- CMakeLists.txt | 52 +++++++++++++++++++++++++++++++++++++ src/CMakeLists.txt | 4 ++- src/ParodusInternal.h | 4 ++- src/upstream_rbus.c | 6 +++-- tests/CMakeLists.txt | 21 ++++++++++++++- tests/test_conn_interface.c | 12 +++++++++ 6 files changed, 94 insertions(+), 5 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index b9528fb..2958f1c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -43,6 +43,13 @@ include_directories(${INCLUDE_DIR} ${INCLUDE_DIR}/cjwt ) +if (ENABLE_WEBCFGBIN) +include_directories(${INCLUDE_DIR}/rbus + ${INCLUDE_DIR}/rbus-core + ${INCLUDE_DIR}/rtmessage +) +endif (ENABLE_WEBCFGBIN) + # Get git commit hash #------------------------------------------------------------------------------- execute_process( @@ -229,6 +236,51 @@ include_directories(${INCLUDE_DIR} endif (FEATURE_DNS_QUERY) +if (ENABLE_WEBCFGBIN) +# rtMessage external dependency +#------------------------------------------------------------------------------- +ExternalProject_Add(rtMessage + #DEPENDS cJSON + PREFIX ${CMAKE_CURRENT_BINARY_DIR}/_prefix/rtMessage + GIT_REPOSITORY https://github.com/rdkcmf/rdk-rtmessage.git + GIT_TAG rdk-next + CMAKE_ARGS += -DBUILD_RTMESSAGE_LIB=ON + -DBUILD_RTMESSAGE_SAMPLE_APP=ON + -DBUILD_FOR_DESKTOP=OFF + -DCJSON_BUILD=OFF + -DBUILD_DATAPROVIDER_LIB=ON + -DCMAKE_INSTALL_PREFIX=${INSTALL_DIR} -DBUILD_TESTING=OFF +) +add_library(librtMessage STATIC SHARED IMPORTED) +add_dependencies(librtMessage rtMessage) + +# rbus-core external dependency +#------------------------------------------------------------------------------- +ExternalProject_Add(rbus-core + DEPENDS rtMessage + PREFIX ${CMAKE_CURRENT_BINARY_DIR}/_prefix/rbus-core + GIT_REPOSITORY https://github.com/rdkcmf/rbuscore.git + GIT_TAG rdk-next + CMAKE_ARGS += -DBUILD_FOR_DESKTOP=ON -DCMAKE_INSTALL_PREFIX=${INSTALL_DIR} + -DBUILD_TESTING=OFF +) +add_library(librbus-core STATIC SHARED IMPORTED) +add_dependencies(librbus-core rbus-core) + +# rbus external dependency +#------------------------------------------------------------------------------- +ExternalProject_Add(rbus + DEPENDS rtMessage rbus-core + PREFIX ${CMAKE_CURRENT_BINARY_DIR}/_prefix/rbus + GIT_REPOSITORY https://github.com/rdkcmf/rbus.git + GIT_TAG rdk-next + CMAKE_ARGS += -DBUILD_FOR_DESKTOP=ON -DCMAKE_INSTALL_PREFIX=${INSTALL_DIR} -DBUILD_TESTING=OFF +) + +add_library(librbus STATIC SHARED IMPORTED) +add_dependencies(librbus rbus) +endif (ENABLE_WEBCFGBIN) + if (BUILD_TESTING) # cmocka external dependency #------------------------------------------------------------------------------- diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 0c87c19..8138ca6 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -56,5 +56,7 @@ if (ENABLE_SESHAT) target_link_libraries (parodus -llibseshat) endif (ENABLE_SESHAT) - +if (ENABLE_WEBCFGBIN) +target_link_libraries (parodus -lrbus -lrbus-core) +endif (ENABLE_WEBCFGBIN) install (TARGETS parodus DESTINATION bin) diff --git a/src/ParodusInternal.h b/src/ParodusInternal.h index f8a1193..c722724 100644 --- a/src/ParodusInternal.h +++ b/src/ParodusInternal.h @@ -161,7 +161,9 @@ int readFromFile(const char *file_name, char **data); void timespec_diff(struct timespec *start, struct timespec *stop, struct timespec *result); - +#ifdef ENABLE_WEBCFGBIN +void subscribeRBUSevent(); +#endif /*------------------------------------------------------------------------------*/ /* For interface_down_event Flag */ /*------------------------------------------------------------------------------*/ diff --git a/src/upstream_rbus.c b/src/upstream_rbus.c index 7f6d4b6..e77344d 100644 --- a/src/upstream_rbus.c +++ b/src/upstream_rbus.c @@ -40,7 +40,6 @@ void subscribeRBUSevent() rbusError_t err; int rc = RBUS_ERROR_SUCCESS; rbusHandle_t rbus_Handle; - err = rbus_open(&rbus_Handle, "parodus"); if (err) { @@ -62,12 +61,14 @@ void processWebconfigUpstreamEvent(rbusHandle_t handle, rbusEvent_t const* event int rv=-1; wrp_msg_t *event_msg; void *bytes; + const uint8_t* bytesVal = NULL; int len; rbusValue_t value = NULL; value = rbusObject_GetValue(event->data, "value"); - bytes = rbusValue_GetBytes(value, &len); + bytesVal = rbusValue_GetBytes(value, &len); + bytes = (void*) bytesVal; rv = wrp_to_struct( bytes, len, WRP_BYTES, &event_msg ); if(rv > 0) { @@ -119,5 +120,6 @@ void processWebconfigUpstreamEvent(rbusHandle_t handle, rbusEvent_t const* event void subscribeAsyncHandler( rbusHandle_t handle, rbusEventSubscription_t* subscription, rbusError_t error) { + (void)handle; ParodusInfo("subscribeAsyncHandler event %s, error %d - %s\n",subscription->eventName, error, rbusError_ToString(error)); } diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index f1a9f9d..de460be 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -32,6 +32,10 @@ if (FEATURE_DNS_QUERY) set (PARODUS_COMMON_LIBS ${PARODUS_COMMON_LIBS} -lucresolv -lresolv) endif (FEATURE_DNS_QUERY) +if (ENABLE_WEBCFGBIN) +set (PARODUS_COMMON_LIBS ${PARODUS_COMMON_LIBS} -lrbus -lrbus-core) +endif (ENABLE_WEBCFGBIN) + if(NOT DISABLE_VALGRIND) set (MEMORY_CHECK valgrind --leak-check=full --show-reachable=yes -v) endif () @@ -154,7 +158,11 @@ set(CLIST_SRC ${CLIST_SRC} ../src/seshat_interface.c) else() set(CLIST_SRC ${CLIST_SRC} ../src/seshat_interface_stub.c) endif (ENABLE_SESHAT) - + +if (ENABLE_WEBCFGBIN) +set(CLIST_SRC ${CLIST_SRC} ../src/upstream_rbus.c) +endif (ENABLE_WEBCFGBIN) + add_executable(test_client_list ${CLIST_SRC}) #target_link_libraries (test_client_list ${PARODUS_CONN_LIBS} ${PARODUS_COMMON_LIBS}) target_link_libraries (test_client_list ${PARODUS_COMMON_LIBS} -lcurl -luuid) @@ -172,6 +180,10 @@ else() set(SVA_SRC ${SVA_SRC} ../src/seshat_interface_stub.c) endif (ENABLE_SESHAT) +if (ENABLE_WEBCFGBIN) +set(SVA_SRC ${SVA_SRC} ../src/upstream_rbus.c) +endif (ENABLE_WEBCFGBIN) + add_executable(test_service_alive ${SVA_SRC}) #target_link_libraries (test_service_alive ${PARODUS_CONN_LIBS} ${PARODUS_COMMON_LIBS}) target_link_libraries (test_service_alive ${PARODUS_COMMON_LIBS} -lcurl -luuid) @@ -294,6 +306,9 @@ set(CONIFC_SRC ${CONIFC_SRC} ../src/seshat_interface.c) else() set(CONIFC_SRC ${CONIFC_SRC} ../src/seshat_interface_stub.c) endif (ENABLE_SESHAT) +if (ENABLE_WEBCFGBIN) +set(CONIFC_SRC ${CONIFC_SRC} ../src/upstream_rbus.c) +endif (ENABLE_WEBCFGBIN) add_executable(test_conn_interface ${CONIFC_SRC}) target_link_libraries (test_conn_interface -lcmocka ${PARODUS_COMMON_LIBS} -lcurl -luuid ) @@ -340,6 +355,10 @@ else() set(TOKEN_SRC test_token_stub.c ${TOKEN_SRC}) endif (FEATURE_DNS_QUERY) +if (ENABLE_WEBCFGBIN) +set(TOKEN_SRC ${TOKEN_SRC} ../src/upstream_rbus.c) +endif (ENABLE_WEBCFGBIN) + add_executable(test_token ${TOKEN_SRC} ) #target_link_libraries (test_token ${PARODUS_COMMON_LIBS} ${PARODUS_JWT_LIBS} -lcmocka ) target_link_libraries (test_token ${PARODUS_COMMON_LIBS} -lcmocka -lcurl -luuid) diff --git a/tests/test_conn_interface.c b/tests/test_conn_interface.c index 465bfc5..32070e7 100644 --- a/tests/test_conn_interface.c +++ b/tests/test_conn_interface.c @@ -172,6 +172,18 @@ int serviceAliveTask() return 0; } +int validate_partner_id(wrp_msg_t *msg, partners_t **partnerIds) +{ + UNUSED(msg); UNUSED(partnerIds); + return 0; +} + +void sendUpstreamMsgToServer(void **resp_bytes, size_t resp_size) +{ + UNUSED(resp_bytes); UNUSED(resp_size); + return; +} + int nopoll_loop_wait(noPollCtx * ctx,long timeout) { UNUSED(ctx); UNUSED(timeout); From 0fb6288255c644a44efaf7a9311bafa86a041388 Mon Sep 17 00:00:00 2001 From: Sadhyama Vengilat Date: Wed, 19 Jan 2022 21:18:27 +0530 Subject: [PATCH 014/137] Parodus to support rbus xmidtSendData provider --- src/CMakeLists.txt | 2 +- src/ParodusInternal.h | 1 + src/conn_interface.c | 3 + src/upstream_rbus.c | 9 ++- src/xmidtsend_rbus.c | 141 ++++++++++++++++++++++++++++++++++++++++++ src/xmidtsend_rbus.h | 47 ++++++++++++++ 6 files changed, 201 insertions(+), 2 deletions(-) create mode 100644 src/xmidtsend_rbus.c create mode 100644 src/xmidtsend_rbus.h diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 8138ca6..8c41712 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -24,7 +24,7 @@ set(SOURCES ${SOURCES} seshat_interface_stub.c) endif (ENABLE_SESHAT) if (ENABLE_WEBCFGBIN) -set(SOURCES ${SOURCES} upstream_rbus.c) +set(SOURCES ${SOURCES} upstream_rbus.c xmidtsend_rbus.c) endif (ENABLE_WEBCFGBIN) add_executable(parodus ${SOURCES}) diff --git a/src/ParodusInternal.h b/src/ParodusInternal.h index c722724..9dcc00d 100644 --- a/src/ParodusInternal.h +++ b/src/ParodusInternal.h @@ -163,6 +163,7 @@ void timespec_diff(struct timespec *start, struct timespec *stop, #ifdef ENABLE_WEBCFGBIN void subscribeRBUSevent(); +int regXmidtSendDataMethod(); #endif /*------------------------------------------------------------------------------*/ /* For interface_down_event Flag */ diff --git a/src/conn_interface.c b/src/conn_interface.c index 4bb8116..af29b06 100644 --- a/src/conn_interface.c +++ b/src/conn_interface.c @@ -115,6 +115,9 @@ void createSocketConnection(void (* initKeypress)()) StartThread(processUpstreamMessage, &upstream_msg_tid); #ifdef ENABLE_WEBCFGBIN subscribeRBUSevent(); + ParodusInfo("B4 regXmidtSendDataMethod\n"); + regXmidtSendDataMethod(); + ParodusInfo("After regXmidtSendDataMethod\n"); #endif ParodusMsgQ = NULL; StartThread(messageHandlerTask, &downstream_tid); diff --git a/src/upstream_rbus.c b/src/upstream_rbus.c index e77344d..61daad6 100644 --- a/src/upstream_rbus.c +++ b/src/upstream_rbus.c @@ -30,16 +30,23 @@ #define WEBCFG_UPSTREAM_EVENT "Webconfig.Upstream" +static rbusHandle_t rbus_Handle; + void processWebconfigUpstreamEvent(rbusHandle_t handle, rbusEvent_t const* event, rbusEventSubscription_t* subscription); void subscribeAsyncHandler( rbusHandle_t handle, rbusEventSubscription_t* subscription, rbusError_t error); +rbusHandle_t get_parodus_rbus_Handle(void) +{ + return rbus_Handle; +} + /* API to register RBUS listener to receive messages from webconfig */ void subscribeRBUSevent() { rbusError_t err; int rc = RBUS_ERROR_SUCCESS; - rbusHandle_t rbus_Handle; + //rbusHandle_t rbus_Handle; err = rbus_open(&rbus_Handle, "parodus"); if (err) { diff --git a/src/xmidtsend_rbus.c b/src/xmidtsend_rbus.c new file mode 100644 index 0000000..ab9ed12 --- /dev/null +++ b/src/xmidtsend_rbus.c @@ -0,0 +1,141 @@ +/** + * Copyright 2022 Comcast Cable Communications Management, LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +/** + * @file xmidtsend_rbus.c + * + * @description Parodus to register as a provider for "xmidt_sendData" and provide the functionality to send the telemetry payload via Xmidt using the parameters supplied to the xmidt_sendData function. + * + */ + +#include +#include +#include "upstream.h" +#include "ParodusInternal.h" +#include "partners_check.h" +#include "xmidtsend_rbus.h" + +#define XMIDT_SEND_METHOD "Device.X_RDK_Xmidt.SendData" +static bool returnStatus = true; +typedef struct MethodData +{ + rbusMethodAsyncHandle_t asyncHandle; + rbusObject_t inParams; +} MethodData; + +static void* asyncMethodHandler(void *p) +{ + MethodData* data; + rbusObject_t outParams; + rbusValue_t value; + rbusError_t err; + ParodusInfo("Enter asyncMethodHandler\n"); + + //This should be a consumer that awake when xpc ack is received. + ParodusInfo("sleep of 10s for sending aync response back\n"); + sleep(10); + ParodusInfo("sleep done\n"); + data = p; + rbusValue_Init(&value); + rbusValue_SetString(value, "Async method response from parodus"); + rbusObject_Init(&outParams, NULL); + rbusObject_SetValue(outParams, "value", value); + rbusValue_Release(value); + if(returnStatus) + { + ParodusInfo("asyncMethodHandler sending response as success\n"); + err = rbusMethod_SendAsyncResponse(data->asyncHandle, RBUS_ERROR_SUCCESS, outParams); + } + else + { + ParodusInfo("asyncMethodHandler sending response as failure\n"); + err = rbusMethod_SendAsyncResponse(data->asyncHandle, RBUS_ERROR_INVALID_RESPONSE_FROM_DESTINATION, outParams); + } + if(err != RBUS_ERROR_SUCCESS) + { + ParodusInfo("asyncMethodHandler rbusMethod_SendAsyncResponse failed err:%d\n", err); + } + else + { + ParodusInfo("asyncMethodHandler sent response to t2:%d\n", err); + } + rbusObject_Release(data->inParams); + rbusObject_Release(outParams); + if(data !=NULL) + { + free(data); + data = NULL; + } + ParodusInfo("Exit asyncMethodHandler\n"); + return NULL; +} + + +static rbusError_t sendDataHandler(rbusHandle_t handle, char const* methodName, rbusObject_t inParams, rbusObject_t outParams, rbusMethodAsyncHandle_t asyncHandle) +{ + (void) handle; + ParodusInfo("methodHandler called: %s\n", methodName); + //rbusObject_fwrite(inParams, 1, stdout); + if(strcmp(methodName, XMIDT_SEND_METHOD) == 0) + { + pthread_t pid; + MethodData* data = malloc(sizeof(MethodData)); + data->asyncHandle = asyncHandle; + data->inParams = inParams; + rbusObject_Retain(inParams); + if(pthread_create(&pid, NULL, asyncMethodHandler, data) || pthread_detach(pid)) + { + ParodusError("sendDataHandler failed to create thread\n"); + return RBUS_ERROR_BUS_ERROR; + } + ParodusInfo("sendDataHandler created async thread, returned %d\n", RBUS_ERROR_ASYNC_RESPONSE); + return RBUS_ERROR_ASYNC_RESPONSE; + } + else + { + ParodusError("Method %s received is not supported\n", methodName); + return RBUS_ERROR_BUS_ERROR; + } +} + + +int regXmidtSendDataMethod() +{ + int rc = RBUS_ERROR_SUCCESS; + rbusDataElement_t dataElements[1] = { { XMIDT_SEND_METHOD, RBUS_ELEMENT_TYPE_METHOD, { NULL, NULL, NULL, NULL, NULL, sendDataHandler } } }; + + rbusHandle_t rbus_handle = get_parodus_rbus_Handle(); + + ParodusInfo("Registering xmidt_sendData method %s\n", XMIDT_SEND_METHOD); + if(!rbus_handle) + { + ParodusError("regXmidtSendDataMethod failed in getting bus handles\n"); + return -1; + } + + rc = rbus_regDataElements(rbus_handle, 1, dataElements); + + if(rc != RBUS_ERROR_SUCCESS) + { + ParodusError("SendData provider: rbus_regDataElements failed: %d\n", rc); + } + else + { + ParodusInfo("SendData method provider register success\n"); + } + + return rc; +} diff --git a/src/xmidtsend_rbus.h b/src/xmidtsend_rbus.h new file mode 100644 index 0000000..f4abf1e --- /dev/null +++ b/src/xmidtsend_rbus.h @@ -0,0 +1,47 @@ +/** + * Copyright 2022 Comcast Cable Communications Management, LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +/** + * @file xmidtsend_rbus.h + * + * @description This header defines functions required to manage xmidt send messages. + * + */ + +#ifndef _XMIDTSEND_RBUS_H_ +#define _XMIDTSEND_RBUS_H_ +#include +#ifdef __cplusplus +extern "C" { +#endif + +/*----------------------------------------------------------------------------*/ +/* Data Structures */ +/*----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------*/ +/* Function Prototypes */ +/*----------------------------------------------------------------------------*/ + +rbusHandle_t get_parodus_rbus_Handle(void); + +#ifdef __cplusplus +} +#endif + + +#endif /* _XMIDTSEND_RBUS_H_ */ + From aaeb1f66123afccfa074a362132bab91b14f38b0 Mon Sep 17 00:00:00 2001 From: Sadhyama Vengilat Date: Fri, 11 Feb 2022 13:51:21 +0530 Subject: [PATCH 015/137] To send parodus ack response back to caller --- src/xmidtsend_rbus.c | 31 +++++++++++++++++++++++++------ 1 file changed, 25 insertions(+), 6 deletions(-) diff --git a/src/xmidtsend_rbus.c b/src/xmidtsend_rbus.c index ab9ed12..593c514 100644 --- a/src/xmidtsend_rbus.c +++ b/src/xmidtsend_rbus.c @@ -42,17 +42,17 @@ static void* asyncMethodHandler(void *p) rbusObject_t outParams; rbusValue_t value; rbusError_t err; - ParodusInfo("Enter asyncMethodHandler\n"); + ParodusInfo("Enter asyncMethodHandler. sending aync response back\n"); //This should be a consumer that awake when xpc ack is received. - ParodusInfo("sleep of 10s for sending aync response back\n"); - sleep(10); - ParodusInfo("sleep done\n"); + //ParodusInfo("sleep of 10s for sending aync response back\n"); + //sleep(10); + //ParodusInfo("sleep done\n"); data = p; rbusValue_Init(&value); rbusValue_SetString(value, "Async method response from parodus"); rbusObject_Init(&outParams, NULL); - rbusObject_SetValue(outParams, "value", value); + rbusObject_SetValue(outParams, "parodus_ack_response", value); rbusValue_Release(value); if(returnStatus) { @@ -88,7 +88,26 @@ static rbusError_t sendDataHandler(rbusHandle_t handle, char const* methodName, { (void) handle; ParodusInfo("methodHandler called: %s\n", methodName); - //rbusObject_fwrite(inParams, 1, stdout); + rbusObject_fwrite(inParams, 1, stdout); + + ParodusInfo("Print InParams..\n"); + rbusValue_t name = rbusObject_GetValue(inParams, "name"); + + //if(name && (rbusValue_GetType(name) == RBUS_STRING)) + //{ + ParodusInfo("name type: %d\n", rbusValue_GetType(name)); + char * nameStr = rbusValue_ToString(name, NULL, 0); + //char * nameStr = rbusValue_GetString(name, NULL); + ParodusInfo("name received is %s\n", nameStr); + + ParodusInfo("payload..\n"); + rbusValue_t payload = rbusObject_GetValue(inParams, "payload"); + ParodusInfo("payload type: %d\n", rbusValue_GetType(payload)); + //char * payloadStr = rbusValue_GetString(payload, NULL); + char * payloadStr = rbusValue_ToString(payload, NULL, 0); + ParodusInfo("payloadStr received is %s\n", payloadStr); + //} + ParodusInfo("Print InParams done\n"); if(strcmp(methodName, XMIDT_SEND_METHOD) == 0) { pthread_t pid; From f3a4daeb74d896a274c9175d4bc59f8c05d061fc Mon Sep 17 00:00:00 2001 From: Sadhyama Vengilat Date: Tue, 22 Feb 2022 15:40:47 +0530 Subject: [PATCH 016/137] To extract inParams received from consumer --- src/xmidtsend_rbus.c | 133 +++++++++++++++++++++++++++++++++++++------ 1 file changed, 115 insertions(+), 18 deletions(-) diff --git a/src/xmidtsend_rbus.c b/src/xmidtsend_rbus.c index 593c514..fb3be63 100644 --- a/src/xmidtsend_rbus.c +++ b/src/xmidtsend_rbus.c @@ -83,31 +83,128 @@ static void* asyncMethodHandler(void *p) return NULL; } +void displayInputParameters(rbusObject_t inParams) +{ + //contentType + rbusValue_t contenttype = rbusObject_GetValue(inParams, "contentType"); + if(contenttype) + { + if(rbusValue_GetType(contenttype) == RBUS_STRING) + { + char * contenttypeStr = rbusValue_GetString(contenttype, NULL); + ParodusInfo("contenttype value received is %s\n", contenttypeStr); + } + } + else + { + ParodusError("contenttype is empty\n"); + } + + //msg_type + rbusValue_t msg_type = rbusObject_GetValue(inParams, "msg_type"); + if(msg_type) + { + if(rbusValue_GetType(msg_type) == RBUS_STRING) + { + char *msg_typeStr = rbusValue_GetString(msg_type, NULL); + ParodusInfo("msg_type value received is %s\n", msg_typeStr); + } + } + else + { + ParodusError("msg_type is empty\n"); + } + + //source + rbusValue_t source = rbusObject_GetValue(inParams, "source"); + if(source) + { + if(rbusValue_GetType(source) == RBUS_STRING) + { + char * sourceStr = rbusValue_GetString(source, NULL); + ParodusInfo("source value received is %s\n", sourceStr); + } + } + else + { + ParodusError("source is empty\n"); + } + + //dest_root + rbusValue_t dest_root = rbusObject_GetValue(inParams, "dest_root"); + if(dest_root) + { + if(rbusValue_GetType(dest_root) == RBUS_STRING) + { + char * dest_rootStr = rbusValue_GetString(dest_root, NULL); + ParodusInfo("dest_root value received is %s\n", dest_rootStr); + } + } + else + { + ParodusError("dest_root is empty\n"); + } + + //dest_path + rbusValue_t dest_path = rbusObject_GetValue(inParams, "dest_path"); + if(dest_path) + { + if(rbusValue_GetType(dest_path) == RBUS_STRING) + { + char * dest_pathStr = rbusValue_GetString(dest_path, NULL); + ParodusInfo("dest_path value received is %s\n", dest_pathStr); + } + } + else + { + ParodusError("dest_path is empty\n"); + } + + //payload + rbusValue_t payload = rbusObject_GetValue(inParams, "payload"); + if(payload) + { + if((rbusValue_GetType(payload) == RBUS_STRING)) + { + char * payloadStr = rbusValue_GetString(payload, NULL); + ParodusInfo("payload received is %s\n", payloadStr); + } + } + else + { + ParodusError("payload is empty\n"); + } + + //payloadlen + ParodusInfo("check payloadlen\n"); + rbusValue_t payloadlen = rbusObject_GetValue(inParams, "payloadlen"); + ParodusInfo("payloadlen value object\n"); + if(payloadlen) + { + ParodusInfo("payloadlen is not empty\n"); + if(rbusValue_GetType(payloadlen) == RBUS_INT32) + { + ParodusInfo("payloadlen type %d RBUS_INT32 %d\n", rbusValue_GetType(payloadlen), RBUS_INT32); + int payloadlength = rbusValue_GetInt32(payloadlen); + ParodusInfo("payloadlen received is %d\n", payloadlength); + } + } + else + { + ParodusError("payloadlen is empty\n"); + } +} static rbusError_t sendDataHandler(rbusHandle_t handle, char const* methodName, rbusObject_t inParams, rbusObject_t outParams, rbusMethodAsyncHandle_t asyncHandle) { (void) handle; ParodusInfo("methodHandler called: %s\n", methodName); - rbusObject_fwrite(inParams, 1, stdout); + //rbusObject_fwrite(inParams, 1, stdout); - ParodusInfo("Print InParams..\n"); - rbusValue_t name = rbusObject_GetValue(inParams, "name"); + ParodusInfo("displayInputParameters ..\n"); + displayInputParameters(inParams); + ParodusInfo("displayInputParameters done\n"); - //if(name && (rbusValue_GetType(name) == RBUS_STRING)) - //{ - ParodusInfo("name type: %d\n", rbusValue_GetType(name)); - char * nameStr = rbusValue_ToString(name, NULL, 0); - //char * nameStr = rbusValue_GetString(name, NULL); - ParodusInfo("name received is %s\n", nameStr); - - ParodusInfo("payload..\n"); - rbusValue_t payload = rbusObject_GetValue(inParams, "payload"); - ParodusInfo("payload type: %d\n", rbusValue_GetType(payload)); - //char * payloadStr = rbusValue_GetString(payload, NULL); - char * payloadStr = rbusValue_ToString(payload, NULL, 0); - ParodusInfo("payloadStr received is %s\n", payloadStr); - //} - ParodusInfo("Print InParams done\n"); if(strcmp(methodName, XMIDT_SEND_METHOD) == 0) { pthread_t pid; From 5b26fe38f541dd49d435013eb914ea6ddb081f15 Mon Sep 17 00:00:00 2001 From: Thanusha D Date: Mon, 28 Feb 2022 12:41:21 +0530 Subject: [PATCH 017/137] Time value in parodus is higher --- src/connection.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/connection.c b/src/connection.c index e51e7dc..a44cf94 100644 --- a/src/connection.c +++ b/src/connection.c @@ -717,10 +717,9 @@ int createNopollConnection(noPollCtx *ctx, server_list_t *server_list) { create_connection_ctx_t conn_ctx; int max_retry_count; - struct timespec connect_time,*connectTimePtr; - connectTimePtr = &connect_time; backoff_timer_t backoff_timer; static int init_conn_failure=1; + struct sysinfo l_sSysInfo; if(ctx == NULL) { return nopoll_false; @@ -800,9 +799,9 @@ int createNopollConnection(noPollCtx *ctx, server_list_t *server_list) on_ping_status_change("received"); } - if((get_parodus_cfg()->boot_time != 0) && init) { - getCurrentTime(connectTimePtr); - ParodusInfo("connect_time-diff-boot_time=%d\n", connectTimePtr->tv_sec - get_parodus_cfg()->boot_time); + if(init) { + sysinfo(&l_sSysInfo); + ParodusInfo("connect_time-diff-boot_time=%ld\n", l_sSysInfo.uptime); init = 0; //set init to 0 so that this is logged only during process start up and not during reconnect } From 1833c30e83e3799459e0c68e329d4725cddd0278 Mon Sep 17 00:00:00 2001 From: Vasuki Date: Mon, 28 Feb 2022 15:57:02 +0530 Subject: [PATCH 018/137] Parodus changes for Wanifailover support --- src/ParodusInternal.h | 4 ++++ src/config.c | 21 ++++++++++++++++--- src/config.h | 3 +++ src/upstream_rbus.c | 49 +++++++++++++++++++++++++++++++++++++++++-- 4 files changed, 72 insertions(+), 5 deletions(-) diff --git a/src/ParodusInternal.h b/src/ParodusInternal.h index c722724..338d24f 100644 --- a/src/ParodusInternal.h +++ b/src/ParodusInternal.h @@ -164,6 +164,10 @@ void timespec_diff(struct timespec *start, struct timespec *stop, #ifdef ENABLE_WEBCFGBIN void subscribeRBUSevent(); #endif + +#ifdef WAN_FAILOVER_SUPPORTED +int subscribeCurrentActiveInterfaceEvent(); +#endif /*------------------------------------------------------------------------------*/ /* For interface_down_event Flag */ /*------------------------------------------------------------------------------*/ diff --git a/src/config.c b/src/config.c index b710b8a..8aa05f6 100644 --- a/src/config.c +++ b/src/config.c @@ -33,6 +33,7 @@ /*----------------------------------------------------------------------------*/ /* File Scoped Variables */ /*----------------------------------------------------------------------------*/ +pthread_mutex_t config_mut=PTHREAD_MUTEX_INITIALIZER; static ParodusCfg parodusCfg; static unsigned int rsa_algorithms = @@ -480,8 +481,8 @@ int parseCommandLine(int argc,char **argv,ParodusCfg * cfg) break; case 'i': - parStrncpy(cfg->webpa_interface_used, optarg,sizeof(cfg->webpa_interface_used)); - ParodusInfo("webpa_interface_used is %s\n",cfg->webpa_interface_used); + parStrncpy(getWebpaInterface(), optarg,sizeof(getWebpaInterface())); + ParodusInfo("webpa_interface_used is %s\n",getWebpaInterface()); break; case 'l': @@ -724,7 +725,7 @@ void loadParodusCfg(ParodusCfg * config,ParodusCfg *cfg) } if(strlen(config->webpa_interface_used )!=0) { - parStrncpy(cfg->webpa_interface_used, config->webpa_interface_used,sizeof(cfg->webpa_interface_used)); + parStrncpy(getWebpaInterface(), config->webpa_interface_used,sizeof(getWebpaInterface())); } else { @@ -848,4 +849,18 @@ void loadParodusCfg(ParodusCfg * config,ParodusCfg *cfg) } } +#ifdef WAN_FAILOVER_SUPPORTED +void setWebpaInterface(char *value) +{ + pthread_mutex_lock (&config_mut); + parStrncpy(cfg->webpa_interface_used, value, sizeof(cfg->webpa_interface_used)); + pthread_mutex_unlock (&config_mut); +} +char * getWebpaInterface(void) +{ + pthread_mutex_lock (&config_mut); + return cfg->webpa_interface_used; + pthread_mutex_unlock (&config_mut); +} +#endif diff --git a/src/config.h b/src/config.h index f7fc56a..ff503c0 100644 --- a/src/config.h +++ b/src/config.h @@ -24,6 +24,7 @@ #ifndef _CONFIG_H_ #define _CONFIG_H_ +#include #ifdef __cplusplus extern "C" { #endif @@ -139,6 +140,8 @@ void set_parodus_cfg(ParodusCfg *); char *get_token_application(void) ; void set_cloud_disconnect_reason(ParodusCfg *cfg, char *disconn_reason); void reset_cloud_disconnect_reason(ParodusCfg *cfg); +char * getWebpaInterface(void); +void setWebpaInterface(char *value); /** * parse a webpa url. Extract the server address, the port * and return whether it's secure or not diff --git a/src/upstream_rbus.c b/src/upstream_rbus.c index e77344d..7993563 100644 --- a/src/upstream_rbus.c +++ b/src/upstream_rbus.c @@ -29,17 +29,21 @@ #include "partners_check.h" #define WEBCFG_UPSTREAM_EVENT "Webconfig.Upstream" +#define WEBPA_INTERFACE "Device.X_RDK_WanManager.CurrentActiveInterfaceEvent" + +rbusHandle_t rbus_Handle; +rbusError_t err; void processWebconfigUpstreamEvent(rbusHandle_t handle, rbusEvent_t const* event, rbusEventSubscription_t* subscription); void subscribeAsyncHandler( rbusHandle_t handle, rbusEventSubscription_t* subscription, rbusError_t error); +void eventReceiveHandler( rbusHandle_t rbus_handle, rbusEvent_t const* event, rbusEventSubscription_t* subscription ); + /* API to register RBUS listener to receive messages from webconfig */ void subscribeRBUSevent() { - rbusError_t err; int rc = RBUS_ERROR_SUCCESS; - rbusHandle_t rbus_Handle; err = rbus_open(&rbus_Handle, "parodus"); if (err) { @@ -53,6 +57,29 @@ void subscribeRBUSevent() ParodusInfo("rbusEvent_Subscribe was successful\n"); } +/* API to subscribe Active Interface name on value change event*/ +int subscribeCurrentActiveInterfaceEvent() +{ + err = rbus_open(&rbus_Handle, "parodus"); + if (err) + { + ParodusError("rbus_open failed :%s\n", rbusError_ToString(err)); + return; + } + int rc = RBUS_ERROR_SUCCESS; + ParodusInfo("Subscribing to Device.X_RDK_WanManager.CurrentActiveInterfaceEvent\n"); + rc = rbusEvent_Subscribe(rbus_handle,WEBPA_INTERFACE,eventReceiveHandler," ",0); + if(rc != RBUS_ERROR_SUCCESS) + { + ParodusInfo("Device.X_RDK_WanManager.CurrentActiveInterface subscribe failed : %d\n", rc); + } + else + { + ParodusInfo("Device.X_RDK_WanManager.CurrentActiveInterface subscribe successful\n"); + } + return rc; +} + void processWebconfigUpstreamEvent(rbusHandle_t handle, rbusEvent_t const* event, rbusEventSubscription_t* subscription) { (void)handle; @@ -123,3 +150,21 @@ void subscribeAsyncHandler( rbusHandle_t handle, rbusEventSubscription_t* subscr (void)handle; ParodusInfo("subscribeAsyncHandler event %s, error %d - %s\n",subscription->eventName, error, rbusError_ToString(error)); } + +void eventReceiveHandler( rbusHandle_t rbus_handle, rbusEvent_t const* event, rbusEventSubscription_t* subscription ) +{ + (void)rbus_handle; + char * interface = NULL; + rbusValue_t newValue = rbusObject_GetValue(event->data, "value"); + rbusValue_t oldValue = rbusObject_GetValue(event->data, "oldValue"); + ParodusInfo("Consumer receiver ValueChange event for param %s\n", event->name); + + if(newValue) { + ParodusInfo("New Value: %s\n", rbusValue_GetString(newValue, NULL)); + interface = (char *) rbusValue_GetString(newValue, NULL); + setWebpaInterface(interface); + ParodusInfo("New Interface value g_interface = %s\n",get_global_interface()); + } + if(oldValue) + ParodusInfo(" Old Value: %s\n", rbusValue_GetString(oldValue, NULL)); +} From a34db44c90eeb4c130f0a39f1bcc60b17d21ee02 Mon Sep 17 00:00:00 2001 From: Vasuki Date: Wed, 2 Mar 2022 19:13:44 +0530 Subject: [PATCH 019/137] Parodus changes for Wanifailover support-2 --- src/ParodusInternal.c | 4 ++-- src/ParodusInternal.h | 3 --- src/auth_token.c | 6 +++--- src/config.c | 22 ++++++++++++++-------- src/conn_interface.c | 3 +++ src/connection.c | 2 +- src/crud_internal.c | 6 +++--- src/upstream.c | 2 +- src/upstream.h | 3 +++ src/upstream_rbus.c | 10 ++++++++-- tests/simple_connection.c | 4 ++-- tests/test_config.c | 2 +- 12 files changed, 41 insertions(+), 26 deletions(-) diff --git a/src/ParodusInternal.c b/src/ParodusInternal.c index 054f25a..cdbeff2 100644 --- a/src/ParodusInternal.c +++ b/src/ParodusInternal.c @@ -69,9 +69,9 @@ char* getWebpaConveyHeader() cJSON_AddStringToObject(response, WEBPA_PROTOCOL, get_parodus_cfg()->webpa_protocol); } - if(strlen(get_parodus_cfg()->webpa_interface_used)!=0) + if(strlen(getWebpaInterface())!=0) { - cJSON_AddStringToObject(response, WEBPA_INTERFACE, get_parodus_cfg()->webpa_interface_used); + cJSON_AddStringToObject(response, WEBPA_INTERFACE, getWebpaInterface()); } if(strlen(get_parodus_cfg()->hw_last_reboot_reason)!=0) diff --git a/src/ParodusInternal.h b/src/ParodusInternal.h index 338d24f..915a91f 100644 --- a/src/ParodusInternal.h +++ b/src/ParodusInternal.h @@ -165,9 +165,6 @@ void timespec_diff(struct timespec *start, struct timespec *stop, void subscribeRBUSevent(); #endif -#ifdef WAN_FAILOVER_SUPPORTED -int subscribeCurrentActiveInterfaceEvent(); -#endif /*------------------------------------------------------------------------------*/ /* For interface_down_event Flag */ /*------------------------------------------------------------------------------*/ diff --git a/src/auth_token.c b/src/auth_token.c index 9bc694b..32191fd 100644 --- a/src/auth_token.c +++ b/src/auth_token.c @@ -80,9 +80,9 @@ int requestNewAuthToken(char *newToken, size_t len, int r_count) curl_easy_setopt(curl, CURLOPT_URL, get_parodus_cfg()->token_server_url); curl_easy_setopt(curl, CURLOPT_TIMEOUT, CURL_TIMEOUT_SEC); - if(get_parodus_cfg()->webpa_interface_used !=NULL && strlen(get_parodus_cfg()->webpa_interface_used) >0) + if(getWebpaInterface() !=NULL && strlen(getWebpaInterface()) >0) { - curl_easy_setopt(curl, CURLOPT_INTERFACE, get_parodus_cfg()->webpa_interface_used); + curl_easy_setopt(curl, CURLOPT_INTERFACE, getWebpaInterface()); } /* set callback for writing received data */ curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_callback_fn); @@ -304,7 +304,7 @@ void createCurlheader(struct curl_slist *list, struct curl_slist **header_list) snprintf(buf, MAX_BUF_SIZE, "X-Midt-Protocol: %s", get_parodus_cfg()->webpa_protocol); list = curl_slist_append(list, buf); - snprintf(buf, MAX_BUF_SIZE, "X-Midt-Interface-Used: %s", get_parodus_cfg()->webpa_interface_used); + snprintf(buf, MAX_BUF_SIZE, "X-Midt-Interface-Used: %s", getWebpaInterface()); list = curl_slist_append(list, buf); snprintf(buf, MAX_BUF_SIZE, "X-Midt-Last-Reboot-Reason: %s", get_parodus_cfg()->hw_last_reboot_reason); diff --git a/src/config.c b/src/config.c index 8aa05f6..35802b7 100644 --- a/src/config.c +++ b/src/config.c @@ -853,14 +853,20 @@ void loadParodusCfg(ParodusCfg * config,ParodusCfg *cfg) void setWebpaInterface(char *value) { pthread_mutex_lock (&config_mut); - parStrncpy(cfg->webpa_interface_used, value, sizeof(cfg->webpa_interface_used)); - pthread_mutex_unlock (&config_mut); -} - -char * getWebpaInterface(void) -{ - pthread_mutex_lock (&config_mut); - return cfg->webpa_interface_used; + parStrncpy(get_parodus_cfg()->webpa_interface_used, value, sizeof(get_parodus_cfg()->webpa_interface_used)); pthread_mutex_unlock (&config_mut); } #endif + +char * getWebpaInterface(void) +{ + #ifdef WAN_FAILOVER_SUPPORTED + ParodusPrint("WAN_FAILOVER_SUPPORTED mode \n"); + pthread_mutex_lock (&config_mut); + return get_parodus_cfg()->webpa_interface_used; + pthread_mutex_unlock (&config_mut); + else + ParodusPrint("Erouter0 interface \n"); + return get_parodus_cfg()->webpa_interface_used; +} + diff --git a/src/conn_interface.c b/src/conn_interface.c index 4bb8116..2cd1a63 100644 --- a/src/conn_interface.c +++ b/src/conn_interface.c @@ -116,6 +116,9 @@ void createSocketConnection(void (* initKeypress)()) #ifdef ENABLE_WEBCFGBIN subscribeRBUSevent(); #endif + #ifdef WAN_FAILOVER_SUPPORTED + subscribeCurrentActiveInterfaceEvent(); + #endif ParodusMsgQ = NULL; StartThread(messageHandlerTask, &downstream_tid); StartThread(serviceAliveTask, &svc_alive_tid); diff --git a/src/connection.c b/src/connection.c index e51e7dc..99d2ea2 100644 --- a/src/connection.c +++ b/src/connection.c @@ -862,7 +862,7 @@ static noPollConnOpts * createConnOpts (char * extra_headers, bool secure) nopoll_conn_opts_ssl_peer_verify (opts, nopoll_true); nopoll_conn_opts_set_ssl_protocol (opts, NOPOLL_METHOD_TLSV1_2); } - nopoll_conn_opts_set_interface (opts,get_parodus_cfg()->webpa_interface_used); + nopoll_conn_opts_set_interface (opts,getWebpaInterface()); nopoll_conn_opts_set_extra_headers (opts,extra_headers); return opts; } diff --git a/src/crud_internal.c b/src/crud_internal.c index 0a77490..ccd293f 100644 --- a/src/crud_internal.c +++ b/src/crud_internal.c @@ -537,13 +537,13 @@ int retrieveFromMemory(char *keyName, cJSON **jsonresponse) } else if(strcmp(WEBPA_INTERFACE, keyName)==0) { - if((get_parodus_cfg()->webpa_interface_used !=NULL)&& (strlen(get_parodus_cfg()->fw_name)==0)) + if((getWebpaInterface() !=NULL)&& (strlen(get_parodus_cfg()->fw_name)==0)) { ParodusError("retrieveFromMemory: webpa_interface_used value is NULL\n"); return -1; } - ParodusInfo("retrieveFromMemory: keyName:%s value:%s\n",keyName,get_parodus_cfg()->webpa_interface_used); - cJSON_AddItemToObject( *jsonresponse, WEBPA_INTERFACE , cJSON_CreateString(get_parodus_cfg()->webpa_interface_used)); + ParodusInfo("retrieveFromMemory: keyName:%s value:%s\n",keyName,getWebpaInterface()); + cJSON_AddItemToObject( *jsonresponse, WEBPA_INTERFACE , cJSON_CreateString(getWebpaInterface())); } else if(strcmp(WEBPA_URL, keyName)==0) { diff --git a/src/upstream.c b/src/upstream.c index 0f13df0..84dfd4b 100644 --- a/src/upstream.c +++ b/src/upstream.c @@ -95,7 +95,7 @@ void packMetaData() {LAST_RECONNECT_REASON, get_global_reconnect_reason()}, {WEBPA_PROTOCOL, get_parodus_cfg()->webpa_protocol}, {WEBPA_UUID,get_parodus_cfg()->webpa_uuid}, - {WEBPA_INTERFACE, get_parodus_cfg()->webpa_interface_used}, + {WEBPA_INTERFACE, getWebpaInterface()}, {PARTNER_ID, get_parodus_cfg()->partner_id} }; diff --git a/src/upstream.h b/src/upstream.h index df245c3..35b5f8b 100644 --- a/src/upstream.h +++ b/src/upstream.h @@ -53,6 +53,9 @@ void sendUpstreamMsgToServer(void **resp_bytes, size_t resp_size); void getServiceNameAndSendResponse(wrp_msg_t *msg, void **msg_bytes, size_t msg_size); void createUpstreamRetrieveMsg(wrp_msg_t *message, wrp_msg_t **retrieve_msg); void set_global_UpStreamMsgQ(UpStreamMsg * UpStreamQ); +#ifdef WAN_FAILOVER_SUPPORTED +int subscribeCurrentActiveInterfaceEvent(); +#endif UpStreamMsg * get_global_UpStreamMsgQ(void); pthread_cond_t *get_global_nano_con(void); pthread_mutex_t *get_global_nano_mut(void); diff --git a/src/upstream_rbus.c b/src/upstream_rbus.c index 7993563..ce25862 100644 --- a/src/upstream_rbus.c +++ b/src/upstream_rbus.c @@ -38,7 +38,9 @@ void processWebconfigUpstreamEvent(rbusHandle_t handle, rbusEvent_t const* event void subscribeAsyncHandler( rbusHandle_t handle, rbusEventSubscription_t* subscription, rbusError_t error); +#ifdef WAN_FAILOVER_SUPPORTED void eventReceiveHandler( rbusHandle_t rbus_handle, rbusEvent_t const* event, rbusEventSubscription_t* subscription ); +#endif /* API to register RBUS listener to receive messages from webconfig */ void subscribeRBUSevent() @@ -57,6 +59,7 @@ void subscribeRBUSevent() ParodusInfo("rbusEvent_Subscribe was successful\n"); } +#ifdef WAN_FAILOVER_SUPPORTED /* API to subscribe Active Interface name on value change event*/ int subscribeCurrentActiveInterfaceEvent() { @@ -78,7 +81,8 @@ int subscribeCurrentActiveInterfaceEvent() ParodusInfo("Device.X_RDK_WanManager.CurrentActiveInterface subscribe successful\n"); } return rc; -} +} +#endif void processWebconfigUpstreamEvent(rbusHandle_t handle, rbusEvent_t const* event, rbusEventSubscription_t* subscription) { @@ -151,6 +155,7 @@ void subscribeAsyncHandler( rbusHandle_t handle, rbusEventSubscription_t* subscr ParodusInfo("subscribeAsyncHandler event %s, error %d - %s\n",subscription->eventName, error, rbusError_ToString(error)); } +#ifdef WAN_FAILOVER_SUPPORTED void eventReceiveHandler( rbusHandle_t rbus_handle, rbusEvent_t const* event, rbusEventSubscription_t* subscription ) { (void)rbus_handle; @@ -166,5 +171,6 @@ void eventReceiveHandler( rbusHandle_t rbus_handle, rbusEvent_t const* event, rb ParodusInfo("New Interface value g_interface = %s\n",get_global_interface()); } if(oldValue) - ParodusInfo(" Old Value: %s\n", rbusValue_GetString(oldValue, NULL)); + ParodusInfo("Old Value: %s\n", rbusValue_GetString(oldValue, NULL)); } +#endif diff --git a/tests/simple_connection.c b/tests/simple_connection.c index 4fcf5a5..35c6538 100644 --- a/tests/simple_connection.c +++ b/tests/simple_connection.c @@ -92,7 +92,7 @@ void test_set_parodus_cfg() CU_ASSERT_STRING_EQUAL(cfg.hw_last_reboot_reason,get_parodus_cfg()->hw_last_reboot_reason); CU_ASSERT_STRING_EQUAL(cfg.fw_name,get_parodus_cfg()->fw_name); CU_ASSERT_STRING_EQUAL(cfg.webpa_url, get_parodus_cfg()->webpa_url); - CU_ASSERT_STRING_EQUAL(cfg.webpa_interface_used , get_parodus_cfg()->webpa_interface_used); + CU_ASSERT_STRING_EQUAL(cfg.webpa_interface_used , getWebpaInterface()); CU_ASSERT_STRING_EQUAL(cfg.webpa_protocol, get_parodus_cfg()->webpa_protocol); CU_ASSERT_EQUAL(cfg.boot_time, get_parodus_cfg()->boot_time); CU_ASSERT_EQUAL(cfg.webpa_ping_timeout, get_parodus_cfg()->webpa_ping_timeout); @@ -113,7 +113,7 @@ void test_getWebpaConveyHeader() CU_ASSERT_STRING_EQUAL(get_parodus_cfg()->hw_manufacturer, cJSON_GetObjectItem(payload, HW_MANUFACTURER)->valuestring); CU_ASSERT_STRING_EQUAL(get_parodus_cfg()->hw_last_reboot_reason, cJSON_GetObjectItem(payload, HW_LAST_REBOOT_REASON)->valuestring); CU_ASSERT_STRING_EQUAL(get_parodus_cfg()->fw_name, cJSON_GetObjectItem(payload, FIRMWARE_NAME)->valuestring); - CU_ASSERT_STRING_EQUAL(get_parodus_cfg()->webpa_interface_used, cJSON_GetObjectItem(payload, WEBPA_INTERFACE)->valuestring); + CU_ASSERT_STRING_EQUAL(getWebpaInterface(), cJSON_GetObjectItem(payload, WEBPA_INTERFACE)->valuestring); CU_ASSERT_STRING_EQUAL(get_parodus_cfg()->webpa_protocol, cJSON_GetObjectItem(payload, WEBPA_PROTOCOL)->valuestring); CU_ASSERT_EQUAL((int)get_parodus_cfg()->boot_time, cJSON_GetObjectItem(payload, BOOT_TIME)->valueint); diff --git a/tests/test_config.c b/tests/test_config.c index 2cad776..3375203 100644 --- a/tests/test_config.c +++ b/tests/test_config.c @@ -103,7 +103,7 @@ void test_setParodusConfig() assert_string_equal(cfg.hw_last_reboot_reason, temp->hw_last_reboot_reason); assert_string_equal(cfg.webpa_path_url, temp->webpa_path_url); assert_string_equal(cfg.webpa_url, temp->webpa_url); - assert_string_equal(cfg.webpa_interface_used, temp->webpa_interface_used); + assert_string_equal(cfg.webpa_interface_used, getWebpaInterface()); assert_string_equal(cfg.webpa_protocol, temp->webpa_protocol); assert_string_equal(cfg.webpa_uuid, temp->webpa_uuid); assert_string_equal(cfg.partner_id, temp->partner_id); From 9bad1142ab3c9fc38f7ed92d9dbf6c781bdeeff3 Mon Sep 17 00:00:00 2001 From: Sadhyama Vengilat Date: Tue, 8 Mar 2022 19:58:05 +0530 Subject: [PATCH 020/137] Xmidt Upstream queue to receive events from components --- src/xmidtsend_rbus.c | 133 +++++++++++++++++++++++++++++++++++++++++++ src/xmidtsend_rbus.h | 10 +++- 2 files changed, 142 insertions(+), 1 deletion(-) diff --git a/src/xmidtsend_rbus.c b/src/xmidtsend_rbus.c index fb3be63..b4cf349 100644 --- a/src/xmidtsend_rbus.c +++ b/src/xmidtsend_rbus.c @@ -30,12 +30,40 @@ #define XMIDT_SEND_METHOD "Device.X_RDK_Xmidt.SendData" static bool returnStatus = true; +static pthread_t processThreadId = 0; + typedef struct MethodData { rbusMethodAsyncHandle_t asyncHandle; rbusObject_t inParams; } MethodData; +XmidtMsg *XmidtMsgQ = NULL; + +pthread_mutex_t xmidt_mut=PTHREAD_MUTEX_INITIALIZER; + +pthread_cond_t xmidt_con=PTHREAD_COND_INITIALIZER; + +XmidtMsg * get_global_XmidtMsgQ(void) +{ + return XmidtMsgQ; +} + +void set_global_XmidtMsgQ(XmidtMsg * xUpStreamQ) +{ + XmidtMsgQ = xUpStreamQ; +} + +pthread_cond_t *get_global_xmidt_con(void) +{ + return &xmidt_con; +} + +pthread_mutex_t *get_global_xmidt_mut(void) +{ + return &xmidt_mut; +} + static void* asyncMethodHandler(void *p) { MethodData* data; @@ -195,6 +223,109 @@ void displayInputParameters(rbusObject_t inParams) } } +/* + * @brief To handle xmidt rbus messages which is received from components. + */ + +int addToXmidtUpstreamQ(void* inParams) +{ + XmidtMsg *message; + + ParodusInfo("******** Start of addToXmidtUpstreamQ ********\n"); + + while( FOREVER() ) + { + ParodusInfo ("Upstream message received from nanomsg client\n"); + message = (XmidtMsg *)malloc(sizeof(XmidtMsg)); + + if(message) + { + message->msg =inParams; + message->len =bytes; + message->next=NULL; + pthread_mutex_lock (&xmidt_mut); + //Producer adds the rbus msg into queue + if(XmidtMsgQ == NULL) + { + XmidtMsgQ = message; + + ParodusInfo("Producer added message\n"); + pthread_cond_signal(&xmidt_con); + pthread_mutex_unlock (&xmidt_mut); + ParodusInfo("mutex unlock in producer thread\n"); + } + else + { + XmidtMsg *temp = XmidtMsgQ; + while(temp->next) + { + temp = temp->next; + } + temp->next = message; + pthread_mutex_unlock (&xmidt_mut); + } + } + else + { + ParodusError("failure in allocation for message\n"); + } + } + ParodusInfo ("End of addToXmidtUpstreamQ\n"); + return 0; +} + + +//Xmidt consumer thread to process the rbus method data. +void processXmidtData() +{ + int err = 0; + err = pthread_create(&processThreadId, NULL, processXmidtUpstreamMsg, NULL); + if (err != 0) + { + ParodusError("Error creating processXmidtData thread :[%s]\n", strerror(err)); + } + else + { + ParodusInfo("processXmidtData thread created Successfully\n"); + } + +} + +//Consumer to Parse and process rbus data. +void* processXmidtUpstreamMsg() +{ + rbusObject_t *inParam = NULL; + + while(FOREVER()) + { + pthread_mutex_lock (&xmidt_mut); + ParodusInfo("mutex lock in xmidt consumer thread\n"); + if(XmidtMsgQ != NULL) + { + XmidtMsg *Data = XmidtMsgQ; + XmidtMsgQ = XmidtMsgQ->next; + pthread_mutex_unlock (&xmidt_mut); + ParodusInfo("mutex unlock in xmidt consumer thread\n"); + + ParodusInfo("Data->data is %s\n", Data->data); + rv = parseData(Data->data, &inParam); + } + else + { + if (g_shutdown) + { + pthread_mutex_unlock (&xmidt_mut); + break; + } + ParodusInfo("Before pthread cond wait in xmidt consumer thread\n"); + pthread_cond_wait(&xmidt_con, &xmidt_mut); + pthread_mutex_unlock (&xmidt_mut); + ParodusInfo("mutex unlock in xmidt consumer thread after cond wait\n"); + } + } + return NULL; +} + static rbusError_t sendDataHandler(rbusHandle_t handle, char const* methodName, rbusObject_t inParams, rbusObject_t outParams, rbusMethodAsyncHandle_t asyncHandle) { (void) handle; @@ -212,6 +343,8 @@ static rbusError_t sendDataHandler(rbusHandle_t handle, char const* methodName, data->asyncHandle = asyncHandle; data->inParams = inParams; rbusObject_Retain(inParams); + //xmidt send producer + addToXmidtUpstreamQ((void*) inParams); if(pthread_create(&pid, NULL, asyncMethodHandler, data) || pthread_detach(pid)) { ParodusError("sendDataHandler failed to create thread\n"); diff --git a/src/xmidtsend_rbus.h b/src/xmidtsend_rbus.h index f4abf1e..cf8591f 100644 --- a/src/xmidtsend_rbus.h +++ b/src/xmidtsend_rbus.h @@ -31,13 +31,21 @@ extern "C" { /*----------------------------------------------------------------------------*/ /* Data Structures */ /*----------------------------------------------------------------------------*/ +typedef struct XmidtMsg__ +{ + void *msg; + size_t len; + struct XmidtMsg__ *next; +} XmidtMsg; /*----------------------------------------------------------------------------*/ /* Function Prototypes */ /*----------------------------------------------------------------------------*/ rbusHandle_t get_parodus_rbus_Handle(void); - +int addToXmidtUpstreamQ(void* inParams); +void* processXmidtUpstreamMsg(); +void processXmidtData(); #ifdef __cplusplus } #endif From 5ae2325fb609e9206a961f962aefcd1dff5d705a Mon Sep 17 00:00:00 2001 From: Sadhyama Vengilat Date: Mon, 14 Mar 2022 20:18:17 +0530 Subject: [PATCH 021/137] Parse rbus inParams into wrp event and send to server --- src/xmidtsend_rbus.c | 356 +++++++++++++++++++++++++++++++++---------- src/xmidtsend_rbus.h | 8 +- 2 files changed, 284 insertions(+), 80 deletions(-) diff --git a/src/xmidtsend_rbus.c b/src/xmidtsend_rbus.c index b4cf349..9ee9d26 100644 --- a/src/xmidtsend_rbus.c +++ b/src/xmidtsend_rbus.c @@ -113,7 +113,6 @@ static void* asyncMethodHandler(void *p) void displayInputParameters(rbusObject_t inParams) { - //contentType rbusValue_t contenttype = rbusObject_GetValue(inParams, "contentType"); if(contenttype) { @@ -128,7 +127,6 @@ void displayInputParameters(rbusObject_t inParams) ParodusError("contenttype is empty\n"); } - //msg_type rbusValue_t msg_type = rbusObject_GetValue(inParams, "msg_type"); if(msg_type) { @@ -143,7 +141,6 @@ void displayInputParameters(rbusObject_t inParams) ParodusError("msg_type is empty\n"); } - //source rbusValue_t source = rbusObject_GetValue(inParams, "source"); if(source) { @@ -158,37 +155,20 @@ void displayInputParameters(rbusObject_t inParams) ParodusError("source is empty\n"); } - //dest_root - rbusValue_t dest_root = rbusObject_GetValue(inParams, "dest_root"); - if(dest_root) + rbusValue_t dest = rbusObject_GetValue(inParams, "dest"); + if(dest) { - if(rbusValue_GetType(dest_root) == RBUS_STRING) + if(rbusValue_GetType(dest) == RBUS_STRING) { - char * dest_rootStr = rbusValue_GetString(dest_root, NULL); - ParodusInfo("dest_root value received is %s\n", dest_rootStr); + char * dest_Str = rbusValue_GetString(dest, NULL); + ParodusInfo("dest value received is %s\n", dest_Str); } } else { - ParodusError("dest_root is empty\n"); + ParodusError("dest is empty\n"); } - //dest_path - rbusValue_t dest_path = rbusObject_GetValue(inParams, "dest_path"); - if(dest_path) - { - if(rbusValue_GetType(dest_path) == RBUS_STRING) - { - char * dest_pathStr = rbusValue_GetString(dest_path, NULL); - ParodusInfo("dest_path value received is %s\n", dest_pathStr); - } - } - else - { - ParodusError("dest_path is empty\n"); - } - - //payload rbusValue_t payload = rbusObject_GetValue(inParams, "payload"); if(payload) { @@ -203,13 +183,9 @@ void displayInputParameters(rbusObject_t inParams) ParodusError("payload is empty\n"); } - //payloadlen - ParodusInfo("check payloadlen\n"); rbusValue_t payloadlen = rbusObject_GetValue(inParams, "payloadlen"); - ParodusInfo("payloadlen value object\n"); if(payloadlen) { - ParodusInfo("payloadlen is not empty\n"); if(rbusValue_GetType(payloadlen) == RBUS_INT32) { ParodusInfo("payloadlen type %d RBUS_INT32 %d\n", rbusValue_GetType(payloadlen), RBUS_INT32); @@ -224,58 +200,52 @@ void displayInputParameters(rbusObject_t inParams) } /* - * @brief To handle xmidt rbus messages which is received from components. + * @brief To handle xmidt rbus messages received from various components. */ -int addToXmidtUpstreamQ(void* inParams) +void addToXmidtUpstreamQ(rbusObject_t* inParams) { XmidtMsg *message; - ParodusInfo("******** Start of addToXmidtUpstreamQ ********\n"); + ParodusInfo ("Add Xmidt Upstream message to queue\n"); + message = (XmidtMsg *)malloc(sizeof(XmidtMsg)); - while( FOREVER() ) + if(message) { - ParodusInfo ("Upstream message received from nanomsg client\n"); - message = (XmidtMsg *)malloc(sizeof(XmidtMsg)); - - if(message) + message->msg =inParams; + message->next=NULL; + pthread_mutex_lock (&xmidt_mut); + //Producer adds the rbus msg into queue + if(XmidtMsgQ == NULL) { - message->msg =inParams; - message->len =bytes; - message->next=NULL; - pthread_mutex_lock (&xmidt_mut); - //Producer adds the rbus msg into queue - if(XmidtMsgQ == NULL) - { - XmidtMsgQ = message; + XmidtMsgQ = message; - ParodusInfo("Producer added message\n"); - pthread_cond_signal(&xmidt_con); - pthread_mutex_unlock (&xmidt_mut); - ParodusInfo("mutex unlock in producer thread\n"); - } - else - { - XmidtMsg *temp = XmidtMsgQ; - while(temp->next) - { - temp = temp->next; - } - temp->next = message; - pthread_mutex_unlock (&xmidt_mut); - } + ParodusInfo("Producer added xmidt message\n"); + pthread_cond_signal(&xmidt_con); + pthread_mutex_unlock (&xmidt_mut); + ParodusInfo("mutex unlock in xmidt producer\n"); } else { - ParodusError("failure in allocation for message\n"); + XmidtMsg *temp = XmidtMsgQ; + while(temp->next) + { + temp = temp->next; + } + temp->next = message; + pthread_mutex_unlock (&xmidt_mut); } } + else + { + ParodusError("failure in allocation for xmidt message\n"); + } ParodusInfo ("End of addToXmidtUpstreamQ\n"); - return 0; + return; } -//Xmidt consumer thread to process the rbus method data. +//Xmidt consumer thread to process the rbus events. void processXmidtData() { int err = 0; @@ -294,12 +264,10 @@ void processXmidtData() //Consumer to Parse and process rbus data. void* processXmidtUpstreamMsg() { - rbusObject_t *inParam = NULL; - while(FOREVER()) { pthread_mutex_lock (&xmidt_mut); - ParodusInfo("mutex lock in xmidt consumer thread\n"); + ParodusPrint("mutex lock in xmidt consumer thread\n"); if(XmidtMsgQ != NULL) { XmidtMsg *Data = XmidtMsgQ; @@ -307,8 +275,8 @@ void* processXmidtUpstreamMsg() pthread_mutex_unlock (&xmidt_mut); ParodusInfo("mutex unlock in xmidt consumer thread\n"); - ParodusInfo("Data->data is %s\n", Data->data); - rv = parseData(Data->data, &inParam); + ParodusInfo("B4 parseData\n"); + parseData(Data->msg); } else { @@ -326,30 +294,262 @@ void* processXmidtUpstreamMsg() return NULL; } +void parseData(rbusObject_t * msg) +{ + rbusObject_t inParamObj = NULL; + + inParamObj = *msg; + + ParodusInfo("print in params from consumer..\n"); + displayInputParameters(inParamObj); + ParodusInfo("print inparams done\n"); + + processXmidtEvent(inParamObj); + ParodusInfo("processXmidtEvent done\n"); + + //Need to send failure status when received input params are empty/invalid. +} + +int processXmidtEvent(rbusObject_t inParams) +{ + char *contenttypeStr = NULL; + char *msg_typeStr = NULL; + char * sourceStr = NULL; + char *source_string = NULL; + char * dest_Str = NULL; + char * payloadStr = NULL; + unsigned int payloadlength = 0; + int qosVal = 0; + char *device_id = NULL; + size_t device_id_len = 0; + int ret = -1; + int rv = 1; + + //contentType + rbusValue_t contenttype = rbusObject_GetValue(inParams, "contentType"); + if(contenttype) + { + if(rbusValue_GetType(contenttype) == RBUS_STRING) + { + contenttypeStr = rbusValue_GetString(contenttype, NULL); + ParodusInfo("contenttype value received is %s\n", contenttypeStr); + } + } + else + { + ParodusError("contenttype is empty\n"); + return rv; + } + + //msg_type + rbusValue_t msg_type = rbusObject_GetValue(inParams, "msg_type"); + if(msg_type) + { + if(rbusValue_GetType(msg_type) == RBUS_STRING) + { + msg_typeStr = rbusValue_GetString(msg_type, NULL); + ParodusInfo("msg_type value received is %s\n", msg_typeStr); + if((msg_typeStr !=NULL) && (strcmp(msg_typeStr, "event") !=0)) + { + ParodusError("msg_type is not event\n"); + return rv; + } + } + } + else + { + ParodusError("msg_type is empty\n"); + return rv; + } + + //source + rbusValue_t source = rbusObject_GetValue(inParams, "source"); + if(source) + { + if(rbusValue_GetType(source) == RBUS_STRING) + { + sourceStr = rbusValue_GetString(source, NULL); + ParodusInfo("source value received is %s\n", sourceStr); + if(sourceStr !=NULL) + { + //To get device_id in the format "mac:112233445xxx" + ret = getDeviceId(&device_id, &device_id_len); + if(ret == 0) + { + ParodusInfo("device_id %s device_id_len %lu\n", device_id, device_id_len); + source_string = (char *) malloc(sizeof(char)*64); + if(source_string !=NULL) + { + snprintf(source_string, 64, "%s/%s", device_id, sourceStr); + ParodusInfo("source_string formed is %s\n" , source_string); + } + } + else + { + ParodusError("Failed to get device_id\n"); + return rv; + } + } + + } + } + else + { + ParodusError("source is empty\n"); + return rv; + } + + //dest + rbusValue_t dest = rbusObject_GetValue(inParams, "dest"); + if(dest) + { + if(rbusValue_GetType(dest) == RBUS_STRING) + { + dest_Str = rbusValue_GetString(dest, NULL); + ParodusInfo("dest value received is %s\n", dest_Str); + } + } + else + { + ParodusError("dest is empty\n"); + return rv; + } + + //payload + rbusValue_t payload = rbusObject_GetValue(inParams, "payload"); + if(payload) + { + if((rbusValue_GetType(payload) == RBUS_STRING)) + { + payloadStr = rbusValue_GetString(payload, NULL); + ParodusInfo("payload received is %s\n", payloadStr); + } + } + else + { + ParodusError("payload is empty\n"); + return rv; + } + + //payloadlen + ParodusInfo("check payloadLen\n"); + rbusValue_t payloadlen = rbusObject_GetValue(inParams, "payloadLen"); + if(payloadlen) + { + ParodusPrint("payloadlen is not empty\n"); + if(rbusValue_GetType(payloadlen) == RBUS_INT32) + { + ParodusInfo("payloadlen type %d RBUS_INT32 %d\n", rbusValue_GetType(payloadlen), RBUS_INT32); + payloadlength = rbusValue_GetInt32(payloadlen); + ParodusInfo("payloadlen received is %lu\n", payloadlength); + } + } + else + { + ParodusError("payloadlen is empty\n"); + return rv; + } + + //qos optional + ParodusInfo("check qos\n"); + rbusValue_t qos = rbusObject_GetValue(inParams, "qos"); + ParodusInfo("qos value object\n"); + if(qos) + { + ParodusInfo("qos is not empty\n"); + if(rbusValue_GetType(qos) == RBUS_INT32) + { + ParodusInfo("qos type %d RBUS_INT32 %d\n", rbusValue_GetType(qos), RBUS_INT32); + qosVal = rbusValue_GetInt32(qos); + ParodusInfo("qos received is %d\n", qosVal); + } + } + + ParodusInfo("B4 sendXmidtEventToServer\n"); + sendXmidtEventToServer(source_string, dest_Str, contenttypeStr, qosVal, payloadStr, payloadlength); + ParodusInfo("processXmidtEvent is completed\n"); + rv = 0; + return rv; +} + +void sendXmidtEventToServer(char *source, char *destination, char* contenttype, int qos, void *payload, unsigned int payload_len) +{ + wrp_msg_t *notif_wrp_msg = NULL; + int rc = RBUS_ERROR_SUCCESS; + ssize_t msg_len; + void *msg_bytes; + + if(source != NULL && destination != NULL && contenttype != NULL && payload != NULL) + { + notif_wrp_msg = (wrp_msg_t *)malloc(sizeof(wrp_msg_t)); + if(notif_wrp_msg != NULL) + { + memset(notif_wrp_msg, 0, sizeof(wrp_msg_t)); + notif_wrp_msg->msg_type = WRP_MSG_TYPE__EVENT; + ParodusInfo("source: %s\n",source); + notif_wrp_msg->u.event.source = strdup(source); //free + ParodusInfo("destination: %s\n", destination); + notif_wrp_msg->u.event.dest = strdup(destination); //free + if(contenttype != NULL) + { + if(strcmp(contenttype , "JSON") == 0) + { + notif_wrp_msg->u.event.content_type = strdup("application/json"); + } + ParodusInfo("content_type is %s\n",notif_wrp_msg->u.event.content_type); + } + if(payload != NULL) + { + ParodusInfo("Notification payload: %s\n",payload); + notif_wrp_msg->u.event.payload = (void *)payload; + notif_wrp_msg->u.event.payload_size = payload_len; + ParodusInfo("payload len %lu\n", payload_len); + } + + ParodusInfo("Encode xmidt wrp msg\n"); + msg_len = wrp_struct_to (notif_wrp_msg, WRP_BYTES, &msg_bytes); + + ParodusInfo("Encoded xmidt wrp msg, msg_len %lu\n", msg_len); + if(msg_len > 0) + { + ParodusInfo("sendUpstreamMsgToServer\n"); + sendUpstreamMsgToServer(&msg_bytes, msg_len); + } + ParodusInfo("B4 wrp_free_struct.\n"); + wrp_free_struct(notif_wrp_msg); + ParodusInfo("After wrp_free_struct\n"); + free(msg_bytes); + msg_bytes = NULL; + ParodusInfo("sendXmidtEventToServer done\n"); + } + } +} + static rbusError_t sendDataHandler(rbusHandle_t handle, char const* methodName, rbusObject_t inParams, rbusObject_t outParams, rbusMethodAsyncHandle_t asyncHandle) { (void) handle; ParodusInfo("methodHandler called: %s\n", methodName); //rbusObject_fwrite(inParams, 1, stdout); - ParodusInfo("displayInputParameters ..\n"); - displayInputParameters(inParams); - ParodusInfo("displayInputParameters done\n"); + //ParodusInfo("displayInputParameters ..\n"); + //displayInputParameters(inParams); + //ParodusInfo("displayInputParameters done\n"); if(strcmp(methodName, XMIDT_SEND_METHOD) == 0) { - pthread_t pid; + /*pthread_t pid; MethodData* data = malloc(sizeof(MethodData)); data->asyncHandle = asyncHandle; data->inParams = inParams; - rbusObject_Retain(inParams); + rbusObject_Retain(inParams);*/ //xmidt send producer - addToXmidtUpstreamQ((void*) inParams); - if(pthread_create(&pid, NULL, asyncMethodHandler, data) || pthread_detach(pid)) + addToXmidtUpstreamQ(&inParams); + /**** For now, disable async ack send to t2 nack ***/ + /*if(pthread_create(&pid, NULL, asyncMethodHandler, data) || pthread_detach(pid)) { ParodusError("sendDataHandler failed to create thread\n"); return RBUS_ERROR_BUS_ERROR; - } + }*/ ParodusInfo("sendDataHandler created async thread, returned %d\n", RBUS_ERROR_ASYNC_RESPONSE); return RBUS_ERROR_ASYNC_RESPONSE; } @@ -386,5 +586,7 @@ int regXmidtSendDataMethod() ParodusInfo("SendData method provider register success\n"); } + //start xmidt consumer thread .(should we start from conn_interface.c?) + processXmidtData(); return rc; } diff --git a/src/xmidtsend_rbus.h b/src/xmidtsend_rbus.h index cf8591f..cc25794 100644 --- a/src/xmidtsend_rbus.h +++ b/src/xmidtsend_rbus.h @@ -33,8 +33,7 @@ extern "C" { /*----------------------------------------------------------------------------*/ typedef struct XmidtMsg__ { - void *msg; - size_t len; + rbusObject_t *msg; struct XmidtMsg__ *next; } XmidtMsg; @@ -43,9 +42,12 @@ typedef struct XmidtMsg__ /*----------------------------------------------------------------------------*/ rbusHandle_t get_parodus_rbus_Handle(void); -int addToXmidtUpstreamQ(void* inParams); +void addToXmidtUpstreamQ(rbusObject_t* inParams); void* processXmidtUpstreamMsg(); void processXmidtData(); +void parseData(rbusObject_t * msg); +int processXmidtEvent(rbusObject_t inParams); +void sendXmidtEventToServer(char *source, char *destination, char*contenttype, int qos, void *payload, unsigned int payload_len); #ifdef __cplusplus } #endif From 89fdd97d44a0a2f27468facd27ddf22b0795008b Mon Sep 17 00:00:00 2001 From: Sadhyama Vengilat Date: Wed, 16 Mar 2022 12:31:59 +0530 Subject: [PATCH 022/137] Add more debug logs --- src/xmidtsend_rbus.c | 85 +++++++++++++++++++++++++++----------------- src/xmidtsend_rbus.h | 6 ++-- 2 files changed, 55 insertions(+), 36 deletions(-) diff --git a/src/xmidtsend_rbus.c b/src/xmidtsend_rbus.c index 9ee9d26..948dc34 100644 --- a/src/xmidtsend_rbus.c +++ b/src/xmidtsend_rbus.c @@ -113,20 +113,9 @@ static void* asyncMethodHandler(void *p) void displayInputParameters(rbusObject_t inParams) { - rbusValue_t contenttype = rbusObject_GetValue(inParams, "contentType"); - if(contenttype) - { - if(rbusValue_GetType(contenttype) == RBUS_STRING) - { - char * contenttypeStr = rbusValue_GetString(contenttype, NULL); - ParodusInfo("contenttype value received is %s\n", contenttypeStr); - } - } - else - { - ParodusError("contenttype is empty\n"); - } + ParodusInfo("In displayInputParameters\n"); + ParodusInfo("check msg_type\n"); rbusValue_t msg_type = rbusObject_GetValue(inParams, "msg_type"); if(msg_type) { @@ -141,6 +130,23 @@ void displayInputParameters(rbusObject_t inParams) ParodusError("msg_type is empty\n"); } + rbusValue_t contenttype = rbusObject_GetValue(inParams, "content_type"); + ParodusInfo("After GetValue contentType\n"); + if(contenttype) + { + ParodusInfo("check contenttype type\n"); + if(rbusValue_GetType(contenttype) == RBUS_STRING) + { + ParodusInfo("content type is STRING\n"); + char * contenttypeStr = rbusValue_GetString(contenttype, NULL); + ParodusInfo("contenttype value received is %s\n", contenttypeStr); + } + } + else + { + ParodusError("contenttype is empty\n"); + } + rbusValue_t source = rbusObject_GetValue(inParams, "source"); if(source) { @@ -203,7 +209,7 @@ void displayInputParameters(rbusObject_t inParams) * @brief To handle xmidt rbus messages received from various components. */ -void addToXmidtUpstreamQ(rbusObject_t* inParams) +void addToXmidtUpstreamQ(void* inParams) { XmidtMsg *message; @@ -294,16 +300,23 @@ void* processXmidtUpstreamMsg() return NULL; } -void parseData(rbusObject_t * msg) +void parseData(void* msg) { - rbusObject_t inParamObj = NULL; + rbusObject_t inParamObj; - inParamObj = *msg; + ParodusInfo("Type cast to rbusObj..\n"); + inParamObj = *(rbusObject_t*)(msg); ParodusInfo("print in params from consumer..\n"); - displayInputParameters(inParamObj); - ParodusInfo("print inparams done\n"); - + if(inParamObj !=NULL) + { + displayInputParameters(inParamObj); + ParodusInfo("print inparams done\n"); + } + else + { + ParodusError("inParamObj is NULL\n"); + } processXmidtEvent(inParamObj); ParodusInfo("processXmidtEvent done\n"); @@ -325,12 +338,16 @@ int processXmidtEvent(rbusObject_t inParams) int ret = -1; int rv = 1; + ParodusInfo("In processXmidtEvent\n"); //contentType - rbusValue_t contenttype = rbusObject_GetValue(inParams, "contentType"); + rbusValue_t contenttype = rbusObject_GetValue(inParams, "content_type"); + ParodusInfo("content_type GetValue\n"); if(contenttype) { + ParodusInfo("contenttype check type\n"); if(rbusValue_GetType(contenttype) == RBUS_STRING) { + ParodusInfo("contenttype is string\n"); contenttypeStr = rbusValue_GetString(contenttype, NULL); ParodusInfo("contenttype value received is %s\n", contenttypeStr); } @@ -342,6 +359,7 @@ int processXmidtEvent(rbusObject_t inParams) } //msg_type + ParodusInfo("check msg_type.\n"); rbusValue_t msg_type = rbusObject_GetValue(inParams, "msg_type"); if(msg_type) { @@ -432,8 +450,8 @@ int processXmidtEvent(rbusObject_t inParams) } //payloadlen - ParodusInfo("check payloadLen\n"); - rbusValue_t payloadlen = rbusObject_GetValue(inParams, "payloadLen"); + ParodusInfo("check payloadlen\n"); + rbusValue_t payloadlen = rbusObject_GetValue(inParams, "payloadlen"); if(payloadlen) { ParodusPrint("payloadlen is not empty\n"); @@ -479,6 +497,7 @@ void sendXmidtEventToServer(char *source, char *destination, char* contenttype, ssize_t msg_len; void *msg_bytes; + ParodusInfo("In sendXmidtEventToServer\n"); if(source != NULL && destination != NULL && contenttype != NULL && payload != NULL) { notif_wrp_msg = (wrp_msg_t *)malloc(sizeof(wrp_msg_t)); @@ -515,8 +534,8 @@ void sendXmidtEventToServer(char *source, char *destination, char* contenttype, ParodusInfo("sendUpstreamMsgToServer\n"); sendUpstreamMsgToServer(&msg_bytes, msg_len); } - ParodusInfo("B4 wrp_free_struct.\n"); - wrp_free_struct(notif_wrp_msg); + ParodusInfo("B4 wrp_free_struct disabled.\n"); + //wrp_free_struct(notif_wrp_msg); ParodusInfo("After wrp_free_struct\n"); free(msg_bytes); msg_bytes = NULL; @@ -531,25 +550,25 @@ static rbusError_t sendDataHandler(rbusHandle_t handle, char const* methodName, ParodusInfo("methodHandler called: %s\n", methodName); //rbusObject_fwrite(inParams, 1, stdout); - //ParodusInfo("displayInputParameters ..\n"); - //displayInputParameters(inParams); - //ParodusInfo("displayInputParameters done\n"); + ParodusInfo("displayInputParameters ..\n"); + displayInputParameters(inParams); + ParodusInfo("displayInputParameters done\n"); if(strcmp(methodName, XMIDT_SEND_METHOD) == 0) { - /*pthread_t pid; + pthread_t pid; MethodData* data = malloc(sizeof(MethodData)); data->asyncHandle = asyncHandle; data->inParams = inParams; - rbusObject_Retain(inParams);*/ + rbusObject_Retain(inParams); //xmidt send producer - addToXmidtUpstreamQ(&inParams); + addToXmidtUpstreamQ((void*) inParams); /**** For now, disable async ack send to t2 nack ***/ - /*if(pthread_create(&pid, NULL, asyncMethodHandler, data) || pthread_detach(pid)) + if(pthread_create(&pid, NULL, asyncMethodHandler, data) || pthread_detach(pid)) { ParodusError("sendDataHandler failed to create thread\n"); return RBUS_ERROR_BUS_ERROR; - }*/ + } ParodusInfo("sendDataHandler created async thread, returned %d\n", RBUS_ERROR_ASYNC_RESPONSE); return RBUS_ERROR_ASYNC_RESPONSE; } diff --git a/src/xmidtsend_rbus.h b/src/xmidtsend_rbus.h index cc25794..9b7acb6 100644 --- a/src/xmidtsend_rbus.h +++ b/src/xmidtsend_rbus.h @@ -33,7 +33,7 @@ extern "C" { /*----------------------------------------------------------------------------*/ typedef struct XmidtMsg__ { - rbusObject_t *msg; + void *msg; struct XmidtMsg__ *next; } XmidtMsg; @@ -42,10 +42,10 @@ typedef struct XmidtMsg__ /*----------------------------------------------------------------------------*/ rbusHandle_t get_parodus_rbus_Handle(void); -void addToXmidtUpstreamQ(rbusObject_t* inParams); +void addToXmidtUpstreamQ(void* inParams); void* processXmidtUpstreamMsg(); void processXmidtData(); -void parseData(rbusObject_t * msg); +void parseData(void* msg); int processXmidtEvent(rbusObject_t inParams); void sendXmidtEventToServer(char *source, char *destination, char*contenttype, int qos, void *payload, unsigned int payload_len); #ifdef __cplusplus From 24e1790ccbefc1e36ed00b7b6039d741d78583c1 Mon Sep 17 00:00:00 2001 From: Sadhyama Vengilat Date: Wed, 16 Mar 2022 16:44:23 +0530 Subject: [PATCH 023/137] Rbus inParams check method validation --- src/xmidtsend_rbus.c | 59 +++++++++++++++++++++++++++++--------------- 1 file changed, 39 insertions(+), 20 deletions(-) diff --git a/src/xmidtsend_rbus.c b/src/xmidtsend_rbus.c index 948dc34..c6abfb8 100644 --- a/src/xmidtsend_rbus.c +++ b/src/xmidtsend_rbus.c @@ -111,16 +111,27 @@ static void* asyncMethodHandler(void *p) return NULL; } -void displayInputParameters(rbusObject_t inParams) +int displayInputParameters(rbusObject_t inParams) { - ParodusInfo("In displayInputParameters\n"); + ParodusInfo("In displayInputParameters..\n"); + + rbusValue_t check = rbusObject_GetValue(inParams, "check"); + ParodusInfo("After check\n"); + if(check) + { + ParodusInfo("Rbus check method. Not proceeding to process this inparam\n"); + return 0; + } ParodusInfo("check msg_type\n"); rbusValue_t msg_type = rbusObject_GetValue(inParams, "msg_type"); + ParodusInfo("After check msg_type\n"); if(msg_type) { + ParodusInfo("msg_type GetType\n"); if(rbusValue_GetType(msg_type) == RBUS_STRING) { + ParodusInfo("get msg_type string\n"); char *msg_typeStr = rbusValue_GetString(msg_type, NULL); ParodusInfo("msg_type value received is %s\n", msg_typeStr); } @@ -203,6 +214,7 @@ void displayInputParameters(rbusObject_t inParams) { ParodusError("payloadlen is empty\n"); } + return 1; } /* @@ -310,8 +322,8 @@ void parseData(void* msg) ParodusInfo("print in params from consumer..\n"); if(inParamObj !=NULL) { - displayInputParameters(inParamObj); - ParodusInfo("print inparams done\n"); + int status = displayInputParameters(inParamObj); + ParodusInfo("print inparams done. status %d\n", status); } else { @@ -551,31 +563,38 @@ static rbusError_t sendDataHandler(rbusHandle_t handle, char const* methodName, //rbusObject_fwrite(inParams, 1, stdout); ParodusInfo("displayInputParameters ..\n"); - displayInputParameters(inParams); + int displayStatus = displayInputParameters(inParams); ParodusInfo("displayInputParameters done\n"); - if(strcmp(methodName, XMIDT_SEND_METHOD) == 0) + if(displayStatus) { - pthread_t pid; - MethodData* data = malloc(sizeof(MethodData)); - data->asyncHandle = asyncHandle; - data->inParams = inParams; - rbusObject_Retain(inParams); - //xmidt send producer - addToXmidtUpstreamQ((void*) inParams); - /**** For now, disable async ack send to t2 nack ***/ - if(pthread_create(&pid, NULL, asyncMethodHandler, data) || pthread_detach(pid)) + if(strcmp(methodName, XMIDT_SEND_METHOD) == 0) { - ParodusError("sendDataHandler failed to create thread\n"); + pthread_t pid; + MethodData* data = malloc(sizeof(MethodData)); + data->asyncHandle = asyncHandle; + data->inParams = inParams; + rbusObject_Retain(inParams); + //xmidt send producer + addToXmidtUpstreamQ(inParams); + /**** For now, disable async ack send to t2 nack ***/ + if(pthread_create(&pid, NULL, asyncMethodHandler, data) || pthread_detach(pid)) + { + ParodusError("sendDataHandler failed to create thread\n"); + return RBUS_ERROR_BUS_ERROR; + } + ParodusInfo("sendDataHandler created async thread, returned %d\n", RBUS_ERROR_ASYNC_RESPONSE); + return RBUS_ERROR_ASYNC_RESPONSE; + } + else + { + ParodusError("Method %s received is not supported\n", methodName); return RBUS_ERROR_BUS_ERROR; } - ParodusInfo("sendDataHandler created async thread, returned %d\n", RBUS_ERROR_ASYNC_RESPONSE); - return RBUS_ERROR_ASYNC_RESPONSE; } else { - ParodusError("Method %s received is not supported\n", methodName); - return RBUS_ERROR_BUS_ERROR; + ParodusError("displayStatus is not correct\n"); } } From 47fcd6bdae59b77bda6e2245b17a8d9b0a207633 Mon Sep 17 00:00:00 2001 From: Sadhyama Vengilat Date: Wed, 16 Mar 2022 17:08:15 +0530 Subject: [PATCH 024/137] Add rbusObject in xmidt queue --- src/xmidtsend_rbus.c | 10 ++++++---- src/xmidtsend_rbus.h | 6 +++--- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/src/xmidtsend_rbus.c b/src/xmidtsend_rbus.c index c6abfb8..88d53f4 100644 --- a/src/xmidtsend_rbus.c +++ b/src/xmidtsend_rbus.c @@ -221,7 +221,7 @@ int displayInputParameters(rbusObject_t inParams) * @brief To handle xmidt rbus messages received from various components. */ -void addToXmidtUpstreamQ(void* inParams) +void addToXmidtUpstreamQ(rbusObject_t inParams) { XmidtMsg *message; @@ -312,12 +312,14 @@ void* processXmidtUpstreamMsg() return NULL; } -void parseData(void* msg) +void parseData(rbusObject_t msg) { rbusObject_t inParamObj; - ParodusInfo("Type cast to rbusObj..\n"); - inParamObj = *(rbusObject_t*)(msg); + //ParodusInfo("Type cast to rbusObj..\n"); + //inParamObj = *(rbusObject_t*)(msg); + + inParamObj = msg ; ParodusInfo("print in params from consumer..\n"); if(inParamObj !=NULL) diff --git a/src/xmidtsend_rbus.h b/src/xmidtsend_rbus.h index 9b7acb6..77440d7 100644 --- a/src/xmidtsend_rbus.h +++ b/src/xmidtsend_rbus.h @@ -33,7 +33,7 @@ extern "C" { /*----------------------------------------------------------------------------*/ typedef struct XmidtMsg__ { - void *msg; + rbusObject_t msg; struct XmidtMsg__ *next; } XmidtMsg; @@ -42,10 +42,10 @@ typedef struct XmidtMsg__ /*----------------------------------------------------------------------------*/ rbusHandle_t get_parodus_rbus_Handle(void); -void addToXmidtUpstreamQ(void* inParams); +void addToXmidtUpstreamQ(rbusObject_t inParams); void* processXmidtUpstreamMsg(); void processXmidtData(); -void parseData(void* msg); +void parseData(rbusObject_t msg); int processXmidtEvent(rbusObject_t inParams); void sendXmidtEventToServer(char *source, char *destination, char*contenttype, int qos, void *payload, unsigned int payload_len); #ifdef __cplusplus From 5d537fb139da872c39a3c9d548465e02f03bfe4b Mon Sep 17 00:00:00 2001 From: Sadhyama Vengilat Date: Wed, 16 Mar 2022 20:18:37 +0530 Subject: [PATCH 025/137] Disabled async ack inParams release --- src/xmidtsend_rbus.c | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/src/xmidtsend_rbus.c b/src/xmidtsend_rbus.c index 88d53f4..4dceb63 100644 --- a/src/xmidtsend_rbus.c +++ b/src/xmidtsend_rbus.c @@ -100,13 +100,14 @@ static void* asyncMethodHandler(void *p) { ParodusInfo("asyncMethodHandler sent response to t2:%d\n", err); } - rbusObject_Release(data->inParams); + ParodusInfo("Disabled inParams free\n"); + //rbusObject_Release(data->inParams); rbusObject_Release(outParams); - if(data !=NULL) + /*if(data !=NULL) { free(data); data = NULL; - } + }*/ ParodusInfo("Exit asyncMethodHandler\n"); return NULL; } @@ -123,7 +124,7 @@ int displayInputParameters(rbusObject_t inParams) return 0; } - ParodusInfo("check msg_type\n"); + /*ParodusInfo("check msg_type\n"); rbusValue_t msg_type = rbusObject_GetValue(inParams, "msg_type"); ParodusInfo("After check msg_type\n"); if(msg_type) @@ -213,7 +214,7 @@ int displayInputParameters(rbusObject_t inParams) else { ParodusError("payloadlen is empty\n"); - } + }*/ return 1; } @@ -355,13 +356,13 @@ int processXmidtEvent(rbusObject_t inParams) ParodusInfo("In processXmidtEvent\n"); //contentType rbusValue_t contenttype = rbusObject_GetValue(inParams, "content_type"); - ParodusInfo("content_type GetValue\n"); + //ParodusInfo("content_type GetValue\n"); if(contenttype) { - ParodusInfo("contenttype check type\n"); + //ParodusInfo("contenttype check type\n"); if(rbusValue_GetType(contenttype) == RBUS_STRING) { - ParodusInfo("contenttype is string\n"); + //ParodusInfo("contenttype is string\n"); contenttypeStr = rbusValue_GetString(contenttype, NULL); ParodusInfo("contenttype value received is %s\n", contenttypeStr); } @@ -564,9 +565,9 @@ static rbusError_t sendDataHandler(rbusHandle_t handle, char const* methodName, ParodusInfo("methodHandler called: %s\n", methodName); //rbusObject_fwrite(inParams, 1, stdout); - ParodusInfo("displayInputParameters ..\n"); + //ParodusInfo("displayInputParameters ..\n"); int displayStatus = displayInputParameters(inParams); - ParodusInfo("displayInputParameters done\n"); + //ParodusInfo("displayInputParameters done\n"); if(displayStatus) { From 6d39163d471344af103573b1ff77e3e029180511 Mon Sep 17 00:00:00 2001 From: Vasuki Date: Thu, 3 Mar 2022 15:44:04 +0530 Subject: [PATCH 026/137] Parodus changes for Wanifailover support-2 --- CMakeLists.txt | 2 +- src/CMakeLists.txt | 8 +++++++- src/config.c | 22 +++++++++++++--------- src/config.h | 2 +- src/upstream.c | 6 +++--- src/upstream_rbus.c | 21 +++++++++------------ tests/test_config.c | 2 -- tests/test_crud_interface.c | 4 ++++ tests/test_upstream.c | 23 +++++++++++++++++++++++ tests/test_upstream_sock.c | 23 +++++++++++++++++++++++ 10 files changed, 84 insertions(+), 29 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 2958f1c..b95e800 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -240,7 +240,7 @@ if (ENABLE_WEBCFGBIN) # rtMessage external dependency #------------------------------------------------------------------------------- ExternalProject_Add(rtMessage - #DEPENDS cJSON + DEPENDS cJSON PREFIX ${CMAKE_CURRENT_BINARY_DIR}/_prefix/rtMessage GIT_REPOSITORY https://github.com/rdkcmf/rdk-rtmessage.git GIT_TAG rdk-next diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 8138ca6..afd64f2 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -27,6 +27,12 @@ if (ENABLE_WEBCFGBIN) set(SOURCES ${SOURCES} upstream_rbus.c) endif (ENABLE_WEBCFGBIN) +if (WAN_FAILOVER_SUPPORTED) +message(STATUS "WAN_FAILOVER_SUPPORTED is supported") +else() +message(STATUS "WAN_FAILOVER_SUPPORTED is not supported") +endif (WAN_FAILOVER_SUPPORTED) + add_executable(parodus ${SOURCES}) target_link_libraries (parodus @@ -57,6 +63,6 @@ target_link_libraries (parodus -llibseshat) endif (ENABLE_SESHAT) if (ENABLE_WEBCFGBIN) -target_link_libraries (parodus -lrbus -lrbus-core) +target_link_libraries (parodus -lrbus -lrbus-core -lrtMessage) endif (ENABLE_WEBCFGBIN) install (TARGETS parodus DESTINATION bin) diff --git a/src/config.c b/src/config.c index 35802b7..f3a0ae4 100644 --- a/src/config.c +++ b/src/config.c @@ -34,6 +34,7 @@ /* File Scoped Variables */ /*----------------------------------------------------------------------------*/ pthread_mutex_t config_mut=PTHREAD_MUTEX_INITIALIZER; +char webpa_interface[64]={'\0'}; static ParodusCfg parodusCfg; static unsigned int rsa_algorithms = @@ -481,8 +482,8 @@ int parseCommandLine(int argc,char **argv,ParodusCfg * cfg) break; case 'i': - parStrncpy(getWebpaInterface(), optarg,sizeof(getWebpaInterface())); - ParodusInfo("webpa_interface_used is %s\n",getWebpaInterface()); + parStrncpy(cfg->webpa_interface_used, optarg,sizeof(cfg->webpa_interface_used)); + ParodusInfo("webpa_interface_used is %s\n",cfg->webpa_interface_used); break; case 'l': @@ -858,15 +859,18 @@ void setWebpaInterface(char *value) } #endif -char * getWebpaInterface(void) +char *getWebpaInterface(void) { #ifdef WAN_FAILOVER_SUPPORTED - ParodusPrint("WAN_FAILOVER_SUPPORTED mode \n"); - pthread_mutex_lock (&config_mut); - return get_parodus_cfg()->webpa_interface_used; + ParodusInfo("WAN_FAILOVER_SUPPORTED mode \n"); + pthread_mutex_lock (&config_mut); + parStrncpy(webpa_interface, get_parodus_cfg()->webpa_interface_used, sizeof(webpa_interface)); pthread_mutex_unlock (&config_mut); - else - ParodusPrint("Erouter0 interface \n"); - return get_parodus_cfg()->webpa_interface_used; + #else + ParodusInfo("Erouter0 interface \n"); + parStrncpy(webpa_interface, get_parodus_cfg()->webpa_interface_used, sizeof(webpa_interface)); + #endif + ParodusInfo("webpa_interface:%s\n", webpa_interface); + return webpa_interface; } diff --git a/src/config.h b/src/config.h index ff503c0..ebb04cd 100644 --- a/src/config.h +++ b/src/config.h @@ -140,7 +140,7 @@ void set_parodus_cfg(ParodusCfg *); char *get_token_application(void) ; void set_cloud_disconnect_reason(ParodusCfg *cfg, char *disconn_reason); void reset_cloud_disconnect_reason(ParodusCfg *cfg); -char * getWebpaInterface(void); +char *getWebpaInterface(void); void setWebpaInterface(char *value); /** * parse a webpa url. Extract the server address, the port diff --git a/src/upstream.c b/src/upstream.c index 84dfd4b..7ad330f 100644 --- a/src/upstream.c +++ b/src/upstream.c @@ -83,7 +83,8 @@ void packMetaData() //Pack the metadata initially to reuse for every upstream msg sending to server ParodusPrint("-------------- Packing metadata ----------------\n"); sprintf(boot_time, "%d", get_parodus_cfg()->boot_time); - + char webpa_interface[64]={'\0'}; + sprintf(webpa_interface, "%s", getWebpaInterface()); struct data meta_pack[METADATA_COUNT] = { {HW_MODELNAME, get_parodus_cfg()->hw_model}, {HW_SERIALNUMBER, get_parodus_cfg()->hw_serial_number}, @@ -95,10 +96,9 @@ void packMetaData() {LAST_RECONNECT_REASON, get_global_reconnect_reason()}, {WEBPA_PROTOCOL, get_parodus_cfg()->webpa_protocol}, {WEBPA_UUID,get_parodus_cfg()->webpa_uuid}, - {WEBPA_INTERFACE, getWebpaInterface()}, + {WEBPA_INTERFACE,webpa_interface}, {PARTNER_ID, get_parodus_cfg()->partner_id} }; - const data_t metapack = {METADATA_COUNT, meta_pack}; metaPackSize = wrp_pack_metadata( &metapack , &metadataPack ); diff --git a/src/upstream_rbus.c b/src/upstream_rbus.c index ce25862..5d2a048 100644 --- a/src/upstream_rbus.c +++ b/src/upstream_rbus.c @@ -29,7 +29,9 @@ #include "partners_check.h" #define WEBCFG_UPSTREAM_EVENT "Webconfig.Upstream" +#ifdef WAN_FAILOVER_SUPPORTED #define WEBPA_INTERFACE "Device.X_RDK_WanManager.CurrentActiveInterfaceEvent" +#endif rbusHandle_t rbus_Handle; rbusError_t err; @@ -39,7 +41,7 @@ void processWebconfigUpstreamEvent(rbusHandle_t handle, rbusEvent_t const* event void subscribeAsyncHandler( rbusHandle_t handle, rbusEventSubscription_t* subscription, rbusError_t error); #ifdef WAN_FAILOVER_SUPPORTED -void eventReceiveHandler( rbusHandle_t rbus_handle, rbusEvent_t const* event, rbusEventSubscription_t* subscription ); +void eventReceiveHandler( rbusHandle_t rbus_Handle, rbusEvent_t const* event, rbusEventSubscription_t* subscription ); #endif /* API to register RBUS listener to receive messages from webconfig */ @@ -63,15 +65,9 @@ void subscribeRBUSevent() /* API to subscribe Active Interface name on value change event*/ int subscribeCurrentActiveInterfaceEvent() { - err = rbus_open(&rbus_Handle, "parodus"); - if (err) - { - ParodusError("rbus_open failed :%s\n", rbusError_ToString(err)); - return; - } int rc = RBUS_ERROR_SUCCESS; - ParodusInfo("Subscribing to Device.X_RDK_WanManager.CurrentActiveInterfaceEvent\n"); - rc = rbusEvent_Subscribe(rbus_handle,WEBPA_INTERFACE,eventReceiveHandler," ",0); + ParodusInfo("Subscribing to Device.X_RDK_WanManager.CurrentActiveInterfaceEvent..\n"); + rc = rbusEvent_Subscribe(rbus_Handle,WEBPA_INTERFACE,eventReceiveHandler,"parodusInterface",20); if(rc != RBUS_ERROR_SUCCESS) { ParodusInfo("Device.X_RDK_WanManager.CurrentActiveInterface subscribe failed : %d\n", rc); @@ -156,9 +152,10 @@ void subscribeAsyncHandler( rbusHandle_t handle, rbusEventSubscription_t* subscr } #ifdef WAN_FAILOVER_SUPPORTED -void eventReceiveHandler( rbusHandle_t rbus_handle, rbusEvent_t const* event, rbusEventSubscription_t* subscription ) +void eventReceiveHandler( rbusHandle_t rbus_Handle, rbusEvent_t const* event, rbusEventSubscription_t* subscription ) { - (void)rbus_handle; + ParodusInfo("Handling event inside eventReceiveHandler\n"); + (void)rbus_Handle; char * interface = NULL; rbusValue_t newValue = rbusObject_GetValue(event->data, "value"); rbusValue_t oldValue = rbusObject_GetValue(event->data, "oldValue"); @@ -168,7 +165,7 @@ void eventReceiveHandler( rbusHandle_t rbus_handle, rbusEvent_t const* event, rb ParodusInfo("New Value: %s\n", rbusValue_GetString(newValue, NULL)); interface = (char *) rbusValue_GetString(newValue, NULL); setWebpaInterface(interface); - ParodusInfo("New Interface value g_interface = %s\n",get_global_interface()); + ParodusInfo("New Interface value = %s\n",interface); } if(oldValue) ParodusInfo("Old Value: %s\n", rbusValue_GetString(oldValue, NULL)); diff --git a/tests/test_config.c b/tests/test_config.c index 3375203..a6f6475 100644 --- a/tests/test_config.c +++ b/tests/test_config.c @@ -208,13 +208,11 @@ void test_parseCommandLine() ParodusCfg parodusCfg; memset(&parodusCfg,0,sizeof(parodusCfg)); - #ifdef FEATURE_DNS_QUERY write_key_to_file ("../../tests/jwt_key.tst", jwt_key); #endif create_token_script("/tmp/token.sh"); assert_int_equal (parseCommandLine(argc,command,&parodusCfg), 0); - assert_string_equal( parodusCfg.hw_model, "TG1682"); assert_string_equal( parodusCfg.hw_serial_number, "Fer23u948590"); assert_string_equal( parodusCfg.hw_manufacturer, "ARRISGroup,Inc."); diff --git a/tests/test_crud_interface.c b/tests/test_crud_interface.c index 8649ff6..f848e03 100644 --- a/tests/test_crud_interface.c +++ b/tests/test_crud_interface.c @@ -125,6 +125,10 @@ int processCrudRequest(wrp_msg_t *reqMsg, wrp_msg_t **responseMsg ) return (int)mock(); } +char* getWebpaInterface(void) +{ + return NULL; +} /*----------------------------------------------------------------------------*/ /* Tests */ /*----------------------------------------------------------------------------*/ diff --git a/tests/test_upstream.c b/tests/test_upstream.c index 03bfe55..b05e4cc 100644 --- a/tests/test_upstream.c +++ b/tests/test_upstream.c @@ -44,6 +44,7 @@ extern size_t metaPackSize; extern UpStreamMsg *UpStreamMsgQ; int numLoops = 1; int deviceIDNull =0; +char webpa_interface[64]={'\0'}; wrp_msg_t *temp = NULL; extern pthread_mutex_t nano_mut; extern pthread_cond_t nano_con; @@ -116,6 +117,28 @@ ParodusCfg *get_parodus_cfg(void) return &parodusCfg; } +char *getWebpaInterface(void) +{ + ParodusCfg cfg; + memset(&cfg,0,sizeof(cfg)); + #ifdef WAN_FAILOVER_SUPPORTED + parStrncpy(cfg.webpa_interface_used , "wl0", sizeof(cfg.webpa_interface_used)); + else + parStrncpy(cfg.webpa_interface_used , "eth0", sizeof(cfg.webpa_interface_used)); + #endif + set_parodus_cfg(&cfg); + #ifdef WAN_FAILOVER_SUPPORTED + ParodusPrint("WAN_FAILOVER_SUPPORTED mode \n"); + pthread_mutex_lock (&config_mut); + parStrncpy(webpa_interface, get_parodus_cfg()->webpa_interface_used, sizeof(webpa_interface)); + pthread_mutex_unlock (&config_mut); + else + ParodusPrint("Erouter0 interface \n"); + parStrncpy(webpa_interface, get_parodus_cfg()->webpa_interface_used, sizeof(webpa_interface)); + #endif + return webpa_interface; +} + ssize_t wrp_pack_metadata( const data_t *packData, void **data ) { (void) packData; (void) data; diff --git a/tests/test_upstream_sock.c b/tests/test_upstream_sock.c index bcbccb8..d582ded 100644 --- a/tests/test_upstream_sock.c +++ b/tests/test_upstream_sock.c @@ -46,6 +46,7 @@ extern size_t metaPackSize; extern UpStreamMsg *UpStreamMsgQ; int numLoops = 1; int deviceIDNull =0; +char webpa_interface[64]={'\0'}; wrp_msg_t *reg_msg = NULL; extern pthread_mutex_t nano_mut; extern pthread_cond_t nano_con; @@ -101,6 +102,28 @@ ParodusCfg *get_parodus_cfg(void) return &parodusCfg; } +char *getWebpaInterface(void) +{ + ParodusCfg cfg; + memset(&cfg,0,sizeof(cfg)); + #ifdef WAN_FAILOVER_SUPPORTED + parStrncpy(cfg.webpa_interface_used , "wl0", sizeof(cfg.webpa_interface_used)); + else + parStrncpy(cfg.webpa_interface_used , "eth0", sizeof(cfg.webpa_interface_used)); + #endif + set_parodus_cfg(&cfg); + #ifdef WAN_FAILOVER_SUPPORTED + ParodusPrint("WAN_FAILOVER_SUPPORTED mode \n"); + pthread_mutex_lock (&config_mut); + parStrncpy(webpa_interface, get_parodus_cfg()->webpa_interface_used, sizeof(webpa_interface)); + pthread_mutex_unlock (&config_mut); + else + ParodusPrint("Erouter0 interface \n"); + parStrncpy(webpa_interface, get_parodus_cfg()->webpa_interface_used, sizeof(webpa_interface)); + #endif + return webpa_interface; +} + /*------------------------------------------- int nn_connect (int s, const char *addr) { From 7efed14c204de21c2290692c23974a3583e3c959 Mon Sep 17 00:00:00 2001 From: Sadhyama Vengilat Date: Fri, 18 Mar 2022 14:01:40 +0530 Subject: [PATCH 027/137] Enable WAN_FAILOVER_SUPPORTED and fix build issues --- CMakeLists.txt | 4 ++++ src/ParodusInternal.h | 4 +++- src/config.h | 2 +- src/upstream_rbus.c | 1 + tests/test_upstream.c | 5 +++-- tests/test_upstream_sock.c | 6 +++--- 6 files changed, 15 insertions(+), 7 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index b95e800..1152ed9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -309,6 +309,10 @@ if (ENABLE_WEBCFGBIN) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DENABLE_WEBCFGBIN ") endif (ENABLE_WEBCFGBIN) +if (WAN_FAILOVER_SUPPORTED) +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWAN_FAILOVER_SUPPORTED ") +endif (WAN_FAILOVER_SUPPORTED) + link_directories ( ${LIBRARY_DIR} ${COMMON_LIBRARY_DIR} ${LIBRARY_DIR64} ) add_subdirectory(src) if (BUILD_TESTING) diff --git a/src/ParodusInternal.h b/src/ParodusInternal.h index 915a91f..d47c191 100644 --- a/src/ParodusInternal.h +++ b/src/ParodusInternal.h @@ -164,7 +164,9 @@ void timespec_diff(struct timespec *start, struct timespec *stop, #ifdef ENABLE_WEBCFGBIN void subscribeRBUSevent(); #endif - +#ifdef WAN_FAILOVER_SUPPORTED +void setWebpaInterface(char *value); +#endif /*------------------------------------------------------------------------------*/ /* For interface_down_event Flag */ /*------------------------------------------------------------------------------*/ diff --git a/src/config.h b/src/config.h index ebb04cd..c4b18e8 100644 --- a/src/config.h +++ b/src/config.h @@ -141,7 +141,7 @@ char *get_token_application(void) ; void set_cloud_disconnect_reason(ParodusCfg *cfg, char *disconn_reason); void reset_cloud_disconnect_reason(ParodusCfg *cfg); char *getWebpaInterface(void); -void setWebpaInterface(char *value); + /** * parse a webpa url. Extract the server address, the port * and return whether it's secure or not diff --git a/src/upstream_rbus.c b/src/upstream_rbus.c index 5d2a048..3f98a52 100644 --- a/src/upstream_rbus.c +++ b/src/upstream_rbus.c @@ -154,6 +154,7 @@ void subscribeAsyncHandler( rbusHandle_t handle, rbusEventSubscription_t* subscr #ifdef WAN_FAILOVER_SUPPORTED void eventReceiveHandler( rbusHandle_t rbus_Handle, rbusEvent_t const* event, rbusEventSubscription_t* subscription ) { + (void)subscription; ParodusInfo("Handling event inside eventReceiveHandler\n"); (void)rbus_Handle; char * interface = NULL; diff --git a/tests/test_upstream.c b/tests/test_upstream.c index b05e4cc..1c2199b 100644 --- a/tests/test_upstream.c +++ b/tests/test_upstream.c @@ -49,6 +49,7 @@ wrp_msg_t *temp = NULL; extern pthread_mutex_t nano_mut; extern pthread_cond_t nano_con; static int crud_test = 0; +pthread_mutex_t config_mut=PTHREAD_MUTEX_INITIALIZER; /*----------------------------------------------------------------------------*/ /* Mocks */ /*----------------------------------------------------------------------------*/ @@ -123,7 +124,7 @@ char *getWebpaInterface(void) memset(&cfg,0,sizeof(cfg)); #ifdef WAN_FAILOVER_SUPPORTED parStrncpy(cfg.webpa_interface_used , "wl0", sizeof(cfg.webpa_interface_used)); - else + #else parStrncpy(cfg.webpa_interface_used , "eth0", sizeof(cfg.webpa_interface_used)); #endif set_parodus_cfg(&cfg); @@ -132,7 +133,7 @@ char *getWebpaInterface(void) pthread_mutex_lock (&config_mut); parStrncpy(webpa_interface, get_parodus_cfg()->webpa_interface_used, sizeof(webpa_interface)); pthread_mutex_unlock (&config_mut); - else + #else ParodusPrint("Erouter0 interface \n"); parStrncpy(webpa_interface, get_parodus_cfg()->webpa_interface_used, sizeof(webpa_interface)); #endif diff --git a/tests/test_upstream_sock.c b/tests/test_upstream_sock.c index d582ded..b355070 100644 --- a/tests/test_upstream_sock.c +++ b/tests/test_upstream_sock.c @@ -50,7 +50,7 @@ char webpa_interface[64]={'\0'}; wrp_msg_t *reg_msg = NULL; extern pthread_mutex_t nano_mut; extern pthread_cond_t nano_con; - +pthread_mutex_t config_mut=PTHREAD_MUTEX_INITIALIZER; /*----------------------------------------------------------------------------*/ /* Mocks */ /*----------------------------------------------------------------------------*/ @@ -108,7 +108,7 @@ char *getWebpaInterface(void) memset(&cfg,0,sizeof(cfg)); #ifdef WAN_FAILOVER_SUPPORTED parStrncpy(cfg.webpa_interface_used , "wl0", sizeof(cfg.webpa_interface_used)); - else + #else parStrncpy(cfg.webpa_interface_used , "eth0", sizeof(cfg.webpa_interface_used)); #endif set_parodus_cfg(&cfg); @@ -117,7 +117,7 @@ char *getWebpaInterface(void) pthread_mutex_lock (&config_mut); parStrncpy(webpa_interface, get_parodus_cfg()->webpa_interface_used, sizeof(webpa_interface)); pthread_mutex_unlock (&config_mut); - else + #else ParodusPrint("Erouter0 interface \n"); parStrncpy(webpa_interface, get_parodus_cfg()->webpa_interface_used, sizeof(webpa_interface)); #endif From 46273d97668658417a13efe49cb4fd7319c86bf9 Mon Sep 17 00:00:00 2001 From: Vasuki Date: Wed, 23 Mar 2022 14:57:39 +0530 Subject: [PATCH 028/137] Add cloud status mutex locks for Parodus send data US subtask --- src/config.c | 17 ++++++++++++++++- src/config.h | 2 ++ src/connection.c | 8 ++++---- src/crud_internal.c | 8 ++++---- src/nopoll_helpers.c | 2 +- tests/test_createConnection.c | 2 +- tests/test_crud_internal.c | 2 +- tests/test_nopoll_helpers.c | 5 +++++ 8 files changed, 34 insertions(+), 12 deletions(-) diff --git a/src/config.c b/src/config.c index b710b8a..d9cc8a8 100644 --- a/src/config.c +++ b/src/config.c @@ -33,7 +33,8 @@ /*----------------------------------------------------------------------------*/ /* File Scoped Variables */ /*----------------------------------------------------------------------------*/ - +pthread_mutex_t config_mut=PTHREAD_MUTEX_INITIALIZER; +char cloud_status[32]={'\0'}; static ParodusCfg parodusCfg; static unsigned int rsa_algorithms = (1<cloud_disconnect = NULL; } +void set_cloud_status(char *status) +{ + pthread_mutex_lock(&config_mut); + get_parodus_cfg()->cloud_status = strdup(status); + pthread_mutex_unlock(&config_mut); +} + +char *get_cloud_status(void) +{ + pthread_mutex_lock(&config_mut); + parStrncpy(cloud_status, get_parodus_cfg()->cloud_status, sizeof(cloud_status)); + pthread_mutex_unlock(&config_mut); + return cloud_status; +} const char *get_tok (const char *src, int delim, char *result, int resultsize) { diff --git a/src/config.h b/src/config.h index f7fc56a..118996f 100644 --- a/src/config.h +++ b/src/config.h @@ -139,6 +139,8 @@ void set_parodus_cfg(ParodusCfg *); char *get_token_application(void) ; void set_cloud_disconnect_reason(ParodusCfg *cfg, char *disconn_reason); void reset_cloud_disconnect_reason(ParodusCfg *cfg); +void set_cloud_status(char *status); +char *get_cloud_status(void); /** * parse a webpa url. Extract the server address, the port * and return whether it's secure or not diff --git a/src/connection.c b/src/connection.c index a44cf94..770fd0e 100644 --- a/src/connection.c +++ b/src/connection.c @@ -784,8 +784,8 @@ int createNopollConnection(noPollCtx *ctx, server_list_t *server_list) OnboardLog("Connected to server\n"); } - get_parodus_cfg()->cloud_status = CLOUD_STATUS_ONLINE; - ParodusInfo("cloud_status set as %s after successful connection\n", get_parodus_cfg()->cloud_status); + set_cloud_status(CLOUD_STATUS_ONLINE); + ParodusInfo("cloud_status set as %s after successful connection\n", get_cloud_status()); /* On initial connect success, invoke conn status change event as "success" */ if((NULL != on_conn_status_change) && init) @@ -901,8 +901,8 @@ void close_and_unref_connection(noPollConn *conn, bool is_shutting_down) { if (conn) { close_conn (conn, is_shutting_down); - get_parodus_cfg()->cloud_status = CLOUD_STATUS_OFFLINE; - ParodusInfo("cloud_status set as %s after connection close\n", get_parodus_cfg()->cloud_status); + set_cloud_status(CLOUD_STATUS_OFFLINE); + ParodusInfo("cloud_status set as %s after connection close\n", get_cloud_status()); } } diff --git a/src/crud_internal.c b/src/crud_internal.c index 0a77490..f53bba9 100644 --- a/src/crud_internal.c +++ b/src/crud_internal.c @@ -577,20 +577,20 @@ int retrieveFromMemory(char *keyName, cJSON **jsonresponse) } else if(strcmp(CLOUD_STATUS, keyName)==0) { - if(get_parodus_cfg()->cloud_status ==NULL) + if(get_cloud_status() ==NULL) { ParodusError("retrieveFromMemory: cloud_status value is NULL\n"); return -1; } - else if((get_parodus_cfg()->cloud_status !=NULL) && (strlen(get_parodus_cfg()->cloud_status)==0)) + else if((get_cloud_status() !=NULL) && (strlen(get_cloud_status())==0)) { ParodusError("retrieveFromMemory: cloud_status value is empty\n"); return -1; } else { - ParodusInfo("retrieveFromMemory: keyName:%s value:%s\n", keyName, get_parodus_cfg()->cloud_status); - cJSON_AddItemToObject( *jsonresponse, CLOUD_STATUS , cJSON_CreateString(get_parodus_cfg()->cloud_status)); + ParodusInfo("retrieveFromMemory: keyName:%s value:%s\n", keyName, get_cloud_status()); + cJSON_AddItemToObject( *jsonresponse, CLOUD_STATUS , cJSON_CreateString(get_cloud_status())); } } else if(strcmp(BOOT_TIME, keyName)==0) diff --git a/src/nopoll_helpers.c b/src/nopoll_helpers.c index 70ebc0f..7940e3a 100644 --- a/src/nopoll_helpers.c +++ b/src/nopoll_helpers.c @@ -52,7 +52,7 @@ void setMessageHandlers() static int cloud_status_is_online (void) { - const char *status = get_parodus_cfg()->cloud_status; + const char *status = get_cloud_status(); if (NULL == status) return false; return (strcmp (status, CLOUD_STATUS_ONLINE) == 0); diff --git a/tests/test_createConnection.c b/tests/test_createConnection.c index 88d90ea..aa6b83e 100644 --- a/tests/test_createConnection.c +++ b/tests/test_createConnection.c @@ -341,7 +341,7 @@ void test_createConnection() int ret = createNopollConnection(ctx); assert_int_equal(ret, nopoll_true); - assert_string_equal(get_parodus_cfg()->cloud_status, CLOUD_STATUS_ONLINE); + assert_string_equal(get_cloud_status(), CLOUD_STATUS_ONLINE); free(cfg); if (g_jwt_server_ip !=NULL) { diff --git a/tests/test_crud_internal.c b/tests/test_crud_internal.c index 332d282..0cb7e47 100644 --- a/tests/test_crud_internal.c +++ b/tests/test_crud_internal.c @@ -1530,7 +1530,7 @@ void test_retrieveObject_cloud_status() ret = retrieveObject(reqMsg, &respMsg); assert_int_equal (respMsg->u.crud.status, 200); assert_int_equal (ret, 0); - assert_string_equal(get_parodus_cfg()->cloud_status, CLOUD_STATUS_ONLINE); + assert_string_equal(get_cloud_status(), CLOUD_STATUS_ONLINE); assert_int_equal (respMsg->u.crud.payload_size, 25); fp = fopen(cfg.crud_config_file, "r"); diff --git a/tests/test_nopoll_helpers.c b/tests/test_nopoll_helpers.c index bebb956..13109e4 100644 --- a/tests/test_nopoll_helpers.c +++ b/tests/test_nopoll_helpers.c @@ -131,6 +131,11 @@ bool get_interface_down_event() return false; } +char *get_cloud_status(void) +{ + return NULL; +} + /*----------------------------------------------------------------------------*/ /* Tests */ /*----------------------------------------------------------------------------*/ From c97a3a3a204322e2b9ff2c9c893d29940df2f5b7 Mon Sep 17 00:00:00 2001 From: Sadhyama Vengilat Date: Fri, 25 Mar 2022 14:36:38 +0530 Subject: [PATCH 029/137] Rbus async ack handling for xmidt send requests --- CMakeLists.txt | 5 +- src/xmidtsend_rbus.c | 712 ++++++++++++++++++++++--------------------- src/xmidtsend_rbus.h | 28 +- 3 files changed, 398 insertions(+), 347 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 2958f1c..9fdda7b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -172,8 +172,9 @@ add_dependencies(libcimplog cimplog) ExternalProject_Add(wrp-c DEPENDS trower-base64 msgpack cimplog PREFIX ${CMAKE_CURRENT_BINARY_DIR}/_prefix/wrp-c - GIT_REPOSITORY https://github.com/Comcast/wrp-c.git - GIT_TAG "1.0.1" + GIT_REPOSITORY https://github.com/Thanusha-D/wrp-c.git + #GIT_TAG "1.0.1" + GIT_TAG qos_add CMAKE_ARGS += -DCMAKE_INSTALL_PREFIX=${INSTALL_DIR} -DMSGPACK_ENABLE_CXX=OFF -DMSGPACK_BUILD_EXAMPLES=OFF diff --git a/src/xmidtsend_rbus.c b/src/xmidtsend_rbus.c index 4dceb63..71608fe 100644 --- a/src/xmidtsend_rbus.c +++ b/src/xmidtsend_rbus.c @@ -28,15 +28,8 @@ #include "partners_check.h" #include "xmidtsend_rbus.h" -#define XMIDT_SEND_METHOD "Device.X_RDK_Xmidt.SendData" -static bool returnStatus = true; static pthread_t processThreadId = 0; - -typedef struct MethodData -{ - rbusMethodAsyncHandle_t asyncHandle; - rbusObject_t inParams; -} MethodData; +static int XmidtQsize = 0; XmidtMsg *XmidtMsgQ = NULL; @@ -64,165 +57,10 @@ pthread_mutex_t *get_global_xmidt_mut(void) return &xmidt_mut; } -static void* asyncMethodHandler(void *p) -{ - MethodData* data; - rbusObject_t outParams; - rbusValue_t value; - rbusError_t err; - ParodusInfo("Enter asyncMethodHandler. sending aync response back\n"); - - //This should be a consumer that awake when xpc ack is received. - //ParodusInfo("sleep of 10s for sending aync response back\n"); - //sleep(10); - //ParodusInfo("sleep done\n"); - data = p; - rbusValue_Init(&value); - rbusValue_SetString(value, "Async method response from parodus"); - rbusObject_Init(&outParams, NULL); - rbusObject_SetValue(outParams, "parodus_ack_response", value); - rbusValue_Release(value); - if(returnStatus) - { - ParodusInfo("asyncMethodHandler sending response as success\n"); - err = rbusMethod_SendAsyncResponse(data->asyncHandle, RBUS_ERROR_SUCCESS, outParams); - } - else - { - ParodusInfo("asyncMethodHandler sending response as failure\n"); - err = rbusMethod_SendAsyncResponse(data->asyncHandle, RBUS_ERROR_INVALID_RESPONSE_FROM_DESTINATION, outParams); - } - if(err != RBUS_ERROR_SUCCESS) - { - ParodusInfo("asyncMethodHandler rbusMethod_SendAsyncResponse failed err:%d\n", err); - } - else - { - ParodusInfo("asyncMethodHandler sent response to t2:%d\n", err); - } - ParodusInfo("Disabled inParams free\n"); - //rbusObject_Release(data->inParams); - rbusObject_Release(outParams); - /*if(data !=NULL) - { - free(data); - data = NULL; - }*/ - ParodusInfo("Exit asyncMethodHandler\n"); - return NULL; -} - -int displayInputParameters(rbusObject_t inParams) -{ - ParodusInfo("In displayInputParameters..\n"); - - rbusValue_t check = rbusObject_GetValue(inParams, "check"); - ParodusInfo("After check\n"); - if(check) - { - ParodusInfo("Rbus check method. Not proceeding to process this inparam\n"); - return 0; - } - - /*ParodusInfo("check msg_type\n"); - rbusValue_t msg_type = rbusObject_GetValue(inParams, "msg_type"); - ParodusInfo("After check msg_type\n"); - if(msg_type) - { - ParodusInfo("msg_type GetType\n"); - if(rbusValue_GetType(msg_type) == RBUS_STRING) - { - ParodusInfo("get msg_type string\n"); - char *msg_typeStr = rbusValue_GetString(msg_type, NULL); - ParodusInfo("msg_type value received is %s\n", msg_typeStr); - } - } - else - { - ParodusError("msg_type is empty\n"); - } - - rbusValue_t contenttype = rbusObject_GetValue(inParams, "content_type"); - ParodusInfo("After GetValue contentType\n"); - if(contenttype) - { - ParodusInfo("check contenttype type\n"); - if(rbusValue_GetType(contenttype) == RBUS_STRING) - { - ParodusInfo("content type is STRING\n"); - char * contenttypeStr = rbusValue_GetString(contenttype, NULL); - ParodusInfo("contenttype value received is %s\n", contenttypeStr); - } - } - else - { - ParodusError("contenttype is empty\n"); - } - - rbusValue_t source = rbusObject_GetValue(inParams, "source"); - if(source) - { - if(rbusValue_GetType(source) == RBUS_STRING) - { - char * sourceStr = rbusValue_GetString(source, NULL); - ParodusInfo("source value received is %s\n", sourceStr); - } - } - else - { - ParodusError("source is empty\n"); - } - - rbusValue_t dest = rbusObject_GetValue(inParams, "dest"); - if(dest) - { - if(rbusValue_GetType(dest) == RBUS_STRING) - { - char * dest_Str = rbusValue_GetString(dest, NULL); - ParodusInfo("dest value received is %s\n", dest_Str); - } - } - else - { - ParodusError("dest is empty\n"); - } - - rbusValue_t payload = rbusObject_GetValue(inParams, "payload"); - if(payload) - { - if((rbusValue_GetType(payload) == RBUS_STRING)) - { - char * payloadStr = rbusValue_GetString(payload, NULL); - ParodusInfo("payload received is %s\n", payloadStr); - } - } - else - { - ParodusError("payload is empty\n"); - } - - rbusValue_t payloadlen = rbusObject_GetValue(inParams, "payloadlen"); - if(payloadlen) - { - if(rbusValue_GetType(payloadlen) == RBUS_INT32) - { - ParodusInfo("payloadlen type %d RBUS_INT32 %d\n", rbusValue_GetType(payloadlen), RBUS_INT32); - int payloadlength = rbusValue_GetInt32(payloadlen); - ParodusInfo("payloadlen received is %d\n", payloadlength); - } - } - else - { - ParodusError("payloadlen is empty\n"); - }*/ - return 1; -} - /* * @brief To handle xmidt rbus messages received from various components. */ - -void addToXmidtUpstreamQ(rbusObject_t inParams) +void addToXmidtUpstreamQ(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle) { XmidtMsg *message; @@ -231,7 +69,11 @@ void addToXmidtUpstreamQ(rbusObject_t inParams) if(message) { - message->msg =inParams; + message->msg = msg; + message->asyncHandle =asyncHandle; + //Increment queue size to handle max queue limit + XmidtQsize++; + ParodusInfo("XmidtQsize is %d\n" , XmidtQsize); message->next=NULL; pthread_mutex_lock (&xmidt_mut); //Producer adds the rbus msg into queue @@ -283,6 +125,8 @@ void processXmidtData() //Consumer to Parse and process rbus data. void* processXmidtUpstreamMsg() { + int ret = 0; + while(FOREVER()) { pthread_mutex_lock (&xmidt_mut); @@ -293,9 +137,15 @@ void* processXmidtUpstreamMsg() XmidtMsgQ = XmidtMsgQ->next; pthread_mutex_unlock (&xmidt_mut); ParodusInfo("mutex unlock in xmidt consumer thread\n"); - - ParodusInfo("B4 parseData\n"); - parseData(Data->msg); + ret = processData(Data->msg, Data->asyncHandle); + if(ret) + { + ParodusInfo("xmidt processData is success\n"); + } + else + { + ParodusError("Failed to process xmidt data\n"); + } } else { @@ -313,68 +163,321 @@ void* processXmidtUpstreamMsg() return NULL; } -void parseData(rbusObject_t msg) +int processData(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle) { - rbusObject_t inParamObj; + int rv = 0; + char *errorMsg = "none"; + //rbusObject_t outParams; + //rbusError_t err; + int statuscode =0; - //ParodusInfo("Type cast to rbusObj..\n"); - //inParamObj = *(rbusObject_t*)(msg); - - inParamObj = msg ; - - ParodusInfo("print in params from consumer..\n"); - if(inParamObj !=NULL) + wrp_msg_t * xmidtMsg = msg; + if (xmidtMsg == NULL) { - int status = displayInputParameters(inParamObj); - ParodusInfo("print inparams done. status %d\n", status); + ParodusError("xmidtMsg is NULL\n"); + return 0; + } + + rv = validateXmidtData(xmidtMsg, &errorMsg, &statuscode); + ParodusInfo("After validateXmidtData, errorMsg %s statuscode %d\n", errorMsg, statuscode); + if(rv) + { + ParodusInfo("validation successful, send event to server\n"); + sendXmidtEventToServer(xmidtMsg); + return 1; } else { - ParodusError("inParamObj is NULL\n"); + ParodusError("validation failed, send failure ack\n"); + ParodusInfo("errorMsg %s\n", errorMsg); + createOutParamsandSendAck(xmidtMsg, asyncHandle, errorMsg , statuscode); + ParodusInfo("Free errorMsg\n"); + if(errorMsg !=NULL) + { + free(errorMsg); + errorMsg = NULL; + } + ParodusInfo("ack done\n"); } - processXmidtEvent(inParamObj); - ParodusInfo("processXmidtEvent done\n"); - - //Need to send failure status when received input params are empty/invalid. + return 0; } -int processXmidtEvent(rbusObject_t inParams) +int validateXmidtData(wrp_msg_t * eventMsg, char **errorMsg, int *statusCode) { - char *contenttypeStr = NULL; - char *msg_typeStr = NULL; - char * sourceStr = NULL; - char *source_string = NULL; - char * dest_Str = NULL; - char * payloadStr = NULL; - unsigned int payloadlength = 0; - int qosVal = 0; + if(eventMsg == NULL) + { + ParodusError("eventMsg is NULL\n"); + return 0; + } + + if(eventMsg->msg_type != WRP_MSG_TYPE__EVENT) + { + *errorMsg = strdup("Message format is invalid"); + *statusCode = INVALID_MSG_TYPE; + ParodusError("*errorMsg %s *statusCode %d\n", *errorMsg, *statusCode); + return 0; + } + + if(eventMsg->u.event.source == NULL) + { + *errorMsg = strdup("Missing source"); + *statusCode = MISSING_SOURCE; + ParodusError("*errorMsg %s *statusCode %d\n", *errorMsg, *statusCode); + return 0; + } + + if(eventMsg->u.event.dest == NULL) + { + *errorMsg = strdup("Missing dest"); + *statusCode = MISSING_DEST; + ParodusError("*errorMsg %s *statusCode %d\n", *errorMsg, *statusCode); + return 0; + } + + if(eventMsg->u.event.content_type == NULL) + { + *errorMsg = strdup("Missing content_type"); + *statusCode = MISSING_CONTENT_TYPE; + ParodusError("*errorMsg %s *statusCode %d\n", *errorMsg, *statusCode); + return 0; + } + + if(eventMsg->u.event.payload == NULL) + { + *errorMsg = strdup("Missing payload"); + *statusCode = MISSING_PAYLOAD; + ParodusError("*errorMsg %s *statusCode %d\n", *errorMsg, *statusCode); + return 0; + } + + if(eventMsg->u.event.payload_size == 0) + { + *errorMsg = strdup("Missing payloadlen"); + *statusCode = MISSING_PAYLOADLEN; + ParodusError("*errorMsg %s *statusCode %d\n", *errorMsg, *statusCode); + return 0; + } + + ParodusInfo("validateXmidtData success. *errorMsg %s *statusCode %d\n", *errorMsg, *statusCode); + return 1; +} + +void sendXmidtEventToServer(wrp_msg_t * msg) +{ + wrp_msg_t *notif_wrp_msg = NULL; + ssize_t msg_len; + void *msg_bytes; + int ret = -1; + char sourceStr[64] = {'\0'}; char *device_id = NULL; size_t device_id_len = 0; - int ret = -1; - int rv = 1; - ParodusInfo("In processXmidtEvent\n"); - //contentType - rbusValue_t contenttype = rbusObject_GetValue(inParams, "content_type"); - //ParodusInfo("content_type GetValue\n"); - if(contenttype) + ParodusInfo("In sendXmidtEventToServer\n"); + notif_wrp_msg = (wrp_msg_t *)malloc(sizeof(wrp_msg_t)); + if(notif_wrp_msg != NULL) { - //ParodusInfo("contenttype check type\n"); - if(rbusValue_GetType(contenttype) == RBUS_STRING) + memset(notif_wrp_msg, 0, sizeof(wrp_msg_t)); + notif_wrp_msg->msg_type = WRP_MSG_TYPE__EVENT; + + ParodusInfo("msg->u.event.source: %s\n",msg->u.event.source); + if(msg->u.event.source !=NULL) { - //ParodusInfo("contenttype is string\n"); - contenttypeStr = rbusValue_GetString(contenttype, NULL); - ParodusInfo("contenttype value received is %s\n", contenttypeStr); + //To get device_id in the format "mac:112233445xxx" + ret = getDeviceId(&device_id, &device_id_len); + if(ret == 0) + { + ParodusInfo("device_id %s device_id_len %lu\n", device_id, device_id_len); + snprintf(sourceStr, sizeof(sourceStr), "%s/%s", device_id, msg->u.event.source); + ParodusInfo("sourceStr formed is %s\n" , sourceStr); + notif_wrp_msg->u.event.source = strdup(sourceStr); + ParodusInfo("notif_wrp_msg->u.event.source is %s\n", notif_wrp_msg->u.event.source); + } + else + { + ParodusError("Failed to get device_id\n"); + } } + ParodusInfo("destination: %s\n", msg->u.event.dest); + notif_wrp_msg->u.event.dest = msg->u.event.dest; + if(msg->u.event.content_type != NULL) + { + if(strcmp(msg->u.event.content_type , "JSON") == 0) + { + notif_wrp_msg->u.event.content_type = strdup("application/json"); + } + ParodusInfo("content_type is %s\n",notif_wrp_msg->u.event.content_type); + } + if(msg->u.event.payload != NULL) + { + ParodusInfo("Notification payload: %s\n",msg->u.event.payload); + notif_wrp_msg->u.event.payload = (void *)msg->u.event.payload; + notif_wrp_msg->u.event.payload_size = msg->u.event.payload_size; + ParodusInfo("payload size %lu\n", notif_wrp_msg->u.event.payload_size); + } + + if(msg->u.event.qos != 0) + { + notif_wrp_msg->u.event.qos = msg->u.event.qos; + ParodusInfo("Notification qos: %d\n",notif_wrp_msg->u.event.qos); + } + ParodusInfo("Encode xmidt wrp msg\n"); + msg_len = wrp_struct_to (notif_wrp_msg, WRP_BYTES, &msg_bytes); + + ParodusInfo("Encoded xmidt wrp msg, msg_len %lu\n", msg_len); + if(msg_len > 0) + { + ParodusInfo("sendUpstreamMsgToServer\n"); + sendUpstreamMsgToServer(&msg_bytes, msg_len); + } + wrp_free_struct(notif_wrp_msg); + ParodusInfo("After wrp_free_struct\n"); + free(msg_bytes); + msg_bytes = NULL; + ParodusInfo("sendXmidtEventToServer done\n"); + } +} + +void createOutParamsandSendAck(wrp_msg_t *msg, rbusMethodAsyncHandle_t asyncHandle, char *errorMsg, int statuscode) +{ + rbusObject_t outParam; + rbusError_t err; + rbusValue_t value; + char qosstring[20] = ""; + + if(msg == NULL) + { + ParodusError("msg is NULL\n"); + return; + } + + ParodusInfo("createOutParams\n"); + rbusObject_Init(&outParam, NULL); + + rbusValue_Init(&value); + rbusValue_SetString(value, "event"); + rbusObject_SetValue(outParam, "msg_type", value); + rbusValue_Release(value); + + rbusValue_Init(&value); + rbusValue_SetString(value, msg->u.event.source); + rbusObject_SetValue(outParam, "source", value); + rbusValue_Release(value); + + rbusValue_Init(&value); + rbusValue_SetString(value, msg->u.event.dest); + rbusObject_SetValue(outParam, "dest", value); + rbusValue_Release(value); + + rbusValue_Init(&value); + rbusValue_SetString(value, msg->u.event.content_type); + rbusObject_SetValue(outParam, "content_type", value); + rbusValue_Release(value); + + + rbusValue_Init(&value); + ParodusInfo("msg->u.event.qos int %d\n", msg->u.event.qos); + snprintf(qosstring, sizeof(qosstring), "%d", msg->u.event.qos); + ParodusInfo("qosstring is %s\n", qosstring); + rbusValue_SetString(value, qosstring); + rbusObject_SetValue(outParam, "qos", value); + rbusValue_Release(value); + + ParodusInfo("statuscode %d errorMsg %s\n", statuscode, errorMsg); + rbusValue_Init(&value); + rbusValue_SetInt32(value, statuscode); + rbusObject_SetValue(outParam, "status", value); + rbusValue_Release(value); + + rbusValue_Init(&value); + rbusValue_SetString(value, errorMsg); + rbusObject_SetValue(outParam, "error_message", value); + rbusValue_Release(value); + + rbusValue_Init(&value); + rbusValue_SetString(value, "transaction_uuid"); //change this to actual transid + rbusObject_SetValue(outParam, "transaction_uuid", value); + rbusValue_Release(value); + + ParodusInfo("createOutParams done\n"); + + if(outParam !=NULL) + { + ParodusInfo("B4 rbusMethod_SendAsyncResponse\n"); + if(asyncHandle == NULL) + { + ParodusInfo("asyncHandle is NULL\n"); + return; + } + err = rbusMethod_SendAsyncResponse(asyncHandle, RBUS_ERROR_INVALID_INPUT, outParam); + ParodusInfo("After rbusMethod_SendAsyncResponse\n"); + ParodusInfo("err is %d RBUS_ERROR_SUCCESS %d\n", err, RBUS_ERROR_SUCCESS); + if(err != RBUS_ERROR_SUCCESS) + { + ParodusError("rbusMethod_SendAsyncResponse failed err:%d\n", err); + } + else + { + ParodusInfo("rbusMethod_SendAsyncResponse success:%d\n", err); + } + ParodusInfo("Release outParams\n"); + rbusObject_Release(outParam); + ParodusInfo("outParams released\n"); } else { - ParodusError("contenttype is empty\n"); - return rv; + ParodusError("Failed to create outParams\n"); + } + + return; +} + +/* +* @brief This function handles check method call from t2 before the actual inParams SET and to not proceed with inParams processing. +*/ +int checkInputParameters(rbusObject_t inParams) +{ + rbusValue_t check = rbusObject_GetValue(inParams, "check"); + if(check) + { + ParodusInfo("Rbus check method. Not proceeding to process this inparam\n"); + return 0; + } + return 1; +} + +//To generate unique transaction id for xmidt send requests +char* generate_transaction_uuid() +{ + char *transID = NULL; + uuid_t transaction_Id; + char *trans_id = NULL; + trans_id = (char *)malloc(37); + uuid_generate_random(transaction_Id); + uuid_unparse(transaction_Id, trans_id); + + if(trans_id !=NULL) + { + transID = trans_id; + } + return transID; +} + +void parseRbusInparamsToWrp(rbusObject_t inParams, wrp_msg_t **eventMsg) +{ + const char *msg_typeStr = NULL; + const char *sourceVal = NULL; + const char *destStr = NULL, *contenttypeStr = NULL; + const char *payloadStr = NULL, *qosVal = NULL; + unsigned int payloadlength = 0; + + wrp_msg_t *msg = NULL; + + msg = ( wrp_msg_t * ) malloc( sizeof( wrp_msg_t ) ); + if(msg != NULL) + { + memset( msg, 0, sizeof( wrp_msg_t ) ); } - //msg_type - ParodusInfo("check msg_type.\n"); rbusValue_t msg_type = rbusObject_GetValue(inParams, "msg_type"); if(msg_type) { @@ -382,73 +485,65 @@ int processXmidtEvent(rbusObject_t inParams) { msg_typeStr = rbusValue_GetString(msg_type, NULL); ParodusInfo("msg_type value received is %s\n", msg_typeStr); - if((msg_typeStr !=NULL) && (strcmp(msg_typeStr, "event") !=0)) + if((msg_typeStr !=NULL) && (strcmp(msg_typeStr, "event") ==0)) { - ParodusError("msg_type is not event\n"); - return rv; + msg->msg_type = WRP_MSG_TYPE__EVENT; } } } else { ParodusError("msg_type is empty\n"); - return rv; } - //source rbusValue_t source = rbusObject_GetValue(inParams, "source"); if(source) { if(rbusValue_GetType(source) == RBUS_STRING) { - sourceStr = rbusValue_GetString(source, NULL); - ParodusInfo("source value received is %s\n", sourceStr); - if(sourceStr !=NULL) - { - //To get device_id in the format "mac:112233445xxx" - ret = getDeviceId(&device_id, &device_id_len); - if(ret == 0) - { - ParodusInfo("device_id %s device_id_len %lu\n", device_id, device_id_len); - source_string = (char *) malloc(sizeof(char)*64); - if(source_string !=NULL) - { - snprintf(source_string, 64, "%s/%s", device_id, sourceStr); - ParodusInfo("source_string formed is %s\n" , source_string); - } - } - else - { - ParodusError("Failed to get device_id\n"); - return rv; - } - } - + sourceVal = rbusValue_GetString(source, NULL); + ParodusInfo("source value received is %s\n", sourceVal); + msg->u.event.source = strdup(sourceVal); //free + ParodusPrint("msg->u.event.source is %s\n", msg->u.event.source); } } else { ParodusError("source is empty\n"); - return rv; } - //dest rbusValue_t dest = rbusObject_GetValue(inParams, "dest"); if(dest) { if(rbusValue_GetType(dest) == RBUS_STRING) { - dest_Str = rbusValue_GetString(dest, NULL); - ParodusInfo("dest value received is %s\n", dest_Str); + destStr = rbusValue_GetString(dest, NULL); + ParodusInfo("dest value received is %s\n", destStr); + msg->u.event.dest = strdup(destStr); //free + ParodusPrint("msg->u.event.dest is %s\n", msg->u.event.dest); } } else { ParodusError("dest is empty\n"); - return rv; } - //payload + rbusValue_t contenttype = rbusObject_GetValue(inParams, "content_type"); + if(contenttype) + { + if(rbusValue_GetType(contenttype) == RBUS_STRING) + { + contenttypeStr = rbusValue_GetString(contenttype, NULL); + ParodusInfo("contenttype value received is %s\n", contenttypeStr); + msg->u.event.content_type = strdup(contenttypeStr); //free + ParodusPrint("msg->u.event.content_type is %s\n", msg->u.event.content_type); + } + } + else + { + ParodusError("contenttype is empty\n"); + } + rbusValue_t payload = rbusObject_GetValue(inParams, "payload"); if(payload) { @@ -456,148 +551,85 @@ int processXmidtEvent(rbusObject_t inParams) { payloadStr = rbusValue_GetString(payload, NULL); ParodusInfo("payload received is %s\n", payloadStr); + msg->u.event.payload = strdup(payloadStr); //free + ParodusPrint("msg->u.event.payload is %s\n", msg->u.event.payload); } } else { ParodusError("payload is empty\n"); - return rv; } - //payloadlen - ParodusInfo("check payloadlen\n"); rbusValue_t payloadlen = rbusObject_GetValue(inParams, "payloadlen"); if(payloadlen) { - ParodusPrint("payloadlen is not empty\n"); if(rbusValue_GetType(payloadlen) == RBUS_INT32) { - ParodusInfo("payloadlen type %d RBUS_INT32 %d\n", rbusValue_GetType(payloadlen), RBUS_INT32); + ParodusPrint("payloadlen type %d RBUS_INT32 %d\n", rbusValue_GetType(payloadlen), RBUS_INT32); payloadlength = rbusValue_GetInt32(payloadlen); - ParodusInfo("payloadlen received is %lu\n", payloadlength); + ParodusPrint("payloadlen received is %lu\n", payloadlength); + msg->u.event.payload_size = (size_t) payloadlength; + ParodusPrint("msg->u.event.payload_size is %lu\n", msg->u.event.payload_size); } } else { ParodusError("payloadlen is empty\n"); - return rv; } - //qos optional ParodusInfo("check qos\n"); rbusValue_t qos = rbusObject_GetValue(inParams, "qos"); - ParodusInfo("qos value object\n"); if(qos) { - ParodusInfo("qos is not empty\n"); - if(rbusValue_GetType(qos) == RBUS_INT32) + if(rbusValue_GetType(qos) == RBUS_STRING) { - ParodusInfo("qos type %d RBUS_INT32 %d\n", rbusValue_GetType(qos), RBUS_INT32); - qosVal = rbusValue_GetInt32(qos); - ParodusInfo("qos received is %d\n", qosVal); - } - } - - ParodusInfo("B4 sendXmidtEventToServer\n"); - sendXmidtEventToServer(source_string, dest_Str, contenttypeStr, qosVal, payloadStr, payloadlength); - ParodusInfo("processXmidtEvent is completed\n"); - rv = 0; - return rv; -} - -void sendXmidtEventToServer(char *source, char *destination, char* contenttype, int qos, void *payload, unsigned int payload_len) -{ - wrp_msg_t *notif_wrp_msg = NULL; - int rc = RBUS_ERROR_SUCCESS; - ssize_t msg_len; - void *msg_bytes; - - ParodusInfo("In sendXmidtEventToServer\n"); - if(source != NULL && destination != NULL && contenttype != NULL && payload != NULL) - { - notif_wrp_msg = (wrp_msg_t *)malloc(sizeof(wrp_msg_t)); - if(notif_wrp_msg != NULL) - { - memset(notif_wrp_msg, 0, sizeof(wrp_msg_t)); - notif_wrp_msg->msg_type = WRP_MSG_TYPE__EVENT; - ParodusInfo("source: %s\n",source); - notif_wrp_msg->u.event.source = strdup(source); //free - ParodusInfo("destination: %s\n", destination); - notif_wrp_msg->u.event.dest = strdup(destination); //free - if(contenttype != NULL) - { - if(strcmp(contenttype , "JSON") == 0) - { - notif_wrp_msg->u.event.content_type = strdup("application/json"); - } - ParodusInfo("content_type is %s\n",notif_wrp_msg->u.event.content_type); - } - if(payload != NULL) - { - ParodusInfo("Notification payload: %s\n",payload); - notif_wrp_msg->u.event.payload = (void *)payload; - notif_wrp_msg->u.event.payload_size = payload_len; - ParodusInfo("payload len %lu\n", payload_len); - } - - ParodusInfo("Encode xmidt wrp msg\n"); - msg_len = wrp_struct_to (notif_wrp_msg, WRP_BYTES, &msg_bytes); - - ParodusInfo("Encoded xmidt wrp msg, msg_len %lu\n", msg_len); - if(msg_len > 0) - { - ParodusInfo("sendUpstreamMsgToServer\n"); - sendUpstreamMsgToServer(&msg_bytes, msg_len); - } - ParodusInfo("B4 wrp_free_struct disabled.\n"); - //wrp_free_struct(notif_wrp_msg); - ParodusInfo("After wrp_free_struct\n"); - free(msg_bytes); - msg_bytes = NULL; - ParodusInfo("sendXmidtEventToServer done\n"); + ParodusPrint("qos type %d RBUS_STRING %d\n", rbusValue_GetType(qos), RBUS_STRING); + qosVal = rbusValue_GetString(qos, NULL); + ParodusInfo("qos received is %s\n", qosVal); + if(qosVal !=NULL) + { + msg->u.event.qos = atoi(qosVal); + ParodusPrint("msg->u.event.qos is %d\n", msg->u.event.qos); + } } } + *eventMsg = msg; + ParodusInfo("parseRbusInparamsToWrp End\n"); } static rbusError_t sendDataHandler(rbusHandle_t handle, char const* methodName, rbusObject_t inParams, rbusObject_t outParams, rbusMethodAsyncHandle_t asyncHandle) { (void) handle; + int inStatus = 0; + char *transaction_uuid = NULL; + wrp_msg_t *wrpMsg= NULL; ParodusInfo("methodHandler called: %s\n", methodName); //rbusObject_fwrite(inParams, 1, stdout); - //ParodusInfo("displayInputParameters ..\n"); - int displayStatus = displayInputParameters(inParams); - //ParodusInfo("displayInputParameters done\n"); - - if(displayStatus) + if((methodName !=NULL) && (strcmp(methodName, XMIDT_SEND_METHOD) == 0)) { - if(strcmp(methodName, XMIDT_SEND_METHOD) == 0) + inStatus = checkInputParameters(inParams); + if(inStatus) { - pthread_t pid; - MethodData* data = malloc(sizeof(MethodData)); - data->asyncHandle = asyncHandle; - data->inParams = inParams; - rbusObject_Retain(inParams); + parseRbusInparamsToWrp(inParams, &wrpMsg); + //generate transaction id to create outParams and send ack + transaction_uuid = generate_transaction_uuid(); + ParodusInfo("xmidt transaction_uuid generated is %s\n", transaction_uuid); + //xmidt send producer - addToXmidtUpstreamQ(inParams); - /**** For now, disable async ack send to t2 nack ***/ - if(pthread_create(&pid, NULL, asyncMethodHandler, data) || pthread_detach(pid)) - { - ParodusError("sendDataHandler failed to create thread\n"); - return RBUS_ERROR_BUS_ERROR; - } - ParodusInfo("sendDataHandler created async thread, returned %d\n", RBUS_ERROR_ASYNC_RESPONSE); - return RBUS_ERROR_ASYNC_RESPONSE; + addToXmidtUpstreamQ(wrpMsg, asyncHandle); + ParodusInfo("sendDataHandler returned %d\n", RBUS_ERROR_ASYNC_RESPONSE); + //return RBUS_ERROR_ASYNC_RESPONSE; } else { - ParodusError("Method %s received is not supported\n", methodName); - return RBUS_ERROR_BUS_ERROR; + ParodusInfo("check method call received, ignoring input\n"); } } else { - ParodusError("displayStatus is not correct\n"); + ParodusError("Method %s received is not supported\n", methodName); + return RBUS_ERROR_BUS_ERROR; } } diff --git a/src/xmidtsend_rbus.h b/src/xmidtsend_rbus.h index 77440d7..94b783b 100644 --- a/src/xmidtsend_rbus.h +++ b/src/xmidtsend_rbus.h @@ -24,30 +24,48 @@ #ifndef _XMIDTSEND_RBUS_H_ #define _XMIDTSEND_RBUS_H_ #include +#include #ifdef __cplusplus extern "C" { #endif +#define XMIDT_SEND_METHOD "Device.X_RDK_Xmidt.SendData" /*----------------------------------------------------------------------------*/ /* Data Structures */ /*----------------------------------------------------------------------------*/ typedef struct XmidtMsg__ { - rbusObject_t msg; + wrp_msg_t *msg; + rbusMethodAsyncHandle_t asyncHandle; struct XmidtMsg__ *next; } XmidtMsg; +typedef enum +{ + INVALID_MSG_TYPE = 1, + MISSING_SOURCE, + MISSING_DEST, + MISSING_CONTENT_TYPE, + MISSING_PAYLOAD, + MISSING_PAYLOADLEN, + ENQUEUE_FAILURE = 100, + CLIENT_DISCONNECT = 101 +} XMIDT_STATUS; /*----------------------------------------------------------------------------*/ /* Function Prototypes */ /*----------------------------------------------------------------------------*/ rbusHandle_t get_parodus_rbus_Handle(void); -void addToXmidtUpstreamQ(rbusObject_t inParams); +void addToXmidtUpstreamQ(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle); void* processXmidtUpstreamMsg(); void processXmidtData(); -void parseData(rbusObject_t msg); -int processXmidtEvent(rbusObject_t inParams); -void sendXmidtEventToServer(char *source, char *destination, char*contenttype, int qos, void *payload, unsigned int payload_len); +int processData(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle); +void sendXmidtEventToServer(wrp_msg_t * msg); +int checkInputParameters(rbusObject_t inParams); +char* generate_transaction_uuid(); +void parseRbusInparamsToWrp(rbusObject_t inParams, wrp_msg_t **eventMsg); +void createOutParamsandSendAck(wrp_msg_t *msg, rbusMethodAsyncHandle_t asyncHandle, char *errorMsg, int statuscode); +int validateXmidtData(wrp_msg_t * eventMsg, char **errorMsg, int *statusCode); #ifdef __cplusplus } #endif From 656b1b0b582feec6d9ec35330adff052962c9f5a Mon Sep 17 00:00:00 2001 From: Sadhyama Vengilat Date: Mon, 28 Mar 2022 12:10:19 +0530 Subject: [PATCH 030/137] To fix send ack crash due to OutParams NULL issue --- src/xmidtsend_rbus.c | 84 ++++++++++++++++++++++++++------------------ 1 file changed, 50 insertions(+), 34 deletions(-) diff --git a/src/xmidtsend_rbus.c b/src/xmidtsend_rbus.c index 71608fe..788e642 100644 --- a/src/xmidtsend_rbus.c +++ b/src/xmidtsend_rbus.c @@ -339,7 +339,7 @@ void sendXmidtEventToServer(wrp_msg_t * msg) void createOutParamsandSendAck(wrp_msg_t *msg, rbusMethodAsyncHandle_t asyncHandle, char *errorMsg, int statuscode) { - rbusObject_t outParam; + rbusObject_t outParams; rbusError_t err; rbusValue_t value; char qosstring[20] = ""; @@ -351,64 +351,78 @@ void createOutParamsandSendAck(wrp_msg_t *msg, rbusMethodAsyncHandle_t asyncHand } ParodusInfo("createOutParams\n"); - rbusObject_Init(&outParam, NULL); rbusValue_Init(&value); rbusValue_SetString(value, "event"); - rbusObject_SetValue(outParam, "msg_type", value); + rbusObject_Init(&outParams, NULL); + rbusObject_SetValue(outParams, "msg_type", value); rbusValue_Release(value); - rbusValue_Init(&value); - rbusValue_SetString(value, msg->u.event.source); - rbusObject_SetValue(outParam, "source", value); - rbusValue_Release(value); + if(msg->u.event.source !=NULL) + { + ParodusInfo("msg->u.event.source is %s\n", msg->u.event.source); + rbusValue_Init(&value); + rbusValue_SetString(value, msg->u.event.source); + rbusObject_SetValue(outParams, "source", value); + rbusValue_Release(value); + } - rbusValue_Init(&value); - rbusValue_SetString(value, msg->u.event.dest); - rbusObject_SetValue(outParam, "dest", value); - rbusValue_Release(value); + if(msg->u.event.dest !=NULL) + { + rbusValue_Init(&value); + rbusValue_SetString(value, msg->u.event.dest); + rbusObject_SetValue(outParams, "dest", value); + rbusValue_Release(value); + } - rbusValue_Init(&value); - rbusValue_SetString(value, msg->u.event.content_type); - rbusObject_SetValue(outParam, "content_type", value); - rbusValue_Release(value); + if(msg->u.event.content_type !=NULL) + { + rbusValue_Init(&value); + rbusValue_SetString(value, msg->u.event.content_type); + rbusObject_SetValue(outParams, "content_type", value); + rbusValue_Release(value); + } - - rbusValue_Init(&value); - ParodusInfo("msg->u.event.qos int %d\n", msg->u.event.qos); - snprintf(qosstring, sizeof(qosstring), "%d", msg->u.event.qos); - ParodusInfo("qosstring is %s\n", qosstring); - rbusValue_SetString(value, qosstring); - rbusObject_SetValue(outParam, "qos", value); - rbusValue_Release(value); + if(msg->u.event.qos !=NULL) + { + rbusValue_Init(&value); + ParodusInfo("msg->u.event.qos int %d\n", msg->u.event.qos); + snprintf(qosstring, sizeof(qosstring), "%d", msg->u.event.qos); + ParodusInfo("qosstring is %s\n", qosstring); + rbusValue_SetString(value, qosstring); + rbusObject_SetValue(outParams, "qos", value); + rbusValue_Release(value); + } ParodusInfo("statuscode %d errorMsg %s\n", statuscode, errorMsg); rbusValue_Init(&value); rbusValue_SetInt32(value, statuscode); - rbusObject_SetValue(outParam, "status", value); + rbusObject_SetValue(outParams, "status", value); rbusValue_Release(value); - rbusValue_Init(&value); - rbusValue_SetString(value, errorMsg); - rbusObject_SetValue(outParam, "error_message", value); - rbusValue_Release(value); + if(errorMsg !=NULL) + { + rbusValue_Init(&value); + rbusValue_SetString(value, errorMsg); + rbusObject_SetValue(outParams, "error_message", value); + rbusValue_Release(value); + } rbusValue_Init(&value); rbusValue_SetString(value, "transaction_uuid"); //change this to actual transid - rbusObject_SetValue(outParam, "transaction_uuid", value); + rbusObject_SetValue(outParams, "transaction_uuid", value); rbusValue_Release(value); - ParodusInfo("createOutParams done\n"); - if(outParam !=NULL) + if(outParams !=NULL) { - ParodusInfo("B4 rbusMethod_SendAsyncResponse\n"); if(asyncHandle == NULL) { ParodusInfo("asyncHandle is NULL\n"); return; } - err = rbusMethod_SendAsyncResponse(asyncHandle, RBUS_ERROR_INVALID_INPUT, outParam); + ParodusInfo("B4 rbusMethod_SendAsyncResponse ..\n"); + err = rbusMethod_SendAsyncResponse(asyncHandle, RBUS_ERROR_INVALID_RESPONSE_FROM_DESTINATION, outParams); ParodusInfo("After rbusMethod_SendAsyncResponse\n"); ParodusInfo("err is %d RBUS_ERROR_SUCCESS %d\n", err, RBUS_ERROR_SUCCESS); if(err != RBUS_ERROR_SUCCESS) @@ -420,7 +434,7 @@ void createOutParamsandSendAck(wrp_msg_t *msg, rbusMethodAsyncHandle_t asyncHand ParodusInfo("rbusMethod_SendAsyncResponse success:%d\n", err); } ParodusInfo("Release outParams\n"); - rbusObject_Release(outParam); + rbusObject_Release(outParams); ParodusInfo("outParams released\n"); } else @@ -611,6 +625,8 @@ static rbusError_t sendDataHandler(rbusHandle_t handle, char const* methodName, inStatus = checkInputParameters(inParams); if(inStatus) { + ParodusInfo("InParam Retain\n"); + rbusObject_Retain(inParams); parseRbusInparamsToWrp(inParams, &wrpMsg); //generate transaction id to create outParams and send ack transaction_uuid = generate_transaction_uuid(); From a291b047b660aadb6c0f12099482719e305729fd Mon Sep 17 00:00:00 2001 From: Guru Chandru Date: Mon, 28 Mar 2022 12:27:38 +0530 Subject: [PATCH 031/137] Enqueue option to add High Qos Events after Failure --- src/nopoll_helpers.c | 6 ++- src/nopoll_helpers.h | 2 +- src/upstream.c | 9 ++++- src/upstream.h | 2 +- src/xmidtsend_rbus.c | 96 +++++++++++++++++++++++++++++++++++++++++++- src/xmidtsend_rbus.h | 8 +++- 6 files changed, 115 insertions(+), 8 deletions(-) diff --git a/src/nopoll_helpers.c b/src/nopoll_helpers.c index 70ebc0f..2dc935e 100644 --- a/src/nopoll_helpers.c +++ b/src/nopoll_helpers.c @@ -60,14 +60,14 @@ static int cloud_status_is_online (void) /** To send upstream msgs to server ***/ -void sendMessage(noPollConn *conn, void *msg, size_t len) +int sendMessage(noPollConn *conn, void *msg, size_t len) { int bytesWritten = 0; if (!cloud_status_is_online ()) { ParodusError("Failed to send msg upstream as connection is not OK\n"); OnboardLog("Failed to send msg upstream as connection is not OK\n"); - return; + return 1; } ParodusInfo("sendMessage length %zu\n", len); @@ -77,7 +77,9 @@ void sendMessage(noPollConn *conn, void *msg, size_t len) if (bytesWritten != (int) len) { ParodusError("Failed to send bytes %zu, bytes written were=%d (errno=%d, %s)..\n", len, bytesWritten, errno, strerror(errno)); + return 1; } + return 0; } int sendResponse(noPollConn * conn, void * buffer, size_t length) diff --git a/src/nopoll_helpers.h b/src/nopoll_helpers.h index a17ddba..d6c8516 100644 --- a/src/nopoll_helpers.h +++ b/src/nopoll_helpers.h @@ -41,7 +41,7 @@ extern "C" { */ int sendResponse(noPollConn * conn,void *str, size_t bufferSize); void setMessageHandlers(); -void sendMessage(noPollConn *conn, void *msg, size_t len); +int sendMessage(noPollConn *conn, void *msg, size_t len); /** * @brief __report_log Nopoll log handler diff --git a/src/upstream.c b/src/upstream.c index 0f13df0..8e79a13 100644 --- a/src/upstream.c +++ b/src/upstream.c @@ -596,11 +596,12 @@ void getServiceNameAndSendResponse(wrp_msg_t *msg, void **msg_bytes, size_t msg_ } } -void sendUpstreamMsgToServer(void **resp_bytes, size_t resp_size) +int sendUpstreamMsgToServer(void **resp_bytes, size_t resp_size) { void *appendData; size_t encodedSize; bool close_retry = false; + int sendRetStatus = 1; //appending response with metadata if(metaPackSize > 0) { @@ -615,12 +616,13 @@ void sendUpstreamMsgToServer(void **resp_bytes, size_t resp_size) //TODO: Upstream and downstream messages in queue should be handled and queue should be empty before parodus forcefully disconnect from cloud. if(!close_retry || (get_parodus_cfg()->cloud_disconnect !=NULL)) { - sendMessage(get_global_conn(),appendData, encodedSize); + sendRetStatus = sendMessage(get_global_conn(),appendData, encodedSize); } else { ParodusInfo("close_retry is %d, unable to send response as connection retry is in progress\n", close_retry); OnboardLog("close_retry is %d, unable to send response as connection retry is in progress\n", close_retry); + sendRetStatus = 1; } free(appendData); appendData =NULL; @@ -628,6 +630,9 @@ void sendUpstreamMsgToServer(void **resp_bytes, size_t resp_size) else { ParodusError("Failed to send upstream as metadata packing is not successful\n"); + sendRetStatus = 1; } + ParodusInfo("Printing sendRetStatus in send %d\n", sendRetStatus); + return sendRetStatus; } diff --git a/src/upstream.h b/src/upstream.h index df245c3..2adb5a4 100644 --- a/src/upstream.h +++ b/src/upstream.h @@ -49,7 +49,7 @@ void *handle_upstream(); void *processUpstreamMessage(); void registerRBUSlistener(); int getDeviceId(char **device_id, size_t *device_id_len); -void sendUpstreamMsgToServer(void **resp_bytes, size_t resp_size); +int sendUpstreamMsgToServer(void **resp_bytes, size_t resp_size); void getServiceNameAndSendResponse(wrp_msg_t *msg, void **msg_bytes, size_t msg_size); void createUpstreamRetrieveMsg(wrp_msg_t *message, wrp_msg_t **retrieve_msg); void set_global_UpStreamMsgQ(UpStreamMsg * UpStreamQ); diff --git a/src/xmidtsend_rbus.c b/src/xmidtsend_rbus.c index 788e642..b8ff5fd 100644 --- a/src/xmidtsend_rbus.c +++ b/src/xmidtsend_rbus.c @@ -27,6 +27,7 @@ #include "ParodusInternal.h" #include "partners_check.h" #include "xmidtsend_rbus.h" +#include "config.h" static pthread_t processThreadId = 0; static int XmidtQsize = 0; @@ -37,6 +38,8 @@ pthread_mutex_t xmidt_mut=PTHREAD_MUTEX_INITIALIZER; pthread_cond_t xmidt_con=PTHREAD_COND_INITIALIZER; +static int cloud_status_check (void); + XmidtMsg * get_global_XmidtMsgQ(void) { return XmidtMsgQ; @@ -57,6 +60,20 @@ pthread_mutex_t *get_global_xmidt_mut(void) return &xmidt_mut; } +bool highQosValueCheck(int qos) +{ + if(qos > 24) + { + ParodusInfo("The qos value is high\n"); + return true; + } + else + { + ParodusInfo("The qos value is low\n"); + } + + return false; +} /* * @brief To handle xmidt rbus messages received from various components. */ @@ -64,6 +81,15 @@ void addToXmidtUpstreamQ(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle) { XmidtMsg *message; + ParodusInfo("XmidtQsize is %d\n" , XmidtQsize); + if(XmidtQsize == MAX_QUEUE_SIZE) + { + char * errorMsg = strdup("Max Queue Size Exceeded"); + ParodusInfo("Queue Size Exceeded\n"); + createOutParamsandSendAck(msg, asyncHandle, errorMsg , QUEUE_SIZE_EXCEEDED); + free(errorMsg); + } + ParodusInfo ("Add Xmidt Upstream message to queue\n"); message = (XmidtMsg *)malloc(sizeof(XmidtMsg)); @@ -105,6 +131,16 @@ void addToXmidtUpstreamQ(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle) return; } +//To remove an event from Queue +void xmidtQDequeue() +{ + if(XmidtMsgQ != NULL) + { + wrp_free_struct(XmidtMsgQ->msg); + XmidtMsgQ = XmidtMsgQ->next; + XmidtQsize -= 1; + } +} //Xmidt consumer thread to process the rbus events. void processXmidtData() @@ -134,7 +170,7 @@ void* processXmidtUpstreamMsg() if(XmidtMsgQ != NULL) { XmidtMsg *Data = XmidtMsgQ; - XmidtMsgQ = XmidtMsgQ->next; + pthread_mutex_unlock (&xmidt_mut); ParodusInfo("mutex unlock in xmidt consumer thread\n"); ret = processData(Data->msg, Data->asyncHandle); @@ -197,6 +233,7 @@ int processData(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle) free(errorMsg); errorMsg = NULL; } + xmidtQDequeue(); ParodusInfo("ack done\n"); } return 0; @@ -271,6 +308,9 @@ void sendXmidtEventToServer(wrp_msg_t * msg) char sourceStr[64] = {'\0'}; char *device_id = NULL; size_t device_id_len = 0; + int sendRetStatus = 1; + char *errorMsg = NULL; + int qos = 0; ParodusInfo("In sendXmidtEventToServer\n"); notif_wrp_msg = (wrp_msg_t *)malloc(sizeof(wrp_msg_t)); @@ -334,6 +374,59 @@ void sendXmidtEventToServer(wrp_msg_t * msg) free(msg_bytes); msg_bytes = NULL; ParodusInfo("sendXmidtEventToServer done\n"); + + ParodusInfo("Printing interface value %d\n", get_interface_down_event()?1:0); + if(sendRetStatus) //If SendMessage is failed condition + { + ParodusInfo("sendXmidtEventToServer is Failed\n"); + if(highQosValueCheck(qos)) + { + errorMsg = strdup("sendXmidtEventToServer Failed , Enqueue event since QOS is High"); + ParodusInfo("The event is having high qos retry again \n"); + //createOutParamsandSendAck(XmidtMsgQ->msg, XmidtMsgQ->asyncHandle, errorMsg, CLIENT_DISCONNECT); + waitTillConnectionIsUp(); //Loop inside until connection is up + } + else + { + errorMsg = strdup("sendXmidtEventToServer Failed , Dequeue event since QOS is Low"); + ParodusInfo("The event is having low qos proceed to dequeue\n"); + //createOutParamsandSendAck(XmidtMsgQ->msg, XmidtMsgQ->asyncHandle, errorMsg, ENQUEUE_FAILURE); + pthread_mutex_lock (&xmidt_mut); + xmidtQDequeue(); + pthread_mutex_unlock (&xmidt_mut); + } + } + else + { + errorMsg = strdup("sendXmidtEventToServer is Success"); + ParodusInfo("sendXmidtEventToServer done\n"); + //createOutParamsandSendAck(XmidtMsgQ->msg, XmidtMsgQ->asyncHandle, errorMsg, DELIVERED_SUCCESS); + printf("%s\n", errorMsg); + pthread_mutex_lock (&xmidt_mut); + xmidtQDequeue(); + pthread_mutex_unlock (&xmidt_mut); + } + } +} + +static int cloud_status_check (void) +{ + const char *status = get_parodus_cfg()->cloud_status; + if (NULL == status) + return false; + return (strcmp (status, CLOUD_STATUS_ONLINE) == 0); +} + +void waitTillConnectionIsUp() +{ + while(FOREVER()) + { + + if(cloud_status_check()) + { + break; + } + } } @@ -647,6 +740,7 @@ static rbusError_t sendDataHandler(rbusHandle_t handle, char const* methodName, ParodusError("Method %s received is not supported\n", methodName); return RBUS_ERROR_BUS_ERROR; } + return RBUS_ERROR_SUCCESS; } diff --git a/src/xmidtsend_rbus.h b/src/xmidtsend_rbus.h index 94b783b..e2fffcb 100644 --- a/src/xmidtsend_rbus.h +++ b/src/xmidtsend_rbus.h @@ -30,6 +30,7 @@ extern "C" { #endif #define XMIDT_SEND_METHOD "Device.X_RDK_Xmidt.SendData" +#define MAX_QUEUE_SIZE 10 /*----------------------------------------------------------------------------*/ /* Data Structures */ /*----------------------------------------------------------------------------*/ @@ -42,12 +43,14 @@ typedef struct XmidtMsg__ typedef enum { - INVALID_MSG_TYPE = 1, + DELIVERED_SUCCESS = 0, + INVALID_MSG_TYPE, MISSING_SOURCE, MISSING_DEST, MISSING_CONTENT_TYPE, MISSING_PAYLOAD, MISSING_PAYLOADLEN, + QUEUE_SIZE_EXCEEDED, ENQUEUE_FAILURE = 100, CLIENT_DISCONNECT = 101 } XMIDT_STATUS; @@ -66,6 +69,9 @@ char* generate_transaction_uuid(); void parseRbusInparamsToWrp(rbusObject_t inParams, wrp_msg_t **eventMsg); void createOutParamsandSendAck(wrp_msg_t *msg, rbusMethodAsyncHandle_t asyncHandle, char *errorMsg, int statuscode); int validateXmidtData(wrp_msg_t * eventMsg, char **errorMsg, int *statusCode); +void xmidtQDequeue(); +bool highQosValueCheck(int qos); +void waitTillConnectionIsUp(); #ifdef __cplusplus } #endif From 79eb7ba6ef785fe91176fededa6cd59040da972f Mon Sep 17 00:00:00 2001 From: Sadhyama Vengilat Date: Mon, 28 Mar 2022 12:10:19 +0530 Subject: [PATCH 032/137] To fix send ack crash due to OutParams NULL issue --- src/xmidtsend_rbus.c | 69 ++++++++++++++++++++++++++------------------ 1 file changed, 41 insertions(+), 28 deletions(-) diff --git a/src/xmidtsend_rbus.c b/src/xmidtsend_rbus.c index 71608fe..3446bfb 100644 --- a/src/xmidtsend_rbus.c +++ b/src/xmidtsend_rbus.c @@ -339,7 +339,7 @@ void sendXmidtEventToServer(wrp_msg_t * msg) void createOutParamsandSendAck(wrp_msg_t *msg, rbusMethodAsyncHandle_t asyncHandle, char *errorMsg, int statuscode) { - rbusObject_t outParam; + rbusObject_t outParams; rbusError_t err; rbusValue_t value; char qosstring[20] = ""; @@ -351,64 +351,75 @@ void createOutParamsandSendAck(wrp_msg_t *msg, rbusMethodAsyncHandle_t asyncHand } ParodusInfo("createOutParams\n"); - rbusObject_Init(&outParam, NULL); rbusValue_Init(&value); rbusValue_SetString(value, "event"); - rbusObject_SetValue(outParam, "msg_type", value); + rbusObject_Init(&outParams, NULL); + rbusObject_SetValue(outParams, "msg_type", value); rbusValue_Release(value); - rbusValue_Init(&value); - rbusValue_SetString(value, msg->u.event.source); - rbusObject_SetValue(outParam, "source", value); - rbusValue_Release(value); + if(msg->u.event.source !=NULL) + { + ParodusInfo("msg->u.event.source is %s\n", msg->u.event.source); + rbusValue_Init(&value); + rbusValue_SetString(value, msg->u.event.source); + rbusObject_SetValue(outParams, "source", value); + rbusValue_Release(value); + } - rbusValue_Init(&value); - rbusValue_SetString(value, msg->u.event.dest); - rbusObject_SetValue(outParam, "dest", value); - rbusValue_Release(value); - - rbusValue_Init(&value); - rbusValue_SetString(value, msg->u.event.content_type); - rbusObject_SetValue(outParam, "content_type", value); - rbusValue_Release(value); + if(msg->u.event.dest !=NULL) + { + rbusValue_Init(&value); + rbusValue_SetString(value, msg->u.event.dest); + rbusObject_SetValue(outParams, "dest", value); + rbusValue_Release(value); + } + if(msg->u.event.content_type !=NULL) + { + rbusValue_Init(&value); + rbusValue_SetString(value, msg->u.event.content_type); + rbusObject_SetValue(outParams, "content_type", value); + rbusValue_Release(value); + } rbusValue_Init(&value); ParodusInfo("msg->u.event.qos int %d\n", msg->u.event.qos); snprintf(qosstring, sizeof(qosstring), "%d", msg->u.event.qos); ParodusInfo("qosstring is %s\n", qosstring); rbusValue_SetString(value, qosstring); - rbusObject_SetValue(outParam, "qos", value); + rbusObject_SetValue(outParams, "qos", value); rbusValue_Release(value); ParodusInfo("statuscode %d errorMsg %s\n", statuscode, errorMsg); rbusValue_Init(&value); rbusValue_SetInt32(value, statuscode); - rbusObject_SetValue(outParam, "status", value); + rbusObject_SetValue(outParams, "status", value); rbusValue_Release(value); - rbusValue_Init(&value); - rbusValue_SetString(value, errorMsg); - rbusObject_SetValue(outParam, "error_message", value); - rbusValue_Release(value); + if(errorMsg !=NULL) + { + rbusValue_Init(&value); + rbusValue_SetString(value, errorMsg); + rbusObject_SetValue(outParams, "error_message", value); + rbusValue_Release(value); + } rbusValue_Init(&value); rbusValue_SetString(value, "transaction_uuid"); //change this to actual transid - rbusObject_SetValue(outParam, "transaction_uuid", value); + rbusObject_SetValue(outParams, "transaction_uuid", value); rbusValue_Release(value); - ParodusInfo("createOutParams done\n"); - if(outParam !=NULL) + if(outParams !=NULL) { - ParodusInfo("B4 rbusMethod_SendAsyncResponse\n"); if(asyncHandle == NULL) { ParodusInfo("asyncHandle is NULL\n"); return; } - err = rbusMethod_SendAsyncResponse(asyncHandle, RBUS_ERROR_INVALID_INPUT, outParam); + ParodusInfo("B4 rbusMethod_SendAsyncResponse ..\n"); + err = rbusMethod_SendAsyncResponse(asyncHandle, RBUS_ERROR_INVALID_RESPONSE_FROM_DESTINATION, outParams); ParodusInfo("After rbusMethod_SendAsyncResponse\n"); ParodusInfo("err is %d RBUS_ERROR_SUCCESS %d\n", err, RBUS_ERROR_SUCCESS); if(err != RBUS_ERROR_SUCCESS) @@ -420,7 +431,7 @@ void createOutParamsandSendAck(wrp_msg_t *msg, rbusMethodAsyncHandle_t asyncHand ParodusInfo("rbusMethod_SendAsyncResponse success:%d\n", err); } ParodusInfo("Release outParams\n"); - rbusObject_Release(outParam); + rbusObject_Release(outParams); ParodusInfo("outParams released\n"); } else @@ -611,6 +622,8 @@ static rbusError_t sendDataHandler(rbusHandle_t handle, char const* methodName, inStatus = checkInputParameters(inParams); if(inStatus) { + ParodusInfo("InParam Retain\n"); + rbusObject_Retain(inParams); parseRbusInparamsToWrp(inParams, &wrpMsg); //generate transaction id to create outParams and send ack transaction_uuid = generate_transaction_uuid(); From 54f9983effc68a172286fa0baad5322a7f911a4c Mon Sep 17 00:00:00 2001 From: Guru Chandru Date: Mon, 28 Mar 2022 15:39:03 +0530 Subject: [PATCH 033/137] High Qos Event ACK and Enqueue changes --- src/xmidtsend_rbus.c | 30 ++++++++++++++++++------------ 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/src/xmidtsend_rbus.c b/src/xmidtsend_rbus.c index e32b012..ef4f5d8 100644 --- a/src/xmidtsend_rbus.c +++ b/src/xmidtsend_rbus.c @@ -134,12 +134,17 @@ void addToXmidtUpstreamQ(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle) //To remove an event from Queue void xmidtQDequeue() { + XmidtMsg *temp = NULL; + pthread_mutex_lock (&xmidt_mut); if(XmidtMsgQ != NULL) { - wrp_free_struct(XmidtMsgQ->msg); + temp = XmidtMsgQ; XmidtMsgQ = XmidtMsgQ->next; + wrp_free_struct(temp->msg); XmidtQsize -= 1; + free(temp); } + pthread_mutex_unlock (&xmidt_mut); } //Xmidt consumer thread to process the rbus events. @@ -358,6 +363,7 @@ void sendXmidtEventToServer(wrp_msg_t * msg) if(msg->u.event.qos != 0) { notif_wrp_msg->u.event.qos = msg->u.event.qos; + qos = notif_wrp_msg->u.event.qos; ParodusInfo("Notification qos: %d\n",notif_wrp_msg->u.event.qos); } ParodusInfo("Encode xmidt wrp msg\n"); @@ -367,7 +373,7 @@ void sendXmidtEventToServer(wrp_msg_t * msg) if(msg_len > 0) { ParodusInfo("sendUpstreamMsgToServer\n"); - sendUpstreamMsgToServer(&msg_bytes, msg_len); + sendRetStatus = sendUpstreamMsgToServer(&msg_bytes, msg_len); } wrp_free_struct(notif_wrp_msg); ParodusInfo("After wrp_free_struct\n"); @@ -375,7 +381,6 @@ void sendXmidtEventToServer(wrp_msg_t * msg) msg_bytes = NULL; ParodusInfo("sendXmidtEventToServer done\n"); - ParodusInfo("Printing interface value %d\n", get_interface_down_event()?1:0); if(sendRetStatus) //If SendMessage is failed condition { ParodusInfo("sendXmidtEventToServer is Failed\n"); @@ -383,35 +388,34 @@ void sendXmidtEventToServer(wrp_msg_t * msg) { errorMsg = strdup("sendXmidtEventToServer Failed , Enqueue event since QOS is High"); ParodusInfo("The event is having high qos retry again \n"); - //createOutParamsandSendAck(XmidtMsgQ->msg, XmidtMsgQ->asyncHandle, errorMsg, CLIENT_DISCONNECT); + createOutParamsandSendAck(XmidtMsgQ->msg, XmidtMsgQ->asyncHandle, errorMsg, CLIENT_DISCONNECT); waitTillConnectionIsUp(); //Loop inside until connection is up } else { errorMsg = strdup("sendXmidtEventToServer Failed , Dequeue event since QOS is Low"); ParodusInfo("The event is having low qos proceed to dequeue\n"); - //createOutParamsandSendAck(XmidtMsgQ->msg, XmidtMsgQ->asyncHandle, errorMsg, ENQUEUE_FAILURE); - pthread_mutex_lock (&xmidt_mut); + createOutParamsandSendAck(XmidtMsgQ->msg, XmidtMsgQ->asyncHandle, errorMsg, ENQUEUE_FAILURE); xmidtQDequeue(); - pthread_mutex_unlock (&xmidt_mut); } } else { errorMsg = strdup("sendXmidtEventToServer is Success"); ParodusInfo("sendXmidtEventToServer done\n"); - //createOutParamsandSendAck(XmidtMsgQ->msg, XmidtMsgQ->asyncHandle, errorMsg, DELIVERED_SUCCESS); - printf("%s\n", errorMsg); - pthread_mutex_lock (&xmidt_mut); + createOutParamsandSendAck(XmidtMsgQ->msg, XmidtMsgQ->asyncHandle, errorMsg, DELIVERED_SUCCESS); xmidtQDequeue(); - pthread_mutex_unlock (&xmidt_mut); } } + if(errorMsg != NULL) + { + free(errorMsg); + } } static int cloud_status_check (void) { - const char *status = get_parodus_cfg()->cloud_status; + const char *status = get_cloud_status(); if (NULL == status) return false; return (strcmp (status, CLOUD_STATUS_ONLINE) == 0); @@ -462,6 +466,7 @@ void createOutParamsandSendAck(wrp_msg_t *msg, rbusMethodAsyncHandle_t asyncHand if(msg->u.event.dest !=NULL) { + ParodusInfo("Inside dest\n"); rbusValue_Init(&value); rbusValue_SetString(value, msg->u.event.dest); rbusObject_SetValue(outParams, "dest", value); @@ -470,6 +475,7 @@ void createOutParamsandSendAck(wrp_msg_t *msg, rbusMethodAsyncHandle_t asyncHand if(msg->u.event.content_type !=NULL) { + ParodusInfo("Inside content_type\n"); rbusValue_Init(&value); rbusValue_SetString(value, msg->u.event.content_type); rbusObject_SetValue(outParams, "content_type", value); From 2218637f2c6e5efeaee520a1a3ec689a848be5ee Mon Sep 17 00:00:00 2001 From: Guru Chandru Date: Mon, 28 Mar 2022 21:41:42 +0530 Subject: [PATCH 034/137] Added ACK and Cond wait signal for connection not OK --- src/ParodusInternal.h | 2 +- src/config.c | 4 +++ src/xmidtsend_rbus.c | 75 ++++++++++++++++++++++--------------------- src/xmidtsend_rbus.h | 2 +- 4 files changed, 44 insertions(+), 39 deletions(-) diff --git a/src/ParodusInternal.h b/src/ParodusInternal.h index 9dcc00d..988e54c 100644 --- a/src/ParodusInternal.h +++ b/src/ParodusInternal.h @@ -182,7 +182,7 @@ pthread_cond_t *get_interface_down_con(); pthread_mutex_t *get_interface_down_mut(); - +pthread_cond_t *get_global_xmidt_con(void); #ifdef __cplusplus } #endif diff --git a/src/config.c b/src/config.c index d9cc8a8..ca5700b 100644 --- a/src/config.c +++ b/src/config.c @@ -66,6 +66,10 @@ void set_cloud_status(char *status) { pthread_mutex_lock(&config_mut); get_parodus_cfg()->cloud_status = strdup(status); + if(strcmp (status, CLOUD_STATUS_ONLINE) == 0) + { + pthread_cond_signal(get_global_xmidt_con()); + } pthread_mutex_unlock(&config_mut); } diff --git a/src/xmidtsend_rbus.c b/src/xmidtsend_rbus.c index ef4f5d8..70dccac 100644 --- a/src/xmidtsend_rbus.c +++ b/src/xmidtsend_rbus.c @@ -38,8 +38,6 @@ pthread_mutex_t xmidt_mut=PTHREAD_MUTEX_INITIALIZER; pthread_cond_t xmidt_con=PTHREAD_COND_INITIALIZER; -static int cloud_status_check (void); - XmidtMsg * get_global_XmidtMsgQ(void) { return XmidtMsgQ; @@ -88,6 +86,7 @@ void addToXmidtUpstreamQ(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle) ParodusInfo("Queue Size Exceeded\n"); createOutParamsandSendAck(msg, asyncHandle, errorMsg , QUEUE_SIZE_EXCEEDED); free(errorMsg); + return; } ParodusInfo ("Add Xmidt Upstream message to queue\n"); @@ -134,6 +133,7 @@ void addToXmidtUpstreamQ(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle) //To remove an event from Queue void xmidtQDequeue() { + ParodusInfo("Inside dequeue\n"); XmidtMsg *temp = NULL; pthread_mutex_lock (&xmidt_mut); if(XmidtMsgQ != NULL) @@ -170,8 +170,9 @@ void* processXmidtUpstreamMsg() while(FOREVER()) { + ParodusInfo("xmidt mutex b4 lock\n"); pthread_mutex_lock (&xmidt_mut); - ParodusPrint("mutex lock in xmidt consumer thread\n"); + ParodusInfo("mutex lock in xmidt consumer thread\n"); if(XmidtMsgQ != NULL) { XmidtMsg *Data = XmidtMsgQ; @@ -224,7 +225,7 @@ int processData(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle) if(rv) { ParodusInfo("validation successful, send event to server\n"); - sendXmidtEventToServer(xmidtMsg); + sendXmidtEventToServer(xmidtMsg, asyncHandle); return 1; } else @@ -304,7 +305,7 @@ int validateXmidtData(wrp_msg_t * eventMsg, char **errorMsg, int *statusCode) return 1; } -void sendXmidtEventToServer(wrp_msg_t * msg) +void sendXmidtEventToServer(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle) { wrp_msg_t *notif_wrp_msg = NULL; ssize_t msg_len; @@ -375,65 +376,65 @@ void sendXmidtEventToServer(wrp_msg_t * msg) ParodusInfo("sendUpstreamMsgToServer\n"); sendRetStatus = sendUpstreamMsgToServer(&msg_bytes, msg_len); } - wrp_free_struct(notif_wrp_msg); - ParodusInfo("After wrp_free_struct\n"); - free(msg_bytes); - msg_bytes = NULL; - ParodusInfo("sendXmidtEventToServer done\n"); + else + { + ParodusInfo("The msg_len is zero\n"); + xmidtQDequeue(); + wrp_free_struct(notif_wrp_msg); + ParodusInfo("After wrp_free_struct\n"); + free(msg_bytes); + msg_bytes = NULL; + return; + } - if(sendRetStatus) //If SendMessage is failed condition + while(sendRetStatus) //If SendMessage is failed condition { ParodusInfo("sendXmidtEventToServer is Failed\n"); if(highQosValueCheck(qos)) { errorMsg = strdup("sendXmidtEventToServer Failed , Enqueue event since QOS is High"); ParodusInfo("The event is having high qos retry again \n"); - createOutParamsandSendAck(XmidtMsgQ->msg, XmidtMsgQ->asyncHandle, errorMsg, CLIENT_DISCONNECT); - waitTillConnectionIsUp(); //Loop inside until connection is up + createOutParamsandSendAck(msg, asyncHandle, errorMsg, CLIENT_DISCONNECT); + ParodusInfo("The value of pointer xmidt->msg is %p\n", XmidtMsgQ->msg); + //waitTillConnectionIsUp(); //Loop inside until connection is up + ParodusInfo("Wait till connection is Up\n"); + + pthread_cond_wait(&xmidt_con, &xmidt_mut); + pthread_mutex_unlock(&xmidt_mut); + ParodusInfo("Received signal proceed to retry\n"); } else { errorMsg = strdup("sendXmidtEventToServer Failed , Dequeue event since QOS is Low"); ParodusInfo("The event is having low qos proceed to dequeue\n"); - createOutParamsandSendAck(XmidtMsgQ->msg, XmidtMsgQ->asyncHandle, errorMsg, ENQUEUE_FAILURE); + createOutParamsandSendAck(msg, asyncHandle, errorMsg, ENQUEUE_FAILURE); xmidtQDequeue(); + break; } + sendRetStatus = sendUpstreamMsgToServer(&msg_bytes, msg_len); } - else + + if(sendRetStatus == 0) { errorMsg = strdup("sendXmidtEventToServer is Success"); ParodusInfo("sendXmidtEventToServer done\n"); - createOutParamsandSendAck(XmidtMsgQ->msg, XmidtMsgQ->asyncHandle, errorMsg, DELIVERED_SUCCESS); + createOutParamsandSendAck(msg, asyncHandle, errorMsg, DELIVERED_SUCCESS); xmidtQDequeue(); } + + wrp_free_struct(notif_wrp_msg); + ParodusInfo("After wrp_free_struct\n"); + free(msg_bytes); + msg_bytes = NULL; + ParodusInfo("sendXmidtEventToServer done\n"); } + if(errorMsg != NULL) { free(errorMsg); } } -static int cloud_status_check (void) -{ - const char *status = get_cloud_status(); - if (NULL == status) - return false; - return (strcmp (status, CLOUD_STATUS_ONLINE) == 0); -} - -void waitTillConnectionIsUp() -{ - while(FOREVER()) - { - - if(cloud_status_check()) - { - break; - } - - } -} - void createOutParamsandSendAck(wrp_msg_t *msg, rbusMethodAsyncHandle_t asyncHandle, char *errorMsg, int statuscode) { rbusObject_t outParams; diff --git a/src/xmidtsend_rbus.h b/src/xmidtsend_rbus.h index e2fffcb..56b985f 100644 --- a/src/xmidtsend_rbus.h +++ b/src/xmidtsend_rbus.h @@ -63,7 +63,7 @@ void addToXmidtUpstreamQ(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle); void* processXmidtUpstreamMsg(); void processXmidtData(); int processData(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle); -void sendXmidtEventToServer(wrp_msg_t * msg); +void sendXmidtEventToServer(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle); int checkInputParameters(rbusObject_t inParams); char* generate_transaction_uuid(); void parseRbusInparamsToWrp(rbusObject_t inParams, wrp_msg_t **eventMsg); From 23c18da03e33209ea66cc9d9a20c48a886d9d1ea Mon Sep 17 00:00:00 2001 From: Guru Chandru Date: Tue, 29 Mar 2022 13:30:01 +0530 Subject: [PATCH 035/137] Fix for Crash due to frequent ACK response trigger --- src/xmidtsend_rbus.c | 26 +++++++++++--------------- 1 file changed, 11 insertions(+), 15 deletions(-) diff --git a/src/xmidtsend_rbus.c b/src/xmidtsend_rbus.c index 70dccac..c46f138 100644 --- a/src/xmidtsend_rbus.c +++ b/src/xmidtsend_rbus.c @@ -85,7 +85,6 @@ void addToXmidtUpstreamQ(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle) char * errorMsg = strdup("Max Queue Size Exceeded"); ParodusInfo("Queue Size Exceeded\n"); createOutParamsandSendAck(msg, asyncHandle, errorMsg , QUEUE_SIZE_EXCEEDED); - free(errorMsg); return; } @@ -179,6 +178,7 @@ void* processXmidtUpstreamMsg() pthread_mutex_unlock (&xmidt_mut); ParodusInfo("mutex unlock in xmidt consumer thread\n"); + ParodusInfo("Asynchandle pointer %p\n"); ret = processData(Data->msg, Data->asyncHandle); if(ret) { @@ -233,12 +233,6 @@ int processData(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle) ParodusError("validation failed, send failure ack\n"); ParodusInfo("errorMsg %s\n", errorMsg); createOutParamsandSendAck(xmidtMsg, asyncHandle, errorMsg , statuscode); - ParodusInfo("Free errorMsg\n"); - if(errorMsg !=NULL) - { - free(errorMsg); - errorMsg = NULL; - } xmidtQDequeue(); ParodusInfo("ack done\n"); } @@ -326,6 +320,7 @@ void sendXmidtEventToServer(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle notif_wrp_msg->msg_type = WRP_MSG_TYPE__EVENT; ParodusInfo("msg->u.event.source: %s\n",msg->u.event.source); + if(msg->u.event.source !=NULL) { //To get device_id in the format "mac:112233445xxx" @@ -396,7 +391,6 @@ void sendXmidtEventToServer(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle ParodusInfo("The event is having high qos retry again \n"); createOutParamsandSendAck(msg, asyncHandle, errorMsg, CLIENT_DISCONNECT); ParodusInfo("The value of pointer xmidt->msg is %p\n", XmidtMsgQ->msg); - //waitTillConnectionIsUp(); //Loop inside until connection is up ParodusInfo("Wait till connection is Up\n"); pthread_cond_wait(&xmidt_con, &xmidt_mut); @@ -412,6 +406,7 @@ void sendXmidtEventToServer(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle break; } sendRetStatus = sendUpstreamMsgToServer(&msg_bytes, msg_len); + ParodusInfo("After sendRetStatus async pointer is %p for qos %d\n", asyncHandle, qos); } if(sendRetStatus == 0) @@ -429,10 +424,6 @@ void sendXmidtEventToServer(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle ParodusInfo("sendXmidtEventToServer done\n"); } - if(errorMsg != NULL) - { - free(errorMsg); - } } void createOutParamsandSendAck(wrp_msg_t *msg, rbusMethodAsyncHandle_t asyncHandle, char *errorMsg, int statuscode) @@ -442,6 +433,9 @@ void createOutParamsandSendAck(wrp_msg_t *msg, rbusMethodAsyncHandle_t asyncHand rbusValue_t value; char qosstring[20] = ""; + rbusMethodAsyncHandle_t tempAsyncHandle = malloc(sizeof(struct rbusMethodAsyncHandle_t*)); + memcpy(tempAsyncHandle, asyncHandle, sizeof(rbusMethodAsyncHandle_t*)); + if(msg == NULL) { ParodusError("msg is NULL\n"); @@ -503,6 +497,7 @@ void createOutParamsandSendAck(wrp_msg_t *msg, rbusMethodAsyncHandle_t asyncHand rbusValue_SetString(value, errorMsg); rbusObject_SetValue(outParams, "error_message", value); rbusValue_Release(value); + free(errorMsg); } rbusValue_Init(&value); @@ -513,13 +508,14 @@ void createOutParamsandSendAck(wrp_msg_t *msg, rbusMethodAsyncHandle_t asyncHand if(outParams !=NULL) { - if(asyncHandle == NULL) + if(tempAsyncHandle == NULL) { - ParodusInfo("asyncHandle is NULL\n"); + ParodusInfo("tempAsyncHandle is NULL\n"); return; } ParodusInfo("B4 rbusMethod_SendAsyncResponse ..\n"); - err = rbusMethod_SendAsyncResponse(asyncHandle, RBUS_ERROR_INVALID_RESPONSE_FROM_DESTINATION, outParams); + ParodusInfo("b4 rbusMethod_SendAsyncResponse async pointer is %p for qos %s\n", tempAsyncHandle, qosstring); + err = rbusMethod_SendAsyncResponse(tempAsyncHandle, RBUS_ERROR_INVALID_RESPONSE_FROM_DESTINATION, outParams); ParodusInfo("After rbusMethod_SendAsyncResponse\n"); ParodusInfo("err is %d RBUS_ERROR_SUCCESS %d\n", err, RBUS_ERROR_SUCCESS); if(err != RBUS_ERROR_SUCCESS) From 7d2e9733d0dfaafe508b12aada60ec0f0507b4ae Mon Sep 17 00:00:00 2001 From: Guru Chandru Date: Tue, 29 Mar 2022 14:44:45 +0530 Subject: [PATCH 036/137] Debug logs --- src/xmidtsend_rbus.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/xmidtsend_rbus.c b/src/xmidtsend_rbus.c index c46f138..d09207e 100644 --- a/src/xmidtsend_rbus.c +++ b/src/xmidtsend_rbus.c @@ -141,9 +141,13 @@ void xmidtQDequeue() XmidtMsgQ = XmidtMsgQ->next; wrp_free_struct(temp->msg); XmidtQsize -= 1; + ParodusInfo("B4 free temp\n"); free(temp); + ParodusInfo("After free temp\n"); } + ParodusInfo("B4 unlock\n"); pthread_mutex_unlock (&xmidt_mut); + ParodusInfo("After unlock\n"); } //Xmidt consumer thread to process the rbus events. @@ -417,6 +421,7 @@ void sendXmidtEventToServer(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle xmidtQDequeue(); } + ParodusInfo("B4 wrp_free_struct\n"); wrp_free_struct(notif_wrp_msg); ParodusInfo("After wrp_free_struct\n"); free(msg_bytes); From e643f9e2fc395adb5fc94936c0f4f419f6872daa Mon Sep 17 00:00:00 2001 From: Thanusha D Date: Mon, 28 Mar 2022 13:38:27 +0530 Subject: [PATCH 037/137] Support Wan failover/restore events for LTE backup --- src/config.c | 4 ++-- src/upstream.c | 4 +--- src/upstream_rbus.c | 19 +++++++------------ 3 files changed, 10 insertions(+), 17 deletions(-) diff --git a/src/config.c b/src/config.c index 37bca0f..23e9765 100644 --- a/src/config.c +++ b/src/config.c @@ -864,14 +864,14 @@ void setWebpaInterface(char *value) char *getWebpaInterface(void) { #ifdef WAN_FAILOVER_SUPPORTED - ParodusInfo("WAN_FAILOVER_SUPPORTED mode \n"); + ParodusPrint("WAN_FAILOVER_SUPPORTED mode \n"); pthread_mutex_lock (&config_mut); parStrncpy(webpa_interface, get_parodus_cfg()->webpa_interface_used, sizeof(webpa_interface)); pthread_mutex_unlock (&config_mut); #else parStrncpy(webpa_interface, get_parodus_cfg()->webpa_interface_used, sizeof(webpa_interface)); #endif - ParodusInfo("webpa_interface:%s\n", webpa_interface); + ParodusPrint("webpa_interface:%s\n", webpa_interface); return webpa_interface; } diff --git a/src/upstream.c b/src/upstream.c index 7ad330f..0cff1da 100644 --- a/src/upstream.c +++ b/src/upstream.c @@ -83,8 +83,6 @@ void packMetaData() //Pack the metadata initially to reuse for every upstream msg sending to server ParodusPrint("-------------- Packing metadata ----------------\n"); sprintf(boot_time, "%d", get_parodus_cfg()->boot_time); - char webpa_interface[64]={'\0'}; - sprintf(webpa_interface, "%s", getWebpaInterface()); struct data meta_pack[METADATA_COUNT] = { {HW_MODELNAME, get_parodus_cfg()->hw_model}, {HW_SERIALNUMBER, get_parodus_cfg()->hw_serial_number}, @@ -96,7 +94,7 @@ void packMetaData() {LAST_RECONNECT_REASON, get_global_reconnect_reason()}, {WEBPA_PROTOCOL, get_parodus_cfg()->webpa_protocol}, {WEBPA_UUID,get_parodus_cfg()->webpa_uuid}, - {WEBPA_INTERFACE,webpa_interface}, + {WEBPA_INTERFACE, getWebpaInterface()}, {PARTNER_ID, get_parodus_cfg()->partner_id} }; const data_t metapack = {METADATA_COUNT, meta_pack}; diff --git a/src/upstream_rbus.c b/src/upstream_rbus.c index 63984a0..efb34a4 100644 --- a/src/upstream_rbus.c +++ b/src/upstream_rbus.c @@ -30,7 +30,7 @@ #define WEBCFG_UPSTREAM_EVENT "Webconfig.Upstream" #ifdef WAN_FAILOVER_SUPPORTED -#define WEBPA_INTERFACE "Device.X_RDK_WanManager.CurrentActiveInterfaceEvent" +#define WEBPA_INTERFACE "Device.X_RDK_WanManager.CurrentActiveInterface" #endif rbusHandle_t rbus_Handle; @@ -66,16 +66,12 @@ void subscribeRBUSevent() int subscribeCurrentActiveInterfaceEvent() { int rc = RBUS_ERROR_SUCCESS; - ParodusPrint("Subscribing to Device.X_RDK_WanManager.CurrentActiveInterfaceEvent\n"); + ParodusPrint("Subscribing to Device.X_RDK_WanManager.CurrentActiveInterface Event\n"); rc = rbusEvent_SubscribeAsync(rbus_Handle,WEBPA_INTERFACE,eventReceiveHandler,subscribeAsyncHandler,"parodusInterface",10*20); if(rc != RBUS_ERROR_SUCCESS) { - ParodusError("%s subscribe failed : %d\n", WEBPA_INTERFACE, rc); - } - else - { - ParodusInfo("%s subscribe successful\n", WEBPA_INTERFACE); - } + ParodusError("%s subscribe failed : %d - %s\n", WEBPA_INTERFACE, rc, rbusError_ToString(rc)); + } return rc; } #endif @@ -163,12 +159,11 @@ void eventReceiveHandler( rbusHandle_t rbus_Handle, rbusEvent_t const* event, rb ParodusInfo("Consumer received ValueChange event for param %s\n", event->name); if(newValue) { - ParodusPrint("New Value: %s\n", rbusValue_GetString(newValue, NULL)); interface = (char *) rbusValue_GetString(newValue, NULL); setWebpaInterface(interface); - ParodusInfo("New Interface value = %s\n",interface); } - if(oldValue) - ParodusInfo("Old Value: %s\n", rbusValue_GetString(oldValue, NULL)); + if(newValue !=NULL && oldValue!=NULL && interface!=NULL) { + ParodusInfo("New Value: %s Old Value: %s New Interface Value: %s\n", rbusValue_GetString(newValue, NULL), rbusValue_GetString(oldValue, NULL), interface); + } } #endif From 69f7e3eba0fee7ef53903bc9d64c84f697b1e643 Mon Sep 17 00:00:00 2001 From: Guru Chandru Date: Tue, 29 Mar 2022 18:41:11 +0530 Subject: [PATCH 038/137] Adding NULL checks for wrp struct free --- src/xmidtsend_rbus.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/src/xmidtsend_rbus.c b/src/xmidtsend_rbus.c index d09207e..ebdbf85 100644 --- a/src/xmidtsend_rbus.c +++ b/src/xmidtsend_rbus.c @@ -421,13 +421,21 @@ void sendXmidtEventToServer(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle xmidtQDequeue(); } - ParodusInfo("B4 wrp_free_struct\n"); + } + ParodusInfo("B4 wrp_free_struct\n"); + if(notif_wrp_msg != NULL) + { + ParodusInfo("Inside the free wrp\n"); wrp_free_struct(notif_wrp_msg); - ParodusInfo("After wrp_free_struct\n"); + } + + ParodusInfo("After wrp_free_struct\n"); + if(msg_bytes != NULL) + { free(msg_bytes); msg_bytes = NULL; - ParodusInfo("sendXmidtEventToServer done\n"); } + ParodusInfo("sendXmidtEventToServer done\n"); } From aecbd885d521f85ca72984fce9da7ce6369748a5 Mon Sep 17 00:00:00 2001 From: Guru Chandru Date: Wed, 30 Mar 2022 12:08:52 +0530 Subject: [PATCH 039/137] Remove wrp_free in Dequeue --- src/xmidtsend_rbus.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/xmidtsend_rbus.c b/src/xmidtsend_rbus.c index ebdbf85..2bf11cd 100644 --- a/src/xmidtsend_rbus.c +++ b/src/xmidtsend_rbus.c @@ -139,7 +139,6 @@ void xmidtQDequeue() { temp = XmidtMsgQ; XmidtMsgQ = XmidtMsgQ->next; - wrp_free_struct(temp->msg); XmidtQsize -= 1; ParodusInfo("B4 free temp\n"); free(temp); From da019382c67105879f5852b84fb7a261d968b49c Mon Sep 17 00:00:00 2001 From: Guru Chandru Date: Thu, 31 Mar 2022 14:01:55 +0530 Subject: [PATCH 040/137] Async response --- src/xmidtsend_rbus.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/xmidtsend_rbus.c b/src/xmidtsend_rbus.c index 2bf11cd..38dec2e 100644 --- a/src/xmidtsend_rbus.c +++ b/src/xmidtsend_rbus.c @@ -740,7 +740,7 @@ static rbusError_t sendDataHandler(rbusHandle_t handle, char const* methodName, //xmidt send producer addToXmidtUpstreamQ(wrpMsg, asyncHandle); ParodusInfo("sendDataHandler returned %d\n", RBUS_ERROR_ASYNC_RESPONSE); - //return RBUS_ERROR_ASYNC_RESPONSE; + return RBUS_ERROR_ASYNC_RESPONSE; } else { From 0248e7b2412b9d6e9032feee9eea6463fdd239c2 Mon Sep 17 00:00:00 2001 From: Guru Chandru Date: Thu, 31 Mar 2022 14:21:54 +0530 Subject: [PATCH 041/137] removed LTE distro in mutex --- src/config.c | 4 ++-- src/xmidtsend_rbus.c | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/config.c b/src/config.c index f4d6fa6..0813c5b 100644 --- a/src/config.c +++ b/src/config.c @@ -33,9 +33,9 @@ /*----------------------------------------------------------------------------*/ /* File Scoped Variables */ /*----------------------------------------------------------------------------*/ -#ifdef WAN_FAILOVER_SUPPORTED +//#ifdef WAN_FAILOVER_SUPPORTED pthread_mutex_t config_mut=PTHREAD_MUTEX_INITIALIZER; -#endif +//#endif char webpa_interface[64]={'\0'}; char cloud_status[32]={'\0'}; diff --git a/src/xmidtsend_rbus.c b/src/xmidtsend_rbus.c index 38dec2e..2bf11cd 100644 --- a/src/xmidtsend_rbus.c +++ b/src/xmidtsend_rbus.c @@ -740,7 +740,7 @@ static rbusError_t sendDataHandler(rbusHandle_t handle, char const* methodName, //xmidt send producer addToXmidtUpstreamQ(wrpMsg, asyncHandle); ParodusInfo("sendDataHandler returned %d\n", RBUS_ERROR_ASYNC_RESPONSE); - return RBUS_ERROR_ASYNC_RESPONSE; + //return RBUS_ERROR_ASYNC_RESPONSE; } else { From 21e8c74f23315f197538be59592e36323d3bce43 Mon Sep 17 00:00:00 2001 From: Sadhyama Vengilat Date: Fri, 1 Apr 2022 14:07:57 +0530 Subject: [PATCH 042/137] Add transaction id in outParams & fix PC build issues --- CMakeLists.txt | 2 +- src/xmidtsend_rbus.c | 102 ++++++++++++++++++++++++------------ src/xmidtsend_rbus.h | 2 +- tests/CMakeLists.txt | 8 +-- tests/test_conn_interface.c | 5 ++ 5 files changed, 79 insertions(+), 40 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 9fdda7b..29a0332 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -174,7 +174,7 @@ ExternalProject_Add(wrp-c PREFIX ${CMAKE_CURRENT_BINARY_DIR}/_prefix/wrp-c GIT_REPOSITORY https://github.com/Thanusha-D/wrp-c.git #GIT_TAG "1.0.1" - GIT_TAG qos_add + GIT_TAG qos_trans CMAKE_ARGS += -DCMAKE_INSTALL_PREFIX=${INSTALL_DIR} -DMSGPACK_ENABLE_CXX=OFF -DMSGPACK_BUILD_EXAMPLES=OFF diff --git a/src/xmidtsend_rbus.c b/src/xmidtsend_rbus.c index 3446bfb..9b8c8a1 100644 --- a/src/xmidtsend_rbus.c +++ b/src/xmidtsend_rbus.c @@ -167,8 +167,6 @@ int processData(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle) { int rv = 0; char *errorMsg = "none"; - //rbusObject_t outParams; - //rbusError_t err; int statuscode =0; wrp_msg_t * xmidtMsg = msg; @@ -299,6 +297,8 @@ void sendXmidtEventToServer(wrp_msg_t * msg) } ParodusInfo("destination: %s\n", msg->u.event.dest); notif_wrp_msg->u.event.dest = msg->u.event.dest; + notif_wrp_msg->u.event.transaction_uuid = msg->u.event.transaction_uuid; + ParodusInfo("Notification transaction_uuid %s\n", notif_wrp_msg->u.event.transaction_uuid); if(msg->u.event.content_type != NULL) { if(strcmp(msg->u.event.content_type , "JSON") == 0) @@ -405,11 +405,14 @@ void createOutParamsandSendAck(wrp_msg_t *msg, rbusMethodAsyncHandle_t asyncHand rbusValue_Release(value); } - rbusValue_Init(&value); - rbusValue_SetString(value, "transaction_uuid"); //change this to actual transid - rbusObject_SetValue(outParams, "transaction_uuid", value); - rbusValue_Release(value); - + if(msg->u.event.transaction_uuid !=NULL) + { + rbusValue_Init(&value); + rbusValue_SetString(value, msg->u.event.transaction_uuid); + rbusObject_SetValue(outParams, "transaction_uuid", value); + rbusValue_Release(value); + ParodusInfo("outParams msg->u.event.transaction_uuid %s\n", msg->u.event.transaction_uuid); + } if(outParams !=NULL) { @@ -473,12 +476,12 @@ char* generate_transaction_uuid() return transID; } -void parseRbusInparamsToWrp(rbusObject_t inParams, wrp_msg_t **eventMsg) +void parseRbusInparamsToWrp(rbusObject_t inParams, char *trans_id, wrp_msg_t **eventMsg) { - const char *msg_typeStr = NULL; - const char *sourceVal = NULL; - const char *destStr = NULL, *contenttypeStr = NULL; - const char *payloadStr = NULL, *qosVal = NULL; + char *msg_typeStr = NULL; + char *sourceVal = NULL; + char *destStr = NULL, *contenttypeStr = NULL; + char *payloadStr = NULL, *qosVal = NULL; unsigned int payloadlength = 0; wrp_msg_t *msg = NULL; @@ -494,7 +497,7 @@ void parseRbusInparamsToWrp(rbusObject_t inParams, wrp_msg_t **eventMsg) { if(rbusValue_GetType(msg_type) == RBUS_STRING) { - msg_typeStr = rbusValue_GetString(msg_type, NULL); + msg_typeStr = (char *) rbusValue_GetString(msg_type, NULL); ParodusInfo("msg_type value received is %s\n", msg_typeStr); if((msg_typeStr !=NULL) && (strcmp(msg_typeStr, "event") ==0)) { @@ -512,9 +515,12 @@ void parseRbusInparamsToWrp(rbusObject_t inParams, wrp_msg_t **eventMsg) { if(rbusValue_GetType(source) == RBUS_STRING) { - sourceVal = rbusValue_GetString(source, NULL); - ParodusInfo("source value received is %s\n", sourceVal); - msg->u.event.source = strdup(sourceVal); //free + sourceVal = (char *)rbusValue_GetString(source, NULL); + if(sourceVal !=NULL) + { + ParodusInfo("source value received is %s\n", sourceVal); + msg->u.event.source = strdup(sourceVal); + } ParodusPrint("msg->u.event.source is %s\n", msg->u.event.source); } } @@ -528,10 +534,13 @@ void parseRbusInparamsToWrp(rbusObject_t inParams, wrp_msg_t **eventMsg) { if(rbusValue_GetType(dest) == RBUS_STRING) { - destStr = rbusValue_GetString(dest, NULL); - ParodusInfo("dest value received is %s\n", destStr); - msg->u.event.dest = strdup(destStr); //free - ParodusPrint("msg->u.event.dest is %s\n", msg->u.event.dest); + destStr = (char *)rbusValue_GetString(dest, NULL); + if(destStr !=NULL) + { + ParodusInfo("dest value received is %s\n", destStr); + msg->u.event.dest = strdup(destStr); + ParodusPrint("msg->u.event.dest is %s\n", msg->u.event.dest); + } } } else @@ -544,10 +553,13 @@ void parseRbusInparamsToWrp(rbusObject_t inParams, wrp_msg_t **eventMsg) { if(rbusValue_GetType(contenttype) == RBUS_STRING) { - contenttypeStr = rbusValue_GetString(contenttype, NULL); - ParodusInfo("contenttype value received is %s\n", contenttypeStr); - msg->u.event.content_type = strdup(contenttypeStr); //free - ParodusPrint("msg->u.event.content_type is %s\n", msg->u.event.content_type); + contenttypeStr = (char *)rbusValue_GetString(contenttype, NULL); + if(contenttypeStr !=NULL) + { + ParodusInfo("contenttype value received is %s\n", contenttypeStr); + msg->u.event.content_type = strdup(contenttypeStr); + ParodusPrint("msg->u.event.content_type is %s\n", msg->u.event.content_type); + } } } else @@ -560,10 +572,17 @@ void parseRbusInparamsToWrp(rbusObject_t inParams, wrp_msg_t **eventMsg) { if((rbusValue_GetType(payload) == RBUS_STRING)) { - payloadStr = rbusValue_GetString(payload, NULL); - ParodusInfo("payload received is %s\n", payloadStr); - msg->u.event.payload = strdup(payloadStr); //free - ParodusPrint("msg->u.event.payload is %s\n", msg->u.event.payload); + payloadStr = (char *)rbusValue_GetString(payload, NULL); + if(payloadStr !=NULL) + { + ParodusInfo("payload received is %s\n", payloadStr); + msg->u.event.payload = strdup(payloadStr); //free + ParodusInfo("msg->u.event.payload is %s\n", msg->u.event.payload); + } + else + { + ParodusError("payloadStr is empty\n"); + } } } else @@ -595,7 +614,7 @@ void parseRbusInparamsToWrp(rbusObject_t inParams, wrp_msg_t **eventMsg) if(rbusValue_GetType(qos) == RBUS_STRING) { ParodusPrint("qos type %d RBUS_STRING %d\n", rbusValue_GetType(qos), RBUS_STRING); - qosVal = rbusValue_GetString(qos, NULL); + qosVal = (char *)rbusValue_GetString(qos, NULL); ParodusInfo("qos received is %s\n", qosVal); if(qosVal !=NULL) { @@ -604,13 +623,28 @@ void parseRbusInparamsToWrp(rbusObject_t inParams, wrp_msg_t **eventMsg) } } } - *eventMsg = msg; + + if(trans_id !=NULL) + { + ParodusInfo("Add trans_id %s to wrp message\n", trans_id); + msg->u.event.transaction_uuid = strdup(trans_id); + free(trans_id); + trans_id = NULL; + ParodusInfo("msg->u.event.transaction_uuid is %s\n", msg->u.event.transaction_uuid); + } + else + { + ParodusError("transaction_uuid is empty\n"); + } + + *eventMsg = msg; ParodusInfo("parseRbusInparamsToWrp End\n"); } static rbusError_t sendDataHandler(rbusHandle_t handle, char const* methodName, rbusObject_t inParams, rbusObject_t outParams, rbusMethodAsyncHandle_t asyncHandle) { (void) handle; + (void) outParams; int inStatus = 0; char *transaction_uuid = NULL; wrp_msg_t *wrpMsg= NULL; @@ -622,17 +656,15 @@ static rbusError_t sendDataHandler(rbusHandle_t handle, char const* methodName, inStatus = checkInputParameters(inParams); if(inStatus) { - ParodusInfo("InParam Retain\n"); - rbusObject_Retain(inParams); - parseRbusInparamsToWrp(inParams, &wrpMsg); //generate transaction id to create outParams and send ack transaction_uuid = generate_transaction_uuid(); ParodusInfo("xmidt transaction_uuid generated is %s\n", transaction_uuid); + parseRbusInparamsToWrp(inParams, transaction_uuid, &wrpMsg); //xmidt send producer addToXmidtUpstreamQ(wrpMsg, asyncHandle); ParodusInfo("sendDataHandler returned %d\n", RBUS_ERROR_ASYNC_RESPONSE); - //return RBUS_ERROR_ASYNC_RESPONSE; + return RBUS_ERROR_ASYNC_RESPONSE; } else { @@ -644,6 +676,8 @@ static rbusError_t sendDataHandler(rbusHandle_t handle, char const* methodName, ParodusError("Method %s received is not supported\n", methodName); return RBUS_ERROR_BUS_ERROR; } + ParodusPrint("send RBUS_ERROR_SUCCESS\n"); + return RBUS_ERROR_SUCCESS; } diff --git a/src/xmidtsend_rbus.h b/src/xmidtsend_rbus.h index 94b783b..6500ebc 100644 --- a/src/xmidtsend_rbus.h +++ b/src/xmidtsend_rbus.h @@ -63,7 +63,7 @@ int processData(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle); void sendXmidtEventToServer(wrp_msg_t * msg); int checkInputParameters(rbusObject_t inParams); char* generate_transaction_uuid(); -void parseRbusInparamsToWrp(rbusObject_t inParams, wrp_msg_t **eventMsg); +void parseRbusInparamsToWrp(rbusObject_t inParams, char *trans_id, wrp_msg_t **eventMsg); void createOutParamsandSendAck(wrp_msg_t *msg, rbusMethodAsyncHandle_t asyncHandle, char *errorMsg, int statuscode); int validateXmidtData(wrp_msg_t * eventMsg, char **errorMsg, int *statusCode); #ifdef __cplusplus diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index de460be..0006c16 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -160,7 +160,7 @@ set(CLIST_SRC ${CLIST_SRC} ../src/seshat_interface_stub.c) endif (ENABLE_SESHAT) if (ENABLE_WEBCFGBIN) -set(CLIST_SRC ${CLIST_SRC} ../src/upstream_rbus.c) +set(CLIST_SRC ${CLIST_SRC} ../src/upstream_rbus.c ../src/xmidtsend_rbus.c) endif (ENABLE_WEBCFGBIN) add_executable(test_client_list ${CLIST_SRC}) @@ -181,7 +181,7 @@ set(SVA_SRC ${SVA_SRC} ../src/seshat_interface_stub.c) endif (ENABLE_SESHAT) if (ENABLE_WEBCFGBIN) -set(SVA_SRC ${SVA_SRC} ../src/upstream_rbus.c) +set(SVA_SRC ${SVA_SRC} ../src/upstream_rbus.c ../src/xmidtsend_rbus.c) endif (ENABLE_WEBCFGBIN) add_executable(test_service_alive ${SVA_SRC}) @@ -307,7 +307,7 @@ else() set(CONIFC_SRC ${CONIFC_SRC} ../src/seshat_interface_stub.c) endif (ENABLE_SESHAT) if (ENABLE_WEBCFGBIN) -set(CONIFC_SRC ${CONIFC_SRC} ../src/upstream_rbus.c) +set(CONIFC_SRC ${CONIFC_SRC} ../src/upstream_rbus.c ../src/xmidtsend_rbus.c) endif (ENABLE_WEBCFGBIN) add_executable(test_conn_interface ${CONIFC_SRC}) target_link_libraries (test_conn_interface -lcmocka ${PARODUS_COMMON_LIBS} -lcurl -luuid ) @@ -356,7 +356,7 @@ set(TOKEN_SRC test_token_stub.c ${TOKEN_SRC}) endif (FEATURE_DNS_QUERY) if (ENABLE_WEBCFGBIN) -set(TOKEN_SRC ${TOKEN_SRC} ../src/upstream_rbus.c) +set(TOKEN_SRC ${TOKEN_SRC} ../src/upstream_rbus.c ../src/xmidtsend_rbus.c) endif (ENABLE_WEBCFGBIN) add_executable(test_token ${TOKEN_SRC} ) diff --git a/tests/test_conn_interface.c b/tests/test_conn_interface.c index 32070e7..468fca8 100644 --- a/tests/test_conn_interface.c +++ b/tests/test_conn_interface.c @@ -103,6 +103,11 @@ void set_global_shutdown_reason(char *reason) UNUSED(reason); } +int getDeviceId(char **device_id, size_t *device_id_len) +{ + UNUSED(device_id); UNUSED(device_id_len); + return 0; +} void start_conn_in_progress (unsigned long start_time) { UNUSED(start_time); From 6aee85194480fe503a314d22fa12544a9a030776 Mon Sep 17 00:00:00 2001 From: Guru Chandru Date: Fri, 1 Apr 2022 14:59:29 +0530 Subject: [PATCH 043/137] Removing tempAsyncHandle --- src/xmidtsend_rbus.c | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/src/xmidtsend_rbus.c b/src/xmidtsend_rbus.c index 2bf11cd..fb54527 100644 --- a/src/xmidtsend_rbus.c +++ b/src/xmidtsend_rbus.c @@ -392,7 +392,7 @@ void sendXmidtEventToServer(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle { errorMsg = strdup("sendXmidtEventToServer Failed , Enqueue event since QOS is High"); ParodusInfo("The event is having high qos retry again \n"); - createOutParamsandSendAck(msg, asyncHandle, errorMsg, CLIENT_DISCONNECT); + //createOutParamsandSendAck(msg, asyncHandle, errorMsg, CLIENT_DISCONNECT); ParodusInfo("The value of pointer xmidt->msg is %p\n", XmidtMsgQ->msg); ParodusInfo("Wait till connection is Up\n"); @@ -445,8 +445,8 @@ void createOutParamsandSendAck(wrp_msg_t *msg, rbusMethodAsyncHandle_t asyncHand rbusValue_t value; char qosstring[20] = ""; - rbusMethodAsyncHandle_t tempAsyncHandle = malloc(sizeof(struct rbusMethodAsyncHandle_t*)); - memcpy(tempAsyncHandle, asyncHandle, sizeof(rbusMethodAsyncHandle_t*)); + /*rbusMethodAsyncHandle_t tempAsyncHandle = malloc(sizeof(struct rbusMethodAsyncHandle_t*)); + //memcpy(tempAsyncHandle, asyncHandle, sizeof(rbusMethodAsyncHandle_t*));*/ if(msg == NULL) { @@ -517,17 +517,18 @@ void createOutParamsandSendAck(wrp_msg_t *msg, rbusMethodAsyncHandle_t asyncHand rbusObject_SetValue(outParams, "transaction_uuid", value); rbusValue_Release(value); - if(outParams !=NULL) { - if(tempAsyncHandle == NULL) + rbusObject_fwrite(outParams, 1, stdout); + if(asyncHandle == NULL) { ParodusInfo("tempAsyncHandle is NULL\n"); return; } ParodusInfo("B4 rbusMethod_SendAsyncResponse ..\n"); - ParodusInfo("b4 rbusMethod_SendAsyncResponse async pointer is %p for qos %s\n", tempAsyncHandle, qosstring); - err = rbusMethod_SendAsyncResponse(tempAsyncHandle, RBUS_ERROR_INVALID_RESPONSE_FROM_DESTINATION, outParams); + ParodusInfo("b4 rbusMethod_SendAsyncResponse async pointer is %p for qos %s\n", asyncHandle, qosstring); + err = rbusMethod_SendAsyncResponse(asyncHandle, RBUS_ERROR_SUCCESS, outParams);//RBUS_ERROR_INVALID_RESPONSE_FROM_DESTINATION +ParodusInfo("After rbusMethod_SendAsyncResponse async pointer is %p for qos %s\n", asyncHandle, qosstring); ParodusInfo("After rbusMethod_SendAsyncResponse\n"); ParodusInfo("err is %d RBUS_ERROR_SUCCESS %d\n", err, RBUS_ERROR_SUCCESS); if(err != RBUS_ERROR_SUCCESS) @@ -723,7 +724,7 @@ static rbusError_t sendDataHandler(rbusHandle_t handle, char const* methodName, char *transaction_uuid = NULL; wrp_msg_t *wrpMsg= NULL; ParodusInfo("methodHandler called: %s\n", methodName); - //rbusObject_fwrite(inParams, 1, stdout); + rbusObject_fwrite(outParams, 1, stdout); if((methodName !=NULL) && (strcmp(methodName, XMIDT_SEND_METHOD) == 0)) { @@ -740,7 +741,7 @@ static rbusError_t sendDataHandler(rbusHandle_t handle, char const* methodName, //xmidt send producer addToXmidtUpstreamQ(wrpMsg, asyncHandle); ParodusInfo("sendDataHandler returned %d\n", RBUS_ERROR_ASYNC_RESPONSE); - //return RBUS_ERROR_ASYNC_RESPONSE; + return RBUS_ERROR_ASYNC_RESPONSE; } else { From 67d58441ef06509f1caf229eb3e7dc6fad9aa104 Mon Sep 17 00:00:00 2001 From: Guru Chandru Date: Fri, 1 Apr 2022 21:21:38 +0530 Subject: [PATCH 044/137] Revised changes --- src/xmidtsend_rbus.c | 61 +++++++++++++++++++++----------------------- src/xmidtsend_rbus.h | 2 +- 2 files changed, 30 insertions(+), 33 deletions(-) diff --git a/src/xmidtsend_rbus.c b/src/xmidtsend_rbus.c index 11dfa39..0932fa4 100644 --- a/src/xmidtsend_rbus.c +++ b/src/xmidtsend_rbus.c @@ -38,6 +38,8 @@ pthread_mutex_t xmidt_mut=PTHREAD_MUTEX_INITIALIZER; pthread_cond_t xmidt_con=PTHREAD_COND_INITIALIZER; +void printOutParams1(rbusObject_t params, char* file_path); + XmidtMsg * get_global_XmidtMsgQ(void) { return XmidtMsgQ; @@ -132,7 +134,6 @@ void addToXmidtUpstreamQ(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle) //To remove an event from Queue void xmidtQDequeue() { - ParodusInfo("Inside dequeue\n"); XmidtMsg *temp = NULL; pthread_mutex_lock (&xmidt_mut); if(XmidtMsgQ != NULL) @@ -140,13 +141,9 @@ void xmidtQDequeue() temp = XmidtMsgQ; XmidtMsgQ = XmidtMsgQ->next; XmidtQsize -= 1; - ParodusInfo("B4 free temp\n"); free(temp); - ParodusInfo("After free temp\n"); } - ParodusInfo("B4 unlock\n"); pthread_mutex_unlock (&xmidt_mut); - ParodusInfo("After unlock\n"); } //Xmidt consumer thread to process the rbus events. @@ -168,8 +165,6 @@ void processXmidtData() //Consumer to Parse and process rbus data. void* processXmidtUpstreamMsg() { - int ret = 0; - while(FOREVER()) { ParodusInfo("xmidt mutex b4 lock\n"); @@ -182,15 +177,7 @@ void* processXmidtUpstreamMsg() pthread_mutex_unlock (&xmidt_mut); ParodusInfo("mutex unlock in xmidt consumer thread\n"); ParodusInfo("Asynchandle pointer %p\n"); - ret = processData(Data->msg, Data->asyncHandle); - if(ret) - { - ParodusInfo("xmidt processData is success\n"); - } - else - { - ParodusError("Failed to process xmidt data\n"); - } + processData(Data->msg, Data->asyncHandle); } else { @@ -208,19 +195,17 @@ void* processXmidtUpstreamMsg() return NULL; } -int processData(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle) +void processData(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle) { int rv = 0; char *errorMsg = "none"; - //rbusObject_t outParams; - //rbusError_t err; int statuscode =0; wrp_msg_t * xmidtMsg = msg; if (xmidtMsg == NULL) { ParodusError("xmidtMsg is NULL\n"); - return 0; + return; } rv = validateXmidtData(xmidtMsg, &errorMsg, &statuscode); @@ -229,7 +214,7 @@ int processData(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle) { ParodusInfo("validation successful, send event to server\n"); sendXmidtEventToServer(xmidtMsg, asyncHandle); - return 1; + return; } else { @@ -239,7 +224,7 @@ int processData(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle) xmidtQDequeue(); ParodusInfo("ack done\n"); } - return 0; + return; } int validateXmidtData(wrp_msg_t * eventMsg, char **errorMsg, int *statusCode) @@ -447,9 +432,6 @@ void createOutParamsandSendAck(wrp_msg_t *msg, rbusMethodAsyncHandle_t asyncHand rbusValue_t value; char qosstring[20] = ""; - /*rbusMethodAsyncHandle_t tempAsyncHandle = malloc(sizeof(struct rbusMethodAsyncHandle_t*)); - //memcpy(tempAsyncHandle, asyncHandle, sizeof(rbusMethodAsyncHandle_t*));*/ - if(msg == NULL) { ParodusError("msg is NULL\n"); @@ -531,11 +513,10 @@ void createOutParamsandSendAck(wrp_msg_t *msg, rbusMethodAsyncHandle_t asyncHand ParodusInfo("tempAsyncHandle is NULL\n"); return; } - ParodusInfo("B4 rbusMethod_SendAsyncResponse ..\n"); - ParodusInfo("b4 rbusMethod_SendAsyncResponse async pointer is %p for qos %s\n", asyncHandle, qosstring); - err = rbusMethod_SendAsyncResponse(asyncHandle, RBUS_ERROR_SUCCESS, outParams);//RBUS_ERROR_INVALID_RESPONSE_FROM_DESTINATION -ParodusInfo("After rbusMethod_SendAsyncResponse async pointer is %p for qos %s\n", asyncHandle, qosstring); - ParodusInfo("After rbusMethod_SendAsyncResponse\n"); + + err = rbusMethod_SendAsyncResponse(asyncHandle, RBUS_ERROR_SUCCESS, outParams); + //err = rbusMethod_SendAsyncResponse(asyncHandle, RBUS_ERROR_INVALID_RESPONSE_FROM_DESTINATION, outParams); //for negative case + ParodusInfo("err is %d RBUS_ERROR_SUCCESS %d\n", err, RBUS_ERROR_SUCCESS); if(err != RBUS_ERROR_SUCCESS) { @@ -545,9 +526,8 @@ ParodusInfo("After rbusMethod_SendAsyncResponse async pointer is %p for qos %s\n { ParodusInfo("rbusMethod_SendAsyncResponse success:%d\n", err); } - ParodusInfo("Release outParams\n"); + rbusObject_Release(outParams); - ParodusInfo("outParams released\n"); } else { @@ -762,6 +742,7 @@ static rbusError_t sendDataHandler(rbusHandle_t handle, char const* methodName, wrp_msg_t *wrpMsg= NULL; ParodusInfo("methodHandler called: %s\n", methodName); //rbusObject_fwrite(inParams, 1, stdout); + printOutParams1(inParams, "/tmp/inparams.txt"); if((methodName !=NULL) && (strcmp(methodName, XMIDT_SEND_METHOD) == 0)) { @@ -822,3 +803,19 @@ int regXmidtSendDataMethod() processXmidtData(); return rc; } + +//To print and store params output to a file +void printOutParams1(rbusObject_t params, char* file_path) +{ + ParodusInfo("Inside printOutParams1\n"); + if( NULL != params ) + { + FILE *fd = fopen(file_path, "w+"); + rbusObject_fwrite(params, 1, fd); + fclose(fd); + } + else + { + ParodusError("Params is NULL\n"); + } +} diff --git a/src/xmidtsend_rbus.h b/src/xmidtsend_rbus.h index cb092e4..9a08faa 100644 --- a/src/xmidtsend_rbus.h +++ b/src/xmidtsend_rbus.h @@ -62,7 +62,7 @@ rbusHandle_t get_parodus_rbus_Handle(void); void addToXmidtUpstreamQ(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle); void* processXmidtUpstreamMsg(); void processXmidtData(); -int processData(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle); +void processData(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle); void sendXmidtEventToServer(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle); int checkInputParameters(rbusObject_t inParams); char* generate_transaction_uuid(); From e3c37b6764a65fba04b674c71778ada4235ef5b6 Mon Sep 17 00:00:00 2001 From: Guru Chandru Date: Mon, 4 Apr 2022 12:10:30 +0530 Subject: [PATCH 045/137] Review comment Changes --- src/config.c | 13 ++++++++----- src/xmidtsend_rbus.c | 2 -- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/src/config.c b/src/config.c index 0813c5b..834bcf4 100644 --- a/src/config.c +++ b/src/config.c @@ -68,13 +68,16 @@ void reset_cloud_disconnect_reason(ParodusCfg *cfg) void set_cloud_status(char *status) { - pthread_mutex_lock(&config_mut); - get_parodus_cfg()->cloud_status = strdup(status); - if(strcmp (status, CLOUD_STATUS_ONLINE) == 0) + if(status != NULL) { - pthread_cond_signal(get_global_xmidt_con()); + pthread_mutex_lock(&config_mut); + get_parodus_cfg()->cloud_status = strdup(status); + if(strcmp (status, CLOUD_STATUS_ONLINE) == 0) + { + pthread_cond_signal(get_global_xmidt_con()); + } + pthread_mutex_unlock(&config_mut); } - pthread_mutex_unlock(&config_mut); } char *get_cloud_status(void) diff --git a/src/xmidtsend_rbus.c b/src/xmidtsend_rbus.c index 0932fa4..4269595 100644 --- a/src/xmidtsend_rbus.c +++ b/src/xmidtsend_rbus.c @@ -377,9 +377,7 @@ void sendXmidtEventToServer(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle ParodusInfo("sendXmidtEventToServer is Failed\n"); if(highQosValueCheck(qos)) { - errorMsg = strdup("sendXmidtEventToServer Failed , Enqueue event since QOS is High"); ParodusInfo("The event is having high qos retry again \n"); - //createOutParamsandSendAck(msg, asyncHandle, errorMsg, CLIENT_DISCONNECT); ParodusInfo("The value of pointer xmidt->msg is %p\n", XmidtMsgQ->msg); ParodusInfo("Wait till connection is Up\n"); From 980b7a88dbbf94dba45df5bd4509de48467eca9f Mon Sep 17 00:00:00 2001 From: Guru Chandru Date: Mon, 4 Apr 2022 15:05:24 +0530 Subject: [PATCH 046/137] Review comment Changes on ACK and Cloud status Cond signal --- src/ParodusInternal.h | 5 +- src/config.c | 15 +++++- src/xmidtsend_rbus.c | 115 ++++++++++++++++++++++++++++++++++++------ src/xmidtsend_rbus.h | 4 ++ 4 files changed, 122 insertions(+), 17 deletions(-) diff --git a/src/ParodusInternal.h b/src/ParodusInternal.h index b29ab1d..7e63f79 100644 --- a/src/ParodusInternal.h +++ b/src/ParodusInternal.h @@ -184,8 +184,11 @@ void set_interface_down_event(); pthread_cond_t *get_interface_down_con(); pthread_mutex_t *get_interface_down_mut(); + +pthread_cond_t *get_global_cloud_status_cond(void); + +pthread_mutex_t *get_global_cloud_status_mut(void); -pthread_cond_t *get_global_xmidt_con(void); #ifdef __cplusplus } #endif diff --git a/src/config.c b/src/config.c index 834bcf4..fe0da54 100644 --- a/src/config.c +++ b/src/config.c @@ -36,6 +36,10 @@ //#ifdef WAN_FAILOVER_SUPPORTED pthread_mutex_t config_mut=PTHREAD_MUTEX_INITIALIZER; //#endif +//For sending cond signal when cloud status is ONLINE +pthread_mutex_t cloud_status_mut=PTHREAD_MUTEX_INITIALIZER; +pthread_cond_t cloud_status_cond=PTHREAD_COND_INITIALIZER; + char webpa_interface[64]={'\0'}; char cloud_status[32]={'\0'}; @@ -45,6 +49,15 @@ static unsigned int rsa_algorithms = /*----------------------------------------------------------------------------*/ /* External Functions */ /*----------------------------------------------------------------------------*/ +pthread_cond_t *get_global_cloud_status_cond(void) +{ + return &cloud_status_cond; +} + +pthread_mutex_t *get_global_cloud_status_mut(void) +{ + return &cloud_status_mut; +} ParodusCfg *get_parodus_cfg(void) { @@ -74,7 +87,7 @@ void set_cloud_status(char *status) get_parodus_cfg()->cloud_status = strdup(status); if(strcmp (status, CLOUD_STATUS_ONLINE) == 0) { - pthread_cond_signal(get_global_xmidt_con()); + pthread_cond_signal(&cloud_status_cond); } pthread_mutex_unlock(&config_mut); } diff --git a/src/xmidtsend_rbus.c b/src/xmidtsend_rbus.c index 4269595..2ce3ec9 100644 --- a/src/xmidtsend_rbus.c +++ b/src/xmidtsend_rbus.c @@ -38,7 +38,7 @@ pthread_mutex_t xmidt_mut=PTHREAD_MUTEX_INITIALIZER; pthread_cond_t xmidt_con=PTHREAD_COND_INITIALIZER; -void printOutParams1(rbusObject_t params, char* file_path); +void printRBUSParams(rbusObject_t params, char* file_path); XmidtMsg * get_global_XmidtMsgQ(void) { @@ -99,7 +99,6 @@ void addToXmidtUpstreamQ(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle) message->asyncHandle =asyncHandle; //Increment queue size to handle max queue limit XmidtQsize++; - ParodusInfo("XmidtQsize is %d\n" , XmidtQsize); message->next=NULL; pthread_mutex_lock (&xmidt_mut); //Producer adds the rbus msg into queue @@ -125,7 +124,9 @@ void addToXmidtUpstreamQ(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle) } else { + char * errorMsg = strdup("Memory Allocation Failed"); ParodusError("failure in allocation for xmidt message\n"); + createOutParamsandSendAck(msg, asyncHandle, errorMsg , ENQUEUE_FAILURE); } ParodusInfo ("End of addToXmidtUpstreamQ\n"); return; @@ -205,6 +206,9 @@ void processData(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle) if (xmidtMsg == NULL) { ParodusError("xmidtMsg is NULL\n"); + errorMsg = strdup("wrp msg sent is NULL"); + sendACK(asyncHandle, errorMsg, WRP_MESSAGE_NULL); + xmidtQDequeue(); return; } @@ -364,11 +368,23 @@ void sendXmidtEventToServer(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle else { ParodusInfo("The msg_len is zero\n"); + errorMsg = strdup("Wrp message encoding failed"); + createOutParamsandSendAck(msg, asyncHandle, errorMsg, WRP_ENCODE_FAILURE); xmidtQDequeue(); - wrp_free_struct(notif_wrp_msg); + + ParodusInfo("B4 wrp_free_struct\n"); + if(notif_wrp_msg != NULL) + { + ParodusInfo("Inside the free wrp\n"); + wrp_free_struct(notif_wrp_msg); + } + ParodusInfo("After wrp_free_struct\n"); - free(msg_bytes); - msg_bytes = NULL; + if(msg_bytes != NULL) + { + free(msg_bytes); + msg_bytes = NULL; + } return; } @@ -381,15 +397,16 @@ void sendXmidtEventToServer(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle ParodusInfo("The value of pointer xmidt->msg is %p\n", XmidtMsgQ->msg); ParodusInfo("Wait till connection is Up\n"); - pthread_cond_wait(&xmidt_con, &xmidt_mut); - pthread_mutex_unlock(&xmidt_mut); + pthread_mutex_lock(get_global_cloud_status_mut()); + pthread_cond_wait(get_global_cloud_status_cond(), get_global_cloud_status_mut()); + pthread_mutex_unlock(get_global_cloud_status_mut()); ParodusInfo("Received signal proceed to retry\n"); } else { - errorMsg = strdup("sendXmidtEventToServer Failed , Dequeue event since QOS is Low"); + errorMsg = strdup("send to server failed"); ParodusInfo("The event is having low qos proceed to dequeue\n"); - createOutParamsandSendAck(msg, asyncHandle, errorMsg, ENQUEUE_FAILURE); + createOutParamsandSendAck(msg, asyncHandle, errorMsg, CLIENT_DISCONNECT); xmidtQDequeue(); break; } @@ -399,13 +416,20 @@ void sendXmidtEventToServer(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle if(sendRetStatus == 0) { - errorMsg = strdup("sendXmidtEventToServer is Success"); - ParodusInfo("sendXmidtEventToServer done\n"); + errorMsg = strdup("send to server success"); createOutParamsandSendAck(msg, asyncHandle, errorMsg, DELIVERED_SUCCESS); xmidtQDequeue(); } } + else + { + errorMsg = strdup("wrp struct memory allocation failed"); + ParodusInfo("wrp struct memory allocation failed\n"); + createOutParamsandSendAck(msg, asyncHandle, errorMsg, WRP_MALLOC_FAILURE); + xmidtQDequeue(); + } + ParodusInfo("B4 wrp_free_struct\n"); if(notif_wrp_msg != NULL) { @@ -423,6 +447,67 @@ void sendXmidtEventToServer(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle } +//To send ACK when msg is NULL +void sendACK(rbusMethodAsyncHandle_t asyncHandle, char *errorMsg, int statuscode) +{ + rbusObject_t outParams; + rbusError_t err; + rbusValue_t value; + + ParodusInfo("createOutParams\n"); + + rbusValue_Init(&value); + rbusValue_SetString(value, "event"); + rbusObject_Init(&outParams, NULL); + rbusObject_SetValue(outParams, "msg_type", value); + rbusValue_Release(value); + + ParodusInfo("statuscode %d errorMsg %s\n", statuscode, errorMsg); + rbusValue_Init(&value); + rbusValue_SetInt32(value, statuscode); + rbusObject_SetValue(outParams, "status", value); + rbusValue_Release(value); + + if(errorMsg !=NULL) + { + rbusValue_Init(&value); + rbusValue_SetString(value, errorMsg); + rbusObject_SetValue(outParams, "error_message", value); + rbusValue_Release(value); + free(errorMsg); + } + + if(outParams !=NULL) + { + rbusObject_fwrite(outParams, 1, stdout); + if(asyncHandle == NULL) + { + ParodusInfo("asyncHandle is NULL\n"); + return; + } + + err = rbusMethod_SendAsyncResponse(asyncHandle, RBUS_ERROR_SUCCESS, outParams); + + ParodusInfo("err is %d RBUS_ERROR_SUCCESS %d\n", err, RBUS_ERROR_SUCCESS); + if(err != RBUS_ERROR_SUCCESS) + { + ParodusError("rbusMethod_SendAsyncResponse failed err:%d\n", err); + } + else + { + ParodusInfo("rbusMethod_SendAsyncResponse success:%d\n", err); + } + + rbusObject_Release(outParams); + } + else + { + ParodusError("Failed to create outParams\n"); + } + + return; +} + void createOutParamsandSendAck(wrp_msg_t *msg, rbusMethodAsyncHandle_t asyncHandle, char *errorMsg, int statuscode) { rbusObject_t outParams; @@ -508,7 +593,7 @@ void createOutParamsandSendAck(wrp_msg_t *msg, rbusMethodAsyncHandle_t asyncHand rbusObject_fwrite(outParams, 1, stdout); if(asyncHandle == NULL) { - ParodusInfo("tempAsyncHandle is NULL\n"); + ParodusInfo("asyncHandle is NULL\n"); return; } @@ -740,7 +825,7 @@ static rbusError_t sendDataHandler(rbusHandle_t handle, char const* methodName, wrp_msg_t *wrpMsg= NULL; ParodusInfo("methodHandler called: %s\n", methodName); //rbusObject_fwrite(inParams, 1, stdout); - printOutParams1(inParams, "/tmp/inparams.txt"); + printRBUSParams(inParams, "/tmp/inparams.txt"); if((methodName !=NULL) && (strcmp(methodName, XMIDT_SEND_METHOD) == 0)) { @@ -803,9 +888,9 @@ int regXmidtSendDataMethod() } //To print and store params output to a file -void printOutParams1(rbusObject_t params, char* file_path) +void printRBUSParams(rbusObject_t params, char* file_path) { - ParodusInfo("Inside printOutParams1\n"); + ParodusInfo("Inside printRBUSParams\n"); if( NULL != params ) { FILE *fd = fopen(file_path, "w+"); diff --git a/src/xmidtsend_rbus.h b/src/xmidtsend_rbus.h index 9a08faa..cc654d9 100644 --- a/src/xmidtsend_rbus.h +++ b/src/xmidtsend_rbus.h @@ -51,6 +51,9 @@ typedef enum MISSING_PAYLOAD, MISSING_PAYLOADLEN, QUEUE_SIZE_EXCEEDED, + WRP_MESSAGE_NULL, + WRP_ENCODE_FAILURE, + WRP_MALLOC_FAILURE, ENQUEUE_FAILURE = 100, CLIENT_DISCONNECT = 101 } XMIDT_STATUS; @@ -72,6 +75,7 @@ int validateXmidtData(wrp_msg_t * eventMsg, char **errorMsg, int *statusCode); void xmidtQDequeue(); bool highQosValueCheck(int qos); void waitTillConnectionIsUp(); +void sendACK(rbusMethodAsyncHandle_t asyncHandle, char *errorMsg, int statuscode); #ifdef __cplusplus } #endif From 6381d9c55f0fbafb2e926a4ba110200aab03723a Mon Sep 17 00:00:00 2001 From: Guru Chandru Date: Mon, 4 Apr 2022 15:15:18 +0530 Subject: [PATCH 047/137] Local PC Unit Test Build Failure Fix --- tests/test_conn_interface.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/test_conn_interface.c b/tests/test_conn_interface.c index 468fca8..98554e8 100644 --- a/tests/test_conn_interface.c +++ b/tests/test_conn_interface.c @@ -183,10 +183,10 @@ int validate_partner_id(wrp_msg_t *msg, partners_t **partnerIds) return 0; } -void sendUpstreamMsgToServer(void **resp_bytes, size_t resp_size) +int sendUpstreamMsgToServer(void **resp_bytes, size_t resp_size) { UNUSED(resp_bytes); UNUSED(resp_size); - return; + return 0; } int nopoll_loop_wait(noPollCtx * ctx,long timeout) From 8537f27ece49bc76e3fdfe8612045fcfe02bc983 Mon Sep 17 00:00:00 2001 From: Guru Chandru Date: Tue, 5 Apr 2022 13:59:59 +0530 Subject: [PATCH 048/137] Review comment changes --- src/xmidtsend_rbus.c | 190 ++++++++++++++++--------------------------- src/xmidtsend_rbus.h | 6 +- 2 files changed, 71 insertions(+), 125 deletions(-) diff --git a/src/xmidtsend_rbus.c b/src/xmidtsend_rbus.c index 2ce3ec9..61c628c 100644 --- a/src/xmidtsend_rbus.c +++ b/src/xmidtsend_rbus.c @@ -38,8 +38,6 @@ pthread_mutex_t xmidt_mut=PTHREAD_MUTEX_INITIALIZER; pthread_cond_t xmidt_con=PTHREAD_COND_INITIALIZER; -void printRBUSParams(rbusObject_t params, char* file_path); - XmidtMsg * get_global_XmidtMsgQ(void) { return XmidtMsgQ; @@ -124,7 +122,7 @@ void addToXmidtUpstreamQ(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle) } else { - char * errorMsg = strdup("Memory Allocation Failed"); + char * errorMsg = strdup("Unable to enqueue"); ParodusError("failure in allocation for xmidt message\n"); createOutParamsandSendAck(msg, asyncHandle, errorMsg , ENQUEUE_FAILURE); } @@ -144,6 +142,10 @@ void xmidtQDequeue() XmidtQsize -= 1; free(temp); } + else + { + ParodusError("XmidtMsgQ is NULL\n"); + } pthread_mutex_unlock (&xmidt_mut); } @@ -177,7 +179,6 @@ void* processXmidtUpstreamMsg() pthread_mutex_unlock (&xmidt_mut); ParodusInfo("mutex unlock in xmidt consumer thread\n"); - ParodusInfo("Asynchandle pointer %p\n"); processData(Data->msg, Data->asyncHandle); } else @@ -206,8 +207,8 @@ void processData(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle) if (xmidtMsg == NULL) { ParodusError("xmidtMsg is NULL\n"); - errorMsg = strdup("wrp msg sent is NULL"); - sendACK(asyncHandle, errorMsg, WRP_MESSAGE_NULL); + errorMsg = strdup("Unable to enqueue"); + createOutParamsandSendAck(xmidtMsg, asyncHandle, errorMsg, ENQUEUE_FAILURE); xmidtQDequeue(); return; } @@ -226,7 +227,6 @@ void processData(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle) ParodusInfo("errorMsg %s\n", errorMsg); createOutParamsandSendAck(xmidtMsg, asyncHandle, errorMsg , statuscode); xmidtQDequeue(); - ParodusInfo("ack done\n"); } return; } @@ -330,10 +330,19 @@ void sendXmidtEventToServer(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle ParodusError("Failed to get device_id\n"); } } - ParodusInfo("destination: %s\n", msg->u.event.dest); - notif_wrp_msg->u.event.dest = msg->u.event.dest; - notif_wrp_msg->u.event.transaction_uuid = msg->u.event.transaction_uuid; - ParodusInfo("Notification transaction_uuid %s\n", notif_wrp_msg->u.event.transaction_uuid); + + if(msg->u.event.dest != NULL) + { + notif_wrp_msg->u.event.dest = msg->u.event.dest; + ParodusInfo("destination: %s\n", notif_wrp_msg->u.event.dest); + } + + if(msg->u.event.transaction_uuid != NULL) + { + notif_wrp_msg->u.event.transaction_uuid = msg->u.event.transaction_uuid; + ParodusInfo("Notification transaction_uuid %s\n", notif_wrp_msg->u.event.transaction_uuid); + } + if(msg->u.event.content_type != NULL) { if(strcmp(msg->u.event.content_type , "JSON") == 0) @@ -342,6 +351,7 @@ void sendXmidtEventToServer(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle } ParodusInfo("content_type is %s\n",notif_wrp_msg->u.event.content_type); } + if(msg->u.event.payload != NULL) { ParodusInfo("Notification payload: %s\n",msg->u.event.payload); @@ -404,7 +414,7 @@ void sendXmidtEventToServer(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle } else { - errorMsg = strdup("send to server failed"); + errorMsg = strdup("send failed due to client disconnect"); ParodusInfo("The event is having low qos proceed to dequeue\n"); createOutParamsandSendAck(msg, asyncHandle, errorMsg, CLIENT_DISCONNECT); xmidtQDequeue(); @@ -424,9 +434,9 @@ void sendXmidtEventToServer(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle } else { - errorMsg = strdup("wrp struct memory allocation failed"); - ParodusInfo("wrp struct memory allocation failed\n"); - createOutParamsandSendAck(msg, asyncHandle, errorMsg, WRP_MALLOC_FAILURE); + errorMsg = strdup("Memory allocation failed"); + ParodusInfo("Memory allocation failed\n"); + createOutParamsandSendAck(msg, asyncHandle, errorMsg, MSG_PROCESSING_FAILED); xmidtQDequeue(); } @@ -447,67 +457,6 @@ void sendXmidtEventToServer(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle } -//To send ACK when msg is NULL -void sendACK(rbusMethodAsyncHandle_t asyncHandle, char *errorMsg, int statuscode) -{ - rbusObject_t outParams; - rbusError_t err; - rbusValue_t value; - - ParodusInfo("createOutParams\n"); - - rbusValue_Init(&value); - rbusValue_SetString(value, "event"); - rbusObject_Init(&outParams, NULL); - rbusObject_SetValue(outParams, "msg_type", value); - rbusValue_Release(value); - - ParodusInfo("statuscode %d errorMsg %s\n", statuscode, errorMsg); - rbusValue_Init(&value); - rbusValue_SetInt32(value, statuscode); - rbusObject_SetValue(outParams, "status", value); - rbusValue_Release(value); - - if(errorMsg !=NULL) - { - rbusValue_Init(&value); - rbusValue_SetString(value, errorMsg); - rbusObject_SetValue(outParams, "error_message", value); - rbusValue_Release(value); - free(errorMsg); - } - - if(outParams !=NULL) - { - rbusObject_fwrite(outParams, 1, stdout); - if(asyncHandle == NULL) - { - ParodusInfo("asyncHandle is NULL\n"); - return; - } - - err = rbusMethod_SendAsyncResponse(asyncHandle, RBUS_ERROR_SUCCESS, outParams); - - ParodusInfo("err is %d RBUS_ERROR_SUCCESS %d\n", err, RBUS_ERROR_SUCCESS); - if(err != RBUS_ERROR_SUCCESS) - { - ParodusError("rbusMethod_SendAsyncResponse failed err:%d\n", err); - } - else - { - ParodusInfo("rbusMethod_SendAsyncResponse success:%d\n", err); - } - - rbusObject_Release(outParams); - } - else - { - ParodusError("Failed to create outParams\n"); - } - - return; -} - void createOutParamsandSendAck(wrp_msg_t *msg, rbusMethodAsyncHandle_t asyncHandle, char *errorMsg, int statuscode) { rbusObject_t outParams; @@ -515,12 +464,6 @@ void createOutParamsandSendAck(wrp_msg_t *msg, rbusMethodAsyncHandle_t asyncHand rbusValue_t value; char qosstring[20] = ""; - if(msg == NULL) - { - ParodusError("msg is NULL\n"); - return; - } - ParodusInfo("createOutParams\n"); rbusValue_Init(&value); @@ -529,41 +472,6 @@ void createOutParamsandSendAck(wrp_msg_t *msg, rbusMethodAsyncHandle_t asyncHand rbusObject_SetValue(outParams, "msg_type", value); rbusValue_Release(value); - if(msg->u.event.source !=NULL) - { - ParodusInfo("msg->u.event.source is %s\n", msg->u.event.source); - rbusValue_Init(&value); - rbusValue_SetString(value, msg->u.event.source); - rbusObject_SetValue(outParams, "source", value); - rbusValue_Release(value); - } - - if(msg->u.event.dest !=NULL) - { - ParodusInfo("Inside dest\n"); - rbusValue_Init(&value); - rbusValue_SetString(value, msg->u.event.dest); - rbusObject_SetValue(outParams, "dest", value); - rbusValue_Release(value); - } - - if(msg->u.event.content_type !=NULL) - { - ParodusInfo("Inside content_type\n"); - rbusValue_Init(&value); - rbusValue_SetString(value, msg->u.event.content_type); - rbusObject_SetValue(outParams, "content_type", value); - rbusValue_Release(value); - } - - rbusValue_Init(&value); - ParodusInfo("msg->u.event.qos int %d\n", msg->u.event.qos); - snprintf(qosstring, sizeof(qosstring), "%d", msg->u.event.qos); - ParodusInfo("qosstring is %s\n", qosstring); - rbusValue_SetString(value, qosstring); - rbusObject_SetValue(outParams, "qos", value); - rbusValue_Release(value); - ParodusInfo("statuscode %d errorMsg %s\n", statuscode, errorMsg); rbusValue_Init(&value); rbusValue_SetInt32(value, statuscode); @@ -579,13 +487,51 @@ void createOutParamsandSendAck(wrp_msg_t *msg, rbusMethodAsyncHandle_t asyncHand free(errorMsg); } - if(msg->u.event.transaction_uuid !=NULL) + if(msg != NULL) { + if(msg->u.event.source !=NULL) + { + ParodusInfo("msg->u.event.source is %s\n", msg->u.event.source); + rbusValue_Init(&value); + rbusValue_SetString(value, msg->u.event.source); + rbusObject_SetValue(outParams, "source", value); + rbusValue_Release(value); + } + + if(msg->u.event.dest !=NULL) + { + ParodusInfo("Inside dest\n"); + rbusValue_Init(&value); + rbusValue_SetString(value, msg->u.event.dest); + rbusObject_SetValue(outParams, "dest", value); + rbusValue_Release(value); + } + + if(msg->u.event.content_type !=NULL) + { + ParodusInfo("Inside content_type\n"); + rbusValue_Init(&value); + rbusValue_SetString(value, msg->u.event.content_type); + rbusObject_SetValue(outParams, "content_type", value); + rbusValue_Release(value); + } + rbusValue_Init(&value); - rbusValue_SetString(value, msg->u.event.transaction_uuid); - rbusObject_SetValue(outParams, "transaction_uuid", value); + ParodusInfo("msg->u.event.qos int %d\n", msg->u.event.qos); + snprintf(qosstring, sizeof(qosstring), "%d", msg->u.event.qos); + ParodusInfo("qosstring is %s\n", qosstring); + rbusValue_SetString(value, qosstring); + rbusObject_SetValue(outParams, "qos", value); rbusValue_Release(value); - ParodusInfo("outParams msg->u.event.transaction_uuid %s\n", msg->u.event.transaction_uuid); + + if(msg->u.event.transaction_uuid !=NULL) + { + rbusValue_Init(&value); + rbusValue_SetString(value, msg->u.event.transaction_uuid); + rbusObject_SetValue(outParams, "transaction_uuid", value); + rbusValue_Release(value); + ParodusInfo("outParams msg->u.event.transaction_uuid %s\n", msg->u.event.transaction_uuid); + } } if(outParams !=NULL) @@ -825,7 +771,7 @@ static rbusError_t sendDataHandler(rbusHandle_t handle, char const* methodName, wrp_msg_t *wrpMsg= NULL; ParodusInfo("methodHandler called: %s\n", methodName); //rbusObject_fwrite(inParams, 1, stdout); - printRBUSParams(inParams, "/tmp/inparams.txt"); + printRBUSParams(inParams, INPARAMS_PATH); if((methodName !=NULL) && (strcmp(methodName, XMIDT_SEND_METHOD) == 0)) { diff --git a/src/xmidtsend_rbus.h b/src/xmidtsend_rbus.h index cc654d9..dc4e38f 100644 --- a/src/xmidtsend_rbus.h +++ b/src/xmidtsend_rbus.h @@ -31,6 +31,7 @@ extern "C" { #define XMIDT_SEND_METHOD "Device.X_RDK_Xmidt.SendData" #define MAX_QUEUE_SIZE 10 +#define INPARAMS_PATH "/tmp/inparams.txt" /*----------------------------------------------------------------------------*/ /* Data Structures */ /*----------------------------------------------------------------------------*/ @@ -51,9 +52,8 @@ typedef enum MISSING_PAYLOAD, MISSING_PAYLOADLEN, QUEUE_SIZE_EXCEEDED, - WRP_MESSAGE_NULL, WRP_ENCODE_FAILURE, - WRP_MALLOC_FAILURE, + MSG_PROCESSING_FAILED, ENQUEUE_FAILURE = 100, CLIENT_DISCONNECT = 101 } XMIDT_STATUS; @@ -75,7 +75,7 @@ int validateXmidtData(wrp_msg_t * eventMsg, char **errorMsg, int *statusCode); void xmidtQDequeue(); bool highQosValueCheck(int qos); void waitTillConnectionIsUp(); -void sendACK(rbusMethodAsyncHandle_t asyncHandle, char *errorMsg, int statuscode); +void printRBUSParams(rbusObject_t params, char* file_path); #ifdef __cplusplus } #endif From 223e7db81cb95c865ddc8dbeb59a1e5ecfe3c04d Mon Sep 17 00:00:00 2001 From: Guru Chandru Date: Tue, 5 Apr 2022 20:00:19 +0530 Subject: [PATCH 049/137] Valgrind leak fix for cloud status and device_id --- src/config.c | 2 +- src/xmidtsend_rbus.c | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/config.c b/src/config.c index fe0da54..0494ba3 100644 --- a/src/config.c +++ b/src/config.c @@ -84,7 +84,7 @@ void set_cloud_status(char *status) if(status != NULL) { pthread_mutex_lock(&config_mut); - get_parodus_cfg()->cloud_status = strdup(status); + get_parodus_cfg()->cloud_status = status; if(strcmp (status, CLOUD_STATUS_ONLINE) == 0) { pthread_cond_signal(&cloud_status_cond); diff --git a/src/xmidtsend_rbus.c b/src/xmidtsend_rbus.c index 61c628c..8ae87c8 100644 --- a/src/xmidtsend_rbus.c +++ b/src/xmidtsend_rbus.c @@ -329,6 +329,11 @@ void sendXmidtEventToServer(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle { ParodusError("Failed to get device_id\n"); } + if(device_id != NULL) + { + free(device_id); + device_id = NULL; + } } if(msg->u.event.dest != NULL) From 13309a737ebc65652c9d8c397024b2f575d80aec Mon Sep 17 00:00:00 2001 From: Shilpa Seshadri Date: Thu, 7 Apr 2022 12:40:21 +0530 Subject: [PATCH 050/137] Reconnect to cloud on every wan failover event --- src/upstream_rbus.c | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/upstream_rbus.c b/src/upstream_rbus.c index efb34a4..8d1b022 100644 --- a/src/upstream_rbus.c +++ b/src/upstream_rbus.c @@ -163,7 +163,20 @@ void eventReceiveHandler( rbusHandle_t rbus_Handle, rbusEvent_t const* event, rb setWebpaInterface(interface); } if(newValue !=NULL && oldValue!=NULL && interface!=NULL) { - ParodusInfo("New Value: %s Old Value: %s New Interface Value: %s\n", rbusValue_GetString(newValue, NULL), rbusValue_GetString(oldValue, NULL), interface); + ParodusInfo("New Value: %s Old Value: %s New Interface Value: %s\n", rbusValue_GetString(newValue, NULL), rbusValue_GetString(oldValue, NULL), interface); + + // If interface is already down then reset it and reconnect cloud conn as wan failover event is received + if(get_interface_down_event()) + { + reset_interface_down_event(); + ParodusInfo("Interface_down_event is reset\n"); + resume_heartBeatTimer(); + } + // Close cloud conn and reconnect with the new interface as wan failover event is received + set_global_reconnect_reason("WAN_FAILOVER"); + set_global_reconnect_status(true); + set_close_retry(); + } } #endif From d1462de56a10ae548d1a1635d1da31bb5625d904 Mon Sep 17 00:00:00 2001 From: Sadhyama Vengilat Date: Thu, 7 Apr 2022 15:03:00 +0530 Subject: [PATCH 051/137] Convert device mac to lowercase --- src/config.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/config.c b/src/config.c index 0494ba3..3a768da 100644 --- a/src/config.c +++ b/src/config.c @@ -185,9 +185,9 @@ void read_key_from_file (const char *fname, char *buf, size_t buflen) int parse_mac_address (char *target, const char *arg) { int count = 0; - int i; + int i, j; char c; - + char *mac = target; for (i=0; (c=arg[i]) != 0; i++) { if (c !=':') count++; @@ -199,6 +199,13 @@ int parse_mac_address (char *target, const char *arg) *(target++) = c; } *target = 0; // terminating null + + //convert mac to lowercase + for(j = 0; mac[j]; j++) + { + mac[j] = tolower(mac[j]); + } + ParodusInfo("mac in lowercase is %s\n", mac); return 0; } From dc935f9a09657e3352b27809d70561fc47f70fa4 Mon Sep 17 00:00:00 2001 From: Sadhyama Vengilat Date: Thu, 7 Apr 2022 21:04:55 +0530 Subject: [PATCH 052/137] Debug log reduction and formatting --- src/config.c | 5 +- src/conn_interface.c | 2 - src/upstream.c | 2 +- src/xmidtsend_rbus.c | 204 ++++++++++++++++++------------------------- src/xmidtsend_rbus.h | 2 +- 5 files changed, 87 insertions(+), 128 deletions(-) diff --git a/src/config.c b/src/config.c index 3a768da..2477c20 100644 --- a/src/config.c +++ b/src/config.c @@ -33,9 +33,8 @@ /*----------------------------------------------------------------------------*/ /* File Scoped Variables */ /*----------------------------------------------------------------------------*/ -//#ifdef WAN_FAILOVER_SUPPORTED pthread_mutex_t config_mut=PTHREAD_MUTEX_INITIALIZER; -//#endif + //For sending cond signal when cloud status is ONLINE pthread_mutex_t cloud_status_mut=PTHREAD_MUTEX_INITIALIZER; pthread_cond_t cloud_status_cond=PTHREAD_COND_INITIALIZER; @@ -205,7 +204,7 @@ int parse_mac_address (char *target, const char *arg) { mac[j] = tolower(mac[j]); } - ParodusInfo("mac in lowercase is %s\n", mac); + ParodusPrint("mac in lowercase is %s\n", mac); return 0; } diff --git a/src/conn_interface.c b/src/conn_interface.c index 7b974ee..581cad1 100644 --- a/src/conn_interface.c +++ b/src/conn_interface.c @@ -115,9 +115,7 @@ void createSocketConnection(void (* initKeypress)()) StartThread(processUpstreamMessage, &upstream_msg_tid); #ifdef ENABLE_WEBCFGBIN subscribeRBUSevent(); - ParodusInfo("B4 regXmidtSendDataMethod\n"); regXmidtSendDataMethod(); - ParodusInfo("After regXmidtSendDataMethod\n"); #endif #ifdef WAN_FAILOVER_SUPPORTED subscribeCurrentActiveInterfaceEvent(); diff --git a/src/upstream.c b/src/upstream.c index d0a8072..e01da62 100644 --- a/src/upstream.c +++ b/src/upstream.c @@ -630,7 +630,7 @@ int sendUpstreamMsgToServer(void **resp_bytes, size_t resp_size) ParodusError("Failed to send upstream as metadata packing is not successful\n"); sendRetStatus = 1; } - ParodusInfo("Printing sendRetStatus in send %d\n", sendRetStatus); + ParodusPrint("sendRetStatus is %d\n", sendRetStatus); return sendRetStatus; } diff --git a/src/xmidtsend_rbus.c b/src/xmidtsend_rbus.c index 8ae87c8..95cb2e0 100644 --- a/src/xmidtsend_rbus.c +++ b/src/xmidtsend_rbus.c @@ -17,7 +17,7 @@ /** * @file xmidtsend_rbus.c * - * @description Parodus to register as a provider for "xmidt_sendData" and provide the functionality to send the telemetry payload via Xmidt using the parameters supplied to the xmidt_sendData function. + * @ To provide Xmidt send RBUS method to send events upstream. * */ @@ -38,26 +38,6 @@ pthread_mutex_t xmidt_mut=PTHREAD_MUTEX_INITIALIZER; pthread_cond_t xmidt_con=PTHREAD_COND_INITIALIZER; -XmidtMsg * get_global_XmidtMsgQ(void) -{ - return XmidtMsgQ; -} - -void set_global_XmidtMsgQ(XmidtMsg * xUpStreamQ) -{ - XmidtMsgQ = xUpStreamQ; -} - -pthread_cond_t *get_global_xmidt_con(void) -{ - return &xmidt_con; -} - -pthread_mutex_t *get_global_xmidt_mut(void) -{ - return &xmidt_mut; -} - bool highQosValueCheck(int qos) { if(qos > 24) @@ -67,7 +47,7 @@ bool highQosValueCheck(int qos) } else { - ParodusInfo("The qos value is low\n"); + ParodusPrint("The qos value is low\n"); } return false; @@ -79,16 +59,16 @@ void addToXmidtUpstreamQ(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle) { XmidtMsg *message; - ParodusInfo("XmidtQsize is %d\n" , XmidtQsize); + ParodusPrint("XmidtQsize is %d\n" , XmidtQsize); if(XmidtQsize == MAX_QUEUE_SIZE) { char * errorMsg = strdup("Max Queue Size Exceeded"); - ParodusInfo("Queue Size Exceeded\n"); + ParodusError("Queue Size Exceeded\n"); createOutParamsandSendAck(msg, asyncHandle, errorMsg , QUEUE_SIZE_EXCEEDED); return; } - ParodusInfo ("Add Xmidt Upstream message to queue\n"); + ParodusPrint ("Add Xmidt Upstream message to queue\n"); message = (XmidtMsg *)malloc(sizeof(XmidtMsg)); if(message) @@ -104,10 +84,10 @@ void addToXmidtUpstreamQ(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle) { XmidtMsgQ = message; - ParodusInfo("Producer added xmidt message\n"); + ParodusPrint("Producer added xmidt message\n"); pthread_cond_signal(&xmidt_con); pthread_mutex_unlock (&xmidt_mut); - ParodusInfo("mutex unlock in xmidt producer\n"); + ParodusPrint("mutex unlock in xmidt producer\n"); } else { @@ -126,29 +106,9 @@ void addToXmidtUpstreamQ(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle) ParodusError("failure in allocation for xmidt message\n"); createOutParamsandSendAck(msg, asyncHandle, errorMsg , ENQUEUE_FAILURE); } - ParodusInfo ("End of addToXmidtUpstreamQ\n"); return; } -//To remove an event from Queue -void xmidtQDequeue() -{ - XmidtMsg *temp = NULL; - pthread_mutex_lock (&xmidt_mut); - if(XmidtMsgQ != NULL) - { - temp = XmidtMsgQ; - XmidtMsgQ = XmidtMsgQ->next; - XmidtQsize -= 1; - free(temp); - } - else - { - ParodusError("XmidtMsgQ is NULL\n"); - } - pthread_mutex_unlock (&xmidt_mut); -} - //Xmidt consumer thread to process the rbus events. void processXmidtData() { @@ -170,15 +130,14 @@ void* processXmidtUpstreamMsg() { while(FOREVER()) { - ParodusInfo("xmidt mutex b4 lock\n"); pthread_mutex_lock (&xmidt_mut); - ParodusInfo("mutex lock in xmidt consumer thread\n"); + ParodusPrint("mutex lock in xmidt consumer thread\n"); if(XmidtMsgQ != NULL) { XmidtMsg *Data = XmidtMsgQ; pthread_mutex_unlock (&xmidt_mut); - ParodusInfo("mutex unlock in xmidt consumer thread\n"); + ParodusPrint("mutex unlock in xmidt consumer thread\n"); processData(Data->msg, Data->asyncHandle); } else @@ -188,15 +147,16 @@ void* processXmidtUpstreamMsg() pthread_mutex_unlock (&xmidt_mut); break; } - ParodusInfo("Before pthread cond wait in xmidt consumer thread\n"); + ParodusPrint("Before cond wait in xmidt consumer thread\n"); pthread_cond_wait(&xmidt_con, &xmidt_mut); pthread_mutex_unlock (&xmidt_mut); - ParodusInfo("mutex unlock in xmidt consumer thread after cond wait\n"); + ParodusPrint("mutex unlock in xmidt thread after cond wait\n"); } } return NULL; } +//To validate and send events upstream void processData(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle) { int rv = 0; @@ -214,23 +174,41 @@ void processData(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle) } rv = validateXmidtData(xmidtMsg, &errorMsg, &statuscode); - ParodusInfo("After validateXmidtData, errorMsg %s statuscode %d\n", errorMsg, statuscode); + ParodusPrint("validateXmidtData, errorMsg %s statuscode %d\n", errorMsg, statuscode); if(rv) { - ParodusInfo("validation successful, send event to server\n"); + ParodusPrint("validation successful, send event to server\n"); sendXmidtEventToServer(xmidtMsg, asyncHandle); return; } else { ParodusError("validation failed, send failure ack\n"); - ParodusInfo("errorMsg %s\n", errorMsg); createOutParamsandSendAck(xmidtMsg, asyncHandle, errorMsg , statuscode); xmidtQDequeue(); } return; } +//To remove an event from Queue +void xmidtQDequeue() +{ + XmidtMsg *temp = NULL; + pthread_mutex_lock (&xmidt_mut); + if(XmidtMsgQ != NULL) + { + temp = XmidtMsgQ; + XmidtMsgQ = XmidtMsgQ->next; + XmidtQsize -= 1; + free(temp); + } + else + { + ParodusError("XmidtMsgQ is NULL\n"); + } + pthread_mutex_unlock (&xmidt_mut); +} + int validateXmidtData(wrp_msg_t * eventMsg, char **errorMsg, int *statusCode) { if(eventMsg == NULL) @@ -243,7 +221,7 @@ int validateXmidtData(wrp_msg_t * eventMsg, char **errorMsg, int *statusCode) { *errorMsg = strdup("Message format is invalid"); *statusCode = INVALID_MSG_TYPE; - ParodusError("*errorMsg %s *statusCode %d\n", *errorMsg, *statusCode); + ParodusError("errorMsg %s statusCode %d\n", *errorMsg, *statusCode); return 0; } @@ -251,7 +229,7 @@ int validateXmidtData(wrp_msg_t * eventMsg, char **errorMsg, int *statusCode) { *errorMsg = strdup("Missing source"); *statusCode = MISSING_SOURCE; - ParodusError("*errorMsg %s *statusCode %d\n", *errorMsg, *statusCode); + ParodusError("errorMsg %s statusCode %d\n", *errorMsg, *statusCode); return 0; } @@ -259,7 +237,7 @@ int validateXmidtData(wrp_msg_t * eventMsg, char **errorMsg, int *statusCode) { *errorMsg = strdup("Missing dest"); *statusCode = MISSING_DEST; - ParodusError("*errorMsg %s *statusCode %d\n", *errorMsg, *statusCode); + ParodusError("errorMsg %s statusCode %d\n", *errorMsg, *statusCode); return 0; } @@ -267,7 +245,7 @@ int validateXmidtData(wrp_msg_t * eventMsg, char **errorMsg, int *statusCode) { *errorMsg = strdup("Missing content_type"); *statusCode = MISSING_CONTENT_TYPE; - ParodusError("*errorMsg %s *statusCode %d\n", *errorMsg, *statusCode); + ParodusError("errorMsg %s statusCode %d\n", *errorMsg, *statusCode); return 0; } @@ -275,7 +253,7 @@ int validateXmidtData(wrp_msg_t * eventMsg, char **errorMsg, int *statusCode) { *errorMsg = strdup("Missing payload"); *statusCode = MISSING_PAYLOAD; - ParodusError("*errorMsg %s *statusCode %d\n", *errorMsg, *statusCode); + ParodusError("errorMsg %s statusCode %d\n", *errorMsg, *statusCode); return 0; } @@ -283,11 +261,11 @@ int validateXmidtData(wrp_msg_t * eventMsg, char **errorMsg, int *statusCode) { *errorMsg = strdup("Missing payloadlen"); *statusCode = MISSING_PAYLOADLEN; - ParodusError("*errorMsg %s *statusCode %d\n", *errorMsg, *statusCode); + ParodusError("errorMsg %s statusCode %d\n", *errorMsg, *statusCode); return 0; } - ParodusInfo("validateXmidtData success. *errorMsg %s *statusCode %d\n", *errorMsg, *statusCode); + ParodusPrint("validateXmidtData success. errorMsg %s statusCode %d\n", *errorMsg, *statusCode); return 1; } @@ -304,14 +282,13 @@ void sendXmidtEventToServer(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle char *errorMsg = NULL; int qos = 0; - ParodusInfo("In sendXmidtEventToServer\n"); notif_wrp_msg = (wrp_msg_t *)malloc(sizeof(wrp_msg_t)); if(notif_wrp_msg != NULL) { memset(notif_wrp_msg, 0, sizeof(wrp_msg_t)); notif_wrp_msg->msg_type = WRP_MSG_TYPE__EVENT; - ParodusInfo("msg->u.event.source: %s\n",msg->u.event.source); + ParodusPrint("msg->u.event.source: %s\n",msg->u.event.source); if(msg->u.event.source !=NULL) { @@ -319,11 +296,11 @@ void sendXmidtEventToServer(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle ret = getDeviceId(&device_id, &device_id_len); if(ret == 0) { - ParodusInfo("device_id %s device_id_len %lu\n", device_id, device_id_len); + ParodusPrint("device_id %s device_id_len %lu\n", device_id, device_id_len); snprintf(sourceStr, sizeof(sourceStr), "%s/%s", device_id, msg->u.event.source); - ParodusInfo("sourceStr formed is %s\n" , sourceStr); + ParodusPrint("sourceStr formed is %s\n" , sourceStr); notif_wrp_msg->u.event.source = strdup(sourceStr); - ParodusInfo("notif_wrp_msg->u.event.source is %s\n", notif_wrp_msg->u.event.source); + ParodusInfo("source:%s\n", notif_wrp_msg->u.event.source); } else { @@ -345,7 +322,7 @@ void sendXmidtEventToServer(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle if(msg->u.event.transaction_uuid != NULL) { notif_wrp_msg->u.event.transaction_uuid = msg->u.event.transaction_uuid; - ParodusInfo("Notification transaction_uuid %s\n", notif_wrp_msg->u.event.transaction_uuid); + ParodusPrint("Notification transaction_uuid %s\n", notif_wrp_msg->u.event.transaction_uuid); } if(msg->u.event.content_type != NULL) @@ -354,7 +331,7 @@ void sendXmidtEventToServer(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle { notif_wrp_msg->u.event.content_type = strdup("application/json"); } - ParodusInfo("content_type is %s\n",notif_wrp_msg->u.event.content_type); + ParodusPrint("content_type is %s\n",notif_wrp_msg->u.event.content_type); } if(msg->u.event.payload != NULL) @@ -362,7 +339,7 @@ void sendXmidtEventToServer(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle ParodusInfo("Notification payload: %s\n",msg->u.event.payload); notif_wrp_msg->u.event.payload = (void *)msg->u.event.payload; notif_wrp_msg->u.event.payload_size = msg->u.event.payload_size; - ParodusInfo("payload size %lu\n", notif_wrp_msg->u.event.payload_size); + ParodusPrint("payload size %lu\n", notif_wrp_msg->u.event.payload_size); } if(msg->u.event.qos != 0) @@ -371,30 +348,27 @@ void sendXmidtEventToServer(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle qos = notif_wrp_msg->u.event.qos; ParodusInfo("Notification qos: %d\n",notif_wrp_msg->u.event.qos); } - ParodusInfo("Encode xmidt wrp msg\n"); msg_len = wrp_struct_to (notif_wrp_msg, WRP_BYTES, &msg_bytes); - ParodusInfo("Encoded xmidt wrp msg, msg_len %lu\n", msg_len); + ParodusPrint("Encoded xmidt wrp msg, msg_len %lu\n", msg_len); if(msg_len > 0) { - ParodusInfo("sendUpstreamMsgToServer\n"); + ParodusPrint("sendUpstreamMsgToServer\n"); sendRetStatus = sendUpstreamMsgToServer(&msg_bytes, msg_len); } else { - ParodusInfo("The msg_len is zero\n"); + ParodusError("wrp msg_len is zero\n"); errorMsg = strdup("Wrp message encoding failed"); createOutParamsandSendAck(msg, asyncHandle, errorMsg, WRP_ENCODE_FAILURE); xmidtQDequeue(); - ParodusInfo("B4 wrp_free_struct\n"); + ParodusPrint("wrp_free_struct\n"); if(notif_wrp_msg != NULL) { - ParodusInfo("Inside the free wrp\n"); wrp_free_struct(notif_wrp_msg); } - ParodusInfo("After wrp_free_struct\n"); if(msg_bytes != NULL) { free(msg_bytes); @@ -405,17 +379,16 @@ void sendXmidtEventToServer(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle while(sendRetStatus) //If SendMessage is failed condition { - ParodusInfo("sendXmidtEventToServer is Failed\n"); + ParodusError("sendXmidtEventToServer is Failed\n"); if(highQosValueCheck(qos)) { - ParodusInfo("The event is having high qos retry again \n"); - ParodusInfo("The value of pointer xmidt->msg is %p\n", XmidtMsgQ->msg); + ParodusPrint("The event is having high qos retry again\n"); ParodusInfo("Wait till connection is Up\n"); pthread_mutex_lock(get_global_cloud_status_mut()); pthread_cond_wait(get_global_cloud_status_cond(), get_global_cloud_status_mut()); pthread_mutex_unlock(get_global_cloud_status_mut()); - ParodusInfo("Received signal proceed to retry\n"); + ParodusInfo("Received cloud status signal proceed to retry\n"); } else { @@ -426,7 +399,6 @@ void sendXmidtEventToServer(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle break; } sendRetStatus = sendUpstreamMsgToServer(&msg_bytes, msg_len); - ParodusInfo("After sendRetStatus async pointer is %p for qos %d\n", asyncHandle, qos); } if(sendRetStatus == 0) @@ -440,26 +412,22 @@ void sendXmidtEventToServer(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle else { errorMsg = strdup("Memory allocation failed"); - ParodusInfo("Memory allocation failed\n"); + ParodusError("Memory allocation failed\n"); createOutParamsandSendAck(msg, asyncHandle, errorMsg, MSG_PROCESSING_FAILED); xmidtQDequeue(); } - ParodusInfo("B4 wrp_free_struct\n"); + ParodusPrint("B4 notif wrp_free_struct\n"); if(notif_wrp_msg != NULL) { - ParodusInfo("Inside the free wrp\n"); wrp_free_struct(notif_wrp_msg); } - ParodusInfo("After wrp_free_struct\n"); if(msg_bytes != NULL) { free(msg_bytes); msg_bytes = NULL; } - ParodusInfo("sendXmidtEventToServer done\n"); - } void createOutParamsandSendAck(wrp_msg_t *msg, rbusMethodAsyncHandle_t asyncHandle, char *errorMsg, int statuscode) @@ -469,15 +437,13 @@ void createOutParamsandSendAck(wrp_msg_t *msg, rbusMethodAsyncHandle_t asyncHand rbusValue_t value; char qosstring[20] = ""; - ParodusInfo("createOutParams\n"); - rbusValue_Init(&value); rbusValue_SetString(value, "event"); rbusObject_Init(&outParams, NULL); rbusObject_SetValue(outParams, "msg_type", value); rbusValue_Release(value); - ParodusInfo("statuscode %d errorMsg %s\n", statuscode, errorMsg); + ParodusPrint("statuscode %d errorMsg %s\n", statuscode, errorMsg); rbusValue_Init(&value); rbusValue_SetInt32(value, statuscode); rbusObject_SetValue(outParams, "status", value); @@ -496,7 +462,7 @@ void createOutParamsandSendAck(wrp_msg_t *msg, rbusMethodAsyncHandle_t asyncHand { if(msg->u.event.source !=NULL) { - ParodusInfo("msg->u.event.source is %s\n", msg->u.event.source); + ParodusPrint("msg->u.event.source is %s\n", msg->u.event.source); rbusValue_Init(&value); rbusValue_SetString(value, msg->u.event.source); rbusObject_SetValue(outParams, "source", value); @@ -505,7 +471,6 @@ void createOutParamsandSendAck(wrp_msg_t *msg, rbusMethodAsyncHandle_t asyncHand if(msg->u.event.dest !=NULL) { - ParodusInfo("Inside dest\n"); rbusValue_Init(&value); rbusValue_SetString(value, msg->u.event.dest); rbusObject_SetValue(outParams, "dest", value); @@ -514,7 +479,6 @@ void createOutParamsandSendAck(wrp_msg_t *msg, rbusMethodAsyncHandle_t asyncHand if(msg->u.event.content_type !=NULL) { - ParodusInfo("Inside content_type\n"); rbusValue_Init(&value); rbusValue_SetString(value, msg->u.event.content_type); rbusObject_SetValue(outParams, "content_type", value); @@ -522,7 +486,6 @@ void createOutParamsandSendAck(wrp_msg_t *msg, rbusMethodAsyncHandle_t asyncHand } rbusValue_Init(&value); - ParodusInfo("msg->u.event.qos int %d\n", msg->u.event.qos); snprintf(qosstring, sizeof(qosstring), "%d", msg->u.event.qos); ParodusInfo("qosstring is %s\n", qosstring); rbusValue_SetString(value, qosstring); @@ -535,30 +498,29 @@ void createOutParamsandSendAck(wrp_msg_t *msg, rbusMethodAsyncHandle_t asyncHand rbusValue_SetString(value, msg->u.event.transaction_uuid); rbusObject_SetValue(outParams, "transaction_uuid", value); rbusValue_Release(value); - ParodusInfo("outParams msg->u.event.transaction_uuid %s\n", msg->u.event.transaction_uuid); + ParodusPrint("outParams msg->u.event.transaction_uuid %s\n", msg->u.event.transaction_uuid); } } if(outParams !=NULL) { - rbusObject_fwrite(outParams, 1, stdout); + //rbusObject_fwrite(outParams, 1, stdout); if(asyncHandle == NULL) { - ParodusInfo("asyncHandle is NULL\n"); + ParodusError("asyncHandle is NULL\n"); return; } err = rbusMethod_SendAsyncResponse(asyncHandle, RBUS_ERROR_SUCCESS, outParams); //err = rbusMethod_SendAsyncResponse(asyncHandle, RBUS_ERROR_INVALID_RESPONSE_FROM_DESTINATION, outParams); //for negative case - ParodusInfo("err is %d RBUS_ERROR_SUCCESS %d\n", err, RBUS_ERROR_SUCCESS); if(err != RBUS_ERROR_SUCCESS) { - ParodusError("rbusMethod_SendAsyncResponse failed err:%d\n", err); + ParodusError("rbusMethod_SendAsyncResponse failed err: %d\n", err); } else { - ParodusInfo("rbusMethod_SendAsyncResponse success:%d\n", err); + ParodusInfo("rbusMethod_SendAsyncResponse success: %d\n", err); } rbusObject_Release(outParams); @@ -579,7 +541,7 @@ int checkInputParameters(rbusObject_t inParams) rbusValue_t check = rbusObject_GetValue(inParams, "check"); if(check) { - ParodusInfo("Rbus check method. Not proceeding to process this inparam\n"); + ParodusPrint("Rbus check method. Not proceeding to process this inparam\n"); return 0; } return 1; @@ -609,15 +571,17 @@ void parseRbusInparamsToWrp(rbusObject_t inParams, char *trans_id, wrp_msg_t **e char *destStr = NULL, *contenttypeStr = NULL; char *payloadStr = NULL, *qosVal = NULL; unsigned int payloadlength = 0; - wrp_msg_t *msg = NULL; msg = ( wrp_msg_t * ) malloc( sizeof( wrp_msg_t ) ); - if(msg != NULL) + if(msg == NULL) { - memset( msg, 0, sizeof( wrp_msg_t ) ); + ParodusError("Wrp msg allocation failed\n"); + return; } + memset( msg, 0, sizeof( wrp_msg_t ) ); + rbusValue_t msg_type = rbusObject_GetValue(inParams, "msg_type"); if(msg_type) { @@ -702,8 +666,8 @@ void parseRbusInparamsToWrp(rbusObject_t inParams, char *trans_id, wrp_msg_t **e if(payloadStr !=NULL) { ParodusInfo("payload received is %s\n", payloadStr); - msg->u.event.payload = strdup(payloadStr); //free - ParodusInfo("msg->u.event.payload is %s\n", msg->u.event.payload); + msg->u.event.payload = strdup(payloadStr); + ParodusPrint("msg->u.event.payload is %s\n", msg->u.event.payload); } else { @@ -733,7 +697,7 @@ void parseRbusInparamsToWrp(rbusObject_t inParams, char *trans_id, wrp_msg_t **e ParodusError("payloadlen is empty\n"); } - ParodusInfo("check qos\n"); + ParodusPrint("check qos\n"); rbusValue_t qos = rbusObject_GetValue(inParams, "qos"); if(qos) { @@ -741,7 +705,7 @@ void parseRbusInparamsToWrp(rbusObject_t inParams, char *trans_id, wrp_msg_t **e { ParodusPrint("qos type %d RBUS_STRING %d\n", rbusValue_GetType(qos), RBUS_STRING); qosVal = (char *)rbusValue_GetString(qos, NULL); - ParodusInfo("qos received is %s\n", qosVal); + ParodusPrint("qos received is %s\n", qosVal); if(qosVal !=NULL) { msg->u.event.qos = atoi(qosVal); @@ -752,11 +716,11 @@ void parseRbusInparamsToWrp(rbusObject_t inParams, char *trans_id, wrp_msg_t **e if(trans_id !=NULL) { - ParodusInfo("Add trans_id %s to wrp message\n", trans_id); + ParodusPrint("Add trans_id %s to wrp message\n", trans_id); msg->u.event.transaction_uuid = strdup(trans_id); free(trans_id); trans_id = NULL; - ParodusInfo("msg->u.event.transaction_uuid is %s\n", msg->u.event.transaction_uuid); + ParodusPrint("msg->u.event.transaction_uuid is %s\n", msg->u.event.transaction_uuid); } else { @@ -764,7 +728,7 @@ void parseRbusInparamsToWrp(rbusObject_t inParams, char *trans_id, wrp_msg_t **e } *eventMsg = msg; - ParodusInfo("parseRbusInparamsToWrp End\n"); + ParodusPrint("parseRbusInparamsToWrp End\n"); } static rbusError_t sendDataHandler(rbusHandle_t handle, char const* methodName, rbusObject_t inParams, rbusObject_t outParams, rbusMethodAsyncHandle_t asyncHandle) @@ -775,8 +739,7 @@ static rbusError_t sendDataHandler(rbusHandle_t handle, char const* methodName, char *transaction_uuid = NULL; wrp_msg_t *wrpMsg= NULL; ParodusInfo("methodHandler called: %s\n", methodName); - //rbusObject_fwrite(inParams, 1, stdout); - printRBUSParams(inParams, INPARAMS_PATH); + //printRBUSParams(inParams, INPARAMS_PATH); if((methodName !=NULL) && (strcmp(methodName, XMIDT_SEND_METHOD) == 0)) { @@ -795,7 +758,7 @@ static rbusError_t sendDataHandler(rbusHandle_t handle, char const* methodName, } else { - ParodusInfo("check method call received, ignoring input\n"); + ParodusPrint("check method call received, ignoring input\n"); } } else @@ -815,10 +778,10 @@ int regXmidtSendDataMethod() rbusHandle_t rbus_handle = get_parodus_rbus_Handle(); - ParodusInfo("Registering xmidt_sendData method %s\n", XMIDT_SEND_METHOD); + ParodusPrint("Registering xmidt sendData method %s\n", XMIDT_SEND_METHOD); if(!rbus_handle) { - ParodusError("regXmidtSendDataMethod failed in getting bus handles\n"); + ParodusError("regXmidtSendDataMethod failed as rbus_handle is empty\n"); return -1; } @@ -826,14 +789,14 @@ int regXmidtSendDataMethod() if(rc != RBUS_ERROR_SUCCESS) { - ParodusError("SendData provider: rbus_regDataElements failed: %d\n", rc); + ParodusError("Register xmidt sendData method failed: %d\n", rc); } else { - ParodusInfo("SendData method provider register success\n"); + ParodusInfo("Register xmidt sendData method %s success\n", XMIDT_SEND_METHOD); } - //start xmidt consumer thread .(should we start from conn_interface.c?) + //start xmidt queue consumer thread . processXmidtData(); return rc; } @@ -841,7 +804,6 @@ int regXmidtSendDataMethod() //To print and store params output to a file void printRBUSParams(rbusObject_t params, char* file_path) { - ParodusInfo("Inside printRBUSParams\n"); if( NULL != params ) { FILE *fd = fopen(file_path, "w+"); diff --git a/src/xmidtsend_rbus.h b/src/xmidtsend_rbus.h index dc4e38f..417c242 100644 --- a/src/xmidtsend_rbus.h +++ b/src/xmidtsend_rbus.h @@ -17,7 +17,7 @@ /** * @file xmidtsend_rbus.h * - * @description This header defines functions required to manage xmidt send messages. + * @description This header defines functions required to manage xmidt send messages via rbus. * */ From 42fc9eb26e0dc7d9b6fbfd953f67e60d37dcfbbd Mon Sep 17 00:00:00 2001 From: Guru Chandru Date: Fri, 8 Apr 2022 12:37:58 +0530 Subject: [PATCH 053/137] Transaction uuid Crash Fix --- src/upstream.c | 10 ++++++++++ src/upstream_rbus.c | 10 ++++++++++ 2 files changed, 20 insertions(+) diff --git a/src/upstream.c b/src/upstream.c index e01da62..f6307d3 100644 --- a/src/upstream.c +++ b/src/upstream.c @@ -328,6 +328,7 @@ void *processUpstreamMessage() if(ret == 1) { wrp_msg_t *eventMsg = (wrp_msg_t *) malloc(sizeof(wrp_msg_t)); + memset( eventMsg, 0, sizeof( wrp_msg_t ) ); eventMsg->msg_type = msgType; eventMsg->u.event.content_type=msg->u.event.content_type; eventMsg->u.event.source=msg->u.event.source; @@ -337,6 +338,15 @@ void *processUpstreamMessage() eventMsg->u.event.headers=msg->u.event.headers; eventMsg->u.event.metadata=msg->u.event.metadata; eventMsg->u.event.partner_ids = partnersList; + if(msg->u.event.transaction_uuid) + { + ParodusPrint("Inside Trans id in PARODUS\n"); + } + else + { + ParodusPrint("Assigning NULL to trans id\n"); + eventMsg->u.event.transaction_uuid = NULL; + } int size = wrp_struct_to( eventMsg, WRP_BYTES, &bytes ); if(size > 0) diff --git a/src/upstream_rbus.c b/src/upstream_rbus.c index ee771f2..49e9665 100644 --- a/src/upstream_rbus.c +++ b/src/upstream_rbus.c @@ -107,6 +107,7 @@ void processWebconfigUpstreamEvent(rbusHandle_t handle, rbusEvent_t const* event if(ret == 1) { wrp_msg_t *eventMsg = (wrp_msg_t *) malloc(sizeof(wrp_msg_t)); + memset( eventMsg, 0, sizeof( wrp_msg_t ) ); eventMsg->msg_type = event_msg->msg_type; eventMsg->u.event.content_type=event_msg->u.event.content_type; eventMsg->u.event.source=event_msg->u.event.source; @@ -116,6 +117,15 @@ void processWebconfigUpstreamEvent(rbusHandle_t handle, rbusEvent_t const* event eventMsg->u.event.headers=event_msg->u.event.headers; eventMsg->u.event.metadata=event_msg->u.event.metadata; eventMsg->u.event.partner_ids = partnersList; + if(event_msg->u.event.transaction_uuid) + { + ParodusPrint("Inside Trans id in PARODUS_rbus\n"); + } + else + { + ParodusPrint("Assigning NULL to trans id RBUS\n"); + eventMsg->u.event.transaction_uuid = NULL; + } int size = wrp_struct_to( eventMsg, WRP_BYTES, &bytes ); if(size > 0) From 254c9f676384deb4f261ee9eabd1154199f69bc7 Mon Sep 17 00:00:00 2001 From: Sadhyama Vengilat Date: Fri, 8 Apr 2022 13:31:24 +0530 Subject: [PATCH 054/137] Start xmidt consumer only when method register is success --- src/xmidtsend_rbus.c | 39 +++++++++++++++++++++++---------------- 1 file changed, 23 insertions(+), 16 deletions(-) diff --git a/src/xmidtsend_rbus.c b/src/xmidtsend_rbus.c index 95cb2e0..ee2c759 100644 --- a/src/xmidtsend_rbus.c +++ b/src/xmidtsend_rbus.c @@ -221,7 +221,7 @@ int validateXmidtData(wrp_msg_t * eventMsg, char **errorMsg, int *statusCode) { *errorMsg = strdup("Message format is invalid"); *statusCode = INVALID_MSG_TYPE; - ParodusError("errorMsg %s statusCode %d\n", *errorMsg, *statusCode); + ParodusError("errorMsg: %s, statusCode: %d\n", *errorMsg, *statusCode); return 0; } @@ -229,7 +229,7 @@ int validateXmidtData(wrp_msg_t * eventMsg, char **errorMsg, int *statusCode) { *errorMsg = strdup("Missing source"); *statusCode = MISSING_SOURCE; - ParodusError("errorMsg %s statusCode %d\n", *errorMsg, *statusCode); + ParodusError("errorMsg: %s, statusCode: %d\n", *errorMsg, *statusCode); return 0; } @@ -237,7 +237,7 @@ int validateXmidtData(wrp_msg_t * eventMsg, char **errorMsg, int *statusCode) { *errorMsg = strdup("Missing dest"); *statusCode = MISSING_DEST; - ParodusError("errorMsg %s statusCode %d\n", *errorMsg, *statusCode); + ParodusError("errorMsg: %s, statusCode: %d\n", *errorMsg, *statusCode); return 0; } @@ -245,7 +245,7 @@ int validateXmidtData(wrp_msg_t * eventMsg, char **errorMsg, int *statusCode) { *errorMsg = strdup("Missing content_type"); *statusCode = MISSING_CONTENT_TYPE; - ParodusError("errorMsg %s statusCode %d\n", *errorMsg, *statusCode); + ParodusError("errorMsg: %s, statusCode: %d\n", *errorMsg, *statusCode); return 0; } @@ -253,7 +253,7 @@ int validateXmidtData(wrp_msg_t * eventMsg, char **errorMsg, int *statusCode) { *errorMsg = strdup("Missing payload"); *statusCode = MISSING_PAYLOAD; - ParodusError("errorMsg %s statusCode %d\n", *errorMsg, *statusCode); + ParodusError("errorMsg: %s, statusCode: %d\n", *errorMsg, *statusCode); return 0; } @@ -261,7 +261,7 @@ int validateXmidtData(wrp_msg_t * eventMsg, char **errorMsg, int *statusCode) { *errorMsg = strdup("Missing payloadlen"); *statusCode = MISSING_PAYLOADLEN; - ParodusError("errorMsg %s statusCode %d\n", *errorMsg, *statusCode); + ParodusError("errorMsg: %s, statusCode: %d\n", *errorMsg, *statusCode); return 0; } @@ -487,7 +487,7 @@ void createOutParamsandSendAck(wrp_msg_t *msg, rbusMethodAsyncHandle_t asyncHand rbusValue_Init(&value); snprintf(qosstring, sizeof(qosstring), "%d", msg->u.event.qos); - ParodusInfo("qosstring is %s\n", qosstring); + ParodusPrint("qosstring is %s\n", qosstring); rbusValue_SetString(value, qosstring); rbusObject_SetValue(outParams, "qos", value); rbusValue_Release(value); @@ -588,10 +588,17 @@ void parseRbusInparamsToWrp(rbusObject_t inParams, char *trans_id, wrp_msg_t **e if(rbusValue_GetType(msg_type) == RBUS_STRING) { msg_typeStr = (char *) rbusValue_GetString(msg_type, NULL); - ParodusInfo("msg_type value received is %s\n", msg_typeStr); - if((msg_typeStr !=NULL) && (strcmp(msg_typeStr, "event") ==0)) + ParodusPrint("msg_type value received is %s\n", msg_typeStr); + if(msg_typeStr !=NULL) { - msg->msg_type = WRP_MSG_TYPE__EVENT; + if(strcmp(msg_typeStr, "event") ==0) + { + msg->msg_type = WRP_MSG_TYPE__EVENT; + } + else + { + ParodusError("msg_type received is not event : %s\n", msg_typeStr); + } } } } @@ -627,7 +634,7 @@ void parseRbusInparamsToWrp(rbusObject_t inParams, char *trans_id, wrp_msg_t **e destStr = (char *)rbusValue_GetString(dest, NULL); if(destStr !=NULL) { - ParodusInfo("dest value received is %s\n", destStr); + ParodusPrint("dest value received is %s\n", destStr); msg->u.event.dest = strdup(destStr); ParodusPrint("msg->u.event.dest is %s\n", msg->u.event.dest); } @@ -646,7 +653,7 @@ void parseRbusInparamsToWrp(rbusObject_t inParams, char *trans_id, wrp_msg_t **e contenttypeStr = (char *)rbusValue_GetString(contenttype, NULL); if(contenttypeStr !=NULL) { - ParodusInfo("contenttype value received is %s\n", contenttypeStr); + ParodusPrint("contenttype value received is %s\n", contenttypeStr); msg->u.event.content_type = strdup(contenttypeStr); ParodusPrint("msg->u.event.content_type is %s\n", msg->u.event.content_type); } @@ -665,7 +672,7 @@ void parseRbusInparamsToWrp(rbusObject_t inParams, char *trans_id, wrp_msg_t **e payloadStr = (char *)rbusValue_GetString(payload, NULL); if(payloadStr !=NULL) { - ParodusInfo("payload received is %s\n", payloadStr); + ParodusPrint("payload received is %s\n", payloadStr); msg->u.event.payload = strdup(payloadStr); ParodusPrint("msg->u.event.payload is %s\n", msg->u.event.payload); } @@ -794,10 +801,10 @@ int regXmidtSendDataMethod() else { ParodusInfo("Register xmidt sendData method %s success\n", XMIDT_SEND_METHOD); + + //start xmidt queue consumer thread . + processXmidtData(); } - - //start xmidt queue consumer thread . - processXmidtData(); return rc; } From f51b4ef9c22b30e31313fa9e205dfc85a9ae90d7 Mon Sep 17 00:00:00 2001 From: Sadhyama Vengilat Date: Fri, 8 Apr 2022 18:14:40 +0530 Subject: [PATCH 055/137] Fix valgrind leaks --- src/xmidtsend_rbus.c | 52 +++++++++++++++++++++++++++++++------------- src/xmidtsend_rbus.h | 2 +- 2 files changed, 38 insertions(+), 16 deletions(-) diff --git a/src/xmidtsend_rbus.c b/src/xmidtsend_rbus.c index ee2c759..44cfd3e 100644 --- a/src/xmidtsend_rbus.c +++ b/src/xmidtsend_rbus.c @@ -65,6 +65,7 @@ void addToXmidtUpstreamQ(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle) char * errorMsg = strdup("Max Queue Size Exceeded"); ParodusError("Queue Size Exceeded\n"); createOutParamsandSendAck(msg, asyncHandle, errorMsg , QUEUE_SIZE_EXCEEDED); + wrp_free_struct(msg); return; } @@ -105,6 +106,7 @@ void addToXmidtUpstreamQ(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle) char * errorMsg = strdup("Unable to enqueue"); ParodusError("failure in allocation for xmidt message\n"); createOutParamsandSendAck(msg, asyncHandle, errorMsg , ENQUEUE_FAILURE); + wrp_free_struct(msg); } return; } @@ -128,6 +130,7 @@ void processXmidtData() //Consumer to Parse and process rbus data. void* processXmidtUpstreamMsg() { + int rv = 0; while(FOREVER()) { pthread_mutex_lock (&xmidt_mut); @@ -138,7 +141,18 @@ void* processXmidtUpstreamMsg() pthread_mutex_unlock (&xmidt_mut); ParodusPrint("mutex unlock in xmidt consumer thread\n"); - processData(Data->msg, Data->asyncHandle); + rv = processData(Data->msg, Data->asyncHandle); + if(!rv) + { + ParodusPrint("Data->msg wrp free\n"); + wrp_free_struct(Data->msg); + } + else + { + free(Data->msg); + } + free(Data); + Data = NULL; } else { @@ -157,7 +171,7 @@ void* processXmidtUpstreamMsg() } //To validate and send events upstream -void processData(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle) +int processData(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle) { int rv = 0; char *errorMsg = "none"; @@ -170,7 +184,7 @@ void processData(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle) errorMsg = strdup("Unable to enqueue"); createOutParamsandSendAck(xmidtMsg, asyncHandle, errorMsg, ENQUEUE_FAILURE); xmidtQDequeue(); - return; + return rv; } rv = validateXmidtData(xmidtMsg, &errorMsg, &statuscode); @@ -179,7 +193,7 @@ void processData(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle) { ParodusPrint("validation successful, send event to server\n"); sendXmidtEventToServer(xmidtMsg, asyncHandle); - return; + return rv; } else { @@ -187,20 +201,17 @@ void processData(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle) createOutParamsandSendAck(xmidtMsg, asyncHandle, errorMsg , statuscode); xmidtQDequeue(); } - return; + return rv; } //To remove an event from Queue void xmidtQDequeue() { - XmidtMsg *temp = NULL; pthread_mutex_lock (&xmidt_mut); if(XmidtMsgQ != NULL) { - temp = XmidtMsgQ; XmidtMsgQ = XmidtMsgQ->next; XmidtQsize -= 1; - free(temp); } else { @@ -408,6 +419,18 @@ void sendXmidtEventToServer(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle xmidtQDequeue(); } + ParodusPrint("B4 notif wrp_free_struct\n"); + if(notif_wrp_msg != NULL) + { + wrp_free_struct(notif_wrp_msg); + } + + if(msg_bytes != NULL) + { + free(msg_bytes); + msg_bytes = NULL; + } + } else { @@ -417,16 +440,15 @@ void sendXmidtEventToServer(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle xmidtQDequeue(); } - ParodusPrint("B4 notif wrp_free_struct\n"); - if(notif_wrp_msg != NULL) + if(msg->u.event.source !=NULL) { - wrp_free_struct(notif_wrp_msg); + free(msg->u.event.source); + msg->u.event.source = NULL; } - - if(msg_bytes != NULL) + if(msg->u.event.content_type !=NULL) { - free(msg_bytes); - msg_bytes = NULL; + free(msg->u.event.content_type); + msg->u.event.content_type = NULL; } } diff --git a/src/xmidtsend_rbus.h b/src/xmidtsend_rbus.h index 417c242..7875bef 100644 --- a/src/xmidtsend_rbus.h +++ b/src/xmidtsend_rbus.h @@ -65,7 +65,7 @@ rbusHandle_t get_parodus_rbus_Handle(void); void addToXmidtUpstreamQ(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle); void* processXmidtUpstreamMsg(); void processXmidtData(); -void processData(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle); +int processData(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle); void sendXmidtEventToServer(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle); int checkInputParameters(rbusObject_t inParams); char* generate_transaction_uuid(); From 60c37daa186e11822cdb383973576916d3b898da Mon Sep 17 00:00:00 2001 From: Sadhyama Vengilat Date: Fri, 8 Apr 2022 20:30:03 +0530 Subject: [PATCH 056/137] Wrp-c git tag update --- CMakeLists.txt | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 5451189..70e1af1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -172,9 +172,8 @@ add_dependencies(libcimplog cimplog) ExternalProject_Add(wrp-c DEPENDS trower-base64 msgpack cimplog PREFIX ${CMAKE_CURRENT_BINARY_DIR}/_prefix/wrp-c - GIT_REPOSITORY https://github.com/Thanusha-D/wrp-c.git - #GIT_TAG "1.0.1" - GIT_TAG qos_trans + GIT_REPOSITORY https://github.com/xmidt-org/wrp-c.git + GIT_TAG "71f8a39fe39f98da007ed4cdabbb192be1da1685" CMAKE_ARGS += -DCMAKE_INSTALL_PREFIX=${INSTALL_DIR} -DMSGPACK_ENABLE_CXX=OFF -DMSGPACK_BUILD_EXAMPLES=OFF From 29906511b8e22f8c5d1fc7aea406d37edf9a630a Mon Sep 17 00:00:00 2001 From: Guru Chandru Date: Tue, 12 Apr 2022 17:56:34 +0530 Subject: [PATCH 057/137] Changes to Send ACK for Success and Error Case --- src/xmidtsend_rbus.c | 21 ++++++++++----------- src/xmidtsend_rbus.h | 2 +- 2 files changed, 11 insertions(+), 12 deletions(-) diff --git a/src/xmidtsend_rbus.c b/src/xmidtsend_rbus.c index 44cfd3e..3b543eb 100644 --- a/src/xmidtsend_rbus.c +++ b/src/xmidtsend_rbus.c @@ -64,7 +64,7 @@ void addToXmidtUpstreamQ(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle) { char * errorMsg = strdup("Max Queue Size Exceeded"); ParodusError("Queue Size Exceeded\n"); - createOutParamsandSendAck(msg, asyncHandle, errorMsg , QUEUE_SIZE_EXCEEDED); + createOutParamsandSendAck(msg, asyncHandle, errorMsg , QUEUE_SIZE_EXCEEDED, RBUS_ERROR_INVALID_INPUT); wrp_free_struct(msg); return; } @@ -105,7 +105,7 @@ void addToXmidtUpstreamQ(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle) { char * errorMsg = strdup("Unable to enqueue"); ParodusError("failure in allocation for xmidt message\n"); - createOutParamsandSendAck(msg, asyncHandle, errorMsg , ENQUEUE_FAILURE); + createOutParamsandSendAck(msg, asyncHandle, errorMsg , ENQUEUE_FAILURE, RBUS_ERROR_INVALID_RESPONSE_FROM_DESTINATION); wrp_free_struct(msg); } return; @@ -182,7 +182,7 @@ int processData(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle) { ParodusError("xmidtMsg is NULL\n"); errorMsg = strdup("Unable to enqueue"); - createOutParamsandSendAck(xmidtMsg, asyncHandle, errorMsg, ENQUEUE_FAILURE); + createOutParamsandSendAck(xmidtMsg, asyncHandle, errorMsg, ENQUEUE_FAILURE, RBUS_ERROR_INVALID_INPUT); xmidtQDequeue(); return rv; } @@ -198,7 +198,7 @@ int processData(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle) else { ParodusError("validation failed, send failure ack\n"); - createOutParamsandSendAck(xmidtMsg, asyncHandle, errorMsg , statuscode); + createOutParamsandSendAck(xmidtMsg, asyncHandle, errorMsg , statuscode, RBUS_ERROR_INVALID_INPUT); xmidtQDequeue(); } return rv; @@ -371,7 +371,7 @@ void sendXmidtEventToServer(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle { ParodusError("wrp msg_len is zero\n"); errorMsg = strdup("Wrp message encoding failed"); - createOutParamsandSendAck(msg, asyncHandle, errorMsg, WRP_ENCODE_FAILURE); + createOutParamsandSendAck(msg, asyncHandle, errorMsg, WRP_ENCODE_FAILURE, RBUS_ERROR_INVALID_INPUT); xmidtQDequeue(); ParodusPrint("wrp_free_struct\n"); @@ -405,7 +405,7 @@ void sendXmidtEventToServer(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle { errorMsg = strdup("send failed due to client disconnect"); ParodusInfo("The event is having low qos proceed to dequeue\n"); - createOutParamsandSendAck(msg, asyncHandle, errorMsg, CLIENT_DISCONNECT); + createOutParamsandSendAck(msg, asyncHandle, errorMsg, CLIENT_DISCONNECT, RBUS_ERROR_INVALID_RESPONSE_FROM_DESTINATION); xmidtQDequeue(); break; } @@ -415,7 +415,7 @@ void sendXmidtEventToServer(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle if(sendRetStatus == 0) { errorMsg = strdup("send to server success"); - createOutParamsandSendAck(msg, asyncHandle, errorMsg, DELIVERED_SUCCESS); + createOutParamsandSendAck(msg, asyncHandle, errorMsg, DELIVERED_SUCCESS, RBUS_ERROR_SUCCESS); xmidtQDequeue(); } @@ -436,7 +436,7 @@ void sendXmidtEventToServer(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle { errorMsg = strdup("Memory allocation failed"); ParodusError("Memory allocation failed\n"); - createOutParamsandSendAck(msg, asyncHandle, errorMsg, MSG_PROCESSING_FAILED); + createOutParamsandSendAck(msg, asyncHandle, errorMsg, MSG_PROCESSING_FAILED, RBUS_ERROR_INVALID_INPUT); xmidtQDequeue(); } @@ -452,7 +452,7 @@ void sendXmidtEventToServer(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle } } -void createOutParamsandSendAck(wrp_msg_t *msg, rbusMethodAsyncHandle_t asyncHandle, char *errorMsg, int statuscode) +void createOutParamsandSendAck(wrp_msg_t *msg, rbusMethodAsyncHandle_t asyncHandle, char *errorMsg, int statuscode, rbusError_t error) { rbusObject_t outParams; rbusError_t err; @@ -533,8 +533,7 @@ void createOutParamsandSendAck(wrp_msg_t *msg, rbusMethodAsyncHandle_t asyncHand return; } - err = rbusMethod_SendAsyncResponse(asyncHandle, RBUS_ERROR_SUCCESS, outParams); - //err = rbusMethod_SendAsyncResponse(asyncHandle, RBUS_ERROR_INVALID_RESPONSE_FROM_DESTINATION, outParams); //for negative case + err = rbusMethod_SendAsyncResponse(asyncHandle, error, outParams); if(err != RBUS_ERROR_SUCCESS) { diff --git a/src/xmidtsend_rbus.h b/src/xmidtsend_rbus.h index 7875bef..2b928e6 100644 --- a/src/xmidtsend_rbus.h +++ b/src/xmidtsend_rbus.h @@ -70,7 +70,7 @@ void sendXmidtEventToServer(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle int checkInputParameters(rbusObject_t inParams); char* generate_transaction_uuid(); void parseRbusInparamsToWrp(rbusObject_t inParams, char *trans_id, wrp_msg_t **eventMsg); -void createOutParamsandSendAck(wrp_msg_t *msg, rbusMethodAsyncHandle_t asyncHandle, char *errorMsg, int statuscode); +void createOutParamsandSendAck(wrp_msg_t *msg, rbusMethodAsyncHandle_t asyncHandle, char *errorMsg, int statuscode, rbusError_t error); int validateXmidtData(wrp_msg_t * eventMsg, char **errorMsg, int *statusCode); void xmidtQDequeue(); bool highQosValueCheck(int qos); From 58492950d6e4f3e8ee72733c883a6c5580cbbb7f Mon Sep 17 00:00:00 2001 From: Guru Chandru Date: Wed, 13 Apr 2022 10:47:38 +0530 Subject: [PATCH 058/137] Review comment changes --- src/xmidtsend_rbus.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/xmidtsend_rbus.c b/src/xmidtsend_rbus.c index 3b543eb..3a240fa 100644 --- a/src/xmidtsend_rbus.c +++ b/src/xmidtsend_rbus.c @@ -64,7 +64,7 @@ void addToXmidtUpstreamQ(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle) { char * errorMsg = strdup("Max Queue Size Exceeded"); ParodusError("Queue Size Exceeded\n"); - createOutParamsandSendAck(msg, asyncHandle, errorMsg , QUEUE_SIZE_EXCEEDED, RBUS_ERROR_INVALID_INPUT); + createOutParamsandSendAck(msg, asyncHandle, errorMsg , QUEUE_SIZE_EXCEEDED, RBUS_ERROR_INVALID_RESPONSE_FROM_DESTINATION); wrp_free_struct(msg); return; } @@ -182,7 +182,7 @@ int processData(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle) { ParodusError("xmidtMsg is NULL\n"); errorMsg = strdup("Unable to enqueue"); - createOutParamsandSendAck(xmidtMsg, asyncHandle, errorMsg, ENQUEUE_FAILURE, RBUS_ERROR_INVALID_INPUT); + createOutParamsandSendAck(xmidtMsg, asyncHandle, errorMsg, ENQUEUE_FAILURE, RBUS_ERROR_INVALID_RESPONSE_FROM_DESTINATION); xmidtQDequeue(); return rv; } @@ -371,7 +371,7 @@ void sendXmidtEventToServer(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle { ParodusError("wrp msg_len is zero\n"); errorMsg = strdup("Wrp message encoding failed"); - createOutParamsandSendAck(msg, asyncHandle, errorMsg, WRP_ENCODE_FAILURE, RBUS_ERROR_INVALID_INPUT); + createOutParamsandSendAck(msg, asyncHandle, errorMsg, WRP_ENCODE_FAILURE, RBUS_ERROR_INVALID_RESPONSE_FROM_DESTINATION); xmidtQDequeue(); ParodusPrint("wrp_free_struct\n"); @@ -436,7 +436,7 @@ void sendXmidtEventToServer(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle { errorMsg = strdup("Memory allocation failed"); ParodusError("Memory allocation failed\n"); - createOutParamsandSendAck(msg, asyncHandle, errorMsg, MSG_PROCESSING_FAILED, RBUS_ERROR_INVALID_INPUT); + createOutParamsandSendAck(msg, asyncHandle, errorMsg, MSG_PROCESSING_FAILED, RBUS_ERROR_INVALID_RESPONSE_FROM_DESTINATION); xmidtQDequeue(); } From 0c4a2f407a6b105df99e8c936d5e0306a8d2ea28 Mon Sep 17 00:00:00 2001 From: Guru Chandru Date: Mon, 18 Apr 2022 12:25:20 +0530 Subject: [PATCH 059/137] Error Number value change --- src/xmidtsend_rbus.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/xmidtsend_rbus.h b/src/xmidtsend_rbus.h index 2b928e6..0e9ac45 100644 --- a/src/xmidtsend_rbus.h +++ b/src/xmidtsend_rbus.h @@ -51,11 +51,11 @@ typedef enum MISSING_CONTENT_TYPE, MISSING_PAYLOAD, MISSING_PAYLOADLEN, - QUEUE_SIZE_EXCEEDED, - WRP_ENCODE_FAILURE, - MSG_PROCESSING_FAILED, ENQUEUE_FAILURE = 100, - CLIENT_DISCONNECT = 101 + CLIENT_DISCONNECT = 101, + QUEUE_SIZE_EXCEEDED = 102, + WRP_ENCODE_FAILURE = 103, + MSG_PROCESSING_FAILED = 104 } XMIDT_STATUS; /*----------------------------------------------------------------------------*/ /* Function Prototypes */ From a124aafc5f5a8e636bef3ff573a06f66deee92c5 Mon Sep 17 00:00:00 2001 From: Sadhyama Vengilat Date: Tue, 19 Apr 2022 18:09:44 +0530 Subject: [PATCH 060/137] set cloud_status online after close_retry reset to fix sendMsg failure --- src/connection.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/connection.c b/src/connection.c index 0cda3c9..d1d62f4 100644 --- a/src/connection.c +++ b/src/connection.c @@ -783,9 +783,6 @@ int createNopollConnection(noPollCtx *ctx, server_list_t *server_list) ParodusInfo("Connected to server\n"); OnboardLog("Connected to server\n"); } - - set_cloud_status(CLOUD_STATUS_ONLINE); - ParodusInfo("cloud_status set as %s after successful connection\n", get_cloud_status()); /* On initial connect success, invoke conn status change event as "success" */ if((NULL != on_conn_status_change) && init) @@ -817,6 +814,9 @@ int createNopollConnection(noPollCtx *ctx, server_list_t *server_list) ParodusPrint("LastReasonStatus reset after successful connection\n"); setMessageHandlers(); stop_conn_in_progress (); + ParodusPrint("set cloud_status\n"); + set_cloud_status(CLOUD_STATUS_ONLINE); + ParodusInfo("cloud_status set as %s after successful connection\n", get_cloud_status()); return nopoll_true; } From ee20e1fcb83ce09f6627a7c9c85f1ef3f8cf5b39 Mon Sep 17 00:00:00 2001 From: Sadhyama Vengilat Date: Mon, 9 May 2022 19:36:59 +0530 Subject: [PATCH 061/137] Handle xmidt default profiles received before initial cloud connection --- src/config.h | 2 +- src/conn_interface.c | 4 --- src/connection.c | 5 +++- src/main.c | 4 +++ src/upstream.c | 11 +++---- src/xmidtsend_rbus.c | 68 +++++++++++++++++++++++++------------------- 6 files changed, 53 insertions(+), 41 deletions(-) diff --git a/src/config.h b/src/config.h index 556e38f..37decb8 100644 --- a/src/config.h +++ b/src/config.h @@ -143,7 +143,7 @@ void reset_cloud_disconnect_reason(ParodusCfg *cfg); char *getWebpaInterface(void); void set_cloud_status(char *status); char *get_cloud_status(void); - +int get_parodus_init(); /** * parse a webpa url. Extract the server address, the port * and return whether it's secure or not diff --git a/src/conn_interface.c b/src/conn_interface.c index 581cad1..5e65830 100644 --- a/src/conn_interface.c +++ b/src/conn_interface.c @@ -113,10 +113,6 @@ void createSocketConnection(void (* initKeypress)()) UpStreamMsgQ = NULL; StartThread(handle_upstream, &upstream_tid); StartThread(processUpstreamMessage, &upstream_msg_tid); - #ifdef ENABLE_WEBCFGBIN - subscribeRBUSevent(); - regXmidtSendDataMethod(); - #endif #ifdef WAN_FAILOVER_SUPPORTED subscribeCurrentActiveInterfaceEvent(); #endif diff --git a/src/connection.c b/src/connection.c index d1d62f4..7928066 100644 --- a/src/connection.c +++ b/src/connection.c @@ -132,7 +132,10 @@ void set_cloud_disconnect_time(int disconnTime) cloud_disconnect_max_time = disconnTime; } - +int get_parodus_init() +{ + return init; +} //-------------------------------------------------------------------- // createNopollConnection_logic: diff --git a/src/main.c b/src/main.c index b97a471..24691f1 100644 --- a/src/main.c +++ b/src/main.c @@ -106,6 +106,10 @@ int main( int argc, char **argv) ParodusInfo("********** Starting component: Parodus **********\n "); drop_root_privilege(); + #ifdef ENABLE_WEBCFGBIN + subscribeRBUSevent(); + regXmidtSendDataMethod(); + #endif setDefaultValuesToCfg(cfg); if (0 != parseCommandLine(argc,argv,cfg)) { abort(); diff --git a/src/upstream.c b/src/upstream.c index f6307d3..885bdfb 100644 --- a/src/upstream.c +++ b/src/upstream.c @@ -81,7 +81,7 @@ void packMetaData() { char boot_time[256]={'\0'}; //Pack the metadata initially to reuse for every upstream msg sending to server - ParodusPrint("-------------- Packing metadata ----------------\n"); + ParodusInfo("-------------- Packing metadata ----------------\n"); sprintf(boot_time, "%d", get_parodus_cfg()->boot_time); struct data meta_pack[METADATA_COUNT] = { {HW_MODELNAME, get_parodus_cfg()->hw_model}, @@ -103,7 +103,7 @@ void packMetaData() if (metaPackSize > 0) { - ParodusPrint("metadata encoding is successful with size %zu\n", metaPackSize); + ParodusInfo("metadata encoding is successful with size %zu\n", metaPackSize); } else { @@ -613,9 +613,10 @@ int sendUpstreamMsgToServer(void **resp_bytes, size_t resp_size) //appending response with metadata if(metaPackSize > 0) { + ParodusInfo("B4 appendEncodedData. metaPackSize %zu\n", metaPackSize); encodedSize = appendEncodedData( &appendData, *resp_bytes, resp_size, metadataPack, metaPackSize ); - ParodusPrint("metadata appended upstream response %s\n", (char *)appendData); - ParodusPrint("encodedSize after appending :%zu\n", encodedSize); + ParodusPrint("metadata appended upstream response %s\n", (char *)appendData); + ParodusInfo("encodedSize after appending :%zu\n", encodedSize); ParodusInfo("Sending response to server\n"); close_retry = get_close_retry(); @@ -640,7 +641,7 @@ int sendUpstreamMsgToServer(void **resp_bytes, size_t resp_size) ParodusError("Failed to send upstream as metadata packing is not successful\n"); sendRetStatus = 1; } - ParodusPrint("sendRetStatus is %d\n", sendRetStatus); + ParodusInfo("sendRetStatus is %d\n", sendRetStatus); return sendRetStatus; } diff --git a/src/xmidtsend_rbus.c b/src/xmidtsend_rbus.c index 3a240fa..b58797f 100644 --- a/src/xmidtsend_rbus.c +++ b/src/xmidtsend_rbus.c @@ -59,7 +59,7 @@ void addToXmidtUpstreamQ(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle) { XmidtMsg *message; - ParodusPrint("XmidtQsize is %d\n" , XmidtQsize); + ParodusInfo("XmidtQsize is %d\n" , XmidtQsize); if(XmidtQsize == MAX_QUEUE_SIZE) { char * errorMsg = strdup("Max Queue Size Exceeded"); @@ -133,8 +133,16 @@ void* processXmidtUpstreamMsg() int rv = 0; while(FOREVER()) { + if(get_parodus_init()) + { + ParodusInfo("Initial cloud connection is not established, wait till connection up\n"); + pthread_mutex_lock(get_global_cloud_status_mut()); + pthread_cond_wait(get_global_cloud_status_cond(), get_global_cloud_status_mut()); + pthread_mutex_unlock(get_global_cloud_status_mut()); + ParodusInfo("Received cloud status signal proceed to event processing\n"); + } pthread_mutex_lock (&xmidt_mut); - ParodusPrint("mutex lock in xmidt consumer thread\n"); + ParodusInfo("mutex lock in xmidt consumer thread\n"); if(XmidtMsgQ != NULL) { XmidtMsg *Data = XmidtMsgQ; @@ -144,7 +152,7 @@ void* processXmidtUpstreamMsg() rv = processData(Data->msg, Data->asyncHandle); if(!rv) { - ParodusPrint("Data->msg wrp free\n"); + ParodusInfo("Data->msg wrp free\n"); wrp_free_struct(Data->msg); } else @@ -153,6 +161,7 @@ void* processXmidtUpstreamMsg() } free(Data); Data = NULL; + ParodusInfo("free Data done\n"); } else { @@ -191,7 +200,7 @@ int processData(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle) ParodusPrint("validateXmidtData, errorMsg %s statuscode %d\n", errorMsg, statuscode); if(rv) { - ParodusPrint("validation successful, send event to server\n"); + ParodusInfo("validation successful, send event to server\n"); sendXmidtEventToServer(xmidtMsg, asyncHandle); return rv; } @@ -299,7 +308,7 @@ void sendXmidtEventToServer(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle memset(notif_wrp_msg, 0, sizeof(wrp_msg_t)); notif_wrp_msg->msg_type = WRP_MSG_TYPE__EVENT; - ParodusPrint("msg->u.event.source: %s\n",msg->u.event.source); + ParodusInfo("msg->u.event.source: %s\n",msg->u.event.source); if(msg->u.event.source !=NULL) { @@ -307,9 +316,9 @@ void sendXmidtEventToServer(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle ret = getDeviceId(&device_id, &device_id_len); if(ret == 0) { - ParodusPrint("device_id %s device_id_len %lu\n", device_id, device_id_len); + ParodusInfo("device_id %s device_id_len %lu\n", device_id, device_id_len); snprintf(sourceStr, sizeof(sourceStr), "%s/%s", device_id, msg->u.event.source); - ParodusPrint("sourceStr formed is %s\n" , sourceStr); + ParodusInfo("sourceStr formed is %s\n" , sourceStr); notif_wrp_msg->u.event.source = strdup(sourceStr); ParodusInfo("source:%s\n", notif_wrp_msg->u.event.source); } @@ -333,16 +342,13 @@ void sendXmidtEventToServer(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle if(msg->u.event.transaction_uuid != NULL) { notif_wrp_msg->u.event.transaction_uuid = msg->u.event.transaction_uuid; - ParodusPrint("Notification transaction_uuid %s\n", notif_wrp_msg->u.event.transaction_uuid); + ParodusInfo("Notification transaction_uuid %s\n", notif_wrp_msg->u.event.transaction_uuid); } if(msg->u.event.content_type != NULL) { - if(strcmp(msg->u.event.content_type , "JSON") == 0) - { - notif_wrp_msg->u.event.content_type = strdup("application/json"); - } - ParodusPrint("content_type is %s\n",notif_wrp_msg->u.event.content_type); + notif_wrp_msg->u.event.content_type = msg->u.event.content_type; + ParodusInfo("Notify content_type is %s\n",notif_wrp_msg->u.event.content_type); } if(msg->u.event.payload != NULL) @@ -350,7 +356,7 @@ void sendXmidtEventToServer(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle ParodusInfo("Notification payload: %s\n",msg->u.event.payload); notif_wrp_msg->u.event.payload = (void *)msg->u.event.payload; notif_wrp_msg->u.event.payload_size = msg->u.event.payload_size; - ParodusPrint("payload size %lu\n", notif_wrp_msg->u.event.payload_size); + ParodusInfo("payload size %lu\n", notif_wrp_msg->u.event.payload_size); } if(msg->u.event.qos != 0) @@ -359,12 +365,13 @@ void sendXmidtEventToServer(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle qos = notif_wrp_msg->u.event.qos; ParodusInfo("Notification qos: %d\n",notif_wrp_msg->u.event.qos); } + ParodusInfo("B4 wrp encode\n"); msg_len = wrp_struct_to (notif_wrp_msg, WRP_BYTES, &msg_bytes); - ParodusPrint("Encoded xmidt wrp msg, msg_len %lu\n", msg_len); + ParodusInfo("Encoded xmidt wrp msg, msg_len %lu\n", msg_len); if(msg_len > 0) { - ParodusPrint("sendUpstreamMsgToServer\n"); + ParodusInfo("sendUpstreamMsgToServer\n"); sendRetStatus = sendUpstreamMsgToServer(&msg_bytes, msg_len); } else @@ -374,7 +381,7 @@ void sendXmidtEventToServer(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle createOutParamsandSendAck(msg, asyncHandle, errorMsg, WRP_ENCODE_FAILURE, RBUS_ERROR_INVALID_RESPONSE_FROM_DESTINATION); xmidtQDequeue(); - ParodusPrint("wrp_free_struct\n"); + ParodusInfo("wrp_free_struct\n"); if(notif_wrp_msg != NULL) { wrp_free_struct(notif_wrp_msg); @@ -393,7 +400,7 @@ void sendXmidtEventToServer(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle ParodusError("sendXmidtEventToServer is Failed\n"); if(highQosValueCheck(qos)) { - ParodusPrint("The event is having high qos retry again\n"); + ParodusInfo("The event is having high qos retry again\n"); ParodusInfo("Wait till connection is Up\n"); pthread_mutex_lock(get_global_cloud_status_mut()); @@ -419,16 +426,19 @@ void sendXmidtEventToServer(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle xmidtQDequeue(); } - ParodusPrint("B4 notif wrp_free_struct\n"); if(notif_wrp_msg != NULL) { + ParodusInfo("B4 notif wrp_free_struct\n"); wrp_free_struct(notif_wrp_msg); + ParodusInfo("after notif wrp_free_struct\n"); } if(msg_bytes != NULL) { + ParodusInfo("msg_bytes free\n"); free(msg_bytes); msg_bytes = NULL; + ParodusInfo("after msg_bytes free\n"); } } @@ -442,14 +452,12 @@ void sendXmidtEventToServer(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle if(msg->u.event.source !=NULL) { + ParodusInfo("source free\n"); free(msg->u.event.source); msg->u.event.source = NULL; + ParodusInfo("after source free\n"); } - if(msg->u.event.content_type !=NULL) - { - free(msg->u.event.content_type); - msg->u.event.content_type = NULL; - } + ParodusInfo("sendXmidtEventToServer done\n"); } void createOutParamsandSendAck(wrp_msg_t *msg, rbusMethodAsyncHandle_t asyncHandle, char *errorMsg, int statuscode, rbusError_t error) @@ -562,7 +570,7 @@ int checkInputParameters(rbusObject_t inParams) rbusValue_t check = rbusObject_GetValue(inParams, "check"); if(check) { - ParodusPrint("Rbus check method. Not proceeding to process this inparam\n"); + ParodusInfo("Rbus check method. Not proceeding to process this inparam\n"); return 0; } return 1; @@ -674,9 +682,9 @@ void parseRbusInparamsToWrp(rbusObject_t inParams, char *trans_id, wrp_msg_t **e contenttypeStr = (char *)rbusValue_GetString(contenttype, NULL); if(contenttypeStr !=NULL) { - ParodusPrint("contenttype value received is %s\n", contenttypeStr); + ParodusInfo("contenttype value received is %s\n", contenttypeStr); msg->u.event.content_type = strdup(contenttypeStr); - ParodusPrint("msg->u.event.content_type is %s\n", msg->u.event.content_type); + ParodusInfo("msg->u.event.content_type is %s\n", msg->u.event.content_type); } } } @@ -767,7 +775,7 @@ static rbusError_t sendDataHandler(rbusHandle_t handle, char const* methodName, char *transaction_uuid = NULL; wrp_msg_t *wrpMsg= NULL; ParodusInfo("methodHandler called: %s\n", methodName); - //printRBUSParams(inParams, INPARAMS_PATH); + printRBUSParams(inParams, INPARAMS_PATH); if((methodName !=NULL) && (strcmp(methodName, XMIDT_SEND_METHOD) == 0)) { @@ -786,7 +794,7 @@ static rbusError_t sendDataHandler(rbusHandle_t handle, char const* methodName, } else { - ParodusPrint("check method call received, ignoring input\n"); + ParodusInfo("check method call received, ignoring input\n"); } } else @@ -794,7 +802,7 @@ static rbusError_t sendDataHandler(rbusHandle_t handle, char const* methodName, ParodusError("Method %s received is not supported\n", methodName); return RBUS_ERROR_BUS_ERROR; } - ParodusPrint("send RBUS_ERROR_SUCCESS\n"); + ParodusInfo("send RBUS_ERROR_SUCCESS\n"); return RBUS_ERROR_SUCCESS; } From bb0f49a8b3f6116147cdb5135a1feb77f61b77c5 Mon Sep 17 00:00:00 2001 From: Sadhyama Vengilat Date: Tue, 10 May 2022 19:26:33 +0530 Subject: [PATCH 062/137] Added delay on parodus init --- src/connection.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/connection.c b/src/connection.c index 7928066..488463b 100644 --- a/src/connection.c +++ b/src/connection.c @@ -775,7 +775,9 @@ int createNopollConnection(noPollCtx *ctx, server_list_t *server_list) } #endif } - + ParodusInfo("sleep of 5mins to delay parodus connection\n"); + sleep(300); + ParodusInfo("sleep of 5mins done\n"); if(conn_ctx.current_server->allow_insecure <= 0) { ParodusInfo("Connected to server over SSL\n"); From 285a461f4244c6f66faefe8aa52b1c2ce4efee1f Mon Sep 17 00:00:00 2001 From: Sadhyama Vengilat Date: Wed, 11 May 2022 18:16:25 +0530 Subject: [PATCH 063/137] Disable debug logs --- src/connection.c | 4 +--- src/upstream.c | 11 +++++----- src/upstream_rbus.c | 3 +++ src/xmidtsend_rbus.c | 52 +++++++++++++++++++------------------------- 4 files changed, 31 insertions(+), 39 deletions(-) diff --git a/src/connection.c b/src/connection.c index 488463b..08b7873 100644 --- a/src/connection.c +++ b/src/connection.c @@ -775,9 +775,7 @@ int createNopollConnection(noPollCtx *ctx, server_list_t *server_list) } #endif } - ParodusInfo("sleep of 5mins to delay parodus connection\n"); - sleep(300); - ParodusInfo("sleep of 5mins done\n"); + if(conn_ctx.current_server->allow_insecure <= 0) { ParodusInfo("Connected to server over SSL\n"); diff --git a/src/upstream.c b/src/upstream.c index 885bdfb..f6307d3 100644 --- a/src/upstream.c +++ b/src/upstream.c @@ -81,7 +81,7 @@ void packMetaData() { char boot_time[256]={'\0'}; //Pack the metadata initially to reuse for every upstream msg sending to server - ParodusInfo("-------------- Packing metadata ----------------\n"); + ParodusPrint("-------------- Packing metadata ----------------\n"); sprintf(boot_time, "%d", get_parodus_cfg()->boot_time); struct data meta_pack[METADATA_COUNT] = { {HW_MODELNAME, get_parodus_cfg()->hw_model}, @@ -103,7 +103,7 @@ void packMetaData() if (metaPackSize > 0) { - ParodusInfo("metadata encoding is successful with size %zu\n", metaPackSize); + ParodusPrint("metadata encoding is successful with size %zu\n", metaPackSize); } else { @@ -613,10 +613,9 @@ int sendUpstreamMsgToServer(void **resp_bytes, size_t resp_size) //appending response with metadata if(metaPackSize > 0) { - ParodusInfo("B4 appendEncodedData. metaPackSize %zu\n", metaPackSize); encodedSize = appendEncodedData( &appendData, *resp_bytes, resp_size, metadataPack, metaPackSize ); - ParodusPrint("metadata appended upstream response %s\n", (char *)appendData); - ParodusInfo("encodedSize after appending :%zu\n", encodedSize); + ParodusPrint("metadata appended upstream response %s\n", (char *)appendData); + ParodusPrint("encodedSize after appending :%zu\n", encodedSize); ParodusInfo("Sending response to server\n"); close_retry = get_close_retry(); @@ -641,7 +640,7 @@ int sendUpstreamMsgToServer(void **resp_bytes, size_t resp_size) ParodusError("Failed to send upstream as metadata packing is not successful\n"); sendRetStatus = 1; } - ParodusInfo("sendRetStatus is %d\n", sendRetStatus); + ParodusPrint("sendRetStatus is %d\n", sendRetStatus); return sendRetStatus; } diff --git a/src/upstream_rbus.c b/src/upstream_rbus.c index 2316098..75250e7 100644 --- a/src/upstream_rbus.c +++ b/src/upstream_rbus.c @@ -27,6 +27,9 @@ #include "upstream.h" #include "ParodusInternal.h" #include "partners_check.h" +#include "close_retry.h" +#include "connection.h" +#include "heartBeat.h" #define WEBCFG_UPSTREAM_EVENT "Webconfig.Upstream" #ifdef WAN_FAILOVER_SUPPORTED diff --git a/src/xmidtsend_rbus.c b/src/xmidtsend_rbus.c index b58797f..fe48f05 100644 --- a/src/xmidtsend_rbus.c +++ b/src/xmidtsend_rbus.c @@ -59,7 +59,7 @@ void addToXmidtUpstreamQ(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle) { XmidtMsg *message; - ParodusInfo("XmidtQsize is %d\n" , XmidtQsize); + ParodusPrint("XmidtQsize is %d\n" , XmidtQsize); if(XmidtQsize == MAX_QUEUE_SIZE) { char * errorMsg = strdup("Max Queue Size Exceeded"); @@ -135,14 +135,14 @@ void* processXmidtUpstreamMsg() { if(get_parodus_init()) { - ParodusInfo("Initial cloud connection is not established, wait till connection up\n"); + ParodusInfo("Initial cloud connection is not established, Xmidt wait till connection up\n"); pthread_mutex_lock(get_global_cloud_status_mut()); pthread_cond_wait(get_global_cloud_status_cond(), get_global_cloud_status_mut()); pthread_mutex_unlock(get_global_cloud_status_mut()); ParodusInfo("Received cloud status signal proceed to event processing\n"); } pthread_mutex_lock (&xmidt_mut); - ParodusInfo("mutex lock in xmidt consumer thread\n"); + ParodusPrint("mutex lock in xmidt consumer thread\n"); if(XmidtMsgQ != NULL) { XmidtMsg *Data = XmidtMsgQ; @@ -152,7 +152,7 @@ void* processXmidtUpstreamMsg() rv = processData(Data->msg, Data->asyncHandle); if(!rv) { - ParodusInfo("Data->msg wrp free\n"); + ParodusPrint("Data->msg wrp free\n"); wrp_free_struct(Data->msg); } else @@ -161,7 +161,6 @@ void* processXmidtUpstreamMsg() } free(Data); Data = NULL; - ParodusInfo("free Data done\n"); } else { @@ -200,7 +199,7 @@ int processData(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle) ParodusPrint("validateXmidtData, errorMsg %s statuscode %d\n", errorMsg, statuscode); if(rv) { - ParodusInfo("validation successful, send event to server\n"); + ParodusPrint("validation successful, send event to server\n"); sendXmidtEventToServer(xmidtMsg, asyncHandle); return rv; } @@ -308,7 +307,7 @@ void sendXmidtEventToServer(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle memset(notif_wrp_msg, 0, sizeof(wrp_msg_t)); notif_wrp_msg->msg_type = WRP_MSG_TYPE__EVENT; - ParodusInfo("msg->u.event.source: %s\n",msg->u.event.source); + ParodusPrint("msg->u.event.source: %s\n",msg->u.event.source); if(msg->u.event.source !=NULL) { @@ -316,9 +315,9 @@ void sendXmidtEventToServer(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle ret = getDeviceId(&device_id, &device_id_len); if(ret == 0) { - ParodusInfo("device_id %s device_id_len %lu\n", device_id, device_id_len); + ParodusPrint("device_id %s device_id_len %lu\n", device_id, device_id_len); snprintf(sourceStr, sizeof(sourceStr), "%s/%s", device_id, msg->u.event.source); - ParodusInfo("sourceStr formed is %s\n" , sourceStr); + ParodusPrint("sourceStr formed is %s\n" , sourceStr); notif_wrp_msg->u.event.source = strdup(sourceStr); ParodusInfo("source:%s\n", notif_wrp_msg->u.event.source); } @@ -342,13 +341,13 @@ void sendXmidtEventToServer(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle if(msg->u.event.transaction_uuid != NULL) { notif_wrp_msg->u.event.transaction_uuid = msg->u.event.transaction_uuid; - ParodusInfo("Notification transaction_uuid %s\n", notif_wrp_msg->u.event.transaction_uuid); + ParodusPrint("Notification transaction_uuid %s\n", notif_wrp_msg->u.event.transaction_uuid); } if(msg->u.event.content_type != NULL) { notif_wrp_msg->u.event.content_type = msg->u.event.content_type; - ParodusInfo("Notify content_type is %s\n",notif_wrp_msg->u.event.content_type); + ParodusInfo("Notification content_type is %s\n",notif_wrp_msg->u.event.content_type); } if(msg->u.event.payload != NULL) @@ -356,7 +355,7 @@ void sendXmidtEventToServer(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle ParodusInfo("Notification payload: %s\n",msg->u.event.payload); notif_wrp_msg->u.event.payload = (void *)msg->u.event.payload; notif_wrp_msg->u.event.payload_size = msg->u.event.payload_size; - ParodusInfo("payload size %lu\n", notif_wrp_msg->u.event.payload_size); + ParodusPrint("payload size %lu\n", notif_wrp_msg->u.event.payload_size); } if(msg->u.event.qos != 0) @@ -365,13 +364,12 @@ void sendXmidtEventToServer(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle qos = notif_wrp_msg->u.event.qos; ParodusInfo("Notification qos: %d\n",notif_wrp_msg->u.event.qos); } - ParodusInfo("B4 wrp encode\n"); msg_len = wrp_struct_to (notif_wrp_msg, WRP_BYTES, &msg_bytes); - ParodusInfo("Encoded xmidt wrp msg, msg_len %lu\n", msg_len); + ParodusPrint("Encoded xmidt wrp msg, msg_len %lu\n", msg_len); if(msg_len > 0) { - ParodusInfo("sendUpstreamMsgToServer\n"); + ParodusPrint("sendUpstreamMsgToServer\n"); sendRetStatus = sendUpstreamMsgToServer(&msg_bytes, msg_len); } else @@ -381,7 +379,7 @@ void sendXmidtEventToServer(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle createOutParamsandSendAck(msg, asyncHandle, errorMsg, WRP_ENCODE_FAILURE, RBUS_ERROR_INVALID_RESPONSE_FROM_DESTINATION); xmidtQDequeue(); - ParodusInfo("wrp_free_struct\n"); + ParodusPrint("wrp_free_struct\n"); if(notif_wrp_msg != NULL) { wrp_free_struct(notif_wrp_msg); @@ -400,7 +398,7 @@ void sendXmidtEventToServer(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle ParodusError("sendXmidtEventToServer is Failed\n"); if(highQosValueCheck(qos)) { - ParodusInfo("The event is having high qos retry again\n"); + ParodusPrint("The event is having high qos retry again\n"); ParodusInfo("Wait till connection is Up\n"); pthread_mutex_lock(get_global_cloud_status_mut()); @@ -426,19 +424,16 @@ void sendXmidtEventToServer(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle xmidtQDequeue(); } + ParodusPrint("B4 notif wrp_free_struct\n"); if(notif_wrp_msg != NULL) { - ParodusInfo("B4 notif wrp_free_struct\n"); wrp_free_struct(notif_wrp_msg); - ParodusInfo("after notif wrp_free_struct\n"); } if(msg_bytes != NULL) { - ParodusInfo("msg_bytes free\n"); free(msg_bytes); msg_bytes = NULL; - ParodusInfo("after msg_bytes free\n"); } } @@ -452,12 +447,9 @@ void sendXmidtEventToServer(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle if(msg->u.event.source !=NULL) { - ParodusInfo("source free\n"); free(msg->u.event.source); msg->u.event.source = NULL; - ParodusInfo("after source free\n"); } - ParodusInfo("sendXmidtEventToServer done\n"); } void createOutParamsandSendAck(wrp_msg_t *msg, rbusMethodAsyncHandle_t asyncHandle, char *errorMsg, int statuscode, rbusError_t error) @@ -570,7 +562,7 @@ int checkInputParameters(rbusObject_t inParams) rbusValue_t check = rbusObject_GetValue(inParams, "check"); if(check) { - ParodusInfo("Rbus check method. Not proceeding to process this inparam\n"); + ParodusPrint("Rbus check method. Not proceeding to process this inparam\n"); return 0; } return 1; @@ -682,9 +674,9 @@ void parseRbusInparamsToWrp(rbusObject_t inParams, char *trans_id, wrp_msg_t **e contenttypeStr = (char *)rbusValue_GetString(contenttype, NULL); if(contenttypeStr !=NULL) { - ParodusInfo("contenttype value received is %s\n", contenttypeStr); + ParodusPrint("contenttype value received is %s\n", contenttypeStr); msg->u.event.content_type = strdup(contenttypeStr); - ParodusInfo("msg->u.event.content_type is %s\n", msg->u.event.content_type); + ParodusPrint("msg->u.event.content_type is %s\n", msg->u.event.content_type); } } } @@ -775,7 +767,7 @@ static rbusError_t sendDataHandler(rbusHandle_t handle, char const* methodName, char *transaction_uuid = NULL; wrp_msg_t *wrpMsg= NULL; ParodusInfo("methodHandler called: %s\n", methodName); - printRBUSParams(inParams, INPARAMS_PATH); + //printRBUSParams(inParams, INPARAMS_PATH); if((methodName !=NULL) && (strcmp(methodName, XMIDT_SEND_METHOD) == 0)) { @@ -794,7 +786,7 @@ static rbusError_t sendDataHandler(rbusHandle_t handle, char const* methodName, } else { - ParodusInfo("check method call received, ignoring input\n"); + ParodusPrint("check method call received, ignoring input\n"); } } else @@ -802,7 +794,7 @@ static rbusError_t sendDataHandler(rbusHandle_t handle, char const* methodName, ParodusError("Method %s received is not supported\n", methodName); return RBUS_ERROR_BUS_ERROR; } - ParodusInfo("send RBUS_ERROR_SUCCESS\n"); + ParodusPrint("send RBUS_ERROR_SUCCESS\n"); return RBUS_ERROR_SUCCESS; } From 0017e48f7dacc76ada08018747d0364cdb2680fb Mon Sep 17 00:00:00 2001 From: Sadhyama Vengilat Date: Fri, 13 May 2022 18:48:08 +0530 Subject: [PATCH 064/137] Remove content_type modification --- src/xmidtsend_rbus.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/xmidtsend_rbus.c b/src/xmidtsend_rbus.c index fe48f05..387bad1 100644 --- a/src/xmidtsend_rbus.c +++ b/src/xmidtsend_rbus.c @@ -346,8 +346,11 @@ void sendXmidtEventToServer(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle if(msg->u.event.content_type != NULL) { - notif_wrp_msg->u.event.content_type = msg->u.event.content_type; - ParodusInfo("Notification content_type is %s\n",notif_wrp_msg->u.event.content_type); + if(strcmp(msg->u.event.content_type , "JSON") == 0) + { + notif_wrp_msg->u.event.content_type = strdup("application/json"); + } + ParodusPrint("content_type is %s\n",notif_wrp_msg->u.event.content_type); } if(msg->u.event.payload != NULL) @@ -450,6 +453,11 @@ void sendXmidtEventToServer(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle free(msg->u.event.source); msg->u.event.source = NULL; } + if(msg->u.event.content_type !=NULL) + { + free(msg->u.event.content_type); + msg->u.event.content_type = NULL; + } } void createOutParamsandSendAck(wrp_msg_t *msg, rbusMethodAsyncHandle_t asyncHandle, char *errorMsg, int statuscode, rbusError_t error) From e35221efd2d5d27918ec2c61dcb0f31cd082220c Mon Sep 17 00:00:00 2001 From: Sadhyama Vengilat Date: Thu, 26 May 2022 15:06:08 +0530 Subject: [PATCH 065/137] Add content_type validation for Xmidt method profiles --- src/xmidtsend_rbus.c | 27 +++++++++++++++++---------- src/xmidtsend_rbus.h | 1 + 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/src/xmidtsend_rbus.c b/src/xmidtsend_rbus.c index 387bad1..5fa7921 100644 --- a/src/xmidtsend_rbus.c +++ b/src/xmidtsend_rbus.c @@ -267,6 +267,21 @@ int validateXmidtData(wrp_msg_t * eventMsg, char **errorMsg, int *statusCode) ParodusError("errorMsg: %s, statusCode: %d\n", *errorMsg, *statusCode); return 0; } + else + { + ParodusPrint("Validate content_type\n"); + if ( (strcmp(eventMsg->u.event.content_type, "application/json") == 0) || (strcmp(eventMsg->u.event.content_type, "avro/binary") == 0) || (strcmp(eventMsg->u.event.content_type, "application/msgpack") == 0) || (strcmp(eventMsg->u.event.content_type, "application/binary") == 0) ) + { + ParodusPrint("content_type is valid\n"); + } + else + { + *errorMsg = strdup("Invalid content_type"); + *statusCode = INVALID_CONTENT_TYPE; + ParodusError("errorMsg: %s, statusCode: %d\n", *errorMsg, *statusCode); + return 0; + } + } if(eventMsg->u.event.payload == NULL) { @@ -346,11 +361,8 @@ void sendXmidtEventToServer(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle if(msg->u.event.content_type != NULL) { - if(strcmp(msg->u.event.content_type , "JSON") == 0) - { - notif_wrp_msg->u.event.content_type = strdup("application/json"); - } - ParodusPrint("content_type is %s\n",notif_wrp_msg->u.event.content_type); + notif_wrp_msg->u.event.content_type = msg->u.event.content_type; + ParodusInfo("content_type is %s\n",notif_wrp_msg->u.event.content_type); } if(msg->u.event.payload != NULL) @@ -453,11 +465,6 @@ void sendXmidtEventToServer(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle free(msg->u.event.source); msg->u.event.source = NULL; } - if(msg->u.event.content_type !=NULL) - { - free(msg->u.event.content_type); - msg->u.event.content_type = NULL; - } } void createOutParamsandSendAck(wrp_msg_t *msg, rbusMethodAsyncHandle_t asyncHandle, char *errorMsg, int statuscode, rbusError_t error) diff --git a/src/xmidtsend_rbus.h b/src/xmidtsend_rbus.h index 0e9ac45..d47f40e 100644 --- a/src/xmidtsend_rbus.h +++ b/src/xmidtsend_rbus.h @@ -51,6 +51,7 @@ typedef enum MISSING_CONTENT_TYPE, MISSING_PAYLOAD, MISSING_PAYLOADLEN, + INVALID_CONTENT_TYPE, ENQUEUE_FAILURE = 100, CLIENT_DISCONNECT = 101, QUEUE_SIZE_EXCEEDED = 102, From ee7033c36c5e611d87db3cfde02e9af4dee3c186 Mon Sep 17 00:00:00 2001 From: Sadhyama Vengilat Date: Fri, 27 May 2022 12:21:23 +0530 Subject: [PATCH 066/137] Add contentType list and validate --- src/xmidtsend_rbus.c | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/src/xmidtsend_rbus.c b/src/xmidtsend_rbus.c index 5fa7921..3e2ebda 100644 --- a/src/xmidtsend_rbus.c +++ b/src/xmidtsend_rbus.c @@ -38,6 +38,13 @@ pthread_mutex_t xmidt_mut=PTHREAD_MUTEX_INITIALIZER; pthread_cond_t xmidt_con=PTHREAD_COND_INITIALIZER; +const char * contentTypeList[]={ +"application/json", +"avro/binary", +"application/msgpack", +"application/binary" +}; + bool highQosValueCheck(int qos) { if(qos > 24) @@ -270,12 +277,20 @@ int validateXmidtData(wrp_msg_t * eventMsg, char **errorMsg, int *statusCode) else { ParodusPrint("Validate content_type\n"); - if ( (strcmp(eventMsg->u.event.content_type, "application/json") == 0) || (strcmp(eventMsg->u.event.content_type, "avro/binary") == 0) || (strcmp(eventMsg->u.event.content_type, "application/msgpack") == 0) || (strcmp(eventMsg->u.event.content_type, "application/binary") == 0) ) + int i =0, count = 0, valid = 0; + count = sizeof(contentTypeList)/sizeof(contentTypeList[0]); + for(i = 0; iu.event.content_type, contentTypeList[i]) == 0) + { + ParodusInfo("content_type is valid %s\n", contentTypeList[i]); + valid = 1; + break; + } } - else + if (!valid) { + ParodusError("content_type is not valid %s\n", eventMsg->u.event.content_type); *errorMsg = strdup("Invalid content_type"); *statusCode = INVALID_CONTENT_TYPE; ParodusError("errorMsg: %s, statusCode: %d\n", *errorMsg, *statusCode); From 0297d994b5eee3d501a76f0fb3559b9d8b56a453 Mon Sep 17 00:00:00 2001 From: Sadhyama Vengilat Date: Fri, 27 May 2022 19:47:39 +0530 Subject: [PATCH 067/137] Reduce debug log --- src/xmidtsend_rbus.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/xmidtsend_rbus.c b/src/xmidtsend_rbus.c index 3e2ebda..fc28053 100644 --- a/src/xmidtsend_rbus.c +++ b/src/xmidtsend_rbus.c @@ -276,21 +276,20 @@ int validateXmidtData(wrp_msg_t * eventMsg, char **errorMsg, int *statusCode) } else { - ParodusPrint("Validate content_type\n"); int i =0, count = 0, valid = 0; count = sizeof(contentTypeList)/sizeof(contentTypeList[0]); for(i = 0; iu.event.content_type, contentTypeList[i]) == 0) { - ParodusInfo("content_type is valid %s\n", contentTypeList[i]); + ParodusPrint("content_type is valid %s\n", contentTypeList[i]); valid = 1; break; } } if (!valid) { - ParodusError("content_type is not valid %s\n", eventMsg->u.event.content_type); + ParodusError("content_type is not valid, %s\n", eventMsg->u.event.content_type); *errorMsg = strdup("Invalid content_type"); *statusCode = INVALID_CONTENT_TYPE; ParodusError("errorMsg: %s, statusCode: %d\n", *errorMsg, *statusCode); From 47af27592983dc07f2cb83cddfa78bf0b5223f16 Mon Sep 17 00:00:00 2001 From: Sadhyama Vengilat Date: Wed, 1 Jun 2022 20:40:22 +0530 Subject: [PATCH 068/137] Xmidt cloud ack handling with xmidtMsgQ --- CMakeLists.txt | 4 +- src/downstream.c | 89 ++++++++++++ src/xmidtsend_rbus.c | 272 ++++++++++++++++++++++++++++++++--- src/xmidtsend_rbus.h | 16 +++ tests/test_conn_interface.c | 4 + tests/test_downstream.c | 13 +- tests/test_downstream_more.c | 14 ++ 7 files changed, 391 insertions(+), 21 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 70e1af1..fed0b27 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -172,8 +172,8 @@ add_dependencies(libcimplog cimplog) ExternalProject_Add(wrp-c DEPENDS trower-base64 msgpack cimplog PREFIX ${CMAKE_CURRENT_BINARY_DIR}/_prefix/wrp-c - GIT_REPOSITORY https://github.com/xmidt-org/wrp-c.git - GIT_TAG "71f8a39fe39f98da007ed4cdabbb192be1da1685" + GIT_REPOSITORY https://github.com/Thanusha-D/wrp-c.git + GIT_TAG add_fields CMAKE_ARGS += -DCMAKE_INSTALL_PREFIX=${INSTALL_DIR} -DMSGPACK_ENABLE_CXX=OFF -DMSGPACK_BUILD_EXAMPLES=OFF diff --git a/src/downstream.c b/src/downstream.c index 952a347..26954c2 100644 --- a/src/downstream.c +++ b/src/downstream.c @@ -27,10 +27,13 @@ #include "partners_check.h" #include "ParodusInternal.h" #include "crud_interface.h" +#include "xmidtsend_rbus.h" /*----------------------------------------------------------------------------*/ /* Function Prototypes */ /*----------------------------------------------------------------------------*/ static void createNewMsgForCRUD(wrp_msg_t *message, wrp_msg_t **crudMessage ); +static void createNewMsgForCloudACK(wrp_msg_t *message, wrp_msg_t **eventMessage ); //Test purpose. +static int test = 1; /*----------------------------------------------------------------------------*/ /* External Functions */ /*----------------------------------------------------------------------------*/ @@ -141,6 +144,7 @@ void listenerOnMessage(void * msg, size_t msgSize) ParodusInfo("sent downstream message to reg_client '%s'\n",temp->url); ParodusPrint("downstream bytes sent:%d\n", bytes); destFlag =1; + test++; break; } ParodusPrint("checking the next item in the list\n"); @@ -235,6 +239,56 @@ void listenerOnMessage(void * msg, size_t msgSize) } free(resp_msg); } + //To handle cloud ack events received from server for the xmidt sent messages. + if(test == 1 || test == 3) + { + wrp_msg_t *eventMsg= NULL; + ParodusInfo("Create downstream event Msg with cloud ack\n"); + createNewMsgForCloudACK(message, &eventMsg); + msgType = WRP_MSG_TYPE__EVENT; + ParodusInfo("check cloud ack\n"); + if((WRP_MSG_TYPE__EVENT == msgType) && (ret >= 0)) + { + //Process cloud ack only when qos > 24 + /*if(highQosValueCheck(message->u.event.qos)) + { + if(message->u.event.transaction_uuid !=NULL) + { + ParodusInfo("Received cloud ack from server: transaction_uuid %s qos %d, rdr %d\n", message->u.event.transaction_uuid, message->u.event.qos, message->u.event.rdr); + addToCloudAckQ(message->u.event.transaction_uuid, message->u.event.qos, message->u.event.rdr); + ParodusInfo("Added to cloud ack Q\n"); + } + else + { + ParodusError("cloud ack transaction id is NULL\n"); + } + } + else + { + ParodusInfo("cloud ack received with low qos %d, ignoring it\n", message->u.event.qos); + }*/ + //Remove this. TEST purpose. + if(highQosValueCheck(eventMsg->u.event.qos)) + { + if(eventMsg->u.event.transaction_uuid !=NULL) + { + ParodusInfo("Received cloud ack from server: transaction_uuid %s qos %d, rdr %d\n", eventMsg->u.event.transaction_uuid, eventMsg->u.event.qos, eventMsg->u.event.rdr); + addToCloudAckQ(eventMsg->u.event.transaction_uuid, eventMsg->u.event.qos, eventMsg->u.event.rdr); + ParodusInfo("Added to cloud ack Q\n"); + } + else + { + ParodusError("cloud ack transaction id is NULL\n"); + } + } + else + { + ParodusInfo("cloud ack received with low qos %d, ignoring it\n", eventMsg->u.event.qos); + } + //test++; + ParodusInfo("test is %d\n", test); + } + } break; } @@ -367,3 +421,38 @@ static void createNewMsgForCRUD(wrp_msg_t *message, wrp_msg_t **crudMessage ) *crudMessage = msg; } } +//Test purpose. to create new message for processing cloud ACK . +static void createNewMsgForCloudACK(wrp_msg_t *message, wrp_msg_t **eventMessage ) +{ + wrp_msg_t *msg; + msg = ( wrp_msg_t * ) malloc( sizeof( wrp_msg_t ) ); + if(msg != NULL) + { + memset( msg, 0, sizeof( wrp_msg_t ) ); + msg->msg_type = WRP_MSG_TYPE__EVENT; + if(message->u.event.source != NULL) + { + msg->u.event.source = strdup("event:/profile-notify/MyProfile1"); + } + + if(message->u.event.dest != NULL) + { + msg->u.event.dest = strdup("mac:889e6863239e/telemetry2"); + } + + if(message->u.event.transaction_uuid != NULL) + { + msg->u.event.transaction_uuid = strdup("8d72d4c2-1f59-4420-a736-3946083d529a"); + } + + if(message->u.event.content_type != NULL) + { + msg->u.event.content_type = strdup("application/json"); + } + msg->u.event.rdr = 0; + msg->u.event.qos = 50; + ParodusInfo("msg->u.event.rdr = %d msg->u.event.qos = %d\n",msg->u.event.rdr, msg->u.event.qos); + *eventMessage = msg; + } + ParodusInfo("createNewMsgForCloudACK done\n"); +} diff --git a/src/xmidtsend_rbus.c b/src/xmidtsend_rbus.c index fc28053..6989b1a 100644 --- a/src/xmidtsend_rbus.c +++ b/src/xmidtsend_rbus.c @@ -30,14 +30,21 @@ #include "config.h" static pthread_t processThreadId = 0; +static pthread_t cloudackThreadId = 0; static int XmidtQsize = 0; XmidtMsg *XmidtMsgQ = NULL; +CloudAck *CloudAckQ = NULL; + pthread_mutex_t xmidt_mut=PTHREAD_MUTEX_INITIALIZER; pthread_cond_t xmidt_con=PTHREAD_COND_INITIALIZER; +pthread_mutex_t cloudack_mut=PTHREAD_MUTEX_INITIALIZER; + +pthread_cond_t cloudack_con=PTHREAD_COND_INITIALIZER; + const char * contentTypeList[]={ "application/json", "avro/binary", @@ -59,6 +66,23 @@ bool highQosValueCheck(int qos) return false; } + +XmidtMsg * get_global_XmidtMsg(void) +{ + XmidtMsg *tmp = NULL; + pthread_mutex_lock (&xmidt_mut); + tmp = XmidtMsgQ; + pthread_mutex_unlock (&xmidt_mut); + return tmp; +} + +void set_global_XmidtMsg(XmidtMsg *new) +{ + pthread_mutex_lock (&xmidt_mut); + XmidtMsgQ = new; + pthread_mutex_unlock (&xmidt_mut); +} + /* * @brief To handle xmidt rbus messages received from various components. */ @@ -83,6 +107,8 @@ void addToXmidtUpstreamQ(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle) { message->msg = msg; message->asyncHandle =asyncHandle; + message->startTime = 0; //TODO: calculate current time and add it + message->status = "pending"; //Increment queue size to handle max queue limit XmidtQsize++; message->next=NULL; @@ -138,6 +164,7 @@ void processXmidtData() void* processXmidtUpstreamMsg() { int rv = 0; + char *status = NULL; while(FOREVER()) { if(get_parodus_init()) @@ -153,21 +180,32 @@ void* processXmidtUpstreamMsg() if(XmidtMsgQ != NULL) { XmidtMsg *Data = XmidtMsgQ; - - pthread_mutex_unlock (&xmidt_mut); - ParodusPrint("mutex unlock in xmidt consumer thread\n"); - rv = processData(Data->msg, Data->asyncHandle); - if(!rv) + status = Data->status; + if (status !=NULL && strcmp(status , "pending") == 0) { - ParodusPrint("Data->msg wrp free\n"); - wrp_free_struct(Data->msg); + ParodusInfo("xmidt msg status is %s\n", Data->status); + pthread_mutex_unlock (&xmidt_mut); + ParodusPrint("mutex unlock in xmidt consumer thread\n"); + rv = processData(Data->msg, Data->asyncHandle); + if(!rv) + { + ParodusPrint("Data->msg wrp free\n"); + wrp_free_struct(Data->msg); + } + else + { + free(Data->msg); + } + free(Data); + Data = NULL; } else { - free(Data->msg); + ParodusInfo("xmidt msg status is %s, check next msg\n", status); + XmidtMsgQ = XmidtMsgQ->next; + pthread_mutex_unlock (&xmidt_mut); + ParodusInfo("mutex unlock in xmidt consumer\n"); } - free(Data); - Data = NULL; } else { @@ -448,12 +486,25 @@ void sendXmidtEventToServer(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle if(sendRetStatus == 0) { - errorMsg = strdup("send to server success"); - createOutParamsandSendAck(msg, asyncHandle, errorMsg, DELIVERED_SUCCESS, RBUS_ERROR_SUCCESS); - xmidtQDequeue(); + if(highQosValueCheck(qos)) + { + ParodusInfo("Start processCloudAck consumer\n"); + processCloudAck(); + //update msg status from "pending" to "sent". + updateXmidtMsgStatus(msg , "sent"); + //xmidtQDequeue(); + //ParodusInfo("xmidtQDequeue done for high Qos msg\n"); + } + else + { + ParodusInfo("Low qos event, send success callback and dequeue\n"); + errorMsg = strdup("send to server success"); + createOutParamsandSendAck(msg, asyncHandle, errorMsg, DELIVERED_SUCCESS, RBUS_ERROR_SUCCESS); + xmidtQDequeue(); + } } - ParodusPrint("B4 notif wrp_free_struct\n"); + ParodusInfo("B4 notif wrp_free_struct\n"); if(notif_wrp_msg != NULL) { wrp_free_struct(notif_wrp_msg); @@ -494,7 +545,7 @@ void createOutParamsandSendAck(wrp_msg_t *msg, rbusMethodAsyncHandle_t asyncHand rbusObject_SetValue(outParams, "msg_type", value); rbusValue_Release(value); - ParodusPrint("statuscode %d errorMsg %s\n", statuscode, errorMsg); + ParodusInfo("statuscode %d errorMsg %s\n", statuscode, errorMsg); rbusValue_Init(&value); rbusValue_SetInt32(value, statuscode); rbusObject_SetValue(outParams, "status", value); @@ -513,7 +564,7 @@ void createOutParamsandSendAck(wrp_msg_t *msg, rbusMethodAsyncHandle_t asyncHand { if(msg->u.event.source !=NULL) { - ParodusPrint("msg->u.event.source is %s\n", msg->u.event.source); + ParodusInfo("msg->u.event.source is %s\n", msg->u.event.source); rbusValue_Init(&value); rbusValue_SetString(value, msg->u.event.source); rbusObject_SetValue(outParams, "source", value); @@ -522,6 +573,7 @@ void createOutParamsandSendAck(wrp_msg_t *msg, rbusMethodAsyncHandle_t asyncHand if(msg->u.event.dest !=NULL) { + ParodusInfo("msg->u.event.dest is %s\n", msg->u.event.dest); rbusValue_Init(&value); rbusValue_SetString(value, msg->u.event.dest); rbusObject_SetValue(outParams, "dest", value); @@ -530,6 +582,7 @@ void createOutParamsandSendAck(wrp_msg_t *msg, rbusMethodAsyncHandle_t asyncHand if(msg->u.event.content_type !=NULL) { + ParodusInfo("msg->u.event.content_type is %s\n", msg->u.event.content_type); rbusValue_Init(&value); rbusValue_SetString(value, msg->u.event.content_type); rbusObject_SetValue(outParams, "content_type", value); @@ -538,7 +591,7 @@ void createOutParamsandSendAck(wrp_msg_t *msg, rbusMethodAsyncHandle_t asyncHand rbusValue_Init(&value); snprintf(qosstring, sizeof(qosstring), "%d", msg->u.event.qos); - ParodusPrint("qosstring is %s\n", qosstring); + ParodusInfo("qosstring is %s\n", qosstring); rbusValue_SetString(value, qosstring); rbusObject_SetValue(outParams, "qos", value); rbusValue_Release(value); @@ -549,7 +602,7 @@ void createOutParamsandSendAck(wrp_msg_t *msg, rbusMethodAsyncHandle_t asyncHand rbusValue_SetString(value, msg->u.event.transaction_uuid); rbusObject_SetValue(outParams, "transaction_uuid", value); rbusValue_Release(value); - ParodusPrint("outParams msg->u.event.transaction_uuid %s\n", msg->u.event.transaction_uuid); + ParodusInfo("outParams msg->u.event.transaction_uuid %s\n", msg->u.event.transaction_uuid); } } @@ -562,6 +615,7 @@ void createOutParamsandSendAck(wrp_msg_t *msg, rbusMethodAsyncHandle_t asyncHand return; } + ParodusInfo("B4 async send callback\n"); err = rbusMethod_SendAsyncResponse(asyncHandle, error, outParams); if(err != RBUS_ERROR_SUCCESS) @@ -872,3 +926,185 @@ void printRBUSParams(rbusObject_t params, char* file_path) ParodusError("Params is NULL\n"); } } + +/* + * @brief To store downstream cloud ack messages in a queue for further processing. + */ +void addToCloudAckQ(char *trans_id, int qos, int rdr) +{ + CloudAck *ackmsg; + + ParodusInfo ("Add Xmidt downstream message to CloudAck\n"); + ackmsg = (CloudAck *)malloc(sizeof(CloudAck)); + + if(ackmsg) + { + ackmsg->transaction_id = strdup(trans_id); + ackmsg->qos = qos; + ackmsg->rdr =rdr; + ParodusInfo("ackmsg->transaction_id %s ackmsg->qos %d ackmsg->rdr %d\n", ackmsg->transaction_id,ackmsg->qos,ackmsg->rdr); + ackmsg->next=NULL; + pthread_mutex_lock (&cloudack_mut); + //Producer adds the sent msg into queue + if(CloudAckQ == NULL) + { + CloudAckQ = ackmsg; + + ParodusInfo("Producer added cloud ack msg to Q\n"); + pthread_cond_signal(&cloudack_con); + pthread_mutex_unlock (&cloudack_mut); + ParodusInfo("mutex unlock in cloud ack producer\n"); + } + else + { + CloudAck *temp = CloudAckQ; + while(temp->next) + { + temp = temp->next; + } + temp->next = ackmsg; + pthread_mutex_unlock (&cloudack_mut); + } + } + else + { + ParodusError("failure in allocation for cloud ack\n"); + } + return; +} + +//Consumer thread to process cloud ack. +void processCloudAck() +{ + int err = 0; + err = pthread_create(&cloudackThreadId, NULL, cloudAckHandler, NULL); + if (err != 0) + { + ParodusError("Error creating processCloudAck thread :[%s]\n", strerror(err)); + } + else + { + ParodusInfo("processCloudAck thread created Successfully\n"); + } +} + +//To handle downstream cloud ack and send callback to consumer component. +void* cloudAckHandler() +{ + int rv = 0; + while(FOREVER()) + { + pthread_mutex_lock (&cloudack_mut); + ParodusInfo("mutex lock in cloudack consumer thread\n"); + if(CloudAckQ != NULL) + { + CloudAck *Data = CloudAckQ; + CloudAckQ = CloudAckQ->next; + pthread_mutex_unlock (&cloudack_mut); + ParodusInfo("mutex unlock in cloudack consumer thread\n"); + ParodusInfo("Data->transaction_id %s Data->qos %d Data->rdr %d\n", Data->transaction_id,Data->qos,Data->rdr); + rv = processCloudAckMsg(Data->transaction_id, Data->qos, Data->rdr); + if(rv) + { + ParodusInfo("processCloudAckMsg success\n"); + } + else + { + ParodusError("processCloudAckMsg failed\n"); + } + ParodusInfo("Data->transaction_id free\n"); + if((Data !=NULL) && (Data->transaction_id !=NULL)) + { + free(Data->transaction_id); + Data->transaction_id = NULL; + ParodusInfo("Data free\n"); + free(Data); + Data = NULL; + } + ParodusInfo("processCloudAckMsg done\n"); + } + else + { + if (g_shutdown) + { + pthread_mutex_unlock (&cloudack_mut); + break; + } + ParodusInfo("Before cond wait in cloudack consumer thread\n"); + pthread_cond_wait(&cloudack_con, &cloudack_mut); + pthread_mutex_unlock (&cloudack_mut); + ParodusInfo("mutex unlock in cloudack thread after cond wait\n"); + } + } + return NULL; +} + +//Check cloud ack and send rbus callback based on transaction id of xmidt send messages. +int processCloudAckMsg(char *cloud_transID, int qos, int rdr) +{ + if(cloud_transID == NULL) + { + ParodusError("cloud_transID is NULL, failed to process cloud ack\n"); + return 0; + } + ParodusInfo("processCloudAckMsg cloud_transID %s, qos %d, rdr %d\n", cloud_transID, qos, rdr); + + XmidtMsg *temp = NULL; + wrp_msg_t *xmdMsg = NULL; + char *xmdMsgTransID = NULL; + char * errorMsg = NULL; + + temp = get_global_XmidtMsg(); + while (NULL != temp) + { + xmdMsg = temp->msg; + + if(xmdMsg !=NULL) + { + ParodusInfo("xmdMsg->u.event.transaction_uuid is %s temp->startTime %lu temp->status %s\n",xmdMsg->u.event.transaction_uuid, temp->startTime, temp->status); + xmdMsgTransID = xmdMsg->u.event.transaction_uuid; + ParodusInfo("xmdMsgTransID is %s\n",xmdMsgTransID); + if(xmdMsgTransID !=NULL) + { + if( strcmp(cloud_transID, xmdMsgTransID) == 0) + { + ParodusInfo("transaction_id %s is matching, send callback\n", cloud_transID); + errorMsg = strdup("Delivered (success)"); + createOutParamsandSendAck(xmdMsg, temp->asyncHandle, errorMsg, DELIVERED_SUCCESS, rdr); + wrp_free_struct(xmdMsg); + //xmidtQDequeue(); handle this based on status. + return 1; + } + else + { + ParodusError("transaction_id %s is not matching, checking next\n", cloud_transID); + } + } + else + { + ParodusError("xmdMsgTransID is NULL\n"); + } + } + else + { + ParodusError("xmdMsg is NULL\n"); + } + ParodusInfo("checking the next item in the list\n"); + temp= temp->next; + } + ParodusInfo("checkTransIDAndSendCallback done\n"); + return 0; +} + +//updateXmidtMsgStatus based on msg transaction id . +int updateXmidtMsgStatus(wrp_msg_t *msg, char *status) +{ + if(msg == NULL) + { + ParodusError("msg is NULL, updateXmidtMsgStatus failed\n"); + return 0; + } + ParodusInfo("status to be updated %s\n", status); + //TODO: set status + return 1; +} diff --git a/src/xmidtsend_rbus.h b/src/xmidtsend_rbus.h index d47f40e..6d69898 100644 --- a/src/xmidtsend_rbus.h +++ b/src/xmidtsend_rbus.h @@ -39,9 +39,19 @@ typedef struct XmidtMsg__ { wrp_msg_t *msg; rbusMethodAsyncHandle_t asyncHandle; + char *status; + long long startTime; struct XmidtMsg__ *next; } XmidtMsg; +typedef struct CloudAck__ +{ + char *transaction_id; + int qos; + int rdr; + struct CloudAck__ *next; +} CloudAck; + typedef enum { DELIVERED_SUCCESS = 0, @@ -77,6 +87,12 @@ void xmidtQDequeue(); bool highQosValueCheck(int qos); void waitTillConnectionIsUp(); void printRBUSParams(rbusObject_t params, char* file_path); +void addToCloudAckQ(char *transaction_id, int qos, int rdr); +void processCloudAck(); +void* cloudAckHandler(); +int processCloudAckMsg(char *trans_id, int qos, int rdr); +int checkCloudAckTimer(int startTime); +int updateXmidtMsgStatus(wrp_msg_t *msg, char *status); #ifdef __cplusplus } #endif diff --git a/tests/test_conn_interface.c b/tests/test_conn_interface.c index 98554e8..6e93362 100644 --- a/tests/test_conn_interface.c +++ b/tests/test_conn_interface.c @@ -144,6 +144,10 @@ void packMetaData() function_called(); } +int get_parodus_init() +{ + return 0; +} int get_cloud_disconnect_time(void) { diff --git a/tests/test_downstream.c b/tests/test_downstream.c index 5b7961f..f43108f 100755 --- a/tests/test_downstream.c +++ b/tests/test_downstream.c @@ -64,7 +64,18 @@ reg_list_item_t * get_global_node(void) void release_global_node (void) { } - +void addToCloudAckQ(char *transaction_id, int qos, int rdr) +{ + (void)transaction_id; + (void)qos; + (void)rdr; + return; +} +bool highQosValueCheck(int qos) +{ + (void)qos; + return false; +} ssize_t wrp_to_struct( const void *bytes, const size_t length, const enum wrp_format fmt, wrp_msg_t **msg ) { diff --git a/tests/test_downstream_more.c b/tests/test_downstream_more.c index 7fb63a0..41e1528 100644 --- a/tests/test_downstream_more.c +++ b/tests/test_downstream_more.c @@ -192,6 +192,20 @@ int validate_partner_id(wrp_msg_t *msg, partners_t **partnerIds) return 1; } +void addToCloudAckQ(char *transaction_id, int qos, int rdr) +{ + (void)transaction_id; + (void)qos; + (void)rdr; + return; +} + +bool highQosValueCheck(int qos) +{ + (void)qos; + return false; +} + ssize_t wrp_to_struct( const void *bytes, const size_t length, const enum wrp_format fmt, wrp_msg_t **msg ) { From 454ec260654dd11ebf6acbc6727dcc68d3822d53 Mon Sep 17 00:00:00 2001 From: Sadhyama Vengilat Date: Thu, 2 Jun 2022 17:50:35 +0530 Subject: [PATCH 069/137] Xmidt msg status update based on cloud ack --- src/xmidtsend_rbus.c | 89 ++++++++++++++++++++++++++++++++++---------- src/xmidtsend_rbus.h | 7 ++-- 2 files changed, 73 insertions(+), 23 deletions(-) diff --git a/src/xmidtsend_rbus.c b/src/xmidtsend_rbus.c index 6989b1a..7314692 100644 --- a/src/xmidtsend_rbus.c +++ b/src/xmidtsend_rbus.c @@ -108,7 +108,7 @@ void addToXmidtUpstreamQ(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle) message->msg = msg; message->asyncHandle =asyncHandle; message->startTime = 0; //TODO: calculate current time and add it - message->status = "pending"; + message->status = strdup("pending"); //Increment queue size to handle max queue limit XmidtQsize++; message->next=NULL; @@ -186,18 +186,19 @@ void* processXmidtUpstreamMsg() ParodusInfo("xmidt msg status is %s\n", Data->status); pthread_mutex_unlock (&xmidt_mut); ParodusPrint("mutex unlock in xmidt consumer thread\n"); - rv = processData(Data->msg, Data->asyncHandle); + rv = processData(Data, Data->msg, Data->asyncHandle); if(!rv) { - ParodusPrint("Data->msg wrp free\n"); + ParodusInfo("Data->msg wrp free\n"); wrp_free_struct(Data->msg); } else { - free(Data->msg); + ParodusInfo("Not freeing Data msg as it is waiting for cloud ack\n"); + //free(Data->msg); Not freeing Data msg as it is waiting for cloud ack } - free(Data); - Data = NULL; + //free(Data); + //Data = NULL; } else { @@ -224,7 +225,7 @@ void* processXmidtUpstreamMsg() } //To validate and send events upstream -int processData(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle) +int processData(XmidtMsg *Datanode, wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle) { int rv = 0; char *errorMsg = "none"; @@ -245,7 +246,7 @@ int processData(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle) if(rv) { ParodusPrint("validation successful, send event to server\n"); - sendXmidtEventToServer(xmidtMsg, asyncHandle); + sendXmidtEventToServer(Datanode, xmidtMsg, asyncHandle); return rv; } else @@ -355,7 +356,7 @@ int validateXmidtData(wrp_msg_t * eventMsg, char **errorMsg, int *statusCode) return 1; } -void sendXmidtEventToServer(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle) +void sendXmidtEventToServer(XmidtMsg *msgnode, wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle) { wrp_msg_t *notif_wrp_msg = NULL; ssize_t msg_len; @@ -491,7 +492,19 @@ void sendXmidtEventToServer(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle ParodusInfo("Start processCloudAck consumer\n"); processCloudAck(); //update msg status from "pending" to "sent". - updateXmidtMsgStatus(msg , "sent"); + ParodusInfo("B4 updateXmidtMsgStatus\n"); + int upRet = updateXmidtMsgStatus(msgnode, "sent"); + if(upRet) + { + ParodusInfo("updateXmidtMsgStatus success\n"); + } + else + { + ParodusError("updateXmidtMsgStatus failed\n"); + } + ParodusInfo("B4 print_xmidMsg_list\n"); + print_xmidMsg_list(); + ParodusInfo("print_xmidMsg_list done\n"); //xmidtQDequeue(); //ParodusInfo("xmidtQDequeue done for high Qos msg\n"); } @@ -504,18 +517,18 @@ void sendXmidtEventToServer(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle } } - ParodusInfo("B4 notif wrp_free_struct\n"); + /*ParodusInfo("B4 notif wrp_free_struct\n"); if(notif_wrp_msg != NULL) { wrp_free_struct(notif_wrp_msg); - } + }*/ if(msg_bytes != NULL) { free(msg_bytes); msg_bytes = NULL; } - + ParodusInfo("sendXmidtEventToServer done\n"); } else { @@ -1071,8 +1084,10 @@ int processCloudAckMsg(char *cloud_transID, int qos, int rdr) ParodusInfo("transaction_id %s is matching, send callback\n", cloud_transID); errorMsg = strdup("Delivered (success)"); createOutParamsandSendAck(xmdMsg, temp->asyncHandle, errorMsg, DELIVERED_SUCCESS, rdr); - wrp_free_struct(xmdMsg); - //xmidtQDequeue(); handle this based on status. + ParodusInfo("free xmdMsg as callback is sent after cloud ack\n"); + //wrp_free_struct(xmdMsg); + //xmidtQDequeue(); delete this temp node instead of dequeue + ParodusInfo("processCloudAckMsg done\n"); return 1; } else @@ -1097,14 +1112,48 @@ int processCloudAckMsg(char *cloud_transID, int qos, int rdr) } //updateXmidtMsgStatus based on msg transaction id . -int updateXmidtMsgStatus(wrp_msg_t *msg, char *status) +int updateXmidtMsgStatus(XmidtMsg * temp, char *status) { - if(msg == NULL) + if(temp == NULL) { - ParodusError("msg is NULL, updateXmidtMsgStatus failed\n"); + ParodusError("XmidtMsg is NULL, updateXmidtMsgStatus failed\n"); return 0; } ParodusInfo("status to be updated %s\n", status); - //TODO: set status - return 1; + if (NULL != temp) + { + if (NULL != temp->status) + { + ParodusInfo("node is pointing to temp->status %s\n",temp->status); + pthread_mutex_lock (&xmidt_mut); + if(strcmp(temp->status, status) !=0) + { + ParodusInfo("B4 free\n"); + free(temp->status); + temp->status = NULL; + ParodusInfo("after free\n"); + temp->status = strdup(status); + } + ParodusInfo("msgnode is updated with status %s\n", temp->status); + pthread_mutex_unlock (&xmidt_mut); + return 1; + } + } + ParodusInfo("XmidtMsg list is empty\n"); + return 0; +} + + +void print_xmidMsg_list() +{ + XmidtMsg *temp = NULL; + temp = get_global_XmidtMsg(); + while (NULL != temp) + { + wrp_msg_t *xmdMsg = temp->msg; + ParodusInfo("node is pointing to xmdMsg transid %s temp->status %s temp->startTime %lu\n", xmdMsg->u.event.transaction_uuid, temp->status, temp->startTime); + temp= temp->next; + } + ParodusInfo("print_xmidMsg_list done\n"); + return; } diff --git a/src/xmidtsend_rbus.h b/src/xmidtsend_rbus.h index 6d69898..0b93c32 100644 --- a/src/xmidtsend_rbus.h +++ b/src/xmidtsend_rbus.h @@ -76,8 +76,8 @@ rbusHandle_t get_parodus_rbus_Handle(void); void addToXmidtUpstreamQ(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle); void* processXmidtUpstreamMsg(); void processXmidtData(); -int processData(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle); -void sendXmidtEventToServer(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle); +int processData(XmidtMsg *Datanode, wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle); +void sendXmidtEventToServer(XmidtMsg *msgnode, wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle); int checkInputParameters(rbusObject_t inParams); char* generate_transaction_uuid(); void parseRbusInparamsToWrp(rbusObject_t inParams, char *trans_id, wrp_msg_t **eventMsg); @@ -92,7 +92,8 @@ void processCloudAck(); void* cloudAckHandler(); int processCloudAckMsg(char *trans_id, int qos, int rdr); int checkCloudAckTimer(int startTime); -int updateXmidtMsgStatus(wrp_msg_t *msg, char *status); +int updateXmidtMsgStatus(XmidtMsg * temp, char *status); +void print_xmidMsg_list(); #ifdef __cplusplus } #endif From 4cb167e8dd8a35207384e2c96b17a126b1b07910 Mon Sep 17 00:00:00 2001 From: Sadhyama Vengilat Date: Fri, 3 Jun 2022 20:22:08 +0530 Subject: [PATCH 070/137] Fix xmidtQ head node NULL issue while cloud ack processing --- src/xmidtsend_rbus.c | 43 ++++++++++++++++--------------------------- 1 file changed, 16 insertions(+), 27 deletions(-) diff --git a/src/xmidtsend_rbus.c b/src/xmidtsend_rbus.c index 7314692..97c2552 100644 --- a/src/xmidtsend_rbus.c +++ b/src/xmidtsend_rbus.c @@ -164,7 +164,6 @@ void processXmidtData() void* processXmidtUpstreamMsg() { int rv = 0; - char *status = NULL; while(FOREVER()) { if(get_parodus_init()) @@ -177,36 +176,25 @@ void* processXmidtUpstreamMsg() } pthread_mutex_lock (&xmidt_mut); ParodusPrint("mutex lock in xmidt consumer thread\n"); - if(XmidtMsgQ != NULL) + if ((XmidtMsgQ != NULL) && (XmidtMsgQ->status !=NULL && strcmp(XmidtMsgQ->status , "pending") == 0)) { XmidtMsg *Data = XmidtMsgQ; - status = Data->status; - if (status !=NULL && strcmp(status , "pending") == 0) + ParodusInfo("xmidt msg status is %s\n", Data->status); + pthread_mutex_unlock (&xmidt_mut); + ParodusPrint("mutex unlock in xmidt consumer thread\n"); + rv = processData(Data, Data->msg, Data->asyncHandle); + if(!rv) { - ParodusInfo("xmidt msg status is %s\n", Data->status); - pthread_mutex_unlock (&xmidt_mut); - ParodusPrint("mutex unlock in xmidt consumer thread\n"); - rv = processData(Data, Data->msg, Data->asyncHandle); - if(!rv) - { - ParodusInfo("Data->msg wrp free\n"); - wrp_free_struct(Data->msg); - } - else - { - ParodusInfo("Not freeing Data msg as it is waiting for cloud ack\n"); - //free(Data->msg); Not freeing Data msg as it is waiting for cloud ack - } - //free(Data); - //Data = NULL; + ParodusInfo("Data->msg wrp free\n"); + wrp_free_struct(Data->msg); } else { - ParodusInfo("xmidt msg status is %s, check next msg\n", status); - XmidtMsgQ = XmidtMsgQ->next; - pthread_mutex_unlock (&xmidt_mut); - ParodusInfo("mutex unlock in xmidt consumer\n"); + ParodusInfo("Not freeing Data msg as it is waiting for cloud ack\n"); + //free(Data->msg); Not freeing Data msg as it is waiting for cloud ack } + //free(Data); + //Data = NULL; } else { @@ -215,10 +203,10 @@ void* processXmidtUpstreamMsg() pthread_mutex_unlock (&xmidt_mut); break; } - ParodusPrint("Before cond wait in xmidt consumer thread\n"); + ParodusInfo("Before cond wait in xmidt consumer thread\n"); pthread_cond_wait(&xmidt_con, &xmidt_mut); pthread_mutex_unlock (&xmidt_mut); - ParodusPrint("mutex unlock in xmidt thread after cond wait\n"); + ParodusInfo("mutex unlock in xmidt thread after cond wait\n"); } } return NULL; @@ -871,7 +859,8 @@ static rbusError_t sendDataHandler(rbusHandle_t handle, char const* methodName, if(inStatus) { //generate transaction id to create outParams and send ack - transaction_uuid = generate_transaction_uuid(); + //transaction_uuid = generate_transaction_uuid(); + transaction_uuid = strdup("8d72d4c2-1f59-4420-a736-3946083d529a"); //Testing ParodusInfo("xmidt transaction_uuid generated is %s\n", transaction_uuid); parseRbusInparamsToWrp(inParams, transaction_uuid, &wrpMsg); From 32138613bb1104c8676e3eb64a12864f30801b47 Mon Sep 17 00:00:00 2001 From: Thanusha D Date: Thu, 9 Jun 2022 14:53:13 +0530 Subject: [PATCH 071/137] To get max-queue-size from startparodus --- src/config.c | 19 +++++++++++++++++-- src/config.h | 3 +++ src/xmidtsend_rbus.c | 3 ++- src/xmidtsend_rbus.h | 2 +- 4 files changed, 23 insertions(+), 4 deletions(-) diff --git a/src/config.c b/src/config.c index 2477c20..7bf283d 100644 --- a/src/config.c +++ b/src/config.c @@ -400,6 +400,9 @@ int parseCommandLine(int argc,char **argv,ParodusCfg * cfg) {"webpa-backoff-max", required_argument, 0, 'o'}, {"webpa-interface-used", required_argument, 0, 'i'}, {"parodus-local-url", required_argument, 0, 'l'}, +#ifdef WAN_FAILOVER_SUPPORTED + {"max-queue-size", required_argument, 0, 'q'}, +#endif {"partner-id", required_argument, 0, 'p'}, #ifdef ENABLE_SESHAT {"seshat-url", required_argument, 0, 'e'}, @@ -447,7 +450,7 @@ int parseCommandLine(int argc,char **argv,ParodusCfg * cfg) /* getopt_long stores the option index here. */ int option_index = 0; c = getopt_long (argc, argv, - "m:s:f:d:r:n:b:u:t:o:i:l:p:e:D:j:a:k:c:T:w:J:46:C:S:R:K:M", + "m:s:f:d:r:n:b:u:t:o:i:l:q:p:e:D:j:a:k:c:T:w:J:46:C:S:R:K:M", long_options, &option_index); /* Detect the end of the options. */ @@ -533,6 +536,16 @@ int parseCommandLine(int argc,char **argv,ParodusCfg * cfg) parStrncpy(cfg->local_url, optarg,sizeof(cfg->local_url)); ParodusInfo("parodus local_url is %s\n",cfg->local_url); break; + +#ifdef WAN_FAILOVER_SUPPORTED + case 'q': + cfg->max_queue_size = parse_num_arg (optarg, "max-queue-size"); + if (cfg->max_queue_size == (unsigned int) -1) + return -1; + ParodusInfo("max_queue_size is %d\n",cfg->max_queue_size); + break; +#endif + case 'D': // like 'fabric' or 'test' // this parameter is used, along with the hw_mac parameter @@ -837,7 +850,9 @@ void loadParodusCfg(ParodusCfg * config,ParodusCfg *cfg) parStrncpy(cfg->cert_path, "\0", sizeof(cfg->cert_path)); ParodusPrint("cert_path is NULL. set to empty\n"); } - + #ifdef WAN_FAILOVER_SUPPORTED + cfg->max_queue_size = config->max_queue_size; + #endif cfg->boot_time = config->boot_time; cfg->webpa_ping_timeout = config->webpa_ping_timeout; cfg->webpa_backoff_max = config->webpa_backoff_max; diff --git a/src/config.h b/src/config.h index 37decb8..6ce49de 100644 --- a/src/config.h +++ b/src/config.h @@ -88,6 +88,9 @@ typedef struct char webpa_uuid[64]; unsigned int flags; char local_url[124]; +#ifdef WAN_FAILOVER_SUPPORTED + unsigned int max_queue_size; +#endif char partner_id[64]; #ifdef ENABLE_SESHAT char seshat_url[128]; diff --git a/src/xmidtsend_rbus.c b/src/xmidtsend_rbus.c index fc28053..5cffa13 100644 --- a/src/xmidtsend_rbus.c +++ b/src/xmidtsend_rbus.c @@ -67,7 +67,7 @@ void addToXmidtUpstreamQ(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle) XmidtMsg *message; ParodusPrint("XmidtQsize is %d\n" , XmidtQsize); - if(XmidtQsize == MAX_QUEUE_SIZE) + if(XmidtQsize == get_parodus_cfg()->max_queue_size) { char * errorMsg = strdup("Max Queue Size Exceeded"); ParodusError("Queue Size Exceeded\n"); @@ -330,6 +330,7 @@ void sendXmidtEventToServer(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle char *errorMsg = NULL; int qos = 0; + ParodusInfo("MAX_QUEUE_SIZE: %d\n", get_parodus_cfg()->max_queue_size); notif_wrp_msg = (wrp_msg_t *)malloc(sizeof(wrp_msg_t)); if(notif_wrp_msg != NULL) { diff --git a/src/xmidtsend_rbus.h b/src/xmidtsend_rbus.h index d47f40e..5fabe3f 100644 --- a/src/xmidtsend_rbus.h +++ b/src/xmidtsend_rbus.h @@ -24,13 +24,13 @@ #ifndef _XMIDTSEND_RBUS_H_ #define _XMIDTSEND_RBUS_H_ #include +#include "config.h" #include #ifdef __cplusplus extern "C" { #endif #define XMIDT_SEND_METHOD "Device.X_RDK_Xmidt.SendData" -#define MAX_QUEUE_SIZE 10 #define INPARAMS_PATH "/tmp/inparams.txt" /*----------------------------------------------------------------------------*/ /* Data Structures */ From c0edaaf31c71f6231882fbb4cb6a5f3c100dac09 Mon Sep 17 00:00:00 2001 From: Thanusha D Date: Fri, 3 Jun 2022 15:26:32 +0530 Subject: [PATCH 072/137] Added logs for debugging --- src/upstream_rbus.c | 16 ++++++++++++++-- src/xmidtsend_rbus.c | 15 +++++++++++---- src/xmidtsend_rbus.h | 1 + 3 files changed, 26 insertions(+), 6 deletions(-) diff --git a/src/upstream_rbus.c b/src/upstream_rbus.c index 75250e7..2ce1e4a 100644 --- a/src/upstream_rbus.c +++ b/src/upstream_rbus.c @@ -174,11 +174,15 @@ void eventReceiveHandler( rbusHandle_t rbus_Handle, rbusEvent_t const* event, rb rbusValue_t newValue = rbusObject_GetValue(event->data, "value"); rbusValue_t oldValue = rbusObject_GetValue(event->data, "oldValue"); ParodusInfo("Consumer received ValueChange event for param %s\n", event->name); - + if(newValue) { interface = (char *) rbusValue_GetString(newValue, NULL); setWebpaInterface(interface); - } + } + else { + ParodusError("newValue is NULL\n"); + } + if(newValue !=NULL && oldValue!=NULL && interface!=NULL) { ParodusInfo("New Value: %s Old Value: %s New Interface Value: %s\n", rbusValue_GetString(newValue, NULL), rbusValue_GetString(oldValue, NULL), interface); @@ -195,5 +199,13 @@ void eventReceiveHandler( rbusHandle_t rbus_Handle, rbusEvent_t const* event, rb set_close_retry(); } + else { + if(oldValue == NULL) { + ParodusError("oldValue is NULL\n"); + } + if(interface == NULL) { + ParodusError("interface is NULL\n"); + } + } } #endif diff --git a/src/xmidtsend_rbus.c b/src/xmidtsend_rbus.c index fc28053..be34e65 100644 --- a/src/xmidtsend_rbus.c +++ b/src/xmidtsend_rbus.c @@ -45,6 +45,10 @@ const char * contentTypeList[]={ "application/binary" }; +void printSendMsgData(char* status, int qos, char* dest, char* transaction_uuid) { + ParodusInfo("status: %s, qos: %d, dest: %s, transaction_uuid: %s\n", (status!=NULL)?status:"NULL", qos, (dest!=NULL)?dest:"NULL", (transaction_uuid!=NULL)?transaction_uuid:"NULL"); +} + bool highQosValueCheck(int qos) { if(qos > 24) @@ -399,6 +403,7 @@ void sendXmidtEventToServer(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle if(msg_len > 0) { ParodusPrint("sendUpstreamMsgToServer\n"); + printSendMsgData("send to server", notif_wrp_msg->u.event.qos, notif_wrp_msg->u.event.dest, notif_wrp_msg->u.event.transaction_uuid); sendRetStatus = sendUpstreamMsgToServer(&msg_bytes, msg_len); } else @@ -429,23 +434,25 @@ void sendXmidtEventToServer(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle { ParodusPrint("The event is having high qos retry again\n"); ParodusInfo("Wait till connection is Up\n"); - - pthread_mutex_lock(get_global_cloud_status_mut()); + + pthread_mutex_lock(get_global_cloud_status_mut()); pthread_cond_wait(get_global_cloud_status_cond(), get_global_cloud_status_mut()); pthread_mutex_unlock(get_global_cloud_status_mut()); ParodusInfo("Received cloud status signal proceed to retry\n"); + printSendMsgData("send to server after cloud reconnect", notif_wrp_msg->u.event.qos, notif_wrp_msg->u.event.dest, notif_wrp_msg->u.event.transaction_uuid); } else { errorMsg = strdup("send failed due to client disconnect"); ParodusInfo("The event is having low qos proceed to dequeue\n"); + printSendMsgData(errorMsg, notif_wrp_msg->u.event.qos, notif_wrp_msg->u.event.dest, notif_wrp_msg->u.event.transaction_uuid); createOutParamsandSendAck(msg, asyncHandle, errorMsg, CLIENT_DISCONNECT, RBUS_ERROR_INVALID_RESPONSE_FROM_DESTINATION); xmidtQDequeue(); break; - } + } sendRetStatus = sendUpstreamMsgToServer(&msg_bytes, msg_len); } - + if(sendRetStatus == 0) { errorMsg = strdup("send to server success"); diff --git a/src/xmidtsend_rbus.h b/src/xmidtsend_rbus.h index d47f40e..bb5dfa0 100644 --- a/src/xmidtsend_rbus.h +++ b/src/xmidtsend_rbus.h @@ -74,6 +74,7 @@ void parseRbusInparamsToWrp(rbusObject_t inParams, char *trans_id, wrp_msg_t **e void createOutParamsandSendAck(wrp_msg_t *msg, rbusMethodAsyncHandle_t asyncHandle, char *errorMsg, int statuscode, rbusError_t error); int validateXmidtData(wrp_msg_t * eventMsg, char **errorMsg, int *statusCode); void xmidtQDequeue(); +void printSendMsgData(char* status, int qos, char* dest, char* transaction_uuid); bool highQosValueCheck(int qos); void waitTillConnectionIsUp(); void printRBUSParams(rbusObject_t params, char* file_path); From 124fc112322c1f9f4c2a557fde925100608ebf58 Mon Sep 17 00:00:00 2001 From: Sadhyama Vengilat Date: Mon, 20 Jun 2022 20:29:04 +0530 Subject: [PATCH 073/137] Add xmidt states and process PENDING messages --- src/ParodusInternal.h | 2 + src/nopoll_helpers.c | 2 +- src/xmidtsend_rbus.c | 125 ++++++++++++++++++++++++++---------------- src/xmidtsend_rbus.h | 14 ++++- 4 files changed, 92 insertions(+), 51 deletions(-) diff --git a/src/ParodusInternal.h b/src/ParodusInternal.h index 7e63f79..bf71ec7 100644 --- a/src/ParodusInternal.h +++ b/src/ParodusInternal.h @@ -188,6 +188,8 @@ pthread_mutex_t *get_interface_down_mut(); pthread_cond_t *get_global_cloud_status_cond(void); pthread_mutex_t *get_global_cloud_status_mut(void); + +int cloud_status_is_online (void); #ifdef __cplusplus } diff --git a/src/nopoll_helpers.c b/src/nopoll_helpers.c index fde2995..4b245a4 100644 --- a/src/nopoll_helpers.c +++ b/src/nopoll_helpers.c @@ -50,7 +50,7 @@ void setMessageHandlers() nopoll_conn_set_on_close(get_global_conn(), (noPollOnCloseHandler)listenerOnCloseMessage, NULL); } -static int cloud_status_is_online (void) +int cloud_status_is_online (void) { const char *status = get_cloud_status(); if (NULL == status) diff --git a/src/xmidtsend_rbus.c b/src/xmidtsend_rbus.c index 97c2552..08475c5 100644 --- a/src/xmidtsend_rbus.c +++ b/src/xmidtsend_rbus.c @@ -83,6 +83,15 @@ void set_global_XmidtMsg(XmidtMsg *new) pthread_mutex_unlock (&xmidt_mut); } +long long currentTime() +{ + struct timespec ct; + long long current_time = 0; + clock_gettime(CLOCK_REALTIME, &ct); + current_time = ct.tv_sec; + return (long long) current_time; +} + /* * @brief To handle xmidt rbus messages received from various components. */ @@ -107,8 +116,9 @@ void addToXmidtUpstreamQ(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle) { message->msg = msg; message->asyncHandle =asyncHandle; - message->startTime = 0; //TODO: calculate current time and add it - message->status = strdup("pending"); + message->state = PENDING; + message->enqueueTime = currentTime(); + message->sentTime = 0; //Increment queue size to handle max queue limit XmidtQsize++; message->next=NULL; @@ -164,6 +174,7 @@ void processXmidtData() void* processXmidtUpstreamMsg() { int rv = 0; + int state = 0; while(FOREVER()) { if(get_parodus_init()) @@ -175,26 +186,57 @@ void* processXmidtUpstreamMsg() ParodusInfo("Received cloud status signal proceed to event processing\n"); } pthread_mutex_lock (&xmidt_mut); - ParodusPrint("mutex lock in xmidt consumer thread\n"); - if ((XmidtMsgQ != NULL) && (XmidtMsgQ->status !=NULL && strcmp(XmidtMsgQ->status , "pending") == 0)) + ParodusInfo("mutex lock in xmidt consumer thread\n"); + if (XmidtMsgQ != NULL) { - XmidtMsg *Data = XmidtMsgQ; - ParodusInfo("xmidt msg status is %s\n", Data->status); - pthread_mutex_unlock (&xmidt_mut); - ParodusPrint("mutex unlock in xmidt consumer thread\n"); - rv = processData(Data, Data->msg, Data->asyncHandle); - if(!rv) + int state = XmidtMsgQ->state; + switch(state) { - ParodusInfo("Data->msg wrp free\n"); - wrp_free_struct(Data->msg); + case PENDING: + ParodusInfo("state : PENDING\n"); + XmidtMsg *Data = XmidtMsgQ; + pthread_mutex_unlock (&xmidt_mut); + ParodusInfo("mutex unlock in xmidt consumer thread\n"); + //Try sending msg to server only when cloud connection is up/online. + if (!cloud_status_is_online ()) + { + ParodusInfo("cloud status is not online, wait till connection up\n"); + pthread_mutex_lock(get_global_cloud_status_mut()); + pthread_cond_wait(get_global_cloud_status_cond(), get_global_cloud_status_mut()); + pthread_mutex_unlock(get_global_cloud_status_mut()); + ParodusInfo("Received cloud status signal, proceed to event processing\n"); + } + ParodusInfo("cloud status is online, processData\n"); + rv = processData(Data, Data->msg, Data->asyncHandle); + if(!rv) + { + ParodusInfo("Data->msg wrp free\n"); + wrp_free_struct(Data->msg); + } + else + { + ParodusInfo("Not freeing Data msg as it is waiting for cloud ack\n"); + //free(Data->msg); Not freeing Data msg as it is waiting for cloud ack + } + //free(Data); + //Data = NULL; + break; + case SENT: + ParodusInfo("state : SENT\n"); + break; + case DELETE: + ParodusInfo("state : DELETE\n"); + break; } - else + XmidtMsgQ = XmidtMsgQ->next; + + // circling back to 1st node + if(XmidtMsgQ == NULL && headNode != NULL) { - ParodusInfo("Not freeing Data msg as it is waiting for cloud ack\n"); - //free(Data->msg); Not freeing Data msg as it is waiting for cloud ack + ParodusInfo("XmidtMsgQ is NULL, circling back to 1st node\n"); + XmidtMsgQ = headNode; } - //free(Data); - //Data = NULL; + sleep(1); } else { @@ -479,16 +521,16 @@ void sendXmidtEventToServer(XmidtMsg *msgnode, wrp_msg_t * msg, rbusMethodAsyncH { ParodusInfo("Start processCloudAck consumer\n"); processCloudAck(); - //update msg status from "pending" to "sent". - ParodusInfo("B4 updateXmidtMsgStatus\n"); - int upRet = updateXmidtMsgStatus(msgnode, "sent"); + //update msg status from PENDING to SENT + ParodusInfo("B4 updateStateAndTime\n"); + int upRet = updateStateAndTime(msgnode, SENT); if(upRet) { - ParodusInfo("updateXmidtMsgStatus success\n"); + ParodusInfo("updateStateAndTime success\n"); } else { - ParodusError("updateXmidtMsgStatus failed\n"); + ParodusError("updateStateAndTime failed\n"); } ParodusInfo("B4 print_xmidMsg_list\n"); print_xmidMsg_list(); @@ -1063,7 +1105,7 @@ int processCloudAckMsg(char *cloud_transID, int qos, int rdr) if(xmdMsg !=NULL) { - ParodusInfo("xmdMsg->u.event.transaction_uuid is %s temp->startTime %lu temp->status %s\n",xmdMsg->u.event.transaction_uuid, temp->startTime, temp->status); + ParodusInfo("xmdMsg->u.event.transaction_uuid is %s temp->enqueueTime %lu temp->state %s\n",xmdMsg->u.event.transaction_uuid, temp->enqueueTime, temp->state); xmdMsgTransID = xmdMsg->u.event.transaction_uuid; ParodusInfo("xmdMsgTransID is %s\n",xmdMsgTransID); if(xmdMsgTransID !=NULL) @@ -1100,36 +1142,25 @@ int processCloudAckMsg(char *cloud_transID, int qos, int rdr) return 0; } -//updateXmidtMsgStatus based on msg transaction id . -int updateXmidtMsgStatus(XmidtMsg * temp, char *status) +//To update state of the msg node that is currently being processed. +int updateStateAndTime(XmidtMsg * temp, int state) { if(temp == NULL) { - ParodusError("XmidtMsg is NULL, updateXmidtMsgStatus failed\n"); + ParodusError("XmidtMsg is NULL, updateStateAndTime failed\n"); return 0; } - ParodusInfo("status to be updated %s\n", status); - if (NULL != temp) + else { - if (NULL != temp->status) - { - ParodusInfo("node is pointing to temp->status %s\n",temp->status); - pthread_mutex_lock (&xmidt_mut); - if(strcmp(temp->status, status) !=0) - { - ParodusInfo("B4 free\n"); - free(temp->status); - temp->status = NULL; - ParodusInfo("after free\n"); - temp->status = strdup(status); - } - ParodusInfo("msgnode is updated with status %s\n", temp->status); - pthread_mutex_unlock (&xmidt_mut); - return 1; - } + ParodusInfo("state to be updated %d\n", state); + ParodusInfo("node is pointing to temp->state %d\n",temp->state); + pthread_mutex_lock (&xmidt_mut); + temp->state = state; + temp->sentTime = currentTime(); + ParodusInfo("msgnode is updated with state %d sentTime %lu\n", temp->state, temp->sentTime); + pthread_mutex_unlock (&xmidt_mut); + return 1; } - ParodusInfo("XmidtMsg list is empty\n"); - return 0; } @@ -1140,7 +1171,7 @@ void print_xmidMsg_list() while (NULL != temp) { wrp_msg_t *xmdMsg = temp->msg; - ParodusInfo("node is pointing to xmdMsg transid %s temp->status %s temp->startTime %lu\n", xmdMsg->u.event.transaction_uuid, temp->status, temp->startTime); + ParodusInfo("node is pointing to xmdMsg transid %s temp->state %d temp->enqueueTime %lu temp->sentTime %lu\n", xmdMsg->u.event.transaction_uuid, temp->state, temp->enqueueTime, temp->sentTime); temp= temp->next; } ParodusInfo("print_xmidMsg_list done\n"); diff --git a/src/xmidtsend_rbus.h b/src/xmidtsend_rbus.h index 0b93c32..9fe12f4 100644 --- a/src/xmidtsend_rbus.h +++ b/src/xmidtsend_rbus.h @@ -39,8 +39,9 @@ typedef struct XmidtMsg__ { wrp_msg_t *msg; rbusMethodAsyncHandle_t asyncHandle; - char *status; - long long startTime; + int state; + long long enqueueTime; + long long sentTime; struct XmidtMsg__ *next; } XmidtMsg; @@ -68,6 +69,13 @@ typedef enum WRP_ENCODE_FAILURE = 103, MSG_PROCESSING_FAILED = 104 } XMIDT_STATUS; + +typedef enum +{ + PENDING = 0, + SENT, + DELETE +} MSG_STATUS; /*----------------------------------------------------------------------------*/ /* Function Prototypes */ /*----------------------------------------------------------------------------*/ @@ -92,7 +100,7 @@ void processCloudAck(); void* cloudAckHandler(); int processCloudAckMsg(char *trans_id, int qos, int rdr); int checkCloudAckTimer(int startTime); -int updateXmidtMsgStatus(XmidtMsg * temp, char *status); +int updateStateAndTime(XmidtMsg * temp, int state); void print_xmidMsg_list(); #ifdef __cplusplus } From 8ea342b537f781fd3aae7264b016dfb122cd971f Mon Sep 17 00:00:00 2001 From: Sadhyama Vengilat Date: Tue, 21 Jun 2022 20:29:36 +0530 Subject: [PATCH 074/137] Xmidt SENT state to process cloud ACK --- src/xmidtsend_rbus.c | 129 ++++++++++++++++--------------------------- src/xmidtsend_rbus.h | 6 +- 2 files changed, 50 insertions(+), 85 deletions(-) diff --git a/src/xmidtsend_rbus.c b/src/xmidtsend_rbus.c index 08475c5..76be9e6 100644 --- a/src/xmidtsend_rbus.c +++ b/src/xmidtsend_rbus.c @@ -67,7 +67,7 @@ bool highQosValueCheck(int qos) return false; } -XmidtMsg * get_global_XmidtMsg(void) +XmidtMsg * get_global_xmidthead(void) { XmidtMsg *tmp = NULL; pthread_mutex_lock (&xmidt_mut); @@ -76,7 +76,7 @@ XmidtMsg * get_global_XmidtMsg(void) return tmp; } -void set_global_XmidtMsg(XmidtMsg *new) +void set_global_xmidthead(XmidtMsg *new) { pthread_mutex_lock (&xmidt_mut); XmidtMsgQ = new; @@ -175,6 +175,9 @@ void* processXmidtUpstreamMsg() { int rv = 0; int state = 0; + long long currTime = 0; + int match_found = 0; + while(FOREVER()) { if(get_parodus_init()) @@ -189,14 +192,15 @@ void* processXmidtUpstreamMsg() ParodusInfo("mutex lock in xmidt consumer thread\n"); if (XmidtMsgQ != NULL) { - int state = XmidtMsgQ->state; - switch(state) + XmidtMsg *Data = XmidtMsgQ; + XmidtMsgQ = XmidtMsgQ->next; + pthread_mutex_unlock (&xmidt_mut); + ParodusInfo("mutex unlock in xmidt consumer thread\n"); + + switch(Data->state) { case PENDING: ParodusInfo("state : PENDING\n"); - XmidtMsg *Data = XmidtMsgQ; - pthread_mutex_unlock (&xmidt_mut); - ParodusInfo("mutex unlock in xmidt consumer thread\n"); //Try sending msg to server only when cloud connection is up/online. if (!cloud_status_is_online ()) { @@ -223,18 +227,49 @@ void* processXmidtUpstreamMsg() break; case SENT: ParodusInfo("state : SENT\n"); + currTime = currentTime(); + ParodusInfo("currTime %d sentTime %lu\n",currTime, Data->sentTime); + if (currTime > (Data->sentTime + CLOUD_ACK_TIMEOUT_SEC)) + { + ParodusInfo("Check cloud ack for matching transaction id\n"); + match_found = checkCloudACK(); + ParodusInfo("match_found is %d\n", match_found); + if (match_found) + { + createOutParamsandSendAck(Data->msg, Data->asyncHandle, "Delivered success", DELIVERED_SUCCESS, RBUS_ERROR_SUCCESS); + ParodusInfo("updateStateAndTime to DELETE\n"); + int upRet = updateStateAndTime(Data, DELETE); + if(upRet) + { + ParodusInfo("updateStateAndTime success\n"); + } + else + { + ParodusError("updateStateAndTime failed\n"); + } + ParodusInfo("B4 print_xmidMsg_list\n"); + print_xmidMsg_list(); + ParodusInfo("print_xmidMsg_list done\n"); + //wrp_free_struct(Data->msg); + //free cloud ack node + } + else + { + ParodusInfo("transaction id match not found, cloud ack timed out. Need to retry\n"); + //Retry . + } + } break; case DELETE: ParodusInfo("state : DELETE\n"); break; } - XmidtMsgQ = XmidtMsgQ->next; // circling back to 1st node - if(XmidtMsgQ == NULL && headNode != NULL) + if(XmidtMsgQ == NULL && get_global_xmidthead() != NULL) { ParodusInfo("XmidtMsgQ is NULL, circling back to 1st node\n"); - XmidtMsgQ = headNode; + XmidtMsgQ = get_global_xmidthead(); } sleep(1); } @@ -519,8 +554,6 @@ void sendXmidtEventToServer(XmidtMsg *msgnode, wrp_msg_t * msg, rbusMethodAsyncH { if(highQosValueCheck(qos)) { - ParodusInfo("Start processCloudAck consumer\n"); - processCloudAck(); //update msg status from PENDING to SENT ParodusInfo("B4 updateStateAndTime\n"); int upRet = updateStateAndTime(msgnode, SENT); @@ -1017,81 +1050,15 @@ void addToCloudAckQ(char *trans_id, int qos, int rdr) return; } -//Consumer thread to process cloud ack. -void processCloudAck() -{ - int err = 0; - err = pthread_create(&cloudackThreadId, NULL, cloudAckHandler, NULL); - if (err != 0) - { - ParodusError("Error creating processCloudAck thread :[%s]\n", strerror(err)); - } - else - { - ParodusInfo("processCloudAck thread created Successfully\n"); - } -} - -//To handle downstream cloud ack and send callback to consumer component. -void* cloudAckHandler() -{ - int rv = 0; - while(FOREVER()) - { - pthread_mutex_lock (&cloudack_mut); - ParodusInfo("mutex lock in cloudack consumer thread\n"); - if(CloudAckQ != NULL) - { - CloudAck *Data = CloudAckQ; - CloudAckQ = CloudAckQ->next; - pthread_mutex_unlock (&cloudack_mut); - ParodusInfo("mutex unlock in cloudack consumer thread\n"); - ParodusInfo("Data->transaction_id %s Data->qos %d Data->rdr %d\n", Data->transaction_id,Data->qos,Data->rdr); - rv = processCloudAckMsg(Data->transaction_id, Data->qos, Data->rdr); - if(rv) - { - ParodusInfo("processCloudAckMsg success\n"); - } - else - { - ParodusError("processCloudAckMsg failed\n"); - } - ParodusInfo("Data->transaction_id free\n"); - if((Data !=NULL) && (Data->transaction_id !=NULL)) - { - free(Data->transaction_id); - Data->transaction_id = NULL; - ParodusInfo("Data free\n"); - free(Data); - Data = NULL; - } - ParodusInfo("processCloudAckMsg done\n"); - } - else - { - if (g_shutdown) - { - pthread_mutex_unlock (&cloudack_mut); - break; - } - ParodusInfo("Before cond wait in cloudack consumer thread\n"); - pthread_cond_wait(&cloudack_con, &cloudack_mut); - pthread_mutex_unlock (&cloudack_mut); - ParodusInfo("mutex unlock in cloudack thread after cond wait\n"); - } - } - return NULL; -} - //Check cloud ack and send rbus callback based on transaction id of xmidt send messages. -int processCloudAckMsg(char *cloud_transID, int qos, int rdr) +int checkCloudACK(char *cloud_transID, int qos, int rdr) { if(cloud_transID == NULL) { ParodusError("cloud_transID is NULL, failed to process cloud ack\n"); return 0; } - ParodusInfo("processCloudAckMsg cloud_transID %s, qos %d, rdr %d\n", cloud_transID, qos, rdr); + ParodusInfo("checkCloudACK cloud_transID %s, qos %d, rdr %d\n", cloud_transID, qos, rdr); XmidtMsg *temp = NULL; wrp_msg_t *xmdMsg = NULL; @@ -1118,7 +1085,7 @@ int processCloudAckMsg(char *cloud_transID, int qos, int rdr) ParodusInfo("free xmdMsg as callback is sent after cloud ack\n"); //wrp_free_struct(xmdMsg); //xmidtQDequeue(); delete this temp node instead of dequeue - ParodusInfo("processCloudAckMsg done\n"); + ParodusInfo("checkCloudACK done\n"); return 1; } else diff --git a/src/xmidtsend_rbus.h b/src/xmidtsend_rbus.h index 9fe12f4..0f8d85b 100644 --- a/src/xmidtsend_rbus.h +++ b/src/xmidtsend_rbus.h @@ -32,6 +32,7 @@ extern "C" { #define XMIDT_SEND_METHOD "Device.X_RDK_Xmidt.SendData" #define MAX_QUEUE_SIZE 10 #define INPARAMS_PATH "/tmp/inparams.txt" +#define CLOUD_ACK_TIMEOUT_SEC 7 /*----------------------------------------------------------------------------*/ /* Data Structures */ /*----------------------------------------------------------------------------*/ @@ -96,10 +97,7 @@ bool highQosValueCheck(int qos); void waitTillConnectionIsUp(); void printRBUSParams(rbusObject_t params, char* file_path); void addToCloudAckQ(char *transaction_id, int qos, int rdr); -void processCloudAck(); -void* cloudAckHandler(); -int processCloudAckMsg(char *trans_id, int qos, int rdr); -int checkCloudAckTimer(int startTime); +int checkCloudACK(char *trans_id, int qos, int rdr); int updateStateAndTime(XmidtMsg * temp, int state); void print_xmidMsg_list(); #ifdef __cplusplus From 1b23de5a12fa8efe5524bcb751bd93c69c48d9cc Mon Sep 17 00:00:00 2001 From: Sadhyama Vengilat Date: Wed, 22 Jun 2022 20:25:58 +0530 Subject: [PATCH 075/137] SENT state cloud ack timeout retry handling and ping detection --- src/ParodusInternal.c | 8 + src/ParodusInternal.h | 3 +- src/heartBeat.c | 22 +- src/heartBeat.h | 4 + src/nopoll_handlers.c | 1 + src/xmidtsend_rbus.c | 302 +++++++++++++++----------- src/xmidtsend_rbus.h | 6 +- tests/CMakeLists.txt | 7 +- tests/test_conn_interface.c | 9 +- tests/test_connection.c | 4 + tests/test_heartBeatTimer.c | 5 +- tests/test_nopoll_handlers.c | 5 + tests/test_nopoll_handlers_fragment.c | 5 +- 13 files changed, 242 insertions(+), 139 deletions(-) diff --git a/src/ParodusInternal.c b/src/ParodusInternal.c index cdbeff2..49d0d39 100644 --- a/src/ParodusInternal.c +++ b/src/ParodusInternal.c @@ -151,6 +151,14 @@ int readFromFile(const char *file_name, char **data) return 1; } +long long currentTime() +{ + struct timespec ct; + long long current_time = 0; + clock_gettime(CLOCK_REALTIME, &ct); + current_time = ct.tv_sec; + return (long long) current_time; +} void timespec_diff(struct timespec *start, struct timespec *stop, struct timespec *diff) diff --git a/src/ParodusInternal.h b/src/ParodusInternal.h index bf71ec7..236f2bb 100644 --- a/src/ParodusInternal.h +++ b/src/ParodusInternal.h @@ -190,7 +190,8 @@ pthread_cond_t *get_global_cloud_status_cond(void); pthread_mutex_t *get_global_cloud_status_mut(void); int cloud_status_is_online (void); - + +long long currentTime(); #ifdef __cplusplus } #endif diff --git a/src/heartBeat.c b/src/heartBeat.c index 41eeb37..e721cb5 100644 --- a/src/heartBeat.c +++ b/src/heartBeat.c @@ -22,12 +22,15 @@ */ #include "heartBeat.h" +#include "time.h" #include volatile unsigned int heartBeatTimer = 0; volatile bool paused = false; +volatile long long pingTimeStamp = 0; pthread_mutex_t heartBeat_mut=PTHREAD_MUTEX_INITIALIZER; +pthread_mutex_t ping_mut=PTHREAD_MUTEX_INITIALIZER; // Get value of heartBeatTimer unsigned int get_heartBeatTimer() @@ -73,5 +76,22 @@ void resume_heartBeatTimer() pthread_mutex_unlock (&heartBeat_mut); } +// Set ping received timeStamp +void set_pingTimeStamp() +{ + struct timespec ts; + getCurrentTime(&ts); + pthread_mutex_lock (&ping_mut); + pingTimeStamp = (long long)ts.tv_sec; + pthread_mutex_unlock (&ping_mut); +} - +// Get ping received timeStamp +long long get_pingTimeStamp() +{ + long long tmp = 0; + pthread_mutex_lock (&ping_mut); + tmp = pingTimeStamp; + pthread_mutex_unlock (&ping_mut); + return tmp; +} diff --git a/src/heartBeat.h b/src/heartBeat.h index 2986968..04a73c4 100644 --- a/src/heartBeat.h +++ b/src/heartBeat.h @@ -45,6 +45,10 @@ void pause_heartBeatTimer(); // Resume heartBeatTimer, i.e. resume incrementing void resume_heartBeatTimer(); +void set_pingTimeStamp(); + +long long get_pingTimeStamp(); + #ifdef __cplusplus } #endif diff --git a/src/nopoll_handlers.c b/src/nopoll_handlers.c index 6172e7d..e363b04 100644 --- a/src/nopoll_handlers.c +++ b/src/nopoll_handlers.c @@ -149,6 +149,7 @@ void listenerOnPingMessage (noPollCtx * ctx, noPollConn * conn, noPollMsg * msg, if (nopoll_msg_opcode(msg) == NOPOLL_PING_FRAME) { reset_heartBeatTimer(); + set_pingTimeStamp(); } } } diff --git a/src/xmidtsend_rbus.c b/src/xmidtsend_rbus.c index 76be9e6..b845ead 100644 --- a/src/xmidtsend_rbus.c +++ b/src/xmidtsend_rbus.c @@ -28,14 +28,14 @@ #include "partners_check.h" #include "xmidtsend_rbus.h" #include "config.h" +#include "heartBeat.h" static pthread_t processThreadId = 0; -static pthread_t cloudackThreadId = 0; static int XmidtQsize = 0; XmidtMsg *XmidtMsgQ = NULL; -CloudAck *CloudAckQ = NULL; +CloudAck *g_cloudackHead = NULL; pthread_mutex_t xmidt_mut=PTHREAD_MUTEX_INITIALIZER; @@ -43,8 +43,6 @@ pthread_cond_t xmidt_con=PTHREAD_COND_INITIALIZER; pthread_mutex_t cloudack_mut=PTHREAD_MUTEX_INITIALIZER; -pthread_cond_t cloudack_con=PTHREAD_COND_INITIALIZER; - const char * contentTypeList[]={ "application/json", "avro/binary", @@ -83,15 +81,27 @@ void set_global_xmidthead(XmidtMsg *new) pthread_mutex_unlock (&xmidt_mut); } -long long currentTime() +CloudAck * get_global_cloud_node(void) { - struct timespec ct; - long long current_time = 0; - clock_gettime(CLOCK_REALTIME, &ct); - current_time = ct.tv_sec; - return (long long) current_time; + CloudAck * tmp = NULL; + pthread_mutex_lock (&cloudack_mut); + tmp = g_cloudackHead; + pthread_mutex_unlock (&cloudack_mut); + return tmp; } +int checkCloudConn() +{ + if (!cloud_status_is_online ()) + { + ParodusInfo("cloud status is not online, wait till connection up\n"); + pthread_mutex_lock(get_global_cloud_status_mut()); + pthread_cond_wait(get_global_cloud_status_cond(), get_global_cloud_status_mut()); + pthread_mutex_unlock(get_global_cloud_status_mut()); + ParodusInfo("Received cloud status signal, proceed to event processing\n"); + } + return 1; +} /* * @brief To handle xmidt rbus messages received from various components. */ @@ -174,9 +184,8 @@ void processXmidtData() void* processXmidtUpstreamMsg() { int rv = 0; - int state = 0; long long currTime = 0; - int match_found = 0; + int ret = 0; while(FOREVER()) { @@ -201,62 +210,56 @@ void* processXmidtUpstreamMsg() { case PENDING: ParodusInfo("state : PENDING\n"); - //Try sending msg to server only when cloud connection is up/online. - if (!cloud_status_is_online ()) + //send msg to server only when cloud connection is online. + if(checkCloudConn()) { - ParodusInfo("cloud status is not online, wait till connection up\n"); - pthread_mutex_lock(get_global_cloud_status_mut()); - pthread_cond_wait(get_global_cloud_status_cond(), get_global_cloud_status_mut()); - pthread_mutex_unlock(get_global_cloud_status_mut()); - ParodusInfo("Received cloud status signal, proceed to event processing\n"); - } - ParodusInfo("cloud status is online, processData\n"); - rv = processData(Data, Data->msg, Data->asyncHandle); - if(!rv) - { - ParodusInfo("Data->msg wrp free\n"); - wrp_free_struct(Data->msg); - } - else - { - ParodusInfo("Not freeing Data msg as it is waiting for cloud ack\n"); - //free(Data->msg); Not freeing Data msg as it is waiting for cloud ack - } - //free(Data); - //Data = NULL; - break; - case SENT: - ParodusInfo("state : SENT\n"); - currTime = currentTime(); - ParodusInfo("currTime %d sentTime %lu\n",currTime, Data->sentTime); - if (currTime > (Data->sentTime + CLOUD_ACK_TIMEOUT_SEC)) - { - ParodusInfo("Check cloud ack for matching transaction id\n"); - match_found = checkCloudACK(); - ParodusInfo("match_found is %d\n", match_found); - if (match_found) + ParodusInfo("cloud status is online, processData\n"); + rv = processData(Data, Data->msg, Data->asyncHandle); + if(!rv) { - createOutParamsandSendAck(Data->msg, Data->asyncHandle, "Delivered success", DELIVERED_SUCCESS, RBUS_ERROR_SUCCESS); - ParodusInfo("updateStateAndTime to DELETE\n"); - int upRet = updateStateAndTime(Data, DELETE); - if(upRet) - { - ParodusInfo("updateStateAndTime success\n"); - } - else - { - ParodusError("updateStateAndTime failed\n"); - } - ParodusInfo("B4 print_xmidMsg_list\n"); - print_xmidMsg_list(); - ParodusInfo("print_xmidMsg_list done\n"); - //wrp_free_struct(Data->msg); - //free cloud ack node + ParodusInfo("Data->msg wrp free\n"); + wrp_free_struct(Data->msg); } else + { + ParodusInfo("processData success\n"); + } + } + break; + + case SENT: + ParodusInfo("state : SENT\n"); + currTime = currentTime(); + ParodusInfo("currTime %d sentTime %lu timeout sec %lu\n",currTime, Data->sentTime, Data->sentTime + CLOUD_ACK_TIMEOUT_SEC); + if (currTime > (Data->sentTime + CLOUD_ACK_TIMEOUT_SEC)) + { + ParodusInfo("Check cloud ack for matching transaction id\n"); + ret = checkCloudACK(Data, Data->asyncHandle); + ParodusInfo("ret is %d\n", ret); + if (ret) + { + ParodusInfo("cloud ack processed successfully\n"); + } + else //ack timeout case { ParodusInfo("transaction id match not found, cloud ack timed out. Need to retry\n"); - //Retry . + if (checkCloudConn()) + { + ParodusInfo("cloud status is online, processData retry\n"); + if(get_pingTimeStamp() > (Data->sentTime + CLOUD_ACK_TIMEOUT_SEC)) + { + rv = processData(Data, Data->msg, Data->asyncHandle); + if(!rv) + { + ParodusInfo("Data->msg wrp free\n"); + wrp_free_struct(Data->msg); + } + else + { + ParodusInfo("processData success\n"); + } + } + } } } break; @@ -555,19 +558,8 @@ void sendXmidtEventToServer(XmidtMsg *msgnode, wrp_msg_t * msg, rbusMethodAsyncH if(highQosValueCheck(qos)) { //update msg status from PENDING to SENT - ParodusInfo("B4 updateStateAndTime\n"); - int upRet = updateStateAndTime(msgnode, SENT); - if(upRet) - { - ParodusInfo("updateStateAndTime success\n"); - } - else - { - ParodusError("updateStateAndTime failed\n"); - } - ParodusInfo("B4 print_xmidMsg_list\n"); + updateXmidtState(msgnode, SENT); print_xmidMsg_list(); - ParodusInfo("print_xmidMsg_list done\n"); //xmidtQDequeue(); //ParodusInfo("xmidtQDequeue done for high Qos msg\n"); } @@ -576,7 +568,8 @@ void sendXmidtEventToServer(XmidtMsg *msgnode, wrp_msg_t * msg, rbusMethodAsyncH ParodusInfo("Low qos event, send success callback and dequeue\n"); errorMsg = strdup("send to server success"); createOutParamsandSendAck(msg, asyncHandle, errorMsg, DELIVERED_SUCCESS, RBUS_ERROR_SUCCESS); - xmidtQDequeue(); + updateXmidtState(msgnode, DELETE); + //xmidtQDequeue(); } } @@ -1005,13 +998,13 @@ void printRBUSParams(rbusObject_t params, char* file_path) } /* - * @brief To store downstream cloud ack messages in a queue for further processing. + * @brief To store downstream cloud ack messages in a list for further processing. */ void addToCloudAckQ(char *trans_id, int qos, int rdr) { CloudAck *ackmsg; - ParodusInfo ("Add Xmidt downstream message to CloudAck\n"); + ParodusInfo ("Add Xmidt downstream message to CloudAck list\n"); ackmsg = (CloudAck *)malloc(sizeof(CloudAck)); if(ackmsg) @@ -1022,19 +1015,17 @@ void addToCloudAckQ(char *trans_id, int qos, int rdr) ParodusInfo("ackmsg->transaction_id %s ackmsg->qos %d ackmsg->rdr %d\n", ackmsg->transaction_id,ackmsg->qos,ackmsg->rdr); ackmsg->next=NULL; pthread_mutex_lock (&cloudack_mut); - //Producer adds the sent msg into queue - if(CloudAckQ == NULL) + if(g_cloudackHead == NULL) { - CloudAckQ = ackmsg; + g_cloudackHead = ackmsg; ParodusInfo("Producer added cloud ack msg to Q\n"); - pthread_cond_signal(&cloudack_con); pthread_mutex_unlock (&cloudack_mut); ParodusInfo("mutex unlock in cloud ack producer\n"); } else { - CloudAck *temp = CloudAckQ; + CloudAck *temp = g_cloudackHead; while(temp->next) { temp = temp->next; @@ -1050,71 +1041,68 @@ void addToCloudAckQ(char *trans_id, int qos, int rdr) return; } -//Check cloud ack and send rbus callback based on transaction id of xmidt send messages. -int checkCloudACK(char *cloud_transID, int qos, int rdr) +//Check cloud ack and send rbus callback to caller based on transaction id. +int checkCloudACK(XmidtMsg *xmdnode, rbusMethodAsyncHandle_t asyncHandle) { - if(cloud_transID == NULL) - { - ParodusError("cloud_transID is NULL, failed to process cloud ack\n"); - return 0; - } - ParodusInfo("checkCloudACK cloud_transID %s, qos %d, rdr %d\n", cloud_transID, qos, rdr); - - XmidtMsg *temp = NULL; - wrp_msg_t *xmdMsg = NULL; + wrp_msg_t *xmdMsg; char *xmdMsgTransID = NULL; char * errorMsg = NULL; + CloudAck *cloudnode = NULL; - temp = get_global_XmidtMsg(); - while (NULL != temp) + if(xmdnode != NULL) { - xmdMsg = temp->msg; - - if(xmdMsg !=NULL) + xmdMsg = xmdnode->msg; + if(xmdMsg != NULL) { - ParodusInfo("xmdMsg->u.event.transaction_uuid is %s temp->enqueueTime %lu temp->state %s\n",xmdMsg->u.event.transaction_uuid, temp->enqueueTime, temp->state); xmdMsgTransID = xmdMsg->u.event.transaction_uuid; - ParodusInfo("xmdMsgTransID is %s\n",xmdMsgTransID); - if(xmdMsgTransID !=NULL) - { - if( strcmp(cloud_transID, xmdMsgTransID) == 0) - { - ParodusInfo("transaction_id %s is matching, send callback\n", cloud_transID); - errorMsg = strdup("Delivered (success)"); - createOutParamsandSendAck(xmdMsg, temp->asyncHandle, errorMsg, DELIVERED_SUCCESS, rdr); - ParodusInfo("free xmdMsg as callback is sent after cloud ack\n"); - //wrp_free_struct(xmdMsg); - //xmidtQDequeue(); delete this temp node instead of dequeue - ParodusInfo("checkCloudACK done\n"); - return 1; - } - else - { - ParodusError("transaction_id %s is not matching, checking next\n", cloud_transID); - } - } - else - { - ParodusError("xmdMsgTransID is NULL\n"); - } + ParodusInfo("xmdMsgTransID %s\n", xmdMsgTransID); } else { ParodusError("xmdMsg is NULL\n"); + return 0; } - ParodusInfo("checking the next item in the list\n"); - temp= temp->next; } - ParodusInfo("checkTransIDAndSendCallback done\n"); + + cloudnode = get_global_cloud_node(); + + while (NULL != cloudnode) + { + ParodusInfo("cloudnode->transaction_id %s cloudnode->qos %d cloudnode->rdr %d\n", cloudnode->transaction_id,cloudnode->qos,cloudnode->rdr); + if(xmdMsgTransID != NULL && cloudnode->transaction_id != NULL) + { + if( strcmp(xmdMsgTransID, cloudnode->transaction_id) == 0) + { + ParodusInfo("transaction_id %s is matching, send callback\n", xmdMsgTransID); + errorMsg = strdup("Delivered (success)"); + createOutParamsandSendAck(xmdMsg, asyncHandle, errorMsg, DELIVERED_SUCCESS, cloudnode->rdr); + ParodusInfo("free xmdMsg as callback is sent after cloud ack\n"); + wrp_free_struct(xmdMsg); + ParodusInfo("set state to DELETE\n"); + updateXmidtState(xmdnode, DELETE); + print_xmidMsg_list(); + ParodusInfo("delete cloudACK cloudnode\n"); + deleteCloudACKNode(cloudnode->transaction_id); + ParodusInfo("checkCloudACK returns success\n"); + return 1; + } + else + { + ParodusError("transaction_id %s match not found\n", xmdMsgTransID); + } + } + cloudnode= cloudnode->next; + } + ParodusError("checkCloudACK returns failure\n"); return 0; } //To update state of the msg node that is currently being processed. -int updateStateAndTime(XmidtMsg * temp, int state) +int updateXmidtState(XmidtMsg * temp, int state) { if(temp == NULL) { - ParodusError("XmidtMsg is NULL, updateStateAndTime failed\n"); + ParodusError("XmidtMsg is NULL, updateXmidtState failed\n"); return 0; } else @@ -1130,11 +1118,10 @@ int updateStateAndTime(XmidtMsg * temp, int state) } } - void print_xmidMsg_list() { XmidtMsg *temp = NULL; - temp = get_global_XmidtMsg(); + temp = get_global_xmidthead(); while (NULL != temp) { wrp_msg_t *xmdMsg = temp->msg; @@ -1144,3 +1131,60 @@ void print_xmidMsg_list() ParodusInfo("print_xmidMsg_list done\n"); return; } + +//delete matching cloud ack entry +int deleteCloudACKNode(char* trans_id) +{ + CloudAck *prev_node = NULL, *curr_node = NULL; + + if( NULL == trans_id ) + { + ParodusError("Invalid value for trans_id\n"); + return 0; + } + ParodusInfo("cloud ack to be deleted with trans_id: %s\n", trans_id); + + prev_node = NULL; + pthread_mutex_lock (&cloudack_mut); + curr_node = g_cloudackHead ; + // Traverse to get the msg to be deleted + while( NULL != curr_node ) + { + if(strcmp(curr_node->transaction_id, trans_id) == 0) + { + ParodusInfo("Found the node to delete\n"); + if( NULL == prev_node ) + { + ParodusInfo("need to delete first doc\n"); + g_cloudackHead = curr_node->next; + } + else + { + ParodusInfo("Traversing to find node\n"); + prev_node->next = curr_node->next; + + } + + ParodusInfo("Deleting the node entries\n"); + if(curr_node->transaction_id !=NULL) + { + free( curr_node->transaction_id ); + curr_node->transaction_id = NULL; + } + if(curr_node != NULL) + { + free( curr_node ); + } + curr_node = NULL; + ParodusInfo("Deleted successfully and returning..\n"); + pthread_mutex_unlock (&cloudack_mut); + return 1; + } + + prev_node = curr_node; + curr_node = curr_node->next; + } + pthread_mutex_unlock (&cloudack_mut); + ParodusError("Could not find the entry to delete from list\n"); + return 0; +} diff --git a/src/xmidtsend_rbus.h b/src/xmidtsend_rbus.h index 0f8d85b..4be47e9 100644 --- a/src/xmidtsend_rbus.h +++ b/src/xmidtsend_rbus.h @@ -97,9 +97,11 @@ bool highQosValueCheck(int qos); void waitTillConnectionIsUp(); void printRBUSParams(rbusObject_t params, char* file_path); void addToCloudAckQ(char *transaction_id, int qos, int rdr); -int checkCloudACK(char *trans_id, int qos, int rdr); -int updateStateAndTime(XmidtMsg * temp, int state); +int checkCloudACK(XmidtMsg *xmdnode, rbusMethodAsyncHandle_t asyncHandle); +int updateXmidtState(XmidtMsg * temp, int state); void print_xmidMsg_list(); +int deleteCloudACKNode(char* trans_id); +int checkCloudConn(); #ifdef __cplusplus } #endif diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 0006c16..feee600 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -46,7 +46,7 @@ link_directories ( ${LIBRARY_DIR} ) # test_heartBeatTimer #------------------------------------------------------------------------------- add_test(NAME test_heartBeatTimer COMMAND ${MEMORY_CHECK} ./test_heartBeatTimer) -add_executable(test_heartBeatTimer test_heartBeatTimer.c ../src/heartBeat.c) +add_executable(test_heartBeatTimer test_heartBeatTimer.c ../src/heartBeat.c ../src/time.c) target_link_libraries (test_heartBeatTimer ${PARODUS_COMMON_LIBS} -lcmocka) #------------------------------------------------------------------------------- @@ -109,7 +109,7 @@ target_link_libraries (test_spin_thread_e ${PARODUS_COMMON_LIBS} ) # test_nopoll_handlers #------------------------------------------------------------------------------- add_test(NAME test_nopoll_handlers COMMAND ${MEMORY_CHECK} ./test_nopoll_handlers) -add_executable(test_nopoll_handlers test_nopoll_handlers.c ../src/nopoll_handlers.c ../src/heartBeat.c ../src/close_retry.c) +add_executable(test_nopoll_handlers test_nopoll_handlers.c ../src/nopoll_handlers.c ../src/heartBeat.c ../src/close_retry.c ../src/time.c) target_link_libraries (test_nopoll_handlers -lnopoll -lcunit -lcimplog -Wl,--no-as-needed -lrt -lpthread -lm) @@ -117,7 +117,7 @@ target_link_libraries (test_nopoll_handlers -lnopoll -lcunit -lcimplog -Wl,--no- # test_nopoll_handlers_fragment #------------------------------------------------------------------------------- add_test(NAME test_nopoll_handlers_fragment COMMAND ${MEMORY_CHECK} ./test_nopoll_handlers_fragment) -add_executable(test_nopoll_handlers_fragment test_nopoll_handlers_fragment.c ../src/nopoll_handlers.c ../src/heartBeat.c ../src/close_retry.c) +add_executable(test_nopoll_handlers_fragment test_nopoll_handlers_fragment.c ../src/nopoll_handlers.c ../src/heartBeat.c ../src/close_retry.c ../src/time.c) target_link_libraries (test_nopoll_handlers_fragment -lnopoll -lcunit -lcimplog -Wl,--no-as-needed -lrt -lpthread -lm -lcmocka) #------------------------------------------------------------------------------- @@ -296,6 +296,7 @@ set(CONIFC_SRC test_conn_interface.c ../src/token.c ../src/string_helpers.c ../src/mutex.c + ../src/time.c ../src/heartBeat.c ../src/close_retry.c ../src/event_handler.c diff --git a/tests/test_conn_interface.c b/tests/test_conn_interface.c index 6e93362..9d58c64 100644 --- a/tests/test_conn_interface.c +++ b/tests/test_conn_interface.c @@ -71,7 +71,14 @@ void nopoll_log_set_handler (noPollCtx *ctx, noPollLogHandler handler, noPollPtr UNUSED(ctx); UNUSED(handler); UNUSED(user_data); function_called(); } - +long long currentTime() +{ + return 0; +} +int cloud_status_is_online (void) +{ + return 0; +} void __report_log (noPollCtx * ctx, noPollDebugLevel level, const char * log_msg, noPollPtr user_data) { UNUSED(ctx); UNUSED(level); UNUSED(log_msg); UNUSED(user_data); diff --git a/tests/test_connection.c b/tests/test_connection.c index f6c1f64..c79637b 100644 --- a/tests/test_connection.c +++ b/tests/test_connection.c @@ -120,6 +120,10 @@ int readFromFile(const char *file_name, char **data) *data = strdup ("parodus_stopping"); return 1; } +long long currentTime() +{ + return 0; +} noPollConn * nopoll_conn_new_opts (noPollCtx * ctx, noPollConnOpts * opts, const char * host_ip, const char * host_port, const char * host_name,const char * get_url,const char * protocols, const char * origin) { diff --git a/tests/test_heartBeatTimer.c b/tests/test_heartBeatTimer.c index 48f401b..c0cd9ac 100644 --- a/tests/test_heartBeatTimer.c +++ b/tests/test_heartBeatTimer.c @@ -79,7 +79,10 @@ void test_mutexHeartBeatTimer() { ParodusInfo("heartBeatTimer reset to: %d\n", heartBeatTimer); assert_int_equal(heartBeatTimer, 0); } - +long long currentTime() +{ + return 0; +} /*----------------------------------------------------------------------------*/ /* External Functions */ /*----------------------------------------------------------------------------*/ diff --git a/tests/test_nopoll_handlers.c b/tests/test_nopoll_handlers.c index a4b20b2..f0d1d0d 100644 --- a/tests/test_nopoll_handlers.c +++ b/tests/test_nopoll_handlers.c @@ -79,6 +79,11 @@ const unsigned char *nopoll_msg_get_payload(noPollMsg *msg) return NULL; } +long long currentTime() +{ + return 0; +} + noPollOpCode nopoll_msg_opcode (noPollMsg * msg) { if(NULL != msg) diff --git a/tests/test_nopoll_handlers_fragment.c b/tests/test_nopoll_handlers_fragment.c index 4c79faf..fe78713 100644 --- a/tests/test_nopoll_handlers_fragment.c +++ b/tests/test_nopoll_handlers_fragment.c @@ -68,7 +68,10 @@ nopoll_bool nopoll_msg_is_final(noPollMsg *msg) function_called(); return (nopoll_bool) mock(); } - +long long currentTime() +{ + return 0; +} const unsigned char *nopoll_msg_get_payload(noPollMsg *msg) { (void)msg; From dd69d5ec5d6b4287749f09529ca53e4c46f26b6e Mon Sep 17 00:00:00 2001 From: Sadhyama Vengilat Date: Thu, 23 Jun 2022 20:20:20 +0530 Subject: [PATCH 076/137] Use existing getCurrentTime func to set time values --- src/ParodusInternal.c | 9 --------- src/ParodusInternal.h | 1 - src/xmidtsend_rbus.c | 13 ++++++++++--- tests/test_conn_interface.c | 4 ---- tests/test_connection.c | 4 ---- tests/test_heartBeatTimer.c | 4 ---- tests/test_nopoll_handlers.c | 5 ----- tests/test_nopoll_handlers_fragment.c | 4 ---- 8 files changed, 10 insertions(+), 34 deletions(-) diff --git a/src/ParodusInternal.c b/src/ParodusInternal.c index 49d0d39..fddbe34 100644 --- a/src/ParodusInternal.c +++ b/src/ParodusInternal.c @@ -151,15 +151,6 @@ int readFromFile(const char *file_name, char **data) return 1; } -long long currentTime() -{ - struct timespec ct; - long long current_time = 0; - clock_gettime(CLOCK_REALTIME, &ct); - current_time = ct.tv_sec; - return (long long) current_time; -} - void timespec_diff(struct timespec *start, struct timespec *stop, struct timespec *diff) { diff --git a/src/ParodusInternal.h b/src/ParodusInternal.h index 236f2bb..f3641db 100644 --- a/src/ParodusInternal.h +++ b/src/ParodusInternal.h @@ -191,7 +191,6 @@ pthread_mutex_t *get_global_cloud_status_mut(void); int cloud_status_is_online (void); -long long currentTime(); #ifdef __cplusplus } #endif diff --git a/src/xmidtsend_rbus.c b/src/xmidtsend_rbus.c index b845ead..48c4ee0 100644 --- a/src/xmidtsend_rbus.c +++ b/src/xmidtsend_rbus.c @@ -28,6 +28,7 @@ #include "partners_check.h" #include "xmidtsend_rbus.h" #include "config.h" +#include "time.h" #include "heartBeat.h" static pthread_t processThreadId = 0; @@ -108,6 +109,7 @@ int checkCloudConn() void addToXmidtUpstreamQ(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle) { XmidtMsg *message; + struct timespec ts; ParodusPrint("XmidtQsize is %d\n" , XmidtQsize); if(XmidtQsize == MAX_QUEUE_SIZE) @@ -127,7 +129,8 @@ void addToXmidtUpstreamQ(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle) message->msg = msg; message->asyncHandle =asyncHandle; message->state = PENDING; - message->enqueueTime = currentTime(); + getCurrentTime(&ts); + message->enqueueTime = (long long)ts.tv_sec; message->sentTime = 0; //Increment queue size to handle max queue limit XmidtQsize++; @@ -186,6 +189,7 @@ void* processXmidtUpstreamMsg() int rv = 0; long long currTime = 0; int ret = 0; + struct timespec ts; while(FOREVER()) { @@ -229,7 +233,8 @@ void* processXmidtUpstreamMsg() case SENT: ParodusInfo("state : SENT\n"); - currTime = currentTime(); + getCurrentTime(&ts); + currTime = (long long)ts.tv_sec; ParodusInfo("currTime %d sentTime %lu timeout sec %lu\n",currTime, Data->sentTime, Data->sentTime + CLOUD_ACK_TIMEOUT_SEC); if (currTime > (Data->sentTime + CLOUD_ACK_TIMEOUT_SEC)) { @@ -1100,6 +1105,7 @@ int checkCloudACK(XmidtMsg *xmdnode, rbusMethodAsyncHandle_t asyncHandle) //To update state of the msg node that is currently being processed. int updateXmidtState(XmidtMsg * temp, int state) { + struct timespec ts; if(temp == NULL) { ParodusError("XmidtMsg is NULL, updateXmidtState failed\n"); @@ -1111,7 +1117,8 @@ int updateXmidtState(XmidtMsg * temp, int state) ParodusInfo("node is pointing to temp->state %d\n",temp->state); pthread_mutex_lock (&xmidt_mut); temp->state = state; - temp->sentTime = currentTime(); + getCurrentTime(&ts); + temp->sentTime = (long long)ts.tv_sec; ParodusInfo("msgnode is updated with state %d sentTime %lu\n", temp->state, temp->sentTime); pthread_mutex_unlock (&xmidt_mut); return 1; diff --git a/tests/test_conn_interface.c b/tests/test_conn_interface.c index 9d58c64..380aaab 100644 --- a/tests/test_conn_interface.c +++ b/tests/test_conn_interface.c @@ -71,10 +71,6 @@ void nopoll_log_set_handler (noPollCtx *ctx, noPollLogHandler handler, noPollPtr UNUSED(ctx); UNUSED(handler); UNUSED(user_data); function_called(); } -long long currentTime() -{ - return 0; -} int cloud_status_is_online (void) { return 0; diff --git a/tests/test_connection.c b/tests/test_connection.c index c79637b..f6c1f64 100644 --- a/tests/test_connection.c +++ b/tests/test_connection.c @@ -120,10 +120,6 @@ int readFromFile(const char *file_name, char **data) *data = strdup ("parodus_stopping"); return 1; } -long long currentTime() -{ - return 0; -} noPollConn * nopoll_conn_new_opts (noPollCtx * ctx, noPollConnOpts * opts, const char * host_ip, const char * host_port, const char * host_name,const char * get_url,const char * protocols, const char * origin) { diff --git a/tests/test_heartBeatTimer.c b/tests/test_heartBeatTimer.c index c0cd9ac..123cb6f 100644 --- a/tests/test_heartBeatTimer.c +++ b/tests/test_heartBeatTimer.c @@ -79,10 +79,6 @@ void test_mutexHeartBeatTimer() { ParodusInfo("heartBeatTimer reset to: %d\n", heartBeatTimer); assert_int_equal(heartBeatTimer, 0); } -long long currentTime() -{ - return 0; -} /*----------------------------------------------------------------------------*/ /* External Functions */ /*----------------------------------------------------------------------------*/ diff --git a/tests/test_nopoll_handlers.c b/tests/test_nopoll_handlers.c index f0d1d0d..a4b20b2 100644 --- a/tests/test_nopoll_handlers.c +++ b/tests/test_nopoll_handlers.c @@ -79,11 +79,6 @@ const unsigned char *nopoll_msg_get_payload(noPollMsg *msg) return NULL; } -long long currentTime() -{ - return 0; -} - noPollOpCode nopoll_msg_opcode (noPollMsg * msg) { if(NULL != msg) diff --git a/tests/test_nopoll_handlers_fragment.c b/tests/test_nopoll_handlers_fragment.c index fe78713..2929edf 100644 --- a/tests/test_nopoll_handlers_fragment.c +++ b/tests/test_nopoll_handlers_fragment.c @@ -68,10 +68,6 @@ nopoll_bool nopoll_msg_is_final(noPollMsg *msg) function_called(); return (nopoll_bool) mock(); } -long long currentTime() -{ - return 0; -} const unsigned char *nopoll_msg_get_payload(noPollMsg *msg) { (void)msg; From 80a50dead6e5b8a08bd387d752cc5158607387c2 Mon Sep 17 00:00:00 2001 From: Sadhyama Vengilat Date: Fri, 24 Jun 2022 20:09:03 +0530 Subject: [PATCH 077/137] check expiry based on qos and handle maxQueue --- src/xmidtsend_rbus.c | 97 ++++++++++++++++++++++++++++++++++++++++++++ src/xmidtsend_rbus.h | 10 ++++- 2 files changed, 106 insertions(+), 1 deletion(-) diff --git a/src/xmidtsend_rbus.c b/src/xmidtsend_rbus.c index 48c4ee0..2e81bcd 100644 --- a/src/xmidtsend_rbus.c +++ b/src/xmidtsend_rbus.c @@ -210,6 +210,9 @@ void* processXmidtUpstreamMsg() pthread_mutex_unlock (&xmidt_mut); ParodusInfo("mutex unlock in xmidt consumer thread\n"); + checkMsgExpiry(); + checkMaxQandOptimize(); + switch(Data->state) { case PENDING: @@ -1195,3 +1198,97 @@ int deleteCloudACKNode(char* trans_id) ParodusError("Could not find the entry to delete from list\n"); return 0; } + +//check if message is expired based on each qos and set to delete state. +void checkMsgExpiry() +{ + long long currTime = 0; + struct timespec ts; + + XmidtMsg *temp = NULL; + temp = get_global_xmidthead(); + + while(temp != NULL) + { + getCurrentTime(&ts); + currTime= (long long)ts.tv_sec; + wrp_msg_t * tempMsg = temp->msg; + ParodusInfo("qos %d currTime %lu enqueueTime %lu\n", tempMsg->u.event.qos, currTime, temp->enqueueTime); + + if(tempMsg->u.event.qos > 74) + { + ParodusInfo("Critical Qos, check expiry 30 mins\n"); + if((currTime - temp->enqueueTime) > CRITICAL_QOS_EXPIRE_TIME) + { + ParodusInfo("Low qos msg, set to DELETE state\n"); + updateXmidtState(temp, DELETE); + } + } + else if (tempMsg->u.event.qos > 49) + { + ParodusInfo("High Qos, check expiry 25 mins\n"); + if((currTime - temp->enqueueTime) > HIGH_QOS_EXPIRE_TIME) + { + ParodusInfo("Low qos msg, set to DELETE state\n"); + updateXmidtState(temp, DELETE); + } + } + else if (tempMsg->u.event.qos > 24) + { + ParodusInfo("Medium Qos, check expiry 20 mins\n"); + if((currTime - temp->enqueueTime) > MEDIUM_QOS_EXPIRE_TIME) + { + ParodusInfo("Low qos msg, set to DELETE state\n"); + updateXmidtState(temp, DELETE); + } + } + else if (tempMsg->u.event.qos >= 0) + { + ParodusInfo("Low Qos, check expiry 15 mins\n"); + if((currTime - temp->enqueueTime) > LOW_QOS_EXPIRE_TIME) + { + ParodusInfo("Low qos msg, set to DELETE state\n"); + updateXmidtState(temp, DELETE); + } + } + else + { + ParodusError("Invalid qos\n"); + } + temp = temp->next; + } + +} + +//To delete low qos messages from queue when max queue limit is reached. +void checkMaxQandOptimize() +{ + int qos = 0; + + ParodusInfo("checkMaxQandOptimize . XmidtQsize is %d\n" , XmidtQsize); + if(XmidtQsize == MAX_QUEUE_SIZE) + { + ParodusInfo("Max Queue size reached, check and optimize\n"); + + //Traverse through XmidtMsgQ list and set low qos msgs to DELETE + XmidtMsg *temp = NULL; + temp = get_global_xmidthead(); + + while(temp != NULL) + { + wrp_msg_t * tempMsg = temp->msg; + qos = tempMsg->u.event.qos; + ParodusInfo("qos is %d\n", qos); + if(highQosValueCheck(qos)) + { + ParodusInfo("High qos msg, skip delete\n"); + } + else + { + ParodusInfo("Low qos msg, set to DELETE state\n"); + updateXmidtState(temp, DELETE); + } + temp = temp->next; + } + } +} diff --git a/src/xmidtsend_rbus.h b/src/xmidtsend_rbus.h index 4be47e9..4c937b8 100644 --- a/src/xmidtsend_rbus.h +++ b/src/xmidtsend_rbus.h @@ -32,7 +32,13 @@ extern "C" { #define XMIDT_SEND_METHOD "Device.X_RDK_Xmidt.SendData" #define MAX_QUEUE_SIZE 10 #define INPARAMS_PATH "/tmp/inparams.txt" -#define CLOUD_ACK_TIMEOUT_SEC 7 + +#define CLOUD_ACK_TIMEOUT_SEC 7 +#define CRITICAL_QOS_EXPIRE_TIME 30*60 +#define HIGH_QOS_EXPIRE_TIME 25*60 +#define MEDIUM_QOS_EXPIRE_TIME 20*60 +#define LOW_QOS_EXPIRE_TIME 15*60 + /*----------------------------------------------------------------------------*/ /* Data Structures */ /*----------------------------------------------------------------------------*/ @@ -102,6 +108,8 @@ int updateXmidtState(XmidtMsg * temp, int state); void print_xmidMsg_list(); int deleteCloudACKNode(char* trans_id); int checkCloudConn(); +void checkMaxQandOptimize(); +void checkMsgExpiry(); #ifdef __cplusplus } #endif From 3d98b4a80b7b41afca61afe156615629f4eca887 Mon Sep 17 00:00:00 2001 From: Sadhyama Vengilat Date: Fri, 24 Jun 2022 20:18:33 +0530 Subject: [PATCH 078/137] Traverse xmidtQ locally and reset to headnode --- src/xmidtsend_rbus.c | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/src/xmidtsend_rbus.c b/src/xmidtsend_rbus.c index 2e81bcd..8cd3960 100644 --- a/src/xmidtsend_rbus.c +++ b/src/xmidtsend_rbus.c @@ -190,6 +190,9 @@ void* processXmidtUpstreamMsg() long long currTime = 0; int ret = 0; struct timespec ts; + XmidtMsg *xmidtQ = NULL; + + xmidtQ = get_global_xmidthead(); while(FOREVER()) { @@ -203,16 +206,16 @@ void* processXmidtUpstreamMsg() } pthread_mutex_lock (&xmidt_mut); ParodusInfo("mutex lock in xmidt consumer thread\n"); - if (XmidtMsgQ != NULL) + if (xmidtQ != NULL) { - XmidtMsg *Data = XmidtMsgQ; - XmidtMsgQ = XmidtMsgQ->next; + XmidtMsg *Data = xmidtQ; pthread_mutex_unlock (&xmidt_mut); ParodusInfo("mutex unlock in xmidt consumer thread\n"); checkMsgExpiry(); checkMaxQandOptimize(); + ParodusInfo("check state\n"); switch(Data->state) { case PENDING: @@ -276,11 +279,13 @@ void* processXmidtUpstreamMsg() break; } + xmidtQ = xmidtQ->next; + // circling back to 1st node - if(XmidtMsgQ == NULL && get_global_xmidthead() != NULL) + if(xmidtQ == NULL && get_global_xmidthead() != NULL) { - ParodusInfo("XmidtMsgQ is NULL, circling back to 1st node\n"); - XmidtMsgQ = get_global_xmidthead(); + ParodusInfo("xmidtQ is NULL, circling back to 1st node\n"); + xmidtQ = get_global_xmidthead(); } sleep(1); } @@ -295,6 +300,7 @@ void* processXmidtUpstreamMsg() pthread_cond_wait(&xmidt_con, &xmidt_mut); pthread_mutex_unlock (&xmidt_mut); ParodusInfo("mutex unlock in xmidt thread after cond wait\n"); + xmidtQ = get_global_xmidthead(); } } return NULL; From 0bf4d754e55d714a2b529d9a1825af96f2e1a9df Mon Sep 17 00:00:00 2001 From: Sadhyama Vengilat Date: Fri, 24 Jun 2022 20:42:59 +0530 Subject: [PATCH 079/137] DELETE state to delete processed xmidt msgs --- src/xmidtsend_rbus.c | 70 ++++++++++++++++++++++++++++++++++++++++++++ src/xmidtsend_rbus.h | 1 + 2 files changed, 71 insertions(+) diff --git a/src/xmidtsend_rbus.c b/src/xmidtsend_rbus.c index 8cd3960..0f75bfc 100644 --- a/src/xmidtsend_rbus.c +++ b/src/xmidtsend_rbus.c @@ -191,6 +191,7 @@ void* processXmidtUpstreamMsg() int ret = 0; struct timespec ts; XmidtMsg *xmidtQ = NULL; + XmidtMsg *next_node = NULL; xmidtQ = get_global_xmidthead(); @@ -276,6 +277,10 @@ void* processXmidtUpstreamMsg() break; case DELETE: ParodusInfo("state : DELETE\n"); + deleteFromXmidtQ(Data->msg, &next_node); + ParodusInfo("deleteFromXmidtQ done, continue\n"); + xmidtQ = next_node; + continue; break; } @@ -1205,6 +1210,71 @@ int deleteCloudACKNode(char* trans_id) return 0; } +//Delete msg from XmidtQ +int deleteFromXmidtQ(wrp_msg_t *msg, XmidtMsg **next_node) +{ + XmidtMsg *prev_node = NULL, *curr_node = NULL; + char *transid = NULL; + + if( NULL == msg ) + { + ParodusError("Invalid xmidt msg\n"); + return 0; + } + + transid = msg->u.event.transaction_uuid; + if( NULL == transid ) + { + ParodusError("Invalid xmidt transid\n"); + return 0; + } + ParodusInfo("msg to be deleted with transid %s\n", transid); + + prev_node = NULL; + pthread_mutex_lock (&xmidt_mut); + curr_node = XmidtMsgQ ; + // Traverse to get the msg to be deleted + while( NULL != curr_node ) + { + if(strcmp(curr_node->msg->u.event.transaction_uuid, transid) == 0) + { + ParodusInfo("Found the node to delete\n"); + if( NULL == prev_node ) + { + ParodusInfo("need to delete first doc\n"); + XmidtMsgQ = curr_node->next; + } + else + { + ParodusInfo("Traversing to find node\n"); + prev_node->next = curr_node->next; + *next_node = curr_node->next; + + } + + ParodusInfo("Deleting the node entries\n"); + wrp_free_struct( curr_node->msg); + curr_node->msg = NULL; + if(curr_node !=NULL) + { + free( curr_node ); + curr_node = NULL; + } + ParodusInfo("Deleted successfully and returning..\n"); + XmidtQsize =XmidtQsize - 1; + ParodusInfo("XmidtQsize after delete is %d\n", XmidtQsize); + pthread_mutex_unlock (&xmidt_mut); + return 1; + } + + prev_node = curr_node; + curr_node = curr_node->next; + } + pthread_mutex_unlock (&xmidt_mut); + ParodusError("Could not find the entry to delete from list\n"); + return 0; +} + //check if message is expired based on each qos and set to delete state. void checkMsgExpiry() { diff --git a/src/xmidtsend_rbus.h b/src/xmidtsend_rbus.h index 4c937b8..eb0c846 100644 --- a/src/xmidtsend_rbus.h +++ b/src/xmidtsend_rbus.h @@ -107,6 +107,7 @@ int checkCloudACK(XmidtMsg *xmdnode, rbusMethodAsyncHandle_t asyncHandle); int updateXmidtState(XmidtMsg * temp, int state); void print_xmidMsg_list(); int deleteCloudACKNode(char* trans_id); +int deleteFromXmidtQ(wrp_msg_t *msg, XmidtMsg **next_node); int checkCloudConn(); void checkMaxQandOptimize(); void checkMsgExpiry(); From 797c9de17fb28c3bf20c8e923ac44729e8c90e94 Mon Sep 17 00:00:00 2001 From: Sadhyama Vengilat Date: Tue, 28 Jun 2022 17:18:46 +0530 Subject: [PATCH 080/137] Add mutex locks for xmidtQsize --- src/xmidtsend_rbus.c | 54 ++++++++++++++++++++++++++++++++------------ 1 file changed, 39 insertions(+), 15 deletions(-) diff --git a/src/xmidtsend_rbus.c b/src/xmidtsend_rbus.c index 0f75bfc..9d8dfa9 100644 --- a/src/xmidtsend_rbus.c +++ b/src/xmidtsend_rbus.c @@ -91,6 +91,29 @@ CloudAck * get_global_cloud_node(void) return tmp; } +int get_XmidtQsize() +{ + int tmp = 0; + pthread_mutex_lock (&xmidt_mut); + tmp = XmidtQsize; + pthread_mutex_unlock (&xmidt_mut); + return tmp; +} + +void increment_XmidtQsize() +{ + pthread_mutex_lock (&xmidt_mut); + XmidtQsize++; + pthread_mutex_unlock (&xmidt_mut); +} + +void decrement_XmidtQsize() +{ + pthread_mutex_lock (&xmidt_mut); + XmidtQsize--; + pthread_mutex_unlock (&xmidt_mut); +} + int checkCloudConn() { if (!cloud_status_is_online ()) @@ -111,8 +134,8 @@ void addToXmidtUpstreamQ(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle) XmidtMsg *message; struct timespec ts; - ParodusPrint("XmidtQsize is %d\n" , XmidtQsize); - if(XmidtQsize == MAX_QUEUE_SIZE) + ParodusPrint("XmidtQsize is %d\n" , get_XmidtQsize()); + if(get_XmidtQsize() == MAX_QUEUE_SIZE) { char * errorMsg = strdup("Max Queue Size Exceeded"); ParodusError("Queue Size Exceeded\n"); @@ -133,7 +156,7 @@ void addToXmidtUpstreamQ(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle) message->enqueueTime = (long long)ts.tv_sec; message->sentTime = 0; //Increment queue size to handle max queue limit - XmidtQsize++; + increment_XmidtQsize(); message->next=NULL; pthread_mutex_lock (&xmidt_mut); //Producer adds the rbus msg into queue @@ -1236,7 +1259,8 @@ int deleteFromXmidtQ(wrp_msg_t *msg, XmidtMsg **next_node) // Traverse to get the msg to be deleted while( NULL != curr_node ) { - if(strcmp(curr_node->msg->u.event.transaction_uuid, transid) == 0) + wrp_msg_t * curr_node_msg = curr_node->msg; + if(curr_node_msg !=NULL && strcmp(curr_node_msg->u.event.transaction_uuid, transid) == 0) { ParodusInfo("Found the node to delete\n"); if( NULL == prev_node ) @@ -1261,8 +1285,8 @@ int deleteFromXmidtQ(wrp_msg_t *msg, XmidtMsg **next_node) curr_node = NULL; } ParodusInfo("Deleted successfully and returning..\n"); - XmidtQsize =XmidtQsize - 1; - ParodusInfo("XmidtQsize after delete is %d\n", XmidtQsize); + decrement_XmidtQsize(); + ParodusInfo("XmidtQsize after delete is %d\n", get_XmidtQsize()); pthread_mutex_unlock (&xmidt_mut); return 1; } @@ -1293,34 +1317,34 @@ void checkMsgExpiry() if(tempMsg->u.event.qos > 74) { - ParodusInfo("Critical Qos, check expiry 30 mins\n"); + ParodusInfo("Critical Qos, check if expiry of 30 mins reached\n"); if((currTime - temp->enqueueTime) > CRITICAL_QOS_EXPIRE_TIME) { - ParodusInfo("Low qos msg, set to DELETE state\n"); + ParodusInfo("Critical qos msg, set to DELETE state\n"); updateXmidtState(temp, DELETE); } } else if (tempMsg->u.event.qos > 49) { - ParodusInfo("High Qos, check expiry 25 mins\n"); + ParodusInfo("High Qos, check if expiry of 25 mins reached\n"); if((currTime - temp->enqueueTime) > HIGH_QOS_EXPIRE_TIME) { - ParodusInfo("Low qos msg, set to DELETE state\n"); + ParodusInfo("High qos msg, set to DELETE state\n"); updateXmidtState(temp, DELETE); } } else if (tempMsg->u.event.qos > 24) { - ParodusInfo("Medium Qos, check expiry 20 mins\n"); + ParodusInfo("Medium Qos, check if expiry of 20 mins reached\n"); if((currTime - temp->enqueueTime) > MEDIUM_QOS_EXPIRE_TIME) { - ParodusInfo("Low qos msg, set to DELETE state\n"); + ParodusInfo("Medium qos msg, set to DELETE state\n"); updateXmidtState(temp, DELETE); } } else if (tempMsg->u.event.qos >= 0) { - ParodusInfo("Low Qos, check expiry 15 mins\n"); + ParodusInfo("Low Qos, check if expiry of 15 mins reached\n"); if((currTime - temp->enqueueTime) > LOW_QOS_EXPIRE_TIME) { ParodusInfo("Low qos msg, set to DELETE state\n"); @@ -1341,8 +1365,8 @@ void checkMaxQandOptimize() { int qos = 0; - ParodusInfo("checkMaxQandOptimize . XmidtQsize is %d\n" , XmidtQsize); - if(XmidtQsize == MAX_QUEUE_SIZE) + ParodusInfo("checkMaxQandOptimize . XmidtQsize is %d\n" , get_XmidtQsize()); + if(get_XmidtQsize() == MAX_QUEUE_SIZE) { ParodusInfo("Max Queue size reached, check and optimize\n"); From ee3e006908e21b5f9768e4d2db73ab7d775d28ff Mon Sep 17 00:00:00 2001 From: Sadhyama Vengilat Date: Tue, 28 Jun 2022 20:15:32 +0530 Subject: [PATCH 081/137] Xmidt rdr status to error message mapping to send callback --- src/xmidtsend_rbus.c | 115 ++++++++++++++++++++++++++++++++++++------- src/xmidtsend_rbus.h | 1 + 2 files changed, 99 insertions(+), 17 deletions(-) diff --git a/src/xmidtsend_rbus.c b/src/xmidtsend_rbus.c index 9d8dfa9..322652c 100644 --- a/src/xmidtsend_rbus.c +++ b/src/xmidtsend_rbus.c @@ -133,12 +133,13 @@ void addToXmidtUpstreamQ(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle) { XmidtMsg *message; struct timespec ts; + char * errorMsg = NULL; ParodusPrint("XmidtQsize is %d\n" , get_XmidtQsize()); if(get_XmidtQsize() == MAX_QUEUE_SIZE) { - char * errorMsg = strdup("Max Queue Size Exceeded"); - ParodusError("Queue Size Exceeded\n"); + mapXmidtStatusToStatusMsg(QUEUE_SIZE_EXCEEDED, &errorMsg); + ParodusInfo("errorMsg is %s\n",errorMsg); createOutParamsandSendAck(msg, asyncHandle, errorMsg , QUEUE_SIZE_EXCEEDED, RBUS_ERROR_INVALID_RESPONSE_FROM_DESTINATION); wrp_free_struct(msg); return; @@ -182,8 +183,8 @@ void addToXmidtUpstreamQ(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle) } else { - char * errorMsg = strdup("Unable to enqueue"); - ParodusError("failure in allocation for xmidt message\n"); + mapXmidtStatusToStatusMsg(ENQUEUE_FAILURE, &errorMsg); + ParodusInfo("errorMsg is %s\n",errorMsg); createOutParamsandSendAck(msg, asyncHandle, errorMsg , ENQUEUE_FAILURE, RBUS_ERROR_INVALID_RESPONSE_FROM_DESTINATION); wrp_free_struct(msg); } @@ -211,7 +212,7 @@ void* processXmidtUpstreamMsg() { int rv = 0; long long currTime = 0; - int ret = 0; + int ret = 0, status = 0; struct timespec ts; XmidtMsg *xmidtQ = NULL; XmidtMsg *next_node = NULL; @@ -300,14 +301,24 @@ void* processXmidtUpstreamMsg() break; case DELETE: ParodusInfo("state : DELETE\n"); - deleteFromXmidtQ(Data->msg, &next_node); - ParodusInfo("deleteFromXmidtQ done, continue\n"); - xmidtQ = next_node; - continue; - break; + status = deleteFromXmidtQ(Data->msg, &next_node); + if(status) + { + ParodusInfo("deleteFromXmidtQ done, continue\n"); + xmidtQ = next_node; + continue; + } + else + { + ParodusError("deleteFromXmidtQ failed\n"); + break; + } } - xmidtQ = xmidtQ->next; + if(xmidtQ !=NULL) + { + xmidtQ = xmidtQ->next; + } // circling back to 1st node if(xmidtQ == NULL && get_global_xmidthead() != NULL) @@ -345,7 +356,8 @@ int processData(XmidtMsg *Datanode, wrp_msg_t * msg, rbusMethodAsyncHandle_t asy if (xmidtMsg == NULL) { ParodusError("xmidtMsg is NULL\n"); - errorMsg = strdup("Unable to enqueue"); + mapXmidtStatusToStatusMsg(ENQUEUE_FAILURE, &errorMsg); + ParodusInfo("errorMsg is %s\n",errorMsg); createOutParamsandSendAck(xmidtMsg, asyncHandle, errorMsg, ENQUEUE_FAILURE, RBUS_ERROR_INVALID_RESPONSE_FROM_DESTINATION); xmidtQDequeue(); return rv; @@ -553,7 +565,8 @@ void sendXmidtEventToServer(XmidtMsg *msgnode, wrp_msg_t * msg, rbusMethodAsyncH else { ParodusError("wrp msg_len is zero\n"); - errorMsg = strdup("Wrp message encoding failed"); + mapXmidtStatusToStatusMsg(WRP_ENCODE_FAILURE, &errorMsg); + ParodusInfo("errorMsg is %s\n",errorMsg); createOutParamsandSendAck(msg, asyncHandle, errorMsg, WRP_ENCODE_FAILURE, RBUS_ERROR_INVALID_RESPONSE_FROM_DESTINATION); xmidtQDequeue(); @@ -586,7 +599,8 @@ void sendXmidtEventToServer(XmidtMsg *msgnode, wrp_msg_t * msg, rbusMethodAsyncH } else { - errorMsg = strdup("send failed due to client disconnect"); + mapXmidtStatusToStatusMsg(CLIENT_DISCONNECT, &errorMsg); + ParodusInfo("errorMsg is %s\n",errorMsg); ParodusInfo("The event is having low qos proceed to dequeue\n"); createOutParamsandSendAck(msg, asyncHandle, errorMsg, CLIENT_DISCONNECT, RBUS_ERROR_INVALID_RESPONSE_FROM_DESTINATION); xmidtQDequeue(); @@ -608,7 +622,8 @@ void sendXmidtEventToServer(XmidtMsg *msgnode, wrp_msg_t * msg, rbusMethodAsyncH else { ParodusInfo("Low qos event, send success callback and dequeue\n"); - errorMsg = strdup("send to server success"); + mapXmidtStatusToStatusMsg(DELIVERED_SUCCESS, &errorMsg); + ParodusInfo("errorMsg is %s\n",errorMsg); createOutParamsandSendAck(msg, asyncHandle, errorMsg, DELIVERED_SUCCESS, RBUS_ERROR_SUCCESS); updateXmidtState(msgnode, DELETE); //xmidtQDequeue(); @@ -630,7 +645,8 @@ void sendXmidtEventToServer(XmidtMsg *msgnode, wrp_msg_t * msg, rbusMethodAsyncH } else { - errorMsg = strdup("Memory allocation failed"); + mapXmidtStatusToStatusMsg(MSG_PROCESSING_FAILED, &errorMsg); + ParodusInfo("errorMsg is %s\n",errorMsg); ParodusError("Memory allocation failed\n"); createOutParamsandSendAck(msg, asyncHandle, errorMsg, MSG_PROCESSING_FAILED, RBUS_ERROR_INVALID_RESPONSE_FROM_DESTINATION); xmidtQDequeue(); @@ -1116,7 +1132,8 @@ int checkCloudACK(XmidtMsg *xmdnode, rbusMethodAsyncHandle_t asyncHandle) if( strcmp(xmdMsgTransID, cloudnode->transaction_id) == 0) { ParodusInfo("transaction_id %s is matching, send callback\n", xmdMsgTransID); - errorMsg = strdup("Delivered (success)"); + mapXmidtStatusToStatusMsg(DELIVERED_SUCCESS, &errorMsg); + ParodusInfo("errorMsg is %s\n",errorMsg); createOutParamsandSendAck(xmdMsg, asyncHandle, errorMsg, DELIVERED_SUCCESS, cloudnode->rdr); ParodusInfo("free xmdMsg as callback is sent after cloud ack\n"); wrp_free_struct(xmdMsg); @@ -1392,3 +1409,67 @@ void checkMaxQandOptimize() } } } + +//map xmidt status and rdr response to status message +void mapXmidtStatusToStatusMsg(int status, char **message) +{ + char *result = NULL; + + if (status == DELIVERED_SUCCESS) + { + result = strdup("Delivered (success)"); + } + else if (status == INVALID_MSG_TYPE) + { + result = strdup("Message format is invalid"); + } + else if (status == MISSING_SOURCE) + { + result = strdup("Missing source"); + } + else if (status == MISSING_DEST) + { + result = strdup("Missing dest"); + } + else if (status == MISSING_CONTENT_TYPE) + { + result = strdup("Missing content_type"); + } + else if (status == MISSING_PAYLOAD) + { + result = strdup("Missing payload"); + } + else if (status == MISSING_PAYLOADLEN) + { + result = strdup("Missing payloadlen"); + } + else if (status == INVALID_CONTENT_TYPE) + { + result = strdup("Invalid content_type"); + } + else if (status == ENQUEUE_FAILURE) + { + result = strdup("Unable to enqueue"); + } + else if (status == CLIENT_DISCONNECT) + { + result = strdup("send failed due to client disconnect"); + } + else if (status == QUEUE_SIZE_EXCEEDED) + { + result = strdup("Max Queue Size Exceeded"); + } + else if (status == WRP_ENCODE_FAILURE) + { + result = strdup("Wrp message encoding failed"); + } + else if (status == MSG_PROCESSING_FAILED) + { + result = strdup("Memory allocation failed"); + } + else + { + result = strdup("Unknown Error"); + } + *message = result; +} diff --git a/src/xmidtsend_rbus.h b/src/xmidtsend_rbus.h index eb0c846..6a1199c 100644 --- a/src/xmidtsend_rbus.h +++ b/src/xmidtsend_rbus.h @@ -111,6 +111,7 @@ int deleteFromXmidtQ(wrp_msg_t *msg, XmidtMsg **next_node); int checkCloudConn(); void checkMaxQandOptimize(); void checkMsgExpiry(); +void mapXmidtStatusToStatusMsg(int status, char **message); #ifdef __cplusplus } #endif From 8019489b868119270755420c2532931746f1659a Mon Sep 17 00:00:00 2001 From: Sadhyama Vengilat Date: Wed, 29 Jun 2022 14:13:37 +0530 Subject: [PATCH 082/137] Handle xmidt event validation failures and delete from queue --- src/xmidtsend_rbus.c | 93 +++++++++++++++++++++++--------------------- src/xmidtsend_rbus.h | 3 +- 2 files changed, 49 insertions(+), 47 deletions(-) diff --git a/src/xmidtsend_rbus.c b/src/xmidtsend_rbus.c index 322652c..60b34c9 100644 --- a/src/xmidtsend_rbus.c +++ b/src/xmidtsend_rbus.c @@ -138,7 +138,7 @@ void addToXmidtUpstreamQ(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle) ParodusPrint("XmidtQsize is %d\n" , get_XmidtQsize()); if(get_XmidtQsize() == MAX_QUEUE_SIZE) { - mapXmidtStatusToStatusMsg(QUEUE_SIZE_EXCEEDED, &errorMsg); + mapXmidtStatusToStatusMessage(QUEUE_SIZE_EXCEEDED, &errorMsg); ParodusInfo("errorMsg is %s\n",errorMsg); createOutParamsandSendAck(msg, asyncHandle, errorMsg , QUEUE_SIZE_EXCEEDED, RBUS_ERROR_INVALID_RESPONSE_FROM_DESTINATION); wrp_free_struct(msg); @@ -183,7 +183,7 @@ void addToXmidtUpstreamQ(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle) } else { - mapXmidtStatusToStatusMsg(ENQUEUE_FAILURE, &errorMsg); + mapXmidtStatusToStatusMessage(ENQUEUE_FAILURE, &errorMsg); ParodusInfo("errorMsg is %s\n",errorMsg); createOutParamsandSendAck(msg, asyncHandle, errorMsg , ENQUEUE_FAILURE, RBUS_ERROR_INVALID_RESPONSE_FROM_DESTINATION); wrp_free_struct(msg); @@ -252,8 +252,7 @@ void* processXmidtUpstreamMsg() rv = processData(Data, Data->msg, Data->asyncHandle); if(!rv) { - ParodusInfo("Data->msg wrp free\n"); - wrp_free_struct(Data->msg); + ParodusError("processData failed\n"); } else { @@ -356,10 +355,10 @@ int processData(XmidtMsg *Datanode, wrp_msg_t * msg, rbusMethodAsyncHandle_t asy if (xmidtMsg == NULL) { ParodusError("xmidtMsg is NULL\n"); - mapXmidtStatusToStatusMsg(ENQUEUE_FAILURE, &errorMsg); + mapXmidtStatusToStatusMessage(ENQUEUE_FAILURE, &errorMsg); ParodusInfo("errorMsg is %s\n",errorMsg); createOutParamsandSendAck(xmidtMsg, asyncHandle, errorMsg, ENQUEUE_FAILURE, RBUS_ERROR_INVALID_RESPONSE_FROM_DESTINATION); - xmidtQDequeue(); + updateXmidtState(Datanode, DELETE); return rv; } @@ -375,27 +374,11 @@ int processData(XmidtMsg *Datanode, wrp_msg_t * msg, rbusMethodAsyncHandle_t asy { ParodusError("validation failed, send failure ack\n"); createOutParamsandSendAck(xmidtMsg, asyncHandle, errorMsg , statuscode, RBUS_ERROR_INVALID_INPUT); - xmidtQDequeue(); + updateXmidtState(Datanode, DELETE); } return rv; } -//To remove an event from Queue -void xmidtQDequeue() -{ - pthread_mutex_lock (&xmidt_mut); - if(XmidtMsgQ != NULL) - { - XmidtMsgQ = XmidtMsgQ->next; - XmidtQsize -= 1; - } - else - { - ParodusError("XmidtMsgQ is NULL\n"); - } - pthread_mutex_unlock (&xmidt_mut); -} - int validateXmidtData(wrp_msg_t * eventMsg, char **errorMsg, int *statusCode) { if(eventMsg == NULL) @@ -565,19 +548,30 @@ void sendXmidtEventToServer(XmidtMsg *msgnode, wrp_msg_t * msg, rbusMethodAsyncH else { ParodusError("wrp msg_len is zero\n"); - mapXmidtStatusToStatusMsg(WRP_ENCODE_FAILURE, &errorMsg); + mapXmidtStatusToStatusMessage(WRP_ENCODE_FAILURE, &errorMsg); ParodusInfo("errorMsg is %s\n",errorMsg); createOutParamsandSendAck(msg, asyncHandle, errorMsg, WRP_ENCODE_FAILURE, RBUS_ERROR_INVALID_RESPONSE_FROM_DESTINATION); - xmidtQDequeue(); - - ParodusPrint("wrp_free_struct\n"); + updateXmidtState(msgnode, DELETE); + /*ParodusPrint("wrp_free_struct\n"); if(notif_wrp_msg != NULL) { wrp_free_struct(notif_wrp_msg); + }*/ + if(notif_wrp_msg !=NULL) + { + ParodusInfo("notif_wrp_msg->u.event.source free\n"); + if(notif_wrp_msg->u.event.source !=NULL) + { + free(notif_wrp_msg->u.event.source); + notif_wrp_msg->u.event.source = NULL; + } + ParodusInfo("notif_wrp_msg free\n"); + free(notif_wrp_msg); + notif_wrp_msg = NULL; } - if(msg_bytes != NULL) { + ParodusInfo("msg_bytes free\n"); free(msg_bytes); msg_bytes = NULL; } @@ -599,11 +593,11 @@ void sendXmidtEventToServer(XmidtMsg *msgnode, wrp_msg_t * msg, rbusMethodAsyncH } else { - mapXmidtStatusToStatusMsg(CLIENT_DISCONNECT, &errorMsg); + mapXmidtStatusToStatusMessage(CLIENT_DISCONNECT, &errorMsg); ParodusInfo("errorMsg is %s\n",errorMsg); - ParodusInfo("The event is having low qos proceed to dequeue\n"); + ParodusInfo("The event is having low qos proceed to delete\n"); createOutParamsandSendAck(msg, asyncHandle, errorMsg, CLIENT_DISCONNECT, RBUS_ERROR_INVALID_RESPONSE_FROM_DESTINATION); - xmidtQDequeue(); + updateXmidtState(msgnode, DELETE); break; } sendRetStatus = sendUpstreamMsgToServer(&msg_bytes, msg_len); @@ -613,20 +607,18 @@ void sendXmidtEventToServer(XmidtMsg *msgnode, wrp_msg_t * msg, rbusMethodAsyncH { if(highQosValueCheck(qos)) { - //update msg status from PENDING to SENT + ParodusInfo("High qos event send success, update state to SENT\n"); + //Update msg status from PENDING to SENT updateXmidtState(msgnode, SENT); print_xmidMsg_list(); - //xmidtQDequeue(); - //ParodusInfo("xmidtQDequeue done for high Qos msg\n"); } else { - ParodusInfo("Low qos event, send success callback and dequeue\n"); - mapXmidtStatusToStatusMsg(DELIVERED_SUCCESS, &errorMsg); + ParodusInfo("Low qos event, send success callback and delete\n"); + mapXmidtStatusToStatusMessage(DELIVERED_SUCCESS, &errorMsg); ParodusInfo("errorMsg is %s\n",errorMsg); createOutParamsandSendAck(msg, asyncHandle, errorMsg, DELIVERED_SUCCESS, RBUS_ERROR_SUCCESS); updateXmidtState(msgnode, DELETE); - //xmidtQDequeue(); } } @@ -645,18 +637,31 @@ void sendXmidtEventToServer(XmidtMsg *msgnode, wrp_msg_t * msg, rbusMethodAsyncH } else { - mapXmidtStatusToStatusMsg(MSG_PROCESSING_FAILED, &errorMsg); + mapXmidtStatusToStatusMessage(MSG_PROCESSING_FAILED, &errorMsg); ParodusInfo("errorMsg is %s\n",errorMsg); ParodusError("Memory allocation failed\n"); createOutParamsandSendAck(msg, asyncHandle, errorMsg, MSG_PROCESSING_FAILED, RBUS_ERROR_INVALID_RESPONSE_FROM_DESTINATION); - xmidtQDequeue(); + updateXmidtState(msgnode, DELETE); } - if(msg->u.event.source !=NULL) + /*if(msg->u.event.source !=NULL) { free(msg->u.event.source); msg->u.event.source = NULL; + }*/ + if(notif_wrp_msg !=NULL) + { + ParodusInfo("notif_wrp_msg->u.event.source free\n"); + if(notif_wrp_msg->u.event.source !=NULL) + { + free(notif_wrp_msg->u.event.source); + notif_wrp_msg->u.event.source = NULL; + } + ParodusInfo("notif_wrp_msg free\n"); + free(notif_wrp_msg); + notif_wrp_msg = NULL; } + ParodusInfo("sendXmidtEventToServer done\n"); } void createOutParamsandSendAck(wrp_msg_t *msg, rbusMethodAsyncHandle_t asyncHandle, char *errorMsg, int statuscode, rbusError_t error) @@ -1132,12 +1137,10 @@ int checkCloudACK(XmidtMsg *xmdnode, rbusMethodAsyncHandle_t asyncHandle) if( strcmp(xmdMsgTransID, cloudnode->transaction_id) == 0) { ParodusInfo("transaction_id %s is matching, send callback\n", xmdMsgTransID); - mapXmidtStatusToStatusMsg(DELIVERED_SUCCESS, &errorMsg); + mapXmidtStatusToStatusMessage(DELIVERED_SUCCESS, &errorMsg); ParodusInfo("errorMsg is %s\n",errorMsg); createOutParamsandSendAck(xmdMsg, asyncHandle, errorMsg, DELIVERED_SUCCESS, cloudnode->rdr); - ParodusInfo("free xmdMsg as callback is sent after cloud ack\n"); - wrp_free_struct(xmdMsg); - ParodusInfo("set state to DELETE\n"); + ParodusInfo("set to DELETE state as cloud ack is processed\n"); updateXmidtState(xmdnode, DELETE); print_xmidMsg_list(); ParodusInfo("delete cloudACK cloudnode\n"); @@ -1411,7 +1414,7 @@ void checkMaxQandOptimize() } //map xmidt status and rdr response to status message -void mapXmidtStatusToStatusMsg(int status, char **message) +void mapXmidtStatusToStatusMessage(int status, char **message) { char *result = NULL; diff --git a/src/xmidtsend_rbus.h b/src/xmidtsend_rbus.h index 6a1199c..fd391b8 100644 --- a/src/xmidtsend_rbus.h +++ b/src/xmidtsend_rbus.h @@ -98,7 +98,6 @@ char* generate_transaction_uuid(); void parseRbusInparamsToWrp(rbusObject_t inParams, char *trans_id, wrp_msg_t **eventMsg); void createOutParamsandSendAck(wrp_msg_t *msg, rbusMethodAsyncHandle_t asyncHandle, char *errorMsg, int statuscode, rbusError_t error); int validateXmidtData(wrp_msg_t * eventMsg, char **errorMsg, int *statusCode); -void xmidtQDequeue(); bool highQosValueCheck(int qos); void waitTillConnectionIsUp(); void printRBUSParams(rbusObject_t params, char* file_path); @@ -111,7 +110,7 @@ int deleteFromXmidtQ(wrp_msg_t *msg, XmidtMsg **next_node); int checkCloudConn(); void checkMaxQandOptimize(); void checkMsgExpiry(); -void mapXmidtStatusToStatusMsg(int status, char **message); +void mapXmidtStatusToStatusMessage(int status, char **message); #ifdef __cplusplus } #endif From d328a56e1a00743d0a463d98a597dbc508cfd8a6 Mon Sep 17 00:00:00 2001 From: Sadhyama Vengilat Date: Wed, 29 Jun 2022 16:54:12 +0530 Subject: [PATCH 083/137] Fix build error on max queue size argument --- src/config.c | 6 +++--- src/config.h | 2 +- src/xmidtsend_rbus.c | 8 ++++---- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/config.c b/src/config.c index 7bf283d..f88e4fe 100644 --- a/src/config.c +++ b/src/config.c @@ -400,7 +400,7 @@ int parseCommandLine(int argc,char **argv,ParodusCfg * cfg) {"webpa-backoff-max", required_argument, 0, 'o'}, {"webpa-interface-used", required_argument, 0, 'i'}, {"parodus-local-url", required_argument, 0, 'l'}, -#ifdef WAN_FAILOVER_SUPPORTED +#ifdef ENABLE_WEBCFGBIN {"max-queue-size", required_argument, 0, 'q'}, #endif {"partner-id", required_argument, 0, 'p'}, @@ -537,7 +537,7 @@ int parseCommandLine(int argc,char **argv,ParodusCfg * cfg) ParodusInfo("parodus local_url is %s\n",cfg->local_url); break; -#ifdef WAN_FAILOVER_SUPPORTED +#ifdef ENABLE_WEBCFGBIN case 'q': cfg->max_queue_size = parse_num_arg (optarg, "max-queue-size"); if (cfg->max_queue_size == (unsigned int) -1) @@ -850,7 +850,7 @@ void loadParodusCfg(ParodusCfg * config,ParodusCfg *cfg) parStrncpy(cfg->cert_path, "\0", sizeof(cfg->cert_path)); ParodusPrint("cert_path is NULL. set to empty\n"); } - #ifdef WAN_FAILOVER_SUPPORTED + #ifdef ENABLE_WEBCFGBIN cfg->max_queue_size = config->max_queue_size; #endif cfg->boot_time = config->boot_time; diff --git a/src/config.h b/src/config.h index 6ce49de..72770e8 100644 --- a/src/config.h +++ b/src/config.h @@ -88,7 +88,7 @@ typedef struct char webpa_uuid[64]; unsigned int flags; char local_url[124]; -#ifdef WAN_FAILOVER_SUPPORTED +#ifdef ENABLE_WEBCFGBIN unsigned int max_queue_size; #endif char partner_id[64]; diff --git a/src/xmidtsend_rbus.c b/src/xmidtsend_rbus.c index 38e4922..cff1fee 100644 --- a/src/xmidtsend_rbus.c +++ b/src/xmidtsend_rbus.c @@ -32,7 +32,7 @@ #include "heartBeat.h" static pthread_t processThreadId = 0; -static int XmidtQsize = 0; +static unsigned int XmidtQsize = 0; XmidtMsg *XmidtMsgQ = NULL; @@ -91,9 +91,9 @@ CloudAck * get_global_cloud_node(void) return tmp; } -int get_XmidtQsize() +unsigned int get_XmidtQsize() { - int tmp = 0; + unsigned int tmp = 0; pthread_mutex_lock (&xmidt_mut); tmp = XmidtQsize; pthread_mutex_unlock (&xmidt_mut); @@ -1387,7 +1387,7 @@ void checkMaxQandOptimize() int qos = 0; ParodusInfo("checkMaxQandOptimize . XmidtQsize is %d\n" , get_XmidtQsize()); - if(get_XmidtQsize() == MAX_QUEUE_SIZE) + if(get_XmidtQsize() == get_parodus_cfg()->max_queue_size) { ParodusInfo("Max Queue size reached, check and optimize\n"); From 00251153a4d41a3e198484ae6ae35078b4713970 Mon Sep 17 00:00:00 2001 From: Sadhyama Vengilat Date: Wed, 29 Jun 2022 20:40:38 +0530 Subject: [PATCH 084/137] Handle xmidt size when max queue size argument is not available --- src/xmidtsend_rbus.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/xmidtsend_rbus.c b/src/xmidtsend_rbus.c index cff1fee..314892f 100644 --- a/src/xmidtsend_rbus.c +++ b/src/xmidtsend_rbus.c @@ -135,8 +135,8 @@ void addToXmidtUpstreamQ(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle) struct timespec ts; char * errorMsg = NULL; - ParodusPrint("XmidtQsize is %d\n" , get_XmidtQsize()); - if(get_XmidtQsize() == get_parodus_cfg()->max_queue_size) + ParodusInfo("XmidtQsize is %d\n" , get_XmidtQsize()); + if( get_XmidtQsize() > 0 && get_XmidtQsize() == get_parodus_cfg()->max_queue_size) { mapXmidtStatusToStatusMessage(QUEUE_SIZE_EXCEEDED, &errorMsg); ParodusInfo("errorMsg is %s\n",errorMsg); @@ -1387,7 +1387,7 @@ void checkMaxQandOptimize() int qos = 0; ParodusInfo("checkMaxQandOptimize . XmidtQsize is %d\n" , get_XmidtQsize()); - if(get_XmidtQsize() == get_parodus_cfg()->max_queue_size) + if(get_XmidtQsize() > 0 && get_XmidtQsize() == get_parodus_cfg()->max_queue_size) { ParodusInfo("Max Queue size reached, check and optimize\n"); From f655d6382b853bf91c8a60bb6b6be32b1e6eaab7 Mon Sep 17 00:00:00 2001 From: Sadhyama Vengilat Date: Thu, 30 Jun 2022 14:14:30 +0530 Subject: [PATCH 085/137] Fix lock stuck issue during delete and enqueuetime logging --- src/xmidtsend_rbus.c | 30 +++++++++++++++++------------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/src/xmidtsend_rbus.c b/src/xmidtsend_rbus.c index c304658..c653538 100644 --- a/src/xmidtsend_rbus.c +++ b/src/xmidtsend_rbus.c @@ -143,7 +143,7 @@ void addToXmidtUpstreamQ(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle) if( get_XmidtQsize() > 0 && get_XmidtQsize() == get_parodus_cfg()->max_queue_size) { mapXmidtStatusToStatusMessage(QUEUE_SIZE_EXCEEDED, &errorMsg); - ParodusInfo("errorMsg is %s\n",errorMsg); + ParodusInfo("statusMsg is %s\n",errorMsg); createOutParamsandSendAck(msg, asyncHandle, errorMsg , QUEUE_SIZE_EXCEEDED, RBUS_ERROR_INVALID_RESPONSE_FROM_DESTINATION); wrp_free_struct(msg); return; @@ -159,6 +159,7 @@ void addToXmidtUpstreamQ(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle) message->state = PENDING; getCurrentTime(&ts); message->enqueueTime = (long long)ts.tv_sec; + ParodusInfo("message->enqueueTime is %lu\n", (long long) message->enqueueTime); message->sentTime = 0; //Increment queue size to handle max queue limit increment_XmidtQsize(); @@ -188,7 +189,7 @@ void addToXmidtUpstreamQ(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle) else { mapXmidtStatusToStatusMessage(ENQUEUE_FAILURE, &errorMsg); - ParodusInfo("errorMsg is %s\n",errorMsg); + ParodusInfo("statusMsg is %s\n",errorMsg); createOutParamsandSendAck(msg, asyncHandle, errorMsg , ENQUEUE_FAILURE, RBUS_ERROR_INVALID_RESPONSE_FROM_DESTINATION); wrp_free_struct(msg); } @@ -269,7 +270,7 @@ void* processXmidtUpstreamMsg() ParodusInfo("state : SENT\n"); getCurrentTime(&ts); currTime = (long long)ts.tv_sec; - ParodusInfo("currTime %d sentTime %lu timeout sec %lu\n",currTime, Data->sentTime, Data->sentTime + CLOUD_ACK_TIMEOUT_SEC); + ParodusInfo("currTime %d sentTime %lu timeout sec %lu\n",currTime, (long long) Data->sentTime, (long long) Data->sentTime + CLOUD_ACK_TIMEOUT_SEC); if (currTime > (Data->sentTime + CLOUD_ACK_TIMEOUT_SEC)) { ParodusInfo("Check cloud ack for matching transaction id\n"); @@ -320,6 +321,7 @@ void* processXmidtUpstreamMsg() if(xmidtQ !=NULL) { + ParodusInfo("Move to next node\n"); xmidtQ = xmidtQ->next; } @@ -360,7 +362,7 @@ int processData(XmidtMsg *Datanode, wrp_msg_t * msg, rbusMethodAsyncHandle_t asy { ParodusError("xmidtMsg is NULL\n"); mapXmidtStatusToStatusMessage(ENQUEUE_FAILURE, &errorMsg); - ParodusInfo("errorMsg is %s\n",errorMsg); + ParodusInfo("statusMsg is %s\n",errorMsg); createOutParamsandSendAck(xmidtMsg, asyncHandle, errorMsg, ENQUEUE_FAILURE, RBUS_ERROR_INVALID_RESPONSE_FROM_DESTINATION); updateXmidtState(Datanode, DELETE); return rv; @@ -555,7 +557,7 @@ void sendXmidtEventToServer(XmidtMsg *msgnode, wrp_msg_t * msg, rbusMethodAsyncH { ParodusError("wrp msg_len is zero\n"); mapXmidtStatusToStatusMessage(WRP_ENCODE_FAILURE, &errorMsg); - ParodusInfo("errorMsg is %s\n",errorMsg); + ParodusInfo("statusMsg is %s\n",errorMsg); createOutParamsandSendAck(msg, asyncHandle, errorMsg, WRP_ENCODE_FAILURE, RBUS_ERROR_INVALID_RESPONSE_FROM_DESTINATION); updateXmidtState(msgnode, DELETE); /*ParodusPrint("wrp_free_struct\n"); @@ -601,7 +603,7 @@ void sendXmidtEventToServer(XmidtMsg *msgnode, wrp_msg_t * msg, rbusMethodAsyncH else { mapXmidtStatusToStatusMessage(CLIENT_DISCONNECT, &errorMsg); - ParodusInfo("errorMsg is %s\n",errorMsg); + ParodusInfo("statusMsg is %s\n",errorMsg); ParodusInfo("The event is having low qos proceed to delete\n"); printSendMsgData(errorMsg, notif_wrp_msg->u.event.qos, notif_wrp_msg->u.event.dest, notif_wrp_msg->u.event.transaction_uuid); createOutParamsandSendAck(msg, asyncHandle, errorMsg, CLIENT_DISCONNECT, RBUS_ERROR_INVALID_RESPONSE_FROM_DESTINATION); @@ -624,9 +626,11 @@ void sendXmidtEventToServer(XmidtMsg *msgnode, wrp_msg_t * msg, rbusMethodAsyncH { ParodusInfo("Low qos event, send success callback and delete\n"); mapXmidtStatusToStatusMessage(DELIVERED_SUCCESS, &errorMsg); - ParodusInfo("errorMsg is %s\n",errorMsg); + ParodusInfo("statusMsg is %s\n",errorMsg); createOutParamsandSendAck(msg, asyncHandle, errorMsg, DELIVERED_SUCCESS, RBUS_ERROR_SUCCESS); + print_xmidMsg_list(); updateXmidtState(msgnode, DELETE); + print_xmidMsg_list(); } } @@ -646,7 +650,7 @@ void sendXmidtEventToServer(XmidtMsg *msgnode, wrp_msg_t * msg, rbusMethodAsyncH else { mapXmidtStatusToStatusMessage(MSG_PROCESSING_FAILED, &errorMsg); - ParodusInfo("errorMsg is %s\n",errorMsg); + ParodusInfo("statusMsg is %s\n",errorMsg); ParodusError("Memory allocation failed\n"); createOutParamsandSendAck(msg, asyncHandle, errorMsg, MSG_PROCESSING_FAILED, RBUS_ERROR_INVALID_RESPONSE_FROM_DESTINATION); updateXmidtState(msgnode, DELETE); @@ -685,7 +689,7 @@ void createOutParamsandSendAck(wrp_msg_t *msg, rbusMethodAsyncHandle_t asyncHand rbusObject_SetValue(outParams, "msg_type", value); rbusValue_Release(value); - ParodusInfo("statuscode %d errorMsg %s\n", statuscode, errorMsg); + ParodusInfo("statuscode %d statusMsg %s\n", statuscode, errorMsg); rbusValue_Init(&value); rbusValue_SetInt32(value, statuscode); rbusObject_SetValue(outParams, "status", value); @@ -1146,7 +1150,7 @@ int checkCloudACK(XmidtMsg *xmdnode, rbusMethodAsyncHandle_t asyncHandle) { ParodusInfo("transaction_id %s is matching, send callback\n", xmdMsgTransID); mapXmidtStatusToStatusMessage(DELIVERED_SUCCESS, &errorMsg); - ParodusInfo("errorMsg is %s\n",errorMsg); + ParodusInfo("statusMsg is %s\n",errorMsg); createOutParamsandSendAck(xmdMsg, asyncHandle, errorMsg, DELIVERED_SUCCESS, cloudnode->rdr); ParodusInfo("set to DELETE state as cloud ack is processed\n"); updateXmidtState(xmdnode, DELETE); @@ -1197,7 +1201,7 @@ void print_xmidMsg_list() while (NULL != temp) { wrp_msg_t *xmdMsg = temp->msg; - ParodusInfo("node is pointing to xmdMsg transid %s temp->state %d temp->enqueueTime %lu temp->sentTime %lu\n", xmdMsg->u.event.transaction_uuid, temp->state, temp->enqueueTime, temp->sentTime); + ParodusInfo("node is pointing to xmdMsg transid %s temp->state %d temp->enqueueTime %lu temp->sentTime %lu\n", xmdMsg->u.event.transaction_uuid, temp->state, (long long)temp->enqueueTime, (long long)temp->sentTime); temp= temp->next; } ParodusInfo("print_xmidMsg_list done\n"); @@ -1313,9 +1317,9 @@ int deleteFromXmidtQ(wrp_msg_t *msg, XmidtMsg **next_node) curr_node = NULL; } ParodusInfo("Deleted successfully and returning..\n"); + pthread_mutex_unlock (&xmidt_mut); decrement_XmidtQsize(); ParodusInfo("XmidtQsize after delete is %d\n", get_XmidtQsize()); - pthread_mutex_unlock (&xmidt_mut); return 1; } @@ -1341,7 +1345,7 @@ void checkMsgExpiry() getCurrentTime(&ts); currTime= (long long)ts.tv_sec; wrp_msg_t * tempMsg = temp->msg; - ParodusInfo("qos %d currTime %lu enqueueTime %lu\n", tempMsg->u.event.qos, currTime, temp->enqueueTime); + ParodusInfo("qos %d currTime %lu enqueueTime %lu\n", tempMsg->u.event.qos, currTime, (long long) temp->enqueueTime); if(tempMsg->u.event.qos > 74) { From e139a2d6b68370355f3b44188ffae38540af8601 Mon Sep 17 00:00:00 2001 From: Sadhyama Vengilat Date: Thu, 30 Jun 2022 18:45:56 +0530 Subject: [PATCH 086/137] Fix delete node traversal and debug enqueueTime --- src/downstream.c | 7 ++- src/time.c | 8 ++- src/xmidtsend_rbus.c | 122 +++++++++++++++++++++++-------------------- 3 files changed, 74 insertions(+), 63 deletions(-) diff --git a/src/downstream.c b/src/downstream.c index 26954c2..f2985a0 100644 --- a/src/downstream.c +++ b/src/downstream.c @@ -33,7 +33,7 @@ /*----------------------------------------------------------------------------*/ static void createNewMsgForCRUD(wrp_msg_t *message, wrp_msg_t **crudMessage ); static void createNewMsgForCloudACK(wrp_msg_t *message, wrp_msg_t **eventMessage ); //Test purpose. -static int test = 1; +static int test = 0; /*----------------------------------------------------------------------------*/ /* External Functions */ /*----------------------------------------------------------------------------*/ @@ -246,7 +246,7 @@ void listenerOnMessage(void * msg, size_t msgSize) ParodusInfo("Create downstream event Msg with cloud ack\n"); createNewMsgForCloudACK(message, &eventMsg); msgType = WRP_MSG_TYPE__EVENT; - ParodusInfo("check cloud ack\n"); + ParodusPrint("check cloud ack\n"); if((WRP_MSG_TYPE__EVENT == msgType) && (ret >= 0)) { //Process cloud ack only when qos > 24 @@ -274,7 +274,7 @@ void listenerOnMessage(void * msg, size_t msgSize) { ParodusInfo("Received cloud ack from server: transaction_uuid %s qos %d, rdr %d\n", eventMsg->u.event.transaction_uuid, eventMsg->u.event.qos, eventMsg->u.event.rdr); addToCloudAckQ(eventMsg->u.event.transaction_uuid, eventMsg->u.event.qos, eventMsg->u.event.rdr); - ParodusInfo("Added to cloud ack Q\n"); + ParodusPrint("Added to cloud ack Q\n"); } else { @@ -285,7 +285,6 @@ void listenerOnMessage(void * msg, size_t msgSize) { ParodusInfo("cloud ack received with low qos %d, ignoring it\n", eventMsg->u.event.qos); } - //test++; ParodusInfo("test is %d\n", test); } } diff --git a/src/time.c b/src/time.c index ab1362e..c58cae4 100644 --- a/src/time.c +++ b/src/time.c @@ -17,6 +17,7 @@ #include "time.h" #include "parodus_log.h" +#include /*----------------------------------------------------------------------------*/ /* External Functions */ @@ -24,7 +25,12 @@ void getCurrentTime(struct timespec *timer) { - clock_gettime(CLOCK_REALTIME, timer); + //clock_gettime(CLOCK_REALTIME, timer); + if( clock_gettime(CLOCK_REALTIME, timer) == -1 ) + { + ParodusError("clock gettime returns error\n"); + } + ParodusInfo("clock gettime returns errno %d\n", errno ); } uint64_t getCurrentTimeInMicroSeconds(struct timespec *timer) diff --git a/src/xmidtsend_rbus.c b/src/xmidtsend_rbus.c index c653538..467e75a 100644 --- a/src/xmidtsend_rbus.c +++ b/src/xmidtsend_rbus.c @@ -136,14 +136,14 @@ int checkCloudConn() void addToXmidtUpstreamQ(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle) { XmidtMsg *message; - struct timespec ts; + struct timespec times; char * errorMsg = NULL; ParodusInfo("XmidtQsize is %d\n" , get_XmidtQsize()); if( get_XmidtQsize() > 0 && get_XmidtQsize() == get_parodus_cfg()->max_queue_size) { mapXmidtStatusToStatusMessage(QUEUE_SIZE_EXCEEDED, &errorMsg); - ParodusInfo("statusMsg is %s\n",errorMsg); + ParodusPrint("statusMsg is %s\n",errorMsg); createOutParamsandSendAck(msg, asyncHandle, errorMsg , QUEUE_SIZE_EXCEEDED, RBUS_ERROR_INVALID_RESPONSE_FROM_DESTINATION); wrp_free_struct(msg); return; @@ -157,9 +157,9 @@ void addToXmidtUpstreamQ(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle) message->msg = msg; message->asyncHandle =asyncHandle; message->state = PENDING; - getCurrentTime(&ts); - message->enqueueTime = (long long)ts.tv_sec; - ParodusInfo("message->enqueueTime is %lu\n", (long long) message->enqueueTime); + getCurrentTime(×); + message->enqueueTime = (long long)times.tv_sec; + ParodusInfo("times.tv_sec %lld message->enqueueTime is %lld\n", (long long)times.tv_sec, message->enqueueTime); message->sentTime = 0; //Increment queue size to handle max queue limit increment_XmidtQsize(); @@ -189,7 +189,7 @@ void addToXmidtUpstreamQ(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle) else { mapXmidtStatusToStatusMessage(ENQUEUE_FAILURE, &errorMsg); - ParodusInfo("statusMsg is %s\n",errorMsg); + ParodusPrint("statusMsg is %s\n",errorMsg); createOutParamsandSendAck(msg, asyncHandle, errorMsg , ENQUEUE_FAILURE, RBUS_ERROR_INVALID_RESPONSE_FROM_DESTINATION); wrp_free_struct(msg); } @@ -218,7 +218,7 @@ void* processXmidtUpstreamMsg() int rv = 0; long long currTime = 0; int ret = 0, status = 0; - struct timespec ts; + struct timespec tms; XmidtMsg *xmidtQ = NULL; XmidtMsg *next_node = NULL; @@ -235,12 +235,12 @@ void* processXmidtUpstreamMsg() ParodusInfo("Received cloud status signal proceed to event processing\n"); } pthread_mutex_lock (&xmidt_mut); - ParodusInfo("mutex lock in xmidt consumer thread\n"); + ParodusPrint("mutex lock in xmidt consumer thread\n"); if (xmidtQ != NULL) { XmidtMsg *Data = xmidtQ; pthread_mutex_unlock (&xmidt_mut); - ParodusInfo("mutex unlock in xmidt consumer thread\n"); + ParodusPrint("mutex unlock in xmidt consumer thread\n"); checkMsgExpiry(); checkMaxQandOptimize(); @@ -268,35 +268,36 @@ void* processXmidtUpstreamMsg() case SENT: ParodusInfo("state : SENT\n"); - getCurrentTime(&ts); - currTime = (long long)ts.tv_sec; - ParodusInfo("currTime %d sentTime %lu timeout sec %lu\n",currTime, (long long) Data->sentTime, (long long) Data->sentTime + CLOUD_ACK_TIMEOUT_SEC); - if (currTime > (Data->sentTime + CLOUD_ACK_TIMEOUT_SEC)) + getCurrentTime(&tms); + currTime = (long long)tms.tv_sec; + long long timeout_secs = (Data->sentTime) + CLOUD_ACK_TIMEOUT_SEC; + ParodusInfo("currTime %lu sentTime %lu CLOUD_ACK_TIMEOUT_SEC %lu, timeout_secs %lu\n", currTime, Data->sentTime, CLOUD_ACK_TIMEOUT_SEC, (long long) timeout_secs); + if (currTime > timeout_secs) { - ParodusInfo("Check cloud ack for matching transaction id\n"); + ParodusPrint("Check cloud ack for matching transaction id\n"); ret = checkCloudACK(Data, Data->asyncHandle); - ParodusInfo("ret is %d\n", ret); + ParodusPrint("ret is %d\n", ret); if (ret) { ParodusInfo("cloud ack processed successfully\n"); } else //ack timeout case { - ParodusInfo("transaction id match not found, cloud ack timed out. Need to retry\n"); + ParodusPrint("transaction id match not found, cloud ack timed out. Need to retry\n"); if (checkCloudConn()) { - ParodusInfo("cloud status is online, processData retry\n"); + ParodusPrint("cloud status is online, check ping time\n"); if(get_pingTimeStamp() > (Data->sentTime + CLOUD_ACK_TIMEOUT_SEC)) { + ParodusInfo("Ping received at timestamp %lu, proceed to retry\n", get_pingTimeStamp()); rv = processData(Data, Data->msg, Data->asyncHandle); if(!rv) { - ParodusInfo("Data->msg wrp free\n"); - wrp_free_struct(Data->msg); + ParodusError("processData retry failed\n"); } else { - ParodusInfo("processData success\n"); + ParodusInfo("processData retry success\n"); } } } @@ -310,7 +311,7 @@ void* processXmidtUpstreamMsg() { ParodusInfo("deleteFromXmidtQ done, continue\n"); xmidtQ = next_node; - continue; + //continue; } else { @@ -321,17 +322,17 @@ void* processXmidtUpstreamMsg() if(xmidtQ !=NULL) { - ParodusInfo("Move to next node\n"); + ParodusPrint("Move to next node\n"); xmidtQ = xmidtQ->next; } // circling back to 1st node if(xmidtQ == NULL && get_global_xmidthead() != NULL) { - ParodusInfo("xmidtQ is NULL, circling back to 1st node\n"); + ParodusPrint("xmidtQ is NULL, circling back to 1st node\n"); xmidtQ = get_global_xmidthead(); } - sleep(1); + sleep(3); } else { @@ -362,7 +363,7 @@ int processData(XmidtMsg *Datanode, wrp_msg_t * msg, rbusMethodAsyncHandle_t asy { ParodusError("xmidtMsg is NULL\n"); mapXmidtStatusToStatusMessage(ENQUEUE_FAILURE, &errorMsg); - ParodusInfo("statusMsg is %s\n",errorMsg); + ParodusPrint("statusMsg is %s\n",errorMsg); createOutParamsandSendAck(xmidtMsg, asyncHandle, errorMsg, ENQUEUE_FAILURE, RBUS_ERROR_INVALID_RESPONSE_FROM_DESTINATION); updateXmidtState(Datanode, DELETE); return rv; @@ -480,7 +481,7 @@ void sendXmidtEventToServer(XmidtMsg *msgnode, wrp_msg_t * msg, rbusMethodAsyncH char *errorMsg = NULL; int qos = 0; - ParodusInfo("MAX_QUEUE_SIZE: %d\n", get_parodus_cfg()->max_queue_size); + ParodusPrint("MAX_QUEUE_SIZE: %d\n", get_parodus_cfg()->max_queue_size); notif_wrp_msg = (wrp_msg_t *)malloc(sizeof(wrp_msg_t)); if(notif_wrp_msg != NULL) { @@ -550,14 +551,14 @@ void sendXmidtEventToServer(XmidtMsg *msgnode, wrp_msg_t * msg, rbusMethodAsyncH if(msg_len > 0) { ParodusPrint("sendUpstreamMsgToServer\n"); - printSendMsgData("send to server", notif_wrp_msg->u.event.qos, notif_wrp_msg->u.event.dest, notif_wrp_msg->u.event.transaction_uuid); + printSendMsgData("sending to server", notif_wrp_msg->u.event.qos, notif_wrp_msg->u.event.dest, notif_wrp_msg->u.event.transaction_uuid); sendRetStatus = sendUpstreamMsgToServer(&msg_bytes, msg_len); } else { ParodusError("wrp msg_len is zero\n"); mapXmidtStatusToStatusMessage(WRP_ENCODE_FAILURE, &errorMsg); - ParodusInfo("statusMsg is %s\n",errorMsg); + ParodusPrint("statusMsg is %s\n",errorMsg); createOutParamsandSendAck(msg, asyncHandle, errorMsg, WRP_ENCODE_FAILURE, RBUS_ERROR_INVALID_RESPONSE_FROM_DESTINATION); updateXmidtState(msgnode, DELETE); /*ParodusPrint("wrp_free_struct\n"); @@ -603,7 +604,7 @@ void sendXmidtEventToServer(XmidtMsg *msgnode, wrp_msg_t * msg, rbusMethodAsyncH else { mapXmidtStatusToStatusMessage(CLIENT_DISCONNECT, &errorMsg); - ParodusInfo("statusMsg is %s\n",errorMsg); + ParodusPrint("statusMsg is %s\n",errorMsg); ParodusInfo("The event is having low qos proceed to delete\n"); printSendMsgData(errorMsg, notif_wrp_msg->u.event.qos, notif_wrp_msg->u.event.dest, notif_wrp_msg->u.event.transaction_uuid); createOutParamsandSendAck(msg, asyncHandle, errorMsg, CLIENT_DISCONNECT, RBUS_ERROR_INVALID_RESPONSE_FROM_DESTINATION); @@ -626,9 +627,9 @@ void sendXmidtEventToServer(XmidtMsg *msgnode, wrp_msg_t * msg, rbusMethodAsyncH { ParodusInfo("Low qos event, send success callback and delete\n"); mapXmidtStatusToStatusMessage(DELIVERED_SUCCESS, &errorMsg); - ParodusInfo("statusMsg is %s\n",errorMsg); + ParodusPrint("statusMsg is %s\n",errorMsg); createOutParamsandSendAck(msg, asyncHandle, errorMsg, DELIVERED_SUCCESS, RBUS_ERROR_SUCCESS); - print_xmidMsg_list(); + //print_xmidMsg_list(); updateXmidtState(msgnode, DELETE); print_xmidMsg_list(); } @@ -650,7 +651,7 @@ void sendXmidtEventToServer(XmidtMsg *msgnode, wrp_msg_t * msg, rbusMethodAsyncH else { mapXmidtStatusToStatusMessage(MSG_PROCESSING_FAILED, &errorMsg); - ParodusInfo("statusMsg is %s\n",errorMsg); + ParodusPrint("statusMsg is %s\n",errorMsg); ParodusError("Memory allocation failed\n"); createOutParamsandSendAck(msg, asyncHandle, errorMsg, MSG_PROCESSING_FAILED, RBUS_ERROR_INVALID_RESPONSE_FROM_DESTINATION); updateXmidtState(msgnode, DELETE); @@ -708,7 +709,7 @@ void createOutParamsandSendAck(wrp_msg_t *msg, rbusMethodAsyncHandle_t asyncHand { if(msg->u.event.source !=NULL) { - ParodusInfo("msg->u.event.source is %s\n", msg->u.event.source); + ParodusPrint("msg->u.event.source is %s\n", msg->u.event.source); rbusValue_Init(&value); rbusValue_SetString(value, msg->u.event.source); rbusObject_SetValue(outParams, "source", value); @@ -717,7 +718,7 @@ void createOutParamsandSendAck(wrp_msg_t *msg, rbusMethodAsyncHandle_t asyncHand if(msg->u.event.dest !=NULL) { - ParodusInfo("msg->u.event.dest is %s\n", msg->u.event.dest); + ParodusPrint("msg->u.event.dest is %s\n", msg->u.event.dest); rbusValue_Init(&value); rbusValue_SetString(value, msg->u.event.dest); rbusObject_SetValue(outParams, "dest", value); @@ -726,7 +727,7 @@ void createOutParamsandSendAck(wrp_msg_t *msg, rbusMethodAsyncHandle_t asyncHand if(msg->u.event.content_type !=NULL) { - ParodusInfo("msg->u.event.content_type is %s\n", msg->u.event.content_type); + ParodusPrint("msg->u.event.content_type is %s\n", msg->u.event.content_type); rbusValue_Init(&value); rbusValue_SetString(value, msg->u.event.content_type); rbusObject_SetValue(outParams, "content_type", value); @@ -735,7 +736,7 @@ void createOutParamsandSendAck(wrp_msg_t *msg, rbusMethodAsyncHandle_t asyncHand rbusValue_Init(&value); snprintf(qosstring, sizeof(qosstring), "%d", msg->u.event.qos); - ParodusInfo("qosstring is %s\n", qosstring); + ParodusPrint("qosstring is %s\n", qosstring); rbusValue_SetString(value, qosstring); rbusObject_SetValue(outParams, "qos", value); rbusValue_Release(value); @@ -746,7 +747,7 @@ void createOutParamsandSendAck(wrp_msg_t *msg, rbusMethodAsyncHandle_t asyncHand rbusValue_SetString(value, msg->u.event.transaction_uuid); rbusObject_SetValue(outParams, "transaction_uuid", value); rbusValue_Release(value); - ParodusInfo("outParams msg->u.event.transaction_uuid %s\n", msg->u.event.transaction_uuid); + ParodusPrint("outParams msg->u.event.transaction_uuid %s\n", msg->u.event.transaction_uuid); } } @@ -759,7 +760,7 @@ void createOutParamsandSendAck(wrp_msg_t *msg, rbusMethodAsyncHandle_t asyncHand return; } - ParodusInfo("B4 async send callback\n"); + ParodusPrint("B4 async send callback\n"); err = rbusMethod_SendAsyncResponse(asyncHandle, error, outParams); if(err != RBUS_ERROR_SUCCESS) @@ -1079,7 +1080,7 @@ void addToCloudAckQ(char *trans_id, int qos, int rdr) { CloudAck *ackmsg; - ParodusInfo ("Add Xmidt downstream message to CloudAck list\n"); + ParodusPrint ("Add downstream message to CloudAck list\n"); ackmsg = (CloudAck *)malloc(sizeof(CloudAck)); if(ackmsg) @@ -1094,9 +1095,9 @@ void addToCloudAckQ(char *trans_id, int qos, int rdr) { g_cloudackHead = ackmsg; - ParodusInfo("Producer added cloud ack msg to Q\n"); + ParodusPrint("Producer added cloud ack msg to Q\n"); pthread_mutex_unlock (&cloudack_mut); - ParodusInfo("mutex unlock in cloud ack producer\n"); + ParodusPrint("mutex unlock in cloud ack producer\n"); } else { @@ -1130,7 +1131,7 @@ int checkCloudACK(XmidtMsg *xmdnode, rbusMethodAsyncHandle_t asyncHandle) if(xmdMsg != NULL) { xmdMsgTransID = xmdMsg->u.event.transaction_uuid; - ParodusInfo("xmdMsgTransID %s\n", xmdMsgTransID); + ParodusPrint("xmdMsgTransID %s\n", xmdMsgTransID); } else { @@ -1150,9 +1151,9 @@ int checkCloudACK(XmidtMsg *xmdnode, rbusMethodAsyncHandle_t asyncHandle) { ParodusInfo("transaction_id %s is matching, send callback\n", xmdMsgTransID); mapXmidtStatusToStatusMessage(DELIVERED_SUCCESS, &errorMsg); - ParodusInfo("statusMsg is %s\n",errorMsg); + ParodusPrint("statusMsg is %s\n",errorMsg); createOutParamsandSendAck(xmdMsg, asyncHandle, errorMsg, DELIVERED_SUCCESS, cloudnode->rdr); - ParodusInfo("set to DELETE state as cloud ack is processed\n"); + ParodusInfo("set xmidt msg to DELETE state as cloud ack is processed\n"); updateXmidtState(xmdnode, DELETE); print_xmidMsg_list(); ParodusInfo("delete cloudACK cloudnode\n"); @@ -1183,11 +1184,15 @@ int updateXmidtState(XmidtMsg * temp, int state) else { ParodusInfo("state to be updated %d\n", state); - ParodusInfo("node is pointing to temp->state %d\n",temp->state); + ParodusPrint("node is pointing to temp->state %d\n",temp->state); pthread_mutex_lock (&xmidt_mut); temp->state = state; - getCurrentTime(&ts); - temp->sentTime = (long long)ts.tv_sec; + if(state != DELETE) + { + getCurrentTime(&ts); + temp->sentTime = (long long)ts.tv_sec; + ParodusInfo("updated temp->sentTime %lu\n", temp->sentTime); + } ParodusInfo("msgnode is updated with state %d sentTime %lu\n", temp->state, temp->sentTime); pthread_mutex_unlock (&xmidt_mut); return 1; @@ -1204,7 +1209,7 @@ void print_xmidMsg_list() ParodusInfo("node is pointing to xmdMsg transid %s temp->state %d temp->enqueueTime %lu temp->sentTime %lu\n", xmdMsg->u.event.transaction_uuid, temp->state, (long long)temp->enqueueTime, (long long)temp->sentTime); temp= temp->next; } - ParodusInfo("print_xmidMsg_list done\n"); + ParodusPrint("print_xmidMsg_list done\n"); return; } @@ -1345,41 +1350,41 @@ void checkMsgExpiry() getCurrentTime(&ts); currTime= (long long)ts.tv_sec; wrp_msg_t * tempMsg = temp->msg; - ParodusInfo("qos %d currTime %lu enqueueTime %lu\n", tempMsg->u.event.qos, currTime, (long long) temp->enqueueTime); + ParodusPrint("qos %d currTime %lu enqueueTime %lu\n", tempMsg->u.event.qos, currTime, temp->enqueueTime); if(tempMsg->u.event.qos > 74) { - ParodusInfo("Critical Qos, check if expiry of 30 mins reached\n"); + ParodusPrint("Critical Qos, check if expiry of 30 mins reached\n"); if((currTime - temp->enqueueTime) > CRITICAL_QOS_EXPIRE_TIME) { - ParodusInfo("Critical qos msg, set to DELETE state\n"); + ParodusInfo("Critical qos 30 mins expired, set to DELETE state\n"); updateXmidtState(temp, DELETE); } } else if (tempMsg->u.event.qos > 49) { - ParodusInfo("High Qos, check if expiry of 25 mins reached\n"); + ParodusPrint("High Qos, check if expiry of 25 mins reached\n"); if((currTime - temp->enqueueTime) > HIGH_QOS_EXPIRE_TIME) { - ParodusInfo("High qos msg, set to DELETE state\n"); + ParodusInfo("High qos 25 mins expired, set to DELETE state\n"); updateXmidtState(temp, DELETE); } } else if (tempMsg->u.event.qos > 24) { - ParodusInfo("Medium Qos, check if expiry of 20 mins reached\n"); + ParodusPrint("Medium Qos, check if expiry of 20 mins reached\n"); if((currTime - temp->enqueueTime) > MEDIUM_QOS_EXPIRE_TIME) { - ParodusInfo("Medium qos msg, set to DELETE state\n"); + ParodusInfo("Medium qos 20 mins expired, set to DELETE state\n"); updateXmidtState(temp, DELETE); } } else if (tempMsg->u.event.qos >= 0) { - ParodusInfo("Low Qos, check if expiry of 15 mins reached\n"); + ParodusPrint("Low Qos, check if expiry of 15 mins reached\n"); if((currTime - temp->enqueueTime) > LOW_QOS_EXPIRE_TIME) { - ParodusInfo("Low qos msg, set to DELETE state\n"); + ParodusInfo("Low qos 15 mins expired, set to DELETE state\n"); updateXmidtState(temp, DELETE); } } @@ -1397,7 +1402,7 @@ void checkMaxQandOptimize() { int qos = 0; - ParodusInfo("checkMaxQandOptimize . XmidtQsize is %d\n" , get_XmidtQsize()); + ParodusPrint("checkMaxQandOptimize . XmidtQsize is %d\n" , get_XmidtQsize()); if(get_XmidtQsize() > 0 && get_XmidtQsize() == get_parodus_cfg()->max_queue_size) { ParodusInfo("Max Queue size reached, check and optimize\n"); @@ -1486,5 +1491,6 @@ void mapXmidtStatusToStatusMessage(int status, char **message) { result = strdup("Unknown Error"); } + ParodusInfo("Xmidt status msg %s\n", result); *message = result; } From ae5d0276126f7ef92a6ed960c3f6ec32e2401195 Mon Sep 17 00:00:00 2001 From: Sadhyama Vengilat Date: Thu, 30 Jun 2022 20:07:58 +0530 Subject: [PATCH 087/137] Fix time value logging --- src/time.c | 3 +-- src/xmidtsend_rbus.c | 32 ++++++++++++++++---------------- 2 files changed, 17 insertions(+), 18 deletions(-) diff --git a/src/time.c b/src/time.c index c58cae4..407dd7b 100644 --- a/src/time.c +++ b/src/time.c @@ -28,9 +28,8 @@ void getCurrentTime(struct timespec *timer) //clock_gettime(CLOCK_REALTIME, timer); if( clock_gettime(CLOCK_REALTIME, timer) == -1 ) { - ParodusError("clock gettime returns error\n"); + ParodusError("clock gettime returns errno %d\n", errno ); } - ParodusInfo("clock gettime returns errno %d\n", errno ); } uint64_t getCurrentTimeInMicroSeconds(struct timespec *timer) diff --git a/src/xmidtsend_rbus.c b/src/xmidtsend_rbus.c index 467e75a..7e21e47 100644 --- a/src/xmidtsend_rbus.c +++ b/src/xmidtsend_rbus.c @@ -245,7 +245,7 @@ void* processXmidtUpstreamMsg() checkMsgExpiry(); checkMaxQandOptimize(); - ParodusInfo("check state\n"); + ParodusPrint("check state\n"); switch(Data->state) { case PENDING: @@ -271,7 +271,7 @@ void* processXmidtUpstreamMsg() getCurrentTime(&tms); currTime = (long long)tms.tv_sec; long long timeout_secs = (Data->sentTime) + CLOUD_ACK_TIMEOUT_SEC; - ParodusInfo("currTime %lu sentTime %lu CLOUD_ACK_TIMEOUT_SEC %lu, timeout_secs %lu\n", currTime, Data->sentTime, CLOUD_ACK_TIMEOUT_SEC, (long long) timeout_secs); + ParodusInfo("currTime %lld sentTime %lld CLOUD_ACK_TIMEOUT_SEC %d, timeout_secs %lld\n", currTime, Data->sentTime, CLOUD_ACK_TIMEOUT_SEC, timeout_secs); if (currTime > timeout_secs) { ParodusPrint("Check cloud ack for matching transaction id\n"); @@ -309,7 +309,7 @@ void* processXmidtUpstreamMsg() status = deleteFromXmidtQ(Data->msg, &next_node); if(status) { - ParodusInfo("deleteFromXmidtQ done, continue\n"); + ParodusPrint("deleteFromXmidtQ success\n"); xmidtQ = next_node; //continue; } @@ -646,7 +646,7 @@ void sendXmidtEventToServer(XmidtMsg *msgnode, wrp_msg_t * msg, rbusMethodAsyncH free(msg_bytes); msg_bytes = NULL; } - ParodusInfo("sendXmidtEventToServer done\n"); + ParodusPrint("sendXmidtEventToServer done\n"); } else { @@ -1183,7 +1183,7 @@ int updateXmidtState(XmidtMsg * temp, int state) } else { - ParodusInfo("state to be updated %d\n", state); + ParodusPrint("state to be updated %d\n", state); ParodusPrint("node is pointing to temp->state %d\n",temp->state); pthread_mutex_lock (&xmidt_mut); temp->state = state; @@ -1191,9 +1191,9 @@ int updateXmidtState(XmidtMsg * temp, int state) { getCurrentTime(&ts); temp->sentTime = (long long)ts.tv_sec; - ParodusInfo("updated temp->sentTime %lu\n", temp->sentTime); + ParodusInfo("updated temp->sentTime %lld\n", temp->sentTime); } - ParodusInfo("msgnode is updated with state %d sentTime %lu\n", temp->state, temp->sentTime); + ParodusInfo("msgnode is updated with state %d sentTime %lld\n", temp->state, temp->sentTime); pthread_mutex_unlock (&xmidt_mut); return 1; } @@ -1206,7 +1206,7 @@ void print_xmidMsg_list() while (NULL != temp) { wrp_msg_t *xmdMsg = temp->msg; - ParodusInfo("node is pointing to xmdMsg transid %s temp->state %d temp->enqueueTime %lu temp->sentTime %lu\n", xmdMsg->u.event.transaction_uuid, temp->state, (long long)temp->enqueueTime, (long long)temp->sentTime); + ParodusInfo("node is pointing to xmdMsg transid %s temp->state %d temp->enqueueTime %lld temp->sentTime %lld\n", xmdMsg->u.event.transaction_uuid, temp->state, (long long)temp->enqueueTime, (long long)temp->sentTime); temp= temp->next; } ParodusPrint("print_xmidMsg_list done\n"); @@ -1233,15 +1233,15 @@ int deleteCloudACKNode(char* trans_id) { if(strcmp(curr_node->transaction_id, trans_id) == 0) { - ParodusInfo("Found the node to delete\n"); + ParodusPrint("Found the node to delete\n"); if( NULL == prev_node ) { - ParodusInfo("need to delete first doc\n"); + ParodusPrint("need to delete first doc\n"); g_cloudackHead = curr_node->next; } else { - ParodusInfo("Traversing to find node\n"); + ParodusPrint("Traversing to find node\n"); prev_node->next = curr_node->next; } @@ -1299,21 +1299,21 @@ int deleteFromXmidtQ(wrp_msg_t *msg, XmidtMsg **next_node) wrp_msg_t * curr_node_msg = curr_node->msg; if(curr_node_msg !=NULL && strcmp(curr_node_msg->u.event.transaction_uuid, transid) == 0) { - ParodusInfo("Found the node to delete\n"); + ParodusPrint("Found the node to delete\n"); if( NULL == prev_node ) { - ParodusInfo("need to delete first doc\n"); + ParodusPrint("need to delete first doc\n"); XmidtMsgQ = curr_node->next; } else { - ParodusInfo("Traversing to find node\n"); + ParodusPrint("Traversing to find node\n"); prev_node->next = curr_node->next; *next_node = curr_node->next; } - ParodusInfo("Deleting the node entries\n"); + ParodusPrint("Deleting the node entries\n"); wrp_free_struct( curr_node->msg); curr_node->msg = NULL; if(curr_node !=NULL) @@ -1491,6 +1491,6 @@ void mapXmidtStatusToStatusMessage(int status, char **message) { result = strdup("Unknown Error"); } - ParodusInfo("Xmidt status msg %s\n", result); + ParodusPrint("Xmidt status msg %s\n", result); *message = result; } From f9ac95642cf143509f5ce3a6b103a2351aac854a Mon Sep 17 00:00:00 2001 From: Vasuki Date: Fri, 10 Jun 2022 00:12:46 +0530 Subject: [PATCH 088/137] "Parodus crash due to invalid serial number" --- src/config.c | 36 ++++++++++++++++++++++++++++++++++-- tests/test_config.c | 10 ++++++++++ 2 files changed, 44 insertions(+), 2 deletions(-) diff --git a/src/config.c b/src/config.c index 2477c20..cb511e8 100644 --- a/src/config.c +++ b/src/config.c @@ -208,6 +208,38 @@ int parse_mac_address (char *target, const char *arg) return 0; } +int parse_serial_num(char *target, const char *arg) +{ + char ch; + if(arg != NULL) + { + if(strlen(arg) == 0) + { + ParodusError("Empty serial number, setting to default unknown\n"); + strcpy(target,"unknown"); + } + for(int i=0; (ch = arg[i]) != '\0'; i++) + { + // check if character is ascii, a-z --> 97 to 122, A-Z --> 65 to 90, digits(0 to 9) --> 48 to 57 + if((ch >= 97 && ch <= 122) || (ch >= 65 && ch <= 90) || (ch >=48 && ch <= 57)) + { + target[i] = ch; + } + else + { + ParodusError("Invalid serial number, setting to default unknown\n"); + strcpy(target,"unknown"); + break; + } + } + } + else + { + ParodusError("serial number argument is NULL\n"); + } + return 0; +} + int server_is_http (const char *full_url, const char **server_ptr) { @@ -462,8 +494,8 @@ int parseCommandLine(int argc,char **argv,ParodusCfg * cfg) break; case 's': - parStrncpy(cfg->hw_serial_number,optarg,sizeof(cfg->hw_serial_number)); - ParodusInfo("hw_serial_number is %s\n",cfg->hw_serial_number); + if(parse_serial_num(cfg->hw_serial_number, optarg) == 0) + ParodusInfo ("hw_serial-number is %s\n",cfg->hw_serial_number); break; case 'f': diff --git a/tests/test_config.c b/tests/test_config.c index a6f6475..3bf4371 100644 --- a/tests/test_config.c +++ b/tests/test_config.c @@ -29,6 +29,7 @@ #include "../src/ParodusInternal.h" extern int parse_mac_address (char *target, const char *arg); +extern int parse_serial_num(char *target, const char *arg); extern int server_is_http (const char *full_url, const char **server_ptr); extern int parse_webpa_url__(const char *full_url, @@ -467,6 +468,14 @@ void test_parse_mac_address () assert_int_equal (parse_mac_address (result, ""), -1); } +void test_parse_serial_num() +{ + char result[14]; + assert_int_equal (parse_serial_num (result, "1234ABC00ab"), 0); + assert_int_equal (parse_serial_num (result, "$@@"), 0); + assert_int_equal (parse_serial_num (result, ""), 0); +} + void test_server_is_http () { const char *server_ptr; @@ -587,6 +596,7 @@ int main(void) cmocka_unit_test(err_loadParodusCfg), cmocka_unit_test(test_parse_num_arg), cmocka_unit_test(test_parse_mac_address), + cmocka_unit_test(test_parse_serial_num), cmocka_unit_test(test_get_algo_mask), cmocka_unit_test(test_server_is_http), cmocka_unit_test(test_parse_webpa_url__), From b6490ba5b31f58439dace3fee1c08e3c10fa8608 Mon Sep 17 00:00:00 2001 From: Sadhyama Vengilat Date: Fri, 1 Jul 2022 20:16:10 +0530 Subject: [PATCH 089/137] Check xmidt state as DELETE along with transid when deleting a node --- src/xmidtsend_rbus.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/xmidtsend_rbus.c b/src/xmidtsend_rbus.c index 7e21e47..c28f6e8 100644 --- a/src/xmidtsend_rbus.c +++ b/src/xmidtsend_rbus.c @@ -1297,9 +1297,10 @@ int deleteFromXmidtQ(wrp_msg_t *msg, XmidtMsg **next_node) while( NULL != curr_node ) { wrp_msg_t * curr_node_msg = curr_node->msg; - if(curr_node_msg !=NULL && strcmp(curr_node_msg->u.event.transaction_uuid, transid) == 0) + ParodusInfo("curr_node->state %d\n" , curr_node->state); + if(curr_node->state == DELETE && curr_node_msg !=NULL && strcmp(curr_node_msg->u.event.transaction_uuid, transid) == 0) { - ParodusPrint("Found the node to delete\n"); + ParodusInfo("Found the node to delete\n"); if( NULL == prev_node ) { ParodusPrint("need to delete first doc\n"); @@ -1307,7 +1308,7 @@ int deleteFromXmidtQ(wrp_msg_t *msg, XmidtMsg **next_node) } else { - ParodusPrint("Traversing to find node\n"); + ParodusInfo("Traversing to find node\n"); prev_node->next = curr_node->next; *next_node = curr_node->next; From 623192e3014b1e268eed2b1c944dc2ad7d3bc559 Mon Sep 17 00:00:00 2001 From: Sadhyama Vengilat Date: Mon, 4 Jul 2022 14:05:52 +0530 Subject: [PATCH 090/137] Fix ping received time logging --- src/xmidtsend_rbus.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/xmidtsend_rbus.c b/src/xmidtsend_rbus.c index c28f6e8..7da12b6 100644 --- a/src/xmidtsend_rbus.c +++ b/src/xmidtsend_rbus.c @@ -159,7 +159,7 @@ void addToXmidtUpstreamQ(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle) message->state = PENDING; getCurrentTime(×); message->enqueueTime = (long long)times.tv_sec; - ParodusInfo("times.tv_sec %lld message->enqueueTime is %lld\n", (long long)times.tv_sec, message->enqueueTime); + ParodusInfo("message->enqueueTime is %lld\n", message->enqueueTime); message->sentTime = 0; //Increment queue size to handle max queue limit increment_XmidtQsize(); @@ -276,7 +276,6 @@ void* processXmidtUpstreamMsg() { ParodusPrint("Check cloud ack for matching transaction id\n"); ret = checkCloudACK(Data, Data->asyncHandle); - ParodusPrint("ret is %d\n", ret); if (ret) { ParodusInfo("cloud ack processed successfully\n"); @@ -289,7 +288,7 @@ void* processXmidtUpstreamMsg() ParodusPrint("cloud status is online, check ping time\n"); if(get_pingTimeStamp() > (Data->sentTime + CLOUD_ACK_TIMEOUT_SEC)) { - ParodusInfo("Ping received at timestamp %lu, proceed to retry\n", get_pingTimeStamp()); + ParodusInfo("Ping received at timestamp %lld, proceed to retry\n", get_pingTimeStamp()); rv = processData(Data, Data->msg, Data->asyncHandle); if(!rv) { @@ -311,7 +310,6 @@ void* processXmidtUpstreamMsg() { ParodusPrint("deleteFromXmidtQ success\n"); xmidtQ = next_node; - //continue; } else { From 5359fc79cfb27d39a030842d07e2cc512a09b4e4 Mon Sep 17 00:00:00 2001 From: Sadhyama Vengilat Date: Mon, 4 Jul 2022 17:33:55 +0530 Subject: [PATCH 091/137] Remove transaction id checks from delete func --- src/xmidtsend_rbus.c | 28 ++++++---------------------- src/xmidtsend_rbus.h | 2 +- 2 files changed, 7 insertions(+), 23 deletions(-) diff --git a/src/xmidtsend_rbus.c b/src/xmidtsend_rbus.c index 7da12b6..e55adf7 100644 --- a/src/xmidtsend_rbus.c +++ b/src/xmidtsend_rbus.c @@ -305,7 +305,7 @@ void* processXmidtUpstreamMsg() break; case DELETE: ParodusInfo("state : DELETE\n"); - status = deleteFromXmidtQ(Data->msg, &next_node); + status = deleteFromXmidtQ(&next_node); if(status) { ParodusPrint("deleteFromXmidtQ success\n"); @@ -1204,7 +1204,7 @@ void print_xmidMsg_list() while (NULL != temp) { wrp_msg_t *xmdMsg = temp->msg; - ParodusInfo("node is pointing to xmdMsg transid %s temp->state %d temp->enqueueTime %lld temp->sentTime %lld\n", xmdMsg->u.event.transaction_uuid, temp->state, (long long)temp->enqueueTime, (long long)temp->sentTime); + ParodusInfo("node is pointing to xmdMsg transid %s temp->state %d temp->enqueueTime %lld temp->sentTime %lld\n", xmdMsg->u.event.transaction_uuid, temp->state, temp->enqueueTime, temp->sentTime); temp= temp->next; } ParodusPrint("print_xmidMsg_list done\n"); @@ -1269,39 +1269,23 @@ int deleteCloudACKNode(char* trans_id) } //Delete msg from XmidtQ -int deleteFromXmidtQ(wrp_msg_t *msg, XmidtMsg **next_node) +int deleteFromXmidtQ(XmidtMsg **next_node) { XmidtMsg *prev_node = NULL, *curr_node = NULL; - char *transid = NULL; - - if( NULL == msg ) - { - ParodusError("Invalid xmidt msg\n"); - return 0; - } - - transid = msg->u.event.transaction_uuid; - if( NULL == transid ) - { - ParodusError("Invalid xmidt transid\n"); - return 0; - } - ParodusInfo("msg to be deleted with transid %s\n", transid); prev_node = NULL; pthread_mutex_lock (&xmidt_mut); curr_node = XmidtMsgQ ; - // Traverse to get the msg to be deleted + // Traverse to get the node with DELETE state which needs to be deleted while( NULL != curr_node ) { - wrp_msg_t * curr_node_msg = curr_node->msg; ParodusInfo("curr_node->state %d\n" , curr_node->state); - if(curr_node->state == DELETE && curr_node_msg !=NULL && strcmp(curr_node_msg->u.event.transaction_uuid, transid) == 0) + if(curr_node->state == DELETE) { ParodusInfo("Found the node to delete\n"); if( NULL == prev_node ) { - ParodusPrint("need to delete first doc\n"); + ParodusInfo("need to delete first doc\n"); XmidtMsgQ = curr_node->next; } else diff --git a/src/xmidtsend_rbus.h b/src/xmidtsend_rbus.h index 349d51b..36d6b66 100644 --- a/src/xmidtsend_rbus.h +++ b/src/xmidtsend_rbus.h @@ -107,7 +107,7 @@ int checkCloudACK(XmidtMsg *xmdnode, rbusMethodAsyncHandle_t asyncHandle); int updateXmidtState(XmidtMsg * temp, int state); void print_xmidMsg_list(); int deleteCloudACKNode(char* trans_id); -int deleteFromXmidtQ(wrp_msg_t *msg, XmidtMsg **next_node); +int deleteFromXmidtQ(XmidtMsg **next_node); int checkCloudConn(); void checkMaxQandOptimize(); void checkMsgExpiry(); From 75c833e3a8f8a7c2b7e5bc624555176391d88fd4 Mon Sep 17 00:00:00 2001 From: Sadhyama Vengilat Date: Mon, 4 Jul 2022 18:09:33 +0530 Subject: [PATCH 092/137] To handle max queue size 0 and qos disabled --- src/downstream.c | 4 ++-- src/xmidtsend_rbus.c | 26 ++++++++++++++++++++++---- src/xmidtsend_rbus.h | 3 ++- 3 files changed, 26 insertions(+), 7 deletions(-) diff --git a/src/downstream.c b/src/downstream.c index f2985a0..9fc1260 100644 --- a/src/downstream.c +++ b/src/downstream.c @@ -268,7 +268,7 @@ void listenerOnMessage(void * msg, size_t msgSize) ParodusInfo("cloud ack received with low qos %d, ignoring it\n", message->u.event.qos); }*/ //Remove this. TEST purpose. - if(highQosValueCheck(eventMsg->u.event.qos)) + if(get_parodus_cfg()->max_queue_size > 0 && highQosValueCheck(eventMsg->u.event.qos)) { if(eventMsg->u.event.transaction_uuid !=NULL) { @@ -283,7 +283,7 @@ void listenerOnMessage(void * msg, size_t msgSize) } else { - ParodusInfo("cloud ack received with low qos %d, ignoring it\n", eventMsg->u.event.qos); + ParodusInfo("Cloud ack is ignored as qos is %d max queue size is %d\n", eventMsg->u.event.qos, get_parodus_cfg()->max_queue_size ); } ParodusInfo("test is %d\n", test); } diff --git a/src/xmidtsend_rbus.c b/src/xmidtsend_rbus.c index e55adf7..16c2fe2 100644 --- a/src/xmidtsend_rbus.c +++ b/src/xmidtsend_rbus.c @@ -271,7 +271,7 @@ void* processXmidtUpstreamMsg() getCurrentTime(&tms); currTime = (long long)tms.tv_sec; long long timeout_secs = (Data->sentTime) + CLOUD_ACK_TIMEOUT_SEC; - ParodusInfo("currTime %lld sentTime %lld CLOUD_ACK_TIMEOUT_SEC %d, timeout_secs %lld\n", currTime, Data->sentTime, CLOUD_ACK_TIMEOUT_SEC, timeout_secs); + ParodusInfo("currTime %lld sentTime %lld CLOUD_ACK_TIMEOUT_SEC %d, timeout_secs %lld trans_id %s\n", currTime, Data->sentTime, CLOUD_ACK_TIMEOUT_SEC, timeout_secs, Data->msg->u.event.transaction_uuid); if (currTime > timeout_secs) { ParodusPrint("Check cloud ack for matching transaction id\n"); @@ -616,9 +616,23 @@ void sendXmidtEventToServer(XmidtMsg *msgnode, wrp_msg_t * msg, rbusMethodAsyncH { if(highQosValueCheck(qos)) { - ParodusInfo("High qos event send success, update state to SENT\n"); - //Update msg status from PENDING to SENT - updateXmidtState(msgnode, SENT); + ParodusInfo("High qos event send success\n"); + //when max_queue_size is 0, cloud acks will not be processed|qos is disabled. + if(get_parodus_cfg()->max_queue_size == 0 ) + { + ParodusInfo("max queue size is 0, qos semantics are disabled. send callback\n"); + mapXmidtStatusToStatusMessage(QOS_SEMANTICS_DISABLED, &errorMsg); + createOutParamsandSendAck(msg, asyncHandle, errorMsg, QOS_SEMANTICS_DISABLED, RBUS_ERROR_SUCCESS); + ParodusInfo("update state to DELETE\n"); + updateXmidtState(msgnode, DELETE); + print_xmidMsg_list(); + } + else + { + ParodusInfo("update state to SENT\n"); + //Update msg status from PENDING to SENT + updateXmidtState(msgnode, SENT); + } print_xmidMsg_list(); } else @@ -1470,6 +1484,10 @@ void mapXmidtStatusToStatusMessage(int status, char **message) { result = strdup("Memory allocation failed"); } + else if (status == QOS_SEMANTICS_DISABLED) + { + result = strdup("send to server, qos semantics are disabled"); + } else { result = strdup("Unknown Error"); diff --git a/src/xmidtsend_rbus.h b/src/xmidtsend_rbus.h index 36d6b66..5b6eba5 100644 --- a/src/xmidtsend_rbus.h +++ b/src/xmidtsend_rbus.h @@ -74,7 +74,8 @@ typedef enum CLIENT_DISCONNECT = 101, QUEUE_SIZE_EXCEEDED = 102, WRP_ENCODE_FAILURE = 103, - MSG_PROCESSING_FAILED = 104 + MSG_PROCESSING_FAILED = 104, + QOS_SEMANTICS_DISABLED = 105 } XMIDT_STATUS; typedef enum From 4add1c07ca63569122106d22aa4f134a2d0c24f6 Mon Sep 17 00:00:00 2001 From: Sadhyama Vengilat Date: Tue, 5 Jul 2022 16:33:34 +0530 Subject: [PATCH 093/137] Test simulation to generate cloud acks for each transid --- src/downstream.c | 7 +++++-- src/xmidtsend_rbus.c | 18 ++++++++++++++++-- src/xmidtsend_rbus.h | 4 ++++ 3 files changed, 25 insertions(+), 4 deletions(-) diff --git a/src/downstream.c b/src/downstream.c index 9fc1260..eed9adf 100644 --- a/src/downstream.c +++ b/src/downstream.c @@ -240,7 +240,8 @@ void listenerOnMessage(void * msg, size_t msgSize) free(resp_msg); } //To handle cloud ack events received from server for the xmidt sent messages. - if(test == 1 || test == 3) + //if(test == 1 || test == 3) + if(test >=1) { wrp_msg_t *eventMsg= NULL; ParodusInfo("Create downstream event Msg with cloud ack\n"); @@ -441,7 +442,9 @@ static void createNewMsgForCloudACK(wrp_msg_t *message, wrp_msg_t **eventMessage if(message->u.event.transaction_uuid != NULL) { - msg->u.event.transaction_uuid = strdup("8d72d4c2-1f59-4420-a736-3946083d529a"); + //msg->u.event.transaction_uuid = strdup("8d72d4c2-1f59-4420-a736-3946083d529a"); + msg->u.event.transaction_uuid = get_global_TransID(); + ParodusInfo("cloud ack msg->u.event.transaction_uuid = %s\n", msg->u.event.transaction_uuid); } if(message->u.event.content_type != NULL) diff --git a/src/xmidtsend_rbus.c b/src/xmidtsend_rbus.c index 16c2fe2..4d7f8a0 100644 --- a/src/xmidtsend_rbus.c +++ b/src/xmidtsend_rbus.c @@ -999,6 +999,19 @@ void parseRbusInparamsToWrp(rbusObject_t inParams, char *trans_id, wrp_msg_t **e ParodusPrint("parseRbusInparamsToWrp End\n"); } +//testing purpose. remove this. +static char *g_transactionId = "1234"; +char *get_global_TransID() +{ + return g_transactionId; +} + +void set_global_TransID(char *transid) +{ + g_transactionId = strdup(transid); +} + +// static rbusError_t sendDataHandler(rbusHandle_t handle, char const* methodName, rbusObject_t inParams, rbusObject_t outParams, rbusMethodAsyncHandle_t asyncHandle) { (void) handle; @@ -1015,8 +1028,9 @@ static rbusError_t sendDataHandler(rbusHandle_t handle, char const* methodName, if(inStatus) { //generate transaction id to create outParams and send ack - //transaction_uuid = generate_transaction_uuid(); - transaction_uuid = strdup("8d72d4c2-1f59-4420-a736-3946083d529a"); //Testing + transaction_uuid = generate_transaction_uuid(); + //transaction_uuid = strdup("8d72d4c2-1f59-4420-a736-3946083d529a"); //Testing + set_global_TransID(transaction_uuid);//testing ParodusInfo("xmidt transaction_uuid generated is %s\n", transaction_uuid); parseRbusInparamsToWrp(inParams, transaction_uuid, &wrpMsg); diff --git a/src/xmidtsend_rbus.h b/src/xmidtsend_rbus.h index 5b6eba5..b8d3b17 100644 --- a/src/xmidtsend_rbus.h +++ b/src/xmidtsend_rbus.h @@ -113,6 +113,10 @@ int checkCloudConn(); void checkMaxQandOptimize(); void checkMsgExpiry(); void mapXmidtStatusToStatusMessage(int status, char **message); +//Testing +void set_global_TransID(char *transid); +char *get_global_TransID(); +// #ifdef __cplusplus } #endif From c9b34d3c3f164b74924a3186a38147d4c755cb31 Mon Sep 17 00:00:00 2001 From: Sadhyama Vengilat Date: Wed, 6 Jul 2022 13:07:04 +0530 Subject: [PATCH 094/137] Reduce debug logs --- src/downstream.c | 10 +++++----- src/xmidtsend_rbus.c | 44 ++++++++++++++++++++++---------------------- 2 files changed, 27 insertions(+), 27 deletions(-) diff --git a/src/downstream.c b/src/downstream.c index eed9adf..d2a965c 100644 --- a/src/downstream.c +++ b/src/downstream.c @@ -244,7 +244,7 @@ void listenerOnMessage(void * msg, size_t msgSize) if(test >=1) { wrp_msg_t *eventMsg= NULL; - ParodusInfo("Create downstream event Msg with cloud ack\n"); + ParodusPrint("Create downstream event Msg with cloud ack\n"); createNewMsgForCloudACK(message, &eventMsg); msgType = WRP_MSG_TYPE__EVENT; ParodusPrint("check cloud ack\n"); @@ -286,7 +286,7 @@ void listenerOnMessage(void * msg, size_t msgSize) { ParodusInfo("Cloud ack is ignored as qos is %d max queue size is %d\n", eventMsg->u.event.qos, get_parodus_cfg()->max_queue_size ); } - ParodusInfo("test is %d\n", test); + ParodusPrint("test is %d\n", test); } } break; @@ -444,7 +444,7 @@ static void createNewMsgForCloudACK(wrp_msg_t *message, wrp_msg_t **eventMessage { //msg->u.event.transaction_uuid = strdup("8d72d4c2-1f59-4420-a736-3946083d529a"); msg->u.event.transaction_uuid = get_global_TransID(); - ParodusInfo("cloud ack msg->u.event.transaction_uuid = %s\n", msg->u.event.transaction_uuid); + ParodusPrint("cloud ack msg->u.event.transaction_uuid = %s\n", msg->u.event.transaction_uuid); } if(message->u.event.content_type != NULL) @@ -453,8 +453,8 @@ static void createNewMsgForCloudACK(wrp_msg_t *message, wrp_msg_t **eventMessage } msg->u.event.rdr = 0; msg->u.event.qos = 50; - ParodusInfo("msg->u.event.rdr = %d msg->u.event.qos = %d\n",msg->u.event.rdr, msg->u.event.qos); + ParodusPrint("msg->u.event.rdr = %d msg->u.event.qos = %d\n",msg->u.event.rdr, msg->u.event.qos); *eventMessage = msg; } - ParodusInfo("createNewMsgForCloudACK done\n"); + ParodusPrint("createNewMsgForCloudACK done\n"); } diff --git a/src/xmidtsend_rbus.c b/src/xmidtsend_rbus.c index 4d7f8a0..b9806bb 100644 --- a/src/xmidtsend_rbus.c +++ b/src/xmidtsend_rbus.c @@ -253,7 +253,7 @@ void* processXmidtUpstreamMsg() //send msg to server only when cloud connection is online. if(checkCloudConn()) { - ParodusInfo("cloud status is online, processData\n"); + ParodusPrint("cloud status is online, processData\n"); rv = processData(Data, Data->msg, Data->asyncHandle); if(!rv) { @@ -271,7 +271,7 @@ void* processXmidtUpstreamMsg() getCurrentTime(&tms); currTime = (long long)tms.tv_sec; long long timeout_secs = (Data->sentTime) + CLOUD_ACK_TIMEOUT_SEC; - ParodusInfo("currTime %lld sentTime %lld CLOUD_ACK_TIMEOUT_SEC %d, timeout_secs %lld trans_id %s\n", currTime, Data->sentTime, CLOUD_ACK_TIMEOUT_SEC, timeout_secs, Data->msg->u.event.transaction_uuid); + ParodusPrint("currTime %lld sentTime %lld CLOUD_ACK_TIMEOUT_SEC %d, timeout_secs %lld trans_id %s\n", currTime, Data->sentTime, CLOUD_ACK_TIMEOUT_SEC, timeout_secs, Data->msg->u.event.transaction_uuid); if (currTime > timeout_secs) { ParodusPrint("Check cloud ack for matching transaction id\n"); @@ -339,10 +339,10 @@ void* processXmidtUpstreamMsg() pthread_mutex_unlock (&xmidt_mut); break; } - ParodusInfo("Before cond wait in xmidt consumer thread\n"); + ParodusPrint("Before cond wait in xmidt consumer thread\n"); pthread_cond_wait(&xmidt_con, &xmidt_mut); pthread_mutex_unlock (&xmidt_mut); - ParodusInfo("mutex unlock in xmidt thread after cond wait\n"); + ParodusPrint("mutex unlock in xmidt thread after cond wait\n"); xmidtQ = get_global_xmidthead(); } } @@ -498,7 +498,7 @@ void sendXmidtEventToServer(XmidtMsg *msgnode, wrp_msg_t * msg, rbusMethodAsyncH snprintf(sourceStr, sizeof(sourceStr), "%s/%s", device_id, msg->u.event.source); ParodusPrint("sourceStr formed is %s\n" , sourceStr); notif_wrp_msg->u.event.source = strdup(sourceStr); - ParodusInfo("source:%s\n", notif_wrp_msg->u.event.source); + ParodusPrint("source:%s\n", notif_wrp_msg->u.event.source); } else { @@ -514,7 +514,7 @@ void sendXmidtEventToServer(XmidtMsg *msgnode, wrp_msg_t * msg, rbusMethodAsyncH if(msg->u.event.dest != NULL) { notif_wrp_msg->u.event.dest = msg->u.event.dest; - ParodusInfo("destination: %s\n", notif_wrp_msg->u.event.dest); + ParodusPrint("destination: %s\n", notif_wrp_msg->u.event.dest); } if(msg->u.event.transaction_uuid != NULL) @@ -541,7 +541,7 @@ void sendXmidtEventToServer(XmidtMsg *msgnode, wrp_msg_t * msg, rbusMethodAsyncH { notif_wrp_msg->u.event.qos = msg->u.event.qos; qos = notif_wrp_msg->u.event.qos; - ParodusInfo("Notification qos: %d\n",notif_wrp_msg->u.event.qos); + ParodusPrint("Notification qos: %d\n",notif_wrp_msg->u.event.qos); } msg_len = wrp_struct_to (notif_wrp_msg, WRP_BYTES, &msg_bytes); @@ -566,19 +566,19 @@ void sendXmidtEventToServer(XmidtMsg *msgnode, wrp_msg_t * msg, rbusMethodAsyncH }*/ if(notif_wrp_msg !=NULL) { - ParodusInfo("notif_wrp_msg->u.event.source free\n"); + ParodusPrint("notif_wrp_msg->u.event.source free\n"); if(notif_wrp_msg->u.event.source !=NULL) { free(notif_wrp_msg->u.event.source); notif_wrp_msg->u.event.source = NULL; } - ParodusInfo("notif_wrp_msg free\n"); + ParodusPrint("notif_wrp_msg free\n"); free(notif_wrp_msg); notif_wrp_msg = NULL; } if(msg_bytes != NULL) { - ParodusInfo("msg_bytes free\n"); + ParodusPrint("msg_bytes free\n"); free(msg_bytes); msg_bytes = NULL; } @@ -623,13 +623,13 @@ void sendXmidtEventToServer(XmidtMsg *msgnode, wrp_msg_t * msg, rbusMethodAsyncH ParodusInfo("max queue size is 0, qos semantics are disabled. send callback\n"); mapXmidtStatusToStatusMessage(QOS_SEMANTICS_DISABLED, &errorMsg); createOutParamsandSendAck(msg, asyncHandle, errorMsg, QOS_SEMANTICS_DISABLED, RBUS_ERROR_SUCCESS); - ParodusInfo("update state to DELETE\n"); + ParodusPrint("update state to DELETE\n"); updateXmidtState(msgnode, DELETE); print_xmidMsg_list(); } else { - ParodusInfo("update state to SENT\n"); + ParodusPrint("update state to SENT\n"); //Update msg status from PENDING to SENT updateXmidtState(msgnode, SENT); } @@ -676,17 +676,17 @@ void sendXmidtEventToServer(XmidtMsg *msgnode, wrp_msg_t * msg, rbusMethodAsyncH }*/ if(notif_wrp_msg !=NULL) { - ParodusInfo("notif_wrp_msg->u.event.source free\n"); + ParodusPrint("notif_wrp_msg->u.event.source free\n"); if(notif_wrp_msg->u.event.source !=NULL) { free(notif_wrp_msg->u.event.source); notif_wrp_msg->u.event.source = NULL; } - ParodusInfo("notif_wrp_msg free\n"); + ParodusPrint("notif_wrp_msg free\n"); free(notif_wrp_msg); notif_wrp_msg = NULL; } - ParodusInfo("sendXmidtEventToServer done\n"); + ParodusPrint("sendXmidtEventToServer done\n"); } void createOutParamsandSendAck(wrp_msg_t *msg, rbusMethodAsyncHandle_t asyncHandle, char *errorMsg, int statuscode, rbusError_t error) @@ -1114,7 +1114,7 @@ void addToCloudAckQ(char *trans_id, int qos, int rdr) ackmsg->transaction_id = strdup(trans_id); ackmsg->qos = qos; ackmsg->rdr =rdr; - ParodusInfo("ackmsg->transaction_id %s ackmsg->qos %d ackmsg->rdr %d\n", ackmsg->transaction_id,ackmsg->qos,ackmsg->rdr); + ParodusPrint("ackmsg->transaction_id %s ackmsg->qos %d ackmsg->rdr %d\n", ackmsg->transaction_id,ackmsg->qos,ackmsg->rdr); ackmsg->next=NULL; pthread_mutex_lock (&cloudack_mut); if(g_cloudackHead == NULL) @@ -1179,7 +1179,7 @@ int checkCloudACK(XmidtMsg *xmdnode, rbusMethodAsyncHandle_t asyncHandle) mapXmidtStatusToStatusMessage(DELIVERED_SUCCESS, &errorMsg); ParodusPrint("statusMsg is %s\n",errorMsg); createOutParamsandSendAck(xmdMsg, asyncHandle, errorMsg, DELIVERED_SUCCESS, cloudnode->rdr); - ParodusInfo("set xmidt msg to DELETE state as cloud ack is processed\n"); + ParodusPrint("set xmidt msg to DELETE state as cloud ack is processed\n"); updateXmidtState(xmdnode, DELETE); print_xmidMsg_list(); ParodusInfo("delete cloudACK cloudnode\n"); @@ -1217,7 +1217,7 @@ int updateXmidtState(XmidtMsg * temp, int state) { getCurrentTime(&ts); temp->sentTime = (long long)ts.tv_sec; - ParodusInfo("updated temp->sentTime %lld\n", temp->sentTime); + ParodusPrint("updated temp->sentTime %lld\n", temp->sentTime); } ParodusInfo("msgnode is updated with state %d sentTime %lld\n", temp->state, temp->sentTime); pthread_mutex_unlock (&xmidt_mut); @@ -1232,7 +1232,7 @@ void print_xmidMsg_list() while (NULL != temp) { wrp_msg_t *xmdMsg = temp->msg; - ParodusInfo("node is pointing to xmdMsg transid %s temp->state %d temp->enqueueTime %lld temp->sentTime %lld\n", xmdMsg->u.event.transaction_uuid, temp->state, temp->enqueueTime, temp->sentTime); + ParodusPrint("node is pointing to xmdMsg transid %s temp->state %d temp->enqueueTime %lld temp->sentTime %lld\n", xmdMsg->u.event.transaction_uuid, temp->state, temp->enqueueTime, temp->sentTime); temp= temp->next; } ParodusPrint("print_xmidMsg_list done\n"); @@ -1272,7 +1272,7 @@ int deleteCloudACKNode(char* trans_id) } - ParodusInfo("Deleting the node entries\n"); + ParodusPrint("Deleting the node entries\n"); if(curr_node->transaction_id !=NULL) { free( curr_node->transaction_id ); @@ -1310,7 +1310,7 @@ int deleteFromXmidtQ(XmidtMsg **next_node) ParodusInfo("curr_node->state %d\n" , curr_node->state); if(curr_node->state == DELETE) { - ParodusInfo("Found the node to delete\n"); + ParodusPrint("Found the node to delete\n"); if( NULL == prev_node ) { ParodusInfo("need to delete first doc\n"); @@ -1318,7 +1318,7 @@ int deleteFromXmidtQ(XmidtMsg **next_node) } else { - ParodusInfo("Traversing to find node\n"); + ParodusPrint("Traversing to find node\n"); prev_node->next = curr_node->next; *next_node = curr_node->next; From 33af3f3eecd4c02947a1ac1e0bc4795ec2e555df Mon Sep 17 00:00:00 2001 From: Sadhyama Vengilat Date: Wed, 6 Jul 2022 18:19:43 +0530 Subject: [PATCH 095/137] Modify xmidtQsize logs and test simulation transid --- src/downstream.c | 10 +++++++--- src/xmidtsend_rbus.c | 40 ++++++++++++++++++++++++---------------- 2 files changed, 31 insertions(+), 19 deletions(-) diff --git a/src/downstream.c b/src/downstream.c index d2a965c..348ffaf 100644 --- a/src/downstream.c +++ b/src/downstream.c @@ -243,6 +243,7 @@ void listenerOnMessage(void * msg, size_t msgSize) //if(test == 1 || test == 3) if(test >=1) { + ParodusInfo("test is %d\n", test); wrp_msg_t *eventMsg= NULL; ParodusPrint("Create downstream event Msg with cloud ack\n"); createNewMsgForCloudACK(message, &eventMsg); @@ -286,7 +287,6 @@ void listenerOnMessage(void * msg, size_t msgSize) { ParodusInfo("Cloud ack is ignored as qos is %d max queue size is %d\n", eventMsg->u.event.qos, get_parodus_cfg()->max_queue_size ); } - ParodusPrint("test is %d\n", test); } } break; @@ -443,8 +443,12 @@ static void createNewMsgForCloudACK(wrp_msg_t *message, wrp_msg_t **eventMessage if(message->u.event.transaction_uuid != NULL) { //msg->u.event.transaction_uuid = strdup("8d72d4c2-1f59-4420-a736-3946083d529a"); - msg->u.event.transaction_uuid = get_global_TransID(); - ParodusPrint("cloud ack msg->u.event.transaction_uuid = %s\n", msg->u.event.transaction_uuid); + //msg->u.event.transaction_uuid = get_global_TransID(); + char transaction_uuid[64]; + sprintf(transaction_uuid, "3946083d529a_test%d", test); + ParodusPrint("test transaction_uuid = %s\n", transaction_uuid); + msg->u.event.transaction_uuid = strdup(transaction_uuid); + ParodusInfo("cloud ack msg->u.event.transaction_uuid = %s\n", msg->u.event.transaction_uuid); } if(message->u.event.content_type != NULL) diff --git a/src/xmidtsend_rbus.c b/src/xmidtsend_rbus.c index b9806bb..5f6b808 100644 --- a/src/xmidtsend_rbus.c +++ b/src/xmidtsend_rbus.c @@ -108,6 +108,7 @@ void increment_XmidtQsize() { pthread_mutex_lock (&xmidt_mut); XmidtQsize++; + ParodusInfo("XmidtQsize incremented to %d\n", XmidtQsize); pthread_mutex_unlock (&xmidt_mut); } @@ -139,9 +140,10 @@ void addToXmidtUpstreamQ(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle) struct timespec times; char * errorMsg = NULL; - ParodusInfo("XmidtQsize is %d\n" , get_XmidtQsize()); - if( get_XmidtQsize() > 0 && get_XmidtQsize() == get_parodus_cfg()->max_queue_size) + ParodusPrint("XmidtQsize is %d\n" , get_XmidtQsize()); + if( get_XmidtQsize() > 0 && get_XmidtQsize() >= get_parodus_cfg()->max_queue_size) { + ParodusInfo("queue size %d exceeded at producer, ignoring the event\n", get_XmidtQsize()); mapXmidtStatusToStatusMessage(QUEUE_SIZE_EXCEEDED, &errorMsg); ParodusPrint("statusMsg is %s\n",errorMsg); createOutParamsandSendAck(msg, asyncHandle, errorMsg , QUEUE_SIZE_EXCEEDED, RBUS_ERROR_INVALID_RESPONSE_FROM_DESTINATION); @@ -261,13 +263,13 @@ void* processXmidtUpstreamMsg() } else { - ParodusInfo("processData success\n"); + ParodusPrint("processData success\n"); } } break; case SENT: - ParodusInfo("state : SENT\n"); + ParodusPrint("state : SENT\n"); getCurrentTime(&tms); currTime = (long long)tms.tv_sec; long long timeout_secs = (Data->sentTime) + CLOUD_ACK_TIMEOUT_SEC; @@ -278,7 +280,7 @@ void* processXmidtUpstreamMsg() ret = checkCloudACK(Data, Data->asyncHandle); if (ret) { - ParodusInfo("cloud ack processed successfully\n"); + ParodusPrint("cloud ack processed successfully\n"); } else //ack timeout case { @@ -296,7 +298,7 @@ void* processXmidtUpstreamMsg() } else { - ParodusInfo("processData retry success\n"); + ParodusPrint("processData retry success\n"); } } } @@ -616,7 +618,7 @@ void sendXmidtEventToServer(XmidtMsg *msgnode, wrp_msg_t * msg, rbusMethodAsyncH { if(highQosValueCheck(qos)) { - ParodusInfo("High qos event send success\n"); + ParodusPrint("High qos event send success\n"); //when max_queue_size is 0, cloud acks will not be processed|qos is disabled. if(get_parodus_cfg()->max_queue_size == 0 ) { @@ -1011,6 +1013,7 @@ void set_global_TransID(char *transid) g_transactionId = strdup(transid); } +static int test = 0; // static rbusError_t sendDataHandler(rbusHandle_t handle, char const* methodName, rbusObject_t inParams, rbusObject_t outParams, rbusMethodAsyncHandle_t asyncHandle) { @@ -1028,8 +1031,13 @@ static rbusError_t sendDataHandler(rbusHandle_t handle, char const* methodName, if(inStatus) { //generate transaction id to create outParams and send ack - transaction_uuid = generate_transaction_uuid(); + //transaction_uuid = generate_transaction_uuid(); //transaction_uuid = strdup("8d72d4c2-1f59-4420-a736-3946083d529a"); //Testing + char trans_uuid[64]; + sprintf(trans_uuid, "3946083d529a_test%d", test++); + ParodusPrint("test trans_uuid = %s\n", trans_uuid); + transaction_uuid = strdup(trans_uuid); + set_global_TransID(transaction_uuid);//testing ParodusInfo("xmidt transaction_uuid generated is %s\n", transaction_uuid); parseRbusInparamsToWrp(inParams, transaction_uuid, &wrpMsg); @@ -1170,7 +1178,7 @@ int checkCloudACK(XmidtMsg *xmdnode, rbusMethodAsyncHandle_t asyncHandle) while (NULL != cloudnode) { - ParodusInfo("cloudnode->transaction_id %s cloudnode->qos %d cloudnode->rdr %d\n", cloudnode->transaction_id,cloudnode->qos,cloudnode->rdr); + ParodusPrint("cloudnode->transaction_id %s cloudnode->qos %d cloudnode->rdr %d\n", cloudnode->transaction_id,cloudnode->qos,cloudnode->rdr); if(xmdMsgTransID != NULL && cloudnode->transaction_id != NULL) { if( strcmp(xmdMsgTransID, cloudnode->transaction_id) == 0) @@ -1182,9 +1190,9 @@ int checkCloudACK(XmidtMsg *xmdnode, rbusMethodAsyncHandle_t asyncHandle) ParodusPrint("set xmidt msg to DELETE state as cloud ack is processed\n"); updateXmidtState(xmdnode, DELETE); print_xmidMsg_list(); - ParodusInfo("delete cloudACK cloudnode\n"); + ParodusPrint("delete cloudACK cloudnode\n"); deleteCloudACKNode(cloudnode->transaction_id); - ParodusInfo("checkCloudACK returns success\n"); + ParodusPrint("checkCloudACK returns success\n"); return 1; } else @@ -1307,7 +1315,7 @@ int deleteFromXmidtQ(XmidtMsg **next_node) // Traverse to get the node with DELETE state which needs to be deleted while( NULL != curr_node ) { - ParodusInfo("curr_node->state %d\n" , curr_node->state); + ParodusPrint("curr_node->state %d\n" , curr_node->state); if(curr_node->state == DELETE) { ParodusPrint("Found the node to delete\n"); @@ -1414,7 +1422,7 @@ void checkMaxQandOptimize() int qos = 0; ParodusPrint("checkMaxQandOptimize . XmidtQsize is %d\n" , get_XmidtQsize()); - if(get_XmidtQsize() > 0 && get_XmidtQsize() == get_parodus_cfg()->max_queue_size) + if(get_XmidtQsize() > 0 && get_XmidtQsize() >= get_parodus_cfg()->max_queue_size) { ParodusInfo("Max Queue size reached, check and optimize\n"); @@ -1426,14 +1434,14 @@ void checkMaxQandOptimize() { wrp_msg_t * tempMsg = temp->msg; qos = tempMsg->u.event.qos; - ParodusInfo("qos is %d\n", qos); + ParodusPrint("qos is %d\n", qos); if(highQosValueCheck(qos)) { - ParodusInfo("High qos msg, skip delete\n"); + ParodusPrint("High qos msg, skip delete\n"); } else { - ParodusInfo("Low qos msg, set to DELETE state\n"); + ParodusInfo("Max Queue size reached. Low qos %d, set to DELETE state\n", qos); updateXmidtState(temp, DELETE); } temp = temp->next; From 2a28e5d3e8745af95cf14a791e385ed8b792b739 Mon Sep 17 00:00:00 2001 From: Sadhyama Vengilat Date: Thu, 7 Jul 2022 18:34:50 +0530 Subject: [PATCH 096/137] Log qos , transaction id during expiry and delete --- src/xmidtsend_rbus.c | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/src/xmidtsend_rbus.c b/src/xmidtsend_rbus.c index 5f6b808..8724681 100644 --- a/src/xmidtsend_rbus.c +++ b/src/xmidtsend_rbus.c @@ -1321,7 +1321,7 @@ int deleteFromXmidtQ(XmidtMsg **next_node) ParodusPrint("Found the node to delete\n"); if( NULL == prev_node ) { - ParodusInfo("need to delete first doc\n"); + ParodusPrint("need to delete first doc\n"); XmidtMsgQ = curr_node->next; } else @@ -1332,7 +1332,11 @@ int deleteFromXmidtQ(XmidtMsg **next_node) } - ParodusPrint("Deleting the node entries\n"); + wrp_msg_t *xmdMsg = curr_node->msg; + if (xmdMsg) + { + ParodusInfo("Delete xmidt node with transid %s\n", xmdMsg->u.event.transaction_uuid); + } wrp_free_struct( curr_node->msg); curr_node->msg = NULL; if(curr_node !=NULL) @@ -1340,7 +1344,7 @@ int deleteFromXmidtQ(XmidtMsg **next_node) free( curr_node ); curr_node = NULL; } - ParodusInfo("Deleted successfully and returning..\n"); + ParodusPrint("Deleted successfully and returning..\n"); pthread_mutex_unlock (&xmidt_mut); decrement_XmidtQsize(); ParodusInfo("XmidtQsize after delete is %d\n", get_XmidtQsize()); @@ -1376,7 +1380,7 @@ void checkMsgExpiry() ParodusPrint("Critical Qos, check if expiry of 30 mins reached\n"); if((currTime - temp->enqueueTime) > CRITICAL_QOS_EXPIRE_TIME) { - ParodusInfo("Critical qos 30 mins expired, set to DELETE state\n"); + ParodusInfo("Critical qos 30 mins expired, set to DELETE. qos %d transid %s\n", tempMsg->u.event.qos, tempMsg->u.event.transaction_uuid); updateXmidtState(temp, DELETE); } } @@ -1385,7 +1389,7 @@ void checkMsgExpiry() ParodusPrint("High Qos, check if expiry of 25 mins reached\n"); if((currTime - temp->enqueueTime) > HIGH_QOS_EXPIRE_TIME) { - ParodusInfo("High qos 25 mins expired, set to DELETE state\n"); + ParodusInfo("High qos 25 mins expired, set to DELETE. qos %d transid %s\n", tempMsg->u.event.qos, tempMsg->u.event.transaction_uuid); updateXmidtState(temp, DELETE); } } @@ -1394,7 +1398,7 @@ void checkMsgExpiry() ParodusPrint("Medium Qos, check if expiry of 20 mins reached\n"); if((currTime - temp->enqueueTime) > MEDIUM_QOS_EXPIRE_TIME) { - ParodusInfo("Medium qos 20 mins expired, set to DELETE state\n"); + ParodusInfo("Medium qos 20 mins expired, set to DELETE. qos %d transid %s\n", tempMsg->u.event.qos, tempMsg->u.event.transaction_uuid); updateXmidtState(temp, DELETE); } } @@ -1403,7 +1407,7 @@ void checkMsgExpiry() ParodusPrint("Low Qos, check if expiry of 15 mins reached\n"); if((currTime - temp->enqueueTime) > LOW_QOS_EXPIRE_TIME) { - ParodusInfo("Low qos 15 mins expired, set to DELETE state\n"); + ParodusInfo("Low qos 15 mins expired, set to DELETE. qos %d transid %s\n", tempMsg->u.event.qos, tempMsg->u.event.transaction_uuid); updateXmidtState(temp, DELETE); } } From 8b5346e69b0ce743e58ee57f95350a773852396b Mon Sep 17 00:00:00 2001 From: Sadhyama Vengilat Date: Mon, 11 Jul 2022 19:58:31 +0530 Subject: [PATCH 097/137] To test high qos wan down scenarios locally --- src/upstream.c | 10 +++++++--- src/xmidtsend_rbus.c | 27 +++++++++++++++------------ 2 files changed, 22 insertions(+), 15 deletions(-) diff --git a/src/upstream.c b/src/upstream.c index f6307d3..2f5eda5 100644 --- a/src/upstream.c +++ b/src/upstream.c @@ -603,7 +603,7 @@ void getServiceNameAndSendResponse(wrp_msg_t *msg, void **msg_bytes, size_t msg_ ParodusError("serviceName is NULL,not sending retrieve response to client\n"); } } - +int test = 0; int sendUpstreamMsgToServer(void **resp_bytes, size_t resp_size) { void *appendData; @@ -640,7 +640,11 @@ int sendUpstreamMsgToServer(void **resp_bytes, size_t resp_size) ParodusError("Failed to send upstream as metadata packing is not successful\n"); sendRetStatus = 1; } - ParodusPrint("sendRetStatus is %d\n", sendRetStatus); - + ParodusInfo("sendRetStatus is %d\n", sendRetStatus); + if(test == 0) + { + sendRetStatus = 1; //testing + test = 1; + } return sendRetStatus; } diff --git a/src/xmidtsend_rbus.c b/src/xmidtsend_rbus.c index 8724681..cafde4e 100644 --- a/src/xmidtsend_rbus.c +++ b/src/xmidtsend_rbus.c @@ -33,7 +33,7 @@ static pthread_t processThreadId = 0; static unsigned int XmidtQsize = 0; - +static int test = 0; //testing XmidtMsg *XmidtMsgQ = NULL; CloudAck *g_cloudackHead = NULL; @@ -141,7 +141,7 @@ void addToXmidtUpstreamQ(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle) char * errorMsg = NULL; ParodusPrint("XmidtQsize is %d\n" , get_XmidtQsize()); - if( get_XmidtQsize() > 0 && get_XmidtQsize() >= get_parodus_cfg()->max_queue_size) + if( get_XmidtQsize() > 0 && get_XmidtQsize() == get_parodus_cfg()->max_queue_size) { ParodusInfo("queue size %d exceeded at producer, ignoring the event\n", get_XmidtQsize()); mapXmidtStatusToStatusMessage(QUEUE_SIZE_EXCEEDED, &errorMsg); @@ -237,17 +237,17 @@ void* processXmidtUpstreamMsg() ParodusInfo("Received cloud status signal proceed to event processing\n"); } pthread_mutex_lock (&xmidt_mut); - ParodusPrint("mutex lock in xmidt consumer thread\n"); + ParodusInfo("mutex lock in xmidt consumer thread\n"); if (xmidtQ != NULL) { XmidtMsg *Data = xmidtQ; pthread_mutex_unlock (&xmidt_mut); - ParodusPrint("mutex unlock in xmidt consumer thread\n"); + ParodusInfo("mutex unlock in xmidt consumer thread\n"); checkMsgExpiry(); checkMaxQandOptimize(); - ParodusPrint("check state\n"); + ParodusInfo("check state\n"); switch(Data->state) { case PENDING: @@ -255,7 +255,7 @@ void* processXmidtUpstreamMsg() //send msg to server only when cloud connection is online. if(checkCloudConn()) { - ParodusPrint("cloud status is online, processData\n"); + ParodusInfo("cloud status is online, processData\n"); rv = processData(Data, Data->msg, Data->asyncHandle); if(!rv) { @@ -329,7 +329,7 @@ void* processXmidtUpstreamMsg() // circling back to 1st node if(xmidtQ == NULL && get_global_xmidthead() != NULL) { - ParodusPrint("xmidtQ is NULL, circling back to 1st node\n"); + ParodusInfo("xmidtQ is NULL, circling back to 1st node\n"); xmidtQ = get_global_xmidthead(); } sleep(3); @@ -341,7 +341,7 @@ void* processXmidtUpstreamMsg() pthread_mutex_unlock (&xmidt_mut); break; } - ParodusPrint("Before cond wait in xmidt consumer thread\n"); + ParodusInfo("Before cond wait in xmidt consumer thread\n"); pthread_cond_wait(&xmidt_con, &xmidt_mut); pthread_mutex_unlock (&xmidt_mut); ParodusPrint("mutex unlock in xmidt thread after cond wait\n"); @@ -596,7 +596,11 @@ void sendXmidtEventToServer(XmidtMsg *msgnode, wrp_msg_t * msg, rbusMethodAsyncH ParodusInfo("Wait till connection is Up\n"); pthread_mutex_lock(get_global_cloud_status_mut()); - pthread_cond_wait(get_global_cloud_status_cond(), get_global_cloud_status_mut()); + //pthread_cond_wait(get_global_cloud_status_cond(), get_global_cloud_status_mut()); + if(test == 1) + { + sleep(60); //testing + } pthread_mutex_unlock(get_global_cloud_status_mut()); ParodusInfo("Received cloud status signal proceed to retry\n"); printSendMsgData("send to server after cloud reconnect", notif_wrp_msg->u.event.qos, notif_wrp_msg->u.event.dest, notif_wrp_msg->u.event.transaction_uuid); @@ -1013,7 +1017,6 @@ void set_global_TransID(char *transid) g_transactionId = strdup(transid); } -static int test = 0; // static rbusError_t sendDataHandler(rbusHandle_t handle, char const* methodName, rbusObject_t inParams, rbusObject_t outParams, rbusMethodAsyncHandle_t asyncHandle) { @@ -1034,7 +1037,7 @@ static rbusError_t sendDataHandler(rbusHandle_t handle, char const* methodName, //transaction_uuid = generate_transaction_uuid(); //transaction_uuid = strdup("8d72d4c2-1f59-4420-a736-3946083d529a"); //Testing char trans_uuid[64]; - sprintf(trans_uuid, "3946083d529a_test%d", test++); + sprintf(trans_uuid, "3946083d529a_test%d", ++test); ParodusPrint("test trans_uuid = %s\n", trans_uuid); transaction_uuid = strdup(trans_uuid); @@ -1426,7 +1429,7 @@ void checkMaxQandOptimize() int qos = 0; ParodusPrint("checkMaxQandOptimize . XmidtQsize is %d\n" , get_XmidtQsize()); - if(get_XmidtQsize() > 0 && get_XmidtQsize() >= get_parodus_cfg()->max_queue_size) + if(get_XmidtQsize() > 0 && get_XmidtQsize() == get_parodus_cfg()->max_queue_size) { ParodusInfo("Max Queue size reached, check and optimize\n"); From d3a56df18427348d6c787452571ad577818d9340 Mon Sep 17 00:00:00 2001 From: Sadhyama Vengilat Date: Thu, 14 Jul 2022 20:09:04 +0530 Subject: [PATCH 098/137] Handle enqueued msg expiry when cloud connection is down --- src/xmidtsend_rbus.c | 97 ++++++++++++++++++++++++++++++++++---------- src/xmidtsend_rbus.h | 5 ++- 2 files changed, 78 insertions(+), 24 deletions(-) diff --git a/src/xmidtsend_rbus.c b/src/xmidtsend_rbus.c index cafde4e..6c615be 100644 --- a/src/xmidtsend_rbus.c +++ b/src/xmidtsend_rbus.c @@ -119,18 +119,60 @@ void decrement_XmidtQsize() pthread_mutex_unlock (&xmidt_mut); } -int checkCloudConn() +int checkCloudConn(char *current_transid, XmidtMsg **xmidt_nextnode) { if (!cloud_status_is_online ()) { ParodusInfo("cloud status is not online, wait till connection up\n"); + + int rv; + struct timespec ts; + XmidtMsg *nextnode = NULL; + pthread_mutex_lock(get_global_cloud_status_mut()); - pthread_cond_wait(get_global_cloud_status_cond(), get_global_cloud_status_mut()); - pthread_mutex_unlock(get_global_cloud_status_mut()); - ParodusInfo("Received cloud status signal, proceed to event processing\n"); + getCurrentTime(&ts); + ts.tv_sec += LOW_QOS_EXPIRE_TIME; + ParodusInfo("checkCloudConn timeout at %lld\n", (long long) ts.tv_sec); + + while (1) + { + ParodusInfo("B4 pthread cond wait in checkCloudConn\n"); + rv = pthread_cond_timedwait(get_global_cloud_status_cond(), get_global_cloud_status_mut(), &ts); + if (rv == ETIMEDOUT) + { + ParodusInfo("Timedout. Cloud connection is down for %d minutes, check msg expiry\n", (LOW_QOS_EXPIRE_TIME/60)); + pthread_mutex_unlock(get_global_cloud_status_mut()); + xmidtQOptmize(current_transid, &nextnode); + *xmidt_nextnode = nextnode; + } + else + { + ParodusInfo("Received cloud status signal, proceed to event processing\n"); + break; + } + } } return 1; } + +void xmidtQOptmize(char *curr_transid, XmidtMsg **xmidt_node) +{ + XmidtMsg *next_node = NULL; + //Delete all expired msgs from queue except currently processing msg + checkMsgExpiry(curr_transid); + checkMaxQandOptimize(); + int status = deleteFromXmidtQ(&next_node); //should be in loop for all msgs + if(status) + { + ParodusPrint("deleteFromXmidtQ success\n"); + } + else + { + ParodusError("deleteFromXmidtQ failed\n"); + } + *xmidt_node = next_node ; +} + /* * @brief To handle xmidt rbus messages received from various components. */ @@ -223,6 +265,8 @@ void* processXmidtUpstreamMsg() struct timespec tms; XmidtMsg *xmidtQ = NULL; XmidtMsg *next_node = NULL; + XmidtMsg *next_msgnode = NULL; + char *msgTransID = NULL; xmidtQ = get_global_xmidthead(); @@ -244,7 +288,7 @@ void* processXmidtUpstreamMsg() pthread_mutex_unlock (&xmidt_mut); ParodusInfo("mutex unlock in xmidt consumer thread\n"); - checkMsgExpiry(); + checkMsgExpiry(NULL); checkMaxQandOptimize(); ParodusInfo("check state\n"); @@ -253,18 +297,22 @@ void* processXmidtUpstreamMsg() case PENDING: ParodusInfo("state : PENDING\n"); //send msg to server only when cloud connection is online. - if(checkCloudConn()) + msgTransID = Data->msg->u.event.transaction_uuid; + checkCloudConn(msgTransID, &next_msgnode ); + if (next_msgnode != NULL) { - ParodusInfo("cloud status is online, processData\n"); - rv = processData(Data, Data->msg, Data->asyncHandle); - if(!rv) - { - ParodusError("processData failed\n"); - } - else - { - ParodusPrint("processData success\n"); - } + xmidtQ = next_msgnode; + break; + } + ParodusInfo("cloud status is online, processData\n"); + rv = processData(Data, Data->msg, Data->asyncHandle); + if(!rv) + { + ParodusError("processData failed\n"); + } + else + { + ParodusPrint("processData success\n"); } break; @@ -285,7 +333,7 @@ void* processXmidtUpstreamMsg() else //ack timeout case { ParodusPrint("transaction id match not found, cloud ack timed out. Need to retry\n"); - if (checkCloudConn()) + if (checkCloudConn(msgTransID, &next_msgnode)) { ParodusPrint("cloud status is online, check ping time\n"); if(get_pingTimeStamp() > (Data->sentTime + CLOUD_ACK_TIMEOUT_SEC)) @@ -594,14 +642,15 @@ void sendXmidtEventToServer(XmidtMsg *msgnode, wrp_msg_t * msg, rbusMethodAsyncH { ParodusPrint("The event is having high qos retry again\n"); ParodusInfo("Wait till connection is Up\n"); - - pthread_mutex_lock(get_global_cloud_status_mut()); + XmidtMsg *next_node; + checkCloudConn(notif_wrp_msg->u.event.transaction_uuid, &next_node ); + //pthread_mutex_lock(get_global_cloud_status_mut()); //pthread_cond_wait(get_global_cloud_status_cond(), get_global_cloud_status_mut()); if(test == 1) { sleep(60); //testing } - pthread_mutex_unlock(get_global_cloud_status_mut()); + //pthread_mutex_unlock(get_global_cloud_status_mut()); ParodusInfo("Received cloud status signal proceed to retry\n"); printSendMsgData("send to server after cloud reconnect", notif_wrp_msg->u.event.qos, notif_wrp_msg->u.event.dest, notif_wrp_msg->u.event.transaction_uuid); } @@ -1363,7 +1412,7 @@ int deleteFromXmidtQ(XmidtMsg **next_node) } //check if message is expired based on each qos and set to delete state. -void checkMsgExpiry() +void checkMsgExpiry(char * current_transid) { long long currTime = 0; struct timespec ts; @@ -1377,6 +1426,11 @@ void checkMsgExpiry() currTime= (long long)ts.tv_sec; wrp_msg_t * tempMsg = temp->msg; ParodusPrint("qos %d currTime %lu enqueueTime %lu\n", tempMsg->u.event.qos, currTime, temp->enqueueTime); + if((current_transid !=NULL) && (strcmp(tempMsg->u.event.transaction_uuid, current_transid) == 0)) + { + ParodusInfo("skip current processing transaction id %s, continue\n", tempMsg->u.event.transaction_uuid); + continue; + } if(tempMsg->u.event.qos > 74) { @@ -1420,7 +1474,6 @@ void checkMsgExpiry() } temp = temp->next; } - } //To delete low qos messages from queue when max queue limit is reached. diff --git a/src/xmidtsend_rbus.h b/src/xmidtsend_rbus.h index b8d3b17..b1afb11 100644 --- a/src/xmidtsend_rbus.h +++ b/src/xmidtsend_rbus.h @@ -109,10 +109,11 @@ int updateXmidtState(XmidtMsg * temp, int state); void print_xmidMsg_list(); int deleteCloudACKNode(char* trans_id); int deleteFromXmidtQ(XmidtMsg **next_node); -int checkCloudConn(); +int checkCloudConn(char *current_transid, XmidtMsg **xmidt_nextnode); void checkMaxQandOptimize(); -void checkMsgExpiry(); +void checkMsgExpiry(char * current_transid); void mapXmidtStatusToStatusMessage(int status, char **message); +void xmidtQOptmize(char *curr_transid, XmidtMsg **xmidt_node); //Testing void set_global_TransID(char *transid); char *get_global_TransID(); From 66b16aa58f9e380534f1ef3f877f0f18c54d917a Mon Sep 17 00:00:00 2001 From: Sadhyama Vengilat Date: Mon, 18 Jul 2022 20:37:44 +0530 Subject: [PATCH 099/137] Modify xmidt state flow based on next node --- src/xmidtsend_rbus.c | 115 +++++++++++++++++++++++++++++++++---------- src/xmidtsend_rbus.h | 2 + 2 files changed, 91 insertions(+), 26 deletions(-) diff --git a/src/xmidtsend_rbus.c b/src/xmidtsend_rbus.c index 6c615be..b852995 100644 --- a/src/xmidtsend_rbus.c +++ b/src/xmidtsend_rbus.c @@ -121,6 +121,7 @@ void decrement_XmidtQsize() int checkCloudConn(char *current_transid, XmidtMsg **xmidt_nextnode) { + int ret = 1; if (!cloud_status_is_online ()) { ParodusInfo("cloud status is not online, wait till connection up\n"); @@ -131,7 +132,7 @@ int checkCloudConn(char *current_transid, XmidtMsg **xmidt_nextnode) pthread_mutex_lock(get_global_cloud_status_mut()); getCurrentTime(&ts); - ts.tv_sec += LOW_QOS_EXPIRE_TIME; + ts.tv_sec += EXPIRY_CHECK_TIME; ParodusInfo("checkCloudConn timeout at %lld\n", (long long) ts.tv_sec); while (1) @@ -140,10 +141,15 @@ int checkCloudConn(char *current_transid, XmidtMsg **xmidt_nextnode) rv = pthread_cond_timedwait(get_global_cloud_status_cond(), get_global_cloud_status_mut(), &ts); if (rv == ETIMEDOUT) { - ParodusInfo("Timedout. Cloud connection is down for %d minutes, check msg expiry\n", (LOW_QOS_EXPIRE_TIME/60)); + ParodusInfo("Timedout. Cloud connection is down for %d minutes, check msg expiry\n", (EXPIRY_CHECK_TIME/60)); pthread_mutex_unlock(get_global_cloud_status_mut()); - xmidtQOptmize(current_transid, &nextnode); - *xmidt_nextnode = nextnode; + int opt = xmidtQOptmize(current_transid, &nextnode); + if(opt) + { + ParodusInfo("xmidtQ is optimized during connection down %d, return next node\n", opt); + *xmidt_nextnode = nextnode; + ret = 2; + } } else { @@ -152,23 +158,44 @@ int checkCloudConn(char *current_transid, XmidtMsg **xmidt_nextnode) } } } - return 1; + ParodusInfo("checkCloudConn ret %d\n", ret); + return ret; +} + +void deleteAllExpiredMsgs(char *current_transid, XmidtMsg **xmidt_node) +{ + XmidtMsg *temp = NULL, *next_node = NULL; + temp = get_global_tmp_node(); + + ParodusInfo("Inside deleteAllExpiredMsgs\n"); + while(temp != NULL) + { + //skip current msg delete + wrp_msg_t * tempMsg = temp->msg; + if((current_transid !=NULL) && (strcmp(tempMsg->u.event.transaction_uuid, current_transid) != 0)) + { + deleteFromXmidtQ(&next_node); + temp = next_node; + continue; + } + temp = temp->next; + } } void xmidtQOptmize(char *curr_transid, XmidtMsg **xmidt_node) { XmidtMsg *next_node = NULL; - //Delete all expired msgs from queue except currently processing msg + //Delete all expired msgs from queue except current processing msg checkMsgExpiry(curr_transid); checkMaxQandOptimize(); - int status = deleteFromXmidtQ(&next_node); //should be in loop for all msgs + int status = deleteAllExpiredMsgs(curr_transid, &next_node); if(status) { - ParodusPrint("deleteFromXmidtQ success\n"); + ParodusPrint("deleteAllExpiredMsgs success\n"); } else { - ParodusError("deleteFromXmidtQ failed\n"); + ParodusError("deleteAllExpiredMsgs failed\n"); } *xmidt_node = next_node ; } @@ -267,6 +294,7 @@ void* processXmidtUpstreamMsg() XmidtMsg *next_node = NULL; XmidtMsg *next_msgnode = NULL; char *msgTransID = NULL; + int cv = 0; xmidtQ = get_global_xmidthead(); @@ -297,22 +325,33 @@ void* processXmidtUpstreamMsg() case PENDING: ParodusInfo("state : PENDING\n"); //send msg to server only when cloud connection is online. - msgTransID = Data->msg->u.event.transaction_uuid; - checkCloudConn(msgTransID, &next_msgnode ); - if (next_msgnode != NULL) + cv = checkCloudConn(NULL, &next_msgnode ); + if (cv == 2) { + ParodusInfo("queue is optimized,need to process next node\n"); xmidtQ = next_msgnode; - break; - } - ParodusInfo("cloud status is online, processData\n"); - rv = processData(Data, Data->msg, Data->asyncHandle); - if(!rv) - { - ParodusError("processData failed\n"); + if(xmidtQ !=NULL) + { + ParodusInfo("continue to next node\n"); + continue; + } + else + { + ParodusInfo("next node is NULL,reset to head node\n"); + } } else { - ParodusPrint("processData success\n"); + ParodusInfo("cloud status is online, processData\n"); + rv = processData(Data, Data->msg, Data->asyncHandle); + if(!rv) + { + ParodusError("processData failed\n"); + } + else + { + ParodusPrint("processData success\n"); + } } break; @@ -333,7 +372,22 @@ void* processXmidtUpstreamMsg() else //ack timeout case { ParodusPrint("transaction id match not found, cloud ack timed out. Need to retry\n"); - if (checkCloudConn(msgTransID, &next_msgnode)) + cv = checkCloudConn(NULL, &next_msgnode); + if (cv == 2) + { + ParodusInfo("queue is optimized,need to retry next node\n"); + xmidtQ = next_msgnode; + if(xmidtQ !=NULL) + { + ParodusInfo("continue to next node to retry\n"); + continue; + } + else + { + ParodusInfo("next node is NULL, reset to head node\n"); + } + } + else { ParodusPrint("cloud status is online, check ping time\n"); if(get_pingTimeStamp() > (Data->sentTime + CLOUD_ACK_TIMEOUT_SEC)) @@ -364,8 +418,8 @@ void* processXmidtUpstreamMsg() else { ParodusError("deleteFromXmidtQ failed\n"); - break; } + break; } if(xmidtQ !=NULL) @@ -400,7 +454,7 @@ void* processXmidtUpstreamMsg() } //To validate and send events upstream -int processData(XmidtMsg *Datanode, wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle) +int processData(XmidtMsg *Datanode, wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle, XmidtMsg **nxtnode) { int rv = 0; char *errorMsg = "none"; @@ -422,7 +476,11 @@ int processData(XmidtMsg *Datanode, wrp_msg_t * msg, rbusMethodAsyncHandle_t asy if(rv) { ParodusPrint("validation successful, send event to server\n"); - sendXmidtEventToServer(Datanode, xmidtMsg, asyncHandle); + sendXmidtEventToServer(Datanode, xmidtMsg, asyncHandle, &nextnode); + if(nextnode !=NULL) + { + *nxtnode = nextnode; + } return rv; } else @@ -516,7 +574,7 @@ int validateXmidtData(wrp_msg_t * eventMsg, char **errorMsg, int *statusCode) return 1; } -void sendXmidtEventToServer(XmidtMsg *msgnode, wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle) +void sendXmidtEventToServer(XmidtMsg *msgnode, wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle,XmidtMsg **xmidt_nextnode) { wrp_msg_t *notif_wrp_msg = NULL; ssize_t msg_len; @@ -643,9 +701,14 @@ void sendXmidtEventToServer(XmidtMsg *msgnode, wrp_msg_t * msg, rbusMethodAsyncH ParodusPrint("The event is having high qos retry again\n"); ParodusInfo("Wait till connection is Up\n"); XmidtMsg *next_node; - checkCloudConn(notif_wrp_msg->u.event.transaction_uuid, &next_node ); + int cv = checkCloudConn(notif_wrp_msg->u.event.transaction_uuid, &next_node ); //pthread_mutex_lock(get_global_cloud_status_mut()); //pthread_cond_wait(get_global_cloud_status_cond(), get_global_cloud_status_mut()); + if(cv == 2 && next_node !=NULL) + { + ParodusInfo("xmidtQ is optimized, return next node\n"); + *xmidt_nextnode = next_node; + } if(test == 1) { sleep(60); //testing diff --git a/src/xmidtsend_rbus.h b/src/xmidtsend_rbus.h index b1afb11..f6d7791 100644 --- a/src/xmidtsend_rbus.h +++ b/src/xmidtsend_rbus.h @@ -39,6 +39,7 @@ extern "C" { #define MEDIUM_QOS_EXPIRE_TIME 20*60 #define LOW_QOS_EXPIRE_TIME 15*60 +#define EXPIRY_CHECK_TIME 5*60 //To check expiry in every 5 mins when cloud connection is down. /*----------------------------------------------------------------------------*/ /* Data Structures */ /*----------------------------------------------------------------------------*/ @@ -114,6 +115,7 @@ void checkMaxQandOptimize(); void checkMsgExpiry(char * current_transid); void mapXmidtStatusToStatusMessage(int status, char **message); void xmidtQOptmize(char *curr_transid, XmidtMsg **xmidt_node); +void deleteAllExpiredMsgs(char *current_transid, XmidtMsg **xmidt_node); //Testing void set_global_TransID(char *transid); char *get_global_TransID(); From b97643ec42659f8a8165707b4e0b47b78344beab Mon Sep 17 00:00:00 2001 From: Sadhyama Vengilat Date: Thu, 21 Jul 2022 18:38:28 +0530 Subject: [PATCH 100/137] Optimize xmidtQ when connection down and reset to head --- src/xmidtsend_rbus.c | 199 ++++++++++++++++++++++++------------------- src/xmidtsend_rbus.h | 9 +- 2 files changed, 117 insertions(+), 91 deletions(-) diff --git a/src/xmidtsend_rbus.c b/src/xmidtsend_rbus.c index b852995..e2bb38a 100644 --- a/src/xmidtsend_rbus.c +++ b/src/xmidtsend_rbus.c @@ -119,7 +119,7 @@ void decrement_XmidtQsize() pthread_mutex_unlock (&xmidt_mut); } -int checkCloudConn(char *current_transid, XmidtMsg **xmidt_nextnode) +int checkCloudConn() { int ret = 1; if (!cloud_status_is_online ()) @@ -128,7 +128,6 @@ int checkCloudConn(char *current_transid, XmidtMsg **xmidt_nextnode) int rv; struct timespec ts; - XmidtMsg *nextnode = NULL; pthread_mutex_lock(get_global_cloud_status_mut()); getCurrentTime(&ts); @@ -143,11 +142,10 @@ int checkCloudConn(char *current_transid, XmidtMsg **xmidt_nextnode) { ParodusInfo("Timedout. Cloud connection is down for %d minutes, check msg expiry\n", (EXPIRY_CHECK_TIME/60)); pthread_mutex_unlock(get_global_cloud_status_mut()); - int opt = xmidtQOptmize(current_transid, &nextnode); + int opt = xmidtQOptmize(); if(opt) { ParodusInfo("xmidtQ is optimized during connection down %d, return next node\n", opt); - *xmidt_nextnode = nextnode; ret = 2; } } @@ -162,42 +160,85 @@ int checkCloudConn(char *current_transid, XmidtMsg **xmidt_nextnode) return ret; } -void deleteAllExpiredMsgs(char *current_transid, XmidtMsg **xmidt_node) +//Delete all expired msgs from queue and low qos when max queue. +int xmidtQOptmize() { - XmidtMsg *temp = NULL, *next_node = NULL; - temp = get_global_tmp_node(); + long long currTime = 0; + struct timespec ts; + int rv = 0; - ParodusInfo("Inside deleteAllExpiredMsgs\n"); - while(temp != NULL) - { - //skip current msg delete - wrp_msg_t * tempMsg = temp->msg; - if((current_transid !=NULL) && (strcmp(tempMsg->u.event.transaction_uuid, current_transid) != 0)) - { - deleteFromXmidtQ(&next_node); - temp = next_node; - continue; - } - temp = temp->next; - } -} + XmidtMsg *temp = NULL; + temp = get_global_xmidthead(); -void xmidtQOptmize(char *curr_transid, XmidtMsg **xmidt_node) -{ - XmidtMsg *next_node = NULL; - //Delete all expired msgs from queue except current processing msg - checkMsgExpiry(curr_transid); - checkMaxQandOptimize(); - int status = deleteAllExpiredMsgs(curr_transid, &next_node); - if(status) + while(temp != NULL) { - ParodusPrint("deleteAllExpiredMsgs success\n"); + getCurrentTime(&ts); + currTime= (long long)ts.tv_sec; + int del = 0; + + wrp_msg_t * tempMsg = temp->msg; + ParodusInfo("qos %d currTime %lu enqueueTime %lu\n", tempMsg->u.event.qos, currTime, temp->enqueueTime); + if(tempMsg->u.event.qos > 74) + { + if((currTime - temp->enqueueTime) > CRITICAL_QOS_EXPIRE_TIME) + { + ParodusInfo("Critical qos 30 mins expired, delete qos %d transid %s\n", tempMsg->u.event.qos, tempMsg->u.event.transaction_uuid); + del = 1; + } + } + else if (tempMsg->u.event.qos > 49) + { + if((currTime - temp->enqueueTime) > HIGH_QOS_EXPIRE_TIME) + { + ParodusInfo("High qos 25 mins expired, delete qos %d transid %s\n", tempMsg->u.event.qos, tempMsg->u.event.transaction_uuid); + del = 1; + } + } + else if (tempMsg->u.event.qos > 24) + { + if((currTime - temp->enqueueTime) > MEDIUM_QOS_EXPIRE_TIME) + { + ParodusInfo("Medium qos 20 mins expired, delete qos %d transid %s\n", tempMsg->u.event.qos, tempMsg->u.event.transaction_uuid); + del = 1; + } + } + else if (tempMsg->u.event.qos >= 0) + { + if((currTime - temp->enqueueTime) > LOW_QOS_EXPIRE_TIME) + { + ParodusInfo("Low qos 15 mins expired, delete qos %d transid %s\n", tempMsg->u.event.qos, tempMsg->u.event.transaction_uuid); + del = 1; + } + else + { + if(get_XmidtQsize() > 0 && get_XmidtQsize() == get_parodus_cfg()->max_queue_size) + { + ParodusInfo("Max queue size reached, delete low qos %d transid %s\n", tempMsg->u.event.qos, tempMsg->u.event.transaction_uuid); + del = 1; + } + } + } + else + { + ParodusError("Invalid qos\n"); + } + + if(del) + { + pthread_mutex_lock (&xmidt_mut); + wrp_free_struct( tempMsg); + tempMsg = NULL; + free( temp ); + temp = NULL; + ParodusInfo("Deleted successfully and returning..\n"); + pthread_mutex_unlock (&xmidt_mut); + decrement_XmidtQsize(); + ParodusInfo("XmidtQsize after delete is %d\n", get_XmidtQsize()); + rv = 1; + } + temp = temp->next; } - else - { - ParodusError("deleteAllExpiredMsgs failed\n"); - } - *xmidt_node = next_node ; + return rv; } /* @@ -292,8 +333,6 @@ void* processXmidtUpstreamMsg() struct timespec tms; XmidtMsg *xmidtQ = NULL; XmidtMsg *next_node = NULL; - XmidtMsg *next_msgnode = NULL; - char *msgTransID = NULL; int cv = 0; xmidtQ = get_global_xmidthead(); @@ -316,8 +355,9 @@ void* processXmidtUpstreamMsg() pthread_mutex_unlock (&xmidt_mut); ParodusInfo("mutex unlock in xmidt consumer thread\n"); - checkMsgExpiry(NULL); + checkMsgExpiry(); checkMaxQandOptimize(); + cv = 0; ParodusInfo("check state\n"); switch(Data->state) @@ -325,20 +365,10 @@ void* processXmidtUpstreamMsg() case PENDING: ParodusInfo("state : PENDING\n"); //send msg to server only when cloud connection is online. - cv = checkCloudConn(NULL, &next_msgnode ); + cv = checkCloudConn(); if (cv == 2) { - ParodusInfo("queue is optimized,need to process next node\n"); - xmidtQ = next_msgnode; - if(xmidtQ !=NULL) - { - ParodusInfo("continue to next node\n"); - continue; - } - else - { - ParodusInfo("next node is NULL,reset to head node\n"); - } + ParodusInfo("queue is optimized, reset to head node\n"); } else { @@ -350,7 +380,14 @@ void* processXmidtUpstreamMsg() } else { - ParodusPrint("processData success\n"); + if(rv == 2) + { + ParodusInfo("queue is optimized, reset to head\n"); + } + else + { + ParodusPrint("processData success\n"); + } } } break; @@ -372,20 +409,11 @@ void* processXmidtUpstreamMsg() else //ack timeout case { ParodusPrint("transaction id match not found, cloud ack timed out. Need to retry\n"); - cv = checkCloudConn(NULL, &next_msgnode); + cv = checkCloudConn(); if (cv == 2) { - ParodusInfo("queue is optimized,need to retry next node\n"); - xmidtQ = next_msgnode; - if(xmidtQ !=NULL) - { - ParodusInfo("continue to next node to retry\n"); - continue; - } - else - { - ParodusInfo("next node is NULL, reset to head node\n"); - } + ParodusInfo("queue is optimized, reset to head node and retry\n"); + break; } else { @@ -400,7 +428,14 @@ void* processXmidtUpstreamMsg() } else { - ParodusPrint("processData retry success\n"); + if(rv == 2) + { + ParodusInfo("queue is optimized, reset to head\n"); + } + else + { + ParodusPrint("processData success\n"); + } } } } @@ -422,16 +457,16 @@ void* processXmidtUpstreamMsg() break; } - if(xmidtQ !=NULL) + if(cv !=2 && xmidtQ !=NULL) { ParodusPrint("Move to next node\n"); xmidtQ = xmidtQ->next; } // circling back to 1st node - if(xmidtQ == NULL && get_global_xmidthead() != NULL) + if((cv ==2) || (xmidtQ == NULL && get_global_xmidthead() != NULL)) { - ParodusInfo("xmidtQ is NULL, circling back to 1st node\n"); + ParodusInfo("circling back to 1st node, cv %d\n", cv); xmidtQ = get_global_xmidthead(); } sleep(3); @@ -454,7 +489,7 @@ void* processXmidtUpstreamMsg() } //To validate and send events upstream -int processData(XmidtMsg *Datanode, wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle, XmidtMsg **nxtnode) +int processData(XmidtMsg *Datanode, wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle) { int rv = 0; char *errorMsg = "none"; @@ -476,11 +511,7 @@ int processData(XmidtMsg *Datanode, wrp_msg_t * msg, rbusMethodAsyncHandle_t asy if(rv) { ParodusPrint("validation successful, send event to server\n"); - sendXmidtEventToServer(Datanode, xmidtMsg, asyncHandle, &nextnode); - if(nextnode !=NULL) - { - *nxtnode = nextnode; - } + rv = sendXmidtEventToServer(Datanode, xmidtMsg, asyncHandle); return rv; } else @@ -574,7 +605,7 @@ int validateXmidtData(wrp_msg_t * eventMsg, char **errorMsg, int *statusCode) return 1; } -void sendXmidtEventToServer(XmidtMsg *msgnode, wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle,XmidtMsg **xmidt_nextnode) +int sendXmidtEventToServer(XmidtMsg *msgnode, wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle) { wrp_msg_t *notif_wrp_msg = NULL; ssize_t msg_len; @@ -586,6 +617,7 @@ void sendXmidtEventToServer(XmidtMsg *msgnode, wrp_msg_t * msg, rbusMethodAsyncH int sendRetStatus = 1; char *errorMsg = NULL; int qos = 0; + int rv = 0; ParodusPrint("MAX_QUEUE_SIZE: %d\n", get_parodus_cfg()->max_queue_size); notif_wrp_msg = (wrp_msg_t *)malloc(sizeof(wrp_msg_t)); @@ -690,7 +722,7 @@ void sendXmidtEventToServer(XmidtMsg *msgnode, wrp_msg_t * msg, rbusMethodAsyncH free(msg_bytes); msg_bytes = NULL; } - return; + return rv; } while(sendRetStatus) //If SendMessage is failed condition @@ -700,14 +732,13 @@ void sendXmidtEventToServer(XmidtMsg *msgnode, wrp_msg_t * msg, rbusMethodAsyncH { ParodusPrint("The event is having high qos retry again\n"); ParodusInfo("Wait till connection is Up\n"); - XmidtMsg *next_node; - int cv = checkCloudConn(notif_wrp_msg->u.event.transaction_uuid, &next_node ); + rv = checkCloudConn(); //pthread_mutex_lock(get_global_cloud_status_mut()); //pthread_cond_wait(get_global_cloud_status_cond(), get_global_cloud_status_mut()); - if(cv == 2 && next_node !=NULL) + if(rv == 2) { - ParodusInfo("xmidtQ is optimized, return next node\n"); - *xmidt_nextnode = next_node; + printSendMsgData("queue optimized during send. retry", notif_wrp_msg->u.event.qos, notif_wrp_msg->u.event.dest, notif_wrp_msg->u.event.transaction_uuid); + break; } if(test == 1) { @@ -805,6 +836,7 @@ void sendXmidtEventToServer(XmidtMsg *msgnode, wrp_msg_t * msg, rbusMethodAsyncH notif_wrp_msg = NULL; } ParodusPrint("sendXmidtEventToServer done\n"); + return rv; } void createOutParamsandSendAck(wrp_msg_t *msg, rbusMethodAsyncHandle_t asyncHandle, char *errorMsg, int statuscode, rbusError_t error) @@ -1475,7 +1507,7 @@ int deleteFromXmidtQ(XmidtMsg **next_node) } //check if message is expired based on each qos and set to delete state. -void checkMsgExpiry(char * current_transid) +void checkMsgExpiry() { long long currTime = 0; struct timespec ts; @@ -1489,11 +1521,6 @@ void checkMsgExpiry(char * current_transid) currTime= (long long)ts.tv_sec; wrp_msg_t * tempMsg = temp->msg; ParodusPrint("qos %d currTime %lu enqueueTime %lu\n", tempMsg->u.event.qos, currTime, temp->enqueueTime); - if((current_transid !=NULL) && (strcmp(tempMsg->u.event.transaction_uuid, current_transid) == 0)) - { - ParodusInfo("skip current processing transaction id %s, continue\n", tempMsg->u.event.transaction_uuid); - continue; - } if(tempMsg->u.event.qos > 74) { diff --git a/src/xmidtsend_rbus.h b/src/xmidtsend_rbus.h index f6d7791..c31b627 100644 --- a/src/xmidtsend_rbus.h +++ b/src/xmidtsend_rbus.h @@ -94,7 +94,7 @@ void addToXmidtUpstreamQ(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle); void* processXmidtUpstreamMsg(); void processXmidtData(); int processData(XmidtMsg *Datanode, wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle); -void sendXmidtEventToServer(XmidtMsg *msgnode, wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle); +int sendXmidtEventToServer(XmidtMsg *msgnode, wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle); int checkInputParameters(rbusObject_t inParams); char* generate_transaction_uuid(); void parseRbusInparamsToWrp(rbusObject_t inParams, char *trans_id, wrp_msg_t **eventMsg); @@ -110,12 +110,11 @@ int updateXmidtState(XmidtMsg * temp, int state); void print_xmidMsg_list(); int deleteCloudACKNode(char* trans_id); int deleteFromXmidtQ(XmidtMsg **next_node); -int checkCloudConn(char *current_transid, XmidtMsg **xmidt_nextnode); +int checkCloudConn(); void checkMaxQandOptimize(); -void checkMsgExpiry(char * current_transid); +void checkMsgExpiry(); void mapXmidtStatusToStatusMessage(int status, char **message); -void xmidtQOptmize(char *curr_transid, XmidtMsg **xmidt_node); -void deleteAllExpiredMsgs(char *current_transid, XmidtMsg **xmidt_node); +int xmidtQOptmize(); //Testing void set_global_TransID(char *transid); char *get_global_TransID(); From 2248f31658ff6904161d2ab0555f0c0575cb877f Mon Sep 17 00:00:00 2001 From: Sadhyama Vengilat Date: Tue, 2 Aug 2022 16:22:19 +0530 Subject: [PATCH 101/137] Remove test simulation for cloud ack to test with cd server --- src/downstream.c | 115 ++++++++++--------------------------------- src/xmidtsend_rbus.c | 37 +++----------- 2 files changed, 33 insertions(+), 119 deletions(-) diff --git a/src/downstream.c b/src/downstream.c index 348ffaf..d827445 100644 --- a/src/downstream.c +++ b/src/downstream.c @@ -32,8 +32,6 @@ /* Function Prototypes */ /*----------------------------------------------------------------------------*/ static void createNewMsgForCRUD(wrp_msg_t *message, wrp_msg_t **crudMessage ); -static void createNewMsgForCloudACK(wrp_msg_t *message, wrp_msg_t **eventMessage ); //Test purpose. -static int test = 0; /*----------------------------------------------------------------------------*/ /* External Functions */ /*----------------------------------------------------------------------------*/ @@ -73,7 +71,7 @@ void listenerOnMessage(void * msg, size_t msgSize) if(rv > 0) { - ParodusPrint("\nDecoded recivedMsg of size:%d\n", rv); + ParodusInfo("\nDecoded recivedMsg of size:%d\n", rv); msgType = message->msg_type; ParodusInfo("msgType received:%d\n", msgType); @@ -92,8 +90,9 @@ void listenerOnMessage(void * msg, size_t msgSize) case WRP_MSG_TYPE__RETREIVE: case WRP_MSG_TYPE__DELETE: { - ParodusPrint("numOfClients registered is %d\n", get_numOfClients()); + ParodusInfo("numOfClients registered is %d\n", get_numOfClients()); int ret = validate_partner_id(message, NULL); + ParodusInfo("validate_partner_id returns %d\n", ret); if(ret < 0) { response = cJSON_CreateObject(); @@ -101,10 +100,12 @@ void listenerOnMessage(void * msg, size_t msgSize) cJSON_AddStringToObject(response, "message", "Invalid partner_id"); } - + ParodusInfo("B4 event dest fetch\n"); + ParodusInfo("message->u.event.dest is %s\n"); destVal = strdup(((WRP_MSG_TYPE__EVENT == msgType) ? message->u.event.dest : ((WRP_MSG_TYPE__REQ == msgType) ? message->u.req.dest : message->u.crud.dest))); - + ParodusInfo("destVal check\n"); + ParodusInfo("destVal %s\n", destVal); if( (destVal != NULL) && (ret >= 0) ) { char *newDest = NULL; @@ -113,6 +114,7 @@ void listenerOnMessage(void * msg, size_t msgSize) { newDest = strtok(NULL , "/"); } + ParodusInfo("B4 newDest\n"); if(newDest != NULL) { parStrncpy(dest,newDest, sizeof(dest)); @@ -135,16 +137,15 @@ void listenerOnMessage(void * msg, size_t msgSize) while (NULL != temp) { - ParodusPrint("node is pointing to temp->service_name %s \n",temp->service_name); + ParodusInfo("node is pointing to temp->service_name %s \n",temp->service_name); // Sending message to registered clients if( strcmp(dest, temp->service_name) == 0) { - ParodusPrint("sending to nanomsg client %s\n", dest); + ParodusInfo("sending to nanomsg client %s\n", dest); bytes = nn_send(temp->sock, recivedMsg, msgSize, 0); ParodusInfo("sent downstream message to reg_client '%s'\n",temp->url); ParodusPrint("downstream bytes sent:%d\n", bytes); destFlag =1; - test++; break; } ParodusPrint("checking the next item in the list\n"); @@ -155,7 +156,7 @@ void listenerOnMessage(void * msg, size_t msgSize) /* check Downstream dest for CRUD requests */ if(destFlag ==0 && strcmp("parodus", dest)==0) { - ParodusPrint("Received CRUD request : dest : %s\n", dest); + ParodusInfo("Received CRUD request : dest : %s\n", dest); if ((message->u.crud.source == NULL) || (message->u.crud.transaction_uuid == NULL)) { ParodusError("Invalid request\n"); @@ -240,54 +241,33 @@ void listenerOnMessage(void * msg, size_t msgSize) free(resp_msg); } //To handle cloud ack events received from server for the xmidt sent messages. - //if(test == 1 || test == 3) - if(test >=1) - { - ParodusInfo("test is %d\n", test); - wrp_msg_t *eventMsg= NULL; - ParodusPrint("Create downstream event Msg with cloud ack\n"); - createNewMsgForCloudACK(message, &eventMsg); - msgType = WRP_MSG_TYPE__EVENT; - ParodusPrint("check cloud ack\n"); if((WRP_MSG_TYPE__EVENT == msgType) && (ret >= 0)) { - //Process cloud ack only when qos > 24 - /*if(highQosValueCheck(message->u.event.qos)) + if(get_parodus_cfg()->max_queue_size > 0) { - if(message->u.event.transaction_uuid !=NULL) + //Process cloud ack only when qos > 24 + if(highQosValueCheck(message->u.event.qos)) { - ParodusInfo("Received cloud ack from server: transaction_uuid %s qos %d, rdr %d\n", message->u.event.transaction_uuid, message->u.event.qos, message->u.event.rdr); - addToCloudAckQ(message->u.event.transaction_uuid, message->u.event.qos, message->u.event.rdr); - ParodusInfo("Added to cloud ack Q\n"); + if(message->u.event.transaction_uuid !=NULL) + { + ParodusInfo("Received cloud ack from server: transaction_uuid %s qos %d, rdr %d\n", message->u.event.transaction_uuid, message->u.event.qos, message->u.event.rdr); + addToCloudAckQ(message->u.event.transaction_uuid, message->u.event.qos, message->u.event.rdr); + ParodusInfo("Added to cloud ack Q\n"); + } + else + { + ParodusError("cloud ack transaction id is NULL\n"); + } } else { - ParodusError("cloud ack transaction id is NULL\n"); + ParodusInfo("cloud ack received with low qos %d, ignoring it\n", message->u.event.qos); } } else { - ParodusInfo("cloud ack received with low qos %d, ignoring it\n", message->u.event.qos); - }*/ - //Remove this. TEST purpose. - if(get_parodus_cfg()->max_queue_size > 0 && highQosValueCheck(eventMsg->u.event.qos)) - { - if(eventMsg->u.event.transaction_uuid !=NULL) - { - ParodusInfo("Received cloud ack from server: transaction_uuid %s qos %d, rdr %d\n", eventMsg->u.event.transaction_uuid, eventMsg->u.event.qos, eventMsg->u.event.rdr); - addToCloudAckQ(eventMsg->u.event.transaction_uuid, eventMsg->u.event.qos, eventMsg->u.event.rdr); - ParodusPrint("Added to cloud ack Q\n"); - } - else - { - ParodusError("cloud ack transaction id is NULL\n"); - } + ParodusInfo("cloud ack is ignored as max queue size is %d\n", get_parodus_cfg()->max_queue_size ); } - else - { - ParodusInfo("Cloud ack is ignored as qos is %d max queue size is %d\n", eventMsg->u.event.qos, get_parodus_cfg()->max_queue_size ); - } - } } break; } @@ -298,7 +278,7 @@ void listenerOnMessage(void * msg, size_t msgSize) default: break; } - ParodusPrint("free for downstream decoded msg\n"); + ParodusInfo("free for downstream decoded msg\n"); wrp_free_struct(message); message = NULL; } @@ -421,44 +401,3 @@ static void createNewMsgForCRUD(wrp_msg_t *message, wrp_msg_t **crudMessage ) *crudMessage = msg; } } -//Test purpose. to create new message for processing cloud ACK . -static void createNewMsgForCloudACK(wrp_msg_t *message, wrp_msg_t **eventMessage ) -{ - wrp_msg_t *msg; - msg = ( wrp_msg_t * ) malloc( sizeof( wrp_msg_t ) ); - if(msg != NULL) - { - memset( msg, 0, sizeof( wrp_msg_t ) ); - msg->msg_type = WRP_MSG_TYPE__EVENT; - if(message->u.event.source != NULL) - { - msg->u.event.source = strdup("event:/profile-notify/MyProfile1"); - } - - if(message->u.event.dest != NULL) - { - msg->u.event.dest = strdup("mac:889e6863239e/telemetry2"); - } - - if(message->u.event.transaction_uuid != NULL) - { - //msg->u.event.transaction_uuid = strdup("8d72d4c2-1f59-4420-a736-3946083d529a"); - //msg->u.event.transaction_uuid = get_global_TransID(); - char transaction_uuid[64]; - sprintf(transaction_uuid, "3946083d529a_test%d", test); - ParodusPrint("test transaction_uuid = %s\n", transaction_uuid); - msg->u.event.transaction_uuid = strdup(transaction_uuid); - ParodusInfo("cloud ack msg->u.event.transaction_uuid = %s\n", msg->u.event.transaction_uuid); - } - - if(message->u.event.content_type != NULL) - { - msg->u.event.content_type = strdup("application/json"); - } - msg->u.event.rdr = 0; - msg->u.event.qos = 50; - ParodusPrint("msg->u.event.rdr = %d msg->u.event.qos = %d\n",msg->u.event.rdr, msg->u.event.qos); - *eventMessage = msg; - } - ParodusPrint("createNewMsgForCloudACK done\n"); -} diff --git a/src/xmidtsend_rbus.c b/src/xmidtsend_rbus.c index e2bb38a..52839ce 100644 --- a/src/xmidtsend_rbus.c +++ b/src/xmidtsend_rbus.c @@ -33,7 +33,6 @@ static pthread_t processThreadId = 0; static unsigned int XmidtQsize = 0; -static int test = 0; //testing XmidtMsg *XmidtMsgQ = NULL; CloudAck *g_cloudackHead = NULL; @@ -348,18 +347,18 @@ void* processXmidtUpstreamMsg() ParodusInfo("Received cloud status signal proceed to event processing\n"); } pthread_mutex_lock (&xmidt_mut); - ParodusInfo("mutex lock in xmidt consumer thread\n"); + ParodusPrint("mutex lock in xmidt consumer thread\n"); if (xmidtQ != NULL) { XmidtMsg *Data = xmidtQ; pthread_mutex_unlock (&xmidt_mut); - ParodusInfo("mutex unlock in xmidt consumer thread\n"); + ParodusPrint("mutex unlock in xmidt consumer thread\n"); checkMsgExpiry(); checkMaxQandOptimize(); cv = 0; - ParodusInfo("check state\n"); + ParodusPrint("check state\n"); switch(Data->state) { case PENDING: @@ -466,7 +465,7 @@ void* processXmidtUpstreamMsg() // circling back to 1st node if((cv ==2) || (xmidtQ == NULL && get_global_xmidthead() != NULL)) { - ParodusInfo("circling back to 1st node, cv %d\n", cv); + ParodusPrint("circling back to 1st node, cv %d\n", cv); xmidtQ = get_global_xmidthead(); } sleep(3); @@ -478,7 +477,7 @@ void* processXmidtUpstreamMsg() pthread_mutex_unlock (&xmidt_mut); break; } - ParodusInfo("Before cond wait in xmidt consumer thread\n"); + ParodusPrint("Before cond wait in xmidt consumer thread\n"); pthread_cond_wait(&xmidt_con, &xmidt_mut); pthread_mutex_unlock (&xmidt_mut); ParodusPrint("mutex unlock in xmidt thread after cond wait\n"); @@ -740,10 +739,6 @@ int sendXmidtEventToServer(XmidtMsg *msgnode, wrp_msg_t * msg, rbusMethodAsyncHa printSendMsgData("queue optimized during send. retry", notif_wrp_msg->u.event.qos, notif_wrp_msg->u.event.dest, notif_wrp_msg->u.event.transaction_uuid); break; } - if(test == 1) - { - sleep(60); //testing - } //pthread_mutex_unlock(get_global_cloud_status_mut()); ParodusInfo("Received cloud status signal proceed to retry\n"); printSendMsgData("send to server after cloud reconnect", notif_wrp_msg->u.event.qos, notif_wrp_msg->u.event.dest, notif_wrp_msg->u.event.transaction_uuid); @@ -1149,19 +1144,6 @@ void parseRbusInparamsToWrp(rbusObject_t inParams, char *trans_id, wrp_msg_t **e ParodusPrint("parseRbusInparamsToWrp End\n"); } -//testing purpose. remove this. -static char *g_transactionId = "1234"; -char *get_global_TransID() -{ - return g_transactionId; -} - -void set_global_TransID(char *transid) -{ - g_transactionId = strdup(transid); -} - -// static rbusError_t sendDataHandler(rbusHandle_t handle, char const* methodName, rbusObject_t inParams, rbusObject_t outParams, rbusMethodAsyncHandle_t asyncHandle) { (void) handle; @@ -1178,14 +1160,7 @@ static rbusError_t sendDataHandler(rbusHandle_t handle, char const* methodName, if(inStatus) { //generate transaction id to create outParams and send ack - //transaction_uuid = generate_transaction_uuid(); - //transaction_uuid = strdup("8d72d4c2-1f59-4420-a736-3946083d529a"); //Testing - char trans_uuid[64]; - sprintf(trans_uuid, "3946083d529a_test%d", ++test); - ParodusPrint("test trans_uuid = %s\n", trans_uuid); - transaction_uuid = strdup(trans_uuid); - - set_global_TransID(transaction_uuid);//testing + transaction_uuid = generate_transaction_uuid(); ParodusInfo("xmidt transaction_uuid generated is %s\n", transaction_uuid); parseRbusInparamsToWrp(inParams, transaction_uuid, &wrpMsg); From 2c4980cf9e761104bf7130b56af29d43391a986b Mon Sep 17 00:00:00 2001 From: Sadhyama Vengilat Date: Tue, 2 Aug 2022 18:09:12 +0530 Subject: [PATCH 102/137] Enable more debug logs in validate partner id --- src/partners_check.c | 43 +++++++++++++++++++++++-------------------- 1 file changed, 23 insertions(+), 20 deletions(-) diff --git a/src/partners_check.c b/src/partners_check.c index 2c46d0c..29f7c27 100644 --- a/src/partners_check.c +++ b/src/partners_check.c @@ -43,7 +43,7 @@ static void parse_partner_id(char *partnerId, partners_t **partnersList) { char *token; int i = 0, j = 0, count = 0; - ParodusPrint("********* %s ********\n",__FUNCTION__); + ParodusInfo("********* %s ********\n",__FUNCTION__); while(partnerId[i] != '\0') { if(partnerId[i] == ',') @@ -52,15 +52,15 @@ static void parse_partner_id(char *partnerId, partners_t **partnersList) } i++; } - ParodusPrint("count = %d\n", count+1); + ParodusInfo("count = %d\n", count+1); *partnersList = (partners_t *)malloc(sizeof(partners_t)+ sizeof( char * ) * (count+1)); memset(*partnersList, 0, sizeof(partners_t)); (*partnersList)->count = count+1; while ((token = strsep(&partnerId, ",")) != NULL) { - ParodusPrint("token=%s\n", token); + ParodusInfo("token=%s\n", token); (*partnersList)->partner_ids[j] = strdup(token); - ParodusPrint("(*partnersList)->partner_ids[%d] = %s\n",j,(*partnersList)->partner_ids[j]); + ParodusInfo("(*partnersList)->partner_ids[%d] = %s\n",j,(*partnersList)->partner_ids[j]); j++; } } @@ -71,31 +71,31 @@ int validate_partner_id(wrp_msg_t *msg, partners_t **partnerIds) size_t j = 0; partners_t *partnersList = NULL; char *partnerId = NULL; - ParodusPrint("********* %s ********\n",__FUNCTION__); + ParodusInfo("********* %s ********\n",__FUNCTION__); char *temp = get_parodus_cfg()->partner_id; - ParodusPrint("temp = %s\n",temp); + ParodusInfo("temp = %s\n",temp); if(temp[0] != '\0' && strlen(temp) > 0) { partnerId = strdup(temp); } - ParodusPrint("partnerId = %s\n",partnerId); + ParodusInfo("partnerId = %s\n",partnerId); if(partnerId != NULL) { parse_partner_id(partnerId, &partnersList); - ParodusPrint("partnersList->count = %lu\n", partnersList->count); + ParodusInfo("partnersList->count = %lu\n", partnersList->count); if(msg->msg_type == WRP_MSG_TYPE__EVENT) { if(msg->u.event.partner_ids != NULL) { count = (int) msg->u.event.partner_ids->count; - ParodusPrint("partner_ids count is %d\n",count); + ParodusInfo("partner_ids count is %d\n",count); for(i = 0; i < count; i++) { for(j = 0; jcount; j++) { if(NULL != partnersList->partner_ids[j]) { - ParodusPrint("partnersList->partner_ids[%lu] = %s\n",j, partnersList->partner_ids[j]); - ParodusPrint("msg->u.event.partner_ids->partner_ids[%lu] = %s\n",i, msg->u.event.partner_ids->partner_ids[i]); + ParodusInfo("partnersList->partner_ids[%lu] = %s\n",j, partnersList->partner_ids[j]); + ParodusInfo("msg->u.event.partner_ids->partner_ids[%lu] = %s\n",i, msg->u.event.partner_ids->partner_ids[i]); if(strcasecmp(partnersList->partner_ids[j], msg->u.event.partner_ids->partner_ids[i]) == 0) { ParodusInfo("partner_id match found\n"); @@ -116,26 +116,29 @@ int validate_partner_id(wrp_msg_t *msg, partners_t **partnerIds) /* Commandline input partner_ids not matching with partner_ids from request, appending to request partner_ids*/ if(matchFlag != 1) { + ParodusInfo("count+partnersList->count %d\n", count+partnersList->count); (*partnerIds) = (partners_t *) malloc(sizeof(partners_t) + (sizeof(char *) * (count+partnersList->count))); + ParodusInfo("after partnerIds malloc\n"); (*partnerIds)->count = count+partnersList->count; + ParodusInfo("after (*partnerIds)->count\n"); for(i = 0; i < count; i++) { (*partnerIds)->partner_ids[i] = msg->u.event.partner_ids->partner_ids[i]; - ParodusPrint("(*partnerIds)->partner_ids[%d] : %s\n",i,(*partnerIds)->partner_ids[i]); + ParodusInfo("(*partnerIds)->partner_ids[%d] : %s\n",i,(*partnerIds)->partner_ids[i]); } i = 0; for(j = count; j<(count+partnersList->count); j++) { (*partnerIds)->partner_ids[j] = (char *) malloc(sizeof(char) * 64); parStrncpy((*partnerIds)->partner_ids[j], partnersList->partner_ids[i], 64); - ParodusPrint("(*partnerIds)->partner_ids[%lu] : %s\n",j,(*partnerIds)->partner_ids[j]); + ParodusInfo("(*partnerIds)->partner_ids[%lu] : %s\n",j,(*partnerIds)->partner_ids[j]); i++; } } } else { - ParodusPrint("partner_ids list is NULL\n"); + ParodusInfo("partner_ids list is NULL\n"); (*partnerIds) = (partners_t *) malloc(sizeof(partners_t) + (sizeof(char *) * partnersList->count)); (*partnerIds)->count = partnersList->count; i=0; @@ -143,7 +146,7 @@ int validate_partner_id(wrp_msg_t *msg, partners_t **partnerIds) { (*partnerIds)->partner_ids[j] = (char *) malloc(sizeof(char) * 64); parStrncpy((*partnerIds)->partner_ids[j], partnersList->partner_ids[i], 64); - ParodusPrint("(*partnerIds)->partner_ids[%lu] : %s\n",j,(*partnerIds)->partner_ids[j]); + ParodusInfo("(*partnerIds)->partner_ids[%lu] : %s\n",j,(*partnerIds)->partner_ids[j]); i++; } } @@ -153,15 +156,15 @@ int validate_partner_id(wrp_msg_t *msg, partners_t **partnerIds) if(msg->u.req.partner_ids != NULL) { count = (int) msg->u.req.partner_ids->count; - ParodusPrint("partner_ids count is %d\n",count); + ParodusInfo("partner_ids count is %d\n",count); for(i = 0; i < count; i++) { for(j = 0; jcount; j++) { if(NULL != partnersList->partner_ids[j]) { - ParodusPrint("partnersList->partner_ids[%lu] = %s\n",j, partnersList->partner_ids[j]); - ParodusPrint("msg->u.req.partner_ids->partner_ids[%lu] = %s\n",i, msg->u.req.partner_ids->partner_ids[i]); + ParodusInfo("partnersList->partner_ids[%lu] = %s\n",j, partnersList->partner_ids[j]); + ParodusInfo("msg->u.req.partner_ids->partner_ids[%lu] = %s\n",i, msg->u.req.partner_ids->partner_ids[i]); if(strcasecmp(partnersList->partner_ids[j], msg->u.req.partner_ids->partner_ids[i]) == 0) { ParodusInfo("partner_id match found\n"); @@ -196,7 +199,7 @@ int validate_partner_id(wrp_msg_t *msg, partners_t **partnerIds) } else { - ParodusPrint("partner_ids list is NULL\n"); + ParodusInfo("partner_ids list is NULL\n"); } } if(partnersList != NULL) @@ -214,7 +217,7 @@ int validate_partner_id(wrp_msg_t *msg, partners_t **partnerIds) } else { - ParodusPrint("partner_id is not available to validate\n"); + ParodusInfo("partner_id is not available to validate\n"); return 0; } return 1; From 37bb19eeaada7626bb6db0b91bec95ffd38df07f Mon Sep 17 00:00:00 2001 From: Sadhyama Vengilat Date: Wed, 3 Aug 2022 14:05:41 +0530 Subject: [PATCH 103/137] Remove test simulation for sendresponse --- src/upstream.c | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/upstream.c b/src/upstream.c index 2f5eda5..0530bc5 100644 --- a/src/upstream.c +++ b/src/upstream.c @@ -603,7 +603,6 @@ void getServiceNameAndSendResponse(wrp_msg_t *msg, void **msg_bytes, size_t msg_ ParodusError("serviceName is NULL,not sending retrieve response to client\n"); } } -int test = 0; int sendUpstreamMsgToServer(void **resp_bytes, size_t resp_size) { void *appendData; @@ -641,10 +640,5 @@ int sendUpstreamMsgToServer(void **resp_bytes, size_t resp_size) sendRetStatus = 1; } ParodusInfo("sendRetStatus is %d\n", sendRetStatus); - if(test == 0) - { - sendRetStatus = 1; //testing - test = 1; - } return sendRetStatus; } From 9ebe011cb0dac5adf6154884a0892905dd5ac6ae Mon Sep 17 00:00:00 2001 From: Sadhyama Vengilat Date: Thu, 25 Aug 2022 16:07:09 +0530 Subject: [PATCH 104/137] Reduce xmidt send consumer sleep on processing msgs --- src/xmidtsend_rbus.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/xmidtsend_rbus.c b/src/xmidtsend_rbus.c index 52839ce..f71fb24 100644 --- a/src/xmidtsend_rbus.c +++ b/src/xmidtsend_rbus.c @@ -72,17 +72,21 @@ bool highQosValueCheck(int qos) XmidtMsg * get_global_xmidthead(void) { XmidtMsg *tmp = NULL; + ParodusInfo("get_global_xmidthead: mutex lock\n"); pthread_mutex_lock (&xmidt_mut); tmp = XmidtMsgQ; pthread_mutex_unlock (&xmidt_mut); + ParodusInfo("get_global_xmidthead: mutex unlock\n"); return tmp; } void set_global_xmidthead(XmidtMsg *new) { + ParodusInfo("set_global_xmidthead: mutex lock\n"); pthread_mutex_lock (&xmidt_mut); XmidtMsgQ = new; pthread_mutex_unlock (&xmidt_mut); + ParodusInfo("set_global_xmidthead: mutex unlock\n"); } CloudAck * get_global_cloud_node(void) @@ -468,7 +472,7 @@ void* processXmidtUpstreamMsg() ParodusPrint("circling back to 1st node, cv %d\n", cv); xmidtQ = get_global_xmidthead(); } - sleep(3); + sleep(1); } else { From bf3ee6536028fa762de97c1b2d0bad5d93013f67 Mon Sep 17 00:00:00 2001 From: Sadhyama Vengilat Date: Thu, 25 Aug 2022 18:01:24 +0530 Subject: [PATCH 105/137] Enable debug logs --- src/xmidtsend_rbus.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/xmidtsend_rbus.c b/src/xmidtsend_rbus.c index f71fb24..040a1e2 100644 --- a/src/xmidtsend_rbus.c +++ b/src/xmidtsend_rbus.c @@ -362,7 +362,7 @@ void* processXmidtUpstreamMsg() checkMaxQandOptimize(); cv = 0; - ParodusPrint("check state\n"); + ParodusInfo("check state\n"); switch(Data->state) { case PENDING: @@ -396,22 +396,22 @@ void* processXmidtUpstreamMsg() break; case SENT: - ParodusPrint("state : SENT\n"); + ParodusInfo("state : SENT\n"); getCurrentTime(&tms); currTime = (long long)tms.tv_sec; long long timeout_secs = (Data->sentTime) + CLOUD_ACK_TIMEOUT_SEC; - ParodusPrint("currTime %lld sentTime %lld CLOUD_ACK_TIMEOUT_SEC %d, timeout_secs %lld trans_id %s\n", currTime, Data->sentTime, CLOUD_ACK_TIMEOUT_SEC, timeout_secs, Data->msg->u.event.transaction_uuid); + ParodusInfo("currTime %lld sentTime %lld CLOUD_ACK_TIMEOUT_SEC %d, timeout_secs %lld trans_id %s\n", currTime, Data->sentTime, CLOUD_ACK_TIMEOUT_SEC, timeout_secs, Data->msg->u.event.transaction_uuid); if (currTime > timeout_secs) { - ParodusPrint("Check cloud ack for matching transaction id\n"); + ParodusInfo("Check cloud ack for matching transaction id\n"); ret = checkCloudACK(Data, Data->asyncHandle); if (ret) { - ParodusPrint("cloud ack processed successfully\n"); + ParodusInfo("cloud ack processed successfully\n"); } else //ack timeout case { - ParodusPrint("transaction id match not found, cloud ack timed out. Need to retry\n"); + ParodusInfo("transaction id match not found, cloud ack timed out. Need to retry\n"); cv = checkCloudConn(); if (cv == 2) { @@ -420,7 +420,7 @@ void* processXmidtUpstreamMsg() } else { - ParodusPrint("cloud status is online, check ping time\n"); + ParodusInfo("cloud status is online, check ping time\n"); if(get_pingTimeStamp() > (Data->sentTime + CLOUD_ACK_TIMEOUT_SEC)) { ParodusInfo("Ping received at timestamp %lld, proceed to retry\n", get_pingTimeStamp()); @@ -437,7 +437,7 @@ void* processXmidtUpstreamMsg() } else { - ParodusPrint("processData success\n"); + ParodusInfo("processData success\n"); } } } @@ -469,7 +469,7 @@ void* processXmidtUpstreamMsg() // circling back to 1st node if((cv ==2) || (xmidtQ == NULL && get_global_xmidthead() != NULL)) { - ParodusPrint("circling back to 1st node, cv %d\n", cv); + ParodusInfo("circling back to 1st node, cv %d\n", cv); xmidtQ = get_global_xmidthead(); } sleep(1); From 43f55f9a99d0b0113706510b247b9e5bce1e1e52 Mon Sep 17 00:00:00 2001 From: Sadhyama Vengilat Date: Thu, 25 Aug 2022 19:53:48 +0530 Subject: [PATCH 106/137] Reduce cloud ack processing time delay --- src/xmidtsend_rbus.c | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/xmidtsend_rbus.c b/src/xmidtsend_rbus.c index 040a1e2..b3d33e4 100644 --- a/src/xmidtsend_rbus.c +++ b/src/xmidtsend_rbus.c @@ -397,19 +397,19 @@ void* processXmidtUpstreamMsg() case SENT: ParodusInfo("state : SENT\n"); - getCurrentTime(&tms); - currTime = (long long)tms.tv_sec; - long long timeout_secs = (Data->sentTime) + CLOUD_ACK_TIMEOUT_SEC; - ParodusInfo("currTime %lld sentTime %lld CLOUD_ACK_TIMEOUT_SEC %d, timeout_secs %lld trans_id %s\n", currTime, Data->sentTime, CLOUD_ACK_TIMEOUT_SEC, timeout_secs, Data->msg->u.event.transaction_uuid); - if (currTime > timeout_secs) + ParodusInfo("Check cloud ack for matching transaction id\n"); + ret = checkCloudACK(Data, Data->asyncHandle); + if (ret) { - ParodusInfo("Check cloud ack for matching transaction id\n"); - ret = checkCloudACK(Data, Data->asyncHandle); - if (ret) - { - ParodusInfo("cloud ack processed successfully\n"); - } - else //ack timeout case + ParodusInfo("cloud ack processed successfully\n"); + } + else + { + getCurrentTime(&tms); + currTime = (long long)tms.tv_sec; + long long timeout_secs = (Data->sentTime) + CLOUD_ACK_TIMEOUT_SEC; + ParodusInfo("currTime %lld sentTime %lld CLOUD_ACK_TIMEOUT_SEC %d, timeout_secs %lld trans_id %s\n", currTime, Data->sentTime, CLOUD_ACK_TIMEOUT_SEC, timeout_secs, Data->msg->u.event.transaction_uuid); + if (currTime > timeout_secs) //ack timeout case { ParodusInfo("transaction id match not found, cloud ack timed out. Need to retry\n"); cv = checkCloudConn(); From 8e00ec8e5eb328a8554bbb4217bf011ad5670464 Mon Sep 17 00:00:00 2001 From: Sadhyama Vengilat Date: Mon, 29 Aug 2022 20:31:03 +0530 Subject: [PATCH 107/137] Fix unknown dest error during downstream cloud ack processing --- src/downstream.c | 21 +++++++++++--------- src/partners_check.c | 46 ++++++++++++++++++++++---------------------- src/xmidtsend_rbus.c | 32 ++++++++++++++---------------- 3 files changed, 49 insertions(+), 50 deletions(-) diff --git a/src/downstream.c b/src/downstream.c index d827445..29a2a19 100644 --- a/src/downstream.c +++ b/src/downstream.c @@ -125,10 +125,10 @@ void listenerOnMessage(void * msg, size_t msgSize) } ParodusInfo("Received downstream dest as :%s and transaction_uuid :%s\n", dest, ((WRP_MSG_TYPE__REQ == msgType) ? message->u.req.transaction_uuid : - ((WRP_MSG_TYPE__EVENT == msgType) ? "NA" : message->u.crud.transaction_uuid))); + ((WRP_MSG_TYPE__EVENT == msgType) ? message->u.event.transaction_uuid : message->u.crud.transaction_uuid))); OnboardLog("%s\n", ((WRP_MSG_TYPE__REQ == msgType) ? message->u.req.transaction_uuid : - ((WRP_MSG_TYPE__EVENT == msgType) ? "NA" : message->u.crud.transaction_uuid))); + ((WRP_MSG_TYPE__EVENT == msgType) ? message->u.event.transaction_uuid : message->u.crud.transaction_uuid))); free(destVal); @@ -173,13 +173,16 @@ void listenerOnMessage(void * msg, size_t msgSize) destFlag =1; } //if any unknown dest received sending error response to server - if(destFlag ==0) - { - ParodusError("Unknown dest:%s\n", dest); - response = cJSON_CreateObject(); - cJSON_AddNumberToObject(response, "statusCode", 531); - cJSON_AddStringToObject(response, "message", "Service Unavailable"); - } + if (WRP_MSG_TYPE__EVENT != msgType) + { + if(destFlag ==0) + { + ParodusError("Unknown dest:%s\n", dest); + response = cJSON_CreateObject(); + cJSON_AddNumberToObject(response, "statusCode", 531); + cJSON_AddStringToObject(response, "message", "Service Unavailable"); + } + } } if( (WRP_MSG_TYPE__EVENT != msgType) && diff --git a/src/partners_check.c b/src/partners_check.c index 29f7c27..cf64cdb 100644 --- a/src/partners_check.c +++ b/src/partners_check.c @@ -43,7 +43,7 @@ static void parse_partner_id(char *partnerId, partners_t **partnersList) { char *token; int i = 0, j = 0, count = 0; - ParodusInfo("********* %s ********\n",__FUNCTION__); + ParodusPrint("********* %s ********\n",__FUNCTION__); while(partnerId[i] != '\0') { if(partnerId[i] == ',') @@ -52,15 +52,15 @@ static void parse_partner_id(char *partnerId, partners_t **partnersList) } i++; } - ParodusInfo("count = %d\n", count+1); + ParodusPrint("count = %d\n", count+1); *partnersList = (partners_t *)malloc(sizeof(partners_t)+ sizeof( char * ) * (count+1)); memset(*partnersList, 0, sizeof(partners_t)); (*partnersList)->count = count+1; while ((token = strsep(&partnerId, ",")) != NULL) { - ParodusInfo("token=%s\n", token); + ParodusPrint("token=%s\n", token); (*partnersList)->partner_ids[j] = strdup(token); - ParodusInfo("(*partnersList)->partner_ids[%d] = %s\n",j,(*partnersList)->partner_ids[j]); + ParodusPrint("(*partnersList)->partner_ids[%d] = %s\n",j,(*partnersList)->partner_ids[j]); j++; } } @@ -71,31 +71,31 @@ int validate_partner_id(wrp_msg_t *msg, partners_t **partnerIds) size_t j = 0; partners_t *partnersList = NULL; char *partnerId = NULL; - ParodusInfo("********* %s ********\n",__FUNCTION__); + ParodusPrint("********* %s ********\n",__FUNCTION__); char *temp = get_parodus_cfg()->partner_id; - ParodusInfo("temp = %s\n",temp); + ParodusPrint("temp = %s\n",temp); if(temp[0] != '\0' && strlen(temp) > 0) { partnerId = strdup(temp); } - ParodusInfo("partnerId = %s\n",partnerId); + ParodusPrint("partnerId = %s\n",partnerId); if(partnerId != NULL) { parse_partner_id(partnerId, &partnersList); - ParodusInfo("partnersList->count = %lu\n", partnersList->count); + ParodusPrint("partnersList->count = %lu\n", partnersList->count); if(msg->msg_type == WRP_MSG_TYPE__EVENT) { if(msg->u.event.partner_ids != NULL) { count = (int) msg->u.event.partner_ids->count; - ParodusInfo("partner_ids count is %d\n",count); + ParodusPrint("partner_ids count is %d\n",count); for(i = 0; i < count; i++) { for(j = 0; jcount; j++) { if(NULL != partnersList->partner_ids[j]) { - ParodusInfo("partnersList->partner_ids[%lu] = %s\n",j, partnersList->partner_ids[j]); - ParodusInfo("msg->u.event.partner_ids->partner_ids[%lu] = %s\n",i, msg->u.event.partner_ids->partner_ids[i]); + ParodusPrint("partnersList->partner_ids[%lu] = %s\n",j, partnersList->partner_ids[j]); + ParodusPrint("msg->u.event.partner_ids->partner_ids[%lu] = %s\n",i, msg->u.event.partner_ids->partner_ids[i]); if(strcasecmp(partnersList->partner_ids[j], msg->u.event.partner_ids->partner_ids[i]) == 0) { ParodusInfo("partner_id match found\n"); @@ -116,29 +116,29 @@ int validate_partner_id(wrp_msg_t *msg, partners_t **partnerIds) /* Commandline input partner_ids not matching with partner_ids from request, appending to request partner_ids*/ if(matchFlag != 1) { - ParodusInfo("count+partnersList->count %d\n", count+partnersList->count); + ParodusPrint("count+partnersList->count %d\n", count+partnersList->count); (*partnerIds) = (partners_t *) malloc(sizeof(partners_t) + (sizeof(char *) * (count+partnersList->count))); - ParodusInfo("after partnerIds malloc\n"); + ParodusPrint("after partnerIds malloc\n"); (*partnerIds)->count = count+partnersList->count; - ParodusInfo("after (*partnerIds)->count\n"); + ParodusPrint("after (*partnerIds)->count\n"); for(i = 0; i < count; i++) { (*partnerIds)->partner_ids[i] = msg->u.event.partner_ids->partner_ids[i]; - ParodusInfo("(*partnerIds)->partner_ids[%d] : %s\n",i,(*partnerIds)->partner_ids[i]); + ParodusPrint("(*partnerIds)->partner_ids[%d] : %s\n",i,(*partnerIds)->partner_ids[i]); } i = 0; for(j = count; j<(count+partnersList->count); j++) { (*partnerIds)->partner_ids[j] = (char *) malloc(sizeof(char) * 64); parStrncpy((*partnerIds)->partner_ids[j], partnersList->partner_ids[i], 64); - ParodusInfo("(*partnerIds)->partner_ids[%lu] : %s\n",j,(*partnerIds)->partner_ids[j]); + ParodusPrint("(*partnerIds)->partner_ids[%lu] : %s\n",j,(*partnerIds)->partner_ids[j]); i++; } } } else { - ParodusInfo("partner_ids list is NULL\n"); + ParodusPrint("partner_ids list is NULL\n"); (*partnerIds) = (partners_t *) malloc(sizeof(partners_t) + (sizeof(char *) * partnersList->count)); (*partnerIds)->count = partnersList->count; i=0; @@ -146,7 +146,7 @@ int validate_partner_id(wrp_msg_t *msg, partners_t **partnerIds) { (*partnerIds)->partner_ids[j] = (char *) malloc(sizeof(char) * 64); parStrncpy((*partnerIds)->partner_ids[j], partnersList->partner_ids[i], 64); - ParodusInfo("(*partnerIds)->partner_ids[%lu] : %s\n",j,(*partnerIds)->partner_ids[j]); + ParodusPrint("(*partnerIds)->partner_ids[%lu] : %s\n",j,(*partnerIds)->partner_ids[j]); i++; } } @@ -156,15 +156,15 @@ int validate_partner_id(wrp_msg_t *msg, partners_t **partnerIds) if(msg->u.req.partner_ids != NULL) { count = (int) msg->u.req.partner_ids->count; - ParodusInfo("partner_ids count is %d\n",count); + ParodusPrint("partner_ids count is %d\n",count); for(i = 0; i < count; i++) { for(j = 0; jcount; j++) { if(NULL != partnersList->partner_ids[j]) { - ParodusInfo("partnersList->partner_ids[%lu] = %s\n",j, partnersList->partner_ids[j]); - ParodusInfo("msg->u.req.partner_ids->partner_ids[%lu] = %s\n",i, msg->u.req.partner_ids->partner_ids[i]); + ParodusPrint("partnersList->partner_ids[%lu] = %s\n",j, partnersList->partner_ids[j]); + ParodusPrint("msg->u.req.partner_ids->partner_ids[%lu] = %s\n",i, msg->u.req.partner_ids->partner_ids[i]); if(strcasecmp(partnersList->partner_ids[j], msg->u.req.partner_ids->partner_ids[i]) == 0) { ParodusInfo("partner_id match found\n"); @@ -199,7 +199,7 @@ int validate_partner_id(wrp_msg_t *msg, partners_t **partnerIds) } else { - ParodusInfo("partner_ids list is NULL\n"); + ParodusPrint("partner_ids list is NULL\n"); } } if(partnersList != NULL) @@ -217,7 +217,7 @@ int validate_partner_id(wrp_msg_t *msg, partners_t **partnerIds) } else { - ParodusInfo("partner_id is not available to validate\n"); + ParodusPrint("partner_id is not available to validate\n"); return 0; } return 1; diff --git a/src/xmidtsend_rbus.c b/src/xmidtsend_rbus.c index b3d33e4..dc0906e 100644 --- a/src/xmidtsend_rbus.c +++ b/src/xmidtsend_rbus.c @@ -72,21 +72,17 @@ bool highQosValueCheck(int qos) XmidtMsg * get_global_xmidthead(void) { XmidtMsg *tmp = NULL; - ParodusInfo("get_global_xmidthead: mutex lock\n"); pthread_mutex_lock (&xmidt_mut); tmp = XmidtMsgQ; pthread_mutex_unlock (&xmidt_mut); - ParodusInfo("get_global_xmidthead: mutex unlock\n"); return tmp; } void set_global_xmidthead(XmidtMsg *new) { - ParodusInfo("set_global_xmidthead: mutex lock\n"); pthread_mutex_lock (&xmidt_mut); XmidtMsgQ = new; pthread_mutex_unlock (&xmidt_mut); - ParodusInfo("set_global_xmidthead: mutex unlock\n"); } CloudAck * get_global_cloud_node(void) @@ -148,7 +144,7 @@ int checkCloudConn() int opt = xmidtQOptmize(); if(opt) { - ParodusInfo("xmidtQ is optimized during connection down %d, return next node\n", opt); + ParodusInfo("xmidtQ is optimized during connection down %d, ret %d\n", ret); ret = 2; } } @@ -362,11 +358,11 @@ void* processXmidtUpstreamMsg() checkMaxQandOptimize(); cv = 0; - ParodusInfo("check state\n"); + ParodusPrint("check state\n"); switch(Data->state) { case PENDING: - ParodusInfo("state : PENDING\n"); + ParodusPrint("state : PENDING\n"); //send msg to server only when cloud connection is online. cv = checkCloudConn(); if (cv == 2) @@ -375,11 +371,11 @@ void* processXmidtUpstreamMsg() } else { - ParodusInfo("cloud status is online, processData\n"); + ParodusPrint("cloud status is online, processData\n"); rv = processData(Data, Data->msg, Data->asyncHandle); if(!rv) { - ParodusError("processData failed\n"); + ParodusPrint("processData failed\n"); } else { @@ -396,12 +392,12 @@ void* processXmidtUpstreamMsg() break; case SENT: - ParodusInfo("state : SENT\n"); - ParodusInfo("Check cloud ack for matching transaction id\n"); + ParodusPrint("state : SENT\n"); + ParodusPrint("Check cloud ack for matching transaction id\n"); ret = checkCloudACK(Data, Data->asyncHandle); if (ret) { - ParodusInfo("cloud ack processed successfully\n"); + ParodusPrint("cloud ack processed successfully\n"); } else { @@ -420,14 +416,14 @@ void* processXmidtUpstreamMsg() } else { - ParodusInfo("cloud status is online, check ping time\n"); + ParodusPrint("cloud status is online, check ping time\n"); if(get_pingTimeStamp() > (Data->sentTime + CLOUD_ACK_TIMEOUT_SEC)) { - ParodusInfo("Ping received at timestamp %lld, proceed to retry\n", get_pingTimeStamp()); + ParodusPrint("Ping received at timestamp %lld, proceed to retry\n", get_pingTimeStamp()); rv = processData(Data, Data->msg, Data->asyncHandle); if(!rv) { - ParodusError("processData retry failed\n"); + ParodusPrint("processData retry failed\n"); } else { @@ -437,7 +433,7 @@ void* processXmidtUpstreamMsg() } else { - ParodusInfo("processData success\n"); + ParodusPrint("processData success\n"); } } } @@ -446,7 +442,7 @@ void* processXmidtUpstreamMsg() } break; case DELETE: - ParodusInfo("state : DELETE\n"); + ParodusPrint("state : DELETE\n"); status = deleteFromXmidtQ(&next_node); if(status) { @@ -1353,7 +1349,7 @@ int updateXmidtState(XmidtMsg * temp, int state) temp->sentTime = (long long)ts.tv_sec; ParodusPrint("updated temp->sentTime %lld\n", temp->sentTime); } - ParodusInfo("msgnode is updated with state %d sentTime %lld\n", temp->state, temp->sentTime); + ParodusPrint("msgnode is updated with state %d sentTime %lld\n", temp->state, temp->sentTime); pthread_mutex_unlock (&xmidt_mut); return 1; } From 4af1aaf4181e3bcd3b11a4c78a3904c1e3b256e9 Mon Sep 17 00:00:00 2001 From: Sadhyama Vengilat Date: Fri, 9 Sep 2022 20:29:18 +0530 Subject: [PATCH 108/137] To fix crash when partner id mismatch and fix msg processing before init --- src/downstream.c | 6 ++-- src/partners_check.c | 3 +- src/xmidtsend_rbus.c | 86 +++++++++++++++++++++++++++++++------------- src/xmidtsend_rbus.h | 4 +-- 4 files changed, 69 insertions(+), 30 deletions(-) diff --git a/src/downstream.c b/src/downstream.c index 29a2a19..2536b32 100644 --- a/src/downstream.c +++ b/src/downstream.c @@ -91,7 +91,8 @@ void listenerOnMessage(void * msg, size_t msgSize) case WRP_MSG_TYPE__DELETE: { ParodusInfo("numOfClients registered is %d\n", get_numOfClients()); - int ret = validate_partner_id(message, NULL); + partners_t *partnersList = NULL; + int ret = validate_partner_id(message, &partnersList); ParodusInfo("validate_partner_id returns %d\n", ret); if(ret < 0) { @@ -100,8 +101,7 @@ void listenerOnMessage(void * msg, size_t msgSize) cJSON_AddStringToObject(response, "message", "Invalid partner_id"); } - ParodusInfo("B4 event dest fetch\n"); - ParodusInfo("message->u.event.dest is %s\n"); + ParodusInfo("message->u.event.dest is %s\n", message->u.event.dest); destVal = strdup(((WRP_MSG_TYPE__EVENT == msgType) ? message->u.event.dest : ((WRP_MSG_TYPE__REQ == msgType) ? message->u.req.dest : message->u.crud.dest))); ParodusInfo("destVal check\n"); diff --git a/src/partners_check.c b/src/partners_check.c index cf64cdb..dfc74b1 100644 --- a/src/partners_check.c +++ b/src/partners_check.c @@ -98,7 +98,7 @@ int validate_partner_id(wrp_msg_t *msg, partners_t **partnerIds) ParodusPrint("msg->u.event.partner_ids->partner_ids[%lu] = %s\n",i, msg->u.event.partner_ids->partner_ids[i]); if(strcasecmp(partnersList->partner_ids[j], msg->u.event.partner_ids->partner_ids[i]) == 0) { - ParodusInfo("partner_id match found\n"); + ParodusPrint("partner_id match found\n"); matchFlag = 1; break; } @@ -220,6 +220,7 @@ int validate_partner_id(wrp_msg_t *msg, partners_t **partnerIds) ParodusPrint("partner_id is not available to validate\n"); return 0; } + ParodusPrint("partner_id is not matched\n"); return 1; } diff --git a/src/xmidtsend_rbus.c b/src/xmidtsend_rbus.c index dc0906e..cc3d7be 100644 --- a/src/xmidtsend_rbus.c +++ b/src/xmidtsend_rbus.c @@ -42,7 +42,7 @@ pthread_mutex_t xmidt_mut=PTHREAD_MUTEX_INITIALIZER; pthread_cond_t xmidt_con=PTHREAD_COND_INITIALIZER; pthread_mutex_t cloudack_mut=PTHREAD_MUTEX_INITIALIZER; - +int test = 0; //testing const char * contentTypeList[]={ "application/json", "avro/binary", @@ -121,22 +121,32 @@ void decrement_XmidtQsize() int checkCloudConn() { int ret = 1; - if (!cloud_status_is_online ()) + //if (!cloud_status_is_online ()) + if (test == 1) //test purpose. { ParodusInfo("cloud status is not online, wait till connection up\n"); int rv; struct timespec ts; - pthread_mutex_lock(get_global_cloud_status_mut()); + /*pthread_mutex_lock(get_global_cloud_status_mut()); getCurrentTime(&ts); ts.tv_sec += EXPIRY_CHECK_TIME; - ParodusInfo("checkCloudConn timeout at %lld\n", (long long) ts.tv_sec); + ParodusInfo("checkCloudConn timeout at %lld\n", (long long) ts.tv_sec);*/ while (1) { + pthread_mutex_lock(get_global_cloud_status_mut()); + getCurrentTime(&ts); + ts.tv_sec += EXPIRY_CHECK_TIME; + ParodusInfo("checkCloudConn timeout at %lld\n", (long long) ts.tv_sec); + // ParodusInfo("B4 pthread cond wait in checkCloudConn\n"); rv = pthread_cond_timedwait(get_global_cloud_status_cond(), get_global_cloud_status_mut(), &ts); + if(test ==2 || test ==4) + { + rv = 0 ; + } if (rv == ETIMEDOUT) { ParodusInfo("Timedout. Cloud connection is down for %d minutes, check msg expiry\n", (EXPIRY_CHECK_TIME/60)); @@ -144,13 +154,14 @@ int checkCloudConn() int opt = xmidtQOptmize(); if(opt) { - ParodusInfo("xmidtQ is optimized during connection down %d, ret %d\n", ret); ret = 2; + ParodusInfo("xmidtQ is optimized during connection down %d, ret %d\n", opt, ret); } } else { ParodusInfo("Received cloud status signal, proceed to event processing\n"); + pthread_mutex_unlock(get_global_cloud_status_mut()); break; } } @@ -164,7 +175,8 @@ int xmidtQOptmize() { long long currTime = 0; struct timespec ts; - int rv = 0; + int rv = 0, status = 0; + XmidtMsg *next_node = NULL; XmidtMsg *temp = NULL; temp = get_global_xmidthead(); @@ -224,7 +236,7 @@ int xmidtQOptmize() if(del) { - pthread_mutex_lock (&xmidt_mut); + /*pthread_mutex_lock (&xmidt_mut); wrp_free_struct( tempMsg); tempMsg = NULL; free( temp ); @@ -232,11 +244,35 @@ int xmidtQOptmize() ParodusInfo("Deleted successfully and returning..\n"); pthread_mutex_unlock (&xmidt_mut); decrement_XmidtQsize(); - ParodusInfo("XmidtQsize after delete is %d\n", get_XmidtQsize()); - rv = 1; + ParodusInfo("XmidtQsize after delete is %d\n", get_XmidtQsize());*/ + ParodusInfo("msg expired, updateXmidtState to DELETE\n"); + updateXmidtState(temp, DELETE); + status = deleteFromXmidtQ(&next_node); + temp = next_node; + if(status) + { + ParodusInfo("deleteFromXmidtQ success\n"); + rv = 1; + } + else + { + ParodusError("deleteFromXmidtQ failed\n"); + } + continue; + } + if(temp) + { + ParodusInfo("Move to tmp next\n"); + temp = temp->next; + if(temp) + { + ParodusInfo("temp next is not null\n"); + } + else + ParodusInfo("temp next is null\n"); } - temp = temp->next; } + ParodusInfo("xmidtQOptmize returns rv %d\n", rv); return rv; } @@ -334,18 +370,19 @@ void* processXmidtUpstreamMsg() XmidtMsg *next_node = NULL; int cv = 0; + if(get_parodus_init()) + { + ParodusInfo("Initial cloud connection is not established, Xmidt wait till connection up\n"); + pthread_mutex_lock(get_global_cloud_status_mut()); + pthread_cond_wait(get_global_cloud_status_cond(), get_global_cloud_status_mut()); + pthread_mutex_unlock(get_global_cloud_status_mut()); + ParodusInfo("Received cloud status signal proceed to event processing\n"); + } + xmidtQ = get_global_xmidthead(); while(FOREVER()) { - if(get_parodus_init()) - { - ParodusInfo("Initial cloud connection is not established, Xmidt wait till connection up\n"); - pthread_mutex_lock(get_global_cloud_status_mut()); - pthread_cond_wait(get_global_cloud_status_cond(), get_global_cloud_status_mut()); - pthread_mutex_unlock(get_global_cloud_status_mut()); - ParodusInfo("Received cloud status signal proceed to event processing\n"); - } pthread_mutex_lock (&xmidt_mut); ParodusPrint("mutex lock in xmidt consumer thread\n"); if (xmidtQ != NULL) @@ -362,7 +399,7 @@ void* processXmidtUpstreamMsg() switch(Data->state) { case PENDING: - ParodusPrint("state : PENDING\n"); + ParodusInfo("state : PENDING\n"); //send msg to server only when cloud connection is online. cv = checkCloudConn(); if (cv == 2) @@ -392,7 +429,7 @@ void* processXmidtUpstreamMsg() break; case SENT: - ParodusPrint("state : SENT\n"); + ParodusInfo("state : SENT\n"); ParodusPrint("Check cloud ack for matching transaction id\n"); ret = checkCloudACK(Data, Data->asyncHandle); if (ret) @@ -442,7 +479,7 @@ void* processXmidtUpstreamMsg() } break; case DELETE: - ParodusPrint("state : DELETE\n"); + ParodusInfo("state : DELETE\n"); status = deleteFromXmidtQ(&next_node); if(status) { @@ -477,10 +514,10 @@ void* processXmidtUpstreamMsg() pthread_mutex_unlock (&xmidt_mut); break; } - ParodusPrint("Before cond wait in xmidt consumer thread\n"); + ParodusInfo("Before cond wait in xmidt consumer thread\n"); pthread_cond_wait(&xmidt_con, &xmidt_mut); pthread_mutex_unlock (&xmidt_mut); - ParodusPrint("mutex unlock in xmidt thread after cond wait\n"); + ParodusInfo("mutex unlock in xmidt thread after cond wait\n"); xmidtQ = get_global_xmidthead(); } } @@ -830,7 +867,7 @@ int sendXmidtEventToServer(XmidtMsg *msgnode, wrp_msg_t * msg, rbusMethodAsyncHa free(notif_wrp_msg); notif_wrp_msg = NULL; } - ParodusPrint("sendXmidtEventToServer done\n"); + ParodusInfo("sendXmidtEventToServer done\n"); return rv; } @@ -1162,6 +1199,7 @@ static rbusError_t sendDataHandler(rbusHandle_t handle, char const* methodName, //generate transaction id to create outParams and send ack transaction_uuid = generate_transaction_uuid(); ParodusInfo("xmidt transaction_uuid generated is %s\n", transaction_uuid); + test++; //testing parseRbusInparamsToWrp(inParams, transaction_uuid, &wrpMsg); //xmidt send producer diff --git a/src/xmidtsend_rbus.h b/src/xmidtsend_rbus.h index c31b627..1c4a90e 100644 --- a/src/xmidtsend_rbus.h +++ b/src/xmidtsend_rbus.h @@ -34,12 +34,12 @@ extern "C" { #define INPARAMS_PATH "/tmp/inparams.txt" #define CLOUD_ACK_TIMEOUT_SEC 7 -#define CRITICAL_QOS_EXPIRE_TIME 30*60 +#define CRITICAL_QOS_EXPIRE_TIME 2*60 //30*60 #define HIGH_QOS_EXPIRE_TIME 25*60 #define MEDIUM_QOS_EXPIRE_TIME 20*60 #define LOW_QOS_EXPIRE_TIME 15*60 -#define EXPIRY_CHECK_TIME 5*60 //To check expiry in every 5 mins when cloud connection is down. +#define EXPIRY_CHECK_TIME 1*60 //To check expiry in every 5 mins when cloud connection is down. /*----------------------------------------------------------------------------*/ /* Data Structures */ /*----------------------------------------------------------------------------*/ From d3e758ccb44b0e76b87c8672ac1fb46adfa3b014 Mon Sep 17 00:00:00 2001 From: Sadhyama Vengilat Date: Mon, 12 Sep 2022 15:20:36 +0530 Subject: [PATCH 109/137] Remove test simulation and addional debug logs --- src/ParodusInternal.c | 1 + src/downstream.c | 25 ++++++++-------- src/partners_check.c | 6 +--- src/time.c | 1 - src/upstream.c | 4 ++- src/xmidtsend_rbus.c | 69 +++++++++++-------------------------------- src/xmidtsend_rbus.h | 8 ++--- 7 files changed, 37 insertions(+), 77 deletions(-) diff --git a/src/ParodusInternal.c b/src/ParodusInternal.c index fddbe34..cdbeff2 100644 --- a/src/ParodusInternal.c +++ b/src/ParodusInternal.c @@ -151,6 +151,7 @@ int readFromFile(const char *file_name, char **data) return 1; } + void timespec_diff(struct timespec *start, struct timespec *stop, struct timespec *diff) { diff --git a/src/downstream.c b/src/downstream.c index 2536b32..695750e 100644 --- a/src/downstream.c +++ b/src/downstream.c @@ -27,7 +27,9 @@ #include "partners_check.h" #include "ParodusInternal.h" #include "crud_interface.h" +#ifdef ENABLE_WEBCFGBIN #include "xmidtsend_rbus.h" +#endif /*----------------------------------------------------------------------------*/ /* Function Prototypes */ /*----------------------------------------------------------------------------*/ @@ -71,7 +73,7 @@ void listenerOnMessage(void * msg, size_t msgSize) if(rv > 0) { - ParodusInfo("\nDecoded recivedMsg of size:%d\n", rv); + ParodusPrint("\nDecoded recivedMsg of size:%d\n", rv); msgType = message->msg_type; ParodusInfo("msgType received:%d\n", msgType); @@ -90,10 +92,10 @@ void listenerOnMessage(void * msg, size_t msgSize) case WRP_MSG_TYPE__RETREIVE: case WRP_MSG_TYPE__DELETE: { - ParodusInfo("numOfClients registered is %d\n", get_numOfClients()); + ParodusPrint("numOfClients registered is %d\n", get_numOfClients()); partners_t *partnersList = NULL; int ret = validate_partner_id(message, &partnersList); - ParodusInfo("validate_partner_id returns %d\n", ret); + ParodusPrint("validate_partner_id returns %d\n", ret); if(ret < 0) { response = cJSON_CreateObject(); @@ -101,11 +103,9 @@ void listenerOnMessage(void * msg, size_t msgSize) cJSON_AddStringToObject(response, "message", "Invalid partner_id"); } - ParodusInfo("message->u.event.dest is %s\n", message->u.event.dest); destVal = strdup(((WRP_MSG_TYPE__EVENT == msgType) ? message->u.event.dest : ((WRP_MSG_TYPE__REQ == msgType) ? message->u.req.dest : message->u.crud.dest))); - ParodusInfo("destVal check\n"); - ParodusInfo("destVal %s\n", destVal); + if( (destVal != NULL) && (ret >= 0) ) { char *newDest = NULL; @@ -114,7 +114,6 @@ void listenerOnMessage(void * msg, size_t msgSize) { newDest = strtok(NULL , "/"); } - ParodusInfo("B4 newDest\n"); if(newDest != NULL) { parStrncpy(dest,newDest, sizeof(dest)); @@ -137,11 +136,11 @@ void listenerOnMessage(void * msg, size_t msgSize) while (NULL != temp) { - ParodusInfo("node is pointing to temp->service_name %s \n",temp->service_name); + ParodusPrint("node is pointing to temp->service_name %s \n",temp->service_name); // Sending message to registered clients if( strcmp(dest, temp->service_name) == 0) { - ParodusInfo("sending to nanomsg client %s\n", dest); + ParodusPrint("sending to nanomsg client %s\n", dest); bytes = nn_send(temp->sock, recivedMsg, msgSize, 0); ParodusInfo("sent downstream message to reg_client '%s'\n",temp->url); ParodusPrint("downstream bytes sent:%d\n", bytes); @@ -156,7 +155,7 @@ void listenerOnMessage(void * msg, size_t msgSize) /* check Downstream dest for CRUD requests */ if(destFlag ==0 && strcmp("parodus", dest)==0) { - ParodusInfo("Received CRUD request : dest : %s\n", dest); + ParodusPrint("Received CRUD request : dest : %s\n", dest); if ((message->u.crud.source == NULL) || (message->u.crud.transaction_uuid == NULL)) { ParodusError("Invalid request\n"); @@ -243,6 +242,7 @@ void listenerOnMessage(void * msg, size_t msgSize) } free(resp_msg); } + #ifdef ENABLE_WEBCFGBIN //To handle cloud ack events received from server for the xmidt sent messages. if((WRP_MSG_TYPE__EVENT == msgType) && (ret >= 0)) { @@ -255,7 +255,7 @@ void listenerOnMessage(void * msg, size_t msgSize) { ParodusInfo("Received cloud ack from server: transaction_uuid %s qos %d, rdr %d\n", message->u.event.transaction_uuid, message->u.event.qos, message->u.event.rdr); addToCloudAckQ(message->u.event.transaction_uuid, message->u.event.qos, message->u.event.rdr); - ParodusInfo("Added to cloud ack Q\n"); + ParodusPrint("Added to cloud ack Q\n"); } else { @@ -272,6 +272,7 @@ void listenerOnMessage(void * msg, size_t msgSize) ParodusInfo("cloud ack is ignored as max queue size is %d\n", get_parodus_cfg()->max_queue_size ); } } + #endif break; } @@ -281,7 +282,7 @@ void listenerOnMessage(void * msg, size_t msgSize) default: break; } - ParodusInfo("free for downstream decoded msg\n"); + ParodusPrint("free for downstream decoded msg\n"); wrp_free_struct(message); message = NULL; } diff --git a/src/partners_check.c b/src/partners_check.c index dfc74b1..2c46d0c 100644 --- a/src/partners_check.c +++ b/src/partners_check.c @@ -98,7 +98,7 @@ int validate_partner_id(wrp_msg_t *msg, partners_t **partnerIds) ParodusPrint("msg->u.event.partner_ids->partner_ids[%lu] = %s\n",i, msg->u.event.partner_ids->partner_ids[i]); if(strcasecmp(partnersList->partner_ids[j], msg->u.event.partner_ids->partner_ids[i]) == 0) { - ParodusPrint("partner_id match found\n"); + ParodusInfo("partner_id match found\n"); matchFlag = 1; break; } @@ -116,11 +116,8 @@ int validate_partner_id(wrp_msg_t *msg, partners_t **partnerIds) /* Commandline input partner_ids not matching with partner_ids from request, appending to request partner_ids*/ if(matchFlag != 1) { - ParodusPrint("count+partnersList->count %d\n", count+partnersList->count); (*partnerIds) = (partners_t *) malloc(sizeof(partners_t) + (sizeof(char *) * (count+partnersList->count))); - ParodusPrint("after partnerIds malloc\n"); (*partnerIds)->count = count+partnersList->count; - ParodusPrint("after (*partnerIds)->count\n"); for(i = 0; i < count; i++) { (*partnerIds)->partner_ids[i] = msg->u.event.partner_ids->partner_ids[i]; @@ -220,7 +217,6 @@ int validate_partner_id(wrp_msg_t *msg, partners_t **partnerIds) ParodusPrint("partner_id is not available to validate\n"); return 0; } - ParodusPrint("partner_id is not matched\n"); return 1; } diff --git a/src/time.c b/src/time.c index 407dd7b..d6eb742 100644 --- a/src/time.c +++ b/src/time.c @@ -25,7 +25,6 @@ void getCurrentTime(struct timespec *timer) { - //clock_gettime(CLOCK_REALTIME, timer); if( clock_gettime(CLOCK_REALTIME, timer) == -1 ) { ParodusError("clock gettime returns errno %d\n", errno ); diff --git a/src/upstream.c b/src/upstream.c index 0530bc5..f6307d3 100644 --- a/src/upstream.c +++ b/src/upstream.c @@ -603,6 +603,7 @@ void getServiceNameAndSendResponse(wrp_msg_t *msg, void **msg_bytes, size_t msg_ ParodusError("serviceName is NULL,not sending retrieve response to client\n"); } } + int sendUpstreamMsgToServer(void **resp_bytes, size_t resp_size) { void *appendData; @@ -639,6 +640,7 @@ int sendUpstreamMsgToServer(void **resp_bytes, size_t resp_size) ParodusError("Failed to send upstream as metadata packing is not successful\n"); sendRetStatus = 1; } - ParodusInfo("sendRetStatus is %d\n", sendRetStatus); + ParodusPrint("sendRetStatus is %d\n", sendRetStatus); + return sendRetStatus; } diff --git a/src/xmidtsend_rbus.c b/src/xmidtsend_rbus.c index cc3d7be..118aa0b 100644 --- a/src/xmidtsend_rbus.c +++ b/src/xmidtsend_rbus.c @@ -42,7 +42,7 @@ pthread_mutex_t xmidt_mut=PTHREAD_MUTEX_INITIALIZER; pthread_cond_t xmidt_con=PTHREAD_COND_INITIALIZER; pthread_mutex_t cloudack_mut=PTHREAD_MUTEX_INITIALIZER; -int test = 0; //testing + const char * contentTypeList[]={ "application/json", "avro/binary", @@ -121,32 +121,20 @@ void decrement_XmidtQsize() int checkCloudConn() { int ret = 1; - //if (!cloud_status_is_online ()) - if (test == 1) //test purpose. + if (!cloud_status_is_online ()) { ParodusInfo("cloud status is not online, wait till connection up\n"); int rv; struct timespec ts; - /*pthread_mutex_lock(get_global_cloud_status_mut()); - getCurrentTime(&ts); - ts.tv_sec += EXPIRY_CHECK_TIME; - ParodusInfo("checkCloudConn timeout at %lld\n", (long long) ts.tv_sec);*/ - while (1) { pthread_mutex_lock(get_global_cloud_status_mut()); getCurrentTime(&ts); ts.tv_sec += EXPIRY_CHECK_TIME; - ParodusInfo("checkCloudConn timeout at %lld\n", (long long) ts.tv_sec); - // - ParodusInfo("B4 pthread cond wait in checkCloudConn\n"); + ParodusPrint("checkCloudConn timeout at %lld\n", (long long) ts.tv_sec); rv = pthread_cond_timedwait(get_global_cloud_status_cond(), get_global_cloud_status_mut(), &ts); - if(test ==2 || test ==4) - { - rv = 0 ; - } if (rv == ETIMEDOUT) { ParodusInfo("Timedout. Cloud connection is down for %d minutes, check msg expiry\n", (EXPIRY_CHECK_TIME/60)); @@ -166,7 +154,7 @@ int checkCloudConn() } } } - ParodusInfo("checkCloudConn ret %d\n", ret); + ParodusPrint("checkCloudConn ret %d\n", ret); return ret; } @@ -236,22 +224,13 @@ int xmidtQOptmize() if(del) { - /*pthread_mutex_lock (&xmidt_mut); - wrp_free_struct( tempMsg); - tempMsg = NULL; - free( temp ); - temp = NULL; - ParodusInfo("Deleted successfully and returning..\n"); - pthread_mutex_unlock (&xmidt_mut); - decrement_XmidtQsize(); - ParodusInfo("XmidtQsize after delete is %d\n", get_XmidtQsize());*/ - ParodusInfo("msg expired, updateXmidtState to DELETE\n"); + ParodusPrint("msg expired, updateXmidtState to DELETE\n"); updateXmidtState(temp, DELETE); status = deleteFromXmidtQ(&next_node); temp = next_node; if(status) { - ParodusInfo("deleteFromXmidtQ success\n"); + ParodusPrint("deleteFromXmidtQ success\n"); rv = 1; } else @@ -262,17 +241,10 @@ int xmidtQOptmize() } if(temp) { - ParodusInfo("Move to tmp next\n"); temp = temp->next; - if(temp) - { - ParodusInfo("temp next is not null\n"); - } - else - ParodusInfo("temp next is null\n"); } } - ParodusInfo("xmidtQOptmize returns rv %d\n", rv); + ParodusPrint("xmidtQOptmize returns rv %d\n", rv); return rv; } @@ -306,7 +278,7 @@ void addToXmidtUpstreamQ(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle) message->state = PENDING; getCurrentTime(×); message->enqueueTime = (long long)times.tv_sec; - ParodusInfo("message->enqueueTime is %lld\n", message->enqueueTime); + ParodusPrint("message->enqueueTime is %lld\n", message->enqueueTime); message->sentTime = 0; //Increment queue size to handle max queue limit increment_XmidtQsize(); @@ -399,7 +371,7 @@ void* processXmidtUpstreamMsg() switch(Data->state) { case PENDING: - ParodusInfo("state : PENDING\n"); + ParodusPrint("state : PENDING\n"); //send msg to server only when cloud connection is online. cv = checkCloudConn(); if (cv == 2) @@ -429,7 +401,7 @@ void* processXmidtUpstreamMsg() break; case SENT: - ParodusInfo("state : SENT\n"); + ParodusPrint("state : SENT\n"); ParodusPrint("Check cloud ack for matching transaction id\n"); ret = checkCloudACK(Data, Data->asyncHandle); if (ret) @@ -441,7 +413,7 @@ void* processXmidtUpstreamMsg() getCurrentTime(&tms); currTime = (long long)tms.tv_sec; long long timeout_secs = (Data->sentTime) + CLOUD_ACK_TIMEOUT_SEC; - ParodusInfo("currTime %lld sentTime %lld CLOUD_ACK_TIMEOUT_SEC %d, timeout_secs %lld trans_id %s\n", currTime, Data->sentTime, CLOUD_ACK_TIMEOUT_SEC, timeout_secs, Data->msg->u.event.transaction_uuid); + ParodusPrint("currTime %lld sentTime %lld CLOUD_ACK_TIMEOUT_SEC %d, timeout_secs %lld trans_id %s\n", currTime, Data->sentTime, CLOUD_ACK_TIMEOUT_SEC, timeout_secs, Data->msg->u.event.transaction_uuid); if (currTime > timeout_secs) //ack timeout case { ParodusInfo("transaction id match not found, cloud ack timed out. Need to retry\n"); @@ -479,7 +451,7 @@ void* processXmidtUpstreamMsg() } break; case DELETE: - ParodusInfo("state : DELETE\n"); + ParodusPrint("state : DELETE\n"); status = deleteFromXmidtQ(&next_node); if(status) { @@ -502,7 +474,7 @@ void* processXmidtUpstreamMsg() // circling back to 1st node if((cv ==2) || (xmidtQ == NULL && get_global_xmidthead() != NULL)) { - ParodusInfo("circling back to 1st node, cv %d\n", cv); + ParodusPrint("circling back to 1st node, cv %d\n", cv); xmidtQ = get_global_xmidthead(); } sleep(1); @@ -514,10 +486,10 @@ void* processXmidtUpstreamMsg() pthread_mutex_unlock (&xmidt_mut); break; } - ParodusInfo("Before cond wait in xmidt consumer thread\n"); + ParodusPrint("Before cond wait in xmidt consumer thread\n"); pthread_cond_wait(&xmidt_con, &xmidt_mut); pthread_mutex_unlock (&xmidt_mut); - ParodusInfo("mutex unlock in xmidt thread after cond wait\n"); + ParodusPrint("mutex unlock in xmidt thread after cond wait\n"); xmidtQ = get_global_xmidthead(); } } @@ -769,14 +741,11 @@ int sendXmidtEventToServer(XmidtMsg *msgnode, wrp_msg_t * msg, rbusMethodAsyncHa ParodusPrint("The event is having high qos retry again\n"); ParodusInfo("Wait till connection is Up\n"); rv = checkCloudConn(); - //pthread_mutex_lock(get_global_cloud_status_mut()); - //pthread_cond_wait(get_global_cloud_status_cond(), get_global_cloud_status_mut()); if(rv == 2) { printSendMsgData("queue optimized during send. retry", notif_wrp_msg->u.event.qos, notif_wrp_msg->u.event.dest, notif_wrp_msg->u.event.transaction_uuid); break; } - //pthread_mutex_unlock(get_global_cloud_status_mut()); ParodusInfo("Received cloud status signal proceed to retry\n"); printSendMsgData("send to server after cloud reconnect", notif_wrp_msg->u.event.qos, notif_wrp_msg->u.event.dest, notif_wrp_msg->u.event.transaction_uuid); } @@ -867,7 +836,7 @@ int sendXmidtEventToServer(XmidtMsg *msgnode, wrp_msg_t * msg, rbusMethodAsyncHa free(notif_wrp_msg); notif_wrp_msg = NULL; } - ParodusInfo("sendXmidtEventToServer done\n"); + ParodusPrint("sendXmidtEventToServer done\n"); return rv; } @@ -884,7 +853,7 @@ void createOutParamsandSendAck(wrp_msg_t *msg, rbusMethodAsyncHandle_t asyncHand rbusObject_SetValue(outParams, "msg_type", value); rbusValue_Release(value); - ParodusInfo("statuscode %d statusMsg %s\n", statuscode, errorMsg); + ParodusPrint("statuscode %d statusMsg %s\n", statuscode, errorMsg); rbusValue_Init(&value); rbusValue_SetInt32(value, statuscode); rbusObject_SetValue(outParams, "status", value); @@ -912,7 +881,6 @@ void createOutParamsandSendAck(wrp_msg_t *msg, rbusMethodAsyncHandle_t asyncHand if(msg->u.event.dest !=NULL) { - ParodusPrint("msg->u.event.dest is %s\n", msg->u.event.dest); rbusValue_Init(&value); rbusValue_SetString(value, msg->u.event.dest); rbusObject_SetValue(outParams, "dest", value); @@ -921,7 +889,6 @@ void createOutParamsandSendAck(wrp_msg_t *msg, rbusMethodAsyncHandle_t asyncHand if(msg->u.event.content_type !=NULL) { - ParodusPrint("msg->u.event.content_type is %s\n", msg->u.event.content_type); rbusValue_Init(&value); rbusValue_SetString(value, msg->u.event.content_type); rbusObject_SetValue(outParams, "content_type", value); @@ -954,7 +921,6 @@ void createOutParamsandSendAck(wrp_msg_t *msg, rbusMethodAsyncHandle_t asyncHand return; } - ParodusPrint("B4 async send callback\n"); err = rbusMethod_SendAsyncResponse(asyncHandle, error, outParams); if(err != RBUS_ERROR_SUCCESS) @@ -1199,7 +1165,6 @@ static rbusError_t sendDataHandler(rbusHandle_t handle, char const* methodName, //generate transaction id to create outParams and send ack transaction_uuid = generate_transaction_uuid(); ParodusInfo("xmidt transaction_uuid generated is %s\n", transaction_uuid); - test++; //testing parseRbusInparamsToWrp(inParams, transaction_uuid, &wrpMsg); //xmidt send producer diff --git a/src/xmidtsend_rbus.h b/src/xmidtsend_rbus.h index 1c4a90e..477b085 100644 --- a/src/xmidtsend_rbus.h +++ b/src/xmidtsend_rbus.h @@ -34,12 +34,12 @@ extern "C" { #define INPARAMS_PATH "/tmp/inparams.txt" #define CLOUD_ACK_TIMEOUT_SEC 7 -#define CRITICAL_QOS_EXPIRE_TIME 2*60 //30*60 +#define CRITICAL_QOS_EXPIRE_TIME 30*60 #define HIGH_QOS_EXPIRE_TIME 25*60 #define MEDIUM_QOS_EXPIRE_TIME 20*60 #define LOW_QOS_EXPIRE_TIME 15*60 -#define EXPIRY_CHECK_TIME 1*60 //To check expiry in every 5 mins when cloud connection is down. +#define EXPIRY_CHECK_TIME 5*60 //To check expiry in every 5 mins when cloud connection is down. /*----------------------------------------------------------------------------*/ /* Data Structures */ /*----------------------------------------------------------------------------*/ @@ -115,10 +115,6 @@ void checkMaxQandOptimize(); void checkMsgExpiry(); void mapXmidtStatusToStatusMessage(int status, char **message); int xmidtQOptmize(); -//Testing -void set_global_TransID(char *transid); -char *get_global_TransID(); -// #ifdef __cplusplus } #endif From 26d409d8844adf59b7cfb238a9c89d091bc1961f Mon Sep 17 00:00:00 2001 From: Sadhyama Vengilat Date: Tue, 13 Sep 2022 16:48:39 +0530 Subject: [PATCH 110/137] To fix local pc build failure in tests --- src/xmidtsend_rbus.c | 4 ++-- tests/CMakeLists.txt | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/xmidtsend_rbus.c b/src/xmidtsend_rbus.c index 118aa0b..27fbb75 100644 --- a/src/xmidtsend_rbus.c +++ b/src/xmidtsend_rbus.c @@ -416,7 +416,7 @@ void* processXmidtUpstreamMsg() ParodusPrint("currTime %lld sentTime %lld CLOUD_ACK_TIMEOUT_SEC %d, timeout_secs %lld trans_id %s\n", currTime, Data->sentTime, CLOUD_ACK_TIMEOUT_SEC, timeout_secs, Data->msg->u.event.transaction_uuid); if (currTime > timeout_secs) //ack timeout case { - ParodusInfo("transaction id match not found, cloud ack timed out. Need to retry\n"); + ParodusPrint("transaction id match not found, cloud ack timed out. Need to retry\n"); cv = checkCloudConn(); if (cv == 2) { @@ -1327,7 +1327,7 @@ int checkCloudACK(XmidtMsg *xmdnode, rbusMethodAsyncHandle_t asyncHandle) } cloudnode= cloudnode->next; } - ParodusError("checkCloudACK returns failure\n"); + ParodusPrint("checkCloudACK returns failure\n"); return 0; } diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index feee600..9f16c73 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -212,7 +212,7 @@ target_link_libraries (test_auth_token -lcmocka # test_auth_token_more #------------------------------------------------------------------------------- add_test(NAME test_auth_token_more COMMAND ${MEMORY_CHECK} ./test_auth_token_more) -add_executable(test_auth_token_more test_auth_token_more.c ../src/config.c ../src/auth_token.c ../src/string_helpers.c) +add_executable(test_auth_token_more test_auth_token_more.c ../src/config.c ../src/auth_token.c ../src/string_helpers.c ../src/config.c) target_link_libraries (test_auth_token_more -lcmocka -Wl,--no-as-needed -lcimplog -lcjson -lcjwt -ltrower-base64 -lssl -lcrypto -lrt -lm -lcurl -luuid @@ -265,7 +265,7 @@ target_link_libraries (test_upstream_sock -lcmocka gcov -lcunit -lcimplog # test_downstream #------------------------------------------------------------------------------- add_test(NAME test_downstream COMMAND ${MEMORY_CHECK} ./test_downstream) -add_executable(test_downstream test_downstream.c ../src/downstream.c ../src/string_helpers.c) +add_executable(test_downstream test_downstream.c ../src/downstream.c ../src/string_helpers.c ../src/config.c) target_link_libraries (test_downstream -lcmocka gcov -lcunit -lcimplog -lwrp-c -luuid -lpthread -lmsgpackc -lnopoll -Wl,--no-as-needed -lcjson -lcjwt -ltrower-base64 @@ -275,7 +275,7 @@ target_link_libraries (test_downstream -lcmocka gcov -lcunit -lcimplog # test_downstream_more #------------------------------------------------------------------------------- add_test(NAME test_downstream_more COMMAND ${MEMORY_CHECK} ./test_downstream_more) -add_executable(test_downstream_more test_downstream_more.c ../src/downstream.c ../src/string_helpers.c) +add_executable(test_downstream_more test_downstream_more.c ../src/downstream.c ../src/string_helpers.c ../src/config.c) target_link_libraries (test_downstream_more -lcmocka ${PARODUS_COMMON_LIBS} ) #------------------------------------------------------------------------------- From 6f7332d0549925c44a8f1d54955815765d58c3ca Mon Sep 17 00:00:00 2001 From: Sadhyama Vengilat Date: Thu, 15 Sep 2022 16:51:04 +0530 Subject: [PATCH 111/137] To add 200ms sleep to process ack and handle partnerid mismatch case --- src/downstream.c | 3 +-- src/partners_check.c | 19 ++++++++++++++++++- src/xmidtsend_rbus.c | 12 +++++++----- 3 files changed, 26 insertions(+), 8 deletions(-) diff --git a/src/downstream.c b/src/downstream.c index 695750e..0180bb6 100644 --- a/src/downstream.c +++ b/src/downstream.c @@ -93,8 +93,7 @@ void listenerOnMessage(void * msg, size_t msgSize) case WRP_MSG_TYPE__DELETE: { ParodusPrint("numOfClients registered is %d\n", get_numOfClients()); - partners_t *partnersList = NULL; - int ret = validate_partner_id(message, &partnersList); + int ret = validate_partner_id(message, NULL); ParodusPrint("validate_partner_id returns %d\n", ret); if(ret < 0) { diff --git a/src/partners_check.c b/src/partners_check.c index 2c46d0c..7a88d66 100644 --- a/src/partners_check.c +++ b/src/partners_check.c @@ -114,7 +114,7 @@ int validate_partner_id(wrp_msg_t *msg, partners_t **partnerIds) } /* Commandline input partner_ids not matching with partner_ids from request, appending to request partner_ids*/ - if(matchFlag != 1) + if(matchFlag != 1 && partnerIds !=NULL) { (*partnerIds) = (partners_t *) malloc(sizeof(partners_t) + (sizeof(char *) * (count+partnersList->count))); (*partnerIds)->count = count+partnersList->count; @@ -132,6 +132,23 @@ int validate_partner_id(wrp_msg_t *msg, partners_t **partnerIds) i++; } } + else if (matchFlag != 1 && partnerIds == NULL) + { + ParodusError("partner_id match not found: command line input %s , msg partner_id %s\n", temp, msg->u.event.partner_ids->partner_ids[0]); + if(partnersList != NULL) + { + for(j=0; jcount; j++) + { + if(NULL != partnersList->partner_ids[j]) + { + free(partnersList->partner_ids[j]); + } + } + free(partnersList); + } + free(partnerId); + return 1; + } } else { diff --git a/src/xmidtsend_rbus.c b/src/xmidtsend_rbus.c index 27fbb75..b3cac30 100644 --- a/src/xmidtsend_rbus.c +++ b/src/xmidtsend_rbus.c @@ -22,6 +22,7 @@ */ #include +#include #include #include "upstream.h" #include "ParodusInternal.h" @@ -58,7 +59,7 @@ bool highQosValueCheck(int qos) { if(qos > 24) { - ParodusInfo("The qos value is high\n"); + ParodusPrint("The qos value is high\n"); return true; } else @@ -416,7 +417,7 @@ void* processXmidtUpstreamMsg() ParodusPrint("currTime %lld sentTime %lld CLOUD_ACK_TIMEOUT_SEC %d, timeout_secs %lld trans_id %s\n", currTime, Data->sentTime, CLOUD_ACK_TIMEOUT_SEC, timeout_secs, Data->msg->u.event.transaction_uuid); if (currTime > timeout_secs) //ack timeout case { - ParodusPrint("transaction id match not found, cloud ack timed out. Need to retry\n"); + ParodusPrint("transaction id %s match not found, cloud ack timed out. Need to retry\n", Data->msg->u.event.transaction_uuid); cv = checkCloudConn(); if (cv == 2) { @@ -464,6 +465,8 @@ void* processXmidtUpstreamMsg() } break; } + //sleep of 200 ms to process each msg ack and to avoid cpu load. + usleep(200*1000); if(cv !=2 && xmidtQ !=NULL) { @@ -477,7 +480,6 @@ void* processXmidtUpstreamMsg() ParodusPrint("circling back to 1st node, cv %d\n", cv); xmidtQ = get_global_xmidthead(); } - sleep(1); } else { @@ -1382,7 +1384,7 @@ int deleteCloudACKNode(char* trans_id) ParodusError("Invalid value for trans_id\n"); return 0; } - ParodusInfo("cloud ack to be deleted with trans_id: %s\n", trans_id); + ParodusPrint("cloud ack to be deleted with trans_id: %s\n", trans_id); prev_node = NULL; pthread_mutex_lock (&cloudack_mut); @@ -1416,7 +1418,7 @@ int deleteCloudACKNode(char* trans_id) free( curr_node ); } curr_node = NULL; - ParodusInfo("Deleted successfully and returning..\n"); + ParodusPrint("Deleted successfully and returning..\n"); pthread_mutex_unlock (&cloudack_mut); return 1; } From 79d8a84c2ebfcbfdd4bd292e1b8b1b9f5809912a Mon Sep 17 00:00:00 2001 From: Sadhyama Vengilat Date: Thu, 15 Sep 2022 20:03:01 +0530 Subject: [PATCH 112/137] Add sleep 1s to avoid cpu load --- src/xmidtsend_rbus.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/xmidtsend_rbus.c b/src/xmidtsend_rbus.c index b3cac30..f3cd04c 100644 --- a/src/xmidtsend_rbus.c +++ b/src/xmidtsend_rbus.c @@ -177,7 +177,7 @@ int xmidtQOptmize() int del = 0; wrp_msg_t * tempMsg = temp->msg; - ParodusInfo("qos %d currTime %lu enqueueTime %lu\n", tempMsg->u.event.qos, currTime, temp->enqueueTime); + ParodusPrint("qos %d currTime %lu enqueueTime %lu\n", tempMsg->u.event.qos, currTime, temp->enqueueTime); if(tempMsg->u.event.qos > 74) { if((currTime - temp->enqueueTime) > CRITICAL_QOS_EXPIRE_TIME) @@ -465,8 +465,8 @@ void* processXmidtUpstreamMsg() } break; } - //sleep of 200 ms to process each msg ack and to avoid cpu load. - usleep(200*1000); + //sleep of 1s to process each msg ack and to avoid cpu load. + sleep(1); if(cv !=2 && xmidtQ !=NULL) { @@ -1554,7 +1554,7 @@ void checkMaxQandOptimize() ParodusPrint("checkMaxQandOptimize . XmidtQsize is %d\n" , get_XmidtQsize()); if(get_XmidtQsize() > 0 && get_XmidtQsize() == get_parodus_cfg()->max_queue_size) { - ParodusInfo("Max Queue size reached, check and optimize\n"); + ParodusPrint("Max Queue size reached, check and optimize\n"); //Traverse through XmidtMsgQ list and set low qos msgs to DELETE XmidtMsg *temp = NULL; From 5ddac7dc4796fb0fbd961a320cd5e683974f5e9c Mon Sep 17 00:00:00 2001 From: Sadhyama Vengilat Date: Fri, 16 Sep 2022 20:14:05 +0530 Subject: [PATCH 113/137] Reduce debug log --- src/xmidtsend_rbus.c | 18 +----------------- 1 file changed, 1 insertion(+), 17 deletions(-) diff --git a/src/xmidtsend_rbus.c b/src/xmidtsend_rbus.c index f3cd04c..fb635b7 100644 --- a/src/xmidtsend_rbus.c +++ b/src/xmidtsend_rbus.c @@ -709,11 +709,6 @@ int sendXmidtEventToServer(XmidtMsg *msgnode, wrp_msg_t * msg, rbusMethodAsyncHa ParodusPrint("statusMsg is %s\n",errorMsg); createOutParamsandSendAck(msg, asyncHandle, errorMsg, WRP_ENCODE_FAILURE, RBUS_ERROR_INVALID_RESPONSE_FROM_DESTINATION); updateXmidtState(msgnode, DELETE); - /*ParodusPrint("wrp_free_struct\n"); - if(notif_wrp_msg != NULL) - { - wrp_free_struct(notif_wrp_msg); - }*/ if(notif_wrp_msg !=NULL) { ParodusPrint("notif_wrp_msg->u.event.source free\n"); @@ -799,12 +794,6 @@ int sendXmidtEventToServer(XmidtMsg *msgnode, wrp_msg_t * msg, rbusMethodAsyncHa } } - /*ParodusInfo("B4 notif wrp_free_struct\n"); - if(notif_wrp_msg != NULL) - { - wrp_free_struct(notif_wrp_msg); - }*/ - if(msg_bytes != NULL) { free(msg_bytes); @@ -821,11 +810,6 @@ int sendXmidtEventToServer(XmidtMsg *msgnode, wrp_msg_t * msg, rbusMethodAsyncHa updateXmidtState(msgnode, DELETE); } - /*if(msg->u.event.source !=NULL) - { - free(msg->u.event.source); - msg->u.event.source = NULL; - }*/ if(notif_wrp_msg !=NULL) { ParodusPrint("notif_wrp_msg->u.event.source free\n"); @@ -1171,7 +1155,7 @@ static rbusError_t sendDataHandler(rbusHandle_t handle, char const* methodName, //xmidt send producer addToXmidtUpstreamQ(wrpMsg, asyncHandle); - ParodusInfo("sendDataHandler returned %d\n", RBUS_ERROR_ASYNC_RESPONSE); + ParodusPrint("sendDataHandler returned %d\n", RBUS_ERROR_ASYNC_RESPONSE); return RBUS_ERROR_ASYNC_RESPONSE; } else From 2e11d7e3ba57e558cf6ff78fbcbb23cd5b8d90b2 Mon Sep 17 00:00:00 2001 From: Sadhyama Vengilat Date: Mon, 19 Sep 2022 16:49:16 +0530 Subject: [PATCH 114/137] To skip DELETE state and logging multiple times during expiry --- src/xmidtsend_rbus.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/xmidtsend_rbus.c b/src/xmidtsend_rbus.c index fb635b7..7810934 100644 --- a/src/xmidtsend_rbus.c +++ b/src/xmidtsend_rbus.c @@ -676,7 +676,7 @@ int sendXmidtEventToServer(XmidtMsg *msgnode, wrp_msg_t * msg, rbusMethodAsyncHa if(msg->u.event.content_type != NULL) { notif_wrp_msg->u.event.content_type = msg->u.event.content_type; - ParodusInfo("content_type is %s\n",notif_wrp_msg->u.event.content_type); + ParodusPrint("content_type is %s\n",notif_wrp_msg->u.event.content_type); } if(msg->u.event.payload != NULL) @@ -1485,6 +1485,12 @@ void checkMsgExpiry() currTime= (long long)ts.tv_sec; wrp_msg_t * tempMsg = temp->msg; ParodusPrint("qos %d currTime %lu enqueueTime %lu\n", tempMsg->u.event.qos, currTime, temp->enqueueTime); + if(temp->state == DELETE) + { + ParodusPrint("msg is already in DELETE state and about to delete, skipping state update. transid %s\n", tempMsg->u.event.transaction_uuid); + temp = temp->next; + continue; + } if(tempMsg->u.event.qos > 74) { From f7412f9710e0097880cf789caddb296bd3f0e953 Mon Sep 17 00:00:00 2001 From: Thanusha D Date: Mon, 19 Sep 2022 16:59:12 +0530 Subject: [PATCH 115/137] Changed Realtime clock to monotonic clock in backoff delay --- src/connection.c | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/src/connection.c b/src/connection.c index 08b7873..5123631 100644 --- a/src/connection.c +++ b/src/connection.c @@ -296,6 +296,7 @@ void calc_random_expiration (int random_num1, int random_num2, backoff_timer_t * /* Add delay to expire time */ add_timespec (&ts_delay, ts); + ParodusInfo("Added delay to expire time\n"); } void terminate_backoff_delay (void) @@ -326,25 +327,38 @@ static int backoff_delay (backoff_timer_t *timer) int rtn; // periodically update the health file. - clock_gettime (CLOCK_REALTIME, &ts); + clock_gettime (CLOCK_MONOTONIC, &ts); if ((ts.tv_sec - timer->ts.tv_sec) >= UPDATE_HEALTH_FILE_INTERVAL_SECS) { start_conn_in_progress (timer->start_time); timer->ts.tv_sec += UPDATE_HEALTH_FILE_INTERVAL_SECS; } calc_random_expiration (random(), random(), timer, &ts); + ParodusInfo("After calc_random_expiration.\n"); + + ParodusInfo("Timer value - start_time : %lu, backoffRetrytime sec : %ld, nsec : %ld, count : %d, max_count : %d, delay - %d\n", timer->start_time, timer->ts.tv_sec, timer->ts.tv_nsec, timer->count, timer->max_count, timer->delay); + + ParodusInfo("backoffRetryTime %ld secs %ld nsecs\n", ts.tv_sec, ts.tv_nsec); pthread_mutex_lock (&backoff_delay_mut); // The condition variable will only be set if we shut down. + ParodusInfo("Before pthread_cond_timedwait...\n"); rtn = pthread_cond_timedwait (&backoff_delay_con, &backoff_delay_mut, &ts); + ParodusInfo("After pthread_cond_timedwait...\n"); pthread_mutex_unlock (&backoff_delay_mut); + ParodusInfo("After pthread_mutex_unlock...\n"); - if (g_shutdown) + if (g_shutdown) { + ParodusInfo("Backoff shutdown\n"); return BACKOFF_SHUTDOWN; + } if ((rtn != 0) && (rtn != ETIMEDOUT)) { ParodusError ("pthread_cond_timedwait error (%d) in backoff_delay.\n", rtn); return BACKOFF_ERR; } + if (rtn == ETIMEDOUT) { + ParodusInfo("pthread_cond_timedwait timeout rtn = (%d)\n", rtn); + } return BACKOFF_DELAY_TAKEN; } From 3e30328738ac3de06153a1c50a121c700710dd86 Mon Sep 17 00:00:00 2001 From: Sadhyama Vengilat Date: Mon, 19 Sep 2022 20:03:18 +0530 Subject: [PATCH 116/137] Update latest wrp-c git tag --- CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index fed0b27..e7e541b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -172,8 +172,8 @@ add_dependencies(libcimplog cimplog) ExternalProject_Add(wrp-c DEPENDS trower-base64 msgpack cimplog PREFIX ${CMAKE_CURRENT_BINARY_DIR}/_prefix/wrp-c - GIT_REPOSITORY https://github.com/Thanusha-D/wrp-c.git - GIT_TAG add_fields + GIT_REPOSITORY https://github.com/xmidt-org/wrp-c.git + GIT_TAG "b5ef4d10cb39905908788bc89ab3e4dab201db8a" CMAKE_ARGS += -DCMAKE_INSTALL_PREFIX=${INSTALL_DIR} -DMSGPACK_ENABLE_CXX=OFF -DMSGPACK_BUILD_EXAMPLES=OFF From 6e5ecc87f9e217a4b62cc0ef19781c682b1157c6 Mon Sep 17 00:00:00 2001 From: Sadhyama Vengilat Date: Tue, 20 Sep 2022 17:14:26 +0530 Subject: [PATCH 117/137] send rbus callback to caller during msg expiry --- src/xmidtsend_rbus.c | 33 ++++++++++++++++++++++++++++++++- src/xmidtsend_rbus.h | 3 ++- 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/src/xmidtsend_rbus.c b/src/xmidtsend_rbus.c index 7810934..774576c 100644 --- a/src/xmidtsend_rbus.c +++ b/src/xmidtsend_rbus.c @@ -166,6 +166,7 @@ int xmidtQOptmize() struct timespec ts; int rv = 0, status = 0; XmidtMsg *next_node = NULL; + char *errorMsg = NULL; XmidtMsg *temp = NULL; temp = get_global_xmidthead(); @@ -227,6 +228,10 @@ int xmidtQOptmize() { ParodusPrint("msg expired, updateXmidtState to DELETE\n"); updateXmidtState(temp, DELETE); + //rbus callback to caller + mapXmidtStatusToStatusMessage(MSG_EXPIRED, &errorMsg); + ParodusPrint("statusMsg is %s\n",errorMsg); + createOutParamsandSendAck(temp->msg, temp->asyncHandle, errorMsg, MSG_EXPIRED, RBUS_ERROR_INVALID_RESPONSE_FROM_DESTINATION); status = deleteFromXmidtQ(&next_node); temp = next_node; if(status) @@ -1475,6 +1480,7 @@ void checkMsgExpiry() { long long currTime = 0; struct timespec ts; + char *errorMsg = NULL; XmidtMsg *temp = NULL; temp = get_global_xmidthead(); @@ -1498,6 +1504,10 @@ void checkMsgExpiry() if((currTime - temp->enqueueTime) > CRITICAL_QOS_EXPIRE_TIME) { ParodusInfo("Critical qos 30 mins expired, set to DELETE. qos %d transid %s\n", tempMsg->u.event.qos, tempMsg->u.event.transaction_uuid); + //rbus callback to caller + mapXmidtStatusToStatusMessage(MSG_EXPIRED, &errorMsg); + ParodusPrint("statusMsg is %s\n",errorMsg); + createOutParamsandSendAck(temp->msg, temp->asyncHandle, errorMsg, MSG_EXPIRED, RBUS_ERROR_INVALID_RESPONSE_FROM_DESTINATION); updateXmidtState(temp, DELETE); } } @@ -1507,6 +1517,10 @@ void checkMsgExpiry() if((currTime - temp->enqueueTime) > HIGH_QOS_EXPIRE_TIME) { ParodusInfo("High qos 25 mins expired, set to DELETE. qos %d transid %s\n", tempMsg->u.event.qos, tempMsg->u.event.transaction_uuid); + //rbus callback to caller + mapXmidtStatusToStatusMessage(MSG_EXPIRED, &errorMsg); + ParodusPrint("statusMsg is %s\n",errorMsg); + createOutParamsandSendAck(temp->msg, temp->asyncHandle, errorMsg, MSG_EXPIRED, RBUS_ERROR_INVALID_RESPONSE_FROM_DESTINATION); updateXmidtState(temp, DELETE); } } @@ -1516,6 +1530,10 @@ void checkMsgExpiry() if((currTime - temp->enqueueTime) > MEDIUM_QOS_EXPIRE_TIME) { ParodusInfo("Medium qos 20 mins expired, set to DELETE. qos %d transid %s\n", tempMsg->u.event.qos, tempMsg->u.event.transaction_uuid); + //rbus callback to caller + mapXmidtStatusToStatusMessage(MSG_EXPIRED, &errorMsg); + ParodusPrint("statusMsg is %s\n",errorMsg); + createOutParamsandSendAck(temp->msg, temp->asyncHandle, errorMsg, MSG_EXPIRED, RBUS_ERROR_INVALID_RESPONSE_FROM_DESTINATION); updateXmidtState(temp, DELETE); } } @@ -1525,6 +1543,10 @@ void checkMsgExpiry() if((currTime - temp->enqueueTime) > LOW_QOS_EXPIRE_TIME) { ParodusInfo("Low qos 15 mins expired, set to DELETE. qos %d transid %s\n", tempMsg->u.event.qos, tempMsg->u.event.transaction_uuid); + //rbus callback to caller + mapXmidtStatusToStatusMessage(MSG_EXPIRED, &errorMsg); + ParodusPrint("statusMsg is %s\n",errorMsg); + createOutParamsandSendAck(temp->msg, temp->asyncHandle, errorMsg, MSG_EXPIRED, RBUS_ERROR_INVALID_RESPONSE_FROM_DESTINATION); updateXmidtState(temp, DELETE); } } @@ -1562,6 +1584,11 @@ void checkMaxQandOptimize() else { ParodusInfo("Max Queue size reached. Low qos %d, set to DELETE state\n", qos); + //rbus callback to caller + char *errorMsg = NULL; + mapXmidtStatusToStatusMessage(QUEUE_SIZE_EXCEEDED, &errorMsg); + ParodusPrint("statusMsg is %s\n",errorMsg); + createOutParamsandSendAck(temp->msg, temp->asyncHandle, errorMsg, QUEUE_SIZE_EXCEEDED, RBUS_ERROR_INVALID_RESPONSE_FROM_DESTINATION); updateXmidtState(temp, DELETE); } temp = temp->next; @@ -1630,10 +1657,14 @@ void mapXmidtStatusToStatusMessage(int status, char **message) { result = strdup("send to server, qos semantics are disabled"); } + else if (status == MSG_EXPIRED) + { + result = strdup("msg expired"); + } else { result = strdup("Unknown Error"); } - ParodusPrint("Xmidt status msg %s\n", result); + ParodusInfo("Xmidt status message: %s\n", result); *message = result; } diff --git a/src/xmidtsend_rbus.h b/src/xmidtsend_rbus.h index 477b085..bd017f6 100644 --- a/src/xmidtsend_rbus.h +++ b/src/xmidtsend_rbus.h @@ -76,7 +76,8 @@ typedef enum QUEUE_SIZE_EXCEEDED = 102, WRP_ENCODE_FAILURE = 103, MSG_PROCESSING_FAILED = 104, - QOS_SEMANTICS_DISABLED = 105 + QOS_SEMANTICS_DISABLED = 105, + MSG_EXPIRED = 106 } XMIDT_STATUS; typedef enum From 7eae3da3f2eb749f3250e098e84647b6132835af Mon Sep 17 00:00:00 2001 From: Sadhyama Vengilat Date: Tue, 20 Sep 2022 17:41:46 +0530 Subject: [PATCH 118/137] send rbus callback when queue optimized --- src/xmidtsend_rbus.c | 14 +++++++++----- src/xmidtsend_rbus.h | 3 ++- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/src/xmidtsend_rbus.c b/src/xmidtsend_rbus.c index 774576c..47d5a15 100644 --- a/src/xmidtsend_rbus.c +++ b/src/xmidtsend_rbus.c @@ -1586,9 +1586,9 @@ void checkMaxQandOptimize() ParodusInfo("Max Queue size reached. Low qos %d, set to DELETE state\n", qos); //rbus callback to caller char *errorMsg = NULL; - mapXmidtStatusToStatusMessage(QUEUE_SIZE_EXCEEDED, &errorMsg); + mapXmidtStatusToStatusMessage(QUEUE_OPTIMIZED, &errorMsg); ParodusPrint("statusMsg is %s\n",errorMsg); - createOutParamsandSendAck(temp->msg, temp->asyncHandle, errorMsg, QUEUE_SIZE_EXCEEDED, RBUS_ERROR_INVALID_RESPONSE_FROM_DESTINATION); + createOutParamsandSendAck(temp->msg, temp->asyncHandle, errorMsg, QUEUE_OPTIMIZED, RBUS_ERROR_INVALID_RESPONSE_FROM_DESTINATION); updateXmidtState(temp, DELETE); } temp = temp->next; @@ -1639,7 +1639,7 @@ void mapXmidtStatusToStatusMessage(int status, char **message) } else if (status == CLIENT_DISCONNECT) { - result = strdup("send failed due to client disconnect"); + result = strdup("Send failed due to client disconnect"); } else if (status == QUEUE_SIZE_EXCEEDED) { @@ -1655,11 +1655,15 @@ void mapXmidtStatusToStatusMessage(int status, char **message) } else if (status == QOS_SEMANTICS_DISABLED) { - result = strdup("send to server, qos semantics are disabled"); + result = strdup("Send to server, qos semantics are disabled"); } else if (status == MSG_EXPIRED) { - result = strdup("msg expired"); + result = strdup("Message expired"); + } + else if (status == QUEUE_OPTIMIZED) + { + result = strdup("Message deleted after queue optimized"); } else { diff --git a/src/xmidtsend_rbus.h b/src/xmidtsend_rbus.h index bd017f6..8a5870f 100644 --- a/src/xmidtsend_rbus.h +++ b/src/xmidtsend_rbus.h @@ -77,7 +77,8 @@ typedef enum WRP_ENCODE_FAILURE = 103, MSG_PROCESSING_FAILED = 104, QOS_SEMANTICS_DISABLED = 105, - MSG_EXPIRED = 106 + MSG_EXPIRED = 106, + QUEUE_OPTIMIZED = 107 } XMIDT_STATUS; typedef enum From 2dd392dac6089231fd33f9437fd9794fd6fa1c46 Mon Sep 17 00:00:00 2001 From: Guru Chandru Date: Wed, 21 Sep 2022 18:02:05 +0530 Subject: [PATCH 119/137] Adding cond attribute for MONOTONIC wait --- src/connection.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/connection.c b/src/connection.c index 5123631..abe3f15 100644 --- a/src/connection.c +++ b/src/connection.c @@ -326,6 +326,12 @@ static int backoff_delay (backoff_timer_t *timer) struct timespec ts; int rtn; + pthread_condattr_t backoff_delay_cond_attr; + + pthread_condattr_init (&backoff_delay_cond_attr); + pthread_condattr_setclock (&backoff_delay_cond_attr, CLOCK_MONOTONIC); + pthread_cond_init (&backoff_delay_con, &backoff_delay_cond_attr); + // periodically update the health file. clock_gettime (CLOCK_MONOTONIC, &ts); if ((ts.tv_sec - timer->ts.tv_sec) >= UPDATE_HEALTH_FILE_INTERVAL_SECS) { @@ -348,6 +354,8 @@ static int backoff_delay (backoff_timer_t *timer) pthread_mutex_unlock (&backoff_delay_mut); ParodusInfo("After pthread_mutex_unlock...\n"); + pthread_condattr_destroy(&backoff_delay_cond_attr); + if (g_shutdown) { ParodusInfo("Backoff shutdown\n"); return BACKOFF_SHUTDOWN; From 3090e50b02565ebce605b48b6905b1cd76f6f75f Mon Sep 17 00:00:00 2001 From: Sadhyama Vengilat Date: Wed, 21 Sep 2022 19:35:02 +0530 Subject: [PATCH 120/137] Msg optimized callback when low qos deletion on max queue --- src/xmidtsend_rbus.c | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/src/xmidtsend_rbus.c b/src/xmidtsend_rbus.c index 47d5a15..9e29281 100644 --- a/src/xmidtsend_rbus.c +++ b/src/xmidtsend_rbus.c @@ -215,7 +215,7 @@ int xmidtQOptmize() if(get_XmidtQsize() > 0 && get_XmidtQsize() == get_parodus_cfg()->max_queue_size) { ParodusInfo("Max queue size reached, delete low qos %d transid %s\n", tempMsg->u.event.qos, tempMsg->u.event.transaction_uuid); - del = 1; + del = 2; } } } @@ -229,9 +229,18 @@ int xmidtQOptmize() ParodusPrint("msg expired, updateXmidtState to DELETE\n"); updateXmidtState(temp, DELETE); //rbus callback to caller - mapXmidtStatusToStatusMessage(MSG_EXPIRED, &errorMsg); - ParodusPrint("statusMsg is %s\n",errorMsg); - createOutParamsandSendAck(temp->msg, temp->asyncHandle, errorMsg, MSG_EXPIRED, RBUS_ERROR_INVALID_RESPONSE_FROM_DESTINATION); + if(del == 1) + { + mapXmidtStatusToStatusMessage(MSG_EXPIRED, &errorMsg); + ParodusPrint("statusMsg is %s\n",errorMsg); + createOutParamsandSendAck(temp->msg, temp->asyncHandle, errorMsg, MSG_EXPIRED, RBUS_ERROR_INVALID_RESPONSE_FROM_DESTINATION); + } + else if(del == 2) + { + mapXmidtStatusToStatusMessage(QUEUE_OPTIMIZED, &errorMsg); + ParodusPrint("statusMsg is %s\n",errorMsg); + createOutParamsandSendAck(temp->msg, temp->asyncHandle, errorMsg, QUEUE_OPTIMIZED, RBUS_ERROR_INVALID_RESPONSE_FROM_DESTINATION); + } status = deleteFromXmidtQ(&next_node); temp = next_node; if(status) From c8a2c95ae4935d41eb66da5132b61c73a670956b Mon Sep 17 00:00:00 2001 From: Guru Chandru Date: Thu, 22 Sep 2022 09:38:06 +0530 Subject: [PATCH 121/137] Switch to use the sonarcloud installer action --- .github/workflows/push.yml | 6 +++--- src/connection.c | 16 +--------------- 2 files changed, 4 insertions(+), 18 deletions(-) diff --git a/.github/workflows/push.yml b/.github/workflows/push.yml index 53ff266..8f69273 100644 --- a/.github/workflows/push.yml +++ b/.github/workflows/push.yml @@ -39,9 +39,9 @@ jobs: run: mkdir build - name: Get Sonarcloud Binaries - working-directory: build - run: | - ../.github/scripts/get_sonarcloud.sh + uses: xmidt-org/sonarcloud-installer-action@v1 + with: + working-directory: build - name: CMake working-directory: build diff --git a/src/connection.c b/src/connection.c index abe3f15..ca26337 100644 --- a/src/connection.c +++ b/src/connection.c @@ -296,7 +296,6 @@ void calc_random_expiration (int random_num1, int random_num2, backoff_timer_t * /* Add delay to expire time */ add_timespec (&ts_delay, ts); - ParodusInfo("Added delay to expire time\n"); } void terminate_backoff_delay (void) @@ -340,33 +339,20 @@ static int backoff_delay (backoff_timer_t *timer) } calc_random_expiration (random(), random(), timer, &ts); - ParodusInfo("After calc_random_expiration.\n"); - - ParodusInfo("Timer value - start_time : %lu, backoffRetrytime sec : %ld, nsec : %ld, count : %d, max_count : %d, delay - %d\n", timer->start_time, timer->ts.tv_sec, timer->ts.tv_nsec, timer->count, timer->max_count, timer->delay); - - ParodusInfo("backoffRetryTime %ld secs %ld nsecs\n", ts.tv_sec, ts.tv_nsec); pthread_mutex_lock (&backoff_delay_mut); // The condition variable will only be set if we shut down. - ParodusInfo("Before pthread_cond_timedwait...\n"); rtn = pthread_cond_timedwait (&backoff_delay_con, &backoff_delay_mut, &ts); - ParodusInfo("After pthread_cond_timedwait...\n"); pthread_mutex_unlock (&backoff_delay_mut); - ParodusInfo("After pthread_mutex_unlock...\n"); pthread_condattr_destroy(&backoff_delay_cond_attr); - if (g_shutdown) { - ParodusInfo("Backoff shutdown\n"); + if (g_shutdown) return BACKOFF_SHUTDOWN; - } if ((rtn != 0) && (rtn != ETIMEDOUT)) { ParodusError ("pthread_cond_timedwait error (%d) in backoff_delay.\n", rtn); return BACKOFF_ERR; } - if (rtn == ETIMEDOUT) { - ParodusInfo("pthread_cond_timedwait timeout rtn = (%d)\n", rtn); - } return BACKOFF_DELAY_TAKEN; } From 954080bbd1b6f5e6042a7201ff19431e5259e742 Mon Sep 17 00:00:00 2001 From: Sadhyama Vengilat Date: Fri, 23 Sep 2022 19:02:49 +0530 Subject: [PATCH 122/137] Modify outparams source based on status and handle cloud failure --- src/downstream.c | 4 +- src/xmidtsend_rbus.c | 110 +++++++++++++++++++++++++++++++------------ src/xmidtsend_rbus.h | 5 +- 3 files changed, 84 insertions(+), 35 deletions(-) diff --git a/src/downstream.c b/src/downstream.c index 0180bb6..55e890d 100644 --- a/src/downstream.c +++ b/src/downstream.c @@ -252,8 +252,8 @@ void listenerOnMessage(void * msg, size_t msgSize) { if(message->u.event.transaction_uuid !=NULL) { - ParodusInfo("Received cloud ack from server: transaction_uuid %s qos %d, rdr %d\n", message->u.event.transaction_uuid, message->u.event.qos, message->u.event.rdr); - addToCloudAckQ(message->u.event.transaction_uuid, message->u.event.qos, message->u.event.rdr); + ParodusInfo("Received cloud ack from server: transaction_uuid %s qos %d, rdr %d source %s\n", message->u.event.transaction_uuid, message->u.event.qos, message->u.event.rdr, message->u.event.source); + addToCloudAckQ(message->u.event.transaction_uuid, message->u.event.qos, message->u.event.rdr, message->u.event.source); ParodusPrint("Added to cloud ack Q\n"); } else diff --git a/src/xmidtsend_rbus.c b/src/xmidtsend_rbus.c index 9e29281..12dd1c1 100644 --- a/src/xmidtsend_rbus.c +++ b/src/xmidtsend_rbus.c @@ -233,13 +233,13 @@ int xmidtQOptmize() { mapXmidtStatusToStatusMessage(MSG_EXPIRED, &errorMsg); ParodusPrint("statusMsg is %s\n",errorMsg); - createOutParamsandSendAck(temp->msg, temp->asyncHandle, errorMsg, MSG_EXPIRED, RBUS_ERROR_INVALID_RESPONSE_FROM_DESTINATION); + createOutParamsandSendAck(temp->msg, temp->asyncHandle, errorMsg, MSG_EXPIRED, NULL, RBUS_ERROR_INVALID_RESPONSE_FROM_DESTINATION); } else if(del == 2) { mapXmidtStatusToStatusMessage(QUEUE_OPTIMIZED, &errorMsg); ParodusPrint("statusMsg is %s\n",errorMsg); - createOutParamsandSendAck(temp->msg, temp->asyncHandle, errorMsg, QUEUE_OPTIMIZED, RBUS_ERROR_INVALID_RESPONSE_FROM_DESTINATION); + createOutParamsandSendAck(temp->msg, temp->asyncHandle, errorMsg, QUEUE_OPTIMIZED, NULL, RBUS_ERROR_INVALID_RESPONSE_FROM_DESTINATION); } status = deleteFromXmidtQ(&next_node); temp = next_node; @@ -278,7 +278,7 @@ void addToXmidtUpstreamQ(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle) ParodusInfo("queue size %d exceeded at producer, ignoring the event\n", get_XmidtQsize()); mapXmidtStatusToStatusMessage(QUEUE_SIZE_EXCEEDED, &errorMsg); ParodusPrint("statusMsg is %s\n",errorMsg); - createOutParamsandSendAck(msg, asyncHandle, errorMsg , QUEUE_SIZE_EXCEEDED, RBUS_ERROR_INVALID_RESPONSE_FROM_DESTINATION); + createOutParamsandSendAck(msg, asyncHandle, errorMsg , QUEUE_SIZE_EXCEEDED, NULL, RBUS_ERROR_INVALID_RESPONSE_FROM_DESTINATION); wrp_free_struct(msg); return; } @@ -324,7 +324,7 @@ void addToXmidtUpstreamQ(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle) { mapXmidtStatusToStatusMessage(ENQUEUE_FAILURE, &errorMsg); ParodusPrint("statusMsg is %s\n",errorMsg); - createOutParamsandSendAck(msg, asyncHandle, errorMsg , ENQUEUE_FAILURE, RBUS_ERROR_INVALID_RESPONSE_FROM_DESTINATION); + createOutParamsandSendAck(msg, asyncHandle, errorMsg , ENQUEUE_FAILURE, NULL, RBUS_ERROR_INVALID_RESPONSE_FROM_DESTINATION); wrp_free_struct(msg); } return; @@ -525,7 +525,7 @@ int processData(XmidtMsg *Datanode, wrp_msg_t * msg, rbusMethodAsyncHandle_t asy ParodusError("xmidtMsg is NULL\n"); mapXmidtStatusToStatusMessage(ENQUEUE_FAILURE, &errorMsg); ParodusPrint("statusMsg is %s\n",errorMsg); - createOutParamsandSendAck(xmidtMsg, asyncHandle, errorMsg, ENQUEUE_FAILURE, RBUS_ERROR_INVALID_RESPONSE_FROM_DESTINATION); + createOutParamsandSendAck(xmidtMsg, asyncHandle, errorMsg, ENQUEUE_FAILURE, NULL, RBUS_ERROR_INVALID_RESPONSE_FROM_DESTINATION); updateXmidtState(Datanode, DELETE); return rv; } @@ -541,7 +541,7 @@ int processData(XmidtMsg *Datanode, wrp_msg_t * msg, rbusMethodAsyncHandle_t asy else { ParodusError("validation failed, send failure ack\n"); - createOutParamsandSendAck(xmidtMsg, asyncHandle, errorMsg , statuscode, RBUS_ERROR_INVALID_INPUT); + createOutParamsandSendAck(xmidtMsg, asyncHandle, errorMsg , statuscode, NULL, RBUS_ERROR_INVALID_INPUT); updateXmidtState(Datanode, DELETE); } return rv; @@ -721,7 +721,7 @@ int sendXmidtEventToServer(XmidtMsg *msgnode, wrp_msg_t * msg, rbusMethodAsyncHa ParodusError("wrp msg_len is zero\n"); mapXmidtStatusToStatusMessage(WRP_ENCODE_FAILURE, &errorMsg); ParodusPrint("statusMsg is %s\n",errorMsg); - createOutParamsandSendAck(msg, asyncHandle, errorMsg, WRP_ENCODE_FAILURE, RBUS_ERROR_INVALID_RESPONSE_FROM_DESTINATION); + createOutParamsandSendAck(msg, asyncHandle, errorMsg, WRP_ENCODE_FAILURE, NULL, RBUS_ERROR_INVALID_RESPONSE_FROM_DESTINATION); updateXmidtState(msgnode, DELETE); if(notif_wrp_msg !=NULL) { @@ -766,7 +766,7 @@ int sendXmidtEventToServer(XmidtMsg *msgnode, wrp_msg_t * msg, rbusMethodAsyncHa ParodusPrint("statusMsg is %s\n",errorMsg); ParodusInfo("The event is having low qos proceed to delete\n"); printSendMsgData(errorMsg, notif_wrp_msg->u.event.qos, notif_wrp_msg->u.event.dest, notif_wrp_msg->u.event.transaction_uuid); - createOutParamsandSendAck(msg, asyncHandle, errorMsg, CLIENT_DISCONNECT, RBUS_ERROR_INVALID_RESPONSE_FROM_DESTINATION); + createOutParamsandSendAck(msg, asyncHandle, errorMsg, CLIENT_DISCONNECT, NULL, RBUS_ERROR_INVALID_RESPONSE_FROM_DESTINATION); updateXmidtState(msgnode, DELETE); break; } @@ -783,7 +783,7 @@ int sendXmidtEventToServer(XmidtMsg *msgnode, wrp_msg_t * msg, rbusMethodAsyncHa { ParodusInfo("max queue size is 0, qos semantics are disabled. send callback\n"); mapXmidtStatusToStatusMessage(QOS_SEMANTICS_DISABLED, &errorMsg); - createOutParamsandSendAck(msg, asyncHandle, errorMsg, QOS_SEMANTICS_DISABLED, RBUS_ERROR_SUCCESS); + createOutParamsandSendAck(msg, asyncHandle, errorMsg, QOS_SEMANTICS_DISABLED, NULL, RBUS_ERROR_SUCCESS); ParodusPrint("update state to DELETE\n"); updateXmidtState(msgnode, DELETE); print_xmidMsg_list(); @@ -801,7 +801,7 @@ int sendXmidtEventToServer(XmidtMsg *msgnode, wrp_msg_t * msg, rbusMethodAsyncHa ParodusInfo("Low qos event, send success callback and delete\n"); mapXmidtStatusToStatusMessage(DELIVERED_SUCCESS, &errorMsg); ParodusPrint("statusMsg is %s\n",errorMsg); - createOutParamsandSendAck(msg, asyncHandle, errorMsg, DELIVERED_SUCCESS, RBUS_ERROR_SUCCESS); + createOutParamsandSendAck(msg, asyncHandle, errorMsg, DELIVERED_SUCCESS, NULL, RBUS_ERROR_SUCCESS); //print_xmidMsg_list(); updateXmidtState(msgnode, DELETE); print_xmidMsg_list(); @@ -820,7 +820,7 @@ int sendXmidtEventToServer(XmidtMsg *msgnode, wrp_msg_t * msg, rbusMethodAsyncHa mapXmidtStatusToStatusMessage(MSG_PROCESSING_FAILED, &errorMsg); ParodusPrint("statusMsg is %s\n",errorMsg); ParodusError("Memory allocation failed\n"); - createOutParamsandSendAck(msg, asyncHandle, errorMsg, MSG_PROCESSING_FAILED, RBUS_ERROR_INVALID_RESPONSE_FROM_DESTINATION); + createOutParamsandSendAck(msg, asyncHandle, errorMsg, MSG_PROCESSING_FAILED, NULL, RBUS_ERROR_INVALID_RESPONSE_FROM_DESTINATION); updateXmidtState(msgnode, DELETE); } @@ -840,12 +840,17 @@ int sendXmidtEventToServer(XmidtMsg *msgnode, wrp_msg_t * msg, rbusMethodAsyncHa return rv; } -void createOutParamsandSendAck(wrp_msg_t *msg, rbusMethodAsyncHandle_t asyncHandle, char *errorMsg, int statuscode, rbusError_t error) +void createOutParamsandSendAck(wrp_msg_t *msg, rbusMethodAsyncHandle_t asyncHandle, char *errorMsg, int statuscode, char *cloudsource, rbusError_t error) { rbusObject_t outParams; rbusError_t err; rbusValue_t value; char qosstring[20] = ""; + int ret = -1; + char sourceStr[64] = {'\0'}; + char *device_id = NULL; + size_t device_id_len = 0; + char *source = NULL; rbusValue_Init(&value); rbusValue_SetString(value, "event"); @@ -868,17 +873,47 @@ void createOutParamsandSendAck(wrp_msg_t *msg, rbusMethodAsyncHandle_t asyncHand free(errorMsg); } + //update source based on status originated from cloud or parodus . + if (cloudsource != NULL) + { + source = strdup(cloudsource); + ParodusPrint("cloudsource is %s\n", cloudsource); + + } + else + { + //To get device_id in the format "mac:112233445xxx" + ret = getDeviceId(&device_id, &device_id_len); + if(ret == 0) + { + ParodusPrint("device_id %s device_id_len %lu\n", device_id, device_id_len); + snprintf(sourceStr, sizeof(sourceStr), "%s/%s", device_id, "parodus"); + ParodusPrint("sourceStr formed is %s\n" , sourceStr); + source = strdup(sourceStr); + } + else + { + ParodusError("Failed to get device_id\n"); + } + if(device_id != NULL) + { + free(device_id); + device_id = NULL; + } + } + + if(source != NULL) + { + ParodusInfo("source is %s\n" , source); + rbusValue_Init(&value); + rbusValue_SetString(value, source); + rbusObject_SetValue(outParams, "source", value); + rbusValue_Release(value); + free(source); + } + if(msg != NULL) { - if(msg->u.event.source !=NULL) - { - ParodusPrint("msg->u.event.source is %s\n", msg->u.event.source); - rbusValue_Init(&value); - rbusValue_SetString(value, msg->u.event.source); - rbusObject_SetValue(outParams, "source", value); - rbusValue_Release(value); - } - if(msg->u.event.dest !=NULL) { rbusValue_Init(&value); @@ -1235,7 +1270,7 @@ void printRBUSParams(rbusObject_t params, char* file_path) /* * @brief To store downstream cloud ack messages in a list for further processing. */ -void addToCloudAckQ(char *trans_id, int qos, int rdr) +void addToCloudAckQ(char *trans_id, int qos, int rdr, char *source) { CloudAck *ackmsg; @@ -1247,7 +1282,8 @@ void addToCloudAckQ(char *trans_id, int qos, int rdr) ackmsg->transaction_id = strdup(trans_id); ackmsg->qos = qos; ackmsg->rdr =rdr; - ParodusPrint("ackmsg->transaction_id %s ackmsg->qos %d ackmsg->rdr %d\n", ackmsg->transaction_id,ackmsg->qos,ackmsg->rdr); + ackmsg->source= strdup(source); + ParodusPrint("ackmsg->transaction_id %s ackmsg->qos %d ackmsg->rdr %d ackmsg->source %s\n", ackmsg->transaction_id,ackmsg->qos,ackmsg->rdr,ackmsg->source ); ackmsg->next=NULL; pthread_mutex_lock (&cloudack_mut); if(g_cloudackHead == NULL) @@ -1303,15 +1339,22 @@ int checkCloudACK(XmidtMsg *xmdnode, rbusMethodAsyncHandle_t asyncHandle) while (NULL != cloudnode) { - ParodusPrint("cloudnode->transaction_id %s cloudnode->qos %d cloudnode->rdr %d\n", cloudnode->transaction_id,cloudnode->qos,cloudnode->rdr); + ParodusPrint("cloudnode->transaction_id %s cloudnode->qos %d cloudnode->rdr %d cloudnode->source %s\n", cloudnode->transaction_id,cloudnode->qos,cloudnode->rdr, cloudnode->source); if(xmdMsgTransID != NULL && cloudnode->transaction_id != NULL) { if( strcmp(xmdMsgTransID, cloudnode->transaction_id) == 0) { ParodusInfo("transaction_id %s is matching, send callback\n", xmdMsgTransID); - mapXmidtStatusToStatusMessage(DELIVERED_SUCCESS, &errorMsg); + mapXmidtStatusToStatusMessage(cloudnode->rdr, &errorMsg); ParodusPrint("statusMsg is %s\n",errorMsg); - createOutParamsandSendAck(xmdMsg, asyncHandle, errorMsg, DELIVERED_SUCCESS, cloudnode->rdr); + if(cloudnode->rdr == 0) + { + createOutParamsandSendAck(xmdMsg, asyncHandle, errorMsg, cloudnode->rdr, cloudnode->source, RBUS_ERROR_SUCCESS); + } + else + { + createOutParamsandSendAck(xmdMsg, asyncHandle, errorMsg, cloudnode->rdr, cloudnode->source, RBUS_ERROR_INVALID_RESPONSE_FROM_DESTINATION); + } ParodusPrint("set xmidt msg to DELETE state as cloud ack is processed\n"); updateXmidtState(xmdnode, DELETE); print_xmidMsg_list(); @@ -1411,6 +1454,11 @@ int deleteCloudACKNode(char* trans_id) free( curr_node->transaction_id ); curr_node->transaction_id = NULL; } + if(curr_node->source !=NULL) + { + free( curr_node->source ); + curr_node->source = NULL; + } if(curr_node != NULL) { free( curr_node ); @@ -1516,7 +1564,7 @@ void checkMsgExpiry() //rbus callback to caller mapXmidtStatusToStatusMessage(MSG_EXPIRED, &errorMsg); ParodusPrint("statusMsg is %s\n",errorMsg); - createOutParamsandSendAck(temp->msg, temp->asyncHandle, errorMsg, MSG_EXPIRED, RBUS_ERROR_INVALID_RESPONSE_FROM_DESTINATION); + createOutParamsandSendAck(temp->msg, temp->asyncHandle, errorMsg, MSG_EXPIRED, NULL, RBUS_ERROR_INVALID_RESPONSE_FROM_DESTINATION); updateXmidtState(temp, DELETE); } } @@ -1529,7 +1577,7 @@ void checkMsgExpiry() //rbus callback to caller mapXmidtStatusToStatusMessage(MSG_EXPIRED, &errorMsg); ParodusPrint("statusMsg is %s\n",errorMsg); - createOutParamsandSendAck(temp->msg, temp->asyncHandle, errorMsg, MSG_EXPIRED, RBUS_ERROR_INVALID_RESPONSE_FROM_DESTINATION); + createOutParamsandSendAck(temp->msg, temp->asyncHandle, errorMsg, MSG_EXPIRED, NULL, RBUS_ERROR_INVALID_RESPONSE_FROM_DESTINATION); updateXmidtState(temp, DELETE); } } @@ -1542,7 +1590,7 @@ void checkMsgExpiry() //rbus callback to caller mapXmidtStatusToStatusMessage(MSG_EXPIRED, &errorMsg); ParodusPrint("statusMsg is %s\n",errorMsg); - createOutParamsandSendAck(temp->msg, temp->asyncHandle, errorMsg, MSG_EXPIRED, RBUS_ERROR_INVALID_RESPONSE_FROM_DESTINATION); + createOutParamsandSendAck(temp->msg, temp->asyncHandle, errorMsg, MSG_EXPIRED, NULL, RBUS_ERROR_INVALID_RESPONSE_FROM_DESTINATION); updateXmidtState(temp, DELETE); } } @@ -1555,7 +1603,7 @@ void checkMsgExpiry() //rbus callback to caller mapXmidtStatusToStatusMessage(MSG_EXPIRED, &errorMsg); ParodusPrint("statusMsg is %s\n",errorMsg); - createOutParamsandSendAck(temp->msg, temp->asyncHandle, errorMsg, MSG_EXPIRED, RBUS_ERROR_INVALID_RESPONSE_FROM_DESTINATION); + createOutParamsandSendAck(temp->msg, temp->asyncHandle, errorMsg, MSG_EXPIRED, NULL, RBUS_ERROR_INVALID_RESPONSE_FROM_DESTINATION); updateXmidtState(temp, DELETE); } } @@ -1597,7 +1645,7 @@ void checkMaxQandOptimize() char *errorMsg = NULL; mapXmidtStatusToStatusMessage(QUEUE_OPTIMIZED, &errorMsg); ParodusPrint("statusMsg is %s\n",errorMsg); - createOutParamsandSendAck(temp->msg, temp->asyncHandle, errorMsg, QUEUE_OPTIMIZED, RBUS_ERROR_INVALID_RESPONSE_FROM_DESTINATION); + createOutParamsandSendAck(temp->msg, temp->asyncHandle, errorMsg, QUEUE_OPTIMIZED, NULL, RBUS_ERROR_INVALID_RESPONSE_FROM_DESTINATION); updateXmidtState(temp, DELETE); } temp = temp->next; diff --git a/src/xmidtsend_rbus.h b/src/xmidtsend_rbus.h index 8a5870f..f1ce86d 100644 --- a/src/xmidtsend_rbus.h +++ b/src/xmidtsend_rbus.h @@ -58,6 +58,7 @@ typedef struct CloudAck__ char *transaction_id; int qos; int rdr; + char *source; struct CloudAck__ *next; } CloudAck; @@ -100,13 +101,13 @@ int sendXmidtEventToServer(XmidtMsg *msgnode, wrp_msg_t * msg, rbusMethodAsyncHa int checkInputParameters(rbusObject_t inParams); char* generate_transaction_uuid(); void parseRbusInparamsToWrp(rbusObject_t inParams, char *trans_id, wrp_msg_t **eventMsg); -void createOutParamsandSendAck(wrp_msg_t *msg, rbusMethodAsyncHandle_t asyncHandle, char *errorMsg, int statuscode, rbusError_t error); +void createOutParamsandSendAck(wrp_msg_t *msg, rbusMethodAsyncHandle_t asyncHandle, char *errorMsg, int statuscode, char *cloudsource, rbusError_t error); int validateXmidtData(wrp_msg_t * eventMsg, char **errorMsg, int *statusCode); void printSendMsgData(char* status, int qos, char* dest, char* transaction_uuid); bool highQosValueCheck(int qos); void waitTillConnectionIsUp(); void printRBUSParams(rbusObject_t params, char* file_path); -void addToCloudAckQ(char *transaction_id, int qos, int rdr); +void addToCloudAckQ(char *transaction_id, int qos, int rdr, char *source); int checkCloudACK(XmidtMsg *xmdnode, rbusMethodAsyncHandle_t asyncHandle); int updateXmidtState(XmidtMsg * temp, int state); void print_xmidMsg_list(); From f4536b778e28e01cb441a5fb9dc43fa3d371a358 Mon Sep 17 00:00:00 2001 From: Guru Chandru Date: Wed, 28 Sep 2022 18:41:20 +0530 Subject: [PATCH 123/137] Fix for updating parconnhealth file --- src/connection.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/connection.c b/src/connection.c index ca26337..dc39cdc 100644 --- a/src/connection.c +++ b/src/connection.c @@ -239,7 +239,7 @@ void init_backoff_timer (backoff_timer_t *timer, int max_count) timer->count = 1; timer->max_count = max_count; timer->delay = 1; - clock_gettime (CLOCK_REALTIME, &timer->ts); + clock_gettime (CLOCK_MONOTONIC, &timer->ts); timer->start_time = time(NULL); } From e6e37053d31d9b7dec8b605a3a3fde864f9b2bf6 Mon Sep 17 00:00:00 2001 From: Shilpa Seshadri Date: Thu, 20 Oct 2022 11:29:02 +0530 Subject: [PATCH 124/137] To fix webconfig upstream event crash --- src/upstream.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/upstream.c b/src/upstream.c index f6307d3..a30e551 100644 --- a/src/upstream.c +++ b/src/upstream.c @@ -40,7 +40,7 @@ /*----------------------------------------------------------------------------*/ void *metadataPack; -size_t metaPackSize=-1; +size_t metaPackSize=0; UpStreamMsg *UpStreamMsgQ = NULL; From 4acf7f63ba9715f8ebff693591b7327b66f9ec34 Mon Sep 17 00:00:00 2001 From: Vasuki Date: Wed, 2 Nov 2022 15:10:57 +0530 Subject: [PATCH 125/137] Serial-number configuration incorrect in parodus log --- src/config.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/config.c b/src/config.c index 938e19a..5e57318 100644 --- a/src/config.c +++ b/src/config.c @@ -498,7 +498,7 @@ int parseCommandLine(int argc,char **argv,ParodusCfg * cfg) case 's': if(parse_serial_num(cfg->hw_serial_number, optarg) == 0) - ParodusInfo ("hw_serial-number is %s\n",cfg->hw_serial_number); + ParodusInfo ("hw_serial_number is %s\n",cfg->hw_serial_number); break; case 'f': From 0673d2624e63b6394069fc74c26eb518fbc871af Mon Sep 17 00:00:00 2001 From: Shilpa Seshadri Date: Fri, 11 Nov 2022 21:08:03 +0530 Subject: [PATCH 126/137] Use rdkcentral RBUS repo & resolve dependencies --- CMakeLists.txt | 46 +++++++++----------------------------------- src/CMakeLists.txt | 2 +- tests/CMakeLists.txt | 2 +- 3 files changed, 11 insertions(+), 39 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index e7e541b..ec46ff3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -44,10 +44,7 @@ include_directories(${INCLUDE_DIR} ) if (ENABLE_WEBCFGBIN) -include_directories(${INCLUDE_DIR}/rbus - ${INCLUDE_DIR}/rbus-core - ${INCLUDE_DIR}/rtmessage -) +include_directories(${INCLUDE_DIR}/rbus) endif (ENABLE_WEBCFGBIN) # Get git commit hash @@ -237,46 +234,21 @@ include_directories(${INCLUDE_DIR} endif (FEATURE_DNS_QUERY) if (ENABLE_WEBCFGBIN) -# rtMessage external dependency -#------------------------------------------------------------------------------- -ExternalProject_Add(rtMessage - DEPENDS cJSON - PREFIX ${CMAKE_CURRENT_BINARY_DIR}/_prefix/rtMessage - GIT_REPOSITORY https://github.com/rdkcmf/rdk-rtmessage.git - GIT_TAG rdk-next - CMAKE_ARGS += -DBUILD_RTMESSAGE_LIB=ON - -DBUILD_RTMESSAGE_SAMPLE_APP=ON - -DBUILD_FOR_DESKTOP=OFF - -DCJSON_BUILD=OFF - -DBUILD_DATAPROVIDER_LIB=ON - -DCMAKE_INSTALL_PREFIX=${INSTALL_DIR} -DBUILD_TESTING=OFF -) -add_library(librtMessage STATIC SHARED IMPORTED) -add_dependencies(librtMessage rtMessage) - -# rbus-core external dependency -#------------------------------------------------------------------------------- -ExternalProject_Add(rbus-core - DEPENDS rtMessage - PREFIX ${CMAKE_CURRENT_BINARY_DIR}/_prefix/rbus-core - GIT_REPOSITORY https://github.com/rdkcmf/rbuscore.git - GIT_TAG rdk-next - CMAKE_ARGS += -DBUILD_FOR_DESKTOP=ON -DCMAKE_INSTALL_PREFIX=${INSTALL_DIR} - -DBUILD_TESTING=OFF -) -add_library(librbus-core STATIC SHARED IMPORTED) -add_dependencies(librbus-core rbus-core) - # rbus external dependency #------------------------------------------------------------------------------- ExternalProject_Add(rbus - DEPENDS rtMessage rbus-core PREFIX ${CMAKE_CURRENT_BINARY_DIR}/_prefix/rbus - GIT_REPOSITORY https://github.com/rdkcmf/rbus.git - GIT_TAG rdk-next + GIT_REPOSITORY https://github.com/rdkcentral/rbus.git + GIT_TAG main CMAKE_ARGS += -DBUILD_FOR_DESKTOP=ON -DCMAKE_INSTALL_PREFIX=${INSTALL_DIR} -DBUILD_TESTING=OFF ) +add_library(librbuscore STATIC SHARED IMPORTED) +add_dependencies(librbuscore rbuscore) + +add_library(librtMessage STATIC SHARED IMPORTED) +add_dependencies(librtMessage rtMessage) + add_library(librbus STATIC SHARED IMPORTED) add_dependencies(librbus rbus) endif (ENABLE_WEBCFGBIN) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 12cdc4f..8b7af65 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -63,6 +63,6 @@ target_link_libraries (parodus -llibseshat) endif (ENABLE_SESHAT) if (ENABLE_WEBCFGBIN) -target_link_libraries (parodus -lrbus -lrbus-core -lrtMessage) +target_link_libraries (parodus -lrbus) endif (ENABLE_WEBCFGBIN) install (TARGETS parodus DESTINATION bin) diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 9f16c73..a0ba8f7 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -33,7 +33,7 @@ set (PARODUS_COMMON_LIBS ${PARODUS_COMMON_LIBS} -lucresolv -lresolv) endif (FEATURE_DNS_QUERY) if (ENABLE_WEBCFGBIN) -set (PARODUS_COMMON_LIBS ${PARODUS_COMMON_LIBS} -lrbus -lrbus-core) +set (PARODUS_COMMON_LIBS ${PARODUS_COMMON_LIBS} -lrbus) endif (ENABLE_WEBCFGBIN) if(NOT DISABLE_VALGRIND) From 581d7fc966ced7486fa961fd3cb989051b88e97e Mon Sep 17 00:00:00 2001 From: Shilpa Seshadri Date: Thu, 17 Nov 2022 00:40:26 +0530 Subject: [PATCH 127/137] Unit test fixes --- src/config.c | 11 +++++++---- tests/CMakeLists.txt | 9 ++++++--- tests/test_nopoll_helpers.c | 26 +++++++------------------- 3 files changed, 20 insertions(+), 26 deletions(-) diff --git a/src/config.c b/src/config.c index 5e57318..00b2975 100644 --- a/src/config.c +++ b/src/config.c @@ -41,7 +41,6 @@ pthread_cond_t cloud_status_cond=PTHREAD_COND_INITIALIZER; char webpa_interface[64]={'\0'}; -char cloud_status[32]={'\0'}; static ParodusCfg parodusCfg; static unsigned int rsa_algorithms = (1<cloud_status, sizeof(cloud_status)); - pthread_mutex_unlock(&config_mut); - return cloud_status; + if(NULL != get_parodus_cfg()->cloud_status) + { + status = get_parodus_cfg()->cloud_status; + } + pthread_mutex_unlock(&config_mut); + return status; } const char *get_tok (const char *src, int delim, char *result, int resultsize) diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index a0ba8f7..4c8a2c4 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -61,7 +61,10 @@ target_link_libraries (test_close_retry ${PARODUS_COMMON_LIBS} -lcmocka) #------------------------------------------------------------------------------- add_test(NAME test_mutex COMMAND ${MEMORY_CHECK} ./test_mutex) add_executable(test_mutex test_mutex.c ../src/mutex.c) -target_link_libraries (test_mutex ${PARODUS_COMMON_LIBS} -lcmocka) +target_link_libraries (test_mutex gcov -lcunit -lcimplog -lwrp-c + -luuid -lmsgpackc -lnopoll -lnanomsg -lpthread + -Wl,--no-as-needed -lcjson -lcjwt -ltrower-base64 + -lssl -lcrypto -lrt -lm -lcmocka) #------------------------------------------------------------------------------- # test_networking @@ -74,8 +77,8 @@ target_link_libraries (test_networking ${PARODUS_COMMON_LIBS}) # test_nopoll_helpers #------------------------------------------------------------------------------- add_test(NAME test_nopoll_helpers COMMAND ${MEMORY_CHECK} ./test_nopoll_helpers) -add_executable(test_nopoll_helpers test_nopoll_helpers.c ../src/nopoll_helpers.c) -target_link_libraries (test_nopoll_helpers -Wl,--no-as-needed -lrt -lcmocka -lcimplog -lnopoll) +add_executable(test_nopoll_helpers test_nopoll_helpers.c ../src/nopoll_helpers.c ../src/string_helpers.c ../src/config.c) +target_link_libraries (test_nopoll_helpers -Wl,--no-as-needed -lrt -lcmocka -lcimplog -lnopoll ${PARODUS_COMMON_LIBS}) #------------------------------------------------------------------------------- # test_time diff --git a/tests/test_nopoll_helpers.c b/tests/test_nopoll_helpers.c index 13109e4..f8862d5 100644 --- a/tests/test_nopoll_helpers.c +++ b/tests/test_nopoll_helpers.c @@ -24,6 +24,9 @@ #include "../src/parodus_log.h" #include "../src/nopoll_helpers.h" #include "../src/config.h" +#include +#include "../src/connection.h" +#include "../src/ParodusInternal.h" /*----------------------------------------------------------------------------*/ /* Macros */ @@ -34,7 +37,6 @@ /* File Scoped Variables */ /*----------------------------------------------------------------------------*/ static noPollConn *conn = NULL; - static ParodusCfg cfg; /*----------------------------------------------------------------------------*/ /* Mocks */ @@ -57,12 +59,6 @@ nopoll_bool nopoll_conn_is_ready( noPollConn *conn ) return (nopoll_bool)mock(); } -ParodusCfg *get_parodus_cfg(void) -{ - function_called(); - return &cfg; -} - int __nopoll_conn_send_common (noPollConn * conn, const char * content, long length, nopoll_bool has_fin, long sleep_in_header, noPollOpCode frame_type) { UNUSED(has_fin); UNUSED(sleep_in_header); UNUSED(frame_type); UNUSED(content); @@ -131,10 +127,6 @@ bool get_interface_down_event() return false; } -char *get_cloud_status(void) -{ - return NULL; -} /*----------------------------------------------------------------------------*/ /* Tests */ @@ -226,8 +218,7 @@ void test_sendMessage() { int len = strlen("Hello Parodus!"); - cfg.cloud_status = CLOUD_STATUS_ONLINE; - expect_function_calls (get_parodus_cfg, 1); + get_parodus_cfg()->cloud_status = CLOUD_STATUS_ONLINE; expect_value(__nopoll_conn_send_common, (intptr_t)conn, (intptr_t)conn); expect_value(__nopoll_conn_send_common, length, len); @@ -241,8 +232,7 @@ void test_sendMessageOffline() { int len = strlen("Hello Parodus!"); - cfg.cloud_status = CLOUD_STATUS_OFFLINE; - expect_function_calls (get_parodus_cfg, 1); + get_parodus_cfg()->cloud_status = CLOUD_STATUS_OFFLINE; sendMessage(conn, "Hello Parodus!", len); } @@ -251,8 +241,7 @@ void err_sendMessage() { int len = strlen("Hello Parodus!"); - cfg.cloud_status = CLOUD_STATUS_ONLINE; - expect_function_calls (get_parodus_cfg, 1); + get_parodus_cfg()->cloud_status = CLOUD_STATUS_ONLINE; expect_value(__nopoll_conn_send_common, (intptr_t)conn,(intptr_t) conn); expect_value(__nopoll_conn_send_common, length, len); @@ -271,8 +260,7 @@ void err_sendMessageConnNull() { int len = strlen("Hello Parodus!"); - cfg.cloud_status = CLOUD_STATUS_ONLINE; - expect_function_calls (get_parodus_cfg, 1); + get_parodus_cfg()->cloud_status = CLOUD_STATUS_ONLINE; expect_value(__nopoll_conn_send_common, (intptr_t)conn, NULL); expect_value(__nopoll_conn_send_common, length, len); From f4e358c179ab835cca8b805c31ea8ec7ad0f2537 Mon Sep 17 00:00:00 2001 From: Thanusha D Date: Fri, 9 Dec 2022 17:30:14 +0530 Subject: [PATCH 128/137] Log traceParent & traceState value in upstream request & event messages --- src/upstream.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/upstream.c b/src/upstream.c index a30e551..41ef2fa 100644 --- a/src/upstream.c +++ b/src/upstream.c @@ -320,7 +320,10 @@ void *processUpstreamMessage() } else if(msgType == WRP_MSG_TYPE__EVENT) { - ParodusInfo(" Received upstream event data: dest '%s'\n", msg->u.event.dest); + (msg->u.event.headers != NULL && msg->u.event.headers->headers[0] != NULL && msg->u.event.headers->headers[1] != NULL) ? ParodusInfo(" Received upstream event data: dest '%s' traceParent: %s traceState: %s\n", msg->u.event.dest, msg->u.event.headers->headers[0], msg->u.event.headers->headers[1]) : ParodusInfo(" Received upstream event data: dest '%s'\n", msg->u.event.dest); + if(msg->u.event.transaction_uuid != NULL) { + ParodusInfo("transaction_uuid in event: %s\n", msg->u.event.transaction_uuid); + } partners_t *partnersList = NULL; int j = 0; @@ -379,7 +382,7 @@ void *processUpstreamMessage() //Sending to server for msgTypes 3, 5, 6, 7, 8. if( WRP_MSG_TYPE__REQ == msgType ) { - ParodusInfo(" Received upstream data with MsgType: %d dest: '%s' transaction_uuid: %s\n", msgType, msg->u.req.dest, msg->u.req.transaction_uuid ); + (msg->u.req.headers != NULL && msg->u.req.headers->headers[0] != NULL && msg->u.req.headers->headers[1] != NULL) ? ParodusInfo(" Received upstream data with MsgType: %d dest: '%s' transaction_uuid: %s traceParent: %s traceState: %s\n", msgType, msg->u.req.dest, msg->u.req.transaction_uuid, msg->u.req.headers->headers[0], msg->u.req.headers->headers[1]) : ParodusInfo(" Received upstream data with MsgType: %d dest: '%s' transaction_uuid: %s\n", msgType, msg->u.req.dest, msg->u.req.transaction_uuid); sendUpstreamMsgToServer(&message->msg, message->len); } else From c84a1bdfad135e4a63338e8c4b1ed0b2fb021c2a Mon Sep 17 00:00:00 2001 From: Vasuki Date: Wed, 11 Jan 2023 22:42:23 +0530 Subject: [PATCH 129/137] "Added null check as fix for parodus crash" --- src/connection.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/connection.c b/src/connection.c index dc39cdc..79ff389 100644 --- a/src/connection.c +++ b/src/connection.c @@ -783,8 +783,7 @@ int createNopollConnection(noPollCtx *ctx, server_list_t *server_list) } #endif } - - if(conn_ctx.current_server->allow_insecure <= 0) + if(conn_ctx.current_server != NULL && conn_ctx.current_server->allow_insecure <= 0) { ParodusInfo("Connected to server over SSL\n"); OnboardLog("Connected to server over SSL\n"); From bfc2659bbbd92ec5f4d09543a09bc78e5858e2be Mon Sep 17 00:00:00 2001 From: mmikhi643 Date: Tue, 14 Feb 2023 14:43:29 +0000 Subject: [PATCH 130/137] RDKC-13073 : Remove camera specific patch from parodus --- CMakeLists.txt | 14 ++++++++++++-- src/auth_token.c | 6 ++++++ src/auth_token.h | 4 ++++ src/main.c | 13 +++++++++++++ 4 files changed, 35 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index ec46ff3..21ed9f6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -47,6 +47,7 @@ if (ENABLE_WEBCFGBIN) include_directories(${INCLUDE_DIR}/rbus) endif (ENABLE_WEBCFGBIN) + # Get git commit hash #------------------------------------------------------------------------------- execute_process( @@ -63,9 +64,18 @@ add_definitions("-DGIT_COMMIT_TAG=\"${GIT_COMMIT_TAG}\"") add_definitions(-std=c99) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_GNU_SOURCE -DNOPOLL_LOGGER ") -set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Werror -Wall -Wno-missing-field-initializers") -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror -Wall") +if (DEVICE_CAMERA) +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-error=all -Wno-missing-field-initializers") +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-error=all") +add_definitions(-DDEVICE_CAMERA) +else (DEVICE_CAMERA) +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-error=all -Wno-missing-field-initializers") +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-error=all") +endif (DEVICE_CAMERA) +if (INCLUDE_BREAKPAD) +add_definitions(-DINCLUDE_BREAKPAD) +endif (INCLUDE_BREAKPAD) # pthread external dependency #------------------------------------------------------------------------------- diff --git a/src/auth_token.c b/src/auth_token.c index 3ab7af0..18468e8 100644 --- a/src/auth_token.c +++ b/src/auth_token.c @@ -223,8 +223,14 @@ void getAuthToken(ParodusCfg *cfg) * @param[in] nmemb size of delivered data * @param[out] data curl response data saved. */ +#ifndef DEVICE_CAMERA size_t write_callback_fn(void *buffer, size_t size, size_t nmemb, struct token_data *data) { +#else +size_t write_callback_fn(void *buffer, size_t size, size_t nmemb, void *datain) +{ + struct token_data *data = (struct token_data*) datain; +#endif //DEVICE_CAMERA ParodusCfg *cfg; size_t max_data_size = sizeof (cfg->webpa_auth_token); size_t index = data->size; diff --git a/src/auth_token.h b/src/auth_token.h index 905d527..d5d0aac 100644 --- a/src/auth_token.h +++ b/src/auth_token.h @@ -47,7 +47,11 @@ struct token_data { int requestNewAuthToken(char *newToken, size_t len, int r_count); void getAuthToken(ParodusCfg *cfg); +#ifndef DEVICE_CAMERA size_t write_callback_fn(void *buffer, size_t size, size_t nmemb, struct token_data *data); +#else +size_t write_callback_fn(void *buffer, size_t size, size_t nmemb, void *data); +#endif char* generate_trans_uuid(); #ifdef __cplusplus diff --git a/src/main.c b/src/main.c index 24691f1..ef4e7ae 100644 --- a/src/main.c +++ b/src/main.c @@ -24,7 +24,11 @@ #include "parodus_log.h" #include #ifdef INCLUDE_BREAKPAD +#ifndef DEVICE_CAMERA #include "breakpad_wrapper.h" +#else +#include "breakpadwrap.h" +#endif //DEVICE_CAMERA #endif #include "signal.h" #include "privilege.h" @@ -87,8 +91,17 @@ int main( int argc, char **argv) signal(SIGHUP, sig_handler); signal(SIGALRM, sig_handler); #ifdef INCLUDE_BREAKPAD +#ifndef DEVICE_CAMERA /* breakpad handles the signals SIGSEGV, SIGBUS, SIGFPE, and SIGILL */ breakpad_ExceptionHandler(); +#else + /* breakpad handles the signals SIGSEGV, SIGBUS, SIGFPE, and SIGILL */ + BreakPadWrapExceptionHandler eh; + eh = newBreakPadWrapExceptionHandler(); + if(NULL != eh) { + ParodusInfo("Breakpad Initialized\n"); + } +#endif //DEVICE_CAMERA #else signal(SIGSEGV, sig_handler); signal(SIGBUS, sig_handler); From 91ae0e82e22b9a378c6b4308b585c0c7285cfe06 Mon Sep 17 00:00:00 2001 From: mmikhi643 Date: Wed, 15 Feb 2023 16:20:20 +0000 Subject: [PATCH 131/137] RDKC-13073 : Remove camera specific patch from parodus --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 21ed9f6..6046877 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -68,7 +68,7 @@ if (DEVICE_CAMERA) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-error=all -Wno-missing-field-initializers") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-error=all") add_definitions(-DDEVICE_CAMERA) -else (DEVICE_CAMERA) +else () set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-error=all -Wno-missing-field-initializers") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-error=all") endif (DEVICE_CAMERA) From 2f3f1424b46c59865ea79648d048a926523f824c Mon Sep 17 00:00:00 2001 From: Sadhyama Vengilat Date: Fri, 17 Feb 2023 19:11:03 +0530 Subject: [PATCH 132/137] Subscribe to CurrentActiveInterfaceEvent before initial cloud connection --- src/conn_interface.c | 7 +++---- src/upstream_rbus.c | 2 +- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/conn_interface.c b/src/conn_interface.c index 5e65830..aadd177 100644 --- a/src/conn_interface.c +++ b/src/conn_interface.c @@ -99,7 +99,9 @@ void createSocketConnection(void (* initKeypress)()) #endif EventHandler(); - + #ifdef WAN_FAILOVER_SUPPORTED + subscribeCurrentActiveInterfaceEvent(); + #endif set_server_list_null (&server_list); create_conn_rtn = createNopollConnection(ctx, &server_list); if(!create_conn_rtn) @@ -113,9 +115,6 @@ void createSocketConnection(void (* initKeypress)()) UpStreamMsgQ = NULL; StartThread(handle_upstream, &upstream_tid); StartThread(processUpstreamMessage, &upstream_msg_tid); - #ifdef WAN_FAILOVER_SUPPORTED - subscribeCurrentActiveInterfaceEvent(); - #endif ParodusMsgQ = NULL; StartThread(messageHandlerTask, &downstream_tid); StartThread(serviceAliveTask, &svc_alive_tid); diff --git a/src/upstream_rbus.c b/src/upstream_rbus.c index 2ce1e4a..cefcc63 100644 --- a/src/upstream_rbus.c +++ b/src/upstream_rbus.c @@ -73,7 +73,7 @@ void subscribeRBUSevent() int subscribeCurrentActiveInterfaceEvent() { int rc = RBUS_ERROR_SUCCESS; - ParodusPrint("Subscribing to Device.X_RDK_WanManager.CurrentActiveInterface Event\n"); + ParodusInfo("Subscribing to Device.X_RDK_WanManager.CurrentActiveInterface Event\n"); rc = rbusEvent_SubscribeAsync(rbus_Handle,WEBPA_INTERFACE,eventReceiveHandler,subscribeAsyncHandler,"parodusInterface",10*20); if(rc != RBUS_ERROR_SUCCESS) { From 90200890167decc26cdd0a3997cdfd2f20f0a1b7 Mon Sep 17 00:00:00 2001 From: Sadhyama Vengilat Date: Tue, 28 Feb 2023 17:37:09 +0530 Subject: [PATCH 133/137] To skip max queue size callback for already processed msgs --- src/xmidtsend_rbus.c | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/src/xmidtsend_rbus.c b/src/xmidtsend_rbus.c index 12dd1c1..6758dc7 100644 --- a/src/xmidtsend_rbus.c +++ b/src/xmidtsend_rbus.c @@ -1640,13 +1640,21 @@ void checkMaxQandOptimize() } else { - ParodusInfo("Max Queue size reached. Low qos %d, set to DELETE state\n", qos); - //rbus callback to caller - char *errorMsg = NULL; - mapXmidtStatusToStatusMessage(QUEUE_OPTIMIZED, &errorMsg); - ParodusPrint("statusMsg is %s\n",errorMsg); - createOutParamsandSendAck(temp->msg, temp->asyncHandle, errorMsg, QUEUE_OPTIMIZED, NULL, RBUS_ERROR_INVALID_RESPONSE_FROM_DESTINATION); - updateXmidtState(temp, DELETE); + //Skip max queue callback if msg in the queue is already processed and set to delete. + if( temp->state == DELETE) + { + ParodusInfo("Msg is already processed and is in DELETE state, skipped Max Queue size callback %s\n", tempMsg->u.event.transaction_uuid); + } + else + { + ParodusInfo("Max Queue size reached. Low qos %d, set to DELETE state\n", qos); + //rbus callback to caller + char *errorMsg = NULL; + mapXmidtStatusToStatusMessage(QUEUE_OPTIMIZED, &errorMsg); + ParodusPrint("statusMsg is %s\n",errorMsg); + createOutParamsandSendAck(temp->msg, temp->asyncHandle, errorMsg, QUEUE_OPTIMIZED, NULL, RBUS_ERROR_INVALID_RESPONSE_FROM_DESTINATION); + updateXmidtState(temp, DELETE); + } } temp = temp->next; } From 9034ef9d10ac30a26d2a919a3835c27db2130171 Mon Sep 17 00:00:00 2001 From: Sadhyama Vengilat Date: Fri, 3 Mar 2023 21:03:51 +0530 Subject: [PATCH 134/137] To fix low qos msgs immediate delete during max queue size --- src/xmidtsend_rbus.c | 30 +++++++++++++----------------- src/xmidtsend_rbus.h | 4 ++-- 2 files changed, 15 insertions(+), 19 deletions(-) diff --git a/src/xmidtsend_rbus.c b/src/xmidtsend_rbus.c index 6758dc7..e0dd4b1 100644 --- a/src/xmidtsend_rbus.c +++ b/src/xmidtsend_rbus.c @@ -376,10 +376,9 @@ void* processXmidtUpstreamMsg() { XmidtMsg *Data = xmidtQ; pthread_mutex_unlock (&xmidt_mut); - ParodusPrint("mutex unlock in xmidt consumer thread\n"); - - checkMsgExpiry(); - checkMaxQandOptimize(); + ParodusPrint("mutex unlock in xmidt consumer\n"); + checkMsgExpiry(xmidtQ); + checkMaxQandOptimize(xmidtQ); cv = 0; ParodusPrint("check state\n"); @@ -1533,16 +1532,16 @@ int deleteFromXmidtQ(XmidtMsg **next_node) } //check if message is expired based on each qos and set to delete state. -void checkMsgExpiry() +void checkMsgExpiry(XmidtMsg *xmdMsg) { long long currTime = 0; struct timespec ts; char *errorMsg = NULL; XmidtMsg *temp = NULL; - temp = get_global_xmidthead(); + temp = xmdMsg; - while(temp != NULL) + if(temp != NULL) { getCurrentTime(&ts); currTime= (long long)ts.tv_sec; @@ -1551,8 +1550,7 @@ void checkMsgExpiry() if(temp->state == DELETE) { ParodusPrint("msg is already in DELETE state and about to delete, skipping state update. transid %s\n", tempMsg->u.event.transaction_uuid); - temp = temp->next; - continue; + return; } if(tempMsg->u.event.qos > 74) @@ -1611,12 +1609,11 @@ void checkMsgExpiry() { ParodusError("Invalid qos\n"); } - temp = temp->next; } } //To delete low qos messages from queue when max queue limit is reached. -void checkMaxQandOptimize() +void checkMaxQandOptimize(XmidtMsg *xmdMsg) { int qos = 0; @@ -1627,10 +1624,10 @@ void checkMaxQandOptimize() //Traverse through XmidtMsgQ list and set low qos msgs to DELETE XmidtMsg *temp = NULL; - temp = get_global_xmidthead(); + temp = xmdMsg; - while(temp != NULL) - { + if (temp != NULL) + { wrp_msg_t * tempMsg = temp->msg; qos = tempMsg->u.event.qos; ParodusPrint("qos is %d\n", qos); @@ -1640,10 +1637,10 @@ void checkMaxQandOptimize() } else { - //Skip max queue callback if msg in the queue is already processed and set to delete. + //Skip max queue callback when msg is already in DELETE state. if( temp->state == DELETE) { - ParodusInfo("Msg is already processed and is in DELETE state, skipped Max Queue size callback %s\n", tempMsg->u.event.transaction_uuid); + ParodusInfo("Msg is in DELETE state, skipped Max Queue size callback %s\n", tempMsg->u.event.transaction_uuid); } else { @@ -1656,7 +1653,6 @@ void checkMaxQandOptimize() updateXmidtState(temp, DELETE); } } - temp = temp->next; } } } diff --git a/src/xmidtsend_rbus.h b/src/xmidtsend_rbus.h index f1ce86d..a190d2d 100644 --- a/src/xmidtsend_rbus.h +++ b/src/xmidtsend_rbus.h @@ -114,8 +114,8 @@ void print_xmidMsg_list(); int deleteCloudACKNode(char* trans_id); int deleteFromXmidtQ(XmidtMsg **next_node); int checkCloudConn(); -void checkMaxQandOptimize(); -void checkMsgExpiry(); +void checkMaxQandOptimize(XmidtMsg *xmdMsg); +void checkMsgExpiry(XmidtMsg *xmdMsg); void mapXmidtStatusToStatusMessage(int status, char **message); int xmidtQOptmize(); #ifdef __cplusplus From fa49a52a94a6d32c782d6fe8c1b20552cdc1b6dd Mon Sep 17 00:00:00 2001 From: Sadhyama Vengilat Date: Thu, 16 Mar 2023 11:12:15 +0530 Subject: [PATCH 135/137] Register rbus logger to enable more debug logs from rbus --- src/connection.h | 2 +- src/main.c | 4 ++-- src/upstream_rbus.c | 30 ++++++++++++++++++++++++++++++ 3 files changed, 33 insertions(+), 3 deletions(-) diff --git a/src/connection.h b/src/connection.h index adff9c2..cb6606c 100644 --- a/src/connection.h +++ b/src/connection.h @@ -81,7 +81,7 @@ void set_global_reconnect_status(bool status); int get_cloud_disconnect_time(); void set_cloud_disconnect_time(int disconnTime); - +void rbus_registerLog(); /** * @brief Interface to self heal connection in progress getting stuck */ diff --git a/src/main.c b/src/main.c index ef4e7ae..d27fa76 100644 --- a/src/main.c +++ b/src/main.c @@ -116,10 +116,10 @@ int main( int argc, char **argv) /* TODO not ideal, but it fixes a more major problem for now. */ cfg = get_parodus_cfg(); memset(cfg,0,sizeof(ParodusCfg)); - - ParodusInfo("********** Starting component: Parodus **********\n "); + ParodusInfo("********** Starting component: Parodus **********\n "); drop_root_privilege(); #ifdef ENABLE_WEBCFGBIN + rbus_registerLog(); subscribeRBUSevent(); regXmidtSendDataMethod(); #endif diff --git a/src/upstream_rbus.c b/src/upstream_rbus.c index cefcc63..27c5fae 100644 --- a/src/upstream_rbus.c +++ b/src/upstream_rbus.c @@ -47,6 +47,36 @@ rbusHandle_t get_parodus_rbus_Handle(void) { return rbus_Handle; } +void rbus_log_handler( + rbusLogLevel level, + const char* file, + int line, + int threadId, + char* message) +{ + const char* slevel = ""; + + if(level < 0) + return; + + switch(level) + { + case RBUS_LOG_DEBUG: slevel = "DEBUG"; break; + case RBUS_LOG_INFO: slevel = "INFO"; break; + case RBUS_LOG_WARN: slevel = "WARN"; break; + case RBUS_LOG_ERROR: slevel = "ERROR"; break; + case RBUS_LOG_FATAL: slevel = "FATAL"; break; + } + ParodusInfo("%5s %s:%d -- Thread-%d: %s \n\r", slevel, file, line, threadId, message); +} + +void rbus_registerLog() +{ + ParodusInfo("Register rbus log handler\n"); + rbus_registerLogHandler(rbus_log_handler); + ParodusInfo("Registered rbus log handler\n"); +} + #ifdef WAN_FAILOVER_SUPPORTED void eventReceiveHandler( rbusHandle_t rbus_Handle, rbusEvent_t const* event, rbusEventSubscription_t* subscription ); #endif From ad0491179d1687b607eed08d3a9585d969176135 Mon Sep 17 00:00:00 2001 From: Sadhyama Vengilat Date: Thu, 16 Mar 2023 18:31:02 +0530 Subject: [PATCH 136/137] Remove threadId from rbus log --- src/upstream_rbus.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/upstream_rbus.c b/src/upstream_rbus.c index 27c5fae..eb0efc0 100644 --- a/src/upstream_rbus.c +++ b/src/upstream_rbus.c @@ -54,9 +54,10 @@ void rbus_log_handler( int threadId, char* message) { + ParodusPrint("threadId %d\n", threadId); const char* slevel = ""; - if(level < 0) + if(level < RBUS_LOG_DEBUG) return; switch(level) @@ -67,7 +68,7 @@ void rbus_log_handler( case RBUS_LOG_ERROR: slevel = "ERROR"; break; case RBUS_LOG_FATAL: slevel = "FATAL"; break; } - ParodusInfo("%5s %s:%d -- Thread-%d: %s \n\r", slevel, file, line, threadId, message); + ParodusInfo("%5s %s:%d -- %s\n", slevel, file, line, message); } void rbus_registerLog() From bc655cf9baa7e75015a2f38ee45b9a2ef87896f8 Mon Sep 17 00:00:00 2001 From: Sadhyama Vengilat Date: Fri, 17 Mar 2023 13:24:26 +0530 Subject: [PATCH 137/137] Parodus to enable rbus ERROR level logging --- src/ParodusInternal.h | 1 + src/connection.h | 2 +- src/main.c | 5 +++-- src/upstream_rbus.c | 9 +++++---- 4 files changed, 10 insertions(+), 7 deletions(-) diff --git a/src/ParodusInternal.h b/src/ParodusInternal.h index f3641db..d261331 100644 --- a/src/ParodusInternal.h +++ b/src/ParodusInternal.h @@ -164,6 +164,7 @@ void timespec_diff(struct timespec *start, struct timespec *stop, #ifdef ENABLE_WEBCFGBIN void subscribeRBUSevent(); int regXmidtSendDataMethod(); +void registerRbusLogger(); #endif #ifdef WAN_FAILOVER_SUPPORTED void setWebpaInterface(char *value); diff --git a/src/connection.h b/src/connection.h index cb6606c..adff9c2 100644 --- a/src/connection.h +++ b/src/connection.h @@ -81,7 +81,7 @@ void set_global_reconnect_status(bool status); int get_cloud_disconnect_time(); void set_cloud_disconnect_time(int disconnTime); -void rbus_registerLog(); + /** * @brief Interface to self heal connection in progress getting stuck */ diff --git a/src/main.c b/src/main.c index d27fa76..04f847b 100644 --- a/src/main.c +++ b/src/main.c @@ -116,10 +116,11 @@ int main( int argc, char **argv) /* TODO not ideal, but it fixes a more major problem for now. */ cfg = get_parodus_cfg(); memset(cfg,0,sizeof(ParodusCfg)); - ParodusInfo("********** Starting component: Parodus **********\n "); + + ParodusInfo("********** Starting component: Parodus **********\n "); drop_root_privilege(); #ifdef ENABLE_WEBCFGBIN - rbus_registerLog(); + registerRbusLogger(); subscribeRBUSevent(); regXmidtSendDataMethod(); #endif diff --git a/src/upstream_rbus.c b/src/upstream_rbus.c index eb0efc0..ba2b669 100644 --- a/src/upstream_rbus.c +++ b/src/upstream_rbus.c @@ -47,6 +47,8 @@ rbusHandle_t get_parodus_rbus_Handle(void) { return rbus_Handle; } + +/* Enables rbus ERROR level logs in parodus. Modify RBUS_LOG_ERROR check if more debug logs are needed from rbus. */ void rbus_log_handler( rbusLogLevel level, const char* file, @@ -57,7 +59,7 @@ void rbus_log_handler( ParodusPrint("threadId %d\n", threadId); const char* slevel = ""; - if(level < RBUS_LOG_DEBUG) + if(level < RBUS_LOG_ERROR) return; switch(level) @@ -71,11 +73,10 @@ void rbus_log_handler( ParodusInfo("%5s %s:%d -- %s\n", slevel, file, line, message); } -void rbus_registerLog() +void registerRbusLogger() { - ParodusInfo("Register rbus log handler\n"); rbus_registerLogHandler(rbus_log_handler); - ParodusInfo("Registered rbus log handler\n"); + ParodusPrint("Registered rbus log handler\n"); } #ifdef WAN_FAILOVER_SUPPORTED