diff --git a/src/core/net/ip6.cpp b/src/core/net/ip6.cpp index 1339e66cf..75abe1858 100644 --- a/src/core/net/ip6.cpp +++ b/src/core/net/ip6.cpp @@ -489,7 +489,7 @@ exit: return error; } -Error Ip6::HandleOptions(Message &aMessage, const Header &aHeader, bool &aReceive) +Error Ip6::HandleOptions(Message &aMessage, const Header &aHeader, bool &aReceive, bool aIsHopByHop) { Error error = kErrorNone; bool hasMplOption = false; @@ -516,7 +516,7 @@ Error Ip6::HandleOptions(Message &aMessage, const Header &aHeader, bool &aReceiv continue; } - if (option.GetType() == MplOption::kType) + if (aIsHopByHop && (option.GetType() == MplOption::kType)) { VerifyOrExit(!hasMplOption, error = kErrorDrop); hasMplOption = true; @@ -817,10 +817,11 @@ Error Ip6::HandleExtensionHeaders(OwnedPtr &aMessagePtr, { case kProtoHopOpts: VerifyOrExit(first, error = kErrorDrop); - OT_FALL_THROUGH; + SuccessOrExit(error = HandleOptions(*aMessagePtr, aHeader, aReceive, /* aIsHopByHop */ true)); + break; case kProtoDstOpts: - SuccessOrExit(error = HandleOptions(*aMessagePtr, aHeader, aReceive)); + SuccessOrExit(error = HandleOptions(*aMessagePtr, aHeader, aReceive, /* aIsHopByHop */ false)); break; case kProtoFragment: diff --git a/src/core/net/ip6.hpp b/src/core/net/ip6.hpp index cc90e41f6..8a20b549b 100644 --- a/src/core/net/ip6.hpp +++ b/src/core/net/ip6.hpp @@ -363,7 +363,7 @@ private: Error PrepareMulticastToLargerThanRealmLocal(Message &aMessage, const Header &aHeader); Error InsertMplOption(Message &aMessage, Header &aHeader); Error RemoveMplOption(Message &aMessage); - Error HandleOptions(Message &aMessage, const Header &aHeader, bool &aReceive); + Error HandleOptions(Message &aMessage, const Header &aHeader, bool &aReceive, bool aIsHopByHop); Error Receive(Header &aIp6Header, OwnedPtr &aMessagePtr, uint8_t aIpProto,