From 93f29a5fea31dffe66feb81492fef12dc1e7252c Mon Sep 17 00:00:00 2001 From: Abtin Keshavarzian Date: Thu, 2 Feb 2017 13:51:54 -0800 Subject: [PATCH] New ot API to set a message to use direct tx (#1245) - New OpenThread API `otMessageSetDirectTransmission()` to force a message to forwarded using direct transmission even if the destination is a sleepy-node. - The new API is used from `NcpBase` from set handler of insecure network stream spinel `STREAM_NET_INSECURE` property. --- include/openthread-message.h | 11 +++++++++++ src/core/openthread.cpp | 14 ++++++++++++++ src/core/thread/mesh_forwarder.cpp | 3 ++- src/ncp/ncp_base.cpp | 3 +++ 4 files changed, 30 insertions(+), 1 deletion(-) diff --git a/include/openthread-message.h b/include/openthread-message.h index d8e27c9d7..345e5184c 100644 --- a/include/openthread-message.h +++ b/include/openthread-message.h @@ -177,6 +177,17 @@ ThreadError otSetMessageOffset(otMessage aMessage, uint16_t aOffset); */ bool otIsMessageLinkSecurityEnabled(otMessage aMessage); +/** + * This function sets/forces the message to be forwarded using direct transmission. + * Default setting for a new message is `false`. + * + * @param[in] aMessage A pointer to a message buffer. + * @param[in] aEnabled If `true` message will be forced to use direct transmission. If `false` message will + * follow the normal procedure. + * + */ +void otMessageSetDirectTransmission(otMessage aMessage, bool aEnabled); + /** * Append bytes to a message. * diff --git a/src/core/openthread.cpp b/src/core/openthread.cpp index c794e7657..a08dc0017 100644 --- a/src/core/openthread.cpp +++ b/src/core/openthread.cpp @@ -1509,6 +1509,20 @@ bool otIsMessageLinkSecurityEnabled(otMessage aMessage) return message->IsLinkSecurityEnabled(); } +void otMessageSetDirectTransmission(otMessage aMessage, bool aEnabled) +{ + Message *message = static_cast(aMessage); + + if (aEnabled) + { + message->SetDirectTransmission(); + } + else + { + message->ClearDirectTransmission(); + } +} + ThreadError otAppendMessage(otMessage aMessage, const void *aBuf, uint16_t aLength) { Message *message = static_cast(aMessage); diff --git a/src/core/thread/mesh_forwarder.cpp b/src/core/thread/mesh_forwarder.cpp index 12f93c2b2..58a30d0f4 100644 --- a/src/core/thread/mesh_forwarder.cpp +++ b/src/core/thread/mesh_forwarder.cpp @@ -438,7 +438,8 @@ ThreadError MeshForwarder::SendMessage(Message &aMessage) } } else if ((neighbor = mNetif.GetMle().GetNeighbor(ip6Header.GetDestination())) != NULL && - (neighbor->mMode & Mle::ModeTlv::kModeRxOnWhenIdle) == 0) + (neighbor->mMode & Mle::ModeTlv::kModeRxOnWhenIdle) == 0 && + !aMessage.GetDirectTransmission()) { // destined for a sleepy child children = static_cast(neighbor); diff --git a/src/ncp/ncp_base.cpp b/src/ncp/ncp_base.cpp index 677951c80..06903eab7 100644 --- a/src/ncp/ncp_base.cpp +++ b/src/ncp/ncp_base.cpp @@ -4187,6 +4187,9 @@ ThreadError NcpBase::SetPropertyHandler_STREAM_NET_INSECURE(uint8_t header, spin if (errorCode == kThreadError_None) { + // Ensure the insecure message is forwarded using direct transmission. + otMessageSetDirectTransmission(message, true); + errorCode = otSendIp6Datagram(mInstance, message); } else if (message)