From ab622ee08c22ba0ab4233110346c9d239683df66 Mon Sep 17 00:00:00 2001 From: Bryan Biedenkapp Date: Mon, 27 Mar 2023 20:48:49 -0400 Subject: [PATCH] return status from API call from RESTClient::send(); appropriately deny a grant if supervisor is enabled and a permit call fails; fix issue with CMake not caching compiler information; --- CMakeLists.txt | 20 ++++++++++---------- src/dmr/packet/ControlSignaling.cpp | 24 ++++++++++++++++++++++-- src/nxdn/packet/Trunk.cpp | 12 +++++++++++- src/p25/packet/Trunk.cpp | 26 +++++++++++++++++++++++--- src/remote/RESTClient.cpp | 9 ++++++++- 5 files changed, 74 insertions(+), 17 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 3e8555f6..db120767 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -290,15 +290,15 @@ option(CROSS_COMPILE_ARM "Cross-compile for 32-bit ARM" off) option(CROSS_COMPILE_AARCH64 "Cross-compile for 64-bit ARM" off) option(CROSS_COMPILE_RPI_ARM "Cross-compile for (old RPi) 32-bit ARM" off) -set(CMAKE_C_COMPILER gcc) -set(CMAKE_CXX_COMPILER g++) +set(CMAKE_C_COMPILER gcc CACHE FILEPATH "CMAKE_C_COMPILER") +set(CMAKE_CXX_COMPILER g++ CACHE FILEPATH "CMAKE_CXX_COMPILER") set(ARCH amd64) set(CPACK_DEBIAN_PACKAGE_ARCHITECTURE amd64) message(CHECK_START "Cross compiling for 32-bit ARM") if (CROSS_COMPILE_ARM) - set(CMAKE_C_COMPILER arm-linux-gnueabihf-gcc) - set(CMAKE_CXX_COMPILER arm-linux-gnueabihf-g++) + set(CMAKE_C_COMPILER arm-linux-gnueabihf-gcc CACHE FILEPATH "CMAKE_C_COMPILER") + set(CMAKE_CXX_COMPILER arm-linux-gnueabihf-g++ CACHE FILEPATH "CMAKE_CXX_COMPILER") set(ARCH arm) set(CPACK_DEBIAN_PACKAGE_ARCHITECTURE arm) message(CHECK_PASS "yes") @@ -307,8 +307,8 @@ else () endif (CROSS_COMPILE_ARM) message(CHECK_START "Cross compiling for 64-bit ARM") if (CROSS_COMPILE_AARCH64) - set(CMAKE_C_COMPILER aarch64-linux-gnu-gcc) - set(CMAKE_CXX_COMPILER aarch64-linux-gnu-g++) + set(CMAKE_C_COMPILER aarch64-linux-gnu-gcc CACHE FILEPATH "CMAKE_C_COMPILER") + set(CMAKE_CXX_COMPILER aarch64-linux-gnu-g++ CACHE FILEPATH "CMAKE_CXX_COMPILER") set(ARCH arm64) set(CPACK_DEBIAN_PACKAGE_ARCHITECTURE arm64) message(CHECK_PASS "yes") @@ -332,11 +332,11 @@ if (CROSS_COMPILE_RPI_ARM) GIT_REPOSITORY https://github.com/raspberrypi/tools.git ) FetchContent_MakeAvailable(RPiTools) - set(CMAKE_C_COMPILER ${CMAKE_CURRENT_BINARY_DIR}/_deps/rpitools-src/arm-bcm2708/arm-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc) - set(CMAKE_CXX_COMPILER ${CMAKE_CURRENT_BINARY_DIR}/_deps/rpitools-src/arm-bcm2708/arm-linux-gnueabihf/bin/arm-linux-gnueabihf-g++) + set(CMAKE_C_COMPILER ${CMAKE_CURRENT_BINARY_DIR}/_deps/rpitools-src/arm-bcm2708/arm-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc CACHE FILEPATH "CMAKE_C_COMPILER") + set(CMAKE_CXX_COMPILER ${CMAKE_CURRENT_BINARY_DIR}/_deps/rpitools-src/arm-bcm2708/arm-linux-gnueabihf/bin/arm-linux-gnueabihf-g++ CACHE FILEPATH "CMAKE_CXX_COMPILER") else() - set(CMAKE_C_COMPILER ${RPI_ARM_TOOLS}/arm-bcm2708/arm-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc) - set(CMAKE_CXX_COMPILER ${RPI_ARM_TOOLS}/arm-bcm2708/arm-linux-gnueabihf/bin/arm-linux-gnueabihf-g++) + set(CMAKE_C_COMPILER ${RPI_ARM_TOOLS}/arm-bcm2708/arm-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc CACHE FILEPATH "CMAKE_C_COMPILER") + set(CMAKE_CXX_COMPILER ${RPI_ARM_TOOLS}/arm-bcm2708/arm-linux-gnueabihf/bin/arm-linux-gnueabihf-g++ CACHE FILEPATH "CMAKE_CXX_COMPILER") endif () set(ARCH armhf) diff --git a/src/dmr/packet/ControlSignaling.cpp b/src/dmr/packet/ControlSignaling.cpp index e3b70606..dede269d 100644 --- a/src/dmr/packet/ControlSignaling.cpp +++ b/src/dmr/packet/ControlSignaling.cpp @@ -889,8 +889,18 @@ bool ControlSignaling::writeRF_CSBK_Grant(uint32_t srcId, uint32_t dstId, uint8_ req["dstId"].set(dstId); req["slot"].set(slot); - RESTClient::send(voiceChData.address(), voiceChData.port(), voiceChData.password(), + int ret = RESTClient::send(voiceChData.address(), voiceChData.port(), voiceChData.password(), HTTP_PUT, PUT_PERMIT_TG, req, m_tscc->m_debug); + if (ret != network::rest::http::HTTPPayload::StatusType::OK) { + ::LogError(LOG_RF, "DMR Slot %u, DT_CSBK, CSBKO_RAND (Random Access), failed to permit TG for use, chNo = %u, slot = %u", m_tscc->m_slotNo, chNo, slot); + m_tscc->m_affiliations->releaseGrant(dstId, false); + if (!net) { + writeRF_CSBK_ACK_RSP(srcId, TS_DENY_RSN_TGT_BUSY, (grp) ? 1U : 0U); + m_slot->m_rfState = RS_RF_REJECTED; + } + + return false; + } } else { ::LogError(LOG_RF, "DMR Slot %u, DT_CSBK, CSBKO_RAND (Random Access), failed to permit TG for use, chNo = %u, slot = %u", m_tscc->m_slotNo, chNo, slot); @@ -956,8 +966,18 @@ bool ControlSignaling::writeRF_CSBK_Grant(uint32_t srcId, uint32_t dstId, uint8_ req["dstId"].set(dstId); req["slot"].set(slot); - RESTClient::send(voiceChData.address(), voiceChData.port(), voiceChData.password(), + int ret = RESTClient::send(voiceChData.address(), voiceChData.port(), voiceChData.password(), HTTP_PUT, PUT_PERMIT_TG, req, m_tscc->m_debug); + if (ret != network::rest::http::HTTPPayload::StatusType::OK) { + ::LogError(LOG_RF, "DMR Slot %u, DT_CSBK, CSBKO_RAND (Random Access), failed to permit TG for use, chNo = %u, slot = %u", m_tscc->m_slotNo, chNo, slot); + m_tscc->m_affiliations->releaseGrant(dstId, false); + if (!net) { + writeRF_CSBK_ACK_RSP(srcId, TS_DENY_RSN_TGT_BUSY, (grp) ? 1U : 0U); + m_slot->m_rfState = RS_RF_REJECTED; + } + + return false; + } } else { ::LogError(LOG_RF, "DMR Slot %u, DT_CSBK, CSBKO_RAND (Random Access), failed to permit TG for use, chNo = %u, slot = %u", m_tscc->m_slotNo, chNo, slot); diff --git a/src/nxdn/packet/Trunk.cpp b/src/nxdn/packet/Trunk.cpp index 47a16eae..be538d63 100644 --- a/src/nxdn/packet/Trunk.cpp +++ b/src/nxdn/packet/Trunk.cpp @@ -561,8 +561,18 @@ bool Trunk::writeRF_Message_Grant(uint32_t srcId, uint32_t dstId, uint8_t servic req["state"].set(state); req["dstId"].set(dstId); - RESTClient::send(voiceChData.address(), voiceChData.port(), voiceChData.password(), + int ret = RESTClient::send(voiceChData.address(), voiceChData.port(), voiceChData.password(), HTTP_PUT, PUT_PERMIT_TG, req, m_nxdn->m_debug); + if (ret != network::rest::http::HTTPPayload::StatusType::OK) { + ::LogError((net) ? LOG_NET : LOG_RF, "NXDN, " NXDN_RTCH_MSG_TYPE_VCALL_RESP ", failed to permit TG for use, chNo = %u", chNo); + m_nxdn->m_affiliations.releaseGrant(dstId, false); + if (!net) { + writeRF_Message_Deny(0U, srcId, NXDN_CAUSE_VD_QUE_GRP_BUSY, RTCH_MESSAGE_TYPE_VCALL); + m_nxdn->m_rfState = RS_RF_REJECTED; + } + + return false; + } } else { ::LogError((net) ? LOG_NET : LOG_RF, "NXDN, " NXDN_RTCH_MSG_TYPE_VCALL_RESP ", failed to permit TG for use, chNo = %u", chNo); diff --git a/src/p25/packet/Trunk.cpp b/src/p25/packet/Trunk.cpp index f92a5f6c..0fd62144 100644 --- a/src/p25/packet/Trunk.cpp +++ b/src/p25/packet/Trunk.cpp @@ -2245,8 +2245,18 @@ bool Trunk::writeRF_TSDU_Grant(uint32_t srcId, uint32_t dstId, uint8_t serviceOp req["state"].set(state); req["dstId"].set(dstId); - RESTClient::send(voiceChData.address(), voiceChData.port(), voiceChData.password(), + int ret = RESTClient::send(voiceChData.address(), voiceChData.port(), voiceChData.password(), HTTP_PUT, PUT_PERMIT_TG, req, m_p25->m_debug); + if (ret != network::rest::http::HTTPPayload::StatusType::OK) { + ::LogError((net) ? LOG_NET : LOG_RF, P25_TSDU_STR ", TSBK_IOSP_GRP_VCH (Group Voice Channel Grant), failed to permit TG for use, chNo = %u", chNo); + m_p25->m_affiliations.releaseGrant(dstId, false); + if (!net) { + writeRF_TSDU_Deny(srcId, dstId, P25_DENY_RSN_PTT_BONK, (grp) ? TSBK_IOSP_GRP_VCH : TSBK_IOSP_UU_VCH); + m_p25->m_rfState = RS_RF_REJECTED; + } + + return false; + } } else { ::LogError((net) ? LOG_NET : LOG_RF, P25_TSDU_STR ", TSBK_IOSP_GRP_VCH (Group Voice Channel Grant), failed to permit TG for use, chNo = %u", chNo); @@ -2285,11 +2295,21 @@ bool Trunk::writeRF_TSDU_Grant(uint32_t srcId, uint32_t dstId, uint8_t serviceOp req["state"].set(state); req["dstId"].set(dstId); - RESTClient::send(voiceChData.address(), voiceChData.port(), voiceChData.password(), + int ret = RESTClient::send(voiceChData.address(), voiceChData.port(), voiceChData.password(), HTTP_PUT, PUT_PERMIT_TG, req, m_p25->m_debug); + if (ret != network::rest::http::HTTPPayload::StatusType::OK) { + ::LogError((net) ? LOG_NET : LOG_RF, P25_TSDU_STR ", TSBK_IOSP_UU_VCH (Unit-to-Unit Voice Channel Grant), failed to permit TG for use, chNo = %u", chNo); + m_p25->m_affiliations.releaseGrant(dstId, false); + if (!net) { + writeRF_TSDU_Deny(srcId, dstId, P25_DENY_RSN_PTT_BONK, (grp) ? TSBK_IOSP_GRP_VCH : TSBK_IOSP_UU_VCH); + m_p25->m_rfState = RS_RF_REJECTED; + } + + return false; + } } else { - ::LogError((net) ? LOG_NET : LOG_RF, P25_TSDU_STR ", TSBK_IOSP_GRP_VCH (Group Voice Channel Grant), failed to permit TG for use, chNo = %u", chNo); + ::LogError((net) ? LOG_NET : LOG_RF, P25_TSDU_STR ", TSBK_IOSP_UU_VCH (Unit-to-Unit Voice Channel Grant), failed to permit TG for use, chNo = %u", chNo); } } diff --git a/src/remote/RESTClient.cpp b/src/remote/RESTClient.cpp index b1be6677..7bf282ae 100644 --- a/src/remote/RESTClient.cpp +++ b/src/remote/RESTClient.cpp @@ -163,6 +163,7 @@ int RESTClient::send(const std::string& address, uint32_t port, const std::strin assert(port > 0U); assert(password.empty()); + int ret = EXIT_SUCCESS; m_debug = debug; typedef network::rest::BasicRequestDispatcher RESTDispatcherType; @@ -254,6 +255,12 @@ int RESTClient::send(const std::string& address, uint32_t port, const std::strin return ERRNO_API_CALL_TIMEOUT; } + rsp = json::object(); + if (!parseResponseBody(m_response, rsp)) { + return ERRNO_BAD_API_RESPONSE; + } + + ret = rsp["status"].get(); if (m_console) { fprintf(stdout, "%s\r\n", m_response.content.c_str()); } @@ -273,7 +280,7 @@ int RESTClient::send(const std::string& address, uint32_t port, const std::strin return ERRNO_INTERNAL_ERROR; } - return EXIT_SUCCESS; + return ret; } // ---------------------------------------------------------------------------