mirror of
https://github.com/outbackdingo/parodus.git
synced 2026-01-27 18:20:04 +00:00
Compare commits
196 Commits
fixXmidtHe
...
quic
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e66c984146 | ||
|
|
fb24b899f7 | ||
|
|
e04c5a106a | ||
|
|
34cacec824 | ||
|
|
96403b76b6 | ||
|
|
eb481cdd4b | ||
|
|
3077125fa9 | ||
|
|
1a7ae0b785 | ||
|
|
bc655cf9ba | ||
|
|
ad0491179d | ||
|
|
fa49a52a94 | ||
|
|
25baef78a8 | ||
|
|
9034ef9d10 | ||
|
|
9020089016 | ||
|
|
664690e6a6 | ||
|
|
4aed47b730 | ||
|
|
2f3f1424b4 | ||
|
|
91ae0e82e2 | ||
|
|
bfc2659bbb | ||
|
|
f9c2878cbf | ||
|
|
c84a1bdfad | ||
|
|
0b0309c3dd | ||
|
|
f4e358c179 | ||
|
|
c1fc8d877b | ||
|
|
581d7fc966 | ||
|
|
0673d2624e | ||
|
|
0f82e7c2d9 | ||
|
|
4acf7f63ba | ||
|
|
df67b95244 | ||
|
|
e6e37053d3 | ||
|
|
d5a9ff36f6 | ||
|
|
f4536b778e | ||
|
|
b65b3ab3b0 | ||
|
|
954080bbd1 | ||
|
|
c8a2c95ae4 | ||
|
|
59bba50bee | ||
|
|
3090e50b02 | ||
|
|
af4eeb9199 | ||
|
|
2dd392dac6 | ||
|
|
7eae3da3f2 | ||
|
|
6e5ecc87f9 | ||
|
|
893c1c7547 | ||
|
|
3e30328738 | ||
|
|
f7412f9710 | ||
|
|
2e11d7e3ba | ||
|
|
5ddac7dc47 | ||
|
|
79d8a84c2e | ||
|
|
6f7332d054 | ||
|
|
26d409d884 | ||
|
|
d3e758ccb4 | ||
|
|
4af1aaf418 | ||
|
|
8e00ec8e5e | ||
|
|
43f55f9a99 | ||
|
|
bf3ee65360 | ||
|
|
9ebe011cb0 | ||
|
|
2bfc0a3c32 | ||
|
|
37bb19eeaa | ||
|
|
2c4980cf9e | ||
|
|
2248f31658 | ||
|
|
b97643ec42 | ||
|
|
66b16aa58f | ||
|
|
d3a56df184 | ||
|
|
8b5346e69b | ||
|
|
2a28e5d3e8 | ||
|
|
33af3f3eec | ||
|
|
c9b34d3c3f | ||
|
|
4add1c07ca | ||
|
|
75c833e3a8 | ||
|
|
5359fc79cf | ||
|
|
623192e301 | ||
|
|
b6490ba5b3 | ||
|
|
20ccd81086 | ||
|
|
f9ac95642c | ||
|
|
ae5d027612 | ||
|
|
e139a2d6b6 | ||
|
|
f655d6382b | ||
|
|
267e0eb796 | ||
|
|
00251153a4 | ||
|
|
d328a56e1a | ||
|
|
1a169561e4 | ||
|
|
8019489b86 | ||
|
|
ee3e006908 | ||
|
|
797c9de17f | ||
|
|
0bf4d754e5 | ||
|
|
3d98b4a80b | ||
|
|
80a50dead6 | ||
|
|
dd69d5ec5d | ||
|
|
1b23de5a12 | ||
|
|
8ea342b537 | ||
|
|
124fc11232 | ||
|
|
9abb37a005 | ||
|
|
c0edaaf31c | ||
|
|
32138613bb | ||
|
|
4cb167e8dd | ||
|
|
454ec26065 | ||
|
|
47af275929 | ||
|
|
34802d329d | ||
|
|
0297d994b5 | ||
|
|
ee7033c36c | ||
|
|
e35221efd2 | ||
|
|
c898fe6d0e | ||
|
|
0017e48f7d | ||
|
|
285a461f42 | ||
|
|
bb0f49a8b3 | ||
|
|
ee20e1fcb8 | ||
|
|
becacd8990 | ||
|
|
b05bfbe1fa | ||
|
|
9fb3f118b7 | ||
|
|
a124aafc5f | ||
|
|
0c4a2f407a | ||
|
|
523c9cc0d2 | ||
|
|
58492950d6 | ||
|
|
29906511b8 | ||
|
|
c6fa4b2ce8 | ||
|
|
0640f3516f | ||
|
|
60c37daa18 | ||
|
|
f51b4ef9c2 | ||
|
|
254c9f6763 | ||
|
|
8876fa9239 | ||
|
|
42fc9eb26e | ||
|
|
e8e652b076 | ||
|
|
dc935f9a09 | ||
|
|
d1462de56a | ||
|
|
13309a737e | ||
|
|
223e7db81c | ||
|
|
cd763823fc | ||
|
|
8537f27ece | ||
|
|
6381d9c55f | ||
|
|
980b7a88db | ||
|
|
e3c37b6764 | ||
|
|
67d58441ef | ||
|
|
f6ffda05ad | ||
|
|
6aee851944 | ||
|
|
aaa93e137d | ||
|
|
21e8c74f23 | ||
|
|
0248e7b241 | ||
|
|
da019382c6 | ||
|
|
aecbd885d5 | ||
|
|
0443c45924 | ||
|
|
314c840755 | ||
|
|
69f7e3eba0 | ||
|
|
e643f9e2fc | ||
|
|
7d2e9733d0 | ||
|
|
23c18da03e | ||
|
|
2218637f2c | ||
|
|
54f9983eff | ||
|
|
a577854172 | ||
|
|
e054ef580f | ||
|
|
79eb7ba6ef | ||
|
|
a291b047b6 | ||
|
|
656b1b0b58 | ||
|
|
22ecf0ef76 | ||
|
|
c97a3a3a20 | ||
|
|
46273d9766 | ||
|
|
7efed14c20 | ||
|
|
6d39163d47 | ||
|
|
5b0d3e19f3 | ||
|
|
0d8bb960f6 | ||
|
|
5d537fb139 | ||
|
|
47fcd6bdae | ||
|
|
24e1790ccb | ||
|
|
89fdd97d44 | ||
|
|
5ae2325fb6 | ||
|
|
9bad1142ab | ||
|
|
339b93cfd3 | ||
|
|
a34db44c90 | ||
|
|
bdec80dd07 | ||
|
|
1833c30e83 | ||
|
|
5b26fe38f5 | ||
|
|
f3a4daeb74 | ||
|
|
aaeb1f6612 | ||
|
|
0fb6288255 | ||
|
|
0fd3b76f27 | ||
|
|
48722ffa7c | ||
|
|
bf5d555d96 | ||
|
|
c02b141f7c | ||
|
|
9f40b7efe5 | ||
|
|
2a184e24c9 | ||
|
|
233a167cb4 | ||
|
|
5562d7ec48 | ||
|
|
49513df8f8 | ||
|
|
d0e6c5bd75 | ||
|
|
66f1f4d4fb | ||
|
|
19b4f56913 | ||
|
|
c30d5a3362 | ||
|
|
c98e2e2fb8 | ||
|
|
c78625f35a | ||
|
|
aeea6fbb03 | ||
|
|
d2d1590329 | ||
|
|
e693c09ca3 | ||
|
|
0b9f739323 | ||
|
|
d901efd10c | ||
|
|
824bcb81cf | ||
|
|
671fc5be59 | ||
|
|
4bf8683192 | ||
|
|
9300d76a8e |
6
.github/workflows/push.yml
vendored
6
.github/workflows/push.yml
vendored
@@ -38,9 +38,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
|
||||
|
||||
@@ -5,6 +5,10 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
|
||||
and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).
|
||||
|
||||
## [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
|
||||
- Update to use nopoll version 1.0.3
|
||||
|
||||
## [v1.1.5]
|
||||
- Add additional HTTP headers for call to Themis from Convey
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
|
||||
cmake_minimum_required(VERSION 2.8.7)
|
||||
cmake_minimum_required(VERSION 3.10)
|
||||
|
||||
#project(parodus VERSION 1.1.5)
|
||||
project(parodus)
|
||||
@@ -43,6 +43,11 @@ include_directories(${INCLUDE_DIR}
|
||||
${INCLUDE_DIR}/cjwt
|
||||
)
|
||||
|
||||
if (ENABLE_WEBCFGBIN)
|
||||
include_directories(${INCLUDE_DIR}/rbus)
|
||||
endif (ENABLE_WEBCFGBIN)
|
||||
|
||||
|
||||
# Get git commit hash
|
||||
#-------------------------------------------------------------------------------
|
||||
execute_process(
|
||||
@@ -59,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 ()
|
||||
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
|
||||
#-------------------------------------------------------------------------------
|
||||
@@ -86,7 +100,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 <SOURCE_DIR>/autogen.sh --prefix=${PREFIX}
|
||||
--includedir=${INCLUDE_DIR}
|
||||
--libdir=${LIBRARY_DIR}
|
||||
@@ -165,8 +179,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/Comcast/wrp-c.git
|
||||
GIT_TAG "1.0.1"
|
||||
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
|
||||
@@ -212,6 +226,42 @@ ExternalProject_Add(cjwt
|
||||
add_library(libcjwt STATIC SHARED IMPORTED)
|
||||
add_dependencies(libcjwt cjwt)
|
||||
|
||||
# libmsh3 external dependency
|
||||
#-------------------------------------------------------------------------------
|
||||
ExternalProject_Add(msh3
|
||||
PREFIX ${CMAKE_CURRENT_BINARY_DIR}/_prefix/msh3
|
||||
GIT_REPOSITORY https://github.com/nibanks/msh3.git
|
||||
GIT_TAG "v0.6.0"
|
||||
GIT_SUBMODULES_RECURSE true
|
||||
CMAKE_ARGS += -DCMAKE_INSTALL_PREFIX=${INSTALL_DIR} -G "Unix Makefiles" -DBUILD_TESTING=OFF
|
||||
)
|
||||
add_library(libmsh3 STATIC SHARED IMPORTED)
|
||||
add_dependencies(libmsh3 msh3)
|
||||
|
||||
|
||||
# libmsquic external dependency
|
||||
#-------------------------------------------------------------------------------
|
||||
# ExternalProject_Add(msquic
|
||||
# PREFIX ${CMAKE_CURRENT_BINARY_DIR}/_prefix/msquic
|
||||
# GIT_REPOSITORY https://github.com/microsoft/msquic.git
|
||||
# GIT_TAG "v2.1.8"
|
||||
# CMAKE_ARGS += -DCMAKE_INSTALL_PREFIX=${INSTALL_DIR} -DBUILD_TESTING=OFF
|
||||
# )
|
||||
# add_library(libmsquic STATIC SHARED IMPORTED)
|
||||
# add_dependencies(libmsquic msquic)
|
||||
|
||||
# # libnghttp3 external dependency
|
||||
# #-------------------------------------------------------------------------------
|
||||
# ExternalProject_Add(nghttp3
|
||||
# PREFIX ${CMAKE_CURRENT_BINARY_DIR}/_prefix/nghttp3
|
||||
|
||||
# GIT_REPOSITORY https://github.com/ngtcp2/nghttp3.git
|
||||
# GIT_TAG "v0.10.0"
|
||||
# CMAKE_ARGS += -DCMAKE_INSTALL_PREFIX=${INSTALL_DIR} -DBUILD_TESTING=OFF
|
||||
# )
|
||||
# add_library(libnghttp3 STATIC SHARED IMPORTED)
|
||||
# add_dependencies(libnghttp3 nghttp3)
|
||||
|
||||
if (FEATURE_DNS_QUERY)
|
||||
# libucresolv external dependency
|
||||
#-------------------------------------------------------------------------------
|
||||
@@ -229,6 +279,26 @@ include_directories(${INCLUDE_DIR}
|
||||
|
||||
endif (FEATURE_DNS_QUERY)
|
||||
|
||||
if (ENABLE_WEBCFGBIN)
|
||||
# rbus external dependency
|
||||
#-------------------------------------------------------------------------------
|
||||
ExternalProject_Add(rbus
|
||||
PREFIX ${CMAKE_CURRENT_BINARY_DIR}/_prefix/rbus
|
||||
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)
|
||||
|
||||
if (BUILD_TESTING)
|
||||
# cmocka external dependency
|
||||
#-------------------------------------------------------------------------------
|
||||
@@ -253,6 +323,14 @@ 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)
|
||||
|
||||
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)
|
||||
|
||||
19
Dockerfile
Normal file
19
Dockerfile
Normal file
@@ -0,0 +1,19 @@
|
||||
# build stage
|
||||
FROM alpine:3.12
|
||||
|
||||
RUN \
|
||||
apk add --no-cache bsd-compat-headers linux-headers cmake autoconf make musl-dev gcc g++ openssl openssl-dev git cunit cunit-dev automake libtool util-linux-dev && \
|
||||
mkdir -p build
|
||||
|
||||
|
||||
COPY src src
|
||||
COPY patches patches
|
||||
COPY tests tests
|
||||
COPY CMakeLists.txt .
|
||||
COPY run.sh .
|
||||
|
||||
|
||||
RUN cd build && \
|
||||
cmake .. && make
|
||||
|
||||
CMD ["build/src/parodus"]
|
||||
78
run.sh
Executable file
78
run.sh
Executable file
@@ -0,0 +1,78 @@
|
||||
#!/bin/sh
|
||||
parodus_port=16014d
|
||||
|
||||
if [[ -z "${URL}" ]]; then
|
||||
URL="http://petasos:6400"
|
||||
fi
|
||||
|
||||
if [[ -z "${FIRMWARE}" ]]; then
|
||||
FIRMWARE="mock-rdkb-firmware"
|
||||
fi
|
||||
|
||||
if [[ -z "${BOOT_TIME}" ]]; then
|
||||
BOOT_TIME=$(date +%s)
|
||||
fi
|
||||
|
||||
if [[ -z "${HW_MANUFACTURER}" ]]; then
|
||||
HW_MANUFACTURER="Example Inc."
|
||||
fi
|
||||
|
||||
if [[ -z "${REBOOT_REASON}" ]]; then
|
||||
REBOOT_REASON="unknown"
|
||||
fi
|
||||
|
||||
if [[ -z "${SERIAL_NUMBER}" ]]; then
|
||||
SERIAL_NUMBER="mock-rdkb-simulator"
|
||||
fi
|
||||
|
||||
if [[ -z "${PARTNER_ID}" ]]; then
|
||||
PARTNER_ID="comcast"
|
||||
fi
|
||||
|
||||
if [[ -z "${CMAC}" ]]; then
|
||||
CMAC="112233445566"
|
||||
fi
|
||||
|
||||
if [[ -z "${TOKEN_SERVER_URL}" ]]; then
|
||||
TOKEN_SERVER_URL="http://themis:6501/issue"
|
||||
fi
|
||||
|
||||
if [[ -z "${SSL_CERT_PATH}" ]]; then
|
||||
SSL_CERT_PATH="/etc/ssl/certs/ca-certificates.crt"
|
||||
fi
|
||||
|
||||
#In this docker-compose cluster, themis has mtls disabled so
|
||||
#feel free to ignore the --client-cert-path flag value
|
||||
#it is required by parodus to fetch a token
|
||||
if [[ -z "${CLIENT_CERT_PATH}" ]]; then
|
||||
CLIENT_CERT_PATH="/etc/ssl/certs/ca-certificates.crt"
|
||||
fi
|
||||
|
||||
# MTLS_CLIENT_* is used to authenticate with talaria.
|
||||
if [[ -z "${MTLS_CLIENT_CERT_PATH}" ]]; then
|
||||
MTLS_CLIENT_CERT_PATH=""
|
||||
fi
|
||||
|
||||
if [[ -z "${MTLS_CLIENT_KEY_PATH}" ]]; then
|
||||
MTLS_CLIENT_KEY_PATH=""
|
||||
fi
|
||||
|
||||
build/src/parodus --hw-model=aker-testing \
|
||||
--ssl-cert-path=$SSL_CERT_PATH \
|
||||
--client-cert-path=$CLIENT_CERT_PATH \
|
||||
--mtls-client-cert-path=$MTLS_CLIENT_CERT_PATH \
|
||||
--mtls-client-key-path=$MTLS_CLIENT_KEY_PATH \
|
||||
--hw-serial-number=$SERIAL_NUMBER \
|
||||
--hw-manufacturer=$HW_MANUFACTURER \
|
||||
--hw-mac=$CMAC \
|
||||
--hw-last-reboot-reason=$REBOOT_REASON \
|
||||
--fw-name=$FIRMWARE \
|
||||
--boot-time=$BOOT_TIME \
|
||||
--partner-id=$PARTNER_ID \
|
||||
--parodus-local-url=tcp://127.0.0.1:$parodus_port \
|
||||
--webpa-ping-timeout=60 \
|
||||
--token-server-url=$TOKEN_SERVER_URL \
|
||||
--webpa-backoff-max=2 \
|
||||
--webpa-interface-used=eth0 \
|
||||
--webpa-url=$URL \
|
||||
--force-ipv4
|
||||
@@ -23,6 +23,15 @@ else()
|
||||
set(SOURCES ${SOURCES} seshat_interface_stub.c)
|
||||
endif (ENABLE_SESHAT)
|
||||
|
||||
if (ENABLE_WEBCFGBIN)
|
||||
set(SOURCES ${SOURCES} upstream_rbus.c xmidtsend_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})
|
||||
|
||||
@@ -53,5 +62,7 @@ if (ENABLE_SESHAT)
|
||||
target_link_libraries (parodus -llibseshat)
|
||||
endif (ENABLE_SESHAT)
|
||||
|
||||
|
||||
if (ENABLE_WEBCFGBIN)
|
||||
target_link_libraries (parodus -lrbus)
|
||||
endif (ENABLE_WEBCFGBIN)
|
||||
install (TARGETS parodus DESTINATION bin)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -161,7 +161,14 @@ 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();
|
||||
int regXmidtSendDataMethod();
|
||||
void registerRbusLogger();
|
||||
#endif
|
||||
#ifdef WAN_FAILOVER_SUPPORTED
|
||||
void setWebpaInterface(char *value);
|
||||
#endif
|
||||
/*------------------------------------------------------------------------------*/
|
||||
/* For interface_down_event Flag */
|
||||
/*------------------------------------------------------------------------------*/
|
||||
@@ -178,7 +185,12 @@ 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);
|
||||
|
||||
int cloud_status_is_online (void);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
||||
@@ -64,6 +64,7 @@ int requestNewAuthToken(char *newToken, size_t len, int r_count)
|
||||
struct curl_slist *list = NULL;
|
||||
struct curl_slist *headers_list = NULL;
|
||||
|
||||
char webpa_interface[64]={'\0'};
|
||||
double total;
|
||||
|
||||
struct token_data data;
|
||||
@@ -80,9 +81,10 @@ 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)
|
||||
parStrncpy(webpa_interface, getWebpaInterface(), sizeof(webpa_interface));
|
||||
if(webpa_interface !=NULL && strlen(webpa_interface) >0)
|
||||
{
|
||||
curl_easy_setopt(curl, CURLOPT_INTERFACE, get_parodus_cfg()->webpa_interface_used);
|
||||
curl_easy_setopt(curl, CURLOPT_INTERFACE, webpa_interface);
|
||||
}
|
||||
/* set callback for writing received data */
|
||||
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_callback_fn);
|
||||
@@ -221,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;
|
||||
@@ -304,7 +312,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);
|
||||
|
||||
@@ -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
|
||||
|
||||
131
src/config.c
131
src/config.c
@@ -33,6 +33,13 @@
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* File Scoped Variables */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
pthread_mutex_t config_mut=PTHREAD_MUTEX_INITIALIZER;
|
||||
|
||||
//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'};
|
||||
|
||||
static ParodusCfg parodusCfg;
|
||||
static unsigned int rsa_algorithms =
|
||||
@@ -40,6 +47,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)
|
||||
{
|
||||
@@ -61,6 +77,31 @@ void reset_cloud_disconnect_reason(ParodusCfg *cfg)
|
||||
cfg->cloud_disconnect = NULL;
|
||||
}
|
||||
|
||||
void set_cloud_status(char *status)
|
||||
{
|
||||
if(status != NULL)
|
||||
{
|
||||
pthread_mutex_lock(&config_mut);
|
||||
get_parodus_cfg()->cloud_status = status;
|
||||
if(strcmp (status, CLOUD_STATUS_ONLINE) == 0)
|
||||
{
|
||||
pthread_cond_signal(&cloud_status_cond);
|
||||
}
|
||||
pthread_mutex_unlock(&config_mut);
|
||||
}
|
||||
}
|
||||
|
||||
char *get_cloud_status(void)
|
||||
{
|
||||
char *status = NULL;
|
||||
pthread_mutex_lock(&config_mut);
|
||||
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)
|
||||
{
|
||||
@@ -146,9 +187,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++;
|
||||
@@ -160,9 +201,48 @@ 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]);
|
||||
}
|
||||
ParodusPrint("mac in lowercase is %s\n", mac);
|
||||
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)
|
||||
{
|
||||
@@ -355,6 +435,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 ENABLE_WEBCFGBIN
|
||||
{"max-queue-size", required_argument, 0, 'q'},
|
||||
#endif
|
||||
{"partner-id", required_argument, 0, 'p'},
|
||||
#ifdef ENABLE_SESHAT
|
||||
{"seshat-url", required_argument, 0, 'e'},
|
||||
@@ -402,7 +485,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. */
|
||||
@@ -417,8 +500,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':
|
||||
@@ -488,6 +571,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 ENABLE_WEBCFGBIN
|
||||
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
|
||||
@@ -724,7 +817,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
|
||||
{
|
||||
@@ -792,7 +885,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 ENABLE_WEBCFGBIN
|
||||
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;
|
||||
@@ -848,4 +943,26 @@ void loadParodusCfg(ParodusCfg * config,ParodusCfg *cfg)
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef WAN_FAILOVER_SUPPORTED
|
||||
void setWebpaInterface(char *value)
|
||||
{
|
||||
pthread_mutex_lock (&config_mut);
|
||||
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);
|
||||
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
|
||||
ParodusPrint("webpa_interface:%s\n", webpa_interface);
|
||||
return webpa_interface;
|
||||
}
|
||||
|
||||
|
||||
@@ -24,6 +24,7 @@
|
||||
#ifndef _CONFIG_H_
|
||||
#define _CONFIG_H_
|
||||
|
||||
#include <pthread.h>
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
@@ -87,6 +88,9 @@ typedef struct
|
||||
char webpa_uuid[64];
|
||||
unsigned int flags;
|
||||
char local_url[124];
|
||||
#ifdef ENABLE_WEBCFGBIN
|
||||
unsigned int max_queue_size;
|
||||
#endif
|
||||
char partner_id[64];
|
||||
#ifdef ENABLE_SESHAT
|
||||
char seshat_url[128];
|
||||
@@ -139,6 +143,10 @@ 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 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
|
||||
|
||||
@@ -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;
|
||||
@@ -98,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)
|
||||
@@ -131,14 +134,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)
|
||||
{
|
||||
@@ -195,7 +201,8 @@ void createSocketConnection(void (* initKeypress)())
|
||||
}
|
||||
createNopollConnection(ctx, &server_list);
|
||||
}
|
||||
} while(!get_close_retry() && !g_shutdown);
|
||||
//process exit only when g_shutdown is true.
|
||||
} while(FOREVER() && !g_shutdown);
|
||||
|
||||
pthread_mutex_lock (get_global_svc_mut());
|
||||
pthread_cond_signal (get_global_svc_con());
|
||||
|
||||
@@ -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;
|
||||
@@ -130,7 +132,10 @@ void set_cloud_disconnect_time(int disconnTime)
|
||||
cloud_disconnect_max_time = disconnTime;
|
||||
}
|
||||
|
||||
|
||||
int get_parodus_init()
|
||||
{
|
||||
return init;
|
||||
}
|
||||
//--------------------------------------------------------------------
|
||||
// createNopollConnection_logic:
|
||||
|
||||
@@ -234,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);
|
||||
}
|
||||
|
||||
@@ -320,8 +325,14 @@ 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_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;
|
||||
@@ -334,6 +345,8 @@ static int backoff_delay (backoff_timer_t *timer)
|
||||
rtn = pthread_cond_timedwait (&backoff_delay_con, &backoff_delay_mut, &ts);
|
||||
pthread_mutex_unlock (&backoff_delay_mut);
|
||||
|
||||
pthread_condattr_destroy(&backoff_delay_cond_attr);
|
||||
|
||||
if (g_shutdown)
|
||||
return BACKOFF_SHUTDOWN;
|
||||
if ((rtn != 0) && (rtn != ETIMEDOUT)) {
|
||||
@@ -697,7 +710,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;
|
||||
}
|
||||
}
|
||||
@@ -714,9 +728,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;
|
||||
@@ -752,6 +766,14 @@ 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 "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
|
||||
/* if we don't already have a valid jwt, look up server information */
|
||||
if (server_is_null (&conn_ctx.server_list->jwt))
|
||||
@@ -761,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");
|
||||
@@ -772,9 +793,12 @@ int createNopollConnection(noPollCtx *ctx, server_list_t *server_list)
|
||||
ParodusInfo("Connected to server\n");
|
||||
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);
|
||||
|
||||
/* 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)
|
||||
@@ -782,9 +806,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
|
||||
}
|
||||
|
||||
@@ -800,6 +824,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;
|
||||
}
|
||||
|
||||
@@ -844,7 +871,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;
|
||||
}
|
||||
@@ -884,8 +911,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());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -934,3 +961,8 @@ void registerParodusOnPingStatusChangeHandler(parodusOnPingStatusChangeHandler c
|
||||
on_ping_status_change = callback_func;
|
||||
}
|
||||
|
||||
void registerParodusOnConnStatusChangeHandler(parodusOnConnStatusChangeHandler callback_func)
|
||||
{
|
||||
on_conn_status_change = callback_func;
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
138
src/connection_http3.cpp
Normal file
138
src/connection_http3.cpp
Normal file
@@ -0,0 +1,138 @@
|
||||
/*++
|
||||
|
||||
Copyright (c) Microsoft Corporation.
|
||||
Licensed under the MIT License.
|
||||
|
||||
--*/
|
||||
|
||||
#include "msh3.hpp"
|
||||
#include <vector>
|
||||
#include <cstring>
|
||||
|
||||
using namespace std;
|
||||
|
||||
char * host = "nginx";
|
||||
//char * path = "/api/v2/devices"
|
||||
char * path = "/"
|
||||
|
||||
struct Arguments {
|
||||
const char* Host { host };
|
||||
MsH3Addr Address {443};
|
||||
vector<const char*> Paths {path};
|
||||
bool Unsecure { true };
|
||||
bool Print { true };
|
||||
uint32_t Count { 1 };
|
||||
} Args;
|
||||
|
||||
void MSH3_CALL HeaderReceived(struct MsH3Request* , const MSH3_HEADER* Header) {
|
||||
if (Args.Print) {
|
||||
fwrite(Header->Name, 1, Header->NameLength, stdout);
|
||||
printf(":");
|
||||
fwrite(Header->Value, 1, Header->ValueLength, stdout);
|
||||
printf("\n");
|
||||
}
|
||||
}
|
||||
|
||||
bool MSH3_CALL DataReceived(struct MsH3Request* , uint32_t* Length, const uint8_t* Data) {
|
||||
if (Args.Print) fwrite(Data, 1, *Length, stdout);
|
||||
return true;
|
||||
}
|
||||
|
||||
void MSH3_CALL Complete(struct MsH3Request* Request, bool Aborted, uint64_t AbortError) {
|
||||
const uint32_t Index = (uint32_t)(size_t)Request->AppContext;
|
||||
if (Args.Print) printf("\n");
|
||||
if (Aborted) printf("Request %u aborted: 0x%llx\n", Index, (long long unsigned)AbortError);
|
||||
else printf("Request %u complete\n", Index);
|
||||
}
|
||||
|
||||
void ParseArgs(int argc, char **argv) {
|
||||
if (argc < 2 || !strcmp(argv[1], "-?") || !strcmp(argv[1], "-h") || !strcmp(argv[1], "--help")) {
|
||||
printf("usage: %s <server[:port]> [options...]\n"
|
||||
" -c, --count <num> The number of times to query each path (def=1)\n"
|
||||
" -h, --help Prints this help text\n"
|
||||
" -p, --path <path(s)> The paths to query\n"
|
||||
" -u, --unsecure Allows unsecure connections\n"
|
||||
" -v, --verbose Enables verbose output\n"
|
||||
" -V, --version Prints out the version\n",
|
||||
argv[0]);
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
// Parse the server[:port] argument.
|
||||
Args.Host = argv[1];
|
||||
char *port = strrchr(argv[1], ':');
|
||||
if (port) {
|
||||
*port = 0; port++;
|
||||
Args.Address.SetPort((uint16_t)atoi(port));
|
||||
}
|
||||
|
||||
// Parse options.
|
||||
for (int i = 2; i < argc; ++i) {
|
||||
if (!strcmp(argv[i], "--count") || !strcmp(argv[i], "-c")) {
|
||||
if (++i >= argc) { printf("Missing count value\n"); exit(-1); }
|
||||
Args.Count = (uint32_t)atoi(argv[i]);
|
||||
|
||||
} else if (!strcmp(argv[i], "--path") || !strcmp(argv[i], "-p")) {
|
||||
if (++i >= argc) { printf("Missing path value(s)\n"); exit(-1); }
|
||||
|
||||
char* Path = (char*)argv[i];
|
||||
do {
|
||||
char* End = strchr(Path, ',');
|
||||
if (End) *End = 0;
|
||||
Args.Paths.push_back(Path);
|
||||
if (!End) break;
|
||||
Path = End + 1;
|
||||
} while (true);
|
||||
|
||||
} else if (!strcmp(argv[i], "--unsecure") || !strcmp(argv[i], "-u")) {
|
||||
Args.Unsecure = true;
|
||||
|
||||
} else if (!strcmp(argv[i], "--verbose") || !strcmp(argv[i], "-v")) {
|
||||
Args.Print = true;
|
||||
|
||||
} else if (!strcmp(argv[i], "--version") || !strcmp(argv[i], "-V")) {
|
||||
uint32_t Version[4]; MsH3Version(Version);
|
||||
printf("Using msh3 v%u.%u.%u.%u\n", Version[0], Version[1], Version[2], Version[3]);
|
||||
}
|
||||
}
|
||||
|
||||
if (Args.Paths.empty()) {
|
||||
Args.Paths.push_back("/");
|
||||
}
|
||||
}
|
||||
|
||||
int MSH3_CALL init(int argc, char **argv) {
|
||||
ParseArgs(argc, argv);
|
||||
|
||||
MSH3_HEADER Headers[] = {
|
||||
{ ":method", 7, "GET", 3 },
|
||||
{ ":path", 5, Args.Paths[0], strlen(Args.Paths[0]) },
|
||||
{ ":scheme", 7, "https", 5 },
|
||||
{ ":authority", 10, Args.Host, strlen(Args.Host) },
|
||||
{ "user-agent", 10, "curl/7.82.0-DEV", 15 },
|
||||
{ "accept", 6, "*/*", 3 },
|
||||
};
|
||||
const size_t HeadersCount = sizeof(Headers)/sizeof(MSH3_HEADER);
|
||||
|
||||
MsH3Api Api;
|
||||
if (Api.IsValid()) {
|
||||
MsH3Connection Connection(Api, Args.Host, Args.Address, Args.Unsecure);
|
||||
if (Connection.IsValid()) {
|
||||
for (auto Path : Args.Paths) {
|
||||
printf("HTTP/3 GET https://%s%s\n", Args.Host, Path);
|
||||
Headers[1].Value = Path;
|
||||
Headers[1].ValueLength = strlen(Path);
|
||||
for (uint32_t i = 0; i < Args.Count; ++i) {
|
||||
auto Request = new (std::nothrow) MsH3Request(Connection, Headers, HeadersCount, MSH3_REQUEST_FLAG_FIN, (void*)(size_t)(i+1), HeaderReceived, DataReceived, Complete, CleanUpAutoDelete);
|
||||
if (!Request || !Request->IsValid()) {
|
||||
printf("Request %u failed to start\n", i+1);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
Connection.ShutdownComplete.Wait();
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -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)
|
||||
{
|
||||
@@ -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)
|
||||
|
||||
@@ -27,6 +27,9 @@
|
||||
#include "partners_check.h"
|
||||
#include "ParodusInternal.h"
|
||||
#include "crud_interface.h"
|
||||
#ifdef ENABLE_WEBCFGBIN
|
||||
#include "xmidtsend_rbus.h"
|
||||
#endif
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Function Prototypes */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
@@ -91,6 +94,7 @@ void listenerOnMessage(void * msg, size_t msgSize)
|
||||
{
|
||||
ParodusPrint("numOfClients registered is %d\n", get_numOfClients());
|
||||
int ret = validate_partner_id(message, NULL);
|
||||
ParodusPrint("validate_partner_id returns %d\n", ret);
|
||||
if(ret < 0)
|
||||
{
|
||||
response = cJSON_CreateObject();
|
||||
@@ -98,7 +102,6 @@ void listenerOnMessage(void * msg, size_t msgSize)
|
||||
cJSON_AddStringToObject(response, "message", "Invalid partner_id");
|
||||
}
|
||||
|
||||
|
||||
destVal = strdup(((WRP_MSG_TYPE__EVENT == msgType) ? message->u.event.dest :
|
||||
((WRP_MSG_TYPE__REQ == msgType) ? message->u.req.dest : message->u.crud.dest)));
|
||||
|
||||
@@ -120,10 +123,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);
|
||||
|
||||
@@ -168,13 +171,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) &&
|
||||
@@ -235,6 +241,37 @@ 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))
|
||||
{
|
||||
if(get_parodus_cfg()->max_queue_size > 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 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
|
||||
{
|
||||
ParodusError("cloud ack transaction id is NULL\n");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
ParodusInfo("cloud ack received with low qos %d, ignoring it\n", message->u.event.qos);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
ParodusInfo("cloud ack is ignored as max queue size is %d\n", get_parodus_cfg()->max_queue_size );
|
||||
}
|
||||
}
|
||||
#endif
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
@@ -22,12 +22,15 @@
|
||||
*/
|
||||
|
||||
#include "heartBeat.h"
|
||||
#include "time.h"
|
||||
#include <stdbool.h>
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
19
src/main.c
19
src/main.c
@@ -24,7 +24,11 @@
|
||||
#include "parodus_log.h"
|
||||
#include <curl/curl.h>
|
||||
#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);
|
||||
@@ -98,6 +111,7 @@ int main( int argc, char **argv)
|
||||
ParodusCfg *cfg;
|
||||
|
||||
ParodusInfo ("RAND_MAX is %ld (0x%lx)\n", RAND_MAX, RAND_MAX);
|
||||
ParodusInfo("TEST PRINT");
|
||||
srandom (getpid());
|
||||
|
||||
/* TODO not ideal, but it fixes a more major problem for now. */
|
||||
@@ -106,6 +120,11 @@ int main( int argc, char **argv)
|
||||
|
||||
ParodusInfo("********** Starting component: Parodus **********\n ");
|
||||
drop_root_privilege();
|
||||
#ifdef ENABLE_WEBCFGBIN
|
||||
registerRbusLogger();
|
||||
subscribeRBUSevent();
|
||||
regXmidtSendDataMethod();
|
||||
#endif
|
||||
setDefaultValuesToCfg(cfg);
|
||||
if (0 != parseCommandLine(argc,argv,cfg)) {
|
||||
abort();
|
||||
|
||||
@@ -149,6 +149,7 @@ void listenerOnPingMessage (noPollCtx * ctx, noPollConn * conn, noPollMsg * msg,
|
||||
if (nopoll_msg_opcode(msg) == NOPOLL_PING_FRAME)
|
||||
{
|
||||
reset_heartBeatTimer();
|
||||
set_pingTimeStamp();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -50,9 +50,9 @@ 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_parodus_cfg()->cloud_status;
|
||||
const char *status = get_cloud_status();
|
||||
if (NULL == status)
|
||||
return false;
|
||||
return (strcmp (status, CLOUD_STATUS_ONLINE) == 0);
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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; j<partnersList->count; j++)
|
||||
{
|
||||
if(NULL != partnersList->partner_ids[j])
|
||||
{
|
||||
free(partnersList->partner_ids[j]);
|
||||
}
|
||||
}
|
||||
free(partnersList);
|
||||
}
|
||||
free(partnerId);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
|
||||
#include "time.h"
|
||||
#include "parodus_log.h"
|
||||
#include <errno.h>
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* External Functions */
|
||||
@@ -24,7 +25,10 @@
|
||||
|
||||
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 );
|
||||
}
|
||||
}
|
||||
|
||||
uint64_t getCurrentTimeInMicroSeconds(struct timespec *timer)
|
||||
@@ -34,7 +38,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)
|
||||
|
||||
@@ -40,7 +40,7 @@
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
void *metadataPack;
|
||||
size_t metaPackSize=-1;
|
||||
size_t metaPackSize=0;
|
||||
|
||||
|
||||
UpStreamMsg *UpStreamMsgQ = NULL;
|
||||
@@ -83,7 +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);
|
||||
|
||||
struct data meta_pack[METADATA_COUNT] = {
|
||||
{HW_MODELNAME, get_parodus_cfg()->hw_model},
|
||||
{HW_SERIALNUMBER, get_parodus_cfg()->hw_serial_number},
|
||||
@@ -95,10 +94,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, get_parodus_cfg()->webpa_interface_used},
|
||||
{WEBPA_INTERFACE, getWebpaInterface()},
|
||||
{PARTNER_ID, get_parodus_cfg()->partner_id}
|
||||
};
|
||||
|
||||
const data_t metapack = {METADATA_COUNT, meta_pack};
|
||||
|
||||
metaPackSize = wrp_pack_metadata( &metapack , &metadataPack );
|
||||
@@ -322,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;
|
||||
|
||||
@@ -330,6 +331,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;
|
||||
@@ -339,6 +341,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)
|
||||
@@ -371,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
|
||||
@@ -596,11 +607,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 +627,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 +641,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;
|
||||
}
|
||||
ParodusPrint("sendRetStatus is %d\n", sendRetStatus);
|
||||
|
||||
return sendRetStatus;
|
||||
}
|
||||
|
||||
@@ -47,11 +47,15 @@ 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);
|
||||
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);
|
||||
#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);
|
||||
|
||||
243
src/upstream_rbus.c
Normal file
243
src/upstream_rbus.c
Normal file
@@ -0,0 +1,243 @@
|
||||
/**
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
/**
|
||||
* @file upstream_rbus.c
|
||||
*
|
||||
* @description This is used for parodus-RBUS communication
|
||||
* to send notification events upstream to cloud.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <rbus.h>
|
||||
#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
|
||||
#define WEBPA_INTERFACE "Device.X_RDK_WanManager.CurrentActiveInterface"
|
||||
#endif
|
||||
|
||||
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);
|
||||
|
||||
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,
|
||||
int line,
|
||||
int threadId,
|
||||
char* message)
|
||||
{
|
||||
ParodusPrint("threadId %d\n", threadId);
|
||||
const char* slevel = "";
|
||||
|
||||
if(level < RBUS_LOG_ERROR)
|
||||
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 -- %s\n", slevel, file, line, message);
|
||||
}
|
||||
|
||||
void registerRbusLogger()
|
||||
{
|
||||
rbus_registerLogHandler(rbus_log_handler);
|
||||
ParodusPrint("Registered rbus log handler\n");
|
||||
}
|
||||
|
||||
#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()
|
||||
{
|
||||
int rc = RBUS_ERROR_SUCCESS;
|
||||
err = rbus_open(&rbus_Handle, "parodus");
|
||||
if (err)
|
||||
{
|
||||
ParodusError("rbus_open failed :%s\n", rbusError_ToString(err));
|
||||
return;
|
||||
}
|
||||
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");
|
||||
}
|
||||
|
||||
#ifdef WAN_FAILOVER_SUPPORTED
|
||||
/* API to subscribe Active Interface name on value change event*/
|
||||
int subscribeCurrentActiveInterfaceEvent()
|
||||
{
|
||||
int rc = RBUS_ERROR_SUCCESS;
|
||||
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)
|
||||
{
|
||||
ParodusError("%s subscribe failed : %d - %s\n", WEBPA_INTERFACE, rc, rbusError_ToString(rc));
|
||||
}
|
||||
return rc;
|
||||
}
|
||||
#endif
|
||||
|
||||
void processWebconfigUpstreamEvent(rbusHandle_t handle, rbusEvent_t const* event, rbusEventSubscription_t* subscription)
|
||||
{
|
||||
(void)handle;
|
||||
(void)subscription;
|
||||
|
||||
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");
|
||||
bytesVal = rbusValue_GetBytes(value, &len);
|
||||
|
||||
bytes = (void*) bytesVal;
|
||||
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);
|
||||
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));
|
||||
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;
|
||||
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;
|
||||
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)
|
||||
{
|
||||
sendUpstreamMsgToServer(&bytes, size);
|
||||
}
|
||||
free(eventMsg);
|
||||
free(bytes);
|
||||
bytes = NULL;
|
||||
}
|
||||
else
|
||||
{
|
||||
sendUpstreamMsgToServer((void **)(&bytes), len);
|
||||
}
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
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));
|
||||
}
|
||||
|
||||
#ifdef WAN_FAILOVER_SUPPORTED
|
||||
void eventReceiveHandler( rbusHandle_t rbus_Handle, rbusEvent_t const* event, rbusEventSubscription_t* subscription )
|
||||
{
|
||||
(void)subscription;
|
||||
ParodusPrint("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");
|
||||
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);
|
||||
|
||||
// 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();
|
||||
|
||||
}
|
||||
else {
|
||||
if(oldValue == NULL) {
|
||||
ParodusError("oldValue is NULL\n");
|
||||
}
|
||||
if(interface == NULL) {
|
||||
ParodusError("interface is NULL\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
1735
src/xmidtsend_rbus.c
Normal file
1735
src/xmidtsend_rbus.c
Normal file
File diff suppressed because it is too large
Load Diff
127
src/xmidtsend_rbus.h
Normal file
127
src/xmidtsend_rbus.h
Normal file
@@ -0,0 +1,127 @@
|
||||
/**
|
||||
* 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 via rbus.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef _XMIDTSEND_RBUS_H_
|
||||
#define _XMIDTSEND_RBUS_H_
|
||||
#include <rbus.h>
|
||||
#include "config.h"
|
||||
#include <uuid/uuid.h>
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#define XMIDT_SEND_METHOD "Device.X_RDK_Xmidt.SendData"
|
||||
#define INPARAMS_PATH "/tmp/inparams.txt"
|
||||
|
||||
#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
|
||||
|
||||
#define EXPIRY_CHECK_TIME 5*60 //To check expiry in every 5 mins when cloud connection is down.
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Data Structures */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
typedef struct XmidtMsg__
|
||||
{
|
||||
wrp_msg_t *msg;
|
||||
rbusMethodAsyncHandle_t asyncHandle;
|
||||
int state;
|
||||
long long enqueueTime;
|
||||
long long sentTime;
|
||||
struct XmidtMsg__ *next;
|
||||
} XmidtMsg;
|
||||
|
||||
typedef struct CloudAck__
|
||||
{
|
||||
char *transaction_id;
|
||||
int qos;
|
||||
int rdr;
|
||||
char *source;
|
||||
struct CloudAck__ *next;
|
||||
} CloudAck;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
DELIVERED_SUCCESS = 0,
|
||||
INVALID_MSG_TYPE,
|
||||
MISSING_SOURCE,
|
||||
MISSING_DEST,
|
||||
MISSING_CONTENT_TYPE,
|
||||
MISSING_PAYLOAD,
|
||||
MISSING_PAYLOADLEN,
|
||||
INVALID_CONTENT_TYPE,
|
||||
ENQUEUE_FAILURE = 100,
|
||||
CLIENT_DISCONNECT = 101,
|
||||
QUEUE_SIZE_EXCEEDED = 102,
|
||||
WRP_ENCODE_FAILURE = 103,
|
||||
MSG_PROCESSING_FAILED = 104,
|
||||
QOS_SEMANTICS_DISABLED = 105,
|
||||
MSG_EXPIRED = 106,
|
||||
QUEUE_OPTIMIZED = 107
|
||||
} XMIDT_STATUS;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
PENDING = 0,
|
||||
SENT,
|
||||
DELETE
|
||||
} MSG_STATUS;
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Function Prototypes */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
rbusHandle_t get_parodus_rbus_Handle(void);
|
||||
void addToXmidtUpstreamQ(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle);
|
||||
void* processXmidtUpstreamMsg();
|
||||
void processXmidtData();
|
||||
int processData(XmidtMsg *Datanode, 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);
|
||||
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, char *source);
|
||||
int checkCloudACK(XmidtMsg *xmdnode, rbusMethodAsyncHandle_t asyncHandle);
|
||||
int updateXmidtState(XmidtMsg * temp, int state);
|
||||
void print_xmidMsg_list();
|
||||
int deleteCloudACKNode(char* trans_id);
|
||||
int deleteFromXmidtQ(XmidtMsg **next_node);
|
||||
int checkCloudConn();
|
||||
void checkMaxQandOptimize(XmidtMsg *xmdMsg);
|
||||
void checkMsgExpiry(XmidtMsg *xmdMsg);
|
||||
void mapXmidtStatusToStatusMessage(int status, char **message);
|
||||
int xmidtQOptmize();
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
#endif /* _XMIDTSEND_RBUS_H_ */
|
||||
|
||||
@@ -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)
|
||||
endif (ENABLE_WEBCFGBIN)
|
||||
|
||||
if(NOT DISABLE_VALGRIND)
|
||||
set (MEMORY_CHECK valgrind --leak-check=full --show-reachable=yes -v)
|
||||
endif ()
|
||||
@@ -42,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)
|
||||
|
||||
#-------------------------------------------------------------------------------
|
||||
@@ -57,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
|
||||
@@ -70,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
|
||||
@@ -105,7 +112,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)
|
||||
|
||||
|
||||
@@ -113,7 +120,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)
|
||||
|
||||
#-------------------------------------------------------------------------------
|
||||
@@ -154,7 +161,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 ../src/xmidtsend_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 +183,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 ../src/xmidtsend_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)
|
||||
@@ -200,7 +215,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
|
||||
@@ -253,7 +268,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
|
||||
@@ -263,7 +278,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} )
|
||||
|
||||
#-------------------------------------------------------------------------------
|
||||
@@ -284,6 +299,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
|
||||
@@ -294,6 +310,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 ../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 )
|
||||
|
||||
@@ -340,6 +359,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 ../src/xmidtsend_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)
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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,
|
||||
@@ -103,7 +104,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);
|
||||
@@ -208,13 +209,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.");
|
||||
@@ -469,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;
|
||||
@@ -589,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__),
|
||||
|
||||
@@ -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 */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
@@ -71,7 +71,10 @@ void nopoll_log_set_handler (noPollCtx *ctx, noPollLogHandler handler, noPollPtr
|
||||
UNUSED(ctx); UNUSED(handler); UNUSED(user_data);
|
||||
function_called();
|
||||
}
|
||||
|
||||
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);
|
||||
@@ -103,6 +106,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);
|
||||
@@ -139,6 +147,10 @@ void packMetaData()
|
||||
function_called();
|
||||
}
|
||||
|
||||
int get_parodus_init()
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
int get_cloud_disconnect_time(void)
|
||||
{
|
||||
@@ -172,6 +184,18 @@ int serviceAliveTask()
|
||||
return 0;
|
||||
}
|
||||
|
||||
int validate_partner_id(wrp_msg_t *msg, partners_t **partnerIds)
|
||||
{
|
||||
UNUSED(msg); UNUSED(partnerIds);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int sendUpstreamMsgToServer(void **resp_bytes, size_t resp_size)
|
||||
{
|
||||
UNUSED(resp_bytes); UNUSED(resp_size);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int nopoll_loop_wait(noPollCtx * ctx,long timeout)
|
||||
{
|
||||
UNUSED(ctx); UNUSED(timeout);
|
||||
@@ -335,6 +359,7 @@ void test_createSocketConnection()
|
||||
|
||||
void test_createSocketConnection1()
|
||||
{
|
||||
numLoops =0;
|
||||
noPollCtx *ctx;
|
||||
ParodusCfg cfg;
|
||||
memset(&cfg,0, sizeof(ParodusCfg));
|
||||
@@ -364,11 +389,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 +411,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 +446,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 +483,7 @@ void err_createSocketConnection()
|
||||
|
||||
void test_createSocketConnection_cloud_disconn()
|
||||
{
|
||||
numLoops =0;
|
||||
ParodusCfg cfg;
|
||||
memset(&cfg,0,sizeof(ParodusCfg));
|
||||
cfg.cloud_disconnect = strdup("XPC");
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -125,6 +125,10 @@ int processCrudRequest(wrp_msg_t *reqMsg, wrp_msg_t **responseMsg )
|
||||
return (int)mock();
|
||||
}
|
||||
|
||||
char* getWebpaInterface(void)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Tests */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
@@ -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");
|
||||
|
||||
@@ -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 )
|
||||
{
|
||||
|
||||
@@ -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 )
|
||||
{
|
||||
|
||||
@@ -79,7 +79,6 @@ void test_mutexHeartBeatTimer() {
|
||||
ParodusInfo("heartBeatTimer reset to: %d\n", heartBeatTimer);
|
||||
assert_int_equal(heartBeatTimer, 0);
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* External Functions */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
@@ -68,7 +68,6 @@ nopoll_bool nopoll_msg_is_final(noPollMsg *msg)
|
||||
function_called();
|
||||
return (nopoll_bool) mock();
|
||||
}
|
||||
|
||||
const unsigned char *nopoll_msg_get_payload(noPollMsg *msg)
|
||||
{
|
||||
(void)msg;
|
||||
|
||||
@@ -24,6 +24,9 @@
|
||||
#include "../src/parodus_log.h"
|
||||
#include "../src/nopoll_helpers.h"
|
||||
#include "../src/config.h"
|
||||
#include <cjwt/cjwt.h>
|
||||
#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,6 +127,7 @@ bool get_interface_down_event()
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Tests */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
@@ -221,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);
|
||||
@@ -236,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);
|
||||
|
||||
}
|
||||
@@ -246,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);
|
||||
@@ -266,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);
|
||||
|
||||
@@ -44,10 +44,12 @@ 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;
|
||||
static int crud_test = 0;
|
||||
pthread_mutex_t config_mut=PTHREAD_MUTEX_INITIALIZER;
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Mocks */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
@@ -116,6 +118,27 @@ 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
|
||||
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;
|
||||
|
||||
@@ -46,10 +46,11 @@ 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;
|
||||
|
||||
pthread_mutex_t config_mut=PTHREAD_MUTEX_INITIALIZER;
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Mocks */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
@@ -101,6 +102,27 @@ 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
|
||||
parStrncpy(webpa_interface, get_parodus_cfg()->webpa_interface_used, sizeof(webpa_interface));
|
||||
#endif
|
||||
return webpa_interface;
|
||||
}
|
||||
|
||||
/*-------------------------------------------
|
||||
int nn_connect (int s, const char *addr)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user