From 7014d3823ef8f49fc57bbc9cb6e588b9c345ff3e Mon Sep 17 00:00:00 2001 From: Bryan Biedenkapp Date: Thu, 13 Jul 2023 16:14:36 -0400 Subject: [PATCH] complete conference bridge FNE peer communication; --- src/host/fne/HostFNE.cpp | 4 +--- src/host/fne/HostFNE.h | 11 +++++++++ src/network/BaseNetwork.cpp | 42 ++++++++++++++++----------------- src/network/BaseNetwork.h | 4 ++++ src/network/FNENetwork.h | 2 ++ src/network/fne/TagDMRData.cpp | 8 +++++++ src/network/fne/TagNXDNData.cpp | 8 +++++++ src/network/fne/TagP25Data.cpp | 8 +++++++ 8 files changed, 63 insertions(+), 24 deletions(-) diff --git a/src/host/fne/HostFNE.cpp b/src/host/fne/HostFNE.cpp index 901c0be2..c5f8daec 100644 --- a/src/host/fne/HostFNE.cpp +++ b/src/host/fne/HostFNE.cpp @@ -379,8 +379,6 @@ bool HostFNE::createPeerNetworks() yaml::Node& peerConf = peerList[i]; bool enabled = peerConf["enabled"].as(false); - std::string address = peerConf["address"].as(); - uint16_t port = (uint16_t)peerConf["port"].as(TRAFFIC_DEFAULT_PORT); std::string masterAddress = peerConf["masterAddress"].as(); uint16_t masterPort = (uint16_t)peerConf["masterPort"].as(TRAFFIC_DEFAULT_PORT); std::string password = peerConf["password"].as(); @@ -397,7 +395,7 @@ bool HostFNE::createPeerNetworks() ::LogInfoEx(LOG_HOST, "Peer ID %u Master Address %s Master Port %u Identity %s Enabled %u", id, masterAddress.c_str(), masterPort, identity.c_str(), enabled); // initialize networking - network::Network* network = new Network(address, port, 0U, id, password, true, debug, m_dmrEnabled, m_p25Enabled, m_nxdnEnabled, true, true, m_allowActivityTransfer, m_allowDiagnosticTransfer, false); + network::Network* network = new Network(masterAddress, masterPort, 0U, id, password, true, debug, m_dmrEnabled, m_p25Enabled, m_nxdnEnabled, true, true, m_allowActivityTransfer, m_allowDiagnosticTransfer, false); network->setMetadata(identity, rxFrequency, txFrequency, 0.0F, 0.0F, 0, 0, 0, latitude, longitude, 0, location); network->enable(enabled); diff --git a/src/host/fne/HostFNE.h b/src/host/fne/HostFNE.h index 20f3fc8c..88182cad 100644 --- a/src/host/fne/HostFNE.h +++ b/src/host/fne/HostFNE.h @@ -38,6 +38,14 @@ #include #include +// --------------------------------------------------------------------------- +// Class Prototypes +// --------------------------------------------------------------------------- + +namespace network { namespace fne { class HOST_SW_API TagDMRData; } } +namespace network { namespace fne { class HOST_SW_API TagP25Data; } } +namespace network { namespace fne { class HOST_SW_API TagNXDNData; } } + // --------------------------------------------------------------------------- // Class Declaration // This class implements the core FNE service logic. @@ -58,6 +66,9 @@ private: yaml::Node m_conf; friend class network::FNENetwork; + friend class network::fne::TagDMRData; + friend class network::fne::TagP25Data; + friend class network::fne::TagNXDNData; network::FNENetwork* m_network; bool m_dmrEnabled; diff --git a/src/network/BaseNetwork.cpp b/src/network/BaseNetwork.cpp index 9e5c2ddb..c60b0b0b 100644 --- a/src/network/BaseNetwork.cpp +++ b/src/network/BaseNetwork.cpp @@ -248,6 +248,20 @@ uint32_t BaseNetwork::getDMRStreamId(uint32_t slotNo) const } } +/// +/// Helper to send a data message to the master. +/// +/// Opcode. +/// Buffer to write to the network. +/// Length of buffer to write. +/// +/// +bool BaseNetwork::writeMaster(FrameQueue::OpcodePair opcode, const uint8_t* data, uint32_t length, uint16_t pktSeq, uint32_t streamId) +{ + m_frameQueue->enqueueMessage(data, length, streamId, m_peerId, opcode, pktSeq, m_addr, m_addrLen); + return m_frameQueue->flushQueue(); +} + /// /// Reads DMR raw frame data from the DMR ring buffer. /// @@ -320,9 +334,7 @@ bool BaseNetwork::writeDMR(const dmr::data::Data& data) return false; } - m_frameQueue->enqueueMessage(message.get(), messageLength, m_dmrStreamId[slotIndex], m_peerId, - { NET_FUNC_PROTOCOL, NET_PROTOCOL_SUBFUNC_DMR }, pktSeq(resetSeq), m_addr, m_addrLen); - return m_frameQueue->flushQueue(); + return writeMaster({ NET_FUNC_PROTOCOL, NET_PROTOCOL_SUBFUNC_DMR }, message.get(), messageLength, pktSeq(resetSeq), m_dmrStreamId[slotIndex]); } /// @@ -395,9 +407,7 @@ bool BaseNetwork::writeP25LDU1(const p25::lc::LC& control, const p25::data::LowS return false; } - m_frameQueue->enqueueMessage(message.get(), messageLength, m_p25StreamId, m_peerId, - { NET_FUNC_PROTOCOL, NET_PROTOCOL_SUBFUNC_P25 }, pktSeq(resetSeq), m_addr, m_addrLen); - return m_frameQueue->flushQueue(); + return writeMaster({ NET_FUNC_PROTOCOL, NET_PROTOCOL_SUBFUNC_P25 }, message.get(), messageLength, pktSeq(resetSeq), m_p25StreamId); } /// @@ -424,9 +434,7 @@ bool BaseNetwork::writeP25LDU2(const p25::lc::LC& control, const p25::data::LowS return false; } - m_frameQueue->enqueueMessage(message.get(), messageLength, m_p25StreamId, m_peerId, - { NET_FUNC_PROTOCOL, NET_PROTOCOL_SUBFUNC_P25 }, pktSeq(resetSeq), m_addr, m_addrLen); - return m_frameQueue->flushQueue(); + return writeMaster({ NET_FUNC_PROTOCOL, NET_PROTOCOL_SUBFUNC_P25 }, message.get(), messageLength, pktSeq(resetSeq), m_p25StreamId); } /// @@ -452,9 +460,7 @@ bool BaseNetwork::writeP25TDU(const p25::lc::LC& control, const p25::data::LowSp return false; } - m_frameQueue->enqueueMessage(message.get(), messageLength, m_p25StreamId, m_peerId, - { NET_FUNC_PROTOCOL, NET_PROTOCOL_SUBFUNC_P25 }, pktSeq(resetSeq), m_addr, m_addrLen); - return m_frameQueue->flushQueue(); + return writeMaster({ NET_FUNC_PROTOCOL, NET_PROTOCOL_SUBFUNC_P25 }, message.get(), messageLength, pktSeq(resetSeq), m_p25StreamId); } /// @@ -480,9 +486,7 @@ bool BaseNetwork::writeP25TSDU(const p25::lc::LC& control, const uint8_t* data) return false; } - m_frameQueue->enqueueMessage(message.get(), messageLength, m_p25StreamId, m_peerId, - { NET_FUNC_PROTOCOL, NET_PROTOCOL_SUBFUNC_P25 }, pktSeq(resetSeq), m_addr, m_addrLen); - return m_frameQueue->flushQueue(); + return writeMaster({ NET_FUNC_PROTOCOL, NET_PROTOCOL_SUBFUNC_P25 }, message.get(), messageLength, pktSeq(resetSeq), m_p25StreamId); } /// @@ -511,9 +515,7 @@ bool BaseNetwork::writeP25PDU(const p25::data::DataHeader& header, const uint8_t return false; } - m_frameQueue->enqueueMessage(message.get(), messageLength, m_p25StreamId, m_peerId, - { NET_FUNC_PROTOCOL, NET_PROTOCOL_SUBFUNC_P25 }, pktSeq(resetSeq), m_addr, m_addrLen); - return m_frameQueue->flushQueue(); + return writeMaster({ NET_FUNC_PROTOCOL, NET_PROTOCOL_SUBFUNC_P25 }, message.get(), messageLength, pktSeq(resetSeq), m_p25StreamId); } /// @@ -585,9 +587,7 @@ bool BaseNetwork::writeNXDN(const nxdn::lc::RTCH& lc, const uint8_t* data, const return false; } - m_frameQueue->enqueueMessage(message.get(), messageLength, m_nxdnStreamId, m_peerId, - { NET_FUNC_PROTOCOL, NET_PROTOCOL_SUBFUNC_NXDN }, pktSeq(resetSeq), m_addr, m_addrLen); - return m_frameQueue->flushQueue(); + return writeMaster({ NET_FUNC_PROTOCOL, NET_PROTOCOL_SUBFUNC_NXDN }, message.get(), messageLength, pktSeq(resetSeq), m_nxdnStreamId); } /// diff --git a/src/network/BaseNetwork.h b/src/network/BaseNetwork.h index 34d7b17a..0e1b7418 100644 --- a/src/network/BaseNetwork.h +++ b/src/network/BaseNetwork.h @@ -187,6 +187,10 @@ namespace network /// Gets the current NXDN stream ID. uint32_t getNXDNStreamId() const { return m_nxdnStreamId; } + /// Helper to send a data message to the master. + bool writeMaster(FrameQueue::OpcodePair opcode, const uint8_t* data, uint32_t length, + uint16_t pktSeq, uint32_t streamId); + /** Digital Mobile Radio */ /// Reads DMR raw frame data from the DMR ring buffer. UInt8Array readDMR(bool& ret, uint32_t& frameLength); diff --git a/src/network/FNENetwork.h b/src/network/FNENetwork.h index 589f0abb..bc637f76 100644 --- a/src/network/FNENetwork.h +++ b/src/network/FNENetwork.h @@ -274,6 +274,8 @@ namespace network bool writePeerNAK(uint32_t peerId, const char* tag); /// Helper to send a NAK response to the specified peer. bool writePeerNAK(uint32_t peerId, const char* tag, sockaddr_storage& addr, uint32_t addrLen); + + }; } // namespace network diff --git a/src/network/fne/TagDMRData.cpp b/src/network/fne/TagDMRData.cpp index ce8f04df..eb02b045 100644 --- a/src/network/fne/TagDMRData.cpp +++ b/src/network/fne/TagDMRData.cpp @@ -24,6 +24,7 @@ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "Defines.h" +#include "host/fne/HostFNE.h" #include "network/FNENetwork.h" #include "network/fne/TagDMRData.h" #include "Clock.h" @@ -220,6 +221,13 @@ bool TagDMRData::processFrame(const uint8_t* data, uint32_t len, uint32_t peerId } } + // repeat traffic to upstream peers + if (m_network->m_host->m_peerNetworks.size() > 0) { + for (auto peer : m_network->m_host->m_peerNetworks) { + peer.second->writeMaster({ NET_FUNC_PROTOCOL, NET_PROTOCOL_SUBFUNC_DMR }, data, len, pktSeq, streamId); + } + } + m_network->m_frameQueue->flushQueue(); return true; } diff --git a/src/network/fne/TagNXDNData.cpp b/src/network/fne/TagNXDNData.cpp index fa24d9b3..fabe861b 100644 --- a/src/network/fne/TagNXDNData.cpp +++ b/src/network/fne/TagNXDNData.cpp @@ -25,6 +25,7 @@ */ #include "Defines.h" #include "nxdn/NXDNDefines.h" +#include "host/fne/HostFNE.h" #include "network/FNENetwork.h" #include "network/fne/TagNXDNData.h" #include "Clock.h" @@ -192,6 +193,13 @@ bool TagNXDNData::processFrame(const uint8_t* data, uint32_t len, uint32_t peerI } } + // repeat traffic to upstream peers + if (m_network->m_host->m_peerNetworks.size() > 0) { + for (auto peer : m_network->m_host->m_peerNetworks) { + peer.second->writeMaster({ NET_FUNC_PROTOCOL, NET_PROTOCOL_SUBFUNC_NXDN }, data, len, pktSeq, streamId); + } + } + m_network->m_frameQueue->flushQueue(); return true; } diff --git a/src/network/fne/TagP25Data.cpp b/src/network/fne/TagP25Data.cpp index 3fd3e895..8ccdc221 100644 --- a/src/network/fne/TagP25Data.cpp +++ b/src/network/fne/TagP25Data.cpp @@ -24,6 +24,7 @@ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "Defines.h" +#include "host/fne/HostFNE.h" #include "network/FNENetwork.h" #include "network/fne/TagP25Data.h" #include "Clock.h" @@ -231,6 +232,13 @@ bool TagP25Data::processFrame(const uint8_t* data, uint32_t len, uint32_t peerId } } + // repeat traffic to upstream peers + if (m_network->m_host->m_peerNetworks.size() > 0) { + for (auto peer : m_network->m_host->m_peerNetworks) { + peer.second->writeMaster({ NET_FUNC_PROTOCOL, NET_PROTOCOL_SUBFUNC_P25 }, data, len, pktSeq, streamId); + } + } + m_network->m_frameQueue->flushQueue(); return true; }