Duplicate MRP message handling and test (#7893)
* Duplicate CRMP message handling and test
* address review comments
* update test with review comments
diff --git a/src/messaging/ExchangeMgr.cpp b/src/messaging/ExchangeMgr.cpp
index 4f55093..a769574 100644
--- a/src/messaging/ExchangeMgr.cpp
+++ b/src/messaging/ExchangeMgr.cpp
@@ -140,7 +140,7 @@
return UnregisterUMH(protocolId, static_cast<int16_t>(msgType));
}
-void ExchangeManager::OnReceiveError(CHIP_ERROR error, const Transport::PeerAddress & source, SecureSessionMgr * msgLayer)
+void ExchangeManager::OnReceiveError(CHIP_ERROR error, const Transport::PeerAddress & source)
{
#if CHIP_ERROR_LOGGING
char srcAddressStr[Transport::PeerAddress::kMaxToStringSize];
@@ -197,7 +197,7 @@
void ExchangeManager::OnMessageReceived(const PacketHeader & packetHeader, const PayloadHeader & payloadHeader,
SecureSessionHandle session, const Transport::PeerAddress & source,
- System::PacketBufferHandle && msgBuf, SecureSessionMgr * msgLayer)
+ DuplicateMessage isDuplicate, System::PacketBufferHandle && msgBuf)
{
CHIP_ERROR err = CHIP_NO_ERROR;
UnsolicitedMessageHandler * matchingUMH = nullptr;
@@ -207,6 +207,12 @@
payloadHeader.GetMessageType(), payloadHeader.GetProtocolID().ToFullyQualifiedSpecForm(),
payloadHeader.GetExchangeID());
+ MessageFlags msgFlags;
+ if (isDuplicate == DuplicateMessage::Yes)
+ {
+ msgFlags.Set(MessageFlagValues::kDuplicateMessage);
+ }
+
// Search for an existing exchange that the message applies to. If a match is found...
bool found = false;
mContextPool.ForEachActiveObject([&](auto * ec) {
@@ -220,7 +226,7 @@
}
// Matched ExchangeContext; send to message handler.
- ec->HandleMessage(packetHeader, payloadHeader, source, std::move(msgBuf));
+ ec->HandleMessage(packetHeader, payloadHeader, source, msgFlags, std::move(msgBuf));
found = true;
return false;
}
@@ -232,10 +238,10 @@
ExitNow(err = CHIP_NO_ERROR);
}
- // Search for an unsolicited message handler if it marked as being sent by an initiator. Since we didn't
- // find an existing exchange that matches the message, it must be an unsolicited message. However all
+ // If it's not a duplicate message, search for an unsolicited message handler if it is marked as being sent by an initiator.
+ // Since we didn't find an existing exchange that matches the message, it must be an unsolicited message. However all
// unsolicited messages must be marked as being from an initiator.
- if (payloadHeader.IsInitiator())
+ if (!msgFlags.Has(MessageFlagValues::kDuplicateMessage) && payloadHeader.IsInitiator())
{
// Search for an unsolicited message handler that can handle the message. Prefer handlers that can explicitly
// handle the message type over handlers that handle all messages for a profile.
@@ -288,7 +294,7 @@
ChipLogDetail(ExchangeManager, "ec id: %d, Delegate: 0x%p", ec->GetExchangeId(), ec->GetDelegate());
- ec->HandleMessage(packetHeader, payloadHeader, source, std::move(msgBuf));
+ ec->HandleMessage(packetHeader, payloadHeader, source, msgFlags, std::move(msgBuf));
// Close exchange if it was created only to send ack for a duplicate message.
if (sendAckAndCloseExchange)
@@ -302,7 +308,7 @@
}
}
-void ExchangeManager::OnNewConnection(SecureSessionHandle session, SecureSessionMgr * mgr)
+void ExchangeManager::OnNewConnection(SecureSessionHandle session)
{
if (mDelegate != nullptr)
{
@@ -310,7 +316,7 @@
}
}
-void ExchangeManager::OnConnectionExpired(SecureSessionHandle session, SecureSessionMgr * mgr)
+void ExchangeManager::OnConnectionExpired(SecureSessionHandle session)
{
if (mDelegate != nullptr)
{
@@ -328,23 +334,6 @@
});
}
-void ExchangeManager::OnMessageReceived(const Transport::PeerAddress & source, System::PacketBufferHandle && msgBuf)
-{
- PacketHeader header;
-
- ReturnOnFailure(header.DecodeAndConsume(msgBuf));
-
- Optional<NodeId> peer = header.GetSourceNodeId();
- if (!peer.HasValue())
- {
- char addrBuffer[Transport::PeerAddress::kMaxToStringSize];
- source.ToString(addrBuffer, sizeof(addrBuffer));
- ChipLogError(ExchangeManager, "Unencrypted message from %s is dropped since no source node id in packet header.",
- addrBuffer);
- return;
- }
-}
-
void ExchangeManager::CloseAllContextsForDelegate(const ExchangeDelegate * delegate)
{
mContextPool.ForEachActiveObject([&](auto * ec) {