diff --git a/src/core/meshcop/border_agent.cpp b/src/core/meshcop/border_agent.cpp index 4208571af..7a8512c19 100644 --- a/src/core/meshcop/border_agent.cpp +++ b/src/core/meshcop/border_agent.cpp @@ -209,9 +209,9 @@ void BorderAgent::HandleRequest<&BorderAgent::mCommissionerKeepAlive>(void * otMessage * aMessage, const otMessageInfo *aMessageInfo) { - static_cast(aContext)->ForwardToLeader( - *static_cast(aHeader), *static_cast(aMessage), - *static_cast(aMessageInfo), OT_URI_PATH_LEADER_KEEP_ALIVE, true); + static_cast(aContext)->HandleKeepAlive(*static_cast(aHeader), + *static_cast(aMessage), + *static_cast(aMessageInfo)); } template <> @@ -272,7 +272,7 @@ void BorderAgent::HandleRelayReceive(const Coap::Header &aHeader, const Message } SuccessOrExit(ForwardToCommissioner(header, aMessage)); - otLogInfoMeshCoP(GetInstance(), "Sent to leader on %s", OT_URI_PATH_RELAY_RX); + otLogInfoMeshCoP(GetInstance(), "Sent to commissioner on %s", OT_URI_PATH_RELAY_RX); exit: return; @@ -308,6 +308,20 @@ exit: return error; } +void BorderAgent::HandleKeepAlive(const Coap::Header & aHeader, + const Message & aMessage, + const Ip6::MessageInfo &aMessageInfo) +{ + otError error; + + error = ForwardToLeader(aHeader, aMessage, aMessageInfo, OT_URI_PATH_LEADER_KEEP_ALIVE, true); + + if (error == OT_ERROR_NONE) + { + mTimer.Start(kKeepAliveTimeout); + } +} + void BorderAgent::HandleRelayTransmit(const Coap::Header &aHeader, const Message &aMessage) { ThreadNetif & netif = GetNetif(); @@ -357,11 +371,11 @@ exit: } } -void BorderAgent::ForwardToLeader(const Coap::Header & aHeader, - const Message & aMessage, - const Ip6::MessageInfo &aMessageInfo, - const char * aPath, - bool aSeparate) +otError BorderAgent::ForwardToLeader(const Coap::Header & aHeader, + const Message & aMessage, + const Ip6::MessageInfo &aMessageInfo, + const char * aPath, + bool aSeparate) { ThreadNetif & netif = GetNetif(); otError error = OT_ERROR_NONE; @@ -397,7 +411,7 @@ void BorderAgent::ForwardToLeader(const Coap::Header & aHeader, SuccessOrExit(error = message->SetLength(offset + aMessage.GetLength() - aMessage.GetOffset())); aMessage.CopyTo(aMessage.GetOffset(), offset, aMessage.GetLength() - aMessage.GetOffset(), *message); - SuccessOrExit(netif.GetMle().GetLeaderAloc(messageInfo.GetPeerAddr())); + SuccessOrExit(error = netif.GetMle().GetLeaderAloc(messageInfo.GetPeerAddr())); messageInfo.SetPeerPort(kCoapUdpPort); messageInfo.SetSockAddr(netif.GetMle().GetMeshLocal16()); messageInfo.SetSockPort(kCoapUdpPort); @@ -413,6 +427,7 @@ exit: if (error != OT_ERROR_NONE) { otLogWarnMeshCoP(GetInstance(), "Failed to forward to leader: %s", otThreadErrorToString(error)); + if (forwardContext != NULL) { GetInstance().GetHeap().Free(forwardContext); @@ -437,6 +452,8 @@ exit: SendErrorMessage(header); } + + return error; } void BorderAgent::HandleConnected(bool aConnected) diff --git a/src/core/meshcop/border_agent.hpp b/src/core/meshcop/border_agent.hpp index 9ab0e52e9..de1c36a74 100644 --- a/src/core/meshcop/border_agent.hpp +++ b/src/core/meshcop/border_agent.hpp @@ -102,12 +102,13 @@ private: otError aResult); void SendErrorMessage(const Coap::Header &aHeader); - void ForwardToLeader(const Coap::Header & aHeader, + otError ForwardToLeader(const Coap::Header & aHeader, const Message & aMessage, const Ip6::MessageInfo &aMessageInfo, const char * aPath, bool aSeparate); otError ForwardToCommissioner(const Coap::Header &aHeader, const Message &aMessage); + void HandleKeepAlive(const Coap::Header &aHeader, const Message &aMessage, const Ip6::MessageInfo &aMessageInfo); void HandleRelayTransmit(const Coap::Header &aHeader, const Message &aMessage); void HandleRelayReceive(const Coap::Header &aHeader, const Message &aMessage);