diff --git a/src/messaging/ExchangeMgr.cpp b/src/messaging/ExchangeMgr.cpp index 04138f57d0b568..67fe53649461a3 100644 --- a/src/messaging/ExchangeMgr.cpp +++ b/src/messaging/ExchangeMgr.cpp @@ -295,6 +295,18 @@ void ExchangeManager::OnMessageReceived(const PacketHeader & packetHeader, const DispatchMessage(packetHeader, payloadHeader, msgBuf); } +void ExchangeManager::OnConnectionExpired(const Transport::PeerConnectionState * state, SecureSessionMgrBase * mgr) +{ + for (auto & ec : ContextPool) + { + if (ec.GetReferenceCount() > 0 && ec.mPeerNodeId == state->GetPeerNodeId()) + { + ec.Close(); + // Continue iterate because there can be multiple contexts associated with the connection. + } + } +} + void ExchangeManager::IncrementContextsInUse() { mContextsInUse++; diff --git a/src/messaging/ExchangeMgr.h b/src/messaging/ExchangeMgr.h index 2897065844aebc..8515dafe4a3db4 100644 --- a/src/messaging/ExchangeMgr.h +++ b/src/messaging/ExchangeMgr.h @@ -201,6 +201,8 @@ class DLL_EXPORT ExchangeManager : public SecureSessionMgrDelegate void OnMessageReceived(const PacketHeader & packetHeader, const PayloadHeader & payloadHeader, Transport::PeerConnectionState * state, System::PacketBuffer * msgBuf, SecureSessionMgrBase * msgLayer) override; + + void OnConnectionExpired(const Transport::PeerConnectionState * state, SecureSessionMgrBase * mgr) override; }; } // namespace chip diff --git a/src/transport/SecureSessionMgr.cpp b/src/transport/SecureSessionMgr.cpp index fc9c0870941879..0c4fc80936d900 100644 --- a/src/transport/SecureSessionMgr.cpp +++ b/src/transport/SecureSessionMgr.cpp @@ -363,6 +363,11 @@ void SecureSessionMgrBase::HandleConnectionExpired(const Transport::PeerConnecti ChipLogDetail(Inet, "Connection from '%s' expired", addr); + if (mgr->mCB != nullptr) + { + mgr->mCB->OnConnectionExpired(&state, mgr); + } + mgr->mTransport->Disconnect(state.GetPeerAddress()); } diff --git a/src/transport/SecureSessionMgr.h b/src/transport/SecureSessionMgr.h index e3304b693e7fc8..a1c18c9cc4fd2a 100644 --- a/src/transport/SecureSessionMgr.h +++ b/src/transport/SecureSessionMgr.h @@ -88,6 +88,15 @@ class DLL_EXPORT SecureSessionMgrDelegate */ virtual void OnNewConnection(Transport::PeerConnectionState * state, SecureSessionMgrBase * mgr) {} + /** + * @brief + * Called when a new connection is closing + * + * @param state connection state + * @param mgr A pointer to the SecureSessionMgr + */ + virtual void OnConnectionExpired(const Transport::PeerConnectionState * state, SecureSessionMgrBase * mgr) {} + /** * @brief * Called when the peer address is resolved from NodeID.