diff --git a/src/core/api/ip6_api.cpp b/src/core/api/ip6_api.cpp index 6aa9e71a3..bbeeb9af0 100644 --- a/src/core/api/ip6_api.cpp +++ b/src/core/api/ip6_api.cpp @@ -135,7 +135,8 @@ void otIp6SetReceiveFilterEnabled(otInstance *aInstance, bool aEnabled) otError otIp6Send(otInstance *aInstance, otMessage *aMessage) { - return AsCoreType(aInstance).Get().SendRaw(AsCoreType(aMessage)); + return AsCoreType(aInstance).Get().SendRaw(AsCoreType(aMessage), + !OPENTHREAD_CONFIG_IP6_ALLOW_LOOP_BACK_HOST_DATAGRAMS); } otMessage *otIp6NewMessage(otInstance *aInstance, const otMessageSettings *aSettings) diff --git a/src/core/config/ip6.h b/src/core/config/ip6.h index 4eb5ac3a8..c38de0cf7 100644 --- a/src/core/config/ip6.h +++ b/src/core/config/ip6.h @@ -187,4 +187,14 @@ #define OPENTHREAD_CONFIG_TCP_ENABLE 1 #endif +/** + * @def OPENTHREAD_CONFIG_IP6_ALLOW_LOOP_BACK_HOST_DATAGRAMS + * + * Define as 1 to allow IPv6 datagrams from Host to be looped back to Host. + * + */ +#ifndef OPENTHREAD_CONFIG_IP6_ALLOW_LOOP_BACK_HOST_DATAGRAMS +#define OPENTHREAD_CONFIG_IP6_ALLOW_LOOP_BACK_HOST_DATAGRAMS 1 +#endif + #endif // CONFIG_IP6_H_ diff --git a/src/core/net/ip6.cpp b/src/core/net/ip6.cpp index ef315525a..64154e2b4 100644 --- a/src/core/net/ip6.cpp +++ b/src/core/net/ip6.cpp @@ -307,7 +307,7 @@ Error Ip6::InsertMplOption(Message &aMessage, Header &aHeader, MessageInfo &aMes if ((messageCopy = aMessage.Clone()) != nullptr) { - IgnoreError(HandleDatagram(*messageCopy, nullptr, nullptr, true)); + IgnoreError(HandleDatagram(*messageCopy, nullptr, nullptr, /* aFromNcpHost */ true)); otLogInfoIp6("Message copy for indirect transmission to sleepy children"); } else @@ -540,7 +540,7 @@ void Ip6::HandleSendQueue(void) while ((message = mSendQueue.GetHead()) != nullptr) { mSendQueue.Dequeue(*message); - IgnoreError(HandleDatagram(*message, nullptr, nullptr, false)); + IgnoreError(HandleDatagram(*message, nullptr, nullptr, /* aFromNcpHost */ false)); } } @@ -1084,7 +1084,7 @@ exit: return error; } -Error Ip6::SendRaw(Message &aMessage) +Error Ip6::SendRaw(Message &aMessage, bool aFromNcpHost) { Error error = kErrorNone; Header header; @@ -1103,7 +1103,7 @@ Error Ip6::SendRaw(Message &aMessage) SuccessOrExit(error = InsertMplOption(aMessage, header, messageInfo)); } - error = HandleDatagram(aMessage, nullptr, nullptr, true); + error = HandleDatagram(aMessage, nullptr, nullptr, aFromNcpHost); freed = true; exit: diff --git a/src/core/net/ip6.hpp b/src/core/net/ip6.hpp index d538021bb..529fefc69 100644 --- a/src/core/net/ip6.hpp +++ b/src/core/net/ip6.hpp @@ -196,6 +196,7 @@ public: * processing is complete, including when a value other than `kErrorNone` is returned. * * @param[in] aMessage A reference to the message. + * @param[in] aFromNcpHost If the message was forwarded from the NCP Host. * * @retval kErrorNone Successfully processed the message. * @retval kErrorDrop Message was well-formed but not fully processed due to packet processing rules. @@ -204,7 +205,7 @@ public: * @retval kErrorParse Encountered a malformed header when processing the message. * */ - Error SendRaw(Message &aMessage); + Error SendRaw(Message &aMessage, bool aFromNcpHost); /** * This method processes a received IPv6 datagram. diff --git a/src/core/thread/mesh_forwarder_ftd.cpp b/src/core/thread/mesh_forwarder_ftd.cpp index 95143e7fb..da383b900 100644 --- a/src/core/thread/mesh_forwarder_ftd.cpp +++ b/src/core/thread/mesh_forwarder_ftd.cpp @@ -203,7 +203,7 @@ Error MeshForwarder::ForwardDuaToBackboneLink(Message &aMessage, const Ip6::Addr ttl++; aMessage.Write(Ip6::Header::kHopLimitFieldOffset, ttl); - IgnoreError(Get().HandleDatagram(aMessage, nullptr, nullptr, false)); + IgnoreError(Get().HandleDatagram(aMessage, nullptr, nullptr, /* aFromNcpHost */ false)); exit: return error;