From 419d251e2f43796272c3b9d4487b676a32d55fb4 Mon Sep 17 00:00:00 2001 From: Xiao Ma Date: Wed, 18 Jan 2017 11:27:20 +0800 Subject: [PATCH] Fix few bugs: (#1164) - Add additional check for ALOC as the destination address of CoAP request messages. - Leader uses RLOC instead of ALOC as source address to response messages. --- src/core/coap/coap_client.cpp | 3 ++- src/core/meshcop/leader.cpp | 6 +++++- src/core/thread/address_resolver.cpp | 8 +++++++- src/core/thread/network_data_leader_ftd.cpp | 4 +++- tools/harness-thci/OpenThread.py | 2 +- 5 files changed, 18 insertions(+), 5 deletions(-) diff --git a/src/core/coap/coap_client.cpp b/src/core/coap/coap_client.cpp index d7c0c2d99..0848dc7e4 100644 --- a/src/core/coap/coap_client.cpp +++ b/src/core/coap/coap_client.cpp @@ -309,7 +309,8 @@ Message *Client::FindRelatedRequest(const Header &aResponseHeader, const Ip6::Me aRequestMetadata.ReadFrom(*message); if (((aRequestMetadata.mDestinationAddress == aMessageInfo.GetPeerAddr()) || - aRequestMetadata.mDestinationAddress.IsMulticast()) && + aRequestMetadata.mDestinationAddress.IsMulticast() || + aRequestMetadata.mDestinationAddress.IsAnycastRoutingLocator()) && (aRequestMetadata.mDestinationPort == aMessageInfo.GetPeerPort())) { assert(aRequestHeader.FromMessage(*message, true) == kThreadError_None); diff --git a/src/core/meshcop/leader.cpp b/src/core/meshcop/leader.cpp index 7f84822c4..6db5b5796 100644 --- a/src/core/meshcop/leader.cpp +++ b/src/core/meshcop/leader.cpp @@ -112,6 +112,7 @@ ThreadError Leader::SendPetitionResponse(const Coap::Header &aRequestHeader, con StateTlv state; CommissionerSessionIdTlv sessionId; Message *message; + Ip6::MessageInfo responseInfo(aMessageInfo); VerifyOrExit((message = mCoapServer.NewMeshCoPMessage(0)) != NULL, error = kThreadError_NoBufs); @@ -137,7 +138,8 @@ ThreadError Leader::SendPetitionResponse(const Coap::Header &aRequestHeader, con SuccessOrExit(error = message->Append(&sessionId, sizeof(sessionId))); } - SuccessOrExit(error = mCoapServer.SendMessage(*message, aMessageInfo)); + memset(&responseInfo.mSockAddr, 0, sizeof(responseInfo.mSockAddr)); + SuccessOrExit(error = mCoapServer.SendMessage(*message, responseInfo)); otLogInfoMeshCoP("sent petition response"); @@ -202,6 +204,7 @@ ThreadError Leader::SendKeepAliveResponse(const Coap::Header &aRequestHeader, co Coap::Header responseHeader; StateTlv state; Message *message; + Ip6::MessageInfo responseInfo(aMessageInfo); VerifyOrExit((message = mCoapServer.NewMeshCoPMessage(0)) != NULL, error = kThreadError_NoBufs); @@ -214,6 +217,7 @@ ThreadError Leader::SendKeepAliveResponse(const Coap::Header &aRequestHeader, co state.SetState(aState); SuccessOrExit(error = message->Append(&state, sizeof(state))); + memset(&responseInfo.mSockAddr, 0, sizeof(responseInfo.mSockAddr)); SuccessOrExit(error = mCoapServer.SendMessage(*message, aMessageInfo)); otLogInfoMeshCoP("sent keep alive response"); diff --git a/src/core/thread/address_resolver.cpp b/src/core/thread/address_resolver.cpp index bc4194b52..b6e77bf5c 100644 --- a/src/core/thread/address_resolver.cpp +++ b/src/core/thread/address_resolver.cpp @@ -223,6 +223,7 @@ void AddressResolver::HandleAddressNotification(Coap::Header &aHeader, Message & ThreadRloc16Tlv rloc16Tlv; ThreadLastTransactionTimeTlv lastTransactionTimeTlv; uint32_t lastTransactionTime; + Ip6::MessageInfo responseInfo(aMessageInfo); VerifyOrExit(aHeader.GetType() == kCoapTypeConfirmable && aHeader.GetCode() == kCoapRequestPost, ;); @@ -282,6 +283,8 @@ void AddressResolver::HandleAddressNotification(Coap::Header &aHeader, Message & mCache[i].mFailures = 0; mCache[i].mState = Cache::kStateCached; + memset(&responseInfo.mSockAddr, 0, sizeof(responseInfo.mSockAddr)); + if (mCoapServer.SendEmptyAck(aHeader, aMessageInfo) == kThreadError_None) { otLogInfoArp("Sent address notification acknowledgment"); @@ -360,6 +363,7 @@ void AddressResolver::HandleAddressError(Coap::Header &aHeader, Message &aMessag uint8_t numChildren; Mac::ExtAddress macAddr; Ip6::Address destination; + Ip6::MessageInfo responseInfo(aMessageInfo); VerifyOrExit(aHeader.GetType() == kCoapTypeConfirmable && aHeader.GetCode() == kCoapRequestPost, error = kThreadError_Drop); @@ -368,7 +372,9 @@ void AddressResolver::HandleAddressError(Coap::Header &aHeader, Message &aMessag if (!aMessageInfo.GetSockAddr().IsMulticast()) { - if (mCoapServer.SendEmptyAck(aHeader, aMessageInfo) == kThreadError_None) + memset(&responseInfo.mSockAddr, 0, sizeof(responseInfo.mSockAddr)); + + if (mCoapServer.SendEmptyAck(aHeader, responseInfo) == kThreadError_None) { otLogInfoArp("Sent address error notification acknowledgment"); } diff --git a/src/core/thread/network_data_leader_ftd.cpp b/src/core/thread/network_data_leader_ftd.cpp index 6122ee90f..31b623392 100644 --- a/src/core/thread/network_data_leader_ftd.cpp +++ b/src/core/thread/network_data_leader_ftd.cpp @@ -362,6 +362,7 @@ void Leader::SendCommissioningSetResponse(const Coap::Header &aRequestHeader, co Coap::Header responseHeader; Message *message; MeshCoP::StateTlv state; + Ip6::MessageInfo responseInfo(aMessageInfo); VerifyOrExit((message = mCoapServer.NewMeshCoPMessage(0)) != NULL, error = kThreadError_NoBufs); @@ -374,7 +375,8 @@ void Leader::SendCommissioningSetResponse(const Coap::Header &aRequestHeader, co state.SetState(aState); SuccessOrExit(error = message->Append(&state, sizeof(state))); - SuccessOrExit(error = mCoapServer.SendMessage(*message, aMessageInfo)); + memset(&responseInfo.mSockAddr, 0, sizeof(responseInfo.mSockAddr)); + SuccessOrExit(error = mCoapServer.SendMessage(*message, responseInfo)); otLogInfoMeshCoP("sent commissioning dataset set response"); diff --git a/tools/harness-thci/OpenThread.py b/tools/harness-thci/OpenThread.py index 3aed45cef..7b35c345a 100755 --- a/tools/harness-thci/OpenThread.py +++ b/tools/harness-thci/OpenThread.py @@ -2413,7 +2413,7 @@ class OpenThread(IThci): if xBorderRouterLocator != None: cmd += ' locator ' - cmd += str(xBorderRouterLocator) + cmd += str(hex(xBorderRouterLocator)) if xChannelTlv != None: cmd += ' binary '