[EXPERIMENTAL] better NXDN network support;

pull/12/head
Bryan Biedenkapp 4 years ago
parent 31043bcb53
commit 9747e9a2e0

@ -258,9 +258,10 @@ uint8_t* BaseNetwork::readP25(bool& ret, p25::lc::LC& control, p25::data::LowSpe
/// Reads NXDN frame data from the NXDN ring buffer.
/// </summary>
/// <param name="ret"></param>
/// <param name="layer3"></param>
/// <param name="len"></param>
/// <returns></returns>
uint8_t* BaseNetwork::readNXDN(bool& ret, uint32_t& len)
uint8_t* BaseNetwork::readNXDN(bool& ret, nxdn::data::Layer3& layer3, uint32_t& len)
{
if (m_status != NET_STAT_RUNNING && m_status != NET_STAT_MST_RUNNING) {
ret = false;
@ -276,7 +277,18 @@ uint8_t* BaseNetwork::readNXDN(bool& ret, uint32_t& len)
m_rxNXDNData.getData(&length, 1U);
m_rxNXDNData.getData(m_buffer, length);
/* TODO TODO -- process more data out of the raw network frames? */
uint8_t messageType = m_buffer[4U];
uint32_t srcId = (m_buffer[5U] << 16) | (m_buffer[6U] << 8) | (m_buffer[7U] << 0);
uint32_t dstId = (m_buffer[8U] << 16) | (m_buffer[9U] << 8) | (m_buffer[10U] << 0);
layer3.setMessageType(messageType);
layer3.setSrcId((uint16_t)srcId & 0xFFFFU);
layer3.setDstId((uint16_t)dstId & 0xFFFFU);
bool group = (m_buffer[15U] & 0x40U) == 0x40U ? false : true;
layer3.setGroup(group);
uint8_t* data = NULL;
len = m_buffer[23U];
@ -471,10 +483,11 @@ bool BaseNetwork::writeP25PDU(const p25::data::DataHeader& header, const p25::da
/// <summary>
/// Writes NXDN frame data to the network.
/// </summary>
/// <param name="layer3"></param>
/// <param name="data"></param>
/// <param name="len"></param>
/// <returns></returns>
bool BaseNetwork::writeNXDN(const uint8_t* data, const uint32_t len)
bool BaseNetwork::writeNXDN(const nxdn::data::Layer3& layer3, const uint8_t* data, const uint32_t len)
{
if (m_status != NET_STAT_RUNNING && m_status != NET_STAT_MST_RUNNING)
return false;
@ -485,7 +498,7 @@ bool BaseNetwork::writeNXDN(const uint8_t* data, const uint32_t len)
m_streamId[0] = m_nxdnStreamId;
return writeNXDN(m_id, m_nxdnStreamId, data, len);
return writeNXDN(m_id, m_nxdnStreamId, layer3, data, len);
}
/// <summary>
@ -1069,13 +1082,11 @@ bool BaseNetwork::writeP25PDU(const uint32_t id, const uint32_t streamId, const
/// </summary>
/// <param name="id"></param>
/// <param name="streamId"></param>
/// <param name="header"></param>
/// <param name="secHeader"></param>
/// <param name="currentBlock"></param>
/// <param name="layer3"></param>
/// <param name="data"></param>
/// <param name="len"></param>
/// <returns></returns>
bool BaseNetwork::writeNXDN(const uint32_t id, const uint32_t streamId, const uint8_t* data, const uint32_t len)
bool BaseNetwork::writeNXDN(const uint32_t id, const uint32_t streamId, const nxdn::data::Layer3& layer3, const uint8_t* data, const uint32_t len)
{
if (m_status != NET_STAT_RUNNING && m_status != NET_STAT_MST_RUNNING)
return false;
@ -1087,7 +1098,15 @@ bool BaseNetwork::writeNXDN(const uint32_t id, const uint32_t streamId, const ui
::memcpy(buffer + 0U, TAG_NXDN_DATA, 4U);
/* TODO TODO -- pack more data out of the raw network frames? */
buffer[4U] = layer3.getMessageType(); // Message Type
uint32_t srcId = layer3.getSrcId(); // Source Address
__SET_UINT16(srcId, buffer, 5U);
uint32_t dstId = layer3.getDstId(); // Target Address
__SET_UINT16(dstId, buffer, 8U);
buffer[15U] |= layer3.getGroup() ? 0x00U : 0x40U; // Group
__SET_UINT32(streamId, buffer, 16U); // Stream ID

@ -43,6 +43,7 @@
#include "p25/lc/TSBK.h"
#include "p25/lc/TDULC.h"
#include "p25/Audio.h"
#include "nxdn/data/Layer3.h"
#include "network/UDPSocket.h"
#include "RingBuffer.h"
#include "Timer.h"
@ -140,7 +141,7 @@ namespace network
/// <summary>Reads P25 frame data from the P25 ring buffer.</summary>
virtual uint8_t* readP25(bool& ret, p25::lc::LC& control, p25::data::LowSpeedData& lsd, uint8_t& duid, uint32_t& len);
/// <summary>Reads NXDN frame data from the NXDN ring buffer.</summary>
virtual uint8_t* readNXDN(bool& ret, uint32_t& len);
virtual uint8_t* readNXDN(bool& ret, nxdn::data::Layer3& layer3, uint32_t& len);
/// <summary>Reads a channel grant request from the network.</summary>
virtual bool readGrantRsp(bool& grp, uint32_t& srcId, uint32_t& dstId, uint32_t& grpVchNo);
@ -160,7 +161,7 @@ namespace network
const uint8_t* data, const uint32_t len);
/// <summary>Writes NXDN frame data to the network.</summary>
virtual bool writeNXDN(const uint8_t* data, const uint32_t len);
virtual bool writeNXDN(const nxdn::data::Layer3& layer3, const uint8_t* data, const uint32_t len);
/// <summary>Writes a channel grant request to the network.</summary>
virtual bool writeGrantReq(const bool grp, const uint32_t srcId, const uint32_t dstId);
@ -239,7 +240,7 @@ namespace network
bool writeP25PDU(const uint32_t id, const uint32_t streamId, const p25::data::DataHeader& header, const p25::data::DataHeader& secHeader, const uint8_t currentBlock,
const uint8_t* data, const uint32_t len);
/// <summary>Writes NXDN frame data to the network.</summary>
bool writeNXDN(const uint32_t id, const uint32_t streamId, const uint8_t* data, const uint32_t len);
bool writeNXDN(const uint32_t id, const uint32_t streamId, const nxdn::data::Layer3& layer3, const uint8_t* data, const uint32_t len);
/// <summary>Writes data to the network.</summary>
virtual bool write(const uint8_t* data, uint32_t length);

@ -463,9 +463,11 @@ void Control::processNetwork()
if (m_rfState != RS_RF_LISTENING && m_netState == RS_NET_IDLE)
return;
data::Layer3 layer3;
uint32_t length = 100U;
bool ret = false;
uint8_t* data = m_network->readNXDN(ret, length);
uint8_t* data = m_network->readNXDN(ret, layer3, length);
if (!ret)
return;
if (length == 0U)
@ -494,10 +496,10 @@ void Control::processNetwork()
switch (usc) {
case NXDN_LICH_USC_UDCH:
ret = m_data->processNetwork(option, data, length);
ret = m_data->processNetwork(option, layer3, data, length);
break;
default:
ret = m_voice->processNetwork(usc, option, data, length);
ret = m_voice->processNetwork(usc, option, layer3, data, length);
break;
}

@ -285,7 +285,7 @@ bool Data::process(uint8_t option, uint8_t* data, uint32_t len)
/// <param name="data">Buffer containing data frame.</param>
/// <param name="len">Length of data frame.</param>
/// <returns></returns>
bool Data::processNetwork(uint8_t option, uint8_t* data, uint32_t len)
bool Data::processNetwork(uint8_t option, data::Layer3& netLayer3, uint8_t* data, uint32_t len)
{
assert(data != NULL);
@ -427,5 +427,5 @@ void Data::writeNetwork(const uint8_t *data, uint32_t len)
if (m_nxdn->m_rfTimeout.isRunning() && m_nxdn->m_rfTimeout.hasExpired())
return;
m_network->writeNXDN(data, len);
m_network->writeNXDN(m_nxdn->m_rfLayer3, data, len);
}

@ -63,7 +63,7 @@ namespace nxdn
/// <summary>Process a data frame from the RF interface.</summary>
virtual bool process(uint8_t option, uint8_t* data, uint32_t len);
/// <summary>Process a data frame from the network.</summary>
virtual bool processNetwork(uint8_t option, uint8_t* data, uint32_t len);
virtual bool processNetwork(uint8_t option, data::Layer3& netLayer3, uint8_t* data, uint32_t len);
protected:
friend class nxdn::Control;

@ -574,7 +574,7 @@ bool Voice::process(uint8_t usc, uint8_t option, uint8_t* data, uint32_t len)
/// <param name="data">Buffer containing data frame.</param>
/// <param name="len">Length of data frame.</param>
/// <returns></returns>
bool Voice::processNetwork(uint8_t usc, uint8_t option, uint8_t* data, uint32_t len)
bool Voice::processNetwork(uint8_t usc, uint8_t option, data::Layer3& netLayer3, uint8_t* data, uint32_t len)
{
assert(data != NULL);
@ -965,5 +965,5 @@ void Voice::writeNetwork(const uint8_t *data, uint32_t len)
if (m_nxdn->m_rfTimeout.isRunning() && m_nxdn->m_rfTimeout.hasExpired())
return;
m_network->writeNXDN(data, len);
m_network->writeNXDN(m_nxdn->m_rfLayer3, data, len);
}

@ -64,7 +64,7 @@ namespace nxdn
/// <summary>Process a data frame from the RF interface.</summary>
virtual bool process(uint8_t usc, uint8_t option, uint8_t* data, uint32_t len);
/// <summary>Process a data frame from the network.</summary>
virtual bool processNetwork(uint8_t usc, uint8_t option, uint8_t* data, uint32_t len);
virtual bool processNetwork(uint8_t usc, uint8_t option, data::Layer3& netLayer3, uint8_t* data, uint32_t len);
protected:
friend class packet::Data;

Loading…
Cancel
Save

Powered by TurnKey Linux.