diff --git a/src/common/network/Network.cpp b/src/common/network/Network.cpp index d2405f0c..c43191e2 100644 --- a/src/common/network/Network.cpp +++ b/src/common/network/Network.cpp @@ -59,6 +59,8 @@ Network::Network(const std::string& address, uint16_t port, uint16_t localPort, m_remotePeerId(0U), m_promiscuousPeer(false), m_userHandleProtocol(false), + m_peerConnectedCallback(nullptr), + m_peerDisconnectedCallback(nullptr), m_dmrInCallCallback(nullptr), m_p25InCallCallback(nullptr), m_nxdnInCallCallback(nullptr), @@ -588,6 +590,7 @@ void Network::clock(uint32_t ms) uint32_t dstId = __GET_UINT16(buffer, 11U); uint8_t slot = buffer[14U]; + // fire off DMR in-call callback if we have one if (m_dmrInCallCallback != nullptr) { m_dmrInCallCallback(command, dstId, slot); } @@ -600,6 +603,7 @@ void Network::clock(uint32_t ms) NET_ICC::ENUM command = (NET_ICC::ENUM)buffer[10U]; uint32_t dstId = __GET_UINT16(buffer, 11U); + // fire off P25 in-call callback if we have one if (m_p25InCallCallback != nullptr) { m_p25InCallCallback(command, dstId); } @@ -612,6 +616,7 @@ void Network::clock(uint32_t ms) NET_ICC::ENUM command = (NET_ICC::ENUM)buffer[10U]; uint32_t dstId = __GET_UINT16(buffer, 11U); + // fire off NXDN in-call callback if we have one if (m_nxdnInCallCallback != nullptr) { m_nxdnInCallCallback(command, dstId); } @@ -649,6 +654,7 @@ void Network::clock(uint32_t ms) LogMessage(LOG_NET, "PEER %u, master reported enc. key, algId = $%02X, kID = $%04X", m_peerId, ks.algId(), ki.kId()); + // fire off key response callback if we have one if (m_keyRespCallback != nullptr) { m_keyRespCallback(ki, ks.algId(), ks.keyLength()); } @@ -751,6 +757,11 @@ void Network::clock(uint32_t ms) pktSeq(true); + // fire off peer connected callback if we have one + if (m_peerConnectedCallback != nullptr) { + m_peerConnectedCallback(); + } + m_status = NET_STAT_RUNNING; m_timeoutTimer.start(); m_retryTimer.start(); @@ -771,6 +782,12 @@ void Network::clock(uint32_t ms) { LogError(LOG_NET, "PEER %u master is closing down, remotePeerId = %u", m_peerId, m_remotePeerId); m_status = NET_STAT_WAITING_CONNECT; + + // fire off peer disconnected callback if we have one + if (m_peerDisconnectedCallback != nullptr) { + m_peerDisconnectedCallback(); + } + close(); open(); } @@ -832,6 +849,12 @@ void Network::clock(uint32_t ms) m_timeoutTimer.clock(ms); if (m_timeoutTimer.isRunning() && m_timeoutTimer.hasExpired()) { LogError(LOG_NET, "PEER %u connection to the master has timed out, retrying connection, remotePeerId = %u", m_peerId, m_remotePeerId); + + // fire off peer disconnected callback if we have one + if (m_peerDisconnectedCallback != nullptr) { + m_peerDisconnectedCallback(); + } + close(); open(); } diff --git a/src/common/network/Network.h b/src/common/network/Network.h index 46641d29..01f066ab 100644 --- a/src/common/network/Network.h +++ b/src/common/network/Network.h @@ -185,6 +185,17 @@ namespace network */ void enable(bool enabled); + /** + * @brief Helper to set the peer connected callback. + * @param callback + */ + void setPeerConnectedCallback(std::function&& callback) { m_peerConnectedCallback = callback; } + /** + * @brief Helper to set the peer disconnected callback. + * @param callback + */ + void setPeerDisconnectedCallback(std::function&& callback) { m_peerDisconnectedCallback = callback; } + /** * @brief Helper to set the DMR In-Call Control callback. * @param callback @@ -257,6 +268,17 @@ namespace network */ bool m_userHandleProtocol; + /** + * @brief Peer Connected Function Callback. + * (This is called once this peer connects (or reconnects) to an upstream master.) + */ + std::function m_peerConnectedCallback; + /** + * @brief Peer Disconnected Function Callback. + * (This is called once this peer disconnects from an upstream master.) + */ + std::function m_peerDisconnectedCallback; + /** * @brief DMR In-Call Control Function Callback. * (This is called when the master sends a In-Call Control request.)