add flag to denote traffic flow for external peers (that is a peer connection the CFNE makes to another CFNE);

pull/48/head
Bryan Biedenkapp 2 years ago
parent 7dc850669a
commit 987e944d4b

@ -581,7 +581,7 @@ void HostFNE::processPeer(network::PeerNetwork* peerNetwork)
uint32_t slotNo = (data[15U] & 0x80U) == 0x80U ? 2U : 1U; uint32_t slotNo = (data[15U] & 0x80U) == 0x80U ? 2U : 1U;
uint32_t streamId = peerNetwork->getDMRStreamId(slotNo); uint32_t streamId = peerNetwork->getDMRStreamId(slotNo);
m_network->dmrTrafficHandler()->processFrame(data.get(), length, peerId, peerNetwork->pktLastSeq(), streamId); m_network->dmrTrafficHandler()->processFrame(data.get(), length, peerId, peerNetwork->pktLastSeq(), streamId, true);
} }
} }
@ -594,7 +594,7 @@ void HostFNE::processPeer(network::PeerNetwork* peerNetwork)
uint32_t peerId = peerNetwork->getPeerId(); uint32_t peerId = peerNetwork->getPeerId();
uint32_t streamId = peerNetwork->getP25StreamId(); uint32_t streamId = peerNetwork->getP25StreamId();
m_network->p25TrafficHandler()->processFrame(data.get(), length, peerId, peerNetwork->pktLastSeq(), streamId); m_network->p25TrafficHandler()->processFrame(data.get(), length, peerId, peerNetwork->pktLastSeq(), streamId, true);
} }
} }
@ -607,7 +607,7 @@ void HostFNE::processPeer(network::PeerNetwork* peerNetwork)
uint32_t peerId = peerNetwork->getPeerId(); uint32_t peerId = peerNetwork->getPeerId();
uint32_t streamId = peerNetwork->getNXDNStreamId(); uint32_t streamId = peerNetwork->getNXDNStreamId();
m_network->nxdnTrafficHandler()->processFrame(data.get(), length, peerId, peerNetwork->pktLastSeq(), streamId); m_network->nxdnTrafficHandler()->processFrame(data.get(), length, peerId, peerNetwork->pktLastSeq(), streamId, true);
} }
} }
} }

@ -60,8 +60,9 @@ TagDMRData::~TagDMRData() = default;
/// <param name="peerId">Peer ID</param> /// <param name="peerId">Peer ID</param>
/// <param name="pktSeq"></param> /// <param name="pktSeq"></param>
/// <param name="streamId">Stream ID</param> /// <param name="streamId">Stream ID</param>
/// <param name="external">Flag indicating traffic is from an external peer.</param>
/// <returns></returns> /// <returns></returns>
bool TagDMRData::processFrame(const uint8_t* data, uint32_t len, uint32_t peerId, uint16_t pktSeq, uint32_t streamId) bool TagDMRData::processFrame(const uint8_t* data, uint32_t len, uint32_t peerId, uint16_t pktSeq, uint32_t streamId, bool external)
{ {
hrc::hrc_t pktTime = hrc::now(); hrc::hrc_t pktTime = hrc::now();
@ -121,15 +122,15 @@ bool TagDMRData::processFrame(const uint8_t* data, uint32_t len, uint32_t peerId
// is this the end of the call stream? // is this the end of the call stream?
if (dataSync && (dataType == DT_TERMINATOR_WITH_LC)) { if (dataSync && (dataType == DT_TERMINATOR_WITH_LC)) {
if (srcId == 0U && dstId == 0U) { if (srcId == 0U && dstId == 0U) {
LogWarning(LOG_NET, "DMR, invalid TERMINATOR, peer = %u, srcId = %u, dstId = %u, streamId = %u", peerId, srcId, dstId, streamId); LogWarning(LOG_NET, "DMR, invalid TERMINATOR, peer = %u, srcId = %u, dstId = %u, streamId = %u, external = %u", peerId, srcId, dstId, streamId, external);
return false; return false;
} }
RxStatus status; RxStatus status;
auto it = std::find_if(m_status.begin(), m_status.end(), [&](StatusMapPair x) { return (x.second.dstId == dstId && x.second.slotNo == slotNo); }); auto it = std::find_if(m_status.begin(), m_status.end(), [&](StatusMapPair x) { return (x.second.dstId == dstId && x.second.slotNo == slotNo); });
if (it == m_status.end()) { if (it == m_status.end()) {
LogError(LOG_NET, "DMR, tried to end call for non-existent call in progress?, peer = %u, srcId = %u, dstId = %u, streamId = %u", LogError(LOG_NET, "DMR, tried to end call for non-existent call in progress?, peer = %u, srcId = %u, dstId = %u, streamId = %u, external = %u",
peerId, srcId, dstId, streamId); peerId, srcId, dstId, streamId, external);
} }
else { else {
status = it->second; status = it->second;
@ -150,8 +151,8 @@ bool TagDMRData::processFrame(const uint8_t* data, uint32_t len, uint32_t peerId
} }
} }
LogMessage(LOG_NET, "DMR, Call End, peer = %u, srcId = %u, dstId = %u, duration = %u, streamId = %u", LogMessage(LOG_NET, "DMR, Call End, peer = %u, srcId = %u, dstId = %u, duration = %u, streamId = %u, external = %u",
peerId, srcId, dstId, duration / 1000, streamId); peerId, srcId, dstId, duration / 1000, streamId, external);
m_network->m_callInProgress = false; m_network->m_callInProgress = false;
} }
} }
@ -159,7 +160,7 @@ bool TagDMRData::processFrame(const uint8_t* data, uint32_t len, uint32_t peerId
// is this a new call stream? // is this a new call stream?
if (dataSync && (dataType == DT_VOICE_LC_HEADER)) { if (dataSync && (dataType == DT_VOICE_LC_HEADER)) {
if (srcId == 0U && dstId == 0U) { if (srcId == 0U && dstId == 0U) {
LogWarning(LOG_NET, "DMR, invalid call, peer = %u, srcId = %u, dstId = %u, streamId = %u", peerId, srcId, dstId, streamId); LogWarning(LOG_NET, "DMR, invalid call, peer = %u, srcId = %u, dstId = %u, streamId = %u, external = %u", peerId, srcId, dstId, streamId, external);
return false; return false;
} }
@ -168,7 +169,7 @@ bool TagDMRData::processFrame(const uint8_t* data, uint32_t len, uint32_t peerId
RxStatus status = it->second; RxStatus status = it->second;
if (streamId != status.streamId) { if (streamId != status.streamId) {
if (status.srcId != 0U && status.srcId != srcId) { if (status.srcId != 0U && status.srcId != srcId) {
LogWarning(LOG_NET, "DMR, Call Collision, peer = %u, srcId = %u, dstId = %u, streamId = %u", peerId, srcId, dstId, streamId); LogWarning(LOG_NET, "DMR, Call Collision, peer = %u, srcId = %u, dstId = %u, streamId = %u, external = %u", peerId, srcId, dstId, streamId, external);
return false; return false;
} }
} }
@ -196,7 +197,7 @@ bool TagDMRData::processFrame(const uint8_t* data, uint32_t len, uint32_t peerId
status.slotNo = slotNo; status.slotNo = slotNo;
status.streamId = streamId; status.streamId = streamId;
m_status[dstId] = status; // this *could* be an issue if a dstId appears on both slots somehow... m_status[dstId] = status; // this *could* be an issue if a dstId appears on both slots somehow...
LogMessage(LOG_NET, "DMR, Call Start, peer = %u, srcId = %u, dstId = %u, streamId = %u", peerId, srcId, dstId, streamId); LogMessage(LOG_NET, "DMR, Call Start, peer = %u, srcId = %u, dstId = %u, streamId = %u, external = %u", peerId, srcId, dstId, streamId, external);
m_network->m_callInProgress = true; m_network->m_callInProgress = true;
} }
} }
@ -227,8 +228,8 @@ bool TagDMRData::processFrame(const uint8_t* data, uint32_t len, uint32_t peerId
m_network->writePeer(peer.first, { NET_FUNC_PROTOCOL, NET_PROTOCOL_SUBFUNC_DMR }, outboundPeerBuffer, len, pktSeq, streamId, true); m_network->writePeer(peer.first, { NET_FUNC_PROTOCOL, NET_PROTOCOL_SUBFUNC_DMR }, outboundPeerBuffer, len, pktSeq, streamId, true);
if (m_network->m_debug) { if (m_network->m_debug) {
LogDebug(LOG_NET, "DMR, srcPeer = %u, dstPeer = %u, seqNo = %u, srcId = %u, dstId = %u, flco = $%02X, slotNo = %u, len = %u, pktSeq = %u, stream = %u", LogDebug(LOG_NET, "DMR, srcPeer = %u, dstPeer = %u, seqNo = %u, srcId = %u, dstId = %u, flco = $%02X, slotNo = %u, len = %u, pktSeq = %u, stream = %u, external = %u",
peerId, peer.first, seqNo, srcId, dstId, flco, slotNo, len, pktSeq, streamId); peerId, peer.first, seqNo, srcId, dstId, flco, slotNo, len, pktSeq, streamId, external);
} }
if (!m_network->m_callInProgress) if (!m_network->m_callInProgress)
@ -238,13 +239,13 @@ bool TagDMRData::processFrame(const uint8_t* data, uint32_t len, uint32_t peerId
m_network->m_frameQueue->flushQueue(); m_network->m_frameQueue->flushQueue();
} }
// repeat traffic to upstream peers // repeat traffic to external peers
if (m_network->m_host->m_peerNetworks.size() > 0U && !tg.config().parrot()) { if (m_network->m_host->m_peerNetworks.size() > 0U && !tg.config().parrot()) {
for (auto peer : m_network->m_host->m_peerNetworks) { for (auto peer : m_network->m_host->m_peerNetworks) {
uint32_t dstPeerId = peer.second->getPeerId(); uint32_t dstPeerId = peer.second->getPeerId();
// don't try to repeat traffic to the source peer...if this traffic // don't try to repeat traffic to the source peer...if this traffic
// is coming from a upstream peer // is coming from a external peer
if (dstPeerId != peerId) { if (dstPeerId != peerId) {
// is this peer ignored? // is this peer ignored?
if (!isPeerPermitted(dstPeerId, dmrData, streamId)) { if (!isPeerPermitted(dstPeerId, dmrData, streamId)) {
@ -260,8 +261,8 @@ bool TagDMRData::processFrame(const uint8_t* data, uint32_t len, uint32_t peerId
peer.second->writeMaster({ NET_FUNC_PROTOCOL, NET_PROTOCOL_SUBFUNC_DMR }, outboundPeerBuffer, len, pktSeq, streamId); peer.second->writeMaster({ NET_FUNC_PROTOCOL, NET_PROTOCOL_SUBFUNC_DMR }, outboundPeerBuffer, len, pktSeq, streamId);
if (m_network->m_debug) { if (m_network->m_debug) {
LogDebug(LOG_NET, "DMR, srcPeer = %u, dstPeer = %u, seqNo = %u, srcId = %u, dstId = %u, flco = $%02X, slotNo = %u, len = %u, pktSeq = %u, stream = %u", LogDebug(LOG_NET, "DMR, srcPeer = %u, dstPeer = %u, seqNo = %u, srcId = %u, dstId = %u, flco = $%02X, slotNo = %u, len = %u, pktSeq = %u, stream = %u, external = %u",
peerId, dstPeerId, seqNo, srcId, dstId, flco, slotNo, len, pktSeq, streamId); peerId, dstPeerId, seqNo, srcId, dstId, flco, slotNo, len, pktSeq, streamId, external);
} }
if (!m_network->m_callInProgress) if (!m_network->m_callInProgress)

@ -38,7 +38,7 @@ namespace network
~TagDMRData(); ~TagDMRData();
/// <summary>Process a data frame from the network.</summary> /// <summary>Process a data frame from the network.</summary>
bool processFrame(const uint8_t* data, uint32_t len, uint32_t peerId, uint16_t pktSeq, uint32_t streamId); bool processFrame(const uint8_t* data, uint32_t len, uint32_t peerId, uint16_t pktSeq, uint32_t streamId, bool external = false);
/// <summary>Helper to playback a parrot frame to the network.</summary> /// <summary>Helper to playback a parrot frame to the network.</summary>
void playbackParrot(); void playbackParrot();

@ -59,8 +59,9 @@ TagNXDNData::~TagNXDNData() = default;
/// <param name="peerId">Peer ID</param> /// <param name="peerId">Peer ID</param>
/// <param name="pktSeq"></param> /// <param name="pktSeq"></param>
/// <param name="streamId">Stream ID</param> /// <param name="streamId">Stream ID</param>
/// <param name="external">Flag indicating traffic is from an external peer.</param>
/// <returns></returns> /// <returns></returns>
bool TagNXDNData::processFrame(const uint8_t* data, uint32_t len, uint32_t peerId, uint16_t pktSeq, uint32_t streamId) bool TagNXDNData::processFrame(const uint8_t* data, uint32_t len, uint32_t peerId, uint16_t pktSeq, uint32_t streamId, bool external)
{ {
hrc::hrc_t pktTime = hrc::now(); hrc::hrc_t pktTime = hrc::now();
@ -100,7 +101,7 @@ bool TagNXDNData::processFrame(const uint8_t* data, uint32_t len, uint32_t peerI
// is this the end of the call stream? // is this the end of the call stream?
if (messageType == RTCH_MESSAGE_TYPE_TX_REL || messageType == RTCH_MESSAGE_TYPE_TX_REL_EX) { if (messageType == RTCH_MESSAGE_TYPE_TX_REL || messageType == RTCH_MESSAGE_TYPE_TX_REL_EX) {
if (srcId == 0U && dstId == 0U) { if (srcId == 0U && dstId == 0U) {
LogWarning(LOG_NET, "NXDN, invalid TX_REL, peer = %u, srcId = %u, dstId = %u, streamId = %u", peerId, srcId, dstId, streamId); LogWarning(LOG_NET, "NXDN, invalid TX_REL, peer = %u, srcId = %u, dstId = %u, streamId = %u, external = %u", peerId, srcId, dstId, streamId, external);
return false; return false;
} }
@ -120,8 +121,8 @@ bool TagNXDNData::processFrame(const uint8_t* data, uint32_t len, uint32_t peerI
} }
} }
LogMessage(LOG_NET, "NXDN, Call End, peer = %u, srcId = %u, dstId = %u, duration = %u, streamId = %u", LogMessage(LOG_NET, "NXDN, Call End, peer = %u, srcId = %u, dstId = %u, duration = %u, streamId = %u, external = %u",
peerId, srcId, dstId, duration / 1000, streamId); peerId, srcId, dstId, duration / 1000, streamId, external);
m_network->m_callInProgress = false; m_network->m_callInProgress = false;
} }
} }
@ -129,7 +130,7 @@ bool TagNXDNData::processFrame(const uint8_t* data, uint32_t len, uint32_t peerI
// is this a new call stream? // is this a new call stream?
if ((messageType != RTCH_MESSAGE_TYPE_TX_REL && messageType != RTCH_MESSAGE_TYPE_TX_REL_EX)) { if ((messageType != RTCH_MESSAGE_TYPE_TX_REL && messageType != RTCH_MESSAGE_TYPE_TX_REL_EX)) {
if (srcId == 0U && dstId == 0U) { if (srcId == 0U && dstId == 0U) {
LogWarning(LOG_NET, "NXDN, invalid call, peer = %u, srcId = %u, dstId = %u, streamId = %u", peerId, srcId, dstId, streamId); LogWarning(LOG_NET, "NXDN, invalid call, peer = %u, srcId = %u, dstId = %u, streamId = %u, external = %u", peerId, srcId, dstId, streamId, external);
return false; return false;
} }
@ -138,7 +139,7 @@ bool TagNXDNData::processFrame(const uint8_t* data, uint32_t len, uint32_t peerI
RxStatus status = m_status[dstId]; RxStatus status = m_status[dstId];
if (streamId != status.streamId) { if (streamId != status.streamId) {
if (status.srcId != 0U && status.srcId != srcId) { if (status.srcId != 0U && status.srcId != srcId) {
LogWarning(LOG_NET, "NXDN, Call Collision, peer = %u, srcId = %u, dstId = %u, streamId = %u", peerId, srcId, dstId, streamId); LogWarning(LOG_NET, "NXDN, Call Collision, peer = %u, srcId = %u, dstId = %u, streamId = %u, external = %u", peerId, srcId, dstId, streamId, external);
return false; return false;
} }
} }
@ -165,7 +166,7 @@ bool TagNXDNData::processFrame(const uint8_t* data, uint32_t len, uint32_t peerI
status.dstId = dstId; status.dstId = dstId;
status.streamId = streamId; status.streamId = streamId;
m_status[dstId] = status; m_status[dstId] = status;
LogMessage(LOG_NET, "NXDN, Call Start, peer = %u, srcId = %u, dstId = %u, streamId = %u", peerId, srcId, dstId, streamId); LogMessage(LOG_NET, "NXDN, Call Start, peer = %u, srcId = %u, dstId = %u, streamId = %u, external = %u", peerId, srcId, dstId, streamId, external);
m_network->m_callInProgress = true; m_network->m_callInProgress = true;
} }
} }
@ -197,8 +198,8 @@ bool TagNXDNData::processFrame(const uint8_t* data, uint32_t len, uint32_t peerI
m_network->writePeer(peer.first, { NET_FUNC_PROTOCOL, NET_PROTOCOL_SUBFUNC_NXDN }, outboundPeerBuffer, len, pktSeq, streamId, true); m_network->writePeer(peer.first, { NET_FUNC_PROTOCOL, NET_PROTOCOL_SUBFUNC_NXDN }, outboundPeerBuffer, len, pktSeq, streamId, true);
if (m_network->m_debug) { if (m_network->m_debug) {
LogDebug(LOG_NET, "NXDN, srcPeer = %u, dstPeer = %u, messageType = $%02X, srcId = %u, dstId = %u, len = %u, pktSeq = %u, streamId = %u", LogDebug(LOG_NET, "NXDN, srcPeer = %u, dstPeer = %u, messageType = $%02X, srcId = %u, dstId = %u, len = %u, pktSeq = %u, streamId = %u, external = %u",
peerId, peer.first, messageType, srcId, dstId, len, pktSeq, streamId); peerId, peer.first, messageType, srcId, dstId, len, pktSeq, streamId, external);
} }
if (!m_network->m_callInProgress) if (!m_network->m_callInProgress)
@ -208,13 +209,13 @@ bool TagNXDNData::processFrame(const uint8_t* data, uint32_t len, uint32_t peerI
m_network->m_frameQueue->flushQueue(); m_network->m_frameQueue->flushQueue();
} }
// repeat traffic to upstream peers // repeat traffic to external peers
if (m_network->m_host->m_peerNetworks.size() > 0U && !tg.config().parrot()) { if (m_network->m_host->m_peerNetworks.size() > 0U && !tg.config().parrot()) {
for (auto peer : m_network->m_host->m_peerNetworks) { for (auto peer : m_network->m_host->m_peerNetworks) {
uint32_t dstPeerId = peer.second->getPeerId(); uint32_t dstPeerId = peer.second->getPeerId();
// don't try to repeat traffic to the source peer...if this traffic // don't try to repeat traffic to the source peer...if this traffic
// is coming from a upstream peer // is coming from a external peer
if (dstPeerId != peerId) { if (dstPeerId != peerId) {
// is this peer ignored? // is this peer ignored?
if (!isPeerPermitted(dstPeerId, lc, messageType, streamId)) { if (!isPeerPermitted(dstPeerId, lc, messageType, streamId)) {
@ -230,8 +231,8 @@ bool TagNXDNData::processFrame(const uint8_t* data, uint32_t len, uint32_t peerI
peer.second->writeMaster({ NET_FUNC_PROTOCOL, NET_PROTOCOL_SUBFUNC_NXDN }, outboundPeerBuffer, len, pktSeq, streamId); peer.second->writeMaster({ NET_FUNC_PROTOCOL, NET_PROTOCOL_SUBFUNC_NXDN }, outboundPeerBuffer, len, pktSeq, streamId);
if (m_network->m_debug) { if (m_network->m_debug) {
LogDebug(LOG_NET, "NXDN, srcPeer = %u, dstPeer = %u, messageType = $%02X, srcId = %u, dstId = %u, len = %u, pktSeq = %u, streamId = %u", LogDebug(LOG_NET, "NXDN, srcPeer = %u, dstPeer = %u, messageType = $%02X, srcId = %u, dstId = %u, len = %u, pktSeq = %u, streamId = %u, external = %u",
peerId, dstPeerId, messageType, srcId, dstId, len, pktSeq, streamId); peerId, dstPeerId, messageType, srcId, dstId, len, pktSeq, streamId, external);
} }
if (!m_network->m_callInProgress) if (!m_network->m_callInProgress)

@ -38,7 +38,7 @@ namespace network
~TagNXDNData(); ~TagNXDNData();
/// <summary>Process a data frame from the network.</summary> /// <summary>Process a data frame from the network.</summary>
bool processFrame(const uint8_t* data, uint32_t len, uint32_t peerId, uint16_t pktSeq, uint32_t streamId); bool processFrame(const uint8_t* data, uint32_t len, uint32_t peerId, uint16_t pktSeq, uint32_t streamId, bool external = false);
/// <summary>Helper to playback a parrot frame to the network.</summary> /// <summary>Helper to playback a parrot frame to the network.</summary>
void playbackParrot(); void playbackParrot();

@ -62,8 +62,9 @@ TagP25Data::~TagP25Data() = default;
/// <param name="peerId">Peer ID</param> /// <param name="peerId">Peer ID</param>
/// <param name="pktSeq"></param> /// <param name="pktSeq"></param>
/// <param name="streamId">Stream ID</param> /// <param name="streamId">Stream ID</param>
/// <param name="external">Flag indicating traffic is from an external peer.</param>
/// <returns></returns> /// <returns></returns>
bool TagP25Data::processFrame(const uint8_t* data, uint32_t len, uint32_t peerId, uint16_t pktSeq, uint32_t streamId) bool TagP25Data::processFrame(const uint8_t* data, uint32_t len, uint32_t peerId, uint16_t pktSeq, uint32_t streamId, bool external)
{ {
hrc::hrc_t pktTime = hrc::now(); hrc::hrc_t pktTime = hrc::now();
@ -154,7 +155,7 @@ bool TagP25Data::processFrame(const uint8_t* data, uint32_t len, uint32_t peerId
// is this the end of the call stream? // is this the end of the call stream?
if ((duid == P25_DUID_TDU) || (duid == P25_DUID_TDULC)) { if ((duid == P25_DUID_TDU) || (duid == P25_DUID_TDULC)) {
if (srcId == 0U && dstId == 0U) { if (srcId == 0U && dstId == 0U) {
LogWarning(LOG_NET, "P25, invalid TDU, peer = %u, srcId = %u, dstId = %u, streamId = %u", peerId, srcId, dstId, streamId); LogWarning(LOG_NET, "P25, invalid TDU, peer = %u, srcId = %u, dstId = %u, streamId = %u, external = %u", peerId, srcId, dstId, streamId, external);
return false; return false;
} }
@ -184,8 +185,8 @@ bool TagP25Data::processFrame(const uint8_t* data, uint32_t len, uint32_t peerId
} }
} }
LogMessage(LOG_NET, "P25, Call End, peer = %u, srcId = %u, dstId = %u, duration = %u, streamId = %u", LogMessage(LOG_NET, "P25, Call End, peer = %u, srcId = %u, dstId = %u, duration = %u, streamId = %u, external = %u",
peerId, srcId, dstId, duration / 1000, streamId); peerId, srcId, dstId, duration / 1000, streamId, external);
m_network->m_callInProgress = false; m_network->m_callInProgress = false;
} }
} }
@ -193,7 +194,7 @@ bool TagP25Data::processFrame(const uint8_t* data, uint32_t len, uint32_t peerId
// is this a new call stream? // is this a new call stream?
if ((duid != P25_DUID_TDU) && (duid != P25_DUID_TDULC)) { if ((duid != P25_DUID_TDU) && (duid != P25_DUID_TDULC)) {
if (srcId == 0U && dstId == 0U) { if (srcId == 0U && dstId == 0U) {
LogWarning(LOG_NET, "P25, invalid call, peer = %u, srcId = %u, dstId = %u, streamId = %u", peerId, srcId, dstId, streamId); LogWarning(LOG_NET, "P25, invalid call, peer = %u, srcId = %u, dstId = %u, streamId = %u, external = %u", peerId, srcId, dstId, streamId, external);
return false; return false;
} }
@ -202,7 +203,7 @@ bool TagP25Data::processFrame(const uint8_t* data, uint32_t len, uint32_t peerId
RxStatus status = m_status[dstId]; RxStatus status = m_status[dstId];
if (streamId != status.streamId && ((duid != P25_DUID_TDU) && (duid != P25_DUID_TDULC))) { if (streamId != status.streamId && ((duid != P25_DUID_TDU) && (duid != P25_DUID_TDULC))) {
if (status.srcId != 0U && status.srcId != srcId) { if (status.srcId != 0U && status.srcId != srcId) {
LogWarning(LOG_NET, "P25, Call Collision, peer = %u, srcId = %u, dstId = %u, streamId = %u", peerId, srcId, dstId, streamId); LogWarning(LOG_NET, "P25, Call Collision, peer = %u, srcId = %u, dstId = %u, streamId = %u, external = %u", peerId, srcId, dstId, streamId, external);
return false; return false;
} }
} }
@ -229,7 +230,7 @@ bool TagP25Data::processFrame(const uint8_t* data, uint32_t len, uint32_t peerId
status.dstId = dstId; status.dstId = dstId;
status.streamId = streamId; status.streamId = streamId;
m_status[dstId] = status; m_status[dstId] = status;
LogMessage(LOG_NET, "P25, Call Start, peer = %u, srcId = %u, dstId = %u, streamId = %u", peerId, srcId, dstId, streamId); LogMessage(LOG_NET, "P25, Call Start, peer = %u, srcId = %u, dstId = %u, streamId = %u, external = %u", peerId, srcId, dstId, streamId, external);
m_network->m_callInProgress = true; m_network->m_callInProgress = true;
} }
} }
@ -261,8 +262,8 @@ bool TagP25Data::processFrame(const uint8_t* data, uint32_t len, uint32_t peerId
m_network->writePeer(peer.first, { NET_FUNC_PROTOCOL, NET_PROTOCOL_SUBFUNC_P25 }, outboundPeerBuffer, len, pktSeq, streamId, true); m_network->writePeer(peer.first, { NET_FUNC_PROTOCOL, NET_PROTOCOL_SUBFUNC_P25 }, outboundPeerBuffer, len, pktSeq, streamId, true);
if (m_network->m_debug) { if (m_network->m_debug) {
LogDebug(LOG_NET, "P25, srcPeer = %u, dstPeer = %u, duid = $%02X, lco = $%02X, MFId = $%02X, srcId = %u, dstId = %u, len = %u, pktSeq = %u, streamId = %u", LogDebug(LOG_NET, "P25, srcPeer = %u, dstPeer = %u, duid = $%02X, lco = $%02X, MFId = $%02X, srcId = %u, dstId = %u, len = %u, pktSeq = %u, streamId = %u, external = %u",
peerId, peer.first, duid, lco, MFId, srcId, dstId, len, pktSeq, streamId); peerId, peer.first, duid, lco, MFId, srcId, dstId, len, pktSeq, streamId, external);
} }
if (!m_network->m_callInProgress) if (!m_network->m_callInProgress)
@ -272,13 +273,13 @@ bool TagP25Data::processFrame(const uint8_t* data, uint32_t len, uint32_t peerId
m_network->m_frameQueue->flushQueue(); m_network->m_frameQueue->flushQueue();
} }
// repeat traffic to upstream peers // repeat traffic to external peers
if (m_network->m_host->m_peerNetworks.size() > 0U && !tg.config().parrot()) { if (m_network->m_host->m_peerNetworks.size() > 0U && !tg.config().parrot()) {
for (auto peer : m_network->m_host->m_peerNetworks) { for (auto peer : m_network->m_host->m_peerNetworks) {
uint32_t dstPeerId = peer.second->getPeerId(); uint32_t dstPeerId = peer.second->getPeerId();
// don't try to repeat traffic to the source peer...if this traffic // don't try to repeat traffic to the source peer...if this traffic
// is coming from a upstream peer // is coming from a external peer
if (dstPeerId != peerId) { if (dstPeerId != peerId) {
// is this peer ignored? // is this peer ignored?
if (!isPeerPermitted(dstPeerId, control, duid, streamId)) { if (!isPeerPermitted(dstPeerId, control, duid, streamId)) {
@ -293,11 +294,11 @@ bool TagP25Data::processFrame(const uint8_t* data, uint32_t len, uint32_t peerId
routeRewrite(outboundPeerBuffer, dstPeerId, duid, dstId); routeRewrite(outboundPeerBuffer, dstPeerId, duid, dstId);
// process TSDUs going to external peers // process TSDUs going to external peers
if (processTSDUToExternal(outboundPeerBuffer, peerId, dstPeerId, duid)) { if (processTSDUExternal(outboundPeerBuffer, peerId, dstPeerId, duid)) {
peer.second->writeMaster({ NET_FUNC_PROTOCOL, NET_PROTOCOL_SUBFUNC_P25 }, outboundPeerBuffer, len, pktSeq, streamId); peer.second->writeMaster({ NET_FUNC_PROTOCOL, NET_PROTOCOL_SUBFUNC_P25 }, outboundPeerBuffer, len, pktSeq, streamId);
if (m_network->m_debug) { if (m_network->m_debug) {
LogDebug(LOG_NET, "P25, srcPeer = %u, dstPeer = %u, duid = $%02X, lco = $%02X, MFId = $%02X, srcId = %u, dstId = %u, len = %u, pktSeq = %u, streamId = %u", LogDebug(LOG_NET, "P25, srcPeer = %u, dstPeer = %u, duid = $%02X, lco = $%02X, MFId = $%02X, srcId = %u, dstId = %u, len = %u, pktSeq = %u, streamId = %u, external = %u",
peerId, dstPeerId, duid, lco, MFId, srcId, dstId, len, pktSeq, streamId); peerId, dstPeerId, duid, lco, MFId, srcId, dstId, len, pktSeq, streamId, external);
} }
} }
@ -482,7 +483,7 @@ bool TagP25Data::peerRewrite(uint32_t peerId, uint32_t& dstId, bool outbound)
/// <param name="srcPeerId">Source Peer ID</param> /// <param name="srcPeerId">Source Peer ID</param>
/// <param name="dstPeerId">Destination Peer ID</param> /// <param name="dstPeerId">Destination Peer ID</param>
/// <param name="duid"></param> /// <param name="duid"></param>
bool TagP25Data::processTSDUToExternal(uint8_t* buffer, uint32_t srcPeerId, uint32_t dstPeerId, uint8_t duid) bool TagP25Data::processTSDUExternal(uint8_t* buffer, uint32_t srcPeerId, uint32_t dstPeerId, uint8_t duid)
{ {
// are we receiving a TSDU? // are we receiving a TSDU?
if (duid == P25_DUID_TSDU) { if (duid == P25_DUID_TSDU) {

@ -44,7 +44,7 @@ namespace network
~TagP25Data(); ~TagP25Data();
/// <summary>Process a data frame from the network.</summary> /// <summary>Process a data frame from the network.</summary>
bool processFrame(const uint8_t* data, uint32_t len, uint32_t peerId, uint16_t pktSeq, uint32_t streamId); bool processFrame(const uint8_t* data, uint32_t len, uint32_t peerId, uint16_t pktSeq, uint32_t streamId, bool external = false);
/// <summary>Helper to playback a parrot frame to the network.</summary> /// <summary>Helper to playback a parrot frame to the network.</summary>
void playbackParrot(); void playbackParrot();
@ -76,7 +76,7 @@ namespace network
bool peerRewrite(uint32_t peerId, uint32_t& dstId, bool outbound = true); bool peerRewrite(uint32_t peerId, uint32_t& dstId, bool outbound = true);
/// <summary>Helper to process TSDUs being passed to an external peer.</summary> /// <summary>Helper to process TSDUs being passed to an external peer.</summary>
bool processTSDUToExternal(uint8_t* buffer, uint32_t srcPeerId, uint32_t dstPeerId, uint8_t duid); bool processTSDUExternal(uint8_t* buffer, uint32_t srcPeerId, uint32_t dstPeerId, uint8_t duid);
/// <summary>Helper to determine if the peer is permitted for traffic.</summary> /// <summary>Helper to determine if the peer is permitted for traffic.</summary>
bool isPeerPermitted(uint32_t peerId, p25::lc::LC& control, uint8_t duid, uint32_t streamId); bool isPeerPermitted(uint32_t peerId, p25::lc::LC& control, uint8_t duid, uint32_t streamId);

Loading…
Cancel
Save

Powered by TurnKey Linux.