complete conference bridge FNE peer communication;

pull/39/head
Bryan Biedenkapp 3 years ago
parent 27f73c1089
commit 7014d3823e

@ -379,8 +379,6 @@ bool HostFNE::createPeerNetworks()
yaml::Node& peerConf = peerList[i];
bool enabled = peerConf["enabled"].as<bool>(false);
std::string address = peerConf["address"].as<std::string>();
uint16_t port = (uint16_t)peerConf["port"].as<uint32_t>(TRAFFIC_DEFAULT_PORT);
std::string masterAddress = peerConf["masterAddress"].as<std::string>();
uint16_t masterPort = (uint16_t)peerConf["masterPort"].as<uint32_t>(TRAFFIC_DEFAULT_PORT);
std::string password = peerConf["password"].as<std::string>();
@ -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);

@ -38,6 +38,14 @@
#include <unordered_map>
#include <vector>
// ---------------------------------------------------------------------------
// 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;

@ -248,6 +248,20 @@ uint32_t BaseNetwork::getDMRStreamId(uint32_t slotNo) const
}
}
/// <summary>
/// Helper to send a data message to the master.
/// </summary>
/// <param name="opcode">Opcode.</param>
/// <param name="data">Buffer to write to the network.</param>
/// <param name="length">Length of buffer to write.</param>
/// <param name="pktSeq"></param>
/// <param name="streamId"></param>
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();
}
/// <summary>
/// Reads DMR raw frame data from the DMR ring buffer.
/// </summary>
@ -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]);
}
/// <summary>
@ -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);
}
/// <summary>
@ -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);
}
/// <summary>
@ -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);
}
/// <summary>
@ -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);
}
/// <summary>
@ -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);
}
/// <summary>
@ -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);
}
/// <summary>

@ -187,6 +187,10 @@ namespace network
/// <summary>Gets the current NXDN stream ID.</summary>
uint32_t getNXDNStreamId() const { return m_nxdnStreamId; }
/// <summary>Helper to send a data message to the master.</summary>
bool writeMaster(FrameQueue::OpcodePair opcode, const uint8_t* data, uint32_t length,
uint16_t pktSeq, uint32_t streamId);
/** Digital Mobile Radio */
/// <summary>Reads DMR raw frame data from the DMR ring buffer.</summary>
UInt8Array readDMR(bool& ret, uint32_t& frameLength);

@ -274,6 +274,8 @@ namespace network
bool writePeerNAK(uint32_t peerId, const char* tag);
/// <summary>Helper to send a NAK response to the specified peer.</summary>
bool writePeerNAK(uint32_t peerId, const char* tag, sockaddr_storage& addr, uint32_t addrLen);
};
} // namespace network

@ -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;
}

@ -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;
}

@ -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;
}

Loading…
Cancel
Save

Powered by TurnKey Linux.