@ -520,6 +520,15 @@ void TagAnalogData::playbackParrot()
m_lastParrotSrcId = pkt . srcId ;
m_lastParrotDstId = pkt . dstId ;
lookups : : TalkgroupRuleGroupVoice tg = m_network - > m_tidLookup - > find ( pkt . dstId ) ;
if ( tg . isInvalid ( ) ) {
LogWarning ( LOG_ANALOG , " TagAnalogData::playbackParrot(), invalid talkgroup, dstId = %u " , pkt . dstId ) ;
delete [ ] pkt . buffer ;
m_parrotFrames . unlock ( ) ;
m_parrotFrames . pop_front ( ) ;
return ;
}
if ( m_network - > m_parrotOnlyOriginating ) {
m_network - > writePeer ( pkt . peerId , pkt . peerId , { NET_FUNC : : PROTOCOL , NET_SUBFUNC : : PROTOCOL_SUBFUNC_ANALOG } , pkt . buffer , pkt . bufferLen , pkt . pktSeq , pkt . streamId ) ;
if ( m_network - > m_debug ) {
@ -538,6 +547,38 @@ void TagAnalogData::playbackParrot()
m_network - > m_frameQueue - > flushQueue ( & queue ) ;
}
// skip peers that are not affiliated with the target group if parrot TG affiliation is enabled
if ( tg . config ( ) . affiliated ( ) ) {
// peer always send list takes priority over any other rules
bool skipChecks = false ;
std : : vector < uint32_t > alwaysSend = tg . config ( ) . alwaysSend ( ) ;
if ( alwaysSend . size ( ) > 0 ) {
auto it = std : : find ( alwaysSend . begin ( ) , alwaysSend . end ( ) , peer . first ) ;
if ( it ! = alwaysSend . end ( ) ) {
skipChecks = true ; // skip any following checks and always send traffic
}
}
if ( ! skipChecks ) {
TrafficNetwork : : PeerConnectionPtr connection = peer . first > 0U ? m_network - > findPeer ( peer . first ) : nullptr ;
uint32_t lookupPeerId = peer . first ;
if ( connection ! = nullptr ) {
if ( connection - > ccPeerId ( ) > 0U )
lookupPeerId = connection - > ccPeerId ( ) ;
}
std : : shared_ptr < fne_lookups : : AffiliationLookup > aff = m_network - > getPeerAffiliations ( lookupPeerId ) ;
if ( aff = = nullptr ) {
continue ;
}
else {
if ( ! aff - > hasGroupAff ( pkt . dstId ) ) {
continue ;
}
}
}
}
m_network - > writePeerQueue ( & queue , peer . first , pkt . peerId , { NET_FUNC : : PROTOCOL , NET_SUBFUNC : : PROTOCOL_SUBFUNC_ANALOG } , pkt . buffer , pkt . bufferLen , pkt . pktSeq , pkt . streamId ) ;
if ( m_network - > m_debug ) {
LogDebugEx ( LOG_ANALOG , " TagAnalogData::playbackParrot() " , " Parrot, dstPeer = %u, len = %u, pktSeq = %u, streamId = %u " ,